./PaxHeaders/opari2-2.0.90000644000000000000000000000013214770056767012077 xustar0030 mtime=1742757367.263367882 30 atime=1742757371.935339406 30 ctime=1742757367.263367882 opari2-2.0.9/0000755000175100001440000000000014770056767012347 5ustar00builderusersopari2-2.0.9/PaxHeaders/include0000644000000000000000000000013214770056767013365 xustar0030 mtime=1742757367.263367882 30 atime=1742757371.935339406 30 ctime=1742757367.263367882 opari2-2.0.9/include/0000755000175100001440000000000014770056767013772 5ustar00builderusersopari2-2.0.9/include/PaxHeaders/opari20000644000000000000000000000013214770056767014561 xustar0030 mtime=1742757367.315367565 30 atime=1742757371.935339406 30 ctime=1742757367.315367565 opari2-2.0.9/include/opari2/0000755000175100001440000000000014770056767015166 5ustar00builderusersopari2-2.0.9/include/opari2/PaxHeaders/pomp2_user_lib.h0000644000000000000000000000013214770056734017722 xustar0030 mtime=1742757340.095533476 30 atime=1742757340.159533085 30 ctime=1742757367.315367565 opari2-2.0.9/include/opari2/pomp2_user_lib.h0000644000175100001440000001035714770056734020260 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_USER_LIB_H #define POMP2_USER_LIB_H #include #include #ifdef __cplusplus extern "C" { #endif /** @file * * @brief This file contains the declarations of all * POMP2 functions. * */ /* Avoid warnings from Orcale Studio Compiler if nowait clauses are added * to reduction loops. Opari always inserts a barrier after such loops, so * the nowait is save.*/ #if defined( __SUNPRO_C ) #pragma error_messages (off, E_NOWAIT_REDUCTION_USE) #endif /** Handles to identify OpenMP regions. */ /** To avoid multiple typedefs of OPARI2_Region_handle*/ #ifndef __opari2_region_handle typedef void* OPARI2_Region_handle; #define __opari2_region_handle #endif typedef OPARI2_Region_handle POMP2_USER_Region_handle; /** @name Functions generated by the instrumenter */ /*@{*/ /** * Returns the number of instrumented regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. Here we return the sum of * all numRegions. * @return number of instrumented regions */ extern size_t POMP2_USER_Get_num_regions( void ); /** * Init all OPARI2-created regions.@n * The instrumentor scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. The instrumentor then * defines these functions by calling all grepped functions. */ extern void POMP2_USER_Init_regions( void ); /** * Returns the OPARI2 version. * @return version string */ extern const char* POMP2_Get_opari2_version( void ); /** Finalizes the POMP2 adapter. It is inserted at the #%pragma pomp inst end. */ extern void POMP2_Finalize( void ); /** Initializes the POMP2 adapter. It is inserted at the #%pragma pomp inst begin. */ extern void POMP2_Init( void ); /** Disables the POMP2 adapter. */ extern void POMP2_Off( void ); /** Enables the POMP2 adapter. */ extern void POMP2_On( void ); /** Called at the begin of a user defined POMP2 region. @param pomp2_handle The handle of the started region. @param ctc_string A string containing the region data. */ extern void POMP2_Begin( POMP2_USER_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called at the begin of a user defined POMP2 region. @param pomp2_handle The handle of the started region. */ extern void POMP2_End( POMP2_USER_Region_handle* pomp2_handle ); /** Registers a POMP2 region and returns a region handle. @param pomp2_handle Returns the handle for the newly registered region. @param ctc_string A string containing the region data. */ extern void POMP2_USER_Assign_handle( POMP2_USER_Region_handle* pomp2_handle, const char ctc_string[] ); #ifdef __cplusplus } #endif #endif opari2-2.0.9/include/opari2/PaxHeaders/pomp2_lib.h0000644000000000000000000000013214770056734016664 xustar0030 mtime=1742757340.095533476 30 atime=1742757340.159533085 30 ctime=1742757367.315367565 opari2-2.0.9/include/opari2/pomp2_lib.h0000644000175100001440000005363414770056734017227 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2019, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_LIB_H #define POMP2_LIB_H #ifdef _OPENMP #include #endif #include #include #ifdef __cplusplus extern "C" { #endif /** @file * * @brief This file contains the declarations of all * POMP2 functions. * */ /* Avoid warnings from Orcale Studio Compiler if nowait clauses are added * to reduction loops. Opari always inserts a barrier after such loops, so * the nowait is save.*/ #if defined( __SUNPRO_C ) #pragma error_messages (off, E_NOWAIT_REDUCTION_USE) #endif /** Handles to identify OpenMP regions. */ /** To avoid multiple typedefs of OPARI2_Region_handle*/ #ifndef __opari2_region_handle typedef void* OPARI2_Region_handle; #define __opari2_region_handle #endif typedef OPARI2_Region_handle POMP2_Region_handle; typedef int64_t POMP2_Task_handle; /** @name Functions generated by the instrumenter */ /*@{*/ /** * Returns the number of instrumented regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. Here we return the sum of * all numRegions. * @return number of instrumented regions */ extern size_t POMP2_Get_num_regions( void ); /** * Init all OPARI2-created regions.@n * The instrumentor scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. The instrumentor then * defines these functions by calling all grepped functions. */ extern void POMP2_Init_regions( void ); /** * Returns the OPARI2 version. * @return version string */ extern const char* POMP2_Get_opari2_version( void ); /*@}*/ /** Function that returns a new task handle. * @return new task handle */ extern POMP2_Task_handle POMP2_Get_new_task_handle( void ); /** Create a unique mapping between @a ctc_string and the implementation-defined @a pomp2_handle. Be aware that POMP2_Assign_handle() is called from POMP2_Init_regions() in a serial context but might get called concurrently as well. */ extern void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); #ifdef _OPENMP /** Called before an atomic statement. @param pomp2_handle The handle of the started region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after an atomic statement. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ); /** Called before a barrier. \n \e OpenMP \e 3.0: Barriers can be used as scheduling points for tasks. When entering a barrier the task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. @param pomp2_handle The handle of the started region. @param pomp2_old_task Pointer to a "taskprivate" variable where the current task id is stored. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); /** Called after a barrier. \n \e OpenMP \e 3.0: When a task exits a barrier the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the barrier. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the ended region. @param pomp2_old_task "Taskprivate" variable storing the id of the task the barrier is located in. */ extern void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Called before an implicit barrier. \e OpenMP \e 3.0: Barriers can be used as scheduling points for tasks. When entering a barrier the task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. @param pomp2_handle The handle of the started region. @param pomp2_old_task Pointer to a "taskprivate" variable where the current task id is stored. */ extern void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ); /** Called after an implicit barrier. \e OpenMP \e 3.0: When a task exits a barrier the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the barrier. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the started region. @param pomp2_old_task "Taskprivate" variable storing the id the task the implicit barrier is used in. */ extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Called before an flush. @param pomp2_handle The handle of the started region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after an flush. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a critical region. @param pomp2_handle The handle of the started region. */ extern void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of a critical region. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ); /** Called before a critical region. @param pomp2_handle The handle of the started region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a critical region. @param pomp2_handle The handle of the region. */ extern void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ); /** Called before a for loop. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a for loop. @param pomp2_handle The handle of the region. */ extern void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a master region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called at the end of a master region. @param pomp2_handle The handle of the ended region. */ extern void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a parallel region. \e OpenMP \e 3.0: When a new parallel region is entered, each thread taking part in that region is executed as a task. These tasks are assigned a new unique task id which is stored in \e pomp2_current_task. @param pomp2_handle The handle of the region. */ extern void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of a parallel region. @param pomp2_handle The handle of the region. */ extern void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ); /** Called before a parallel region. \e OpenMP \e 3.0: The task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. In each of the threads taking part in the following parallel region a newly defined unique task id is assigned (see \ref POMP2_Parallel_begin) @param pomp2_handle The handle of the region. @param if_clause Value of the argument of an if clause (if present). @param num_threads Upper bound for number of child threads. @param pomp2_old_task The task id of the region from which the parallel region was started. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); /** Called after a parallel region. \e OpenMP \e 3.0: When a task exits a parallel region the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the region. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the region. @param pomp2_old_task The task id of the region inside of which the parallel region was executed. */ extern void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Called at the start of a section. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called at the end of a section. @param pomp2_handle The handle of the region. */ extern void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ); /** Called before a set of sections. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a set of sections. @param pomp2_handle The handle of the region. */ extern void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of a single region. @param pomp2_handle The handle of the region. */ extern void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of a single region. @param pomp2_handle The handle of the region. */ extern void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ); /** Called before a single region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a single region. @param pomp2_handle The handle of the region. */ extern void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ); /** Called before a workshare region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after a workshare region. @param pomp2_handle The handle of the region. */ extern void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ); /** Called at the start of an ordered region. @param pomp2_handle The handle of the region. */ extern void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ); /** Called at the end of an ordered region. @param pomp2_handle The handle of the region. */ extern void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ); /** Called before an ordered region. @param pomp2_handle The handle of the region. @param ctc_string Initialization string. Ignored. */ extern void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); /** Called after an ordered region. @param pomp2_handle The handle of the region. */ extern void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ); /** \e OpenMP \e 3.0: When a task encounters a task construct it creates a new task. The task may be scheduled for later execution or executed immediately. In both cases the pomp-adapter assigns the id of the currently active task to \e pomp2_old_task which is defined in the instrumented user code. @param pomp2_handle The handle of the region. @param pomp2_old_task Pointer to the task id in the instrumented user code @param pomp2_if If an if clause is present on the task directive this variable holds the evaluated result of the argument of the if clause. Else it is 1. @param ctc_string The initialization string. */ extern void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); /** \e OpenMP \e 3.0: After the code region which is executed as a separate task, the task id of the creating task is restored from \e pomp2_old_task (defined in the instrumented user code) and stored in \e pomp2_current_task inside the adapter. @param pomp2_handle The region handle. @param pomp2_old_task The task id of the task inside of which the task was created. This is stored inside the instrumented user code. */ extern void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** \e OpenMP \e 3.0: Marks the beginning of the execution of a task. @param pomp2_handle The region handle. @param pomp2_task handle of task. */ extern void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); /** \e OpenMP \e 3.0: Marks the end of the execution of a task. @param pomp2_handle The region handle. */ extern void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ); /** \e OpenMP \e 3.0: When a task encounters a task construct it creates a new task. If the untied clause is specified the task is executed as an untied task. The task may be scheduled for later execution or executed immediately. In both cases the pomp-adapter assigns the id of the currently active task to \e pomp2_old_task which is defined in the instrumented user code. @param pomp2_handle The handle of the region. @param pomp2_old_task Pointer to the task id in the instrumented user code. @param pomp2_if If an if clause is present on the task directive this variable holds the evaluated result of the argument of the if clause. Else it is 1. @param ctc_string The initialization string. */ extern void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); /** \e OpenMP \e 3.0: After the code region which is executed as a separate untied task, the task id of the creating task is restored from \e pomp2_old_task (defined in the instrumented user code) and stored in \e pomp2_current_task inside the adapter. @param pomp2_handle The region handle. @param pomp2_old_task The id of the task from which the untied task was created. This is stored in the instrumented user code. */ extern void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** \e OpenMp \e 3.0: Marks the beginning of the execution of an untied task. @param pomp2_handle The region handle. @param pomp2_task Handle of this task. */ void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); /** \e OpenMP \e 3.0: Marks the end of the execution of a task. @param pomp2_handle The region handle. */ extern void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ); /** Called before a taskwait. \n \e OpenMP \e 3.0: Taskwait directives can be used as scheduling points for tasks. When entering a taskwait region the task id of the currently executing task (\e pomp2_current_task) is saved in \e pomp2_old_task, which is defined inside the instrumented user code. @param pomp2_handle The handle of the started region. @param pomp2_old_task Pointer to a "taskprivate" variable where the current task id is stored. @param ctc_string Initialization string. May be ignored if \ is already initialized. */ extern void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); /** Called after a barrier. \n \e OpenMP \e 3.0: When a task exits a taskwait region the variable \e pomp2_old_task (defined in the instrumented user code) holds the id of the task that entered the taskwait. The value is stored in the adapter (in \e pomp2_current_task) to be made available for the measurement system for the following regions. @param pomp2_handle The handle of the ended region. @param pomp2_old_task "Taskprivate" variable storing the id of the task the barrier is located in. */ extern void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); /** Wraps the omp_get_max_threads function. * * Needed for the instrumentation of parallel regions * where the num_threads clause is used with the return * value of the omp_get_max_threads function. This can't * be used directly because the user may have declared * it himself. Double declarations are not allowed. */ extern int POMP2_Lib_get_max_threads( void ); /** Wraps the omp_init_lock function. * @param s The OpenMP lock to initialize.*/ extern void POMP2_Init_lock( omp_lock_t* s ); /** Wraps the omp_destroy_lock function. * @param s The OpenMP lock to destroy. */ extern void POMP2_Destroy_lock( omp_lock_t* s ); /** Wraps the omp_set_lock function. * @param s The OpenMP lock to set. */ extern void POMP2_Set_lock( omp_lock_t* s ); /** Wraps the omp_unset_lock function. * @param s the OpenMP lock to unset. */ extern void POMP2_Unset_lock( omp_lock_t* s ); /** Wraps the omp_test_lock function * @param s the OpenMP lock to test for. * @return result of omp_test_lock*/ extern int POMP2_Test_lock( omp_lock_t* s ); /** Wraps the omp_init_nest_lock function. * @param s The nested OpenMP lock to initialize. */ extern void POMP2_Init_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_destroy_nest_lock function. * @param s The nested OpenMP lock to destroy. */ extern void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_set_nest_lock function * @param s The nested OpenMP lock to set.*/ extern void POMP2_Set_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_unset_nest_lock function * @param s The nested OpenMP lock to unset.*/ extern void POMP2_Unset_nest_lock( omp_nest_lock_t* s ); /** Wraps the omp_test_nest_lock function * @param s The nested OpenMP lock to test for. * @return result of omp_test_nest_lock*/ extern int POMP2_Test_nest_lock( omp_nest_lock_t* s ); #endif /* _OPENMP */ #ifdef __cplusplus } #endif #endif opari2-2.0.9/PaxHeaders/build-includes0000644000000000000000000000013214770056767014645 xustar0030 mtime=1742757367.271367834 30 atime=1742757371.935339406 30 ctime=1742757367.271367834 opari2-2.0.9/build-includes/0000755000175100001440000000000014770056767015252 5ustar00builderusersopari2-2.0.9/build-includes/PaxHeaders/frontend-only.am0000644000000000000000000000013214770056734020031 xustar0030 mtime=1742757340.067533646 30 atime=1742757340.143533184 30 ctime=1742757367.271367834 opari2-2.0.9/build-includes/frontend-only.am0000644000175100001440000000035214770056734020361 0ustar00builderusers## -*- mode: makefile -*- include ../src/opari/Makefile.inc.am include ../src/opari-lib-dummy/Makefile.inc.am include ../doc/example/openmp/Makefile.inc.am include ../doc/example/pomp/Makefile.inc.am include ../test/Makefile.inc.am opari2-2.0.9/build-includes/PaxHeaders/common.am0000644000000000000000000000013214770056734016523 xustar0030 mtime=1742757340.067533646 30 atime=1742757340.143533184 30 ctime=1742757367.267367858 opari2-2.0.9/build-includes/common.am0000644000175100001440000000173214770056734017056 0ustar00builderusers# -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen, Germany ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## Technische Universitaet Dresden, Germany ## University of Oregon, Eugene, USA ## Forschungszentrum Juelich GmbH, Germany ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## Technische Universitaet Muenchen, Germany ## ## See the COPYING file in the package base directory for details. ## ## file build-includes/common.am ## Intended to be included by the components ## build-(front|back)end/Makefile.am. Defines "common" entities ## that all build-* Makefiles rely on. include ../build-config/common/common.am ## Convenience variable for referencing public headers that will be ## installed. Use e.g. with the primary nobase_include_HEADERS PUBLIC_INC_SRC = $(SRC_ROOT)include/opari2/ opari2-2.0.9/PaxHeaders/OPEN_ISSUES0000644000000000000000000000013214770056734013570 xustar0030 mtime=1742757340.043533793 30 atime=1742757340.135533232 30 ctime=1742757367.195368296 opari2-2.0.9/OPEN_ISSUES0000644000175100001440000002465614770056734014135 0ustar00builderusers OPARI2 2.0.9 OPEN ISSUES ======================== Effective: Mar 2025 This file lists known limitations and unimplemented features of the OPARI2 component. ------------------------------------------------------------------------------ * Platform support - OPARI2 has been tested on the following platforms: + HPE/Cray EX systems with PrgEnvs cray, intel, gnu, amd, aocc. + various Linux (Intel, AMD, ARM) clusters with GNU, Intel, NVIDIA, and AMD compilers. Note that some compilers are based on Clang. Note that Fujitsu compilers haven't been tested thoroughly, Fujitsu cross-compilers haven't been tested at all. The provided configure options (see INSTALL) may provide a good basis for building and testing the toolset on other systems. - The following platforms have not been tested recently: + Intel Xeon Phi (KNL) + IBM Blue Gene and IBM Power systems + Cray XC, XT, XE, XK However the supplied build system might still work on these systems. - The following platforms have not been tested: + NEC systems -------------------------------------------------------------------------------- Known issues ------------ - All languages + OPARI2, per default, processes source files before the compiler preprocessor, so macros and included files are not processed. Conditionally compiled source code is also not resolved and can therefore result in erroneous instrumentation of partial OpenMP directives. These limitation can be resolved by passing preprocessed code to OPARI2 using the --preprocessed flag. + The instrumented source files generated by OPARI2 may confuse automatic dependency tracking by "make", "autotools", etc. For autotools, configure with "--disable-dependency-tracking". + Literal file-filter rules like "INCLUDE bt.f" for files that will be processed by OPARI2 do not work, as OPARI2 changes the file name (e.g., to bt.opari.f). + Some OpenMP compilers (e.g. PGI) are non-standard-conforming in the way they process OpenMP directives by not allowing macro replacement of OpenMP directive parameters. This results in error messages containing references to POMP_DLIST_##### where ##### is a five-digit number. In this case, try to use the OPARI2 option "--nodecl". This is unfortunately not a perfect workaround, as this can trigger other errors in some rare cases. + When compiling with the PGI compiler version 10.1, local variables that are defined after an OpenMP for directive share the same memory address. This breaks the OPARI2 instrumentation for task tracking. Our recommendation is to use a newer compiler version, According to our tests, later compiler versions have fixed this issues. We tested with PGI compiler version 11.7. + Sometimes instrumentation of OpenMP source files work, but the traces get enormously large because the application is using large numbers (millions) of small OpenMP synchronization operations like atomic, locks or flushes which are instrumented by default. Also, in that case, the instrumentation overhead might become excessive. In that case, you can tell OPARI2 not to instrument these directives by using the "--disable=omp[:directive|group[:inner],...]" option. Valid values for directive are: atomic, critical, flush, locks, master, ordered, single or "sync" which disables all of the above. Of course, then these directives are not measured and you should keep this in mind, when you analyze the results. Although they do not show up in the analysis report that the application might still have some performance problem because. This may especially be the case, because of too many OpenMP synchronization calls! + Instrumented Intel Xeon-Phi offload regions cause compile errors. You need to manually guard the instrumented POMP2 calls by "#ifndef __INTEL_OFFLOAD" preprocessor statements to prevent them from being compiled. The next OPARI2 release will automate this process. + Object files created by the Intel compiler with interprocedural optimization (-ipo) cannot be analyzed by nm for startup initialization of the OpenMP region handles. Workaround is to use only -ip during compilation or to use runtime initialization of the OpenMP region handles inside of the analysis tool. + The option --omp-tpd cannot be used on Fujitsu systems (K, FX10, FX100). + Parentheses used in chunksize calculations within a schedule clause, e.g., schedule(dynamic, (a)*(b)), will cause a compilation error. As a workaround, you can calculate the chuncksize into a temporary variable prior to its usage in the schedule clause. + For combined constructs (like 'omp parallel '), some clauses not yet handled by OPARI2 (such as 'simd') may be incorrectly added to the 'omp parallel' clause during the source-to-source translation. As a workaround, the combined construct can be manually split into an 'omp parallel' region and the remaining construct. - Fortran: + The !$OMP END DO and !$OMP END PARALLEL DO directives are required (and are not optional as described in the OpenMP specification) for F77 style do loops which end with a lable and continue statement. + The atomic expression controlled by a !$OMP ATOMIC directive has to be on a line all by itself in fixed form source files. + The !$OMP END ATOMIC directive must not be used if it is optional. This directive is optional except if the capture clause is used. In this case the instrumentation of atomic directives needs to be disabled via by passing --disable=omp:atomic to opari2. + The Fortran95 statement terminator (";") is not handled correctly when it is used within parallel loops. + If an #ifdef block is used at the beginning of the variable definition part, instrumentation is incorrectly inserted within the block and not compiled later when the evaluation is false. + Some Fortran compilers (e.g., Sun) don't fully support C preprocessor commands, especially the "#line" commands. In case you track a compilation error on a OPARI2 modified/instrumented file down to such a statement, try using "--nosrc" as this suppresses the generation of "#line" statements. (With the Sun Fortran compiler, using "-xpp=cpp" is a better workaround.) + The first SECTION directive inside a SECTIONS workshare directive is required (and is not optional as described in the OpenMP specification). + Fortran .f files are identified as Fortran77 files even if they contain Fortran90 code. You need to manually add the --f90 option to process these files successfully if renaming is not an option. + If you use a fixed form Fortran and override the fixed form requirement by a compiler switch you might need to add --free-form to the OPARI2 commandline to get a compilable instrumentation. Use --fix-form analogously. + OPARI2 requires that the program is included in a PROGRAM block. Using the compilation unit as implicit PROGRAM block will result in erroneous code. + Compiler specific directives starting with "!DIR$" need to be followed by a whitespace character before the directive keyword. + The clauses 'num_threads' and 'if' to the parallel directive must not reside as a sole clause on a line. + OpenMP directives that span over several lines must not contain preprocessor directives. This is a regression from OPARI2 version 1.1.4. + The default(none) clause to the parallel directive must not be used in a continuation line but on the same line as the parallel directive. + Strings within a pair of parenthesis, e.g., (..., msg="my msg"), must either appear on a single line or the closing parenthesis needs to appear on a line following the end quotation mark of the string. Otherwise, include statements might appear not at the correct place. + OPARI2 does not handle 'interface ... end interface' correctly. If the name 'interface' (case-insensitive) appears in a variable name, OPARI2 might produce non-functional code. As a workaround, rename this variable. + OPARI2 generates sources files containing COMMON statements. COMMON statements are considered to be obsolescent in Fortran 2018. Compilations using options that require Fortran 2018, like gfortran's '-std=f2018', may fail. As a workaround, omit the option. + A multi-line USE statement that contains OPARI2-relevant keywords in lines other than the first line are messed up by OPARI2 and prevent compilation of the generated code. Please keep the entire USE statement in a single line. - C/C++: + Structured blocks describing the extent of an OpenMP pragma need to be either compound statements {....}, while loops, or simple statements. In addition, for loops are supported after and . Complex statements like if-then-else or do-while need to be enclosed in a block ( {....} ). As an example: OPARI2 generates erroneous code for braceless nested for-loops with if-else in the inner for-loop's body. As a workaround, add braces around the body of the outer for-loop. + C99 6.10.9 _Pragma operators are not supported. + Codes relying on the definition of macros to select specific features from system header files, e.g., __STDC_CONSTANT_MACROS or _GNU_SOURCE, need to define these macros on the compiler command line rather than in header or source files. It is planned to address these limitations in future releases. -------------------------------------------------------------------------------- Please report bugs, wishes, and suggestions to . opari2-2.0.9/PaxHeaders/THANKS0000644000000000000000000000013214770056734012724 xustar0030 mtime=1742757340.043533793 30 atime=1742757340.135533232 30 ctime=1742757366.983369589 opari2-2.0.9/THANKS0000644000175100001440000000123014770056734013250 0ustar00builderusersOPARI2 THANKS file OPARI2 has originally been written by authors in AUTHORS file. Many people further contributed to OPARI2 by reporting problems, suggesting various improvements or submitting actual code. Here is a list of these people. Help me keep it complete and exempt of errors. Chee Wai Lee Hendryk Bockelmann Orion Poplawski Piero Lanucara Aleksandr Drozd Sally Bridgwater Xavier Le Vaillant Samuel Thibault Nikhil Jain opari2-2.0.9/PaxHeaders/README0000644000000000000000000000013214770056734012671 xustar0030 mtime=1742757340.043533793 30 atime=1742757340.135533232 30 ctime=1742757366.983369589 opari2-2.0.9/README0000644000175100001440000000070314770056734013221 0ustar00builderusersOPARI2 ------ OPARI2 is a source-to-source instrumentation tool for directive based programming models, such as OpenMP. To build OPARI2 you usually just need to do ./configure make make install Please have a look at INSTALL for further configure and build options. After make install you will find html and pdf documentation as well as usage examples under $(prefix)/share/doc/opari. Have fun! Please report bugs to . opari2-2.0.9/PaxHeaders/INSTALL0000644000000000000000000000013214770056734013042 xustar0030 mtime=1742757340.039533817 30 atime=1742757340.135533232 30 ctime=1742757366.979369613 opari2-2.0.9/INSTALL0000644000175100001440000004550314770056734013401 0ustar00builderusersFor generic installation instructions see below. Configuration of OPARI2 *********************** Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0') --disable-libtool-lock avoid locking (might break parallel builds) --disable-openmp do not use OpenMP --disable-option-checking ignore unrecognized --enable/--with options --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=no] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-compiler-suite=(gcc|ibm|intel|oneapi|nvhpc|pgi|clang|aocc|amdclang) The compiler suite to build this package with. Needs to be in $PATH [gcc]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: (note that the _FOR_BUILD variables take precedence, e.g. if you call OPARI2's configure from a top level configure in a cross-compile environment that defines CC as well as CC_FOR_BUILD etc.) CC_FOR_BUILD C compiler command for the frontend build CXX_FOR_BUILD C++ compiler command for the frontend build F77_FOR_BUILD Fortran 77 compiler command for the frontend build FC_FOR_BUILD Fortran compiler command for the frontend build CPPFLAGS_FOR_BUILD (Objective) C/C++ preprocessor flags for the frontend build, e.g. -I if you have headers in a nonstandard directory CFLAGS_FOR_BUILD C compiler flags for the frontend build CXXFLAGS_FOR_BUILD C++ compiler flags for the frontend build FFLAGS_FOR_BUILD Fortran 77 compiler flags for the frontend build FCFLAGS_FOR_BUILD Fortran compiler flags for the frontend build LDFLAGS_FOR_BUILD linker flags for the frontend build, e.g. -L if you have libraries in a nonstandard directory LIBS_FOR_BUILD libraries to pass to the linker for the frontend build, e.g. -l CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags FC Fortran compiler command FCFLAGS Fortran compiler flags CPP C preprocessor CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Please report bugs to . Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. 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. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. opari2-2.0.9/PaxHeaders/ChangeLog0000644000000000000000000000013214770056734013563 xustar0030 mtime=1742757340.039533817 30 atime=1742757340.131533256 30 ctime=1742757366.979369613 opari2-2.0.9/ChangeLog0000644000175100001440000003447214770056734014125 0ustar00builderusers------------------- Released version 2.0.9 --------------------------- - Opari2 now generates valid code for Fortran 2008's 'module subroutine'. - opari2-config now supports the option '--cflags=clang', intended to be used with clang, clang++, and flang. - Additional shortcomings and potential workarounds have been documented, see file OPEN_ISSUES. ------------------- Released version 2.0.8 --------------------------- - Fixed compilation error for instrumented OpenMP directives inside 'associate' constructs with gfortran. - Prevent make distclean from erroneously removing source files. ------------------- Released version 2.0.7 --------------------------- - Include omp.h via .opari.inc if it got removed from . .opari.inc was empty if the compilation unit was lacking any OpenMP directives. Thus, calls to API functions or using OpenMP types issued warnings/errors on compilation of the modfied sources. - Handle C++14/17 numeric literals (binary integer, hexadecimal floating-point), including seperators. ------------------- Released version 2.0.6 --------------------------- - make check's test/awk_script_test.sh was reported to fail due to wrong ordering of regions provided by pomp2_parse_init_regions.awk. Fixed. - Handle C++11 multi line strings literals with arbitrary delimiter ------------------- Released version 2.0.5 --------------------------- - The number of regions reported by POMP2_Get_num_regions() was too small if OpenMP barrier, flush, or taskwait constructs were present in the code. As a consequence opari-lib-dummy crashed; Score-P handled this situation gracefully. Fixed. - When working on preprocessed Fortran files, opari2 duplicated line directives. Compiling these files triggered warnings with certain compilers. Fixed. ------------------- Released version 2.0.4 --------------------------- - Fixed some bad string accesses, thanks to Orion Poplawski. ------------------- Released version 2.0.3 --------------------------- - The instrumentation of OpenMP sections, more precisely the region variable passed to POMP2_Section_end, was potentially invalid. Invalid values were observed in case the environment variable MALLOC_PERTURB_ was set to a non-zero value. Fixed. ------------------- Released version 2.0.2 --------------------------- - Opari2 usually adds nowait and an explicit barrier after the single construct to measure the implicit barrier overhead caused by the single construct. If copyprivate is given, neither nowait nor the explicit barrier must be instrumented. Opari2 complies for C/C++. For Fortran it added nowait and the explicit barrier even if copyprivate is present. This results in a compilation error. Fixed. - When creating the 'pomp2_init_regions.c' file, ignore symbols that contain '.ITC.' but keep symbols of type 'D' (see below). These symbols are created by Intel compilers and were considered as POMP2 region when the compilation flags '-ipo' or '-O3' were used. These symbols caused linker errors during Score-P's link step. ------------------- Released version 2.0.1 --------------------------- - Ignore symbols of type 'D' (symbols in the initialized data section) when creating the 'pomp2_init_regions.c' file. These symbols caused linker errors during Score-P's link step. - The option --disable=omp is supposed to only instrument parallel regions; these are necessary for the thread management of tools building upon OPARI2. But the implicit barrier at the end of parallel regions was instrumented as well. This is fixed now. - Empty lines between continuation lines of directives (e.g., due to conditional compilation) caused OPARI2 to fail. Fixed. ------------------- Released version 2.0 ----------------------------- - Opari2 was modularized. This means, all functionality directly related to OpenMP was encapsulated, thus enabling the support of new paradigms by adding the respective classes. - Parallel loop bodies consisting of if+else were incorrectly instrumented with the "end-loop-instrumentation" inserted before the (first) else. Fixed. - Compilation of instrumented code failed if 'default(none)' was specified in the outmost parallel region and tasking and/or nesting was used. Fixed. - The use of if- or num_threads-clauses with trailing comma caused the compilation of instrumented code to fail. Fixed. - In Fortran one can expose only selected symbols of a used module, e.g., 'use omp_lib, only: '. If is one of the OpenMP lock API calls, OPARI2 would instrument it and compilation would fail. Fixed. ------------------- Released version 1.1.4 --------------------------- - For free form Fortran source files, atomic operations which are written over multiple lines are now supported. - When an asterisk occurs in a schedule clause, this asterisk is substituted in the CTC String by an @ to avoid collision with the asterisk as CTC String delimiter. opari2_ctc_parser.c transforms this back, when the CTC String is read. - Fix in handling of continuation lines in openmp directives in Fortran. - Fixed detection of function keyword in Fortran. - Fixed handling of variables named num_threads, so that they are no longer detected as a num_threads clause ------------------- Released version 1.1.3 --------------------------- - Blank lines between continuation lines that can occur during preprocessing caused OPARI2 to fail. Fixed. - Changes to support Fujitsu's K Computer and FX10/FX100 systems. - Fixed conditional jumps that depend on uninitialized values. - Fixed handling if inode numbers for very large numbers - Fixed generation of output file names for *.cuf and *.CUF files ------------------- Released version 1.1.2 --------------------------- - If num_threads-clauses or if-clauses are the only clause in a continuation line, OPARI2 instrumentation resulted in empty continuation lines, which causes compilation errors. Fixed this by removing empty continuation lines in OpenMP directives. - Install helper scripts that are not intended to be used directly in /libexec as opposed to /bin. - Support the --includedir and --bindir configure options. - Prevent creation of empty '!$omp' lines during instrumentation. These cause compilation errors at least for gfortran. - Prevent insertion of a newline after the 'copyin(pomp_tpd)' instrumentation. - OPARI2 erroneously complained about a 'missing continuation line' in Fortran codes where '!$OMP PARALLEL' directive spans several lines that use conditional compilation. - On some systems the compiled output of pomp2-parse-init-regions.awk caused undefined symbol linker failures due to an ambiguous regular expression in the AWK script. Fixed. ------------------- Released version 1.1.1 --------------------------- - if-else-statements preceded by #pragma omp parallel were instrumented erroneously. Fixed. - OpenMP regions are reported with incorrect source filenames, both in the region name (e.g., "!$omp parallel @rhs.prep.f:28" or "!$omp parallel @rhs.input.F:28" rather than "!$omp parallel @rhs.f:28") and associated attributes. Although not all compilers seem to be affected, this issue is seen with GNU, Intel and IBM XL compilers. Fixed. - Blank lines (often the result of preprocessing) which occur within Fortran directive continuation are ignored by compilers but treated by Opari2 as missing continuation line errors. Fixed. - Do not instrument an if(true) clause if the user hasn't specified one. Although the previously instrumented if(true) clauses usually do no harm, they prevent the CRAY compiler from generating parallel code. This compiler bug was reported to CRAY. - Instrumenting "parallel for" with "firstprivate(x) lastprivate(x)" caused compilation errors. Fixed. ------------------- Released version 1.1 ----------------------------- - The '--preprocess' flag was added to opari2, which indicates that a file has already been preprocessed. This helps to handle OpenMP constructs in header files or constructs dependent on preprocessor defines. Using this option requires that pomp2_lib.h is already included. Furthermore, it requires the marker ___POMP2_INCLUDE___ immediately after the included pomp2_lib.h file. - Fixed enddo detection in Fortran programs when multiple commands are placed on one line separated by a semicolon. - The '--cflags' argument from opari2-config now allows to specify a compiler '--cflags[=(gnu|intel|sun|pgi|ibm|cray)]'. Special compiler dependent options to avoid warnings caused by the instrumentation are added if a compiler is specified. - Added a ctc_string argument to the POMP2_Begin function. Note: This change breaks compatibility to previous opari2 versions. - If Intel's Language Extensions for Offload are used to offload code to a Xeon Phi coprocessor, opari2 no longer instruments OpenMP code in these regions or functions marked for execution on the coprocessor. This allows handling OpenMP code on the host, when the measurement system does not support the offload model. ------------------- Released version 1.0.7 --------------------------- - Fixed broken option --disable=atomic in Fortran and C/C++. - Improving options --free-form and --fix-form. - Note that within the context of providing the new opari2-config option '--region-initialization' introduced in 1.0.7-rc1, the script pomp2-parse-init-regions.awk was changed into an executable command. The old options '--awk-cmd', '--awk-script', and '--egrep' are still available but deprecated. - Fixed problem parsing escaped characters in C source code which caused opari2 to crash. - Provide POMP2_Init_regions functions with a unique suffix (formerly used gettimeofday was not "unique enough") to prevent duplicate definition linker failures. - Improved instrumentation for parallel regions that the default(none) clause by replacing the pomp2_ctc_XX constant variable by preprocessor defines. - Fixed bug in instrumenting comments in macros which caused "ERROR: unbalanced pragma/directive nesting for $END$ directive". - Fix instrumentation by adding opari2 options --free-form and --fix-form for cases where opari2's assumptions based on the file extension (.f fixed-form) do not hold because the user specified otherwise (e.g. by compiling with --ffree-form ). - Resurrect the hidden feature "manually prevent OpenMP directives from being instrumented" by documenting it. Parallel regions still get instrumented as this a prerequisite of measurement tools to get the internal thread handling correct. - Improved parsing of the nm output in order to generate the region initialization file in cases where the the POMP2_Init_reg routines were generated with absolute addresses (e.g. using the Open64 compiler with inter-procedural analysis). - Do not add any POMP2 statements in Fortran pure subroutines/functions as this leads to compile errors. - Simplify the generation the POMP2 init region file. Previously opari2-config had to be called in a sequence (--egrep, --egrep, --awk-cmd, --awk-script). This sequence is replaced by opari2-config --region-initialization. - Comments in macros are now ignored when processing. ------------------- Released version 1.0.6 --------------------------- - Changed opari-config option --pomp2-api-version to --interface-version to make it consistent with otf2-config and cube-config. ------------------- Released version 1.0.5 --------------------------- - Fix invalid insertion of .opari.inc in conjunction with continued 'dimension' statements. - Improved Fortran 'end do' detection. - CTC-strings grew to long for Fortran77. Size reduced. - Use inode instead of gettimeofday as unique region identifier. In very special circumstances gettimeofday resolution leads to non-unique identifiers. - CTC-strings contained wrong line-number information. - Create temporary files in the directory of the output file. - Detection of conditional compilation in free form Fortran improved. ------------------- Released version 1.0.4 --------------------------- - Provide correct region line numbers also for lazy initialization during runtime. Previously the region end line was always 0 for lazy initialization. - Improved region end line number handling in conjunction with omitted Fortran '!$omp end do' or '!$omp end parallel do' directives. - Fix invalid insertion of .opari.inc in Fortran77 codes with arbitrary continuation line characters in column 6. - Fix invalid insertion of .opari.inc in Fortran codes in conjunction with subroutine calls that distribute their arguments over several lines. ------------------- Released version 1.0.3 --------------------------- - Prevent OPARI2 from instrumenting Fortran 'abstract interfaces'. - Fix invalid insertion of .opari.inc in conjunction with Fortran 'USE' statements that contain line continuations. - Fix invalid insertion of .opari.inc in conjunction with user-defined operators containing '=' in Fortran 'USE' statements. - Fix instrumentation of .c files that produce a linker/mangling error when compiled with a C++ compiler. - Support for out-of-place a.k.a. VPATH builds. Generate .opari.inc in the directory of the output file. - Fix instrumentation bug (C++ files only) where IBM and PGI compilers expect threadprivate variables in different locations. ------------------- Released version 1.0.2 --------------------------- - Renaming of the configure related variable LD_FLAGS_FOR_BUILD to LDFLAGS_FOR_BUILD for consistency. - Renaming of the installed script pomp2_parse_init_regions.awk to pomp2-parse-init-regions.awk for consistency. - In Fortran, improved parsing of function and subroutine keywords. - In in-place builds, the [dist]clean targets accidentally removed files. - Create task events only for tasks that actually get created. - In Fortran, added `integer ( kind=4 )' to all integer variables instrumented by opari2. - In Fortran, continuation lines ending with comments were not detected as continuation lines (Ticket 77). ------------------- Released version 1.0.1 --------------------------- - In Fortran, continued format descriptors resulted in invalid include of the opari.inc file (Ticket 76). - In Fortran, rename lists resulted in premature include of the opari.inc file (Ticket 75). ------------------- Released version 1.0 ----------------------------- opari2-2.0.9/PaxHeaders/COPYING0000644000000000000000000000013214770056734013044 xustar0030 mtime=1742757340.039533817 30 atime=1742757340.131533256 30 ctime=1742757366.979369613 opari2-2.0.9/COPYING0000644000175100001440000000520314770056734013374 0ustar00builderusersThe entire code of Score-P is licensed under the BSD-style license agreement given below, except for the third-party code distributed in the 'vendor/' subdirectory. See the corresponding COPYING files in 'vendor/*' of the distribution tarball for details. ----------------------------------------------------------------------------- OPARI2 LICENSE AGREEMENT ======================== Copyright (c) 2009-2016, RWTH Aachen University, Germany Copyright (c) 2009-2013, Gesellschaft fuer numerische Simulation mbH, Braunschweig, Germany Copyright (c) 2009-2024, Technische Universitaet Dresden, Germany Copyright (c) 2009-2013, University of Oregon, Eugene, USA Copyright (c) 2009-2025, Forschungszentrum Juelich GmbH, Germany Copyright (c) 2009-2014, German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany Copyright (c) 2009-2013, Technische Universitaet Muenchen, Germany 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 names of RWTH Aachen University, Gesellschaft fuer numerische Simulation mbH Braunschweig, Technische Universitaet Dresden, University of Oregon, Eugene, Forschungszentrum Juelich GmbH, German Research School for Simulation Sciences GmbH, or the Technische Universitaet Muenchen, nor the names of their 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. opari2-2.0.9/PaxHeaders/AUTHORS0000644000000000000000000000013214770056734013061 xustar0030 mtime=1742757340.039533817 30 atime=1742757340.131533256 30 ctime=1742757366.975369637 opari2-2.0.9/AUTHORS0000644000175100001440000000113114770056734013405 0ustar00builderusersAuthors of OPARI and OPARI2, in chronological order: Bernd Mohr Brian Wylie Felix Wolf Markus Geimer Christian Feld Daniel Lorenz Dirk Schmidl Peter Philippen Jie Jiang Bert Wesarg opari2-2.0.9/PaxHeaders/aclocal.m40000644000000000000000000000013114770056736013652 xustar0029 mtime=1742757342.96751597 30 atime=1742757343.171514727 30 ctime=1742757366.959369735 opari2-2.0.9/aclocal.m40000644000175100001440000007315214770056736014213 0ustar00builderusers# generated automatically by aclocal 1.13.4 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.13.4], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.13.4])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_COND_IF -*- Autoconf -*- # Copyright (C) 2008-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_COND_IF # _AM_COND_ELSE # _AM_COND_ENDIF # -------------- # These macros are only used for tracing. m4_define([_AM_COND_IF]) m4_define([_AM_COND_ELSE]) m4_define([_AM_COND_ENDIF]) # AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) # --------------------------------------- # If the shell condition COND is true, execute IF-TRUE, otherwise execute # IF-FALSE. Allow automake to learn about conditional instantiating macros # (the AC_CONFIG_FOOS). AC_DEFUN([AM_COND_IF], [m4_ifndef([_AM_COND_VALUE_$1], [m4_fatal([$0: no such condition "$1"])])dnl _AM_COND_IF([$1])dnl if test -z "$$1_TRUE"; then : m4_n([$2])[]dnl m4_ifval([$3], [_AM_COND_ELSE([$1])dnl else $3 ])dnl _AM_COND_ENDIF([$1])dnl fi[]dnl ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([build-config/common/m4/ac_common_package.m4]) m4_include([build-config/common/m4/ac_scorep_doxygen.m4]) m4_include([build-config/common/m4/ac_scorep_git_controlled.m4]) m4_include([build-config/common/m4/ac_scorep_sys_detection.m4]) m4_include([build-config/common/m4/ac_scorep_toplevel_args.m4]) m4_include([build-config/common/m4/ac_scorep_uncrustify.m4]) m4_include([build-config/common/m4/ac_scorep_version_and_revision.m4]) m4_include([build-config/common/m4/afs_compiler_backend.m4]) m4_include([build-config/common/m4/afs_maintainer_mode.m4]) m4_include([build-config/common/m4/afs_summary.m4]) m4_include([build-config/common/m4/ax_config_subdir.m4]) m4_include([build-config/m4/opari2_compiler_and_flags.m4]) opari2-2.0.9/PaxHeaders/configure.ac0000644000000000000000000000013114770056734014276 xustar0030 mtime=1742757340.079533574 30 atime=1742757340.151533135 29 ctime=1742757366.95536976 opari2-2.0.9/configure.ac0000644000175100001440000000725014770056734014633 0ustar00builderusersAC_PREREQ([2.69]) AC_INIT([OPARI2], m4_esyscmd([build-config/common/generate-package-version.sh build-config/VERSION]), [support@score-p.org], [opari2]) AFS_PACKAGE_INIT AC_SCOREP_REVISION AC_SCOREP_TOPLEVEL_ARGS ## Packages that do manual configuration or use the install program might need ## to tell configure where to find some other shell scripts by calling ## AC_CONFIG_AUX_DIR, though the default places it looks are correct for most ## cases. ## Need to be called early on configure.ac because other macros search tools ## in this directory. AC_CONFIG_AUX_DIR([build-config]) ## See also ACLOCAL_AMFLAGS in Makefile.am. AC_CONFIG_MACRO_DIRS([build-config/m4 build-config/common/m4]) ## Set the default installation prefix to /opt/opari2 instead of /usr/local AC_PREFIX_DEFAULT([/opt/opari2]) AC_SCOREP_GIT_CONTROLLED ## Call not before AC_CONFIG_MACRO_DIR AM_INIT_AUTOMAKE([foreign color-tests 1.13.4 -Wall tar-pax]) AM_SILENT_RULES([yes]) AFS_MAINTAINER_MODE AC_SCOREP_DETECT_PLATFORMS AFS_CROSSCOMPILING # don't detect and load defaults in nested configures (e.g. otf2) AS_IF([test "x$ac_scorep_platform_data_provided" = "x" || test "${ac_scorep_platform_data_provided}" = "no"], [AFS_CUSTOM_COMPILERS AS_IF([test "x${afs_custom_compilers_given}" = "xno"], [AC_SCOREP_WITH_NOCROSS_COMPILER_SUITE]) # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ $ac_scorep_compilers_backend \ $ac_scorep_compilers_frontend \ user_provided_configure_args`" AS_IF([test $? -ne 0], [AC_MSG_ERROR([cannot process provided and/or autodetected arguments. Please contact and provide the above output. Thanks.])]) ], [AC_MSG_NOTICE([platform data provided by toplevel configure.]) # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ user_provided_configure_args`" AS_IF([test $? -ne 0], [AC_MSG_ERROR([cannot process provided arguments. Please contact and provide the above output. Thanks.])]) ]) AC_SCOREP_UNCRUSTIFY AC_SCOREP_DOXYGEN AS_IF([test "x${ac_scorep_git_controlled}" = xyes], [AC_CONFIG_FILES([doc/doxygen-user.cfg:doc/doxygen-user/doxygen-user.cfg.in]) AC_CONFIG_FILES([doc/doxygen-dev.cfg:doc/doxygen-dev/doxygen-dev.cfg.in])]) ## Autoconf supports changing the names of programs when installing them. In ## order to use these transformations, configure.ac must call the macro ## AC_ARG_PROGRAM. # implicitly called by ? #AC_ARG_PROGRAM # used for EXTRA_DIST in Makefile.am AM_CONDITIONAL([CROSS_BUILD], [test "x${ac_scorep_cross_compiling}" = "xyes"]) # handle own package's subdir configures AX_CONFIG_SUBDIR([build-frontend], [${args} ac_scorep_platform=${ac_scorep_platform}]) #sed is needed for check target AC_PROG_SED AC_SUBST([OPARI2_AWK], [`which ${AWK}`]) AC_CONFIG_FILES([ Makefile src/config-common.h:build-config/common/config-common.h ]) AC_CONFIG_FILES([test/c_test.sh], [chmod +x test/c_test.sh]) AC_CONFIG_FILES([test/cxx_test.sh], [chmod +x test/cxx_test.sh]) AC_CONFIG_FILES([test/f90_test.sh], [chmod +x test/f90_test.sh]) AC_CONFIG_FILES([test/f77_test.sh], [chmod +x test/f77_test.sh]) AC_CONFIG_FILES([test/awk_script_test.sh], [chmod +x test/awk_script_test.sh]) AC_CONFIG_FILES([test/awk_script_test.output:test/data/awk_script_test.out.in]) AC_CONFIG_FILES([build-frontend/pomp2-parse-init-regions.awk:src/opari-lib-dummy/pomp2_parse_init_regions.awk.in], \ [chmod +x build-frontend/pomp2-parse-init-regions.awk]) AC_OUTPUT opari2-2.0.9/PaxHeaders/configure0000644000000000000000000000013214770056737013720 xustar0030 mtime=1742757343.587512191 30 atime=1742757356.939430809 30 ctime=1742757366.935369882 opari2-2.0.9/configure0000755000175100001440000050274414770056737014267 0ustar00builderusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for OPARI2 2.0.9. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # need to catch these variables, before unsetting them later : ${AS_COLOR:=$CLICOLOR}; export AS_COLOR : ${AS_COLOR_FORCE:=$CLICOLOR_FORCE}; export AS_COLOR_FORCE as__red= as__grn= as__yel= as__blu= as__mag= as__cya= as__gry= as__std= as__color=no if test "X$AS_COLOR_FORCE" = X0; then as__color=no; elif test "X$AS_COLOR_FORCE" = X1; then as__color=yes elif { test "X$TERM" != Xdumb || test "X$AS_COLOR" = X1; } && { test -t 1; } 2>/dev/null; then as__color=yes fi if test $as__color = yes; then as__red='' as__grn='' as__yel='' as__blu='' as__mag='' as__cya='' as__gry='' as__std='' fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: support@score-p.org about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # ax_fn_config_subdir # ------------------- # trigger configure in ax_subdir with arguments ax_subdir_args. Adjusts # parameters by updating --cache-file, --srcdir, --prefix, and adding # --disable-option-checking as in AC_CONFIG_SUBIRS. ax_fn_config_subdir () { ax_subdir="$1" ax_subdir_args="$2" # BEGIN: slightly modified snippet from status.m4 # Remove --cache-file, --srcdir, --prefix, and # --disable-option-checking arguments so they do not pile up. # Input: ax_subdir_args; output: ax_sub_configure_args ax_sub_configure_args= ac_prev= eval "set x $ax_subdir_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ax_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ax_sub_configure_args="'$ac_arg' $ax_sub_configure_args" # Pass --silent if test "$silent" = yes; then ax_sub_configure_args="--silent $ax_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ax_sub_configure_args="--disable-option-checking $ax_sub_configure_args" ax_popdir=`pwd` ac_msg="=== configuring in $ax_subdir (`pwd`/$ax_subdir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ax_subdir"; as_fn_mkdir_p ac_builddir=. case "$ax_subdir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ax_subdir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ax_subdir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ax_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ax_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ax_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ax_subdir" >&5 $as_echo "$as_me: ${as__yel}WARNING: no configuration information is in $ax_subdir${as__std}" >&2;} ax_sub_configure= fi # The recursion is here. if test -n "$ax_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: info: running $SHELL $ax_sub_configure $ax_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: ${as__blu}info: running $SHELL $ax_sub_configure $ax_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir${as__std}" >&2;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ax_sub_configure\" $ax_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ax_sub_configure failed for $ax_subdir" "$LINENO" 5 fi cd "$ax_popdir" # END: slightly modified snippet from status.m4 } # ax_fn_config_subdir # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: ${as__red}error: $2${as__std}" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='OPARI2' PACKAGE_TARNAME='opari2' PACKAGE_VERSION='2.0.9' PACKAGE_STRING='OPARI2 2.0.9' PACKAGE_BUGREPORT='support@score-p.org' PACKAGE_URL='' ac_default_prefix=/opt/opari2 enable_option_checking=no ax_config_subdir_dir_1= ax_config_subdir_args_1= ac_subst_vars='LTLIBOBJS LIBOBJS OPARI2_AWK ax_config_subdirs CROSS_BUILD_FALSE CROSS_BUILD_TRUE ac_scorep_doxygen_distdir HAVE_DOXYGEN_LATEX_FALSE HAVE_DOXYGEN_LATEX_TRUE have_doxygen_latex have_makeindex have_pdflatex have_dot HAVE_DOXYGEN_FALSE HAVE_DOXYGEN_TRUE DOXYGEN HAVE_UNCRUSTIFY_FALSE HAVE_UNCRUSTIFY_TRUE ac_scorep_have_uncrustify has_ftn has_CC has_cc build_os build_vendor build_cpu build MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM GIT_CONTROLLED_FALSE GIT_CONTROLLED_TRUE SED LIBRARY_AGE LIBRARY_REVISION LIBRARY_CURRENT PACKAGE_SUFFIX PACKAGE_BUGFIX PACKAGE_MINOR PACKAGE_MAJOR afs_srcdir AFS_PACKAGE_NAME AFS_PACKAGE_name target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_maintainer_mode enable_platform_mic with_custom_compilers with_compiler_suite ' ac_precious_vars='build_alias host_alias target_alias' ac_subdirs_all='build-frontend' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: ${as__yel}WARNING: you should use --build, --host, --target${as__std}" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: ${as__yel}WARNING: invalid host type: $ac_option${as__std}" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: ${as__yel}WARNING: unrecognized options: $ac_unrecognized_opts${as__std}" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures OPARI2 2.0.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/opari2] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of OPARI2 2.0.9:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --disable-maintainer-mode disable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-platform-mic Force build for Intel Xeon Phi co-processors [no]. This option is only needed for Xeon Phi co-processors, like the Knights Corner (KNC). It is not needed for self-hosted Xeon Phis, like the Knights Landing (KNL); for these chips no special treatment is required. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-custom-compilers Customize compiler settings by 1. copying the files /build-config/common/platforms/platform-*-user-provided to the directory where you run configure , 2. editing those files to your needs, and 3. running configure. Alternatively, edit the files under directly. Files in take precedence. You are entering unsupported terrain. Namaste, and good luck! --with-compiler-suite=(gcc|ibm|intel|oneapi|nvhpc|pgi|clang|aocc|amdclang) The compiler suite used to build this package. Needs to be in $PATH [gcc]. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: ${as__yel}WARNING: no configuration information is in $ac_dir${as__std}" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF OPARI2 configure 2.0.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by OPARI2 $as_me 2.0.9, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: ${as__yel}WARNING: cache variable $ac_var contains a newline${as__std}" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: info: loading site script $ac_site_file" >&5 $as_echo "$as_me: ${as__blu}info: loading site script $ac_site_file${as__std}" >&2;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: ${as__red}error: in \`$ac_pwd':${as__std}" >&2;} as_fn_error $? "failed to load site script $ac_site_file${as__std} ${as__red}See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: info: loading cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: loading cache $cache_file${as__std}" >&2;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: info: creating cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: creating cache $cache_file${as__std}" >&2;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu AFS_PACKAGE_name=opari2 AFS_PACKAGE_NAME=OPARI2 afs_srcdir=$srcdir { $as_echo "$as_me:${as_lineno-$LINENO}: checking Git controlled" >&5 $as_echo_n "checking Git controlled... " >&6; } ac_scorep_git_controlled="no" # test if ${afs_srcdir} is a git top-level, not any parent directory: # * if ${afs_srcdir} is a top-level, then the prefix is empty (e.g., we are git controlled) # * if ${afs_srcdir} is below a top-level, then it wont be empty (e.g., we operate in a # tarball, which was extracted below a top-level) # * if git could not find any top-level, it prints an error to stderr and stop, # we catch this error, which makes the test also fail (e.g., we operate in a # tarball which is *not* below any top-level) if test -z "$( unset $(git rev-parse --local-env-vars 2>/dev/null) && cd ${afs_srcdir} && git rev-parse --show-prefix 2>&1)"; then : ac_scorep_git_controlled="yes" $as_echo "#define SCOREP_IN_DEVELOPEMENT /**/" >>confdefs.h else $as_echo "#define SCOREP_IN_PRODUCTION /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_git_controlled" >&5 case "$ac_scorep_git_controlled" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_git_controlled${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_git_controlled${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_git_controlled${as__std}" >&6 ;; esac; } PACKAGE_MAJOR=2 PACKAGE_MINOR=0 PACKAGE_BUGFIX=9 PACKAGE_SUFFIX= LIBRARY_CURRENT=3 LIBRARY_REVISION=0 LIBRARY_AGE=0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 case "$ac_cv_path_SED" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_cv_path_SED${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_cv_path_SED${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_cv_path_SED${as__std}" >&6 ;; esac; } SED="$ac_cv_path_SED" rm -f conftest.sed # When in a working copy, write REVISION* files. The REVISION* files # are updated during each configure call and also at make # doxygen-user. # When working with a make-dist-generated tarball, the REVISION* files # are provided. component_revision="invalid" if test "x${ac_scorep_git_controlled}" = xyes && component_revision=$( unset $(git rev-parse --local-env-vars 2>/dev/null) && cd ${afs_srcdir} && git describe --long --always --dirty | ${SED} 's/.*-g//' 2>/dev/null); then : echo "$component_revision" >${afs_srcdir}/build-config/REVISION else component_revision=external fi # Warn if the REVISION files contain -dirty prefix or is external. case `cat ${afs_srcdir}/build-config/REVISION` in #( *-dirty|external|invalid) : component_revision=`cat ${afs_srcdir}/build-config/REVISION` { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: distribution does not match a single, unmodified revision, but $component_revision." >&5 $as_echo "$as_me: ${as__yel}WARNING: distribution does not match a single, unmodified revision, but $component_revision.${as__std}" >&2;} ;; #( *) : ;; esac # Quote arguments with shell meta characters. TOPLEVEL_CONFIGURE_ARGUMENTS= set -- "$progname" "$@" for ac_arg do case "$ac_arg" in #( *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\']*) : ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` # if the argument is of the form -foo=baz, quote the baz part only ac_arg=`echo "'$ac_arg'" | sed "s/^'\([-a-zA-Z0-9]*=\)/\\1'/"` ;; #( *) : ;; esac # Add the quoted argument to the list. TOPLEVEL_CONFIGURE_ARGUMENTS="$TOPLEVEL_CONFIGURE_ARGUMENTS $ac_arg" done # Remove the initial space we just introduced. TOPLEVEL_CONFIGURE_ARGUMENTS=`echo "x$TOPLEVEL_CONFIGURE_ARGUMENTS" | sed -e 's/^x *//'` echo "$TOPLEVEL_CONFIGURE_ARGUMENTS" > ./user_provided_configure_args ## Packages that do manual configuration or use the install program might need ## to tell configure where to find some other shell scripts by calling ## AC_CONFIG_AUX_DIR, though the default places it looks are correct for most ## cases. ## Need to be called early on configure.ac because other macros search tools ## in this directory. ac_aux_dir= for ac_dir in build-config "$srcdir"/build-config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-config \"$srcdir\"/build-config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. ## See also ACLOCAL_AMFLAGS in Makefile.am. ## Set the default installation prefix to /opt/opari2 instead of /usr/local # afs_fn_summary DESCR VALUE INDENT WRAP-MARGIN=128 # ---------------------------------------------------------------------- # Produces a line-wrapped summary line with DESCR and VALUE, indented by # INDENT and wrapped at WRAP-MARGIN. afs_fn_summary () { _afs_summary_wrap_width=${4-128} _afs_summary_column_width=32 _afs_summary_prefix="${3-} ${1-}:" printf "%s" "${_afs_summary_prefix}" _afs_summary_padding="$(printf "%-${_afs_summary_column_width}s" "")" _afs_summary_value="$(echo "${2-}" | $SED -e 's/ */ /g' -e 's/^ //' -e 's/ $//')" if test ${#_afs_summary_prefix} -ge ${#_afs_summary_padding}; then : _afs_summary_nl=" \\$as_nl${_afs_summary_padding}" else as_fn_arith ${#_afs_summary_padding} - ${#_afs_summary_prefix} && _afs_summary_nl="$(printf "%-${as_val}s" "")" fi _afs_summary_sep="" as_fn_arith ${#_afs_summary_padding} + 1 && _afs_summary_column=$as_val while test -n "${_afs_summary_value}" do _afs_summary_entry="${_afs_summary_value%% *}" printf "%s" "${_afs_summary_nl}${_afs_summary_sep}${_afs_summary_entry}" case "${_afs_summary_value}" in (*" "*) _afs_summary_value="${_afs_summary_value#* }" ;; (*) _afs_summary_value="" ;; esac as_fn_arith ${_afs_summary_column} + ${#_afs_summary_entry} + ${#_afs_summary_sep} && _afs_summary_column=$as_val if test ${_afs_summary_column} -ge ${_afs_summary_wrap_width}; then : _afs_summary_nl=" \\$as_nl${_afs_summary_padding}" _afs_summary_sep="" as_fn_arith ${#_afs_summary_padding} + 1 && _afs_summary_column=$as_val else _afs_summary_sep=" " _afs_summary_nl="" fi done echo { _afs_summary_column_width=; unset _afs_summary_column_width;} { _afs_summary_wrap_width=; unset _afs_summary_wrap_width;} { _afs_summary_prefix=; unset _afs_summary_prefix;} { _afs_summary_padding=; unset _afs_summary_padding;} { _afs_summary_value=; unset _afs_summary_value;} { _afs_summary_nl=; unset _afs_summary_nl;} { _afs_summary_sep=; unset _afs_summary_sep;} { _afs_summary_column=; unset _afs_summary_column;} { _afs_summary_entry=; unset _afs_summary_entry;} { _afs_summary_tag=; unset _afs_summary_tag;} { _afs_summary_tag_final=; unset _afs_summary_tag_final;} } # afs_fn_summary rm -f opari2.summary LC_ALL=C find . -name 'config.summary*' -exec rm -f '{}' \; afs_fn_summary \ "OPARI2 2.0.9" \ "" \ "" \ >config.summary if test "x${ac_scorep_git_controlled}" = xyes; then GIT_CONTROLLED_TRUE= GIT_CONTROLLED_FALSE='#' else GIT_CONTROLLED_TRUE='#' GIT_CONTROLLED_FALSE= fi if test "x${verbose}" = "xyes"; then : afs_fn_summary "Git controlled" "$ac_scorep_git_controlled" " " >>config.summary fi ## Call not before AC_CONFIG_MACRO_DIR am__api_version='1.13' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 case "$INSTALL" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$INSTALL${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$INSTALL${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$INSTALL${as__std}" >&6 ;; esac; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "${as__grn}yes${as__std}" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: ${as__yel}WARNING: 'missing' script is too old or missing${as__std}" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 case "$STRIP" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$STRIP${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$STRIP${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$STRIP${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 case "$ac_ct_STRIP" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_ct_STRIP${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_ct_STRIP${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_ct_STRIP${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: ${as__yel}WARNING: using cross tools not prefixed with host triplet${as__std}" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 case "$MKDIR_P" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$MKDIR_P${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$MKDIR_P${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$MKDIR_P${as__std}" >&6 ;; esac; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 case "$AWK" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$AWK${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$AWK${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$AWK${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "${as__grn}yes${as__std}" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 case "$am_cv_make_support_nested_variables" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$am_cv_make_support_nested_variables${as__std}" >&6 ;; esac; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='opari2' VERSION='2.0.9' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a pax tar archive" >&5 $as_echo_n "checking how to create a pax tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_pax-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=posix -chf - "'"$$tardir"' am__tar_="$_am_tar --format=posix -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x pax -w "$$tardir"' am__tar_='pax -L -x pax -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H pax -L' am__tar_='find "$tardir" -print | cpio -o -H pax -L' am__untar='cpio -i -H pax -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_pax}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if ${am_cv_prog_tar_pax+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_prog_tar_pax=$_am_tool fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_pax" >&5 case "$am_cv_prog_tar_pax" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$am_cv_prog_tar_pax${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$am_cv_prog_tar_pax${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$am_cv_prog_tar_pax${as__std}" >&6 ;; esac; } # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=0;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 case "$am_cv_make_support_nested_variables" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$am_cv_make_support_nested_variables${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$am_cv_make_support_nested_variables${as__std}" >&6 ;; esac; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "x${ac_scorep_git_controlled}" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 case "$USE_MAINTAINER_MODE" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$USE_MAINTAINER_MODE${as__std}" >&6 ;; esac; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 case "$USE_MAINTAINER_MODE" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$USE_MAINTAINER_MODE${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$USE_MAINTAINER_MODE${as__std}" >&6 ;; esac; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE fi # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 case "$ac_cv_build" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_cv_build${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_cv_build${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_cv_build${as__std}" >&6 ;; esac; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac # Notes about platform detection on Cray systems: # First, we check for x86-64 CPU type and an existing /opt/cray/pmi/default link. # This test should succeed for all supported Cray systems (Cray XT, XE, XK, XC). # In the second step we will classify the systems depending on their network. # Therefore, we use the link /opt/cray/pmi/default. We determine the link target # and select the network. For example, /opt/cray/pmi/default points to # /opt/cray/pmi/4.0.1-1.0000.9421.73.3.gem. 'gem' signifies the Gemini network. # As a result we can classify the following systems: # ss (SeaStar) Cray XT # gem (Gemini) Cray XE, XK # ari (Aries) Cray XC # To distinguish Cray XE and XK systems we determine whether the system uses GPU # accelerators (Cray XK) or not (Cray XE). # # Newer software stacks do not encode the network name in their files, e.g., # /opt/cray/pmi/5.0.11 # Therefore, we need a fall-back solution. We will test for several directories # including the network name. # # Even newer software stacks on Cray XC systems (Cori, Piz Daint) # don't provide the /opt/cray/pmi/default link but instead # /opt/cray/pe/pmi/default. They still provide the network via # /opt/cray/ari/modulefiles. # # Check whether --enable-platform-mic was given. if test "${enable_platform_mic+set}" = set; then : enableval=$enable_platform_mic; case ${enableval} in #( yes) : ac_scorep_platform=mic ;; #( no) : ;; #( *) : as_fn_error $? "value '$enableval' unsupported for '--enable-platform-mic'" "$LINENO" 5 ;; esac fi if test "x${ac_scorep_platform}" = "x"; then : case ${build_os} in #( linux*) : if test "x${build_cpu}" = "xia64" && test -f /etc/sgi-release; then : ac_scorep_platform="altix" elif test "x${build_cpu}" = "xpowerpc64" && test -d /bgl/BlueLight; then : ac_scorep_platform="bgl" elif test "x${build_cpu}" = "xpowerpc64" && test -d /bgsys/drivers/ppcfloor/hwi; then : ac_scorep_platform="bgq" elif test "x${build_cpu}" = "xpowerpc64" && test -d /bgsys; then : ac_scorep_platform="bgp" elif (test "x${build_cpu}" = "xx86_64" || test "x${build_cpu}" = "xaarch64") && test -d /opt/cray; then : ac_scorep_platform="craygeneric" if test -L /opt/cray/pmi/default; then : if test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q ss && echo TRUE`" = "xTRUE"; then : ac_scorep_platform="crayxt" elif test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q gem && echo TRUE`" = "xTRUE" && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x1"; then : ac_scorep_platform="crayxe" elif test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q gem && echo TRUE`" = "xTRUE" && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x0"; then : ac_scorep_platform="crayxk" elif test "x`readlink -f /opt/cray/pmi/default | grep -o --regexp=[a-z]*$ | grep -q ari && echo TRUE`" = "xTRUE"; then : ac_scorep_platform="crayxc" elif test -d /opt/cray/ari/modulefiles; then : ac_scorep_platform="crayxc" elif test -d /opt/cray/gem/modulefiles && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x0"; then : ac_scorep_platform="crayxk" elif test -d /opt/cray/gem/modulefiles && test "x`apstat -G | grep \"(none)\" | wc -l`" = "x1"; then : ac_scorep_platform="crayxe" fi elif test -L /opt/cray/pe/pmi/default; then : if test -d /opt/cray/ari/modulefiles; then : ac_scorep_platform="crayxc" fi fi if test "x${ac_scorep_platform}" = "xcraygeneric"; then : # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_has_cc+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$has_cc"; then ac_cv_prog_has_cc="$has_cc" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_has_cc="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_has_cc" && ac_cv_prog_has_cc="no" fi fi has_cc=$ac_cv_prog_has_cc if test -n "$has_cc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_cc" >&5 case "$has_cc" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$has_cc${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$has_cc${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$has_cc${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "CC", so it can be a program name with args. set dummy CC; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_has_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$has_CC"; then ac_cv_prog_has_CC="$has_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_has_CC="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_has_CC" && ac_cv_prog_has_CC="no" fi fi has_CC=$ac_cv_prog_has_CC if test -n "$has_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_CC" >&5 case "$has_CC" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$has_CC${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$has_CC${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$has_CC${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "ftn", so it can be a program name with args. set dummy ftn; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_has_ftn+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$has_ftn"; then ac_cv_prog_has_ftn="$has_ftn" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_has_ftn="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_has_ftn" && ac_cv_prog_has_ftn="no" fi fi has_ftn=$ac_cv_prog_has_ftn if test -n "$has_ftn"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_ftn" >&5 case "$has_ftn" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$has_ftn${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$has_ftn${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$has_ftn${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "${has_cc}${has_CC}${has_ftn}" != yesyesyes; then : # System seems to be a Cray, but doensn't provide # compiler wrappers cc, CC, ftn. Try 'linux' as fallback. ac_scorep_platform=linux { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Generic Cray platform, no compiler wrappers provided, assume linux. Please contact ." >&5 $as_echo "$as_me: ${as__yel}WARNING: Generic Cray platform, no compiler wrappers provided, assume linux. Please contact .${as__std}" >&2;} else { $as_echo "$as_me:${as_lineno-$LINENO}: info: Generic Cray platform, providing compiler wrappers, not cross-compiling." >&5 $as_echo "$as_me: ${as__blu}info: Generic Cray platform, providing compiler wrappers, not cross-compiling.${as__std}" >&2;} fi fi elif test "x${build_cpu}" = "xx86_64" && test -d /opt/FJSVtclang; then : ac_scorep_platform="k" elif test "x${build_cpu}" = "xx86_64" && test -d /opt/FJSVfxlang; then : ac_scorep_platform="fx10" elif test "x${build_cpu}" = "xx86_64" && test -d /opt/FJSVmxlang; then : ac_scorep_platform="fx100" else ac_scorep_platform=linux fi ;; #( sunos* | solaris*) : ac_scorep_platform="solaris" ;; #( darwin*) : ac_scorep_platform="mac" ;; #( aix*) : ac_scorep_platform="aix" ;; #( mingw*) : ac_scorep_platform="mingw" ;; #( *) : ac_scorep_platform="unknown" ;; esac # Keep 'checking' and 'result' close to each other in oder to not interfere with CICD platform check { $as_echo "$as_me:${as_lineno-$LINENO}: checking for platform" >&5 $as_echo_n "checking for platform... " >&6; } if test "x${ac_scorep_platform}" = "xunknown"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_platform, please contact if you encounter any problems." >&5 case "$ac_scorep_platform, please contact if you encounter any problems." in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_platform, please contact if you encounter any problems.${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_platform, please contact if you encounter any problems.${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_platform, please contact if you encounter any problems.${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_platform (auto detected)" >&5 case "$ac_scorep_platform (auto detected)" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_platform (auto detected)${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_platform (auto detected)${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_platform (auto detected)${as__std}" >&6 ;; esac; } afs_fn_summary "Platform" "$ac_scorep_platform (auto detected)" " " >>config.summary fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for platform" >&5 $as_echo_n "checking for platform... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_platform (provided)" >&5 case "$ac_scorep_platform (provided)" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_platform (provided)${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_platform (provided)${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_platform (provided)${as__std}" >&6 ;; esac; } afs_fn_summary "Platform" "$ac_scorep_platform (provided)" " " >>config.summary fi if test "x${ac_scorep_cross_compiling}" = "x"; then : case ${ac_scorep_platform} in #( altix) : ac_scorep_cross_compiling="no" ;; #( bgl) : ac_scorep_cross_compiling="yes" ;; #( bgp) : ac_scorep_cross_compiling="yes" ;; #( bgq) : ac_scorep_cross_compiling="yes" ;; #( crayxt) : ac_scorep_cross_compiling="yes" ;; #( crayxe) : ac_scorep_cross_compiling="yes" ;; #( crayxk) : ac_scorep_cross_compiling="yes" ;; #( crayxc) : ac_scorep_cross_compiling="yes" ;; #( craygeneric) : ac_scorep_cross_compiling="no" ;; #( k) : ac_scorep_cross_compiling="yes" ;; #( fx10) : ac_scorep_cross_compiling="yes" ;; #( fx100) : ac_scorep_cross_compiling="yes" ;; #( linux) : ac_scorep_cross_compiling="no" ;; #( solaris) : ac_scorep_cross_compiling="no" ;; #( mac) : ac_scorep_cross_compiling="no" ;; #( mic) : ac_scorep_cross_compiling="yes" ;; #( mingw) : ac_scorep_cross_compiling="no" ;; #( aix) : ac_scorep_cross_compiling="no" ;; #( unknown) : ac_scorep_cross_compiling="no" ;; #( *) : as_fn_error $? "provided platform '${ac_scorep_platform}' unknown." "$LINENO" 5 ;; esac afs_fn_summary "Cross compiling" "$ac_scorep_cross_compiling (auto detected)" " " >>config.summary else # honor ac_scorep_cross_compiling from the commandline if test ${ac_scorep_cross_compiling} != "yes" && \ test ${ac_scorep_cross_compiling} != "no" ; then : as_fn_error $? "invalid value '${ac_scorep_cross_compiling}' for provided 'ac_scorep_cross_compiling'" "$LINENO" 5 fi afs_fn_summary "Cross compiling" "$ac_scorep_cross_compiling (provided)" " " >>config.summary fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cross compilation" >&5 $as_echo_n "checking for cross compilation... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_cross_compiling" >&5 case "$ac_scorep_cross_compiling" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_cross_compiling${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_cross_compiling${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_cross_compiling${as__std}" >&6 ;; esac; } # don't detect and load defaults in nested configures (e.g. otf2) if test "x$ac_scorep_platform_data_provided" = "x" || test "${ac_scorep_platform_data_provided}" = "no"; then : # Check whether --with-custom-compilers was given. if test "${with_custom_compilers+set}" = set; then : withval=$with_custom_compilers; afs_custom_compilers_given="yes" case ${withval} in #( "yes") : if test -f ./platform-backend-user-provided && \ test -f ./platform-frontend-user-provided && \ test -f ./platform-mpi-user-provided && \ test -f ./platform-shmem-user-provided; then : { $as_echo "$as_me:${as_lineno-$LINENO}: info: Using compiler specification from ./platform-*-user-provided files." >&5 $as_echo "$as_me: ${as__blu}info: Using compiler specification from ./platform-*-user-provided files.${as__std}" >&2;} ac_scorep_compilers_backend="./platform-backend-user-provided" ac_scorep_compilers_frontend="./platform-frontend-user-provided" ac_scorep_compilers_mpi="./platform-mpi-user-provided" ac_scorep_compilers_shmem="./platform-shmem-user-provided" else { $as_echo "$as_me:${as_lineno-$LINENO}: info: Using compiler specification from $srcdir/build-config/common/platforms/platform-*-user-provided files." >&5 $as_echo "$as_me: ${as__blu}info: Using compiler specification from $srcdir/build-config/common/platforms/platform-*-user-provided files.${as__std}" >&2;} ac_scorep_compilers_backend="$srcdir/build-config/common/platforms/platform-backend-user-provided" ac_scorep_compilers_frontend="$srcdir/build-config/common/platforms/platform-frontend-user-provided" ac_scorep_compilers_mpi="$srcdir/build-config/common/platforms/platform-mpi-user-provided" ac_scorep_compilers_shmem="$srcdir/build-config/common/platforms/platform-shmem-user-provided" fi ;; #( *) : as_fn_error $? "'${withval}' not supported by --with-custom-compilers." "$LINENO" 5 ;; esac else afs_custom_compilers_given="no" fi if test "x${afs_custom_compilers_given}" = "xno"; then : ac_scorep_compilers_frontend="platform-frontend-${ac_scorep_platform}" ac_scorep_compilers_backend="platform-backend-${ac_scorep_platform}" if test "x${ac_scorep_compiler_suite_called}" != "x"; then # We need m4 quoting magic here ... as_fn_error $? "cannot use AC_SCOREP_WITH_COMPILER_SUITE and AC_SCOREP_WITH_NOCROSS_COMPILER_SUITE in one configure.ac." "$LINENO" 5 else ac_scorep_compiler_suite_called="yes" fi # Check whether --with-compiler-suite was given. if test "${with_compiler_suite+set}" = set; then : withval=$with_compiler_suite; case $withval in #( gcc|ibm|intel|oneapi|nvhpc|pgi|clang|aocc|amdclang) : ac_scorep_compilers_frontend="compiler-nocross-$withval" ;; #( "no") : as_fn_error $? "option --without-compiler-suite makes no sense." "$LINENO" 5 ;; #( *) : as_fn_error $? "compiler suite \"${withval}\" not supported by --with-compiler-suite." "$LINENO" 5 ;; esac fi if test -f "$srcdir/build-config/platforms/${ac_scorep_compilers_frontend}"; then : ac_scorep_compilers_frontend="$srcdir/build-config/platforms/${ac_scorep_compilers_frontend}" else ac_scorep_compilers_frontend="$srcdir/build-config/common/platforms/${ac_scorep_compilers_frontend}" fi if test -f "$srcdir/build-config/platforms/${ac_scorep_compilers_backend}"; then : ac_scorep_compilers_backend="$srcdir/build-config/platforms/${ac_scorep_compilers_backend}" else ac_scorep_compilers_backend="$srcdir/build-config/common/platforms/${ac_scorep_compilers_backend}" fi fi # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ $ac_scorep_compilers_backend \ $ac_scorep_compilers_frontend \ user_provided_configure_args`" if test $? -ne 0; then : as_fn_error $? "cannot process provided and/or autodetected arguments. Please contact and provide the above output. Thanks." "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: info: platform data provided by toplevel configure." >&5 $as_echo "$as_me: ${as__blu}info: platform data provided by toplevel configure.${as__std}" >&2;} # determine arguments for subdir configures args="`$AWK -f $srcdir/build-config/common/process_arguments.awk \ user_provided_configure_args`" if test $? -ne 0; then : as_fn_error $? "cannot process provided arguments. Please contact and provide the above output. Thanks." "$LINENO" 5 fi fi # Extract the first word of "uncrustify", so it can be a program name with args. set dummy uncrustify; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_scorep_have_uncrustify+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_scorep_have_uncrustify"; then ac_cv_prog_ac_scorep_have_uncrustify="$ac_scorep_have_uncrustify" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_scorep_have_uncrustify="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ac_scorep_have_uncrustify" && ac_cv_prog_ac_scorep_have_uncrustify="no" fi fi ac_scorep_have_uncrustify=$ac_cv_prog_ac_scorep_have_uncrustify if test -n "$ac_scorep_have_uncrustify"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_scorep_have_uncrustify" >&5 case "$ac_scorep_have_uncrustify" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_scorep_have_uncrustify${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_scorep_have_uncrustify${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_scorep_have_uncrustify${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x${ac_scorep_have_uncrustify}" = "xyes"; then HAVE_UNCRUSTIFY_TRUE= HAVE_UNCRUSTIFY_FALSE='#' else HAVE_UNCRUSTIFY_TRUE='#' HAVE_UNCRUSTIFY_FALSE= fi #if test -z "$have_svnversion"; then # AC_CHECK_PROG([have_svnversion], [svnversion], [yes], [no],,) #fi # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_DOXYGEN+:} false; then : $as_echo_n "(cached) " >&6 else case $DOXYGEN in [\\/]* | ?:[\\/]*) ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_DOXYGEN="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi DOXYGEN=$ac_cv_path_DOXYGEN if test -n "$DOXYGEN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5 case "$DOXYGEN" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$DOXYGEN${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$DOXYGEN${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$DOXYGEN${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x${DOXYGEN}" != "x"; then HAVE_DOXYGEN_TRUE= HAVE_DOXYGEN_FALSE='#' else HAVE_DOXYGEN_TRUE='#' HAVE_DOXYGEN_FALSE= fi have_doxygen_latex="no" if test -z "$HAVE_DOXYGEN_TRUE"; then : # Extract the first word of "dot", so it can be a program name with args. set dummy dot; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_have_dot+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$have_dot"; then ac_cv_prog_have_dot="$have_dot" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_dot="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_have_dot" && ac_cv_prog_have_dot="no" fi fi have_dot=$ac_cv_prog_have_dot if test -n "$have_dot"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_dot" >&5 case "$have_dot" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$have_dot${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$have_dot${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$have_dot${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "pdflatex", so it can be a program name with args. set dummy pdflatex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_have_pdflatex+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$have_pdflatex"; then ac_cv_prog_have_pdflatex="$have_pdflatex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_pdflatex="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_have_pdflatex" && ac_cv_prog_have_pdflatex="no" fi fi have_pdflatex=$ac_cv_prog_have_pdflatex if test -n "$have_pdflatex"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_pdflatex" >&5 case "$have_pdflatex" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$have_pdflatex${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$have_pdflatex${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$have_pdflatex${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi # Extract the first word of "makeindex", so it can be a program name with args. set dummy makeindex; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_have_makeindex+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$have_makeindex"; then ac_cv_prog_have_makeindex="$have_makeindex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_have_makeindex="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_have_makeindex" && ac_cv_prog_have_makeindex="no" fi fi have_makeindex=$ac_cv_prog_have_makeindex if test -n "$have_makeindex"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_makeindex" >&5 case "$have_makeindex" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$have_makeindex${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$have_makeindex${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$have_makeindex${as__std}" >&6 ;; esac; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "${as__red}no${as__std}" >&6; } fi if test "x${have_pdflatex}" = xyes && test "x${have_makeindex}" = xyes; then have_doxygen_latex="yes" fi fi if test "x${have_doxygen_latex}" = xyes; then HAVE_DOXYGEN_LATEX_TRUE= HAVE_DOXYGEN_LATEX_FALSE='#' else HAVE_DOXYGEN_LATEX_TRUE='#' HAVE_DOXYGEN_LATEX_FALSE= fi # ac_scorep_doxygen_distdir may be passed in from upper level configure # will end up in 'USER_DOC_DIR = $(top_distdir)$(ac_scorep_doxygen_distdir)/doc' if test ! -n "$ac_scorep_doxygen_distdir"; then ac_scorep_doxygen_distdir="" fi if test "x${ac_scorep_git_controlled}" = xyes; then : ac_config_files="$ac_config_files doc/doxygen-user.cfg:doc/doxygen-user/doxygen-user.cfg.in" ac_config_files="$ac_config_files doc/doxygen-dev.cfg:doc/doxygen-dev/doxygen-dev.cfg.in" fi ## Autoconf supports changing the names of programs when installing them. In ## order to use these transformations, configure.ac must call the macro ## AC_ARG_PROGRAM. # implicitly called by ? #AC_ARG_PROGRAM # used for EXTRA_DIST in Makefile.am if test "x${ac_scorep_cross_compiling}" = "xyes"; then CROSS_BUILD_TRUE= CROSS_BUILD_FALSE='#' else CROSS_BUILD_TRUE='#' CROSS_BUILD_FALSE= fi # handle own package's subdir configures ax_config_subdir_dir_1="build-frontend" ax_config_subdir_args_1="${args} ac_scorep_platform=${ac_scorep_platform}" ax_config_subdirs="${ax_config_subdirs} build-frontend" #sed is needed for check target { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 case "$ac_cv_path_SED" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}$ac_cv_path_SED${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}$ac_cv_path_SED${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}$ac_cv_path_SED${as__std}" >&6 ;; esac; } SED="$ac_cv_path_SED" rm -f conftest.sed OPARI2_AWK=`which ${AWK}` ac_config_files="$ac_config_files Makefile src/config-common.h:build-config/common/config-common.h" ac_config_files="$ac_config_files test/c_test.sh" ac_config_files="$ac_config_files test/cxx_test.sh" ac_config_files="$ac_config_files test/f90_test.sh" ac_config_files="$ac_config_files test/f77_test.sh" ac_config_files="$ac_config_files test/awk_script_test.sh" ac_config_files="$ac_config_files test/awk_script_test.output:test/data/awk_script_test.out.in" ac_config_files="$ac_config_files build-frontend/pomp2-parse-init-regions.awk:src/opari-lib-dummy/pomp2_parse_init_regions.awk.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: ${as__yel}WARNING: cache variable $ac_var contains a newline${as__std}" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: info: updating cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: updating cache $cache_file${as__std}" >&2;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: info: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: ${as__blu}info: not updating unwritable cache $cache_file${as__std}" >&2;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${GIT_CONTROLLED_TRUE}" && test -z "${GIT_CONTROLLED_FALSE}"; then as_fn_error $? "conditional \"GIT_CONTROLLED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 case "done" in #( yes|ok|yes[\ ,]*) : $as_echo "${as__grn}done${as__std}" >&6 ;; #( no|failed|unsupported|no[\ ,]*) : $as_echo "${as__red}done${as__std}" >&6 ;; #( *) : $as_echo "${as__blu}done${as__std}" >&6 ;; esac; } if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_UNCRUSTIFY_TRUE}" && test -z "${HAVE_UNCRUSTIFY_FALSE}"; then as_fn_error $? "conditional \"HAVE_UNCRUSTIFY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DOXYGEN_TRUE}" && test -z "${HAVE_DOXYGEN_FALSE}"; then as_fn_error $? "conditional \"HAVE_DOXYGEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DOXYGEN_LATEX_TRUE}" && test -z "${HAVE_DOXYGEN_LATEX_FALSE}"; then as_fn_error $? "conditional \"HAVE_DOXYGEN_LATEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CROSS_BUILD_TRUE}" && test -z "${CROSS_BUILD_FALSE}"; then as_fn_error $? "conditional \"CROSS_BUILD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: info: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: ${as__blu}info: creating $CONFIG_STATUS${as__std}" >&2;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # need to catch these variables, before unsetting them later : ${AS_COLOR:=$CLICOLOR}; export AS_COLOR : ${AS_COLOR_FORCE:=$CLICOLOR_FORCE}; export AS_COLOR_FORCE as__red= as__grn= as__yel= as__blu= as__mag= as__cya= as__gry= as__std= as__color=no if test "X$AS_COLOR_FORCE" = X0; then as__color=no; elif test "X$AS_COLOR_FORCE" = X1; then as__color=yes elif { test "X$TERM" != Xdumb || test "X$AS_COLOR" = X1; } && { test -t 1; } 2>/dev/null; then as__color=yes fi if test $as__color = yes; then as__red='' as__grn='' as__yel='' as__blu='' as__mag='' as__cya='' as__gry='' as__std='' fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: ${as__red}error: $2${as__std}" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by OPARI2 $as_me 2.0.9, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ OPARI2 config.status 2.0.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "doc/doxygen-user.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen-user.cfg:doc/doxygen-user/doxygen-user.cfg.in" ;; "doc/doxygen-dev.cfg") CONFIG_FILES="$CONFIG_FILES doc/doxygen-dev.cfg:doc/doxygen-dev/doxygen-dev.cfg.in" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/config-common.h") CONFIG_FILES="$CONFIG_FILES src/config-common.h:build-config/common/config-common.h" ;; "test/c_test.sh") CONFIG_FILES="$CONFIG_FILES test/c_test.sh" ;; "test/cxx_test.sh") CONFIG_FILES="$CONFIG_FILES test/cxx_test.sh" ;; "test/f90_test.sh") CONFIG_FILES="$CONFIG_FILES test/f90_test.sh" ;; "test/f77_test.sh") CONFIG_FILES="$CONFIG_FILES test/f77_test.sh" ;; "test/awk_script_test.sh") CONFIG_FILES="$CONFIG_FILES test/awk_script_test.sh" ;; "test/awk_script_test.output") CONFIG_FILES="$CONFIG_FILES test/awk_script_test.output:test/data/awk_script_test.out.in" ;; "build-frontend/pomp2-parse-init-regions.awk") CONFIG_FILES="$CONFIG_FILES build-frontend/pomp2-parse-init-regions.awk:src/opari-lib-dummy/pomp2_parse_init_regions.awk.in" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: info: creating $ac_file" >&5 $as_echo "$as_me: ${as__blu}info: creating $ac_file${as__std}" >&2;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: ${as__yel}WARNING: $ac_file_inputs seems to ignore the --datarootdir setting${as__std}" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: ${as__yel}WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined${as__std}" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac case $ac_file$ac_mode in "test/c_test.sh":F) chmod +x test/c_test.sh ;; "test/cxx_test.sh":F) chmod +x test/cxx_test.sh ;; "test/f90_test.sh":F) chmod +x test/f90_test.sh ;; "test/f77_test.sh":F) chmod +x test/f77_test.sh ;; "test/awk_script_test.sh":F) chmod +x test/awk_script_test.sh ;; "build-frontend/pomp2-parse-init-regions.awk":F) \ chmod +x build-frontend/pomp2-parse-init-regions.awk ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # Execute subdir configures defined via AX_CONFIG_SUBDIR. # # Do not complain if ax_config_subdir_dir is missing, so a configure # script can configure whichever parts of a large source tree are # present. if test "x${no_recursion}" != xyes && test "x${ax_config_subdir_dir_1}" != x && test -d "${srcdir}/${ax_config_subdir_dir_1}"; then : ax_fn_config_subdir "${ax_config_subdir_dir_1}" "${ax_config_subdir_args_1}" fi # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: ${as__yel}WARNING: unrecognized options: $ac_unrecognized_opts${as__std}" >&2;} fi opari2-2.0.9/PaxHeaders/Makefile.am0000644000000000000000000000013214770056734014045 xustar0030 mtime=1742757340.043533793 30 atime=1742757340.135533232 30 ctime=1742757366.935369882 opari2-2.0.9/Makefile.am0000644000175100001440000001501714770056734014401 0ustar00builderusers## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen, Germany ## ## Copyright (c) 2009-2011, ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## ## Copyright (c) 2009-2011, 2019-2020, ## Technische Universitaet Dresden, Germany ## ## Copyright (c) 2009-2011, ## University of Oregon, Eugene, USA ## ## Copyright (c) 2009-2011, 2014-2015, 2017, ## Forschungszentrum Juelich GmbH, Germany ## ## Copyright (c) 2009-2011, ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Muenchen, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## ## file Makefile.am ## The SUBDIRS variable holds a list of subdirectories automake (recursivly) ## must build. SUBDIRS = $(subdirs) $(ax_config_subdirs) ## Options passed to aclocal to specify local macro directories. Although ## ACLOCAL_AMFLAGS should be replaced by AC_CONFIG_MACRO_DIRS, aclocal-1.13.4 ## doesn't honor the paths provided to AC_CONFIG_MACRO_DIRS. See ## https://debbugs.gnu.org/cgi/bugreport.cgi?bug=21352 ACLOCAL_AMFLAGS = -I build-config/m4 -I build-config/common/m4 include build-config/common/Makefile.inc.am include doc/Makefile.inc.am include build-config/common/platforms.am ## Still, sometimes there are files that must be distributed, but which are not ## covered in the automatic rules. These files should be listed in the ## EXTRA_DIST variable. You can mention files from subdirectories in EXTRA_DIST. ## ## You can also mention a directory in EXTRA_DIST. In this case the entire ## directory will be recursively copied into the distribution. Please note that ## this will also copy everything in the directory, including CVS/RCS version ## control files. We recommend against using this feature. EXTRA_DIST += $(srcdir)/src/config.h \ $(srcdir)/src/config-custom.h \ $(srcdir)/test/replacePaths_c.awk \ $(srcdir)/test/replacePaths_f77.awk \ $(srcdir)/test/replacePaths_f90.awk \ $(srcdir)/doc/example/openmp/example.c \ $(srcdir)/doc/example/openmp/example.f90 \ $(srcdir)/doc/example/pomp/example.c \ $(srcdir)/doc/example/pomp/example.f90 \ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in \ $(srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in \ $(srcdir)/test/data \ $(srcdir)/THANKS \ $(srcdir)/OPEN_ISSUES if ! CROSS_BUILD EXTRA_DIST += $(srcdir)/build-frontend/configure.ac \ $(srcdir)/build-frontend/aclocal.m4 \ $(srcdir)/build-frontend/Makefile.am \ $(srcdir)/build-frontend/Makefile.in \ $(srcdir)/build-frontend/configure \ $(srcdir)/src/config-frontend.h.in endif doc_DATA = $(srcdir)/OPEN_ISSUES \ $(srcdir)/ChangeLog CLEANFILES += doc/doxygen-user/main.dox .PHONY: doc/doxygen-user/main.dox if GIT_CONTROLLED doc/doxygen-user/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ doc/doxygen-user/main_user_usage.dox \ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ doc/doxygen-user/main_user_linking.dox \ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ > doc/doxygen-user/main.dox ## The developer documentation is compiled of the user documentation ## and additional information for developers doc/doxygen-dev/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox $(AM_V_GEN)$(MKDIR_P) doc/doxygen-dev && \ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ $(srcdir)/doc/doxygen-dev/main_dev.dox.in \ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ doc/doxygen-user/main_user_usage.dox \ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ doc/doxygen-user/main_user_linking.dox \ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ $(srcdir)/doc/doxygen-dev/main_dev_parser.dox.in \ $(srcdir)/doc/doxygen-dev/main_dev_new-paradigm.dox.in \ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ > doc/doxygen-dev/main.dox doc/doxygen-user/main_user_usage.dox: $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ cat $(srcdir)/doc/doxygen-user/main_user_usage.dox.in \ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ $(srcdir)/doc/doxygen-user/main_user_usage-end.dox.in \ > doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox: $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ ( \ cat $(srcdir)/doc/doxygen-user/main_user_linking.dox.in \ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in; \ echo "\endverbatim"; \ ) > doc/doxygen-user/main_user_linking.dox else doc/doxygen-user/main.dox: # touch doc/doxygen-user/main.dox doc/doxygen-dev/main.dox: # touch doc/doxygen-dev/main.dox endif doxygen-dev: doc/doxygen-dev/main.dox $(MKDIR_P) doxygen-dev-doc/opari2/tags $(DOXYGEN) doc/doxygen-dev.cfg dist-hook: doc/doxygen-user/main.dox doxygen-user-generate $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2_usage.h $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2-config_usage.h clean-local: doxygen-user-clean rm -rf test/tmp uninstall-hook: doxygen-uninstall common-uninstall libexec_SCRIPTS = build-frontend/pomp2-parse-init-regions.awk # non-color automake only provides $(am__tty_colors) if tests are in use TESTS = opari2-2.0.9/PaxHeaders/Makefile.in0000644000000000000000000000013214770056740014053 xustar0030 mtime=1742757344.283507949 30 atime=1742757366.663371539 30 ctime=1742757366.935369882 opari2-2.0.9/Makefile.in0000644000175100001440000021171014770056740014405 0ustar00builderusers# Makefile.in generated by automake 1.13.4 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ ############################################################################### # Create platform entries for EXTRA_DIST using e.g.: # cd build-config/common/platforms # for i in *; do echo " \$(srcdir)/build-config/common/platforms/$i \\"; done VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } DIST_COMMON = $(srcdir)/build-config/common/Makefile.inc.am \ $(srcdir)/doc/Makefile.inc.am \ $(srcdir)/build-config/common/platforms.am \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(top_srcdir)/doc/doxygen-user/doxygen-user.cfg.in \ $(top_srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in \ $(top_srcdir)/build-config/common/config-common.h \ $(top_srcdir)/test/c_test.sh.in \ $(top_srcdir)/test/cxx_test.sh.in \ $(top_srcdir)/test/f90_test.sh.in \ $(top_srcdir)/test/f77_test.sh.in \ $(top_srcdir)/test/awk_script_test.sh.in \ $(top_srcdir)/test/data/awk_script_test.out.in \ $(top_srcdir)/src/opari-lib-dummy/pomp2_parse_init_regions.awk.in \ $(top_srcdir)/build-config/test-driver AUTHORS COPYING \ ChangeLog INSTALL README THANKS build-config/config.guess \ build-config/config.sub build-config/install-sh \ build-config/missing $(top_srcdir)/build-config/config.guess \ $(top_srcdir)/build-config/config.sub \ $(top_srcdir)/build-config/install-sh \ $(top_srcdir)/build-config/missing @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@am__append_1 = beautify-recursive @GIT_CONTROLLED_TRUE@am__append_2 = doc/doxygen-project-number.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@am__append_3 = doc/doxygen-user-html.cfg doc/doxygen-user-at-make-time.cfg doxygen.err @CROSS_BUILD_FALSE@am__append_4 = $(srcdir)/build-frontend/configure.ac \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/aclocal.m4 \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/Makefile.am \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/Makefile.in \ @CROSS_BUILD_FALSE@ $(srcdir)/build-frontend/configure \ @CROSS_BUILD_FALSE@ $(srcdir)/src/config-frontend.h.in TESTS = subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/build-config/common/m4/ac_common_package.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_doxygen.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_git_controlled.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_sys_detection.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_toplevel_args.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_uncrustify.m4 \ $(top_srcdir)/build-config/common/m4/ac_scorep_version_and_revision.m4 \ $(top_srcdir)/build-config/common/m4/afs_compiler_backend.m4 \ $(top_srcdir)/build-config/common/m4/afs_maintainer_mode.m4 \ $(top_srcdir)/build-config/common/m4/afs_summary.m4 \ $(top_srcdir)/build-config/common/m4/ax_config_subdir.m4 \ $(top_srcdir)/build-config/m4/opari2_compiler_and_flags.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = doc/doxygen-user.cfg doc/doxygen-dev.cfg \ src/config-common.h test/c_test.sh test/cxx_test.sh \ test/f90_test.sh test/f77_test.sh test/awk_script_test.sh \ test/awk_script_test.output \ build-frontend/pomp2-parse-init-regions.awk CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(docdir)" SCRIPTS = $(libexec_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @$(am__tty_colors); echo " GEN $${mgn}$@$$std"; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(doc_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope check recheck distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = .test am__test_logs1 = $(TESTS:=.log) TEST_LOGS = $(am__test_logs1:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-config/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AFS_PACKAGE_NAME = @AFS_PACKAGE_NAME@ AFS_PACKAGE_name = @AFS_PACKAGE_name@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DOXYGEN = @DOXYGEN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBRARY_AGE = @LIBRARY_AGE@ LIBRARY_CURRENT = @LIBRARY_CURRENT@ LIBRARY_REVISION = @LIBRARY_REVISION@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OPARI2_AWK = @OPARI2_AWK@ PACKAGE = @PACKAGE@ PACKAGE_BUGFIX = @PACKAGE_BUGFIX@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_MAJOR = @PACKAGE_MAJOR@ PACKAGE_MINOR = @PACKAGE_MINOR@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_SUFFIX = @PACKAGE_SUFFIX@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_scorep_doxygen_distdir = @ac_scorep_doxygen_distdir@ ac_scorep_have_uncrustify = @ac_scorep_have_uncrustify@ afs_srcdir = @afs_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ ax_config_subdirs = @ax_config_subdirs@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ has_CC = @has_CC@ has_cc = @has_cc@ has_ftn = @has_ftn@ have_dot = @have_dot@ have_doxygen_latex = @have_doxygen_latex@ have_makeindex = @have_makeindex@ have_pdflatex = @have_pdflatex@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = $(subdirs) $(ax_config_subdirs) ACLOCAL_AMFLAGS = -I build-config/m4 -I build-config/common/m4 # Testing framework EXTRA_DIST = $(srcdir)/build-config/common/generate-config-backend-for-frontend.sh \ $(srcdir)/build-config/common/generate-library-version.sh \ $(srcdir)/build-config/common/generate-package-version.sh \ $(srcdir)/build-config/common/library_data.hpp \ $(srcdir)/common/utils/test/cutest/CuTest.c \ $(srcdir)/common/utils/test/cutest/CuTest.h \ $(srcdir)/common/utils/test/cutest/license.txt \ $(srcdir)/common/utils/test/cutest/README.txt \ $(srcdir)/build-config/common/process_arguments.awk \ $(srcdir)/build-config/common/platforms/compiler-frontend-gcc \ $(srcdir)/build-config/common/platforms/compiler-frontend-ibm \ $(srcdir)/build-config/common/platforms/compiler-frontend-intel \ $(srcdir)/build-config/common/platforms/compiler-frontend-oneapi \ $(srcdir)/build-config/common/platforms/compiler-frontend-pgi \ $(srcdir)/build-config/common/platforms/compiler-frontend-nvhpc \ $(srcdir)/build-config/common/platforms/compiler-frontend-clang \ $(srcdir)/build-config/common/platforms/compiler-frontend-aocc \ $(srcdir)/build-config/common/platforms/compiler-frontend-amdclang \ $(srcdir)/build-config/common/platforms/compiler-frontend-cray \ $(srcdir)/build-config/common/platforms/compiler-mpi-bullxmpi \ $(srcdir)/build-config/common/platforms/compiler-mpi-hp \ $(srcdir)/build-config/common/platforms/compiler-mpi-ibmpoe \ $(srcdir)/build-config/common/platforms/compiler-mpi-intel \ $(srcdir)/build-config/common/platforms/compiler-mpi-intel2 \ $(srcdir)/build-config/common/platforms/compiler-mpi-intel3 \ $(srcdir)/build-config/common/platforms/compiler-mpi-intelpoe \ $(srcdir)/build-config/common/platforms/compiler-mpi-lam \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpibull2 \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich2 \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich3 \ $(srcdir)/build-config/common/platforms/compiler-mpi-mpich4 \ $(srcdir)/build-config/common/platforms/compiler-mpi-openmpi \ $(srcdir)/build-config/common/platforms/compiler-mpi-openmpi3 \ $(srcdir)/build-config/common/platforms/compiler-mpi-platform \ $(srcdir)/build-config/common/platforms/compiler-mpi-scali \ $(srcdir)/build-config/common/platforms/compiler-mpi-sgimpt \ $(srcdir)/build-config/common/platforms/compiler-mpi-sgimptwrapper \ $(srcdir)/build-config/common/platforms/compiler-mpi-spectrum \ $(srcdir)/build-config/common/platforms/compiler-mpi-sun \ $(srcdir)/build-config/common/platforms/compiler-mpi-cray \ $(srcdir)/build-config/common/platforms/compiler-mpi-without \ $(srcdir)/build-config/common/platforms/compiler-shmem-openmpi \ $(srcdir)/build-config/common/platforms/compiler-shmem-openmpi3 \ $(srcdir)/build-config/common/platforms/compiler-shmem-openshmem \ $(srcdir)/build-config/common/platforms/compiler-shmem-sgimpt \ $(srcdir)/build-config/common/platforms/compiler-shmem-sgimptwrapper \ $(srcdir)/build-config/common/platforms/compiler-shmem-spectrum \ $(srcdir)/build-config/common/platforms/compiler-shmem-cray \ $(srcdir)/build-config/common/platforms/compiler-shmem-without \ $(srcdir)/build-config/common/platforms/compiler-nocross-gcc \ $(srcdir)/build-config/common/platforms/compiler-nocross-ibm \ $(srcdir)/build-config/common/platforms/compiler-nocross-intel \ $(srcdir)/build-config/common/platforms/compiler-nocross-oneapi \ $(srcdir)/build-config/common/platforms/compiler-nocross-pgi \ $(srcdir)/build-config/common/platforms/compiler-nocross-nvhpc \ $(srcdir)/build-config/common/platforms/compiler-nocross-clang \ $(srcdir)/build-config/common/platforms/compiler-nocross-aocc \ $(srcdir)/build-config/common/platforms/compiler-nocross-amdclang \ $(srcdir)/build-config/common/platforms/compiler-nocross-cray \ $(srcdir)/build-config/common/platforms/platform-backend-altix \ $(srcdir)/build-config/common/platforms/platform-backend-bgl \ $(srcdir)/build-config/common/platforms/platform-backend-bgp \ $(srcdir)/build-config/common/platforms/platform-backend-bgq \ $(srcdir)/build-config/common/platforms/platform-backend-crayxt \ $(srcdir)/build-config/common/platforms/platform-backend-crayxe \ $(srcdir)/build-config/common/platforms/platform-backend-crayxk \ $(srcdir)/build-config/common/platforms/platform-backend-crayxc \ $(srcdir)/build-config/common/platforms/platform-backend-craygeneric \ $(srcdir)/build-config/common/platforms/platform-backend-aix \ $(srcdir)/build-config/common/platforms/platform-backend-linux \ $(srcdir)/build-config/common/platforms/platform-backend-mac \ $(srcdir)/build-config/common/platforms/platform-backend-mic \ $(srcdir)/build-config/common/platforms/platform-backend-mingw \ $(srcdir)/build-config/common/platforms/platform-backend-solaris \ $(srcdir)/build-config/common/platforms/platform-backend-k \ $(srcdir)/build-config/common/platforms/platform-backend-fx10 \ $(srcdir)/build-config/common/platforms/platform-backend-fx100 \ $(srcdir)/build-config/common/platforms/platform-backend-user-provided \ $(srcdir)/build-config/common/platforms/platform-frontend-altix \ $(srcdir)/build-config/common/platforms/platform-frontend-bgl \ $(srcdir)/build-config/common/platforms/platform-frontend-bgp \ $(srcdir)/build-config/common/platforms/platform-frontend-bgq \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxt \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxe \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxk \ $(srcdir)/build-config/common/platforms/platform-frontend-crayxc \ $(srcdir)/build-config/common/platforms/platform-frontend-craygeneric \ $(srcdir)/build-config/common/platforms/platform-frontend-aix \ $(srcdir)/build-config/common/platforms/platform-frontend-linux \ $(srcdir)/build-config/common/platforms/platform-frontend-mac \ $(srcdir)/build-config/common/platforms/platform-frontend-mic \ $(srcdir)/build-config/common/platforms/platform-frontend-mingw \ $(srcdir)/build-config/common/platforms/platform-frontend-solaris \ $(srcdir)/build-config/common/platforms/platform-frontend-k \ $(srcdir)/build-config/common/platforms/platform-frontend-fx10 \ $(srcdir)/build-config/common/platforms/platform-frontend-fx100 \ $(srcdir)/build-config/common/platforms/platform-frontend-user-provided \ $(srcdir)/build-config/common/platforms/platform-mpi-altix \ $(srcdir)/build-config/common/platforms/platform-mpi-bgl \ $(srcdir)/build-config/common/platforms/platform-mpi-bgp \ $(srcdir)/build-config/common/platforms/platform-mpi-bgq \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxt \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxe \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxk \ $(srcdir)/build-config/common/platforms/platform-mpi-crayxc \ $(srcdir)/build-config/common/platforms/platform-mpi-craygeneric \ $(srcdir)/build-config/common/platforms/platform-mpi-aix \ $(srcdir)/build-config/common/platforms/platform-mpi-linux \ $(srcdir)/build-config/common/platforms/platform-mpi-mac \ $(srcdir)/build-config/common/platforms/platform-mpi-mic \ $(srcdir)/build-config/common/platforms/platform-mpi-solaris \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxk \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxe \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxt \ $(srcdir)/build-config/common/platforms/platform-shmem-crayxc \ $(srcdir)/build-config/common/platforms/platform-shmem-craygeneric \ $(srcdir)/build-config/common/platforms/platform-shmem-user-provided \ $(srcdir)/build-config/common/platforms/platform-mpi-k \ $(srcdir)/build-config/common/platforms/platform-mpi-fx10 \ $(srcdir)/build-config/common/platforms/platform-mpi-fx100 \ $(srcdir)/build-config/common/platforms/platform-mpi-user-provided \ $(srcdir)/src/config.h $(srcdir)/src/config-custom.h \ $(srcdir)/test/replacePaths_c.awk \ $(srcdir)/test/replacePaths_f77.awk \ $(srcdir)/test/replacePaths_f90.awk \ $(srcdir)/doc/example/openmp/example.c \ $(srcdir)/doc/example/openmp/example.f90 \ $(srcdir)/doc/example/pomp/example.c \ $(srcdir)/doc/example/pomp/example.f90 \ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in \ $(srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in \ $(srcdir)/test/data $(srcdir)/THANKS $(srcdir)/OPEN_ISSUES \ $(am__append_4) BUILT_SOURCES = CLEANFILES = $(am__append_2) $(am__append_3) \ $(builddir)/user_provided_configure_args \ $(builddir)/mpi_compiler_suite \ $(builddir)/mpi_compiler_suite_to_source \ doc/doxygen-user/main.dox DISTCLEANFILES = $(builddir)/config.summary \ $(builddir)/@PACKAGE@.summary CONFIG_STATUS_DEPENDENCIES = $(srcdir)/build-config/VERSION CONFIGURE_DEPENDENCIES = $(srcdir)/build-config/VERSION SCOREP_RECURSIVE_TARGETS = $(am__append_1) check-build-recursive DOC_SRC_DIR = $(srcdir)/doc @GIT_CONTROLLED_TRUE@USER_DOC_DIR = $(top_distdir)$(ac_scorep_doxygen_distdir)/doc @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@OPARI2_V_DOXYGEN = $(opari2__v_DOXYGEN_@AM_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DOXYGEN_ = $(opari2__v_DOXYGEN_@AM_DEFAULT_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DOXYGEN_0 = @$(am__tty_colors); echo " DOXYGEN $${blu}$@$$std"; @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DOXYGEN_1 = @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@OPARI2_V_DEVNULL = $(opari2__v_DEVNULL_@AM_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DEVNULL_ = $(opari2__v_DEVNULL_@AM_DEFAULT_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DEVNULL_0 = >/dev/null 2>&1 @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@opari2__v_DEVNULL_1 = @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@OPARI2_V_pdflatex = $(opari2__v_pdflatex_@AM_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@opari2__v_pdflatex_ = $(opari2__v_pdflatex_@AM_DEFAULT_V@) @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@opari2__v_pdflatex_0 = -interaction batchmode @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@opari2__v_pdflatex_1 = -interaction nonstopmode doc_DATA = $(srcdir)/OPEN_ISSUES \ $(srcdir)/ChangeLog libexec_SCRIPTS = build-frontend/pomp2-parse-init-regions.awk all: $(BUILT_SOURCES) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .log .test .trs am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/build-config/common/Makefile.inc.am $(srcdir)/doc/Makefile.inc.am $(srcdir)/build-config/common/platforms.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ if $(AM_V_P); then echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; fi; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ if $(AM_V_P); then echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; fi; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ if $(AM_V_P); then echo ' $(SHELL) ./config.status'; fi; \ $(SHELL) ./config.status;; \ *) \ if $(AM_V_P); then echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; fi; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(srcdir)/build-config/common/Makefile.inc.am $(srcdir)/doc/Makefile.inc.am $(srcdir)/build-config/common/platforms.am: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(AM_V_at)$(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(AM_V_at)$(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(AM_V_at)$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): doc/doxygen-user.cfg: $(top_builddir)/config.status $(top_srcdir)/doc/doxygen-user/doxygen-user.cfg.in cd $(top_builddir) && $(SHELL) ./config.status $@ doc/doxygen-dev.cfg: $(top_builddir)/config.status $(top_srcdir)/doc/doxygen-dev/doxygen-dev.cfg.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/config-common.h: $(top_builddir)/config.status $(top_srcdir)/build-config/common/config-common.h cd $(top_builddir) && $(SHELL) ./config.status $@ test/c_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/c_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/cxx_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/cxx_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/f90_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/f90_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/f77_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/f77_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/awk_script_test.sh: $(top_builddir)/config.status $(top_srcdir)/test/awk_script_test.sh.in cd $(top_builddir) && $(SHELL) ./config.status $@ test/awk_script_test.output: $(top_builddir)/config.status $(top_srcdir)/test/data/awk_script_test.out.in cd $(top_builddir) && $(SHELL) ./config.status $@ build-frontend/pomp2-parse-init-regions.awk: $(top_builddir)/config.status $(top_srcdir)/src/opari-lib-dummy/pomp2_parse_init_regions.awk.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-libexecSCRIPTS: $(libexec_SCRIPTS) @$(NORMAL_INSTALL) @$(am__tty_colors); \ list='$(libexec_SCRIPTS)'; test -n "$(libexecdir)" || list=; \ if test -n "$$list"; then \ if $(AM_V_P); then echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ else echo " MKDIR $${mgn}$(DESTDIR)$(libexecdir)$$std"; fi; \ $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { for p in $$files; do \ $(am__strip_dir) \ if $(AM_V_P); then echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \ else echo " INSTALL $${grn}$(DESTDIR)$(libexecdir)$$dir/$$f$$std"; fi; \ $(INSTALL_SCRIPT) $$p "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ done; } \ ; done uninstall-libexecSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(libexec_SCRIPTS)'; test -n "$(libexecdir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(libexecdir)'; $(am__uninstall_files_from_dir) install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @$(am__tty_colors); \ list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ if $(AM_V_P); then echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ else echo " MKDIR $${mgn}$(DESTDIR)$(docdir)$$std"; fi; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ $(am__strip_dir) \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if $(AM_V_P); then echo " $(INSTALL_DATA) $$d$$p '$(DESTDIR)$(docdir)'"; \ else echo " INSTALL $${blu}$(DESTDIR)$(docdir)/$$f$$std"; fi; \ $(INSTALL_DATA) $$d$$p "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ if $(AM_V_P); then echo "Making $$target in $$subdir"; fi; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ else \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(DISTFILES) $(AM_V_at)$(am__remove_distdir) $(AM_V_at)test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ if $(AM_V_P); then \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ fi; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -$(AM_V_at)test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz"; \ else echo " DIST $${grn}$(distdir).tar.gz$$std"; fi; \ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(AM_V_at)$(am__post_remove_distdir) dist-bzip2: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2"; \ else echo " DIST $${grn}$(distdir).tar.bz2$$std"; fi; \ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(AM_V_at)$(am__post_remove_distdir) dist-lzip: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz"; \ else echo " DIST $${grn}$(distdir).tar.lz$$std"; fi; \ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(AM_V_at)$(am__post_remove_distdir) dist-xz: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz"; \ else echo " DIST $${grn}$(distdir).tar.xz$$std"; fi; \ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(AM_V_at)$(am__post_remove_distdir) dist-tarZ: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z"; \ else echo " DIST $${grn}$(distdir).tar.Z$$std"; fi; \ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(AM_V_at)$(am__post_remove_distdir) dist-shar: distdir @$(am__tty_colors); \ if $(AM_V_P); then echo "shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz"; \ else echo " DIST $${grn}$(distdir).shar.gz$$std"; fi; \ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(AM_V_at)$(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip @$(am__tty_colors); \ if $(AM_V_P); then echo "zip -rq $(distdir).zip '$(distdir)'"; \ else echo " DIST $${grn}$(distdir).zip$$std"; fi; \ zip -rq $(distdir).zip $(distdir) $(AM_V_at)$(am__post_remove_distdir) dist dist-all: $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir=':' $(AM_V_at)$(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(AM_V_at)$(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) check-TESTS check: $(BUILT_SOURCES) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(SCRIPTS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(AM_V_at)if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-docDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libexecSCRIPTS install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-docDATA uninstall-libexecSCRIPTS @$(NORMAL_INSTALL) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: $(am__recursive_targets) all check check-am install install-am \ install-strip uninstall-am .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-TESTS check-am clean clean-cscope \ clean-generic clean-local cscope cscopelist-am ctags ctags-am \ dist dist-all dist-bzip2 dist-gzip dist-hook dist-lzip \ dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-generic distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-docDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libexecSCRIPTS install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am uninstall-docDATA uninstall-hook \ uninstall-libexecSCRIPTS common-uninstall: rm -rf $(DESTDIR)$(datadir)/@PACKAGE@ ############################################################################### @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@beautify-sp: @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@ @$(am__cd) $(srcdir) && ./common/beautifier/beautify @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@beautify: beautify-recursive @GIT_CONTROLLED_TRUE@@HAVE_UNCRUSTIFY_TRUE@beautify-clean: ############################################################################### ############################################################################### check-build-sp: $(BUILT_SOURCES) all-am $(check_PROGRAMS) $(check_LTLIBRARIES) check-build: check-build-recursive ############################################################################### $(SCOREP_RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-sp"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-sp" || exit 1; \ fi; test -z "$$fail" ############################################################################### @GIT_CONTROLLED_TRUE@append-to-citation-cff: @GIT_CONTROLLED_TRUE@ @echo "commit: $$(cat $(distdir)/build-config/REVISION)" >> $(distdir)/CITATION.cff @GIT_CONTROLLED_TRUE@ @echo "date-released: $$(date +%Y-%m-%d)" >> $(distdir)/CITATION.cff @GIT_CONTROLLED_TRUE@ @echo "version: $$($(srcdir)/build-config/common/generate-package-version.sh $(distdir)/build-config/VERSION)" >> $(distdir)/CITATION.cff @GIT_CONTROLLED_FALSE@append-to-citation-cff: doxygen-uninstall: rm -rf $(DESTDIR)$(docdir) @GIT_CONTROLLED_TRUE@doxygen-user-install: @GIT_CONTROLLED_TRUE@doxygen-user-generate: doxygen-user-pdf doxygen-user-html-compress copy-revision-file-to-dist @GIT_CONTROLLED_TRUE@update-revision: @GIT_CONTROLLED_TRUE@ @$(am__tty_colors); \ @GIT_CONTROLLED_TRUE@ if $(AM_V_P); then echo "cd $(srcdir) && git describe --always --dirty > 'build-config/REVISION'"; \ @GIT_CONTROLLED_TRUE@ else echo " GEN $${mgn}$(srcdir)/build-config/REVISION$$std"; fi; \ @GIT_CONTROLLED_TRUE@ cd $(srcdir) && git describe --always --dirty > "build-config/REVISION" @GIT_CONTROLLED_TRUE@copy-revision-file-to-dist: @GIT_CONTROLLED_TRUE@ @$(MKDIR_P) "$(distdir)/build-config/" @GIT_CONTROLLED_TRUE@ @cp -p "$(srcdir)/build-config/REVISION" "$(distdir)/build-config/" @GIT_CONTROLLED_TRUE@ @case `cat "$(distdir)/build-config/REVISION"` in *-dirty) \ @GIT_CONTROLLED_TRUE@ echo >&2 "WARNING: distribution does not match a single, unmodified revision.";; \ @GIT_CONTROLLED_TRUE@ esac @GIT_CONTROLLED_TRUE@doxygen-user-html-compress: @GIT_CONTROLLED_TRUE@ $(AM_V_at)if test -d "$(USER_DOC_DIR)/html"; then \ @GIT_CONTROLLED_TRUE@ cd "$(USER_DOC_DIR)"; tar czf html.tar.gz html; rm -rf html/; \ @GIT_CONTROLLED_TRUE@ fi @GIT_CONTROLLED_TRUE@doxygen-project-number: update-revision @GIT_CONTROLLED_TRUE@ $(AM_V_at)echo "PROJECT_NUMBER = \"@PACKAGE_VERSION@ (revision `cat $(srcdir)/build-config/REVISION`)\"" > doc/doxygen-project-number.cfg @GIT_CONTROLLED_TRUE@doxygen-user-clean: @GIT_CONTROLLED_TRUE@ rm -rf $(USER_DOC_DIR)/* @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@doxygen-user: doxygen-project-number doc/doxygen-user/main.dox doc/doxygen-user.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/tags" @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)echo "OUTPUT_DIRECTORY = $(USER_DOC_DIR)" > doc/doxygen-user-at-make-time.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)echo "GENERATE_TAGFILE = $(USER_DOC_DIR)/tags/@PACKAGE@.tag" >> doc/doxygen-user-at-make-time.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)cat doc/doxygen-project-number.cfg doc/doxygen-user-at-make-time.cfg doc/doxygen-user.cfg > doc/doxygen-user-html.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/html" @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)cp $(abs_srcdir)/doc/images/* $(USER_DOC_DIR)/html @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ else echo "QUIET = YES"; fi >>doc/doxygen-user-html.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_TRUE@ $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-html.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_FALSE@doxygen-user: @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_FALSE@ echo "WARNING: doxygen not available. Cannot generate documentation." >&2 @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@doxygen-user-pdf: doxygen-user @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)cat doc/doxygen-user-html.cfg > doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)echo "ENABLED_SECTIONS = LATEX" >> doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)echo "GENERATE_HTML = NO" >> doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)cp $(DOC_SRC_DIR)/license.tex $(USER_DOC_DIR)/pdf/ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ -$(AM_V_at)cp $(DOC_SRC_DIR)/images/project_logo.pdf $(USER_DOC_DIR)/pdf/ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)echo "LATEX_CMD_NAME = \"pdflatex -file-line-error $(OPARI2_V_pdflatex)\"" >>doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ else echo "QUIET = YES"; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ echo "MAKEINDEX_CMD_NAME = \"makeindex -q\""; \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ fi >>doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-pdf.cfg @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ $(AM_V_at)cd "$(USER_DOC_DIR)/pdf" && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ make $(OPARI2_V_DEVNULL) && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ mv refman.pdf ../ && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ rm -f * && \ @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_TRUE@ mv ../refman.pdf @PACKAGE@.pdf @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_FALSE@doxygen-user-pdf: doxygen-user @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_FALSE@ echo "WARNING: pdflatex not available. Cannot generate doxygen pdf documentation." >&2 @GIT_CONTROLLED_TRUE@@HAVE_DOXYGEN_LATEX_FALSE@ if test -d "$(USER_DOC_DIR)/pdf"; then rm -rf "$(USER_DOC_DIR)/pdf"; fi @GIT_CONTROLLED_FALSE@doxygen-user-clean: @GIT_CONTROLLED_FALSE@doxygen-user-generate: @GIT_CONTROLLED_FALSE@doxygen-user-pdf: @GIT_CONTROLLED_FALSE@doxygen-user-install: @GIT_CONTROLLED_FALSE@ $(AM_V_at)if test -f "$(DOC_SRC_DIR)/html.tar.gz"; then \ @GIT_CONTROLLED_FALSE@ $(MKDIR_P) $(DESTDIR)$(docdir); \ @GIT_CONTROLLED_FALSE@ $(INSTALL_DATA) $(DOC_SRC_DIR)/html.tar.gz $(DESTDIR)$(docdir)/html.tar.gz; \ @GIT_CONTROLLED_FALSE@ cd $(DESTDIR)$(docdir); \ @GIT_CONTROLLED_FALSE@ tar xzf html.tar.gz; \ @GIT_CONTROLLED_FALSE@ rm -f html.tar.gz; \ @GIT_CONTROLLED_FALSE@ fi @GIT_CONTROLLED_FALSE@ $(AM_V_at)if test -d "$(DOC_SRC_DIR)"; then \ @GIT_CONTROLLED_FALSE@ cd $(DOC_SRC_DIR); \ @GIT_CONTROLLED_FALSE@ dirs="pdf tags"; \ @GIT_CONTROLLED_FALSE@ cd -; \ @GIT_CONTROLLED_FALSE@ for i in $$dirs; do \ @GIT_CONTROLLED_FALSE@ if test -d "$(DOC_SRC_DIR)/$$i"; then \ @GIT_CONTROLLED_FALSE@ $(MKDIR_P) $(DESTDIR)$(docdir)/$$i; \ @GIT_CONTROLLED_FALSE@ cd $(DOC_SRC_DIR)/$$i; \ @GIT_CONTROLLED_FALSE@ files=`find . -type f`; \ @GIT_CONTROLLED_FALSE@ cd -; \ @GIT_CONTROLLED_FALSE@ for j in $$files; do \ @GIT_CONTROLLED_FALSE@ $(INSTALL_DATA) $(DOC_SRC_DIR)/$$i/$$j $(DESTDIR)$(docdir)/$$i/$$j; \ @GIT_CONTROLLED_FALSE@ done; \ @GIT_CONTROLLED_FALSE@ fi; \ @GIT_CONTROLLED_FALSE@ done; \ @GIT_CONTROLLED_FALSE@ fi @GIT_CONTROLLED_FALSE@copy-revision-file-to-dist: ############################################################################### .PHONY: doc/doxygen-user/main.dox @GIT_CONTROLLED_TRUE@doc/doxygen-user/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_usage.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_linking.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ @GIT_CONTROLLED_TRUE@ > doc/doxygen-user/main.dox @GIT_CONTROLLED_TRUE@doc/doxygen-dev/main.dox: doc/doxygen-user/main_user_usage.dox doc/doxygen-user/main_user_linking.dox @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-dev && \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_introduction.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-dev/main_dev.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_summary.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_install.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_usage.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_ctc-decoding.dox.in \ @GIT_CONTROLLED_TRUE@ doc/doxygen-user/main_user_linking.dox \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_pomp-instrumentation.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_example.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_news.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-dev/main_dev_parser.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-dev/main_dev_new-paradigm.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_finalization.dox.in \ @GIT_CONTROLLED_TRUE@ > doc/doxygen-dev/main.dox @GIT_CONTROLLED_TRUE@doc/doxygen-user/main_user_usage.dox: @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_usage.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/opari2_usage.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/main_user_usage-end.dox.in \ @GIT_CONTROLLED_TRUE@ > doc/doxygen-user/main_user_usage.dox @GIT_CONTROLLED_TRUE@doc/doxygen-user/main_user_linking.dox: @GIT_CONTROLLED_TRUE@ $(AM_V_GEN)$(MKDIR_P) doc/doxygen-user && \ @GIT_CONTROLLED_TRUE@ ( \ @GIT_CONTROLLED_TRUE@ cat $(srcdir)/doc/doxygen-user/main_user_linking.dox.in \ @GIT_CONTROLLED_TRUE@ $(srcdir)/doc/doxygen-user/opari2-config_usage.dox.in; \ @GIT_CONTROLLED_TRUE@ echo "\endverbatim"; \ @GIT_CONTROLLED_TRUE@ ) > doc/doxygen-user/main_user_linking.dox @GIT_CONTROLLED_FALSE@doc/doxygen-user/main.dox: # touch doc/doxygen-user/main.dox @GIT_CONTROLLED_FALSE@doc/doxygen-dev/main.dox: # touch doc/doxygen-dev/main.dox doxygen-dev: doc/doxygen-dev/main.dox $(MKDIR_P) doxygen-dev-doc/opari2/tags $(DOXYGEN) doc/doxygen-dev.cfg dist-hook: doc/doxygen-user/main.dox doxygen-user-generate $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2_usage.h $(AM_V_at)rm -f $(top_distdir)/build-frontend/opari2-config_usage.h clean-local: doxygen-user-clean rm -rf test/tmp uninstall-hook: doxygen-uninstall common-uninstall # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: opari2-2.0.9/PaxHeaders/test0000644000000000000000000000013214770056767012721 xustar0030 mtime=1742757367.307367613 30 atime=1742757371.935339406 30 ctime=1742757367.307367613 opari2-2.0.9/test/0000755000175100001440000000000014770056767013326 5ustar00builderusersopari2-2.0.9/test/PaxHeaders/jacobi_f77_test.sh.in0000644000000000000000000000013114770056734016701 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.307367613 opari2-2.0.9/test/jacobi_f77_test.sh.in0000644000175100001440000000422414770056734017234 0ustar00builderusers#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CC="@CC@" F77="@F77@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" FFLAGS="@FFLAGS@" OPENMP="@OPENMP_FFLAGS@" rm -rf $test_dir/jacobi/F77 mkdir -p $test_dir/jacobi/F77 cp -r $test_data_dir/jacobi/F77/jacobi.f $test_dir/jacobi/F77 cp -r $test_data_dir/jacobi/F77/main.f $test_dir/jacobi/F77 cd $test_dir/jacobi/F77 #make instrument $OPARI2 main.f $OPARI2 jacobi.f #make compile $F77 -I$INCDIR $OPENMP $FFLAGS -c jacobi.mod.F $F77 -I$INCDIR $OPENMP $FFLAGS -c main.mod.F #make build @NM@ jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script`> pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $F77 $OPENMP $FFLAGS pomp_init_file.o jacobi.mod.o main.mod.o $LDFLAGS -o jacobi$EXEEXT #make run OMP_NUM_THREADS=4 ./jacobi$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/F77/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F77/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F77/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F77/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F77/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.9/test/PaxHeaders/jacobi_f90_test.sh.in0000644000000000000000000000013114770056734016674 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.303367638 opari2-2.0.9/test/jacobi_f90_test.sh.in0000644000175100001440000000465514770056734017237 0ustar00builderusers#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CC="@CC@" FC="@FC@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" FCFLAGS="@FCFLAGS@" OPENMP="@OPENMP_FCFLAGS@" rm -rf $test_dir/jacobi/F mkdir -p $test_dir/jacobi/F cp -r $test_data_dir/jacobi/F/jacobi.F90 $test_dir/jacobi/F cp -r $test_data_dir/jacobi/F/main.F90 $test_dir/jacobi/F cp -r $test_data_dir/jacobi/F/VariableDef.f90 $test_dir/jacobi/F #cp @srcdir@/../src/opari-lib-dummy/pomp_lib.h $test_dir/jacobi/F/ #cp @srcdir@/../src/opari-lib-dummy/opari_omp.h $test_dir/jacobi/F/ cd $test_dir/jacobi/F #make instrument $OPARI2 main.F90 $OPARI2 jacobi.F90 $OPARI2 VariableDef.f90 #make compile $FC -I$INCDIR $OPENMP $FCFLAGS -c VariableDef.mod.F90 $FC -I$INCDIR $OPENMP $FCFLAGS -c jacobi.mod.F90 $FC -I$INCDIR $OPENMP $FCFLAGS -c main.mod.F90 #make build @NM@ jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script`> pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $FC $OPENMP $FCFLAGS pomp_init_file.o jacobi.mod.o main.mod.o VariableDef.mod.o $LDFLAGS -o jacobi$EXEEXT #make run OMP_NUM_THREADS=4 ./jacobi$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/F/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/F/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/F/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.9/test/PaxHeaders/jacobi_c++_test.sh.in0000644000000000000000000000013114770056734016646 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.303367638 opari2-2.0.9/test/jacobi_c++_test.sh.in0000644000175100001440000000455614770056734017211 0ustar00builderusers#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CXX="@CXX@" CC="@CC@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" OPENMP="@OPENMP_CXXFLAGS@" CXXFLAGS="@CXXFLAGS@" rm -rf $test_dir/jacobi/C++ mkdir -p $test_dir/jacobi/C++ mkdir -p $test_dir/jacobi/C++/opari2 cp -r $test_data_dir/jacobi/C++/jacobi.cpp $test_dir/jacobi/C++/ cp -r $test_data_dir/jacobi/C++/jacobi.h $test_dir/jacobi/C++/ cp -r $test_data_dir/jacobi/C++/main.cpp $test_dir/jacobi/C++/ cp @abs_srcdir@/../include/opari2/pomp2_lib.h $test_dir/jacobi/C++/opari2/ cd $test_dir/jacobi/C++ #make instrument $OPARI2 main.cpp $OPARI2 jacobi.cpp #make compile $CXX -I$INCDIR $OPENMP $CXXFLAGS -c main.mod.cpp $CXX -I$INCDIR $OPENMP $CXXFLAGS -c jacobi.mod.cpp #make build @NM@ jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script` > pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $CXX $OPENMP $CXXFLAGS pomp_init_file.o jacobi.mod.o main.mod.o $LDFLAGS -o jacobi.$EXEEXT #make run OMP_NUM_THREADS=4 ./jacobi.$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/C++/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C++/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C++/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C++/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C++/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.9/test/PaxHeaders/jacobi_c_test.sh.in0000644000000000000000000000013114770056734016520 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.303367638 opari2-2.0.9/test/jacobi_c_test.sh.in0000644000175100001440000000445614770056734017062 0ustar00builderusers#!/bin/sh set -e opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data CC="@CC@" INCDIR=. OPARI2=@abs_builddir@/../build-frontend/opari2 OPARI2_CONFIG="@abs_builddir@/../build-frontend/opari2-config --build-check" LDFLAGS="-lm -L@abs_builddir@/../build-frontend/.libs -lpomp" OPENMP="@OPENMP_CFLAGS@" CFLAGS="@CFLAGS@" NM="`$OPARI2_CONFIG --nm`" rm -rf $test_dir/jacobi/C mkdir -p $test_dir/jacobi/C mkdir -p $test_dir/jacobi/C/opari2 cp -r $test_data_dir/jacobi/C/jacobi.c $test_dir/jacobi/C/ cp -r $test_data_dir/jacobi/C/jacobi.h $test_dir/jacobi/C/ cp -r $test_data_dir/jacobi/C/main.c $test_dir/jacobi/C/ cp @abs_srcdir@/../include/opari2/pomp2_lib.h $test_dir/jacobi/C/opari2 cd $test_dir/jacobi/C # instrument $OPARI2 main.c $OPARI2 jacobi.c # compile $CC -I$INCDIR $OPENMP $CFLAGS -c main.mod.c $CC -I$INCDIR $OPENMP $CFLAGS -c jacobi.mod.c #build $NM jacobi.mod.o main.mod.o | `$OPARI2_CONFIG --awk-script`> pomp_init_file.c $CC -I$INCDIR -c pomp_init_file.c $CC $OPENMP $CFLAGS pomp_init_file.o jacobi.mod.o main.mod.o $LDFLAGS -o jacobi$EXEEXT #run OMP_NUM_THREADS=4 ./jacobi$EXEEXT 2>jacobi_test.out grep 0: jacobi_test.out > jacobi_test_0 grep 1: jacobi_test.out > jacobi_test_1 grep 2: jacobi_test.out > jacobi_test_2 grep 3: jacobi_test.out > jacobi_test_3 if diff $test_data_dir/jacobi/C/jacobi_test_0.out jacobi_test_0 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_0.out jacobi_test_0 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C/jacobi_test_1.out jacobi_test_1 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_1.out jacobi_test_1 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C/jacobi_test_2.out jacobi_test_2 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_2.out jacobi_test_2 cd $opari_dir exit fi if diff $test_data_dir/jacobi/C/jacobi_test_3.out jacobi_test_3 > /dev/null then true else echo "-------- ERROR: in program output --------" diff $test_data_dir/jacobi/C/jacobi_test_3.out jacobi_test_3 cd $opari_dir exit fi cd $opari_dir opari2-2.0.9/test/PaxHeaders/Makefile.inc.am0000644000000000000000000000013214770056734015574 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.275367809 opari2-2.0.9/test/Makefile.inc.am0000644000175100001440000000243514770056734016130 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # RWTH Aachen University, Germany # # Copyright (c) 2009-2011, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # # Copyright (c) 2009-2011, # Technische Universitaet Dresden, Germany # # Copyright (c) 2009-2011, # University of Oregon, Eugene, USA # # Copyright (c) 2009-2011, 2021, # Forschungszentrum Juelich GmbH, Germany # # Copyright (c) 2009-2011, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # # Copyright (c) 2009-2011, # Technische Universitaet Muenchen, Germany # # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. ## -*- mode: makefile -*- #check_PROGRAMS += TESTS += $(SRC_ROOT)test/c_test.sh TESTS += $(SRC_ROOT)test/cxx_test.sh TESTS += $(SRC_ROOT)test/f90_test.sh TESTS += $(SRC_ROOT)test/f77_test.sh TESTS += $(SRC_ROOT)test/awk_script_test.sh if HAVE_OPENMP_SUPPORT TESTS += $(SRC_ROOT)test/jacobi_c_test.sh TESTS += $(SRC_ROOT)test/jacobi_c++_test.sh if FORTRAN_SUPPORT_ALLOCATABLE if SCOREP_HAVE_FC TESTS += $(SRC_ROOT)test/jacobi_f90_test.sh endif if SCOREP_HAVE_F77 TESTS += $(SRC_ROOT)test/jacobi_f77_test.sh endif endif endif opari2-2.0.9/test/PaxHeaders/replacePaths_f90.awk0000644000000000000000000000013214770056734016565 xustar0030 mtime=1742757340.123533305 30 atime=1742757340.171533013 30 ctime=1742757367.175368418 opari2-2.0.9/test/replacePaths_f90.awk0000755000175100001440000000503414770056734017122 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. { if(match($0,"sscl=")){ line = " " for(i = 1; i <= NF; i++){ source = $i if(match($i,"\"//&")){ # ^\"")){ # opari2 splits the ctc-string into multiple lines, for # comparison to reference data we put this into one line while(match(source, "\"//&")){ # this is nasty, by getting a new line, we have to reset # the record counter i to 1 so we don't miss the closing # bracket at the end of the last line getline i = 1 sub(" \"", "", $1) source = source $1 sub("\"//&\"", "", source) } #remove full path gsub("escl=([^/]*/)*","escl=",source) gsub("sscl=([^/]*/)*","sscl=",source) #remove old length sub("\"[0-9a-z]*","\"", source) #insert new length sub("\"", "\""length(source)-2, source) line = line " " source } else{ line = line " " $i } } print line } else if(match($0,"Init_reg")){ #remove the timestamp based region identifier gsub("Init_reg_[0-9a-z_]+","Init_reg_000",$0) print $0 } else if(match($0,"#line")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } # else if(match($0,"get_max_threads")){ #remove timestamp based function specifier # gsub("pomp_get_max_threads[0-9a-z_]*", "pomp_get_max_threads000", $0) # print $0 # } else if(match($0,"/cb")){ #remove timestamp based common block identifier gsub("cb[0-9a-z_]*", "cb000", $0) print $0 } else if(match($0,"LEN=")){ gsub("LEN=[0-9a-z]*", "LEN=999", $0) print $0 } else{ print $0 } } opari2-2.0.9/test/PaxHeaders/replacePaths_f77.awk0000644000000000000000000000013114770056734016571 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.175368418 opari2-2.0.9/test/replacePaths_f77.awk0000755000175100001440000000571114770056734017131 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. { if(match($0,"sscl=")){ line = " " for(i = 1; i <= NF; i++){ source = $i if(match($i,"\"//")){ # opari2 splits the ctc-string into multiple lines, for # comparison to reference data we put this into one line while(match(source, "\"//")){ # this is nasty, by getting a new line, we have to reset # the record counter i to 1 so we don't miss the closing # bracket at the end of the last line getline i = 1 sub(" \"", "", $1) source = source $1 sub("\"//&\"", "", source) } # remove full path gsub("escl=([^/]*/)*","escl=",source) gsub("sscl=([^/]*/)*","sscl=",source) # remove old length sub("\"[0-9a-z]*","\"", source) # insert new length sub("\"", "\""length(source)-2, source) line = line " " source } else{ line = line " " $i } } # now for fortran77 we split the line again while(length(line) > 66){ subline = substr(line, 1, 66) print subline"\"//" line = " &\"" substr(line, 67) } print line # splitindex = match(line,"Type=")+5 # print "splitindex=" splitindex "for " line # lineRepl = substr(line, 0, splintindex-1) "\"//\n &\"" substr(line, splitindex) # line = lineRepl # print lineRepl } else if(match($0,"Init_reg")){ #remove the timestamp based region identifier gsub("Init_reg_[0-9a-z_]+","Init_reg_000",$0) print $0 } else if(match($0,"#line")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } # else if(match($0,"get_max_threads")){ #remove timestamp based function specifier # gsub("pomp_get_max_threads[0-9a-z_]*", "pomp_get_max_threads000", $0) # print $0 # } else if(match($0,"/cb")){ #remove timestamp based common block identifier gsub("cb[0-9a-z_]*", "cb000", $0) print $0 } else if(match($0,"CHARACTER*")){ gsub("CHARACTER\\*[0-9a-z]*", "CHARACTER*999", $0) print $0 } else{ print $0 } } opari2-2.0.9/test/PaxHeaders/replacePaths_c.awk0000644000000000000000000000013114770056734016410 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.171368443 opari2-2.0.9/test/replacePaths_c.awk0000755000175100001440000000303514770056734016745 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. { if(match($0,"sscl=")){ line = " " for(i = 1; i <= NF; i++){ if(match($i,"^\"")){ #remove full path gsub("escl=([^/]*/)*","escl=",$i) gsub("sscl=([^/]*/)*","sscl=",$i) #remove old length sub("\"[0-9a-z]*","\"", $i) #insert new length sub("\"", "\""length($i)-1, $i) } line = line " " $i } print line } else if(match($0,"Init_reg")){ #remove the timestamp based region identifier gsub("Init_reg_[0-9a-z_]+","Init_reg_000",$0) print $0 } else if(match($0,"#line")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } else if(match($0,"#include") && match($0,"opari.inc")){ #remove the path from the line numbering gsub("/([^/]*/)*","",$0) print $0 } else{ print $0 } } opari2-2.0.9/test/PaxHeaders/awk_script_test.sh.in0000644000000000000000000000013214770056734017136 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757366.971369662 opari2-2.0.9/test/awk_script_test.sh.in0000644000175100001440000000100114770056734017456 0ustar00builderusers#!/bin/sh set -e test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data AWK_SCRIPT="@abs_builddir@/../build-frontend/pomp2-parse-init-regions.awk" $AWK_SCRIPT < $test_data_dir/awk_script_test.input > $test_dir/awk_script.out if diff $test_dir/../awk_script_test.output $test_dir/awk_script.out > /dev/null then true else echo "-------- ERROR: in awk script output --------" diff $test_dir/../awk_script_test.output $test_dir/awk_script.out cd $opari_dir exit fi opari2-2.0.9/test/PaxHeaders/f77_test.sh.in0000644000000000000000000000013114770056734015372 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757366.971369662 opari2-2.0.9/test/f77_test.sh.in0000755000175100001440000000606214770056734015732 0ustar00builderusers#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ cp $test_data_dir/test*.f $test_dir/ if [ ! -f $test_dir/replacePaths_f77.awk ]; then cp $test_data_dir/../replacePaths_f77.awk $test_dir/ fi cd $test_dir for file in test*.f do base=`basename $file .f` if [ -n "`echo $file | grep free`" ] then echo " $file ..." $opari_dir/opari2 --free-form $file || exit bases=$base elif [ -n "`echo $file | grep disable`" ] then for disable_construct in atomic critical flush locks master ordered single sync task all do echo " $file testing --disable=omp:"$disable_construct" ..." $opari_dir/opari2 --disable=omp:$disable_construct $file $base.$disable_construct.mod.F || exit mv $base.f.opari.inc $base.$disable_construct.f.opari.inc bases=$bases" "$base.$disable_construct done echo " $file testing --disable=omp ..." $opari_dir/opari2 --disable=omp $file $base.omp.mod.F || exit mv $base.f.opari.inc $base.omp.f.opari.inc bases=$bases" "$base.omp elif [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file $base.mod.F || exit bases=$bases" "$base else echo " $file ..." $opari_dir/opari2 $file || exit bases=$base fi for base in $bases do # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_f77.awk $base.mod.F > $base.mod.F.tmp` `mv $base.mod.F.tmp $base.mod.F` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_f77.awk $base.f.opari.inc > $base.f.opari.inc.tmp` `mv $base.f.opari.inc.tmp $base.f.opari.inc` if diff -u $test_data_dir/$base.f.out $base.mod.F > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.f.out $base.mod.F error="true" continue fi if diff -u $test_data_dir/$base.f.opari.inc.out $base.f.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.f.opari.inc.out $base.f.opari.inc error="true" continue fi done done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.9/test/PaxHeaders/f90_test.sh.in0000644000000000000000000000013114770056734015365 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757366.967369686 opari2-2.0.9/test/f90_test.sh.in0000755000175100001440000000434114770056734015723 0ustar00builderusers#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ cp $test_data_dir/test*.f90 $test_dir/ if [ ! -f $test_dir/replacePaths_f90.awk ]; then cp $test_data_dir/../replacePaths_f90.awk $test_dir/ fi cd $test_dir for file in test*.f90 do base=`basename $file .f90` if [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file $base.mod.F90 || exit else echo " $file ..." $opari_dir/opari2 --omp-task-untied=keep,no-warn $file || exit fi # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_f90.awk $base.mod.F90 > $base.mod.F90.tmp` `mv $base.mod.F90.tmp $base.mod.F90` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_f90.awk $base.f90.opari.inc > $base.f90.opari.inc.tmp` `mv $base.f90.opari.inc.tmp $base.f90.opari.inc` if diff -u $test_data_dir/$base.f90.out $base.mod.F90 > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.f90.out $base.mod.F90 error="true" continue fi if diff -u $test_data_dir/$base.f90.opari.inc.out $base.f90.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.f90.opari.inc.out $base.f90.opari.inc error="true" continue fi done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.9/test/PaxHeaders/cxx_test.sh.in0000644000000000000000000000013214770056734015572 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757366.967369686 opari2-2.0.9/test/cxx_test.sh.in0000644000175100001440000000534014770056734016124 0ustar00builderusers#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # RWTH Aachen University, Germany # # Copyright (c) 2009-2011, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # # Copyright (c) 2009-2011, # Technische Universitaet Dresden, Germany # # Copyright (c) 2009-2011, # University of Oregon, Eugene, USA # # Copyright (c) 2009-2011, 2021, # Forschungszentrum Juelich GmbH, Germany # # Copyright (c) 2009-2011, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # # Copyright (c) 2009-2011, # Technische Universitaet Muenchen, Germany # # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ #echo $test_data_dir #echo $test_dir cp $test_data_dir/test*.cpp $test_dir/ if [ ! -f $test_dir/replacePaths_c.awk ]; then cp $test_data_dir/../replacePaths_c.awk $test_dir/ fi cd $test_dir for file in `ls *.cpp | grep -v mod` do base=`basename $file .cpp` if [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file || exit elif [ -n "`echo $file | grep prep`" ] then echo " $file testing --preprocessed ..." $opari_dir/opari2 --preprocessed $file || exit elif [ -n "`echo $file | grep remove-task`" ] then echo " $file testing --omp-task=remove ..." $opari_dir/opari2 --omp-task=remove --omp-task-untied=no-warn $file || exit else echo " $file ..." $opari_dir/opari2 --omp-task-untied=keep,no-warn $file || exit fi # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_c.awk $base.mod.cpp > $base.mod.cpp.tmp` `mv $base.mod.cpp.tmp $base.mod.cpp` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_c.awk $base.cpp.opari.inc > $base.cpp.opari.inc.tmp` `mv $base.cpp.opari.inc.tmp $base.cpp.opari.inc` if diff -u $test_data_dir/$base.cpp.out $base.mod.cpp > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.cpp.out $base.mod.cpp error="true" continue fi if diff -u $test_data_dir/$base.cpp.opari.inc.out $base.cpp.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.cpp.opari.inc.out $base.cpp.opari.inc error="true" continue fi done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.9/test/PaxHeaders/c_test.sh.in0000644000000000000000000000013214770056734015212 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757366.963369711 opari2-2.0.9/test/c_test.sh.in0000644000175100001440000000474414770056734015553 0ustar00builderusers#!/bin/sh # This file is part of the Score-P software (http://www.score-p.org) # # Copyright (c) 2009-2011, # * RWTH Aachen University, Germany # * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # * Technische Universitaet Dresden, Germany # * University of Oregon, Eugene, USA # * Forschungszentrum Juelich GmbH, Germany # * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # * Technische Universitaet Muenchen, Germany # # See the COPYING file in the package base directory for details. opari_dir=`pwd` test_dir="../test/tmp" mkdir -p ${test_dir} test_data_dir=@abs_srcdir@/data sed=@SED@ awk=@AWK@ #echo $test_data_dir #echo $test_dir cp $test_data_dir/test*.c $test_dir/ if [ ! -f $test_dir/replacePaths_c.awk ]; then cp $test_data_dir/../replacePaths_c.awk $test_dir/ fi cd $test_dir for file in `ls *.c | grep -v mod` do base=`basename $file .c` if [ -n "`echo $file | grep tpd`" ] then echo " $file testing --omp-tpd ..." $opari_dir/opari2 --omp-tpd $file || exit elif [ -n "`echo $file | grep prep`" ] then echo " $file testing --preprocessed ..." $opari_dir/opari2 --preprocessed $file || exit elif [ -n "`echo $file | grep remove-task`" ] then echo " $file testing --omp-task=remove ..." $opari_dir/opari2 --omp-task=remove --omp-task-untied=no-warn $file || exit else echo " $file ..." $opari_dir/opari2 --omp-task-untied=keep,no-warn $file || exit fi # Replace the full path in the line numbering # in the source files `$awk -f replacePaths_c.awk $base.mod.c > $base.mod.c.tmp` `mv $base.mod.c.tmp $base.mod.c` # Replace the full paths and unify timestamp based region identifiers # in the include files `$awk -f replacePaths_c.awk $base.c.opari.inc > $base.c.opari.inc.tmp` `mv $base.c.opari.inc.tmp $base.c.opari.inc` if diff -u $test_data_dir/$base.c.out $base.mod.c > /dev/null then true else echo "-------- ERROR: unexpected change in transformed program --------" diff -u $test_data_dir/$base.c.out $base.mod.c error="true" continue fi if diff -u $test_data_dir/$base.c.opari.inc.out $base.c.opari.inc > /dev/null then true else echo "-------- ERROR: unexpected change in opari include file --------" diff -u $test_data_dir/$base.c.opari.inc.out $base.c.opari.inc error="true" continue fi done cd $opari_dir if [ "$error" = "true" ] then exit -1 fi opari2-2.0.9/test/PaxHeaders/data0000644000000000000000000000013114770056734013623 xustar0029 mtime=1742757340.11953333 30 atime=1742757371.935339406 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/0000755000175100001440000000000014770056734014231 5ustar00builderusersopari2-2.0.9/test/data/PaxHeaders/test9.f90.out0000644000000000000000000000013114770056734016076 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test9.f90.out0000644000175100001440000000050514770056734016427 0ustar00builderusers #line 1 "test9.f90" PROGRAM PROGRAM include 'test9.f90.opari.inc' #line 3 "test9.f90" CALL SUBROUTINE END PROGRAM SUBROUTINE SUBROUTINE include 'test9.f90.opari.inc' #line 9 "test9.f90" CHARACTER(len=32), PARAMETER :: FUNCTION = 'Check whether OPARI2 is broken' PRINT*, FUNCTION END SUBROUTINE opari2-2.0.9/test/data/PaxHeaders/test9.f90.opari.inc.out0000644000000000000000000000013114770056734017757 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test9.f90.opari.inc.out0000644000175100001440000000024714770056734020313 0ustar00builderusers integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock opari2-2.0.9/test/data/PaxHeaders/test9.f900000644000000000000000000000013114770056734015270 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test9.f900000644000175100001440000000030014770056734015612 0ustar00builderusersPROGRAM PROGRAM CALL SUBROUTINE END PROGRAM SUBROUTINE SUBROUTINE CHARACTER(len=32), PARAMETER :: FUNCTION = 'Check whether OPARI2 is broken' PRINT*, FUNCTION END SUBROUTINE opari2-2.0.9/test/data/PaxHeaders/test9.c.out0000644000000000000000000000013114770056734015722 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test9.c.out0000644000175100001440000001207614770056734016261 0ustar00builderusers#include "test9.c.opari.inc" #line 1 "test9.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * @brief Tests proper treatment of offload regions. */ __declspec( target( mic ) ) int global_1 = 5; __declspec( target( mic ) ) int bar(); __declspec( target( mic ) ) int foo() { int i = 0; #pragma omp parallel { i++; } return ++global_1; } __attribute__( ( target( mic ) ) ) int global_2 = 0; __attribute__( ( target( mic ) ) ) int f() { int i = 0; { POMP2_Atomic_enter( &opari2_region_1, opari2_ctc_1 ); #line 35 "test9.c" #pragma omp atomic global_2 += 1; POMP2_Atomic_exit( &opari2_region_1 ); } #line 37 "test9.c" } __attribute__( ( target( mic ) ) ) void g(); #pragma offload_attribute( push, target( mic ) ) void test(); #pragma offload_attribute( pop ) void test() { int i; { POMP2_Sections_enter( &opari2_region_2, opari2_ctc_2 ); #line 51 "test9.c" #pragma omp sections nowait { i++; #line 54 "test9.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 55 "test9.c" i++; POMP2_Section_end( &opari2_region_2 ); } #line 56 "test9.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 57 "test9.c" i++; POMP2_Section_end( &opari2_region_2 ); } #line 58 "test9.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_2 ); } #line 59 "test9.c" } int main( int argc, char** argv ) { int i, j, k; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_3, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_3 ); #line 67 "test9.c" #pragma omp parallel POMP2_DLIST_00003 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_3 ); { POMP2_For_enter( &opari2_region_3, opari2_ctc_3 ); #line 67 "test9.c" #pragma omp for nowait for ( i = 0; i < 10; i++ ) { j++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_3, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_3, pomp2_old_task ); } POMP2_For_exit( &opari2_region_3 ); } POMP2_Parallel_end( &opari2_region_3 ); } POMP2_Parallel_join( &opari2_region_3, pomp2_old_task ); } #line 72 "test9.c" #pragma offload target( mic ) in( global ) out( i, global ) { i = foo(); #pragma omp for for ( j = 0; j < 10; j++ ) { k ++; } } #pragma offload target( mic ) in( global ) out( i, global ) { i = bar(); } #pragma offload_attribute( push, target( mic ) ) { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_4, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_4 ); #line 90 "test9.c" #pragma omp parallel POMP2_DLIST_00004 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_4 ); #line 91 "test9.c" { i = f(); g(); test(); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_4, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_4, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_4 ); } POMP2_Parallel_join( &opari2_region_4, pomp2_old_task ); } #line 96 "test9.c" #pragma offload_attribute( pop ) { POMP2_Task_handle pomp2_old_task; POMP2_Barrier_enter( &opari2_region_5, &pomp2_old_task, opari2_ctc_5 ); #line 100 "test9.c" #pragma omp barrier POMP2_Barrier_exit( &opari2_region_5, pomp2_old_task ); } #line 101 "test9.c" printf( "Hello world!\n" ); return 0; } int bar() { { POMP2_Single_enter( &opari2_region_6, opari2_ctc_6 ); #line 109 "test9.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_6 ); #line 110 "test9.c" global_1++; POMP2_Single_end( &opari2_region_6 ); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_6, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_6, pomp2_old_task ); } POMP2_Single_exit( &opari2_region_6 ); } #line 111 "test9.c" return global_1; } void g() { #line 117 "test9.c" #pragma omp master { POMP2_Master_begin( &opari2_region_7, opari2_ctc_7 ); #line 118 "test9.c" global_2 = 0; POMP2_Master_end( &opari2_region_7 ); } #line 119 "test9.c" } opari2-2.0.9/test/data/PaxHeaders/test9.c.opari.inc.out0000644000000000000000000000013114770056734017603 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test9.c.opari.inc.out0000644000175100001440000000313414770056734020135 0ustar00builderusers#include static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "59*regionType=atomic*sscl=test9.c:35:35*escl=test9.c:36:36**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "75*regionType=sections*sscl=test9.c:51:51*escl=test9.c:58:58*numSections=2**" #define POMP2_DLIST_00003 shared(opari2_region_3) static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "64*regionType=parallelfor*sscl=test9.c:67:67*escl=test9.c:71:71**" #define POMP2_DLIST_00004 shared(opari2_region_4) static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "61*regionType=parallel*sscl=test9.c:90:90*escl=test9.c:95:95**" static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "64*regionType=barrier*sscl=test9.c:100:100*escl=test9.c:100:100**" static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "63*regionType=single*sscl=test9.c:109:109*escl=test9.c:110:110**" static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "63*regionType=master*sscl=test9.c:117:117*escl=test9.c:118:118**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); } opari2-2.0.9/test/data/PaxHeaders/test9.c0000644000000000000000000000013114770056734015114 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test9.c0000644000175100001440000000357014770056734015452 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * @brief Tests proper treatment of offload regions. */ __declspec( target( mic ) ) int global_1 = 5; __declspec( target( mic ) ) int bar(); __declspec( target( mic ) ) int foo() { int i = 0; #pragma omp parallel { i++; } return ++global_1; } __attribute__( ( target( mic ) ) ) int global_2 = 0; __attribute__( ( target( mic ) ) ) int f() { int i = 0; #pragma omp atomic global_2 += 1; } __attribute__( ( target( mic ) ) ) void g(); #pragma offload_attribute( push, target( mic ) ) void test(); #pragma offload_attribute( pop ) void test() { int i; #pragma omp sections { i++; #pragma omp section i++; #pragma omp section i++; } } int main( int argc, char** argv ) { int i, j, k; #pragma omp parallel for for ( i = 0; i < 10; i++ ) { j++; } #pragma offload target( mic ) in( global ) out( i, global ) { i = foo(); #pragma omp for for ( j = 0; j < 10; j++ ) { k ++; } } #pragma offload target( mic ) in( global ) out( i, global ) { i = bar(); } #pragma offload_attribute( push, target( mic ) ) #pragma omp parallel { i = f(); g(); test(); } #pragma offload_attribute( pop ) #pragma omp barrier printf( "Hello world!\n" ); return 0; } int bar() { #pragma omp single global_1++; return global_1; } void g() { #pragma omp master global_2 = 0; } opari2-2.0.9/test/data/PaxHeaders/test8.f90.out0000644000000000000000000000013114770056734016075 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test8.f90.out0000644000175100001440000002407614770056734016437 0ustar00builderusers #line 1 "test8.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 include 'test8.f90.opari.inc' #line 20 "test8.f90" integer i integer k integer num_threads integer, save :: j #line 25 "test8.f90" !$omp threadprivate(j) pomp2_num_threads = 4 pomp2_if = ( k.eq.0 ) call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 27 "test8.f90" !$omp parallel reduction(+:k) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 28 "test8.f90" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 30 "test8.f90" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo #line 35 "test8.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 36 "test8.f90" call POMP2_Sections_enter(opari2_region_3, & opari2_ctc_3 ) #line 37 "test8.f90" !$omp sections reduction(+:k) #line 38 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 39 "test8.f90" write(*,*) "section 1" call POMP2_Section_end(opari2_region_3) #line 40 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 41 "test8.f90" write(*,*) "section 2" call POMP2_Section_end(opari2_region_3) #line 42 "test8.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Sections_exit(opari2_region_3) #line 43 "test8.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 44 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 45 "test8.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 46 "test8.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 47 "test8.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Untied_task_create_begin(opari2_region_5, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_5 ) end if #line 47 "test8.f90" !$omp task untied if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Untied_task_begin(opari2_region_5, pomp2_new_task) end if #line 48 "test8.f90" write(*,*) "task" if (pomp2_if) then call POMP2_Untied_task_end(opari2_region_5) end if #line 49 "test8.f90" !$omp end task if (pomp2_if) then call POMP2_Untied_task_create_end(opari2_region_5, pomp2_old_task) end if #line 50 "test8.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 50 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 51 "test8.f90" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_6,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_6 ) #line 52 "test8.f90" !$omp parallel reduction(+:k) default(private) shared(i,k) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) & !$omp shared(/cb000/) & !$omp private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) call POMP2_Do_enter(opari2_region_6, & opari2_ctc_6 ) #line 52 "test8.f90" !$omp do schedule(static,chunkif) collapse(1) ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_7, & opari2_ctc_7 ) #line 54 "test8.f90" !$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test8.f90" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_7) #line 56 "test8.f90" !$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test8.f90" k = k + 1 enddo #line 59 "test8.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, pomp2_old_task) call POMP2_Do_exit(opari2_region_6) call POMP2_Parallel_end(opari2_region_6) #line 59 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_6, pomp2_old_task) #line 60 "test8.f90" pomp2_num_threads = 4 pomp2_if = ( (i+k)>5 ) call POMP2_Parallel_fork(opari2_region_8,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_8 ) #line 61 "test8.f90" !$omp parallel reduction(+:k) default(none) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) & !$omp shared(/cb000/) & !$omp private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) call POMP2_Sections_enter(opari2_region_8) #line 61 "test8.f90" !$omp sections #line 62 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_8, & opari2_ctc_8 ) #line 63 "test8.f90" write(*,*) "section 1" call POMP2_Section_end(opari2_region_8) #line 64 "test8.f90" !$omp section call POMP2_Section_begin(opari2_region_8, & opari2_ctc_8 ) #line 65 "test8.f90" write(*,*) "section 2" call POMP2_Section_end(opari2_region_8) #line 66 "test8.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_8,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, pomp2_old_task) call POMP2_Sections_exit(opari2_region_8) call POMP2_Parallel_end(opari2_region_8) #line 66 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, pomp2_old_task) #line 67 "test8.f90" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_9,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_9 ) #line 68 "test8.f90" !$omp parallel reduction(+:k) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) call POMP2_Workshare_enter(opari2_region_9, & opari2_ctc_9 ) #line 68 "test8.f90" !$omp workshare write(*,*) "workshare" #line 70 "test8.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_9,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_9) call POMP2_Parallel_end(opari2_region_9) #line 70 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, pomp2_old_task) #line 71 "test8.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_10 ) #line 72 "test8.f90" !$omp parallel shared(num_threads) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) #line 73 "test8.f90" write(*,*) num_threads call POMP2_Implicit_barrier_enter(opari2_region_10,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, pomp2_old_task) call POMP2_Parallel_end(opari2_region_10) #line 74 "test8.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, pomp2_old_task) #line 75 "test8.f90" end program test8 subroutine POMP2_Init_reg_000() include 'test8.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) end opari2-2.0.9/test/data/PaxHeaders/test8.f90.opari.inc.out0000644000000000000000000000013114770056734017756 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test8.f90.opari.inc.out0000644000175100001440000000534014770056734020311 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "104*regionType=parallel*sscl=test8.f90:27:27*escl=test8.f90:44:44*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "109*regionType=do*sscl=test8.f90:30:30*escl=test8.f90:35:35*hasCollapse=1*hasReduction=1*hasSchedule=dynamic,5**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "93*regionType=sections*sscl=test8.f90:37:37*escl=test8.f90:42:42*numSections=2*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "64*regionType=parallel*sscl=test8.f90:46:46*escl=test8.f90:50:50**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "72*regionType=task*sscl=test8.f90:47:47*escl=test8.f90:49:49*hasUntied=1**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "191*regionType=paralleldo*sscl=test8.f90:52:52*escl=test8.f90:59:59*hasCollapse=1*hasDefault=private*hasIf=1*hasNum_threads=1*hasOrdered=1*hasReduction=1*hasSchedule=static,chunkif*hasShared=1**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "63*regionType=ordered*sscl=test8.f90:54:54*escl=test8.f90:56:56**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "128*regionType=parallelsections*sscl=test8.f90:61:61*escl=test8.f90:66:66*hasDefault=none*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "113*regionType=parallelworkshare*sscl=test8.f90:68:68*escl=test8.f90:70:70*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "76*regionType=parallel*sscl=test8.f90:72:72*escl=test8.f90:74:74*hasShared=1**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test8.f900000644000000000000000000000013114770056734015267 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test8.f900000644000175100001440000000364614770056734015631 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 integer i integer k integer num_threads integer, save :: j !$omp threadprivate(j) !$omp parallel if(k.eq.0) num_threads(4) reduction(+:k) write(*,*) "parallel" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo !$omp end do !$omp sections reduction(+:k) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp end parallel !$omp parallel !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel !$omp parallel do num_threads(4) reduction(+:k) schedule(static,chunkif) collapse(1) ordered if(.true.) default(private) shared(i,k) do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered k = k + 1 enddo !$omp end parallel do !$omp parallel sections if((i+k)>5) num_threads(4) reduction(+:k) default(none) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end parallel sections !$omp parallel workshare if(.true.) num_threads(4) reduction(+:k) write(*,*) "workshare" !$omp end parallel workshare !$omp parallel shared(num_threads) write(*,*) num_threads !$omp end parallel end program test8 opari2-2.0.9/test/data/PaxHeaders/test8.f.out0000644000000000000000000000013114770056734015724 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test8.f.out0000644000175100001440000002203514770056734016257 0ustar00builderusers #line 1 "test8.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 include 'test8.f.opari.inc' #line 20 "test8.f" integer i integer k integer, save :: j #line 24 "test8.f" !$omp threadprivate(j) pomp2_num_threads = 4 pomp2_if = ( k.eq.0 ) call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test8.f" !$omp parallel reduction(+:k) !$omp& default(private) shared(i,k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) !$omp& shared(/cb000/) !$omp& private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 28 "test8.f" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 30 "test8.f" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo #line 35 "test8.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 36 "test8.f" call POMP2_Sections_enter(opari2_region_3, &opari2_ctc_3 ) #line 37 "test8.f" !$omp sections reduction(+:k) #line 38 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 39 "test8.f" write(*,*) "section 1" call POMP2_Section_end(opari2_region_3) #line 40 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 41 "test8.f" write(*,*) "section 2" call POMP2_Section_end(opari2_region_3) #line 42 "test8.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_3, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_3) #line 43 "test8.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 44 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 45 "test8.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 46 "test8.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 47 "test8.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_5, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_5 ) end if #line 47 "test8.f" !$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_5, pomp2_new_task) end if #line 48 "test8.f" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_5) end if #line 49 "test8.f" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_5, &pomp2_old_task) end if #line 50 "test8.f" call POMP2_Implicit_barrier_enter(opari2_region_4, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 50 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 51 "test8.f" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_6, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_6 ) #line 52 "test8.f" !$omp parallel reduction(+:k) !$omp+ default(none) shared(i,k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) !$omp& shared(/cb000/) !$omp& private(pomp2_if,pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test8.f" !$omp do !$omp+ schedule(static,chunkif) collapse(1) ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 56 "test8.f" !$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 57 "test8.f" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_7) #line 58 "test8.f" !$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 59 "test8.f" k = k + 1 enddo #line 61 "test8.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) call POMP2_Parallel_end(opari2_region_6) #line 61 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_6, &pomp2_old_task) #line 62 "test8.f" pomp2_num_threads = 4 pomp2_if = ( (i+k)>5 ) call POMP2_Parallel_fork(opari2_region_8, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_8 ) #line 63 "test8.f" !$omp parallel reduction(+:k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) call POMP2_Sections_enter(opari2_region_8) #line 63 "test8.f" !$omp sections #line 64 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_8, &opari2_ctc_8 ) #line 65 "test8.f" write(*,*) "section 1" call POMP2_Section_end(opari2_region_8) #line 66 "test8.f" !$omp section call POMP2_Section_begin(opari2_region_8, &opari2_ctc_8 ) #line 67 "test8.f" write(*,*) "section 2" call POMP2_Section_end(opari2_region_8) #line 68 "test8.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_8) call POMP2_Parallel_end(opari2_region_8) #line 68 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, &pomp2_old_task) #line 69 "test8.f" pomp2_num_threads = 4 pomp2_if = ( .true. ) call POMP2_Parallel_fork(opari2_region_9, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_9 ) #line 70 "test8.f" !$omp parallel reduction(+:k) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) call POMP2_Workshare_enter(opari2_region_9, &opari2_ctc_9 ) #line 70 "test8.f" !$omp workshare write(*,*) "workshare" #line 72 "test8.f" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_9, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, &pomp2_old_task) call POMP2_Workshare_exit(opari2_region_9) call POMP2_Parallel_end(opari2_region_9) #line 72 "test8.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, &pomp2_old_task) #line 73 "test8.f" end program test2 subroutine POMP2_Init_reg_000() include 'test8.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.9/test/data/PaxHeaders/test8.f.opari.inc.out0000644000000000000000000000013114770056734017605 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test8.f.opari.inc.out0000644000175100001440000000513614770056734020143 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"133*regionType=parallel*sscl=test8.f:26:27*escl=test8.f:44:"// &"44*hasDefault=private*hasIf=1*hasNum_threads=1*hasReduction"// &"=1*hasShared=1**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"107*regionType=do*sscl=test8.f:30:30*escl=test8.f:35:35*has"// &"Collapse=1*hasReduction=1*hasSchedule=dynamic,5**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"91*regionType=sections*sscl=test8.f:37:37*escl=test8.f:42:4"// &"2*numSections=2*hasReduction=1**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"62*regionType=parallel*sscl=test8.f:46:46*escl=test8.f:50:5"// &"0**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"70*regionType=task*sscl=test8.f:47:47*escl=test8.f:49:49*ha"// &"sUntied=1**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"186*regionType=paralleldo*sscl=test8.f:52:54*escl=test8.f:6"// &"1:61*hasCollapse=1*hasDefault=none*hasIf=1*hasNum_threads=1"// &"*hasOrdered=1*hasReduction=1*hasSchedule=static,chunkif*has"// &"Shared=1**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"61*regionType=ordered*sscl=test8.f:56:56*escl=test8.f:58:58"// &"**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"110*regionType=parallelsections*sscl=test8.f:63:63*escl=tes"// &"t8.f:68:68*hasIf=1*hasNum_threads=1*hasReduction=1**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"111*regionType=parallelworkshare*sscl=test8.f:70:70*escl=te"// &"st8.f:72:72*hasIf=1*hasNum_threads=1*hasReduction=1**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test8.f0000644000000000000000000000013114770056734015116 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test8.f0000644000175100001440000000357614770056734015462 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests whether specific clauses are found and inserted into the CTC string. program test8 integer i integer k integer, save :: j !$omp threadprivate(j) !$omp parallel if(k.eq.0) num_threads(4) reduction(+:k) !$omp& default(private) shared(i,k) write(*,*) "parallel" !$omp do reduction(+:k) schedule(dynamic, 5) collapse(1) do i=1,4 write(*,*) "do",i k = k + 1 enddo !$omp end do !$omp sections reduction(+:k) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp end parallel !$omp parallel !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel !$omp parallel do num_threads(4) reduction(+:k) !$omp+ schedule(static,chunkif) collapse(1) ordered if(.true.) !$omp+ default(none) shared(i,k) do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered k = k + 1 enddo !$omp end parallel do !$omp parallel sections if((i+k)>5) num_threads(4) reduction(+:k) !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end parallel sections !$omp parallel workshare if(.true.) num_threads(4) reduction(+:k) write(*,*) "workshare" !$omp end parallel workshare end program test2 opari2-2.0.9/test/data/PaxHeaders/test8.c.out0000644000000000000000000000013114770056734015721 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test8.c.out0000644000175100001440000001754514770056734016266 0ustar00builderusers#include "test8.c.opari.inc" #line 1 "test8.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests whether specific clauses are found and inserted into the CTC string. */ #include #ifdef _OPENMP #endif int j; #line 27 "test8.c" #pragma omp threadprivate(j) int main() { int i = 5; int k = 0; { int pomp2_num_threads = 4; int pomp2_if = (int)( k==0 ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 35 "test8.c" #pragma omp parallel reduction(+:k) POMP2_DLIST_00001 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 36 "test8.c" { printf( "parallel\n" ); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 39 "test8.c" #pragma omp for reduction(+:k) schedule(dynamic, 5 ) collapse(1) nowait for ( i = 0; i < 4; ++i ) { printf( "for %d\n", i ); k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_For_exit( &opari2_region_2 ); } #line 45 "test8.c" { POMP2_Sections_enter( &opari2_region_3, opari2_ctc_3 ); #line 46 "test8.c" #pragma omp sections reduction(+:k) nowait { #line 48 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 49 "test8.c" printf( "section 1\n" ); POMP2_Section_end( &opari2_region_3 ); } #line 50 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 51 "test8.c" { printf( "section 2\n" ); } POMP2_Section_end( &opari2_region_3 ); } #line 53 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_3, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_3, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_3 ); } #line 54 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 55 "test8.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_4, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_4 ); #line 56 "test8.c" #pragma omp parallel default(private) POMP2_DLIST_00004 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_4 ); #line 57 "test8.c" { { int pomp2_if = (int)( true ); { POMP2_Task_handle pomp2_old_task; POMP2_Task_handle pomp2_new_task; if (pomp2_if) POMP2_Untied_task_create_begin( &opari2_region_5, &pomp2_new_task, &pomp2_old_task, pomp2_if, opari2_ctc_5 ); #line 58 "test8.c" #pragma omp task untied POMP2_DLIST_00005 if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) { if (pomp2_if) POMP2_Untied_task_begin( &opari2_region_5, pomp2_new_task ); #line 59 "test8.c" { printf( "task\n" ); } if (pomp2_if) POMP2_Untied_task_end( &opari2_region_5 ); } if (pomp2_if) POMP2_Untied_task_create_end( &opari2_region_5, pomp2_old_task ); } } #line 62 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_4, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_4, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_4 ); } POMP2_Parallel_join( &opari2_region_4, pomp2_old_task ); } #line 63 "test8.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_6, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_6 ); #line 64 "test8.c" #pragma omp parallel shared(num_threads) POMP2_DLIST_00006 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_6 ); #line 65 "test8.c" { printf("num_threads variable is %d\n",num_threads); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_6, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_6, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_6 ); } POMP2_Parallel_join( &opari2_region_6, pomp2_old_task ); } #line 68 "test8.c" } { int pomp2_num_threads = 4; int pomp2_if = (int)( 1 ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_7, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_7 ); #line 70 "test8.c" #pragma omp parallel reduction(+:k) default(none) POMP2_DLIST_00007 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_7 ); { POMP2_For_enter( &opari2_region_7, opari2_ctc_7 ); #line 70 "test8.c" #pragma omp for schedule(static,chunkif) collapse(1) ordered nowait for ( i = 0; i < 4; ++i ) { { POMP2_Ordered_enter( &opari2_region_8, opari2_ctc_8 ); #line 73 "test8.c" #pragma omp ordered { POMP2_Ordered_begin( &opari2_region_8 ); #line 74 "test8.c" printf( "for %d\n", i ); POMP2_Ordered_end( &opari2_region_8 ); } POMP2_Ordered_exit( &opari2_region_8 ); } #line 75 "test8.c" k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_7, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_7, pomp2_old_task ); } POMP2_For_exit( &opari2_region_7 ); } POMP2_Parallel_end( &opari2_region_7 ); } POMP2_Parallel_join( &opari2_region_7, pomp2_old_task ); } #line 78 "test8.c" { int pomp2_num_threads = 4; int pomp2_if = (int)( (i+k)>5 ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_9, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_9 ); #line 79 "test8.c" #pragma omp parallel reduction(+:k) POMP2_DLIST_00009 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_9 ); { POMP2_Sections_enter( &opari2_region_9, opari2_ctc_9 ); #line 79 "test8.c" #pragma omp sections nowait { #line 81 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_9, opari2_ctc_9 ); #line 82 "test8.c" printf( "section 1\n" ); POMP2_Section_end( &opari2_region_9 ); } #line 83 "test8.c" #pragma omp section { POMP2_Section_begin( &opari2_region_9, opari2_ctc_9 ); #line 84 "test8.c" { printf( "section 2\n" ); } POMP2_Section_end( &opari2_region_9 ); } #line 86 "test8.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_9, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_9, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_9 ); } POMP2_Parallel_end( &opari2_region_9 ); } POMP2_Parallel_join( &opari2_region_9, pomp2_old_task ); } #line 87 "test8.c" opari2-2.0.9/test/data/PaxHeaders/test8.c.opari.inc.out0000644000000000000000000000013114770056734017602 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test8.c.opari.inc.out0000644000175100001440000000504614770056734020140 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "101*regionType=parallel*sscl=test8.c:35:35*escl=test8.c:54:54*hasIf=1*hasNum_threads=1*hasReduction=1**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "107*regionType=for*sscl=test8.c:39:39*escl=test8.c:44:44*hasCollapse=1*hasReduction=1*hasSchedule=dynamic,5**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "90*regionType=sections*sscl=test8.c:46:46*escl=test8.c:53:53*numSections=2*hasReduction=1**" #define POMP2_DLIST_00004 shared(opari2_region_4,opari2_region_5) static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "80*regionType=parallel*sscl=test8.c:56:56*escl=test8.c:62:62*hasDefault=private**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "77*regionType=task*sscl=test8.c:58:58*escl=test8.c:61:61*hasIf=1*hasUntied=1**" #define POMP2_DLIST_00006 shared(opari2_region_6) static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "73*regionType=parallel*sscl=test8.c:64:64*escl=test8.c:67:67*hasShared=1**" #define POMP2_DLIST_00007 shared(opari2_region_7,opari2_region_8) static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "174*regionType=parallelfor*sscl=test8.c:70:70*escl=test8.c:77:77*hasCollapse=1*hasDefault=none*hasIf=1*hasNum_threads=1*hasOrdered=1*hasReduction=1*hasSchedule=static,chunkif**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "60*regionType=ordered*sscl=test8.c:73:73*escl=test8.c:74:74**" #define POMP2_DLIST_00009 shared(opari2_region_9) static OPARI2_Region_handle opari2_region_9 = NULL; #define opari2_ctc_9 "109*regionType=parallelsections*sscl=test8.c:79:79*escl=test8.c:86:86*hasIf=1*hasNum_threads=1*hasReduction=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); POMP2_Assign_handle( &opari2_region_9, opari2_ctc_9 ); } opari2-2.0.9/test/data/PaxHeaders/test8.c0000644000000000000000000000013114770056734015113 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test8.c0000644000175100001440000000365714770056734015457 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests whether specific clauses are found and inserted into the CTC string. */ #include #ifdef _OPENMP #include #endif int j; #pragma omp threadprivate(j) int main() { int i = 5; int k = 0; #pragma omp parallel if(k==0) num_threads(4) reduction(+:k) { printf( "parallel\n" ); #pragma omp for reduction(+:k) schedule(dynamic, 5 ) collapse(1) for ( i = 0; i < 4; ++i ) { printf( "for %d\n", i ); k++; } #pragma omp sections reduction(+:k) { #pragma omp section printf( "section 1\n" ); #pragma omp section { printf( "section 2\n" ); } } } #pragma omp parallel default(private) { #pragma omp task if(true) untied { printf( "task\n" ); } } #pragma omp parallel shared(num_threads) { printf("num_threads variable is %d\n",num_threads); } } #pragma omp parallel for num_threads(4) reduction(+:k) schedule(static,chunkif) collapse(1) ordered if(1) default(none) for ( i = 0; i < 4; ++i ) { #pragma omp ordered printf( "for %d\n", i ); k++; } #pragma omp parallel sections if((i+k)>5) num_threads(4) reduction(+:k) { #pragma omp section printf( "section 1\n" ); #pragma omp section { printf( "section 2\n" ); } } opari2-2.0.9/test/data/PaxHeaders/test7.f90.out0000644000000000000000000000013114770056734016074 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test7.f90.out0000644000175100001440000001066414770056734016434 0ustar00builderusers #line 1 "test7.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives. program test7 include 'test7.f90.opari.inc' #line 20 "test7.f90" call POMP2_Init() #line 21 "test7.f90" call POMP2_Off() #line 23 "test7.f90" call POMP2_Begin(opari2_region_1, opari2_ctc_1) #line 25 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_2,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_2 ) #line 26 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) #line 27 "test7.f90" i = 1 call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Parallel_end(opari2_region_2) #line 28 "test7.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, pomp2_old_task) #line 29 "test7.f90" call POMP2_End(opari2_region_1) #line 31 "test7.f90" call POMP2_On() #line 33 "test7.f90" #line 35 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 35 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) #line 36 "test7.f90" !$omp do do i = 1,2 write(*,*) i end do !$omp end do call POMP2_Parallel_end(opari2_region_3) !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 42 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 43 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) !$omp do do i = 1,2 write(*,*) i end do #line 47 "test7.f90" !$omp end do call POMP2_Parallel_end(opari2_region_4) #line 47 "test7.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 48 "test7.f90" #line 49 "test7.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_5 ) #line 50 "test7.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) #line 51 "test7.f90" i = 3 call POMP2_Implicit_barrier_enter(opari2_region_5,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, pomp2_old_task) call POMP2_Parallel_end(opari2_region_5) #line 52 "test7.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_5, pomp2_old_task) #line 53 "test7.f90" call POMP2_Finalize() #line 55 "test7.f90" end program test7 subroutine POMP2_Init_reg_000() include 'test7.f90.opari.inc' call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) end subroutine POMP2_USER_Init_reg_000() include 'test7.f90.opari.inc' call POMP2_USER_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end opari2-2.0.9/test/data/PaxHeaders/test7.f90.opari.inc.out0000644000000000000000000000013114770056734017755 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test7.f90.opari.inc.out0000644000175100001440000000254014770056734020307 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "85*regionType=userRegion*sscl=test7.f90:24:24*escl=test7.f90:30:30*userRegionName=foo**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "64*regionType=parallel*sscl=test7.f90:26:26*escl=test7.f90:28:28**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "64*regionType=parallel*sscl=test7.f90:35:35*escl=test7.f90:41:41**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "66*regionType=paralleldo*sscl=test7.f90:43:43*escl=test7.f90:47:47**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "64*regionType=parallel*sscl=test7.f90:50:50*escl=test7.f90:52:52**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test7.f900000644000000000000000000000013114770056734015266 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test7.f900000644000175100001440000000220114770056734015612 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives. program test7 !$POMP INST INIT !$POMP INST OFF !$POMP INST BEGIN(foo) !$OMP PARALLEL i = 1 !$OMP end PARALLEL !$POMP INST END(foo) !$POMP INST ON !$POMP NOINSTRUMENT !$OMP PARALLEL !$OMP DO do i = 1,2 write(*,*) i end do !$OMP END DO !$OMP END PARALLEL !$OMP PARALLEL DO do i = 1,2 write(*,*) i end do !$OMP end PARALLEL DO !$POMP INSTRUMENT !$OMP PARALLEL i = 3 !$OMP end PARALLEL !$POMP INST FINALIZE end program test7 opari2-2.0.9/test/data/PaxHeaders/test7.f.out0000644000000000000000000000013114770056734015723 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test7.f.out0000644000175100001440000001064714770056734016264 0ustar00builderusers #line 1 "test7.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives and selective instrumentation. program test7 include 'test7.f.opari.inc' #line 20 "test7.f" call POMP2_Init() #line 21 "test7.f" call POMP2_Off() #line 23 "test7.f" call POMP2_Begin(opari2_region_1, opari2_ctc_1) #line 25 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_2, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_2 ) #line 26 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) #line 27 "test7.f" i = 1 call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_2) #line 28 "test7.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, &pomp2_old_task) #line 29 "test7.f" call POMP2_End(opari2_region_1) #line 31 "test7.f" call POMP2_On() #line 33 "test7.f" #line 35 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_3 ) #line 35 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) #line 36 "test7.f" !$omp do do i = 1,2 write(*,*) i end do !$omp end do call POMP2_Parallel_end(opari2_region_3) !$omp end parallel call POMP2_Parallel_join(opari2_region_3, &pomp2_old_task) #line 42 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 43 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) !$omp do do i = 1,2 write(*,*) i end do #line 47 "test7.f" !$omp end do call POMP2_Parallel_end(opari2_region_4) #line 47 "test7.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 48 "test7.f" #line 49 "test7.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_5 ) #line 50 "test7.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) #line 51 "test7.f" i = 3 call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_5) #line 52 "test7.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_5, &pomp2_old_task) #line 53 "test7.f" call POMP2_Finalize() #line 55 "test7.f" end program test7 subroutine POMP2_Init_reg_000() include 'test7.f.opari.inc' call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) end subroutine POMP2_USER_Init_reg_000() include 'test7.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end opari2-2.0.9/test/data/PaxHeaders/test7.f.opari.inc.out0000644000000000000000000000013114770056734017604 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test7.f.opari.inc.out0000644000175100001440000000260614770056734020141 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"83*regionType=userRegion*sscl=test7.f:24:24*escl=test7.f:30"// &":30*userRegionName=foo**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"62*regionType=parallel*sscl=test7.f:26:26*escl=test7.f:28:2"// &"8**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"62*regionType=parallel*sscl=test7.f:35:35*escl=test7.f:41:4"// &"1**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"64*regionType=paralleldo*sscl=test7.f:43:43*escl=test7.f:47"// &":47**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"62*regionType=parallel*sscl=test7.f:50:50*escl=test7.f:52:5"// &"2**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test7.f0000644000000000000000000000013114770056734015115 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test7.f0000644000175100001440000000225014770056734015445 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Tests user instrumentation directives and selective instrumentation. program test7 C$POMP INST INIT *$POMP INST OFF !$POMP INST BEGIN(foo) !$OMP PARALLEL i = 1 !$OMP end PARALLEL CPOMP$ INST END(foo) *POMP$ INST ON !POMP$ NOINSTRUMENT !$OMP PARALLEL !$OMP DO do i = 1,2 write(*,*) i end do !$OMP END DO !$OMP END PARALLEL !$OMP PARALLEL DO do i = 1,2 write(*,*) i end do !$OMP END PARALLEL DO !$POMP INSTRUMENT !$OMP PARALLEL i = 3 !$OMP end PARALLEL !$POMP INST FINALIZE end program test7 opari2-2.0.9/test/data/PaxHeaders/test7.c.out0000644000000000000000000000013114770056734015720 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test7.c.out0000644000175100001440000001206514770056734016255 0ustar00builderusers#include "test7.c.opari.inc" #line 1 "test7.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests user instrumentation directives and selective instrumentation. */ int main() { int i; int b = 1; POMP2_Init(); #line 40 "test7.c" POMP2_Off(); #line 42 "test7.c" POMP2_Begin(&opari2_region_1, opari2_ctc_1); #line 44 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 45 "test7.c" #pragma omp parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); #line 46 "test7.c" i = 1; { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 47 "test7.c" POMP2_On(); #line 49 "test7.c" #line 51 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_3, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_3 ); #line 51 "test7.c" #pragma omp parallel POMP2_DLIST_00003 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_3 ); #line 52 "test7.c" #pragma omp for for ( i = 0; i < 2; ++i) b = b + i; POMP2_Parallel_end( &opari2_region_3 ); } POMP2_Parallel_join( &opari2_region_3, pomp2_old_task ); } #line 55 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_4, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_4 ); #line 56 "test7.c" #pragma omp parallel POMP2_DLIST_00004 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_4 ); #pragma omp for for ( i = 0; i < 2; ++i) b = b + i; POMP2_Parallel_end( &opari2_region_4 ); } POMP2_Parallel_join( &opari2_region_4, pomp2_old_task ); } #line 59 "test7.c" #line 60 "test7.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_5, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_5 ); #line 61 "test7.c" #pragma omp parallel POMP2_DLIST_00005 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_5 ); #line 62 "test7.c" i = 3; { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_5, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_5, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_5 ); } POMP2_Parallel_join( &opari2_region_5, pomp2_old_task ); } #line 63 "test7.c" if (b) { POMP2_End(&opari2_region_1); #line 66 "test7.c" return 0; } { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_6, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_6 ); #line 69 "test7.c" #pragma omp parallel POMP2_DLIST_00006 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_6 ); #line 70 "test7.c" { POMP2_Begin(&opari2_region_7, opari2_ctc_7); #line 72 "test7.c" i = 4; { POMP2_Task_handle pomp2_old_task; POMP2_Barrier_enter( &opari2_region_8, &pomp2_old_task, opari2_ctc_8 ); #line 73 "test7.c" #pragma omp barrier POMP2_Barrier_exit( &opari2_region_8, pomp2_old_task ); } #line 74 "test7.c" i = 5; POMP2_End(&opari2_region_7); #line 76 "test7.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_6, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_6, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_6 ); } POMP2_Parallel_join( &opari2_region_6, pomp2_old_task ); } #line 77 "test7.c" if (b) { POMP2_End(&opari2_region_1); #line 80 "test7.c" return 0; } POMP2_End(&opari2_region_1); #line 84 "test7.c" POMP2_Finalize(); #line 86 "test7.c" return 0; } opari2-2.0.9/test/data/PaxHeaders/test7.c.opari.inc.out0000644000000000000000000000013114770056734017601 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test7.c.opari.inc.out0000644000175100001440000000415314770056734020135 0ustar00builderusers#include #include static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "82*regionType=userRegion*sscl=test7.c:43:43*escl=test7.c:83:83*userRegionName=foo**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "61*regionType=parallel*sscl=test7.c:45:45*escl=test7.c:46:46**" #define POMP2_DLIST_00003 shared(opari2_region_3) static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "61*regionType=parallel*sscl=test7.c:51:51*escl=test7.c:54:54**" #define POMP2_DLIST_00004 shared(opari2_region_4) static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "64*regionType=parallelfor*sscl=test7.c:56:56*escl=test7.c:58:58**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "61*regionType=parallel*sscl=test7.c:61:61*escl=test7.c:62:62**" #define POMP2_DLIST_00006 shared(opari2_region_6,opari2_region_7,opari2_region_8) static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "61*regionType=parallel*sscl=test7.c:69:69*escl=test7.c:76:76**" static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "85*regionType=userRegion*sscl=test7.c:71:71*escl=test7.c:75:75*userRegionName=phase1**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "60*regionType=barrier*sscl=test7.c:73:73*escl=test7.c:73:73**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); } #ifdef __cplusplus extern "C" #endif void POMP2_USER_Init_reg_000() { POMP2_USER_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_USER_Assign_handle( &opari2_region_7, opari2_ctc_7 ); } opari2-2.0.9/test/data/PaxHeaders/test7.c0000644000000000000000000000013114770056734015112 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test7.c0000644000175100001440000000320214770056734015440 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Tests user instrumentation directives and selective instrumentation. */ int main() { int i; int b = 1; #pragma pomp inst init #pragma pomp inst off #pragma pomp inst begin(foo) #pragma omp parallel i = 1; #pragma pomp inst on #pragma pomp noinstrument #pragma omp parallel #pragma omp for for ( i = 0; i < 2; ++i) b = b + i; #pragma omp parallel for for ( i = 0; i < 2; ++i) b = b + i; #pragma pomp instrument #pragma omp parallel i = 3; if (b) { #pragma pomp inst altend(foo) return 0; } #pragma omp parallel { #pragma pomp inst begin(phase1) i = 4; #pragma omp barrier i = 5; #pragma pomp inst end(phase1) } if (b) { #pragma pomp inst altend(foo) return 0; } #pragma pomp inst end(foo) #pragma pomp inst finalize return 0; } opari2-2.0.9/test/data/PaxHeaders/test6.f90.out0000644000000000000000000000013114770056734016073 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test6.f90.out0000644000175100001440000000522514770056734016430 0ustar00builderusers #line 1 "test6.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 use omp_lib include 'test6.f90.opari.inc' #line 23 "test6.f90" integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call POMP2_Init_lock(lock1); call POMP2_Init_nest_lock(lock2) call POMP2_Set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call POMP2_Set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call POMP2_Unset_lock(lock1); !omp_unset_lock(lock1); call POMP2_Unset_nest_lock(lock2) !$ mod = POMP2_Test_lock(lock1) !$ mod = POMP2_Test_nest_lock(lock2) mod = POMP2_Test_lock(lock1) mod = POMP2_Test_nest_lock(lock2) call POMP2_Destroy_lock(lock1) call POMP2_Destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", "omp_init_lock(i)""", """", """""""", & "omp_init_lock(i) ",& ! ",& " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) !$C99 call omp_init_lock(i) !$DOMP call omp_init_lock(i) end program test6 opari2-2.0.9/test/data/PaxHeaders/test6.f90.opari.inc.out0000644000000000000000000000013114770056734017754 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test6.f90.opari.inc.out0000644000175100001440000000024714770056734020310 0ustar00builderusers integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock opari2-2.0.9/test/data/PaxHeaders/test6.f900000644000000000000000000000013114770056734015265 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test6.f900000644000175100001440000000505714770056734015625 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 use omp_lib integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call omp_init_lock(lock1); call omp_init_nest_lock(lock2) call omp_set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call omp_set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call omp_unset_lock(lock1); !omp_unset_lock(lock1); call omp_unset_nest_lock(lock2) !$ mod = omp_test_lock(lock1) !$ mod = omp_test_nest_lock(lock2) !P$ mod = omp_test_lock(lock1) !P$ mod = omp_test_nest_lock(lock2) call omp_destroy_lock(lock1) call omp_destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", "omp_init_lock(i)""", """", """""""", & "omp_init_lock(i) ",& ! ",& " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) !$C99 call omp_init_lock(i) !$DOMP call omp_init_lock(i) end program test6 opari2-2.0.9/test/data/PaxHeaders/test6.f.out0000644000000000000000000000013114770056734015722 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test6.f.out0000644000175100001440000000607114770056734016257 0ustar00builderusers #line 1 "test6.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 include 'omp_lib.h' include 'test6.f.opari.inc' #line 22 "test6.f" integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call POMP2_Init_lock(lock1); call POMP2_Init_nest_lock(lock2) call POMP2_Set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call POMP2_Set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call POMP2_Unset_lock(lock1); !omp_unset_lock(lock1); call POMP2_Unset_nest_lock(lock2) !$ mod = POMP2_Test_lock(lock1) *$ mod = POMP2_Test_nest_lock(lock2) mod = POMP2_Test_lock(lock1) mod = POMP2_Test_nest_lock(lock2) call POMP2_Destroy_lock(lock1) call POMP2_Destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) c call omp_init_lock(i) * call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", &"omp_init_lock(i)""", """", """""""","omp_init_lock(i) ", ! ",& & " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) end program test6 ! Simulation of included header file, nothing should be replaced #line 1 omp_lib.h call omp_init_lock(lock1) call omp_init_nest_lock(lock2) call omp_set_lock(lock1) call omp_set_nest_lock(lock2) call omp_unset_lock(lock1) call omp_unset_nest_lock(lock2) opari2-2.0.9/test/data/PaxHeaders/test6.f.opari.inc.out0000644000000000000000000000013114770056734017603 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.171533013 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test6.f.opari.inc.out0000644000175100001440000000033214770056734020132 0ustar00builderusers integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock opari2-2.0.9/test/data/PaxHeaders/test6.f0000644000000000000000000000013114770056734015114 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test6.f0000644000175100001440000000576414770056734015461 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. program test6 include 'omp_lib.h' integer (kind=omp_lock_kind) lock1 integer (kind=omp_nest_lock_kind) lock2 integer (kind=omp_sched_kind) sched integer mod ! ************************************************** ! * Should be replaced by wrapper functions * ! * regardless of "distractions" * ! ************************************************** call omp_init_lock(lock1); call omp_init_nest_lock(lock2) call omp_set_lock(lock1); write(*,*) "omp_set_lock(lock1)" call omp_set_nest_lock(lock2) ! omp_set_nest_lock(lock2); call omp_unset_lock(lock1); !omp_unset_lock(lock1); call omp_unset_nest_lock(lock2) !$ mod = omp_test_lock(lock1) *$ mod = omp_test_nest_lock(lock2) !P$ mod = omp_test_lock(lock1) cP$ mod = omp_test_nest_lock(lock2) call omp_destroy_lock(lock1) call omp_destroy_nest_lock(lock2) ! ************************************************** ! * Not now, but planned for the future! * ! ************************************************** call omp_set_num_threads(4) call omp_set_dynamic(.true.) call omp_set_schedule(omp_sched_static, 1) call omp_set_nested(.true.) call omp_set_max_active_levels(2) ! ************************************************** ! * No replacement beyond this point! * ! ************************************************** ! call omp_init_lock(i) c call omp_init_lock(i) * call omp_init_lock(i) write(*,*) "omp_init_lock(i)", 'omp_init_lock(i)' ! call omp_init_lock(i) write(*,*) "omp_init_lock(i)""test", """omp_init_lock(i)", &"omp_init_lock(i)""", """", """""""","omp_init_lock(i) ", ! ",& & " + call omp_init_lock(i)" ! call omp_init_lock(i) ! call omp_init_lock(i) ! call omp_init_lock(i) ; call omp_set_lock(i) ! write(*,*) "call omp_init_lock(i)" ; call omp_init_lock(i) end program test6 ! Simulation of included header file, nothing should be replaced #line 1 /some/path/to/include/file/omp_lib.h call omp_init_lock(lock1) call omp_init_nest_lock(lock2) call omp_set_lock(lock1) call omp_set_nest_lock(lock2) call omp_unset_lock(lock1) call omp_unset_nest_lock(lock2) opari2-2.0.9/test/data/PaxHeaders/test6.c.out0000644000000000000000000000013114770056734015717 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test6.c.out0000644000175100001440000000600014770056734016244 0ustar00builderusers#include "test6.c.opari.inc" #line 1 "test6.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. */ int main() { omp_lock_t lock1; omp_nest_lock_t lock2; omp_sched_t sched; int mod; //************************************************** //* Should be replaced by wrapper functions * //* regardless of "distractions" * //************************************************** POMP2_Init_lock(&lock1); POMP2_Init_nest_lock(&lock2); POMP2_Set_lock(&lock1); POMP2_Set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); POMP2_Unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ POMP2_Unset_nest_lock(&lock2); POMP2_Test_lock(&lock1);/* omp_test_lock(&lock1); */ POMP2_Test_nest_lock(&lock2); POMP2_Destroy_lock(&lock1); POMP2_Destroy_nest_lock(&lock2); //************************************************** //* Not now, but planned for the future! * //************************************************** omp_set_num_threads(4); omp_set_dynamic(0); omp_set_schedule(omp_sched_static, 1); omp_set_nested(0); omp_set_max_active_levels(2); //************************************************** //* No replacement beyond this point! * //************************************************** omp_get_num_threads(); omp_get_max_threads(); omp_get_thread_num(); omp_get_num_procs(); omp_in_parallel(); omp_get_nested(); omp_get_dynamic(); omp_get_schedule(&sched, &mod); omp_get_thread_limit(); omp_get_max_active_levels(); omp_get_level(); omp_get_ancestor_thread_num(0); omp_get_team_size(0); omp_get_active_level(); omp_get_wtime(); omp_get_wtick(); // omp_init_lock(i) /* -- omp_init_lock(i) -- */ /* -- omp_init_lock(i) -- */ printf("omp_init_lock(i) \n"); // omp_init_lock(i) printf("omp_init_lock(i)\"test\"omp_init_lock(i)omp_init_lock(i)\"\"\"\n"); } /* Simulate preincluded definitions. Nothing beyond this point should be replaced */ #line 1 "omp.h" omp_init_lock(&lock1); omp_init_nest_lock(&lock2); omp_set_lock(&lock1); omp_set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); omp_unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ omp_unset_nest_lock(&lock2); omp_test_lock(&lock1);/* omp_test_lock(&lock1); */ omp_test_nest_lock(&lock2); omp_destroy_lock(&lock1); omp_destroy_nest_lock(&lock2); opari2-2.0.9/test/data/PaxHeaders/test6.c.opari.inc.out0000644000000000000000000000013114770056734017600 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test6.c.opari.inc.out0000644000175100001440000000003714770056734020131 0ustar00builderusers#include opari2-2.0.9/test/data/PaxHeaders/test6.c0000644000000000000000000000013114770056734015111 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test6.c0000644000175100001440000000576214770056734015454 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test that the insertion of wrapper functions works correctly, but ONLY on supported functions. */ #include int main() { omp_lock_t lock1; omp_nest_lock_t lock2; omp_sched_t sched; int mod; //************************************************** //* Should be replaced by wrapper functions * //* regardless of "distractions" * //************************************************** omp_init_lock(&lock1); omp_init_nest_lock(&lock2); omp_set_lock(&lock1); omp_set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); omp_unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ omp_unset_nest_lock(&lock2); omp_test_lock(&lock1);/* omp_test_lock(&lock1); */ omp_test_nest_lock(&lock2); omp_destroy_lock(&lock1); omp_destroy_nest_lock(&lock2); //************************************************** //* Not now, but planned for the future! * //************************************************** omp_set_num_threads(4); omp_set_dynamic(0); omp_set_schedule(omp_sched_static, 1); omp_set_nested(0); omp_set_max_active_levels(2); //************************************************** //* No replacement beyond this point! * //************************************************** omp_get_num_threads(); omp_get_max_threads(); omp_get_thread_num(); omp_get_num_procs(); omp_in_parallel(); omp_get_nested(); omp_get_dynamic(); omp_get_schedule(&sched, &mod); omp_get_thread_limit(); omp_get_max_active_levels(); omp_get_level(); omp_get_ancestor_thread_num(0); omp_get_team_size(0); omp_get_active_level(); omp_get_wtime(); omp_get_wtick(); // omp_init_lock(i) /* -- omp_init_lock(i) -- */ /* -- omp_init_lock(i) -- */ printf("omp_init_lock(i) \n"); // omp_init_lock(i) printf("omp_init_lock(i)\"test\"omp_init_lock(i)omp_init_lock(i)\"\"\"\n"); } /* Simulate preincluded definitions. Nothing beyond this point should be replaced */ #line 1 "/some/path/to/presumed/include/file/omp.h" omp_init_lock(&lock1); omp_init_nest_lock(&lock2); omp_set_lock(&lock1); omp_set_nest_lock(&lock2); // omp_set_nest_lock(&lock2); omp_unset_lock(&lock1); /*omp_unset_lock(&lock1);*/ omp_unset_nest_lock(&lock2); omp_test_lock(&lock1);/* omp_test_lock(&lock1); */ omp_test_nest_lock(&lock2); omp_destroy_lock(&lock1); omp_destroy_nest_lock(&lock2); opari2-2.0.9/test/data/PaxHeaders/test5.f90.out0000644000000000000000000000013114770056734016072 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test5.f90.out0000644000175100001440000001222014770056734016420 0ustar00builderusers #line 1 "test5.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 include 'test5.f90.opari.inc' #line 20 "test5.f90" integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t #line 25 "test5.f90" !$omp threadprivate(t) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 28 "test5.f90" !$omp parallel & !$omp & private(i,j) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) call POMP2_Do_enter(opari2_region_1, & opari2_ctc_1 ) #line 28 "test5.f90" !$omp do & !$omp & lastprivate(k) & !$omp & lastprivate & !$omp & ( & !$omp & l & !$omp & ) schedule(dynamic & !$omp & ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do #line 41 "test5.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Do_exit(opari2_region_1) call POMP2_Parallel_end(opari2_region_1) #line 41 "test5.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 42 "test5.f90" if(k .gt. 0) l = .true. pomp2_num_threads = 2 pomp2_if = ( l ) call POMP2_Parallel_fork(opari2_region_2,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_2 ) #line 44 "test5.f90" !$omp parallel default(shared) & !$omp &firstprivate(j) copyin(t) reduction(+:l) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) call POMP2_Sections_enter(opari2_region_2) #line 44 "test5.f90" !$omp sections & !$omp & lastprivate(i) #line 46 "test5.f90" !$omp section call POMP2_Section_begin(opari2_region_2, & opari2_ctc_2 ) #line 47 "test5.f90" write(*,*) "section1" call POMP2_Section_end(opari2_region_2) #line 48 "test5.f90" !$omp section call POMP2_Section_begin(opari2_region_2, & opari2_ctc_2 ) #line 49 "test5.f90" write(*,*) "section2" call POMP2_Section_end(opari2_region_2) #line 50 "test5.f90" !$omp section call POMP2_Section_begin(opari2_region_2, & opari2_ctc_2 ) #line 51 "test5.f90" write(*,*) "section3" call POMP2_Section_end(opari2_region_2) #line 52 "test5.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Sections_exit(opari2_region_2) call POMP2_Parallel_end(opari2_region_2) #line 52 "test5.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, pomp2_old_task) #line 53 "test5.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 54 "test5.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Workshare_enter(opari2_region_3, & opari2_ctc_3 ) #line 54 "test5.f90" !$omp workshare AA = BB BB = CC #line 57 "test5.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 57 "test5.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 58 "test5.f90" end program test5 subroutine POMP2_Init_reg_000() include 'test5.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) end opari2-2.0.9/test/data/PaxHeaders/test5.f90.opari.inc.out0000644000000000000000000000013114770056734017753 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test5.f90.opari.inc.out0000644000175100001440000000176514770056734020315 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "86*regionType=paralleldo*sscl=test5.f90:28:36*escl=test5.f90:41:41*hasSchedule=dynamic**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "112*regionType=parallelsections*sscl=test5.f90:44:45*escl=test5.f90:52:52*hasIf=1*hasNum_threads=1*hasReduction=1**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "73*regionType=parallelworkshare*sscl=test5.f90:54:54*escl=test5.f90:57:57**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test5.f900000644000000000000000000000013114770056734015264 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test5.f900000644000175100001440000000315714770056734015623 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t !$omp threadprivate(t) !$omp parallel & !parallel !$omp & do & !do !$omp & lastprivate(k) & !comment !$omp & private(i,j), & !schedule !$omp & lastprivate & !$omp & ( & !$omp & l & !comment inside argument !$omp & ), schedule(dynamic & !$omp & ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do !$omp end parallel do if(k .gt. 0) l = .true. !$omp parallel sections if(l) num_threads(2) default(shared) & !$omp &firstprivate(j) lastprivate(i) copyin(t) reduction(+:l) !$omp section write(*,*) "section1" !$omp section write(*,*) "section2" !$omp section write(*,*) "section3" !$omp end parallel sections !$omp parallel workshare AA = BB BB = CC !$omp end parallel workshare end program test5 opari2-2.0.9/test/data/PaxHeaders/test5.f.out0000644000000000000000000000013114770056734015721 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test5.f.out0000644000175100001440000001172014770056734016253 0ustar00builderusers #line 1 "test5.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 include 'test5.f.opari.inc' #line 20 "test5.f" integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t #line 25 "test5.f" !$omp threadprivate(t) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 28 "test5.f" !$omp parallel !$omp+ private(i,j) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) call POMP2_Do_enter(opari2_region_1, &opari2_ctc_1 ) #line 28 "test5.f" !$omp do !$omp+ lastprivate(k) !$omp+ lastprivate !$omp+ ( !$omp+ l !$omp+ ) schedule(dynamic !$omp+ ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do #line 41 "test5.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Do_exit(opari2_region_1) call POMP2_Parallel_end(opari2_region_1) #line 41 "test5.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 42 "test5.f" if(k .gt. 0) l = .true. pomp2_num_threads = 2 pomp2_if = ( l ) call POMP2_Parallel_fork(opari2_region_2, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_2 ) #line 44 "test5.f" !$omp parallel default(shared) !$omp+ firstprivate(j) copyin(t) reduction(+:l) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& if(pomp2_if) num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) call POMP2_Sections_enter(opari2_region_2) #line 44 "test5.f" !$omp sections !$omp+ lastprivate(i) #line 46 "test5.f" !$omp section call POMP2_Section_begin(opari2_region_2, &opari2_ctc_2 ) #line 47 "test5.f" write(*,*) "section1" call POMP2_Section_end(opari2_region_2) #line 48 "test5.f" !$omp section call POMP2_Section_begin(opari2_region_2, &opari2_ctc_2 ) #line 49 "test5.f" write(*,*) "section2" call POMP2_Section_end(opari2_region_2) #line 50 "test5.f" !$omp section call POMP2_Section_begin(opari2_region_2, &opari2_ctc_2 ) #line 51 "test5.f" write(*,*) "section3" call POMP2_Section_end(opari2_region_2) #line 52 "test5.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_2) call POMP2_Parallel_end(opari2_region_2) #line 52 "test5.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, &pomp2_old_task) #line 53 "test5.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_3 ) #line 54 "test5.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Workshare_enter(opari2_region_3, &opari2_ctc_3 ) #line 54 "test5.f" !$omp workshare AA = BB BB = CC #line 57 "test5.f" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_3, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, &pomp2_old_task) call POMP2_Workshare_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 57 "test5.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, &pomp2_old_task) #line 58 "test5.f" end program test5 subroutine POMP2_Init_reg_000() include 'test5.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) end opari2-2.0.9/test/data/PaxHeaders/test5.f.opari.inc.out0000644000000000000000000000013114770056734017602 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test5.f.opari.inc.out0000644000175100001440000000202514770056734020132 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"84*regionType=paralleldo*sscl=test5.f:28:36*escl=test5.f:41"// &":41*hasSchedule=dynamic**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"110*regionType=parallelsections*sscl=test5.f:44:45*escl=tes"// &"t5.f:52:52*hasIf=1*hasNum_threads=1*hasReduction=1**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"71*regionType=parallelworkshare*sscl=test5.f:54:54*escl=tes"// &"t5.f:57:57**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test5.f0000644000000000000000000000013114770056734015113 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test5.f0000644000175100001440000000275414770056734015454 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the splitting of combined parallel clauses. program test5 integer i,j,k,m logical l integer, dimension(10,10) :: AA, BB, CC integer, save :: t !$omp threadprivate(t) !$omp parallel !$omp+ do !$omp+ lastprivate(k) !$omp+ private(i,j), !$omp+ lastprivate !$omp+ ( !$omp+ l !random comment !$omp+ ), schedule(dynamic !$omp+ ) do i=1,4 write(*,*) "parallel do ", i k=k+i end do !$omp end parallel do if(k .gt. 0) l = .true. !$omp parallel sections if(l) num_threads(2) default(shared) !$omp+ firstprivate(j) lastprivate(i) copyin(t) reduction(+:l) !$omp section write(*,*) "section1" !$omp section write(*,*) "section2" !$omp section write(*,*) "section3" !$omp end parallel sections !$omp parallel workshare AA = BB BB = CC !$omp end parallel workshare end program test5 opari2-2.0.9/test/data/PaxHeaders/test5.c.out0000644000000000000000000000013114770056734015716 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test5.c.out0000644000175100001440000000741614770056734016257 0ustar00builderusers#include "test5.c.opari.inc" #line 1 "test5.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the splitting of combined parallel clauses. */ #include int t; #line 24 "test5.c" #pragma omp threadprivate(t) int main() { int i, j, k, l; l=0; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 30 "test5.c" #pragma omp parallel \ private(i,j) \ POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); { POMP2_For_enter( &opari2_region_1, opari2_ctc_1 ); #line 30 "test5.c" #pragma omp \ for \ lastprivate(k) \ lastprivate \ ( \ l \ ) schedule(dynamic \ ) nowait for(i=0; i<4;++i) { printf("parallel for %d\n", i); k+=i; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_For_exit( &opari2_region_1 ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 43 "test5.c" { int pomp2_num_threads = 2; int pomp2_if = (int)( k ); POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 44 "test5.c" #pragma omp parallel firstprivate(j) default(shared) copyin(t) reduction(+:l) POMP2_DLIST_00002 firstprivate(pomp2_old_task) if(pomp2_if) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); { POMP2_Sections_enter( &opari2_region_2, opari2_ctc_2 ); #line 44 "test5.c" #pragma omp sections lastprivate(i) nowait { #line 46 "test5.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 47 "test5.c" { printf("Section 1\n"); } POMP2_Section_end( &opari2_region_2 ); } #line 50 "test5.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 51 "test5.c" { printf("Section 2\n"); } POMP2_Section_end( &opari2_region_2 ); } #line 54 "test5.c" #pragma omp section { POMP2_Section_begin( &opari2_region_2, opari2_ctc_2 ); #line 55 "test5.c" { printf("Section 3\n"); } POMP2_Section_end( &opari2_region_2 ); } #line 58 "test5.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_2 ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 59 "test5.c" } opari2-2.0.9/test/data/PaxHeaders/test5.c.opari.inc.out0000644000000000000000000000013114770056734017577 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test5.c.opari.inc.out0000644000175100001440000000124114770056734020126 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "84*regionType=parallelfor*sscl=test5.c:30:38*escl=test5.c:42:42*hasSchedule=dynamic**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "109*regionType=parallelsections*sscl=test5.c:44:44*escl=test5.c:58:58*hasIf=1*hasNum_threads=1*hasReduction=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.9/test/data/PaxHeaders/test5.c0000644000000000000000000000013114770056734015110 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test5.c0000644000175100001440000000277514770056734015454 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the splitting of combined parallel clauses. */ #include int t; #pragma omp threadprivate(t) int main() { int i, j, k, l; l=0; #pragma omp parallel /* parallel */ \ for /* for */ \ lastprivate(k) /* for */ \ private(i,j), /* parallel */ \ lastprivate /* for */ \ ( /* for */ \ l /* for */ \ ), schedule(dynamic /* for */ \ ) for(i=0; i<4;++i) { printf("parallel for %d\n", i); k+=i; } #pragma omp parallel sections if(k) num_threads(2) lastprivate(i) firstprivate(j) default(shared) copyin(t) reduction(+:l) { #pragma omp section { printf("Section 1\n"); } #pragma omp section { printf("Section 2\n"); } #pragma omp section { printf("Section 3\n"); } } } opari2-2.0.9/test/data/PaxHeaders/test4.remove-task.c.out0000644000000000000000000000013114770056734020151 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.remove-task.c.out0000644000175100001440000000573214770056734020511 0ustar00builderusers#include "test4.remove-task.c.opari.inc" #line 1 "test4.remove-task.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #endif int main() { int i; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 29 "test4.remove-task.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 30 "test4.remove-task.c" { printf("parallel\n"); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 32 "test4.remove-task.c" #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } POMP2_For_exit( &opari2_region_2 ); } #line 36 "test4.remove-task.c" { POMP2_Sections_enter( &opari2_region_3, opari2_ctc_3 ); #line 37 "test4.remove-task.c" #pragma omp sections nowait { #line 39 "test4.remove-task.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 40 "test4.remove-task.c" printf("section nowait 1\n"); POMP2_Section_end( &opari2_region_3 ); } #line 41 "test4.remove-task.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 42 "test4.remove-task.c" { printf("section nowait 2\n"); } POMP2_Section_end( &opari2_region_3 ); } #line 43 "test4.remove-task.c" } POMP2_Sections_exit( &opari2_region_3 ); } #line 44 "test4.remove-task.c" { POMP2_Single_enter( &opari2_region_4, opari2_ctc_4 ); #line 45 "test4.remove-task.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_4 ); #line 46 "test4.remove-task.c" { printf("single nowait\n"); } POMP2_Single_end( &opari2_region_4 ); } POMP2_Single_exit( &opari2_region_4 ); } #line 49 "test4.remove-task.c" //!!! Removed task directive due to user option "--task=remove"! #line 51 "test4.remove-task.c" { printf("task untied\n"); } #line 54 "test4.remove-task.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 55 "test4.remove-task.c" } opari2-2.0.9/test/data/PaxHeaders/test4.remove-task.c.opari.inc.out0000644000000000000000000000013114770056734022032 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.remove-task.c.opari.inc.out0000644000175100001440000000264014770056734022365 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3,opari2_region_4,opari2_region_5) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "85*regionType=parallel*sscl=test4.remove-task.c:29:29*escl=test4.remove-task.c:54:54**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "92*regionType=for*sscl=test4.remove-task.c:32:32*escl=test4.remove-task.c:35:35*hasNowait=1**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "111*regionType=sections*sscl=test4.remove-task.c:37:37*escl=test4.remove-task.c:43:43*numSections=2*hasNowait=1**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "95*regionType=single*sscl=test4.remove-task.c:45:45*escl=test4.remove-task.c:48:48*hasNowait=1**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "93*regionType=task*sscl=test4.remove-task.c:50:50*escl=test4.remove-task.c:53:53*hasUntied=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); } opari2-2.0.9/test/data/PaxHeaders/test4.remove-task.c0000644000000000000000000000013114770056734017343 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.remove-task.c0000644000175100001440000000224214770056734017674 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #include #endif int main() { int i; #pragma omp parallel { printf("parallel\n"); #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } #pragma omp sections nowait { #pragma omp section printf("section nowait 1\n"); #pragma omp section { printf("section nowait 2\n"); } } #pragma omp single nowait { printf("single nowait\n"); } #pragma omp task untied { printf("task untied\n"); } } } opari2-2.0.9/test/data/PaxHeaders/test4.f90.out0000644000000000000000000000013114770056734016071 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.f90.out0000644000175100001440000001035314770056734016424 0ustar00builderusers #line 1 "test4.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 include 'test4.f90.opari.inc' #line 20 "test4.f90" integer i real a(5,5), b(5,5), c(5,5) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 24 "test4.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 25 "test4.f90" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 26 "test4.f90" !$omp do do i=1,4 write(*,*) "do nowait",i enddo #line 30 "test4.f90" !$omp enddo nowait call POMP2_Do_exit(opari2_region_2) #line 31 "test4.f90" call POMP2_Sections_enter(opari2_region_3, & opari2_ctc_3 ) #line 32 "test4.f90" !$omp sections #line 33 "test4.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 34 "test4.f90" write(*,*) "section nowait 1" call POMP2_Section_end(opari2_region_3) #line 35 "test4.f90" !$omp section call POMP2_Section_begin(opari2_region_3, & opari2_ctc_3 ) #line 36 "test4.f90" write(*,*) "section nowait 2" call POMP2_Section_end(opari2_region_3) #line 37 "test4.f90" !$omp end sections nowait call POMP2_Sections_exit(opari2_region_3) #line 38 "test4.f90" call POMP2_Single_enter(opari2_region_4, & opari2_ctc_4 ) #line 39 "test4.f90" !$omp single call POMP2_Single_begin(opari2_region_4) #line 40 "test4.f90" write(*,*) "single nowait" call POMP2_Single_end(opari2_region_4) #line 41 "test4.f90" !$omp end single nowait call POMP2_Single_exit(opari2_region_4) #line 42 "test4.f90" call POMP2_Workshare_enter(opari2_region_5, & opari2_ctc_5 ) #line 43 "test4.f90" !$omp workshare a = b + c #line 45 "test4.f90" !$omp end workshare nowait call POMP2_Workshare_exit(opari2_region_5) #line 46 "test4.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Untied_task_create_begin(opari2_region_6, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_6 ) end if #line 47 "test4.f90" !$omp task untied if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Untied_task_begin(opari2_region_6, pomp2_new_task) end if #line 48 "test4.f90" write(*,*) "task" if (pomp2_if) then call POMP2_Untied_task_end(opari2_region_6) end if #line 49 "test4.f90" !$omp end task if (pomp2_if) then call POMP2_Untied_task_create_end(opari2_region_6, pomp2_old_task) end if #line 50 "test4.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 51 "test4.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 52 "test4.f90" end program test4 subroutine POMP2_Init_reg_000() include 'test4.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) end opari2-2.0.9/test/data/PaxHeaders/test4.f90.opari.inc.out0000644000000000000000000000013114770056734017752 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.f90.opari.inc.out0000644000175100001440000000305214770056734020303 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test4.f90:24:24*escl=test4.f90:51:51**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "58*regionType=do*sscl=test4.f90:26:26*escl=test4.f90:30:30**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "78*regionType=sections*sscl=test4.f90:32:32*escl=test4.f90:37:37*numSections=2**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "62*regionType=single*sscl=test4.f90:39:39*escl=test4.f90:41:41**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "65*regionType=workshare*sscl=test4.f90:43:43*escl=test4.f90:45:45**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "72*regionType=task*sscl=test4.f90:47:47*escl=test4.f90:49:49*hasUntied=1**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test4.f900000644000000000000000000000013114770056734015263 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.f900000644000175100001440000000227514770056734015622 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 integer i real a(5,5), b(5,5), c(5,5) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do nowait",i enddo !$omp enddo nowait !$omp sections !$omp section write(*,*) "section nowait 1" !$omp section write(*,*) "section nowait 2" !$omp end sections nowait !$omp single write(*,*) "single nowait" !$omp end single nowait !$omp workshare a = b + c !$omp end workshare nowait !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel end program test4 opari2-2.0.9/test/data/PaxHeaders/test4.f.out0000644000000000000000000000013114770056734015720 xustar0029 mtime=1742757340.11953333 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.f.out0000644000175100001440000001027714770056734016260 0ustar00builderusers #line 1 "test4.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 include 'test4.f.opari.inc' #line 20 "test4.f" integer i real a(5,5), b(5,5), c(5,5) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 24 "test4.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 25 "test4.f" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 26 "test4.f" !$omp do do i=1,4 write(*,*) "do nowait",i enddo #line 30 "test4.f" !$omp enddo nowait call POMP2_Do_exit(opari2_region_2) #line 31 "test4.f" call POMP2_Sections_enter(opari2_region_3, &opari2_ctc_3 ) #line 32 "test4.f" !$omp sections #line 33 "test4.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 34 "test4.f" write(*,*) "section nowait 1" call POMP2_Section_end(opari2_region_3) #line 35 "test4.f" !$omp section call POMP2_Section_begin(opari2_region_3, &opari2_ctc_3 ) #line 36 "test4.f" write(*,*) "section nowait 2" call POMP2_Section_end(opari2_region_3) #line 37 "test4.f" !$omp end sections nowait call POMP2_Sections_exit(opari2_region_3) #line 38 "test4.f" call POMP2_Single_enter(opari2_region_4, &opari2_ctc_4 ) #line 39 "test4.f" !$omp single call POMP2_Single_begin(opari2_region_4) #line 40 "test4.f" write(*,*) "single nowait" call POMP2_Single_end(opari2_region_4) #line 41 "test4.f" !$omp end single nowait call POMP2_Single_exit(opari2_region_4) #line 42 "test4.f" call POMP2_Workshare_enter(opari2_region_5, &opari2_ctc_5 ) #line 43 "test4.f" !$omp workshare a = b + c #line 45 "test4.f" !$omp end workshare nowait call POMP2_Workshare_exit(opari2_region_5) #line 46 "test4.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_6, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_6 ) end if #line 47 "test4.f" !$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_6, pomp2_new_task) end if #line 48 "test4.f" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_6) end if #line 49 "test4.f" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_6, &pomp2_old_task) end if #line 50 "test4.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 51 "test4.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 52 "test4.f" end program test4 subroutine POMP2_Init_reg_000() include 'test4.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) end opari2-2.0.9/test/data/PaxHeaders/test4.f.opari.inc.out0000644000000000000000000000013214770056734017602 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.f.opari.inc.out0000644000175100001440000000311014770056734020125 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test4.f:24:24*escl=test4.f:51:5"// &"1**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"56*regionType=do*sscl=test4.f:26:26*escl=test4.f:30:30**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"76*regionType=sections*sscl=test4.f:32:32*escl=test4.f:37:3"// &"7*numSections=2**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"60*regionType=single*sscl=test4.f:39:39*escl=test4.f:41:41*"// &"*") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"63*regionType=workshare*sscl=test4.f:43:43*escl=test4.f:45:"// &"45**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"70*regionType=task*sscl=test4.f:47:47*escl=test4.f:49:49*ha"// &"sUntied=1**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test4.f0000644000000000000000000000013214770056734015113 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.f0000644000175100001440000000233114770056734015442 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the nowait and untied clauses. program test4 integer i real a(5,5), b(5,5), c(5,5) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do nowait",i enddo !$omp enddo nowait !$omp sections !$omp section write(*,*) "section nowait 1" !$omp section write(*,*) "section nowait 2" !$omp end sections nowait !$omp single write(*,*) "single nowait" !$omp end single nowait !$omp workshare a = b + c !$omp end workshare nowait !$omp task untied write(*,*) "task" !$omp end task !$omp end parallel end program test4 opari2-2.0.9/test/data/PaxHeaders/test4.c.out0000644000000000000000000000013214770056734015716 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.c.out0000644000175100001440000000634414770056734016255 0ustar00builderusers#include "test4.c.opari.inc" #line 1 "test4.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #endif int main() { int i; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 29 "test4.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 30 "test4.c" { printf("parallel\n"); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 32 "test4.c" #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } POMP2_For_exit( &opari2_region_2 ); } #line 36 "test4.c" { POMP2_Sections_enter( &opari2_region_3, opari2_ctc_3 ); #line 37 "test4.c" #pragma omp sections nowait { #line 39 "test4.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 40 "test4.c" printf("section nowait 1\n"); POMP2_Section_end( &opari2_region_3 ); } #line 41 "test4.c" #pragma omp section { POMP2_Section_begin( &opari2_region_3, opari2_ctc_3 ); #line 42 "test4.c" { printf("section nowait 2\n"); } POMP2_Section_end( &opari2_region_3 ); } #line 43 "test4.c" } POMP2_Sections_exit( &opari2_region_3 ); } #line 44 "test4.c" { POMP2_Single_enter( &opari2_region_4, opari2_ctc_4 ); #line 45 "test4.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_4 ); #line 46 "test4.c" { printf("single nowait\n"); } POMP2_Single_end( &opari2_region_4 ); } POMP2_Single_exit( &opari2_region_4 ); } #line 49 "test4.c" { int pomp2_if = 1; { POMP2_Task_handle pomp2_old_task; POMP2_Task_handle pomp2_new_task; if (pomp2_if) POMP2_Untied_task_create_begin( &opari2_region_5, &pomp2_new_task, &pomp2_old_task, pomp2_if, opari2_ctc_5 ); #line 50 "test4.c" #pragma omp task untied POMP2_DLIST_00005 if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) { if (pomp2_if) POMP2_Untied_task_begin( &opari2_region_5, pomp2_new_task ); #line 51 "test4.c" { printf("task untied\n"); } if (pomp2_if) POMP2_Untied_task_end( &opari2_region_5 ); } if (pomp2_if) POMP2_Untied_task_create_end( &opari2_region_5, pomp2_old_task ); } } #line 54 "test4.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 55 "test4.c" } opari2-2.0.9/test/data/PaxHeaders/test4.c.opari.inc.out0000644000000000000000000000013214770056734017577 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.c.opari.inc.out0000644000175100001440000000244714770056734020136 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3,opari2_region_4,opari2_region_5) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test4.c:29:29*escl=test4.c:54:54**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "68*regionType=for*sscl=test4.c:32:32*escl=test4.c:35:35*hasNowait=1**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "87*regionType=sections*sscl=test4.c:37:37*escl=test4.c:43:43*numSections=2*hasNowait=1**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "71*regionType=single*sscl=test4.c:45:45*escl=test4.c:48:48*hasNowait=1**" #define POMP2_DLIST_00005 shared(opari2_region_5) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "69*regionType=task*sscl=test4.c:50:50*escl=test4.c:53:53*hasUntied=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); } opari2-2.0.9/test/data/PaxHeaders/test4.c0000644000000000000000000000013214770056734015110 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test4.c0000644000175100001440000000224214770056734015440 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the nowait and untied clauses */ #include #ifdef _OPENMP #include #endif int main() { int i; #pragma omp parallel { printf("parallel\n"); #pragma omp for nowait for(i=0; i<4; ++i) { printf("for nowait %d\n", i); } #pragma omp sections nowait { #pragma omp section printf("section nowait 1\n"); #pragma omp section { printf("section nowait 2\n"); } } #pragma omp single nowait { printf("single nowait\n"); } #pragma omp task untied { printf("task untied\n"); } } } opari2-2.0.9/test/data/PaxHeaders/test3.f90.out0000644000000000000000000000013214770056734016071 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test3.f90.out0000644000175100001440000003511214770056734016423 0ustar00builderusers #line 1 "test3.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 include 'test3.f90.opari.inc' #line 20 "test3.f90" integer i, j, k pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 22 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 23 "test3.f90" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 23 "test3.f90" !$omp do do 12,i = 1,8 a=a+1 12 continue #line 26 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 27 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 27 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 28 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 29 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Do_enter(opari2_region_3, & opari2_ctc_3 ) #line 29 "test3.f90" !$omp do do 13,i = 1,8 a=a+1 13 continue #line 33 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Do_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 33 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 34 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 34 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 35 "test3.f90" call POMP2_Do_enter(opari2_region_5, & opari2_ctc_5 ) #line 35 "test3.f90" !$omp do do 14,i = 1,8 a=a+1 14 continue #line 38 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 39 "test3.f90" call POMP2_Atomic_enter(opari2_region_6, & opari2_ctc_6 ) #line 39 "test3.f90" !$omp atomic me = me + omp_get_thread_num() call POMP2_Atomic_exit(opari2_region_6) #line 41 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 41 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 42 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_7,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_7 ) #line 43 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_7) call POMP2_Do_enter(opari2_region_7, & opari2_ctc_7 ) #line 43 "test3.f90" !$omp do do 15,i = 1,8 15 a=a+1 #line 45 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_7,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, pomp2_old_task) call POMP2_Do_exit(opari2_region_7) call POMP2_Parallel_end(opari2_region_7) #line 45 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_7, pomp2_old_task) #line 46 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_8,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_8 ) #line 46 "test3.f90" !$omp parallel private(me,glob) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) #line 47 "test3.f90" me = omp_get_thread_num() call POMP2_Implicit_barrier_enter(opari2_region_8,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, pomp2_old_task) call POMP2_Parallel_end(opari2_region_8) #line 48 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, pomp2_old_task) #line 49 "test3.f90" ! ********************** ! * nested parallelism * ! ********************** pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_9,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_9 ) #line 54 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) #line 55 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_10 ) #line 55 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) #line 56 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_11,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_11 ) #line 56 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_11) #line 57 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_12,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_12 ) #line 57 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_12) call POMP2_Do_enter(opari2_region_12, & opari2_ctc_12 ) #line 57 "test3.f90" !$omp do do i = 1,8 a=a+1 enddo #line 61 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_12,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, pomp2_old_task) call POMP2_Do_exit(opari2_region_12) call POMP2_Parallel_end(opari2_region_12) #line 61 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_12, pomp2_old_task) #line 62 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_11,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_11, pomp2_old_task) call POMP2_Parallel_end(opari2_region_11) #line 62 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_11, pomp2_old_task) #line 63 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_10,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, pomp2_old_task) call POMP2_Parallel_end(opari2_region_10) #line 63 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, pomp2_old_task) #line 64 "test3.f90" call POMP2_Implicit_barrier_enter(opari2_region_9,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, pomp2_old_task) call POMP2_Parallel_end(opari2_region_9) #line 64 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, pomp2_old_task) #line 65 "test3.f90" ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_13,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_13 ) #line 70 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_13) call POMP2_Do_enter(opari2_region_13, & opari2_ctc_13 ) #line 70 "test3.f90" !$omp do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue #line 75 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_13,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, pomp2_old_task) call POMP2_Do_exit(opari2_region_13) call POMP2_Parallel_end(opari2_region_13) #line 75 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_13, pomp2_old_task) #line 76 "test3.f90" do 17,i = 1,8 pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_14 ) #line 77 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) call POMP2_Do_enter(opari2_region_14, & opari2_ctc_14 ) #line 77 "test3.f90" !$omp do do 18, j = 1,8 a=a+1 18 continue #line 80 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_14,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, pomp2_old_task) call POMP2_Do_exit(opari2_region_14) call POMP2_Parallel_end(opari2_region_14) #line 80 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, pomp2_old_task) #line 81 "test3.f90" 17 continue pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_15,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_15 ) #line 83 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_15) call POMP2_Do_enter(opari2_region_15, & opari2_ctc_15 ) #line 83 "test3.f90" !$omp do do if (a .gt. 0) then exit endif enddo #line 89 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_15,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_15, pomp2_old_task) call POMP2_Do_exit(opari2_region_15) call POMP2_Parallel_end(opari2_region_15) #line 89 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_15, pomp2_old_task) #line 90 "test3.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_16,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_16 ) #line 90 "test3.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_16) call POMP2_Do_enter(opari2_region_16, & opari2_ctc_16 ) #line 90 "test3.f90" !$omp do loopLabel: do i = 1,8 a=a+1 end do loopLabel #line 94 "test3.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_16,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_16, pomp2_old_task) call POMP2_Do_exit(opari2_region_16) call POMP2_Parallel_end(opari2_region_16) #line 94 "test3.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_16, pomp2_old_task) #line 95 "test3.f90" end program test3 subroutine POMP2_Init_reg_000() include 'test3.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) end opari2-2.0.9/test/data/PaxHeaders/test3.f90.opari.inc.out0000644000000000000000000000013214770056734017752 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test3.f90.opari.inc.out0000644000175100001440000000714414770056734020310 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test3.f90:22:22*escl=test3.f90:27:27**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "58*regionType=do*sscl=test3.f90:23:23*escl=test3.f90:26:26**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "66*regionType=paralleldo*sscl=test3.f90:29:29*escl=test3.f90:33:33**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "64*regionType=parallel*sscl=test3.f90:34:34*escl=test3.f90:41:41**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "58*regionType=do*sscl=test3.f90:35:35*escl=test3.f90:38:38**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "62*regionType=atomic*sscl=test3.f90:39:39*escl=test3.f90:40:40**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "66*regionType=paralleldo*sscl=test3.f90:43:43*escl=test3.f90:45:45**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "64*regionType=parallel*sscl=test3.f90:46:46*escl=test3.f90:48:48**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "64*regionType=parallel*sscl=test3.f90:54:54*escl=test3.f90:64:64**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "64*regionType=parallel*sscl=test3.f90:55:55*escl=test3.f90:63:63**" INTEGER( KIND=8 ) :: opari2_region_11 CHARACTER (LEN=999), parameter :: opari2_ctc_11 =& "64*regionType=parallel*sscl=test3.f90:56:56*escl=test3.f90:62:62**" INTEGER( KIND=8 ) :: opari2_region_12 CHARACTER (LEN=999), parameter :: opari2_ctc_12 =& "66*regionType=paralleldo*sscl=test3.f90:57:57*escl=test3.f90:61:61**" INTEGER( KIND=8 ) :: opari2_region_13 CHARACTER (LEN=999), parameter :: opari2_ctc_13 =& "66*regionType=paralleldo*sscl=test3.f90:70:70*escl=test3.f90:75:75**" INTEGER( KIND=8 ) :: opari2_region_14 CHARACTER (LEN=999), parameter :: opari2_ctc_14 =& "66*regionType=paralleldo*sscl=test3.f90:77:77*escl=test3.f90:80:80**" INTEGER( KIND=8 ) :: opari2_region_15 CHARACTER (LEN=999), parameter :: opari2_ctc_15 =& "66*regionType=paralleldo*sscl=test3.f90:83:83*escl=test3.f90:89:89**" INTEGER( KIND=8 ) :: opari2_region_16 CHARACTER (LEN=999), parameter :: opari2_ctc_16 =& "66*regionType=paralleldo*sscl=test3.f90:90:90*escl=test3.f90:94:94**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10,& opari2_region_11,& opari2_region_12,& opari2_region_13,& opari2_region_14,& opari2_region_15,& opari2_region_16 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test3.f900000644000000000000000000000013214770056734015263 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test3.f900000644000175100001440000000365614770056734015625 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 integer i, j, k !$OMP parallel !$OMP do do 12,i = 1,8 a=a+1 12 continue !$OMP end parallel !$OMP parallel do do 13,i = 1,8 a=a+1 13 continue !$OMP parallel !$OMP do do 14,i = 1,8 a=a+1 14 continue !$OMP atomic me = me + omp_get_thread_num() !$OMP end parallel !$OMP parallel do do 15,i = 1,8 15 a=a+1 !$OMP parallel private(me,glob) me = omp_get_thread_num() !$OMP end parallel ! ********************** ! * nested parallelism * ! ********************** !$omp parallel !$omp parallel !$omp parallel !$omp parallel do do i = 1,8 a=a+1 enddo !$omp end parallel do !$omp end parallel !$omp end parallel !$omp end parallel ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* !$OMP parallel do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue do 17,i = 1,8 !$OMP parallel do do 18, j = 1,8 a=a+1 18 continue 17 continue !$omp parallel do do if (a .gt. 0) then exit endif enddo !$OMP parallel do loopLabel: do i = 1,8 a=a+1 end do loopLabel end program test3 opari2-2.0.9/test/data/PaxHeaders/test3.f.out0000644000000000000000000000013214770056734015720 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test3.f.out0000644000175100001440000003274514770056734016263 0ustar00builderusers #line 1 "test3.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 include 'test3.f.opari.inc' #line 20 "test3.f" integer i, j, k real end_level, dolic pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 23 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 24 "test3.f" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 24 "test3.f" c$omp do do 12,i = 1,8 a=a+1 12 continue #line 27 "test3.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 28 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 28 "test3.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 29 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_3 ) #line 30 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) call POMP2_Do_enter(opari2_region_3, &opari2_ctc_3 ) #line 30 "test3.f" c$omp do do 13,i = 1,8 a=a+1 13 continue #line 34 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_3, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, &pomp2_old_task) call POMP2_Do_exit(opari2_region_3) call POMP2_Parallel_end(opari2_region_3) #line 34 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, &pomp2_old_task) #line 35 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 35 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 36 "test3.f" call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 36 "test3.f" c$omp do do 14,i = 1,8 a=a+1 14 continue #line 39 "test3.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 40 "test3.f" call POMP2_Atomic_enter(opari2_region_6, &opari2_ctc_6 ) #line 40 "test3.f" c$omp atomic me = me + omp_get_thread_num() call POMP2_Atomic_exit(opari2_region_6) #line 42 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_4, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 42 "test3.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 43 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_7, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_7 ) #line 44 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_7) call POMP2_Do_enter(opari2_region_7, &opari2_ctc_7 ) #line 44 "test3.f" c$omp do do 15,i = 1,8 15 a=a+1 #line 46 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Do_exit(opari2_region_7) call POMP2_Parallel_end(opari2_region_7) #line 46 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_7, &pomp2_old_task) #line 47 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_8, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_8 ) #line 47 "test3.f" c$omp parallel private(me,glob) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) #line 48 "test3.f" me = omp_get_thread_num() call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_8) #line 49 "test3.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_8, &pomp2_old_task) #line 50 "test3.f" ! ********************** ! * nested parallelism * ! ********************** pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_9, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_9 ) #line 55 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) #line 56 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_10 ) #line 56 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) #line 57 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_11, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_11 ) #line 57 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_11) #line 58 "test3.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_12, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_12 ) #line 58 "test3.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_12) call POMP2_Do_enter(opari2_region_12, &opari2_ctc_12 ) #line 58 "test3.f" !$omp do do i = 1,8 end_level = end_level + dolic/i a=a+1 end do #line 63 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_12, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, &pomp2_old_task) call POMP2_Do_exit(opari2_region_12) call POMP2_Parallel_end(opari2_region_12) #line 63 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_12, &pomp2_old_task) #line 64 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_11, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_11, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_11) #line 64 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_11, &pomp2_old_task) #line 65 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_10, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_10) #line 65 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, &pomp2_old_task) #line 66 "test3.f" call POMP2_Implicit_barrier_enter(opari2_region_9, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_9) #line 66 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, &pomp2_old_task) #line 67 "test3.f" ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_13, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_13 ) #line 71 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_13) call POMP2_Do_enter(opari2_region_13, &opari2_ctc_13 ) #line 71 "test3.f" c$omp do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue #line 76 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_13, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, &pomp2_old_task) call POMP2_Do_exit(opari2_region_13) call POMP2_Parallel_end(opari2_region_13) #line 76 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_13, &pomp2_old_task) #line 77 "test3.f" do 17,i = 1,8 pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_14 ) #line 78 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) call POMP2_Do_enter(opari2_region_14, &opari2_ctc_14 ) #line 78 "test3.f" c$omp do do 18, j = 1,8 a=a+1 18 continue #line 81 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_14, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, &pomp2_old_task) call POMP2_Do_exit(opari2_region_14) call POMP2_Parallel_end(opari2_region_14) #line 81 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, &pomp2_old_task) #line 82 "test3.f" 17 continue pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_15, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_15 ) #line 84 "test3.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_15) call POMP2_Do_enter(opari2_region_15, &opari2_ctc_15 ) #line 84 "test3.f" c$omp do do if (a .gt. 0) then exit endif enddo #line 89 "test3.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_15, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_15, &pomp2_old_task) call POMP2_Do_exit(opari2_region_15) call POMP2_Parallel_end(opari2_region_15) #line 89 "test3.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_15, &pomp2_old_task) #line 90 "test3.f" end program test3 subroutine POMP2_Init_reg_000() include 'test3.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) end opari2-2.0.9/test/data/PaxHeaders/test3.f.opari.inc.out0000644000000000000000000000013214770056734017601 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test3.f.opari.inc.out0000644000175100001440000000670114770056734020135 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test3.f:23:23*escl=test3.f:28:2"// &"8**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"56*regionType=do*sscl=test3.f:24:24*escl=test3.f:27:27**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"64*regionType=paralleldo*sscl=test3.f:30:30*escl=test3.f:34"// &":34**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"62*regionType=parallel*sscl=test3.f:35:35*escl=test3.f:42:4"// &"2**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"56*regionType=do*sscl=test3.f:36:36*escl=test3.f:39:39**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"60*regionType=atomic*sscl=test3.f:40:40*escl=test3.f:41:41*"// &"*") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"64*regionType=paralleldo*sscl=test3.f:44:44*escl=test3.f:46"// &":46**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"62*regionType=parallel*sscl=test3.f:47:47*escl=test3.f:49:4"// &"9**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"62*regionType=parallel*sscl=test3.f:55:55*escl=test3.f:66:6"// &"6**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"62*regionType=parallel*sscl=test3.f:56:56*escl=test3.f:65:6"// &"5**") INTEGER*8 opari2_region_11 CHARACTER*999 opari2_ctc_11 PARAMETER (opari2_ctc_11= &"62*regionType=parallel*sscl=test3.f:57:57*escl=test3.f:64:6"// &"4**") INTEGER*8 opari2_region_12 CHARACTER*999 opari2_ctc_12 PARAMETER (opari2_ctc_12= &"64*regionType=paralleldo*sscl=test3.f:58:58*escl=test3.f:63"// &":63**") INTEGER*8 opari2_region_13 CHARACTER*999 opari2_ctc_13 PARAMETER (opari2_ctc_13= &"64*regionType=paralleldo*sscl=test3.f:71:71*escl=test3.f:76"// &":76**") INTEGER*8 opari2_region_14 CHARACTER*999 opari2_ctc_14 PARAMETER (opari2_ctc_14= &"64*regionType=paralleldo*sscl=test3.f:78:78*escl=test3.f:81"// &":81**") INTEGER*8 opari2_region_15 CHARACTER*999 opari2_ctc_15 PARAMETER (opari2_ctc_15= &"64*regionType=paralleldo*sscl=test3.f:84:84*escl=test3.f:89"// &":89**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10, & opari2_region_11, & opari2_region_12, & opari2_region_13, & opari2_region_14, & opari2_region_15 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test3.f0000644000000000000000000000013214770056734015112 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test3.f0000644000175100001440000000371314770056734015446 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Special tests for end pragma substitution and nested parallel regions/loops. program test3 integer i, j, k real end_level, dolic c$OMP parallel c$OMP do do 12,i = 1,8 a=a+1 12 continue c$OMP end parallel c$OMP parallel do do 13,i = 1,8 a=a+1 13 continue c$OMP parallel c$OMP do do 14,i = 1,8 a=a+1 14 continue c$OMP atomic me = me + omp_get_thread_num() c$OMP end parallel c$OMP parallel do do 15,i = 1,8 15 a=a+1 c$OMP parallel private(me,glob) me = omp_get_thread_num() c$OMP end parallel ! ********************** ! * nested parallelism * ! ********************** !$omp parallel !$omp parallel !$omp parallel !$omp parallel do do i = 1,8 end_level = end_level + dolic/i a=a+1 end do !$omp end parallel do !$omp end parallel !$omp end parallel !$omp end parallel ! ******************************************* ! * end pragma substitution in nested loops * ! ******************************************* c$OMP parallel do do 16, i = 1,8 do 16, j = 1,8 a=a+1 16 continue do 17,i = 1,8 c$OMP parallel do do 18, j = 1,8 a=a+1 18 continue 17 continue c$omp parallel do do if (a .gt. 0) then exit endif enddo end program test3 opari2-2.0.9/test/data/PaxHeaders/test3.c.out0000644000000000000000000000013214770056734015715 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test3.c.out0000644000175100001440000002532614770056734016255 0ustar00builderusers#include "test3.c.opari.inc" #line 1 "test3.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Special tests for code blocks and nested parallel regions/loops. */ #include #ifdef _OPENMP #endif int main() { int i, j; int k = 0; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 31 "test3.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 32 "test3.c" { { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 33 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_For_exit( &opari2_region_2 ); } #line 38 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 39 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_3, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_3 ); #line 40 "test3.c" #pragma omp parallel POMP2_DLIST_00003 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_3 ); #line 41 "test3.c" { POMP2_For_enter( &opari2_region_4, opari2_ctc_4 ); #line 41 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_4, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_4, pomp2_old_task ); } POMP2_For_exit( &opari2_region_4 ); } #line 46 "test3.c" { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_3, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_3, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_3 ); } POMP2_Parallel_join( &opari2_region_3, pomp2_old_task ); } #line 46 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_5, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_5 ); #line 47 "test3.c" #pragma omp parallel POMP2_DLIST_00005 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_5 ); #line 48 "test3.c" { #line 49 "test3.c" #pragma omp master { POMP2_Master_begin( &opari2_region_6, opari2_ctc_6 ); #line 50 "test3.c" for (i=0; i<4; ++i) k++; POMP2_Master_end( &opari2_region_6 ); } #line 52 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_5, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_5, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_5 ); } POMP2_Parallel_join( &opari2_region_5, pomp2_old_task ); } #line 53 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_7, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_7 ); #line 54 "test3.c" #pragma omp parallel POMP2_DLIST_00007 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_7 ); #line 55 "test3.c" { { POMP2_Single_enter( &opari2_region_8, opari2_ctc_8 ); #line 56 "test3.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_8 ); #line 57 "test3.c" for (i=0; i<4; ++i) k++; POMP2_Single_end( &opari2_region_8 ); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_8, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_8, pomp2_old_task ); } POMP2_Single_exit( &opari2_region_8 ); } #line 58 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_7, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_7, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_7 ); } POMP2_Parallel_join( &opari2_region_7, pomp2_old_task ); } #line 59 "test3.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_9, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_9 ); #line 60 "test3.c" #pragma omp parallel POMP2_DLIST_00009 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_9 ); #line 61 "test3.c" { POMP2_Critical_enter( &opari2_region_10, opari2_ctc_10 ); #line 61 "test3.c" #pragma omp critical { POMP2_Critical_begin( &opari2_region_10 ); #line 62 "test3.c" for (i=0; i<4; ++i) k++; POMP2_Critical_end( &opari2_region_10 ); } POMP2_Critical_exit( &opari2_region_10 ); } #line 63 "test3.c" { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_9, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_9, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_9 ); } POMP2_Parallel_join( &opari2_region_9, pomp2_old_task ); } #line 63 "test3.c" // ***************************************** // * Testing of nested parallelism * // ***************************************** { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_11, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_11 ); #line 68 "test3.c" #pragma omp parallel POMP2_DLIST_00011 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_11 ); #line 69 "test3.c" { { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_12, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_12 ); #line 70 "test3.c" #pragma omp parallel POMP2_DLIST_00012 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_12 ); #line 71 "test3.c" { { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_13, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_13 ); #line 72 "test3.c" #pragma omp parallel POMP2_DLIST_00013 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_13 ); #line 73 "test3.c" { { POMP2_For_enter( &opari2_region_14, opari2_ctc_14 ); #line 74 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { printf("do %d\n", i); } POMP2_For_exit( &opari2_region_14 ); } #line 78 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_13, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_13, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_13 ); } POMP2_Parallel_join( &opari2_region_13, pomp2_old_task ); } #line 79 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_12, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_12, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_12 ); } POMP2_Parallel_join( &opari2_region_12, pomp2_old_task ); } #line 80 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_11, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_11, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_11 ); } POMP2_Parallel_join( &opari2_region_11, pomp2_old_task ); } #line 81 "test3.c" // ***************************************** // * Testing of nested for loops * // ***************************************** { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_15, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_15 ); #line 86 "test3.c" #pragma omp parallel POMP2_DLIST_00015 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_15 ); #line 87 "test3.c" { { POMP2_For_enter( &opari2_region_16, opari2_ctc_16 ); #line 88 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { printf("do %d\n", i); } } POMP2_For_exit( &opari2_region_16 ); } #line 94 "test3.c" { POMP2_For_enter( &opari2_region_17, opari2_ctc_17 ); #line 95 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { for (k=0; k<4; ++k) { printf("do %d\n", i); } } } POMP2_For_exit( &opari2_region_17 ); } #line 103 "test3.c" { POMP2_For_enter( &opari2_region_18, opari2_ctc_18 ); #line 104 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) printf("do %d\n", i); POMP2_For_exit( &opari2_region_18 ); } #line 108 "test3.c" { POMP2_For_enter( &opari2_region_19, opari2_ctc_19 ); #line 109 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) for (k=0; k<4; ++k) printf("do %d\n", i); POMP2_For_exit( &opari2_region_19 ); } #line 114 "test3.c" { POMP2_For_enter( &opari2_region_20, opari2_ctc_20 ); #line 115 "test3.c" #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) { printf("do %d\n", i); } POMP2_For_exit( &opari2_region_20 ); } #line 120 "test3.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_15, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_15, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_15 ); } POMP2_Parallel_join( &opari2_region_15, pomp2_old_task ); } #line 121 "test3.c" } opari2-2.0.9/test/data/PaxHeaders/test3.c.opari.inc.out0000644000000000000000000000013214770056734017576 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test3.c.opari.inc.out0000644000175100001440000001150114770056734020124 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test3.c:31:31*escl=test3.c:38:38**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "56*regionType=for*sscl=test3.c:33:33*escl=test3.c:37:37**" #define POMP2_DLIST_00003 shared(opari2_region_3,opari2_region_4) static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "61*regionType=parallel*sscl=test3.c:40:40*escl=test3.c:45:45**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "56*regionType=for*sscl=test3.c:41:41*escl=test3.c:45:45**" #define POMP2_DLIST_00005 shared(opari2_region_5,opari2_region_6) static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "61*regionType=parallel*sscl=test3.c:47:47*escl=test3.c:52:52**" static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "59*regionType=master*sscl=test3.c:49:49*escl=test3.c:51:51**" #define POMP2_DLIST_00007 shared(opari2_region_7,opari2_region_8) static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "61*regionType=parallel*sscl=test3.c:54:54*escl=test3.c:58:58**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "59*regionType=single*sscl=test3.c:56:56*escl=test3.c:57:57**" #define POMP2_DLIST_00009 shared(opari2_region_9,opari2_region_10) static OPARI2_Region_handle opari2_region_9 = NULL; #define opari2_ctc_9 "61*regionType=parallel*sscl=test3.c:60:60*escl=test3.c:62:62**" static OPARI2_Region_handle opari2_region_10 = NULL; #define opari2_ctc_10 "61*regionType=critical*sscl=test3.c:61:61*escl=test3.c:62:62**" #define POMP2_DLIST_00011 shared(opari2_region_11,opari2_region_12,opari2_region_13,opari2_region_14) static OPARI2_Region_handle opari2_region_11 = NULL; #define opari2_ctc_11 "61*regionType=parallel*sscl=test3.c:68:68*escl=test3.c:80:80**" #define POMP2_DLIST_00012 shared(opari2_region_12,opari2_region_13,opari2_region_14) static OPARI2_Region_handle opari2_region_12 = NULL; #define opari2_ctc_12 "61*regionType=parallel*sscl=test3.c:70:70*escl=test3.c:79:79**" #define POMP2_DLIST_00013 shared(opari2_region_13,opari2_region_14) static OPARI2_Region_handle opari2_region_13 = NULL; #define opari2_ctc_13 "61*regionType=parallel*sscl=test3.c:72:72*escl=test3.c:78:78**" static OPARI2_Region_handle opari2_region_14 = NULL; #define opari2_ctc_14 "68*regionType=for*sscl=test3.c:74:74*escl=test3.c:77:77*hasNowait=1**" #define POMP2_DLIST_00015 shared(opari2_region_15,opari2_region_16,opari2_region_17,opari2_region_18,opari2_region_19,opari2_region_20) static OPARI2_Region_handle opari2_region_15 = NULL; #define opari2_ctc_15 "63*regionType=parallel*sscl=test3.c:86:86*escl=test3.c:120:120**" static OPARI2_Region_handle opari2_region_16 = NULL; #define opari2_ctc_16 "68*regionType=for*sscl=test3.c:88:88*escl=test3.c:93:93*hasNowait=1**" static OPARI2_Region_handle opari2_region_17 = NULL; #define opari2_ctc_17 "70*regionType=for*sscl=test3.c:95:95*escl=test3.c:102:102*hasNowait=1**" static OPARI2_Region_handle opari2_region_18 = NULL; #define opari2_ctc_18 "72*regionType=for*sscl=test3.c:104:104*escl=test3.c:107:107*hasNowait=1**" static OPARI2_Region_handle opari2_region_19 = NULL; #define opari2_ctc_19 "72*regionType=for*sscl=test3.c:109:109*escl=test3.c:113:113*hasNowait=1**" static OPARI2_Region_handle opari2_region_20 = NULL; #define opari2_ctc_20 "72*regionType=for*sscl=test3.c:115:115*escl=test3.c:119:119*hasNowait=1**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); POMP2_Assign_handle( &opari2_region_9, opari2_ctc_9 ); POMP2_Assign_handle( &opari2_region_10, opari2_ctc_10 ); POMP2_Assign_handle( &opari2_region_11, opari2_ctc_11 ); POMP2_Assign_handle( &opari2_region_12, opari2_ctc_12 ); POMP2_Assign_handle( &opari2_region_13, opari2_ctc_13 ); POMP2_Assign_handle( &opari2_region_14, opari2_ctc_14 ); POMP2_Assign_handle( &opari2_region_15, opari2_ctc_15 ); POMP2_Assign_handle( &opari2_region_16, opari2_ctc_16 ); POMP2_Assign_handle( &opari2_region_17, opari2_ctc_17 ); POMP2_Assign_handle( &opari2_region_18, opari2_ctc_18 ); POMP2_Assign_handle( &opari2_region_19, opari2_ctc_19 ); POMP2_Assign_handle( &opari2_region_20, opari2_ctc_20 ); } opari2-2.0.9/test/data/PaxHeaders/test3.c0000644000000000000000000000013214770056734015107 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test3.c0000644000175100001440000000444114770056734015442 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Special tests for code blocks and nested parallel regions/loops. */ #include #ifdef _OPENMP #include #endif int main() { int i, j; int k = 0; #pragma omp parallel { #pragma omp for for (i=0; i<4; ++i) { k++; } } #pragma omp parallel #pragma omp for for (i=0; i<4; ++i) { k++; } #pragma omp parallel { #pragma omp master for (i=0; i<4; ++i) k++; } #pragma omp parallel { #pragma omp single for (i=0; i<4; ++i) k++; } #pragma omp parallel #pragma omp critical for (i=0; i<4; ++i) k++; // ***************************************** // * Testing of nested parallelism * // ***************************************** #pragma omp parallel { #pragma omp parallel { #pragma omp parallel { #pragma omp for nowait for (i=0; i<4; ++i) { printf("do %d\n", i); } } } } // ***************************************** // * Testing of nested for loops * // ***************************************** #pragma omp parallel { #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { printf("do %d\n", i); } } #pragma omp for nowait for (i=0; i<4; ++i) { for (j=0; j<4; ++j) { for (k=0; k<4; ++k) { printf("do %d\n", i); } } } #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) printf("do %d\n", i); #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) for (k=0; k<4; ++k) printf("do %d\n", i); #pragma omp for nowait for (i=0; i<4; ++i) for (j=0; j<4; ++j) { printf("do %d\n", i); } } } opari2-2.0.9/test/data/PaxHeaders/test2.f90.out0000644000000000000000000000013214770056734016070 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test2.f90.out0000644000175100001440000002174614770056734016432 0ustar00builderusers #line 1 "test2.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 include 'test2.f90.opari.inc' #line 20 "test2.f90" integer i integer k integer, save :: j #line 24 "test2.f90" !$omp threadprivate(j) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 26 "test2.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test2.f90" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, & opari2_ctc_2 ) #line 28 "test2.f90" !$omp do do i=1,4 write(*,*) "do",i enddo #line 32 "test2.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 33 "test2.f90" call POMP2_Flush_enter(opari2_region_3, & opari2_ctc_3 ) #line 34 "test2.f90" !$omp flush(k) call POMP2_Flush_exit(opari2_region_3) #line 35 "test2.f90" call POMP2_Do_enter(opari2_region_4, & opari2_ctc_4 ) #line 36 "test2.f90" !$omp do ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_5, & opari2_ctc_5 ) #line 38 "test2.f90" !$omp ordered call POMP2_Ordered_begin(opari2_region_5) #line 39 "test2.f90" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_5) #line 40 "test2.f90" !$omp end ordered call POMP2_Ordered_exit(opari2_region_5) #line 41 "test2.f90" enddo #line 42 "test2.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Do_exit(opari2_region_4) #line 43 "test2.f90" call POMP2_Barrier_enter(opari2_region_6,& pomp2_old_task, opari2_ctc_6 ) #line 44 "test2.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_6, pomp2_old_task) #line 45 "test2.f90" call POMP2_Sections_enter(opari2_region_7, & opari2_ctc_7 ) #line 46 "test2.f90" !$omp sections #line 47 "test2.f90" !$omp section call POMP2_Section_begin(opari2_region_7, & opari2_ctc_7 ) #line 48 "test2.f90" write(*,*) "section 1" call POMP2_Section_end(opari2_region_7) #line 49 "test2.f90" !$omp section call POMP2_Section_begin(opari2_region_7, & opari2_ctc_7 ) #line 50 "test2.f90" write(*,*) "section 2" call POMP2_Section_end(opari2_region_7) #line 51 "test2.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_7,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, pomp2_old_task) call POMP2_Sections_exit(opari2_region_7) #line 52 "test2.f90" #line 53 "test2.f90" !$omp master call POMP2_Master_begin(opari2_region_8, & opari2_ctc_8 ) #line 54 "test2.f90" write(*,*) "master" call POMP2_Master_end(opari2_region_8) #line 55 "test2.f90" !$omp end master call POMP2_Critical_enter(opari2_region_9, & opari2_ctc_9 ) #line 57 "test2.f90" !$omp critical call POMP2_Critical_begin(opari2_region_9) #line 58 "test2.f90" write(*,*) "critical" call POMP2_Critical_end(opari2_region_9) #line 59 "test2.f90" !$omp end critical call POMP2_Critical_exit(opari2_region_9) #line 60 "test2.f90" call POMP2_Critical_enter(opari2_region_10, & opari2_ctc_10 ) #line 61 "test2.f90" !$omp critical(foobar) call POMP2_Critical_begin(opari2_region_10) #line 62 "test2.f90" write(*,*) "critical(foobar)" call POMP2_Critical_end(opari2_region_10) #line 63 "test2.f90" !$omp end critical(foobar) call POMP2_Critical_exit(opari2_region_10) #line 64 "test2.f90" call POMP2_Atomic_enter(opari2_region_11, & opari2_ctc_11 ) #line 65 "test2.f90" !$omp atomic ! do this atomic i = i + 1 call POMP2_Atomic_exit(opari2_region_11) #line 68 "test2.f90" call POMP2_Single_enter(opari2_region_12, & opari2_ctc_12 ) #line 69 "test2.f90" !$omp single call POMP2_Single_begin(opari2_region_12) #line 70 "test2.f90" write(*,*) "single" call POMP2_Single_end(opari2_region_12) #line 71 "test2.f90" !$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_12,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, pomp2_old_task) call POMP2_Single_exit(opari2_region_12) #line 72 "test2.f90" call POMP2_Workshare_enter(opari2_region_13, & opari2_ctc_13 ) #line 73 "test2.f90" !$omp workshare a = b + c #line 75 "test2.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_13,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_13) #line 76 "test2.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 77 "test2.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 78 "test2.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_14 ) #line 79 "test2.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) #line 80 "test2.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_15, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_15 ) end if #line 80 "test2.f90" !$omp task if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_15, pomp2_new_task) end if #line 81 "test2.f90" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_15) end if #line 82 "test2.f90" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_15, pomp2_old_task) end if #line 83 "test2.f90" call POMP2_Taskwait_begin(opari2_region_16,& pomp2_old_task, opari2_ctc_16 ) #line 84 "test2.f90" !$omp taskwait call POMP2_Taskwait_end(opari2_region_16, pomp2_old_task) #line 85 "test2.f90" call POMP2_Implicit_barrier_enter(opari2_region_14,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, pomp2_old_task) call POMP2_Parallel_end(opari2_region_14) #line 85 "test2.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, pomp2_old_task) #line 86 "test2.f90" ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 subroutine POMP2_Init_reg_000() include 'test2.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) end opari2-2.0.9/test/data/PaxHeaders/test2.f90.opari.inc.out0000644000000000000000000000013214770056734017751 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test2.f90.opari.inc.out0000644000175100001440000000717114770056734020307 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test2.f90:26:26*escl=test2.f90:77:77**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "58*regionType=do*sscl=test2.f90:28:28*escl=test2.f90:32:32**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "61*regionType=flush*sscl=test2.f90:34:34*escl=test2.f90:34:34**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "71*regionType=do*sscl=test2.f90:36:36*escl=test2.f90:42:42*hasOrdered=1**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "63*regionType=ordered*sscl=test2.f90:38:38*escl=test2.f90:40:40**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "63*regionType=barrier*sscl=test2.f90:44:44*escl=test2.f90:44:44**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "78*regionType=sections*sscl=test2.f90:46:46*escl=test2.f90:51:51*numSections=2**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "62*regionType=master*sscl=test2.f90:53:53*escl=test2.f90:55:55**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "64*regionType=critical*sscl=test2.f90:57:57*escl=test2.f90:59:59**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "84*regionType=critical*sscl=test2.f90:61:61*escl=test2.f90:63:63*criticalName=foobar**" INTEGER( KIND=8 ) :: opari2_region_11 CHARACTER (LEN=999), parameter :: opari2_ctc_11 =& "62*regionType=atomic*sscl=test2.f90:65:65*escl=test2.f90:67:67**" INTEGER( KIND=8 ) :: opari2_region_12 CHARACTER (LEN=999), parameter :: opari2_ctc_12 =& "62*regionType=single*sscl=test2.f90:69:69*escl=test2.f90:71:71**" INTEGER( KIND=8 ) :: opari2_region_13 CHARACTER (LEN=999), parameter :: opari2_ctc_13 =& "65*regionType=workshare*sscl=test2.f90:73:73*escl=test2.f90:75:75**" INTEGER( KIND=8 ) :: opari2_region_14 CHARACTER (LEN=999), parameter :: opari2_ctc_14 =& "64*regionType=parallel*sscl=test2.f90:79:79*escl=test2.f90:85:85**" INTEGER( KIND=8 ) :: opari2_region_15 CHARACTER (LEN=999), parameter :: opari2_ctc_15 =& "60*regionType=task*sscl=test2.f90:80:80*escl=test2.f90:82:82**" INTEGER( KIND=8 ) :: opari2_region_16 CHARACTER (LEN=999), parameter :: opari2_ctc_16 =& "64*regionType=taskwait*sscl=test2.f90:84:84*escl=test2.f90:84:84**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10,& opari2_region_11,& opari2_region_12,& opari2_region_13,& opari2_region_14,& opari2_region_15,& opari2_region_16 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test2.f900000644000000000000000000000013214770056734015262 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test2.f900000644000175100001440000000330714770056734015615 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 integer i integer k integer, save :: j !$omp threadprivate(j) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do",i enddo !$omp end do !$omp flush(k) !$omp do ordered do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered enddo !$omp end do !$omp barrier !$omp sections !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp master write(*,*) "master" !$omp end master !$omp critical write(*,*) "critical" !$omp end critical !$omp critical(foobar) write(*,*) "critical(foobar)" !$omp end critical(foobar) !$omp atomic ! do this atomic i = i + 1 !$omp single write(*,*) "single" !$omp end single !$omp workshare a = b + c !$omp end workshare !$omp end parallel !$omp parallel !$omp task write(*,*) "task" !$omp end task !$omp taskwait !$omp end parallel ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 opari2-2.0.9/test/data/PaxHeaders/test2.f.out0000644000000000000000000000013214770056734015717 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test2.f.out0000644000175100001440000002175214770056734016256 0ustar00builderusers #line 1 "test2.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 include 'test2.f.opari.inc' #line 20 "test2.f" integer i integer k integer, save :: j #line 24 "test2.f" !$omp threadprivate(j) pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test2.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test2.f" write(*,*) "parallel" call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 29 "test2.f" !$omp do do i=1,4 write(*,*) "do",i k = k + 1 enddo #line 34 "test2.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 35 "test2.f" call POMP2_Flush_enter(opari2_region_3, &opari2_ctc_3 ) #line 36 "test2.f" !$omp flush(k) call POMP2_Flush_exit(opari2_region_3) #line 37 "test2.f" call POMP2_Barrier_enter(opari2_region_4, &pomp2_old_task, &opari2_ctc_4 ) #line 38 "test2.f" !$omp barrier call POMP2_Barrier_exit(opari2_region_4, &pomp2_old_task) #line 39 "test2.f" call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 40 "test2.f" !$omp do ordered do i=1,4 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 42 "test2.f" !$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 43 "test2.f" write(*,*) "do",i call POMP2_Ordered_end(opari2_region_6) #line 44 "test2.f" !$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 45 "test2.f" enddo #line 46 "test2.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 47 "test2.f" call POMP2_Sections_enter(opari2_region_7, &opari2_ctc_7 ) #line 48 "test2.f" !$omp sections #line 49 "test2.f" !$omp section call POMP2_Section_begin(opari2_region_7, &opari2_ctc_7 ) #line 50 "test2.f" write(*,*) "section 1" call POMP2_Section_end(opari2_region_7) #line 51 "test2.f" !$omp section call POMP2_Section_begin(opari2_region_7, &opari2_ctc_7 ) #line 52 "test2.f" write(*,*) "section 2" call POMP2_Section_end(opari2_region_7) #line 53 "test2.f" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Sections_exit(opari2_region_7) #line 54 "test2.f" #line 55 "test2.f" !$omp master call POMP2_Master_begin(opari2_region_8, &opari2_ctc_8 ) #line 56 "test2.f" write(*,*) "master" call POMP2_Master_end(opari2_region_8) #line 57 "test2.f" !$omp end master call POMP2_Critical_enter(opari2_region_9, &opari2_ctc_9 ) #line 59 "test2.f" !$omp critical call POMP2_Critical_begin(opari2_region_9) #line 60 "test2.f" write(*,*) "critical" call POMP2_Critical_end(opari2_region_9) #line 61 "test2.f" !$omp end critical call POMP2_Critical_exit(opari2_region_9) #line 62 "test2.f" call POMP2_Critical_enter(opari2_region_10, &opari2_ctc_10 ) #line 63 "test2.f" !$omp critical(foobar) call POMP2_Critical_begin(opari2_region_10) #line 64 "test2.f" write(*,*) "critical(foobar)" call POMP2_Critical_end(opari2_region_10) #line 65 "test2.f" !$omp end critical(foobar) call POMP2_Critical_exit(opari2_region_10) #line 66 "test2.f" ! do this atomic call POMP2_Atomic_enter(opari2_region_11, &opari2_ctc_11 ) #line 68 "test2.f" !$omp atomic i = i + 1 call POMP2_Atomic_exit(opari2_region_11) #line 70 "test2.f" call POMP2_Single_enter(opari2_region_12, &opari2_ctc_12 ) #line 71 "test2.f" !$omp single call POMP2_Single_begin(opari2_region_12) #line 72 "test2.f" write(*,*) "single" call POMP2_Single_end(opari2_region_12) #line 73 "test2.f" !$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_12, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_12, &pomp2_old_task) call POMP2_Single_exit(opari2_region_12) #line 74 "test2.f" call POMP2_Workshare_enter(opari2_region_13, &opari2_ctc_13 ) #line 75 "test2.f" !$omp workshare a = b + c #line 77 "test2.f" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_13, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_13, &pomp2_old_task) call POMP2_Workshare_exit(opari2_region_13) #line 78 "test2.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 79 "test2.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 80 "test2.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_14, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_14 ) #line 81 "test2.f" !$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_14) #line 82 "test2.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_15, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_15 ) end if #line 82 "test2.f" !$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_15, pomp2_new_task) end if #line 83 "test2.f" write(*,*) "task" if (pomp2_if) then call POMP2_Task_end(opari2_region_15) end if #line 84 "test2.f" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_15, &pomp2_old_task) end if #line 85 "test2.f" !$omp this should be ignored by opari and the compiler call POMP2_Taskwait_begin(opari2_region_16, &pomp2_old_task, &opari2_ctc_16 ) #line 88 "test2.f" !$omp taskwait call POMP2_Taskwait_end(opari2_region_16, &pomp2_old_task) #line 89 "test2.f" call POMP2_Implicit_barrier_enter(opari2_region_14, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_14, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_14) #line 89 "test2.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_14, &pomp2_old_task) #line 90 "test2.f" ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 subroutine POMP2_Init_reg_000() include 'test2.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) end opari2-2.0.9/test/data/PaxHeaders/test2.f.opari.inc.out0000644000000000000000000000013214770056734017600 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test2.f.opari.inc.out0000644000175100001440000000727414770056734020142 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test2.f:26:26*escl=test2.f:79:7"// &"9**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"56*regionType=do*sscl=test2.f:29:29*escl=test2.f:34:34**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"59*regionType=flush*sscl=test2.f:36:36*escl=test2.f:36:36**"// &"") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"61*regionType=barrier*sscl=test2.f:38:38*escl=test2.f:38:38"// &"**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"69*regionType=do*sscl=test2.f:40:40*escl=test2.f:46:46*hasO"// &"rdered=1**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"61*regionType=ordered*sscl=test2.f:42:42*escl=test2.f:44:44"// &"**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=sections*sscl=test2.f:48:48*escl=test2.f:53:5"// &"3*numSections=2**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"60*regionType=master*sscl=test2.f:55:55*escl=test2.f:57:57*"// &"*") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"62*regionType=critical*sscl=test2.f:59:59*escl=test2.f:61:6"// &"1**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"82*regionType=critical*sscl=test2.f:63:63*escl=test2.f:65:6"// &"5*criticalName=foobar**") INTEGER*8 opari2_region_11 CHARACTER*999 opari2_ctc_11 PARAMETER (opari2_ctc_11= &"60*regionType=atomic*sscl=test2.f:68:68*escl=test2.f:69:69*"// &"*") INTEGER*8 opari2_region_12 CHARACTER*999 opari2_ctc_12 PARAMETER (opari2_ctc_12= &"60*regionType=single*sscl=test2.f:71:71*escl=test2.f:73:73*"// &"*") INTEGER*8 opari2_region_13 CHARACTER*999 opari2_ctc_13 PARAMETER (opari2_ctc_13= &"63*regionType=workshare*sscl=test2.f:75:75*escl=test2.f:77:"// &"77**") INTEGER*8 opari2_region_14 CHARACTER*999 opari2_ctc_14 PARAMETER (opari2_ctc_14= &"62*regionType=parallel*sscl=test2.f:81:81*escl=test2.f:89:8"// &"9**") INTEGER*8 opari2_region_15 CHARACTER*999 opari2_ctc_15 PARAMETER (opari2_ctc_15= &"58*regionType=task*sscl=test2.f:82:82*escl=test2.f:84:84**""// &") INTEGER*8 opari2_region_16 CHARACTER*999 opari2_ctc_16 PARAMETER (opari2_ctc_16= &"62*regionType=taskwait*sscl=test2.f:88:88*escl=test2.f:88:8"// &"8**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10, & opari2_region_11, & opari2_region_12, & opari2_region_13, & opari2_region_14, & opari2_region_15, & opari2_region_16 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test2.f0000644000000000000000000000013214770056734015111 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test2.f0000644000175100001440000000343714770056734015450 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the basic instrumentation of all directives. program test2 integer i integer k integer, save :: j !$omp threadprivate(j) !$omp parallel write(*,*) "parallel" !$omp do do i=1,4 write(*,*) "do",i k = k + 1 enddo !$omp end do !$omp flush(k) !$omp barrier !$omp do ordered do i=1,4 !$omp ordered write(*,*) "do",i !$omp end ordered enddo !$omp end do !$omp sections !$omp section write(*,*) "section 1" !$omp section write(*,*) "section 2" !$omp end sections !$omp master write(*,*) "master" !$omp end master !$omp critical write(*,*) "critical" !$omp end critical !$omp critical(foobar) write(*,*) "critical(foobar)" !$omp end critical(foobar) ! do this atomic !$omp atomic i = i + 1 !$omp single write(*,*) "single" !$omp end single !$omp workshare a = b + c !$omp end workshare !$omp end parallel !$omp parallel !$omp task write(*,*) "task" !$omp end task !$omp this should be ignored by opari and the compiler !$omp taskwait !$omp end parallel ! $ omp this should be ignored by opari and the compiler ! $ this too end program test2 opari2-2.0.9/test/data/PaxHeaders/test2.c.out0000644000000000000000000000013214770056734015714 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.195368296 opari2-2.0.9/test/data/test2.c.out0000644000175100001440000001603414770056734016250 0ustar00builderusers#include "test2.c.opari.inc" #line 1 "test2.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the basic instrumentation of all directives. */ #include #ifdef _OPENMP #endif int j; #line 27 "test2.c" #pragma omp threadprivate(j) int main() { int i; int k = 0; { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test2.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test2.c" { printf("parallel\n"); { POMP2_For_enter( &opari2_region_2, opari2_ctc_2 ); #line 37 "test2.c" #pragma omp for nowait for(i=0; i<4; ++i) { printf("for %d\n", i); k++; } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_For_exit( &opari2_region_2 ); } #line 42 "test2.c" { POMP2_Flush_enter( &opari2_region_3, opari2_ctc_3 ); #line 43 "test2.c" #pragma omp flush(k) POMP2_Flush_exit( &opari2_region_3 ); } #line 44 "test2.c" { POMP2_Task_handle pomp2_old_task; POMP2_Barrier_enter( &opari2_region_4, &pomp2_old_task, opari2_ctc_4 ); #line 45 "test2.c" #pragma omp barrier POMP2_Barrier_exit( &opari2_region_4, pomp2_old_task ); } #line 46 "test2.c" { POMP2_For_enter( &opari2_region_5, opari2_ctc_5 ); #line 47 "test2.c" #pragma omp for ordered nowait for(i=0; i<4; ++i) { { POMP2_Ordered_enter( &opari2_region_6, opari2_ctc_6 ); #line 49 "test2.c" #pragma omp ordered { POMP2_Ordered_begin( &opari2_region_6 ); #line 50 "test2.c" { printf("for %d\n", i); } POMP2_Ordered_end( &opari2_region_6 ); } POMP2_Ordered_exit( &opari2_region_6 ); } #line 53 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_5, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_5, pomp2_old_task ); } POMP2_For_exit( &opari2_region_5 ); } #line 54 "test2.c" { POMP2_Sections_enter( &opari2_region_7, opari2_ctc_7 ); #line 55 "test2.c" #pragma omp sections nowait { #line 57 "test2.c" #pragma omp section { POMP2_Section_begin( &opari2_region_7, opari2_ctc_7 ); #line 58 "test2.c" printf("section 1\n"); POMP2_Section_end( &opari2_region_7 ); } #line 59 "test2.c" #pragma omp section { POMP2_Section_begin( &opari2_region_7, opari2_ctc_7 ); #line 60 "test2.c" { printf("section 2\n"); } POMP2_Section_end( &opari2_region_7 ); } #line 61 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_7, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_7, pomp2_old_task ); } POMP2_Sections_exit( &opari2_region_7 ); } #line 62 "test2.c" #line 63 "test2.c" #pragma omp master { POMP2_Master_begin( &opari2_region_8, opari2_ctc_8 ); #line 64 "test2.c" { printf("master\n"); } POMP2_Master_end( &opari2_region_8 ); } #line 67 "test2.c" { POMP2_Critical_enter( &opari2_region_9, opari2_ctc_9 ); #line 68 "test2.c" #pragma omp critical { POMP2_Critical_begin( &opari2_region_9 ); #line 69 "test2.c" { printf("critical\n"); } POMP2_Critical_end( &opari2_region_9 ); } POMP2_Critical_exit( &opari2_region_9 ); } #line 72 "test2.c" { POMP2_Critical_enter( &opari2_region_10, opari2_ctc_10 ); #line 73 "test2.c" #pragma omp critical(foobar) { POMP2_Critical_begin( &opari2_region_10 ); #line 74 "test2.c" { printf("critical(foobar)\n"); } POMP2_Critical_end( &opari2_region_10 ); } POMP2_Critical_exit( &opari2_region_10 ); } #line 77 "test2.c" { POMP2_Atomic_enter( &opari2_region_11, opari2_ctc_11 ); #line 78 "test2.c" #pragma omp atomic /* -------------- */ /* do this atomic */ i += 1; POMP2_Atomic_exit( &opari2_region_11 ); } #line 82 "test2.c" /* -------------- */ { POMP2_Single_enter( &opari2_region_12, opari2_ctc_12 ); #line 84 "test2.c" #pragma omp single nowait { POMP2_Single_begin( &opari2_region_12 ); #line 85 "test2.c" { printf("single\n"); } POMP2_Single_end( &opari2_region_12 ); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_12, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_12, pomp2_old_task ); } POMP2_Single_exit( &opari2_region_12 ); } #line 88 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 89 "test2.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_13, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_13 ); #line 90 "test2.c" #pragma omp parallel POMP2_DLIST_00013 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_13 ); #line 91 "test2.c" { { int pomp2_if = 1; { POMP2_Task_handle pomp2_old_task; POMP2_Task_handle pomp2_new_task; if (pomp2_if) POMP2_Task_create_begin( &opari2_region_14, &pomp2_new_task, &pomp2_old_task, pomp2_if, opari2_ctc_14 ); #line 92 "test2.c" #pragma omp task POMP2_DLIST_00014 if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) { if (pomp2_if) POMP2_Task_begin( &opari2_region_14, pomp2_new_task ); #line 93 "test2.c" { printf("task\n"); } if (pomp2_if) POMP2_Task_end( &opari2_region_14 ); } if (pomp2_if) POMP2_Task_create_end( &opari2_region_14, pomp2_old_task ); } } #line 96 "test2.c" { POMP2_Task_handle pomp2_old_task; POMP2_Taskwait_begin( &opari2_region_15, &pomp2_old_task, opari2_ctc_15 ); #line 97 "test2.c" #pragma omp taskwait POMP2_Taskwait_end( &opari2_region_15, pomp2_old_task ); } #line 98 "test2.c" } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_13, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_13, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_13 ); } POMP2_Parallel_join( &opari2_region_13, pomp2_old_task ); } #line 99 "test2.c" // #pragma omp this should be ignored by opari and the compiler // #pragma this too } opari2-2.0.9/test/data/PaxHeaders/test2.c.opari.inc.out0000644000000000000000000000013214770056734017575 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test2.c.opari.inc.out0000644000175100001440000000670514770056734020135 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1,opari2_region_2,opari2_region_3,opari2_region_4,opari2_region_5,opari2_region_6,opari2_region_7,opari2_region_8,opari2_region_9,opari2_region_10,opari2_region_11,opari2_region_12) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test2.c:33:33*escl=test2.c:88:88**" static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "56*regionType=for*sscl=test2.c:37:37*escl=test2.c:41:41**" static OPARI2_Region_handle opari2_region_3 = NULL; #define opari2_ctc_3 "58*regionType=flush*sscl=test2.c:43:43*escl=test2.c:43:43**" static OPARI2_Region_handle opari2_region_4 = NULL; #define opari2_ctc_4 "60*regionType=barrier*sscl=test2.c:45:45*escl=test2.c:45:45**" static OPARI2_Region_handle opari2_region_5 = NULL; #define opari2_ctc_5 "69*regionType=for*sscl=test2.c:47:47*escl=test2.c:53:53*hasOrdered=1**" static OPARI2_Region_handle opari2_region_6 = NULL; #define opari2_ctc_6 "60*regionType=ordered*sscl=test2.c:49:49*escl=test2.c:52:52**" static OPARI2_Region_handle opari2_region_7 = NULL; #define opari2_ctc_7 "75*regionType=sections*sscl=test2.c:55:55*escl=test2.c:61:61*numSections=2**" static OPARI2_Region_handle opari2_region_8 = NULL; #define opari2_ctc_8 "59*regionType=master*sscl=test2.c:63:63*escl=test2.c:66:66**" static OPARI2_Region_handle opari2_region_9 = NULL; #define opari2_ctc_9 "61*regionType=critical*sscl=test2.c:68:68*escl=test2.c:71:71**" static OPARI2_Region_handle opari2_region_10 = NULL; #define opari2_ctc_10 "81*regionType=critical*sscl=test2.c:73:73*escl=test2.c:76:76*criticalName=foobar**" static OPARI2_Region_handle opari2_region_11 = NULL; #define opari2_ctc_11 "59*regionType=atomic*sscl=test2.c:78:78*escl=test2.c:81:81**" static OPARI2_Region_handle opari2_region_12 = NULL; #define opari2_ctc_12 "59*regionType=single*sscl=test2.c:84:84*escl=test2.c:87:87**" #define POMP2_DLIST_00013 shared(opari2_region_13,opari2_region_14,opari2_region_15) static OPARI2_Region_handle opari2_region_13 = NULL; #define opari2_ctc_13 "61*regionType=parallel*sscl=test2.c:90:90*escl=test2.c:98:98**" #define POMP2_DLIST_00014 shared(opari2_region_14) static OPARI2_Region_handle opari2_region_14 = NULL; #define opari2_ctc_14 "57*regionType=task*sscl=test2.c:92:92*escl=test2.c:95:95**" static OPARI2_Region_handle opari2_region_15 = NULL; #define opari2_ctc_15 "61*regionType=taskwait*sscl=test2.c:97:97*escl=test2.c:97:97**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); POMP2_Assign_handle( &opari2_region_3, opari2_ctc_3 ); POMP2_Assign_handle( &opari2_region_4, opari2_ctc_4 ); POMP2_Assign_handle( &opari2_region_5, opari2_ctc_5 ); POMP2_Assign_handle( &opari2_region_6, opari2_ctc_6 ); POMP2_Assign_handle( &opari2_region_7, opari2_ctc_7 ); POMP2_Assign_handle( &opari2_region_8, opari2_ctc_8 ); POMP2_Assign_handle( &opari2_region_9, opari2_ctc_9 ); POMP2_Assign_handle( &opari2_region_10, opari2_ctc_10 ); POMP2_Assign_handle( &opari2_region_11, opari2_ctc_11 ); POMP2_Assign_handle( &opari2_region_12, opari2_ctc_12 ); POMP2_Assign_handle( &opari2_region_13, opari2_ctc_13 ); POMP2_Assign_handle( &opari2_region_14, opari2_ctc_14 ); POMP2_Assign_handle( &opari2_region_15, opari2_ctc_15 ); } opari2-2.0.9/test/data/PaxHeaders/test2.c0000644000000000000000000000013214770056734015106 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test2.c0000644000175100001440000000343214770056734015440 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the basic instrumentation of all directives. */ #include #ifdef _OPENMP #include #endif int j; #pragma omp threadprivate(j) int main() { int i; int k = 0; #pragma omp parallel { printf("parallel\n"); #pragma omp for for(i=0; i<4; ++i) { printf("for %d\n", i); k++; } #pragma omp flush(k) #pragma omp barrier #pragma omp for ordered for(i=0; i<4; ++i) { #pragma omp ordered { printf("for %d\n", i); } } #pragma omp sections { #pragma omp section printf("section 1\n"); #pragma omp section { printf("section 2\n"); } } #pragma omp master { printf("master\n"); } #pragma omp critical { printf("critical\n"); } #pragma omp critical(foobar) { printf("critical(foobar)\n"); } #pragma omp atomic /* -------------- */ /* do this atomic */ i += 1; /* -------------- */ #pragma omp single { printf("single\n"); } } #pragma omp parallel { #pragma omp task { printf("task\n"); } #pragma omp taskwait } // #pragma omp this should be ignored by opari and the compiler // #pragma this too } opari2-2.0.9/test/data/PaxHeaders/test1_tpd.f90.out0000644000000000000000000000013214770056734016736 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_tpd.f90.out0000644000175100001440000001033514770056734017270 0ustar00builderusers #line 1 "test1_tpd.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 !************************************************ !* The following pragmas should be instrumented * !************************************************ include 'test1_tpd.f90.opari.inc' #line 23 "test1_tpd.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 23 "test1_tpd.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_1) #line 24 "test1_tpd.f90" call POMP2_Barrier_enter(opari2_region_2,& pomp2_old_task, opari2_ctc_2 ) #line 24 "test1_tpd.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_2, pomp2_old_task) #line 25 "test1_tpd.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 25 "test1_tpd.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 26 "test1_tpd.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 27 "test1_tpd.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_3) #line 29 "test1_tpd.f90" call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Parallel_end(opari2_region_3) #line 29 "test1_tpd.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 31 "test1_tpd.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 32 "test1_tpd.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_4) #line 34 "test1_tpd.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 34 "test1_tpd.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 36 "test1_tpd.f90" !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 subroutine POMP2_Init_reg_000() include 'test1_tpd.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) end opari2-2.0.9/test/data/PaxHeaders/test1_tpd.f90.opari.inc.out0000644000000000000000000000013214770056734020617 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_tpd.f90.opari.inc.out0000644000175100001440000000237014770056734021151 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "72*regionType=parallel*sscl=test1_tpd.f90:23:23*escl=test1_tpd.f90:25:25**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "71*regionType=barrier*sscl=test1_tpd.f90:24:24*escl=test1_tpd.f90:24:24**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "72*regionType=parallel*sscl=test1_tpd.f90:27:28*escl=test1_tpd.f90:29:30**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "72*regionType=parallel*sscl=test1_tpd.f90:32:33*escl=test1_tpd.f90:34:35**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer( kind=8 ) pomp_tpd common /pomp_tpd/ pomp_tpd !$omp threadprivate(/pomp_tpd/) integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_tpd.f900000644000000000000000000000013214770056734016130 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_tpd.f900000644000175100001440000000254414770056734016465 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 !************************************************ !* The following pragmas should be instrumented * !************************************************ !$OMP PARALLEL !$OmP BaRRiEr !$omp end parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & !$OmP& parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & ! some comment !$OmP& parallel !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 opari2-2.0.9/test/data/PaxHeaders/test1_tpd.f.out0000644000000000000000000000013214770056734016565 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_tpd.f.out0000644000175100001440000001373514770056734017126 0ustar00builderusers #line 1 "test1_tpd.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_tpd.f.opari.inc' #line 24 "test1_tpd.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_tpd.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) copyin(pomp_tpd) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_tpd.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_tpd.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_tpd.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_tpd.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_tpd.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_tpd.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_tpd.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_tpd.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_tpd.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_tpd.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_tpd.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_tpd.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_tpd.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_tpd.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_tpd.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_tpd.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_tpd.f" END DO #line 58 "test1_tpd.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_tpd.f" call POMP2_Single_enter(opari2_region_8, &opari2_ctc_8 ) #line 59 "test1_tpd.f" c$omp single call POMP2_Single_begin(opari2_region_8) #line 60 "test1_tpd.f" N=6 call POMP2_Single_end(opari2_region_8) #line 61 "test1_tpd.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Single_exit(opari2_region_8) #line 62 "test1_tpd.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_9, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_9 ) end if #line 63 "test1_tpd.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_9, pomp2_new_task) end if #line 64 "test1_tpd.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_9) end if #line 65 "test1_tpd.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_9, &pomp2_old_task) end if #line 66 "test1_tpd.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_tpd.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_tpd.f" call POMP2_Init() #line 70 "test1_tpd.f" call POMP2_Begin(opari2_region_10, opari2_ctc_10) #line 72 "test1_tpd.f" if .false. then call POMP2_End(opari2_region_10) #line 74 "test1_tpd.f" return end call POMP2_End(opari2_region_10) #line 77 "test1_tpd.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_tpd.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_tpd.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_10, & opari2_ctc_10 ) end opari2-2.0.9/test/data/PaxHeaders/test1_tpd.f.opari.inc.out0000644000000000000000000000013214770056734020446 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_tpd.f.opari.inc.out0000644000175100001440000000511714770056734021002 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"70*regionType=parallel*sscl=test1_tpd.f:26:26*escl=test1_tp"// &"d.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"68*regionType=atomic*sscl=test1_tpd.f:28:28*escl=test1_tpd."// &"f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"70*regionType=critical*sscl=test1_tpd.f:31:31*escl=test1_tp"// &"d.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"67*regionType=flush*sscl=test1_tpd.f:35:35*escl=test1_tpd.f"// &":35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"68*regionType=master*sscl=test1_tpd.f:48:48*escl=test1_tpd."// &"f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"64*regionType=do*sscl=test1_tpd.f:52:52*escl=test1_tpd.f:58"// &":58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"69*regionType=ordered*sscl=test1_tpd.f:54:54*escl=test1_tpd"// &".f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"68*regionType=single*sscl=test1_tpd.f:59:59*escl=test1_tpd."// &"f:61:61**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"66*regionType=task*sscl=test1_tpd.f:63:63*escl=test1_tpd.f:"// &"65:65**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"99*regionType=userRegion*sscl=test1_tpd.f:71:71*escl=test1_"// &"tpd.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp_tpd common /pomp_tpd/ pomp_tpd !$omp threadprivate(/pomp_tpd/) integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_tpd.f0000644000000000000000000000013214770056734015757 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_tpd.f0000644000175100001440000000306014770056734016306 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) INTEGER I,N,L,T c$omp parallel c$omp atomic N=0 c$omp critical N=1 c$omp end critical c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) c$omp master N=2 c$omp end master c$omp do DO I=1,5 c$omp ordered N=I c$omp end ordered END DO c$omp single N=6 c$omp end single c$omp task N=7 c$omp end task c$omp end parallel c$pomp inst init c$pomp inst begin(user_region) if .false. then c$pomp inst altend(user_region) return end c$pomp inst end(user_region) END SUBROUTINE end program test1_free opari2-2.0.9/test/data/PaxHeaders/test1_tpd.c.out0000644000000000000000000000013214770056734016562 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_tpd.c.out0000644000175100001440000000663514770056734017124 0ustar00builderusers#include "test1_tpd.c.opari.inc" #line 1 "test1_tpd.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test1_tpd.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) copyin(pomp_tpd) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test1_tpd.c" {{ printf("parallel 1...\n"); }} { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 37 "test1_tpd.c" #line 36 "test1_tpd.c" //end { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 38 "test1_tpd.c" # pragma \ omp \ parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) copyin(pomp_tpd) { POMP2_Parallel_begin( &opari2_region_2 ); #line 41 "test1_tpd.c" { printf("parallel 2...\n"); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 44 "test1_tpd.c" //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.9/test/data/PaxHeaders/test1_tpd.c.opari.inc.out0000644000000000000000000000013214770056734020443 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_tpd.c.opari.inc.out0000644000175100001440000000133014770056734020770 0ustar00builderusers#include #include extern int64_t __attribute__((aligned (16))) pomp_tpd; #pragma omp threadprivate(pomp_tpd) #define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "69*regionType=parallel*sscl=test1_tpd.c:33:33*escl=test1_tpd.c:36:36**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "69*regionType=parallel*sscl=test1_tpd.c:38:40*escl=test1_tpd.c:43:43**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.9/test/data/PaxHeaders/test1_tpd.c0000644000000000000000000000013214770056734015754 xustar0030 mtime=1742757340.115533353 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_tpd.c0000644000175100001440000000372214770056734016310 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #include //just testing #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ #pragma omp parallel {{ printf("parallel 1...\n"); }} //end # /*complicated*/ pragma \ omp \ /*more*/ parallel { printf("parallel 2...\n"); } //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.9/test/data/PaxHeaders/test1_free.f.out0000644000000000000000000000013214770056734016717 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_free.f.out0000644000175100001440000000202014770056734017241 0ustar00builderusers #line 1 "test1_free.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1_free IMPLICIT NONE SUBROUTINE foo(A,N) !The include should be inserted after this line. include 'test1_free.f.opari.inc' #line 25 "test1_free.f" REAL(q),POINTER :: A(:) INTEGER N IF (ASSOCIATED(A)) THEN ENDIF END SUBROUTINE SMART_ALLOCATE_REAL end program test1_free opari2-2.0.9/test/data/PaxHeaders/test1_free.f.opari.inc.out0000644000000000000000000000013214770056734020600 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_free.f.opari.inc.out0000644000175100001440000000033214770056734021126 0ustar00builderusers integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock opari2-2.0.9/test/data/PaxHeaders/test1_free.f0000644000000000000000000000013214770056734016111 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_free.f0000644000175100001440000000167114770056734016446 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1_free IMPLICIT NONE SUBROUTINE foo(A,N) !The include should be inserted after this line. REAL(q),POINTER :: A(:) INTEGER N IF (ASSOCIATED(A)) THEN ENDIF END SUBROUTINE SMART_ALLOCATE_REAL end program test1_free opari2-2.0.9/test/data/PaxHeaders/test1_disable.task.f.out0000644000000000000000000000013214770056734020342 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.task.f.out0000644000175100001440000001270014770056734020672 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_8, &opari2_ctc_8 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_8) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_8) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Single_exit(opari2_region_8) #line 62 "test1_disable.f" #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.task.f.opari.inc.out0000644000000000000000000000013214770056734022223 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.task.f.opari.inc.out0000644000175100001440000000454114770056734022557 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_disable.sync.f.out0000644000000000000000000000013214770056734020354 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.sync.f.out0000644000175100001440000000716614770056734020716 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" #line 28 "test1_disable.f" c$omp atomic N=0 #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical #line 35 "test1_disable.f" c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_2, &opari2_ctc_2 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_2, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_2, &pomp2_old_task) call POMP2_Do_exit(opari2_region_2) #line 59 "test1_disable.f" #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_3, opari2_ctc_3) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_3) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_3) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_3, & opari2_ctc_3 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.sync.f.opari.inc.out0000644000000000000000000000013214770056734022235 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.sync.f.opari.inc.out0000644000175100001440000000201514770056734022563 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_disable.single.f.out0000644000000000000000000000013214770056734020661 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.single.f.out0000644000175100001440000001314014770056734021210 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.single.f.opari.inc.out0000644000000000000000000000013214770056734022542 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.single.f.opari.inc.out0000644000175100001440000000453714770056734023103 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_disable.region.f.out0000644000000000000000000000013214770056734020663 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.region.f.out0000644000175100001440000001351414770056734021217 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(pomp2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &pomp2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(pomp2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(pomp2_region_2, &pomp2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(pomp2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(pomp2_region_3, &pomp2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(pomp2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(pomp2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(pomp2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(pomp2_region_4, &pomp2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(pomp2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(pomp2_region_5, &pomp2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(pomp2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(pomp2_region_6, &pomp2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(pomp2_region_7, &pomp2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(pomp2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(pomp2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(pomp2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" !$omp end do nowait call POMP2_Implicit_barrier_enter(pomp2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(pomp2_region_6, &pomp2_old_task) call POMP2_Do_exit(pomp2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(pomp2_region_8, &pomp2_ctc_8 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(pomp2_region_8) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(pomp2_region_8) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(pomp2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(pomp2_region_8, &pomp2_old_task) call POMP2_Single_exit(pomp2_region_8) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(pomp2_region_9, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &pomp2_ctc_9 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(pomp2_region_9, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(pomp2_region_9) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(pomp2_region_9, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(pomp2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(pomp2_region_1, &pomp2_old_task) call POMP2_Parallel_end(pomp2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(pomp2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" #line 71 "test1_disable.f" c$pomp inst begin(user_region) if .false. then #line 73 "test1_disable.f" c$pomp inst altend(user_region) return end #line 76 "test1_disable.f" c$pomp inst end(user_region) END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( pomp2_region_1, & pomp2_ctc_1 ) call POMP2_Assign_handle( pomp2_region_2, & pomp2_ctc_2 ) call POMP2_Assign_handle( pomp2_region_3, & pomp2_ctc_3 ) call POMP2_Assign_handle( pomp2_region_4, & pomp2_ctc_4 ) call POMP2_Assign_handle( pomp2_region_5, & pomp2_ctc_5 ) call POMP2_Assign_handle( pomp2_region_6, & pomp2_ctc_6 ) call POMP2_Assign_handle( pomp2_region_7, & pomp2_ctc_7 ) call POMP2_Assign_handle( pomp2_region_8, & pomp2_ctc_8 ) call POMP2_Assign_handle( pomp2_region_9, & pomp2_ctc_9 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.region.f.opari.inc.out0000644000000000000000000000013214770056734022544 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.region.f.opari.inc.out0000644000175100001440000000425714770056734023104 0ustar00builderusers INTEGER*8 pomp2_region_1 CHARACTER*999 pomp2_ctc_1 PARAMETER (pomp2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 pomp2_region_2 CHARACTER*999 pomp2_ctc_2 PARAMETER (pomp2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 pomp2_region_3 CHARACTER*999 pomp2_ctc_3 PARAMETER (pomp2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 pomp2_region_4 CHARACTER*999 pomp2_ctc_4 PARAMETER (pomp2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 pomp2_region_5 CHARACTER*999 pomp2_ctc_5 PARAMETER (pomp2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 pomp2_region_6 CHARACTER*999 pomp2_ctc_6 PARAMETER (pomp2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 pomp2_region_7 CHARACTER*999 pomp2_ctc_7 PARAMETER (pomp2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 pomp2_region_8 CHARACTER*999 pomp2_ctc_8 PARAMETER (pomp2_ctc_8= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 pomp2_region_9 CHARACTER*999 pomp2_ctc_9 PARAMETER (pomp2_ctc_9= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") integer*4 pomp2_lib_get_max_threads logical pomp2_test_lock integer*4 pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads common /cb000/ pomp2_region_1, & pomp2_region_2, & pomp2_region_3, & pomp2_region_4, & pomp2_region_5, & pomp2_region_6, & pomp2_region_7, & pomp2_region_8, & pomp2_region_9 opari2-2.0.9/test/data/PaxHeaders/test1_disable.ordered.f.out0000644000000000000000000000013214770056734021024 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.ordered.f.out0000644000175100001440000001341614770056734021361 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.ordered.f.opari.inc.out0000644000000000000000000000013214770056734022705 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.ordered.f.opari.inc.out0000644000175100001440000000453614770056734023245 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_disable.omp.f.out0000644000000000000000000000013214770056734020173 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.omp.f.out0000644000175100001440000000611014770056734020521 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" #line 28 "test1_disable.f" c$omp atomic N=0 #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical #line 35 "test1_disable.f" c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_2, opari2_ctc_2) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_2) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_2) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_2, & opari2_ctc_2 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.omp.f.opari.inc.out0000644000000000000000000000013214770056734022054 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.omp.f.opari.inc.out0000644000175100001440000000145614770056734022412 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_disable.master.f.out0000644000000000000000000000013214770056734020673 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.master.f.out0000644000175100001440000001361214770056734021226 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.master.f.opari.inc.out0000644000000000000000000000013214770056734022554 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.master.f.opari.inc.out0000644000175100001440000000453714770056734023115 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_disable.locks.f.out0000644000000000000000000000013214770056734020513 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.locks.f.out0000644000175100001440000001412414770056734021045 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_4, &opari2_ctc_4 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_4) #line 36 "test1_disable.f" CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_5, &opari2_ctc_5 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_5) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_6, &opari2_ctc_6 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_7, &opari2_ctc_7 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_7) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_7) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_7) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Do_exit(opari2_region_6) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_8, &opari2_ctc_8 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_8) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_8) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_8, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, &pomp2_old_task) call POMP2_Single_exit(opari2_region_8) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_9, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_9 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_9, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_9) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_9, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_10, opari2_ctc_10) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_10) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_10) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_10, & opari2_ctc_10 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.locks.f.opari.inc.out0000644000000000000000000000013214770056734022374 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.locks.f.opari.inc.out0000644000175100001440000000510614770056734022726 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_10 CHARACTER*999 opari2_ctc_10 PARAMETER (opari2_ctc_10= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9, & opari2_region_10 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_disable.flush.f.out0000644000000000000000000000013214770056734020521 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.flush.f.out0000644000175100001440000001361314770056734021055 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" call POMP2_Critical_enter(opari2_region_3, &opari2_ctc_3 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_3) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_3) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_3) #line 34 "test1_disable.f" #line 35 "test1_disable.f" c$omp flush CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_4, &opari2_ctc_4 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_4) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.flush.f.opari.inc.out0000644000000000000000000000013214770056734022402 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.flush.f.opari.inc.out0000644000175100001440000000454014770056734022735 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_disable.f0000644000000000000000000000013214770056734016573 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.f0000644000175100001440000000306014770056734017122 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) INTEGER I,N,L,T c$omp parallel c$omp atomic N=0 c$omp critical N=1 c$omp end critical c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) c$omp master N=2 c$omp end master c$omp do DO I=1,5 c$omp ordered N=I c$omp end ordered END DO c$omp single N=6 c$omp end single c$omp task N=7 c$omp end task c$omp end parallel c$pomp inst init c$pomp inst begin(user_region) if .false. then c$pomp inst altend(user_region) return end c$pomp inst end(user_region) END SUBROUTINE end program test1_free opari2-2.0.9/test/data/PaxHeaders/test1_disable.critical.f.out0000644000000000000000000000013214770056734021172 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.critical.f.out0000644000175100001440000001341214770056734021523 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" call POMP2_Atomic_enter(opari2_region_2, &opari2_ctc_2 ) #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Atomic_exit(opari2_region_2) #line 30 "test1_disable.f" #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical call POMP2_Flush_enter(opari2_region_3, &opari2_ctc_3 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_3) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_4, &opari2_ctc_4 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_4) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.critical.f.opari.inc.out0000644000000000000000000000013214770056734023053 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.critical.f.opari.inc.out0000644000175100001440000000453514770056734023412 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"76*regionType=atomic*sscl=test1_disable.f:28:28*escl=test1_"// &"disable.f:29:29**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_disable.atomic.f.out0000644000000000000000000000013214770056734020654 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.atomic.f.out0000644000175100001440000001361114770056734021206 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 26 "test1_disable.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 27 "test1_disable.f" #line 28 "test1_disable.f" c$omp atomic N=0 call POMP2_Critical_enter(opari2_region_2, &opari2_ctc_2 ) #line 31 "test1_disable.f" c$omp critical call POMP2_Critical_begin(opari2_region_2) #line 32 "test1_disable.f" N=1 call POMP2_Critical_end(opari2_region_2) #line 33 "test1_disable.f" c$omp end critical call POMP2_Critical_exit(opari2_region_2) #line 34 "test1_disable.f" call POMP2_Flush_enter(opari2_region_3, &opari2_ctc_3 ) #line 35 "test1_disable.f" c$omp flush call POMP2_Flush_exit(opari2_region_3) #line 36 "test1_disable.f" CALL POMP2_INIT_LOCK(L) CALL POMP2_SET_LOCK(L) T=POMP2_TEST_LOCK(L) CALL POMP2_UNSET_LOCK(L) CALL POMP2_DESTROY_LOCK(L) CALL POMP2_INIT_NEST_LOCK(L) CALL POMP2_SET_NEST_LOCK(L) T=POMP2_TEST_NEST_LOCK(L) CALL POMP2_UNSET_NEST_LOCK(L) CALL POMP2_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master call POMP2_Master_begin(opari2_region_4, &opari2_ctc_4 ) #line 49 "test1_disable.f" N=2 call POMP2_Master_end(opari2_region_4) #line 50 "test1_disable.f" c$omp end master call POMP2_Do_enter(opari2_region_5, &opari2_ctc_5 ) #line 52 "test1_disable.f" c$omp do DO I=1,5 call POMP2_Ordered_enter(opari2_region_6, &opari2_ctc_6 ) #line 54 "test1_disable.f" c$omp ordered call POMP2_Ordered_begin(opari2_region_6) #line 55 "test1_disable.f" N=I call POMP2_Ordered_end(opari2_region_6) #line 56 "test1_disable.f" c$omp end ordered call POMP2_Ordered_exit(opari2_region_6) #line 57 "test1_disable.f" END DO #line 58 "test1_disable.f" c$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Do_exit(opari2_region_5) #line 59 "test1_disable.f" call POMP2_Single_enter(opari2_region_7, &opari2_ctc_7 ) #line 59 "test1_disable.f" c$omp single call POMP2_Single_begin(opari2_region_7) #line 60 "test1_disable.f" N=6 call POMP2_Single_end(opari2_region_7) #line 61 "test1_disable.f" c$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_7, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, &pomp2_old_task) call POMP2_Single_exit(opari2_region_7) #line 62 "test1_disable.f" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_8, &pomp2_new_task, &pomp2_old_task, &pomp2_if, &opari2_ctc_8 ) end if #line 63 "test1_disable.f" c$omp task !$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_8, pomp2_new_task) end if #line 64 "test1_disable.f" N=7 if (pomp2_if) then call POMP2_Task_end(opari2_region_8) end if #line 65 "test1_disable.f" c$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_8, &pomp2_old_task) end if #line 66 "test1_disable.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 67 "test1_disable.f" c$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 68 "test1_disable.f" call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_9, opari2_ctc_9) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_9) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_9) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) end subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_9, & opari2_ctc_9 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.atomic.f.opari.inc.out0000644000000000000000000000013214770056734022535 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.atomic.f.opari.inc.out0000644000175100001440000000453714770056734023076 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"78*regionType=parallel*sscl=test1_disable.f:26:26*escl=test"// &"1_disable.f:67:67**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"78*regionType=critical*sscl=test1_disable.f:31:31*escl=test"// &"1_disable.f:33:33**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"75*regionType=flush*sscl=test1_disable.f:35:35*escl=test1_d"// &"isable.f:35:35**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"76*regionType=master*sscl=test1_disable.f:48:48*escl=test1_"// &"disable.f:50:50**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"72*regionType=do*sscl=test1_disable.f:52:52*escl=test1_disa"// &"ble.f:58:58**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"77*regionType=ordered*sscl=test1_disable.f:54:54*escl=test1"// &"_disable.f:56:56**") INTEGER*8 opari2_region_7 CHARACTER*999 opari2_ctc_7 PARAMETER (opari2_ctc_7= &"76*regionType=single*sscl=test1_disable.f:59:59*escl=test1_"// &"disable.f:61:61**") INTEGER*8 opari2_region_8 CHARACTER*999 opari2_ctc_8 PARAMETER (opari2_ctc_8= &"74*regionType=task*sscl=test1_disable.f:63:63*escl=test1_di"// &"sable.f:65:65**") INTEGER*8 opari2_region_9 CHARACTER*999 opari2_ctc_9 PARAMETER (opari2_ctc_9= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6, & opari2_region_7, & opari2_region_8, & opari2_region_9 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_disable.all.f.out0000644000000000000000000000013214770056734020150 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.all.f.out0000644000175100001440000000463214770056734020505 0ustar00builderusers #line 1 "test1_disable.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the --disable= option program test1_disable IMPLICIT NONE SUBROUTINE foo(A,N) include 'test1_disable.f.opari.inc' #line 24 "test1_disable.f" INTEGER I,N,L,T #line 26 "test1_disable.f" c$omp parallel #line 28 "test1_disable.f" c$omp atomic N=0 #line 31 "test1_disable.f" c$omp critical N=1 #line 33 "test1_disable.f" c$omp end critical #line 35 "test1_disable.f" c$omp flush CALL OMP_INIT_LOCK(L) CALL OMP_SET_LOCK(L) T=OMP_TEST_LOCK(L) CALL OMP_UNSET_LOCK(L) CALL OMP_DESTROY_LOCK(L) CALL OMP_INIT_NEST_LOCK(L) CALL OMP_SET_NEST_LOCK(L) T=OMP_TEST_NEST_LOCK(L) CALL OMP_UNSET_NEST_LOCK(L) CALL OMP_DESTROY_NEST_LOCK(L) #line 48 "test1_disable.f" c$omp master N=2 #line 50 "test1_disable.f" c$omp end master #line 52 "test1_disable.f" c$omp do DO I=1,5 #line 54 "test1_disable.f" c$omp ordered N=I #line 56 "test1_disable.f" c$omp end ordered END DO #line 58 "test1_disable.f" c$omp end do #line 59 "test1_disable.f" c$omp single N=6 #line 61 "test1_disable.f" c$omp end single #line 63 "test1_disable.f" c$omp task N=7 #line 65 "test1_disable.f" c$omp end task #line 67 "test1_disable.f" c$omp end parallel call POMP2_Init() #line 70 "test1_disable.f" call POMP2_Begin(opari2_region_1, opari2_ctc_1) #line 72 "test1_disable.f" if .false. then call POMP2_End(opari2_region_1) #line 74 "test1_disable.f" return end call POMP2_End(opari2_region_1) #line 77 "test1_disable.f" END SUBROUTINE end program test1_free subroutine POMP2_USER_Init_reg_000() include 'test1_disable.f.opari.inc' call POMP2_USER_Assign_handle( opari2_region_1, & opari2_ctc_1 ) end opari2-2.0.9/test/data/PaxHeaders/test1_disable.all.f.opari.inc.out0000644000000000000000000000013214770056734022031 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_disable.all.f.opari.inc.out0000644000175100001440000000111114770056734022353 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"107*regionType=userRegion*sscl=test1_disable.f:71:71*escl=t"// &"est1_disable.f:76:76*userRegionName=user_region**") common /cb000/ opari2_region_1 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1_a.f90.out0000644000000000000000000000013214770056734016367 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_a.f90.out0000644000175100001440000000717614770056734016732 0ustar00builderusers #line 1 "test1_a.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. module functions_module interface function if0(a, & ! ) a=b b ) ! end function integer(kind=4) :: if0, a end function if0 end interface interface subroutine is1(a) integer :: a end subroutine is1 end interface contains integer(kind=4) function mf0(a, & ! ) a=b b ) ! end function ! integer functionkind THIS IS TOO EVIL FOR NOW, WILL TAKE CARE OF LATER ! functionkind = 4 include 'test1_a.f90.opari.inc' #line 38 "test1_a.f90" write (*,*) "function mf0" mf0 = 5 return end function mf0 subroutine ms0 include 'test1_a.f90.opari.inc' #line 44 "test1_a.f90" write (*,*) "subroutine ms0" end subroutine ms0 end module mmm module module1 use functions_module contains subroutine r1() include 'test1_a.f90.opari.inc' #line 53 "test1_a.f90" write (*,*) "Subroutine 1" call f1() end subroutine r1 end module module1 integer function f0() implicit & none include 'test1_a.f90.opari.inc' #line 62 "test1_a.f90" double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 include 'test1_a.f90.opari.inc' #line 69 "test1_a.f90" write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface use mmm include 'test1_a.f90.opari.inc' #line 74 "test1_a.f90" integer :: a, result write (*,*) "function f1" f1 = a return end function f1 subroutine s1(a) include 'test1_a.f90.opari.inc' #line 81 "test1_a.f90" integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() contains subroutine ss1() include 'test1_a.f90.opari.inc' #line 88 "test1_a.f90" write (*,*) "subroutine ss1" end subroutine ss1 end subroutine s1 subroutine sub_bind(a) bind(c,name='sub_bind_f') include 'test1_a.f90.opari.inc' #line 93 "test1_a.f90" integer :: a write(*,*) "subroutine sub_bind(a) bind(c,name='sub_bind_f')" end subroutine sub_bind program otest use mmm use rename_test, bar => foo include 'test1_a.f90.opari.inc' #line 100 "test1_a.f90" integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) i = mf0() call s0 call s1(4) call ms0 end program otest opari2-2.0.9/test/data/PaxHeaders/test1_a.f90.opari.inc.out0000644000000000000000000000013214770056734020250 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.167533037 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_a.f90.opari.inc.out0000644000175100001440000000024714770056734020603 0ustar00builderusers integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock opari2-2.0.9/test/data/PaxHeaders/test1_a.f900000644000000000000000000000013214770056734015561 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_a.f900000644000175100001440000000600414770056734016111 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. module functions_module interface function if0(a, & ! ) a=b b ) ! end function integer(kind=4) :: if0, a end function if0 end interface interface subroutine is1(a) integer :: a end subroutine is1 end interface contains integer(kind=4) function mf0(a, & ! ) a=b b ) ! end function ! integer functionkind THIS IS TOO EVIL FOR NOW, WILL TAKE CARE OF LATER ! functionkind = 4 write (*,*) "function mf0" mf0 = 5 return end function mf0 subroutine ms0 write (*,*) "subroutine ms0" end subroutine ms0 end module mmm module module1 use functions_module contains subroutine r1() write (*,*) "Subroutine 1" call f1() end subroutine r1 end module module1 integer function f0() implicit & none double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface use mmm integer :: a, result write (*,*) "function f1" f1 = a return end function f1 subroutine s1(a) integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() contains subroutine ss1() write (*,*) "subroutine ss1" end subroutine ss1 end subroutine s1 subroutine sub_bind(a) bind(c,name='sub_bind_f') integer :: a write(*,*) "subroutine sub_bind(a) bind(c,name='sub_bind_f')" end subroutine sub_bind program otest use mmm use rename_test, bar => foo integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) i = mf0() call s0 call s1(4) call ms0 end program otest opari2-2.0.9/test/data/PaxHeaders/test1_a.f.out0000644000000000000000000000013214770056734016216 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_a.f.out0000644000175100001440000000354414770056734016554 0ustar00builderusers #line 1 "test1_a.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. integer function f0() implicit &none include 'test1_a.f.opari.inc' #line 23 "test1_a.f" double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 include 'test1_a.f.opari.inc' #line 30 "test1_a.f" write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface implicit >none include 'test1_a.f.opari.inc' #line 36 "test1_a.f" integer :: a, result write (*,*) "function f1" f1 = a return end function f1 recursive subroutine s1(a) implicit $none include 'test1_a.f.opari.inc' #line 45 "test1_a.f" integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() entry ss1() write (*,*) "entry ss1" end subroutine s1 program otest include 'test1_a.f.opari.inc' #line 55 "test1_a.f" integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) call s0 call s1(4) end program otest opari2-2.0.9/test/data/PaxHeaders/test1_a.f.opari.inc.out0000644000000000000000000000013214770056734020077 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_a.f.opari.inc.out0000644000175100001440000000033214770056734020425 0ustar00builderusers integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock opari2-2.0.9/test/data/PaxHeaders/test1_a.f0000644000000000000000000000013214770056734015410 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1_a.f0000644000175100001440000000306214770056734015741 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to insert a necessary include statement at the right places. integer function f0() implicit &none double precision :: d write (*,*) "function f0" f0 = 5 return end function f0 subroutine s0 write (*,*) "subroutine s0" end subroutine s0 integer function f1(a) !interface implicit >none integer :: a, result write (*,*) "function f1" f1 = a return end function f1 recursive subroutine s1(a) implicit $none integer :: a write (*,*) "subroutine s1" write (*,*) "keyword interface inside a string" call ss1() entry ss1() write (*,*) "entry ss1" end subroutine s1 program otest integer :: i, f0, f1, function function = 0 write (*,*) 'program otest' i = f0() i = f1(2) call s0 call s1(4) end program otest opari2-2.0.9/test/data/PaxHeaders/test11.f90.out0000644000000000000000000000013214770056734016150 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test11.f90.out0000644000175100001440000000632214770056734016503 0ustar00builderusers #line 1 "test11.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Jie Jiang ! * ! * @brief Test worskshare directives. program test11 include 'test11.f90.opari.inc' #line 22 "test11.f90" call POMP2_Critical_enter(opari2_region_1, & opari2_ctc_1 ) #line 22 "test11.f90" !$omp critical call POMP2_Critical_begin(opari2_region_1) #line 23 "test11.f90" i = 2 call POMP2_Critical_end(opari2_region_1) #line 24 "test11.f90" !$omp end critical call POMP2_Critical_exit(opari2_region_1) #line 25 "test11.f90" call POMP2_Atomic_enter(opari2_region_2, & opari2_ctc_2 ) #line 26 "test11.f90" !$omp atomic update i = 3 call POMP2_Atomic_exit(opari2_region_2) #line 28 "test11.f90" call POMP2_Workshare_enter(opari2_region_3, & opari2_ctc_3 ) #line 29 "test11.f90" !$omp workshare i = 4 !$omp critical i = 5 !$omp end critical !$omp atomic update i = 6 #line 36 "test11.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_3) #line 37 "test11.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 38 "test11.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) call POMP2_Workshare_enter(opari2_region_4, & opari2_ctc_4 ) #line 38 "test11.f90" !$omp workshare i = 7 !$omp critical i = 8 !$omp end critical !$omp atomic update i = 9 #line 45 "test11.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_4) call POMP2_Parallel_end(opari2_region_4) #line 45 "test11.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 46 "test11.f90" end program test11 subroutine POMP2_Init_reg_000() include 'test11.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) end opari2-2.0.9/test/data/PaxHeaders/test11.f90.opari.inc.out0000644000000000000000000000013214770056734020031 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test11.f90.opari.inc.out0000644000175100001440000000220714770056734020362 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "66*regionType=critical*sscl=test11.f90:22:22*escl=test11.f90:24:24**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "64*regionType=atomic*sscl=test11.f90:26:26*escl=test11.f90:27:27**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "67*regionType=workshare*sscl=test11.f90:29:29*escl=test11.f90:36:36**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "75*regionType=parallelworkshare*sscl=test11.f90:38:38*escl=test11.f90:45:45**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test11.f900000644000000000000000000000013214770056734015342 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test11.f900000644000175100001440000000206214770056734015672 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Jie Jiang ! * ! * @brief Test worskshare directives. program test11 !$OMP critical i = 2 !$omp end critical !$OMP atomic update i = 3 !$OMP workshare i = 4 !$OMP critical i = 5 !$omp end critical !$OMP atomic update i = 6 !$OMP end workshare !$OMP PARALLEL WORKSHARE i = 7 !$OMP critical i = 8 !$omp end critical !$OMP atomic update i = 9 !$OMP END PARALLEL WORKSHARE end program test11 opari2-2.0.9/test/data/PaxHeaders/test10.f90.out0000644000000000000000000000013214770056734016147 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test10.f90.out0000644000175100001440000004042514770056734016504 0ustar00builderusers #line 1 "test10.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Bernd Mohr, Peter Philippen ! * ! * @brief Tests user instrumentation directives. program test10 include 'test10.f90.opari.inc' #line 22 "test10.f90" integer (kind=omp_lock_kind) lock call POMP2_Init() #line 25 "test10.f90" call POMP2_Off() #line 27 "test10.f90" #line 29 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 30 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 31 "test10.f90" i = 1 call POMP2_Parallel_end(opari2_region_1) !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 33 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_2,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_2 ) #line 34 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_2) !$omp do do 100, i = 2, 50 j++ 100 continue #line 38 "test10.f90" !$omp end do call POMP2_Parallel_end(opari2_region_2) #line 38 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_2, pomp2_old_task) #line 39 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 40 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) !$omp do do i = 3, 50 j++ enddo #line 44 "test10.f90" !$omp end do call POMP2_Parallel_end(opari2_region_3) #line 44 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 45 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 45 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) !$omp sections !$omp section i = 4 !$omp section i = 5 #line 50 "test10.f90" !$omp end sections call POMP2_Parallel_end(opari2_region_4) #line 50 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 51 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_5 ) #line 53 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) !$omp workshare i = 6 #line 55 "test10.f90" !$omp end workshare call POMP2_Parallel_end(opari2_region_5) #line 55 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_5, pomp2_old_task) #line 56 "test10.f90" !$omp single i = 7 !$omp end single !$omp master i = 8 !$omp end master !$omp critical i = 9 !$omp end critical !$omp critical test i = 10 !$omp end critical test !$omp workshare i = 11 !$omp end workshare !$omp workshare i = 12 !$omp end workshare nowait !$omp ordered i = 13 !$omp end ordered !$omp task i = 14 !$omp end task !$omp taskwait !$omp atomic update i = 15 !$omp sections i = 16 !$omp section i = 17 !$omp section i = 18 !$omp end sections nowait !$omp barrier !$omp flush !$omp threadprivate( i ) call omp_init_lock( lock ) call omp_destroy_lock( lock ) #line 112 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_6,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_6 ) #line 113 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) #line 114 "test10.f90" i = 1 call POMP2_Implicit_barrier_enter(opari2_region_6,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, pomp2_old_task) call POMP2_Parallel_end(opari2_region_6) #line 115 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_6, pomp2_old_task) #line 116 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_7,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_7 ) #line 117 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_7) call POMP2_Do_enter(opari2_region_7, & opari2_ctc_7 ) #line 117 "test10.f90" !$omp do do 100, i = 2, 50 j++ 100 continue #line 121 "test10.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_7,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_7, pomp2_old_task) call POMP2_Do_exit(opari2_region_7) call POMP2_Parallel_end(opari2_region_7) #line 121 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_7, pomp2_old_task) #line 122 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_8,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_8 ) #line 123 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_8) call POMP2_Do_enter(opari2_region_8, & opari2_ctc_8 ) #line 123 "test10.f90" !$omp do do i = 3, 50 j++ enddo #line 127 "test10.f90" !$omp end do nowait call POMP2_Implicit_barrier_enter(opari2_region_8,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_8, pomp2_old_task) call POMP2_Do_exit(opari2_region_8) call POMP2_Parallel_end(opari2_region_8) #line 127 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_8, pomp2_old_task) #line 128 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_9,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_9 ) #line 128 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_9) call POMP2_Sections_enter(opari2_region_9) #line 128 "test10.f90" !$omp sections #line 129 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_9, & opari2_ctc_9 ) #line 130 "test10.f90" i = 4 call POMP2_Section_end(opari2_region_9) #line 131 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_9, & opari2_ctc_9 ) #line 132 "test10.f90" i = 5 call POMP2_Section_end(opari2_region_9) #line 133 "test10.f90" !$omp end sections nowait call POMP2_Implicit_barrier_enter(opari2_region_9,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_9, pomp2_old_task) call POMP2_Sections_exit(opari2_region_9) call POMP2_Parallel_end(opari2_region_9) #line 133 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_9, pomp2_old_task) #line 134 "test10.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_10,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_10 ) #line 136 "test10.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_10) call POMP2_Workshare_enter(opari2_region_10, & opari2_ctc_10 ) #line 136 "test10.f90" !$omp workshare i = 6 #line 138 "test10.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_10,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_10, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_10) call POMP2_Parallel_end(opari2_region_10) #line 138 "test10.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_10, pomp2_old_task) #line 139 "test10.f90" call POMP2_Single_enter(opari2_region_11, & opari2_ctc_11 ) #line 140 "test10.f90" !$omp single call POMP2_Single_begin(opari2_region_11) #line 141 "test10.f90" i = 7 call POMP2_Single_end(opari2_region_11) #line 142 "test10.f90" !$omp end single nowait call POMP2_Implicit_barrier_enter(opari2_region_11,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_11, pomp2_old_task) call POMP2_Single_exit(opari2_region_11) #line 143 "test10.f90" #line 144 "test10.f90" !$omp master call POMP2_Master_begin(opari2_region_12, & opari2_ctc_12 ) #line 145 "test10.f90" i = 8 call POMP2_Master_end(opari2_region_12) #line 146 "test10.f90" !$omp end master call POMP2_Critical_enter(opari2_region_13, & opari2_ctc_13 ) #line 148 "test10.f90" !$omp critical call POMP2_Critical_begin(opari2_region_13) #line 149 "test10.f90" i = 9 call POMP2_Critical_end(opari2_region_13) #line 150 "test10.f90" !$omp end critical call POMP2_Critical_exit(opari2_region_13) #line 151 "test10.f90" call POMP2_Critical_enter(opari2_region_14, & opari2_ctc_14 ) #line 152 "test10.f90" !$omp critical test call POMP2_Critical_begin(opari2_region_14) #line 153 "test10.f90" i = 10 call POMP2_Critical_end(opari2_region_14) #line 154 "test10.f90" !$omp end critical test call POMP2_Critical_exit(opari2_region_14) #line 155 "test10.f90" call POMP2_Workshare_enter(opari2_region_15, & opari2_ctc_15 ) #line 156 "test10.f90" !$omp workshare i = 11 #line 158 "test10.f90" !$omp end workshare nowait call POMP2_Implicit_barrier_enter(opari2_region_15,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_15, pomp2_old_task) call POMP2_Workshare_exit(opari2_region_15) #line 159 "test10.f90" call POMP2_Workshare_enter(opari2_region_16, & opari2_ctc_16 ) #line 160 "test10.f90" !$omp workshare i = 12 #line 162 "test10.f90" !$omp end workshare nowait call POMP2_Workshare_exit(opari2_region_16) #line 163 "test10.f90" call POMP2_Ordered_enter(opari2_region_17, & opari2_ctc_17 ) #line 164 "test10.f90" !$omp ordered call POMP2_Ordered_begin(opari2_region_17) #line 165 "test10.f90" i = 13 call POMP2_Ordered_end(opari2_region_17) #line 166 "test10.f90" !$omp end ordered call POMP2_Ordered_exit(opari2_region_17) #line 167 "test10.f90" pomp2_if = .true. if (pomp2_if) then call POMP2_Task_create_begin(opari2_region_18, pomp2_new_task,& pomp2_old_task, pomp2_if, opari2_ctc_18 ) end if #line 168 "test10.f90" !$omp task if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if) if (pomp2_if) then call POMP2_Task_begin(opari2_region_18, pomp2_new_task) end if #line 169 "test10.f90" i = 14 if (pomp2_if) then call POMP2_Task_end(opari2_region_18) end if #line 170 "test10.f90" !$omp end task if (pomp2_if) then call POMP2_Task_create_end(opari2_region_18, pomp2_old_task) end if #line 171 "test10.f90" call POMP2_Taskwait_begin(opari2_region_19,& pomp2_old_task, opari2_ctc_19 ) #line 172 "test10.f90" !$omp taskwait call POMP2_Taskwait_end(opari2_region_19, pomp2_old_task) #line 173 "test10.f90" call POMP2_Atomic_enter(opari2_region_20, & opari2_ctc_20 ) #line 174 "test10.f90" !$omp atomic update i = 15 call POMP2_Atomic_exit(opari2_region_20) #line 176 "test10.f90" call POMP2_Sections_enter(opari2_region_21, & opari2_ctc_21 ) #line 177 "test10.f90" !$omp sections i = 16 #line 179 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_21, & opari2_ctc_21 ) #line 180 "test10.f90" i = 17 call POMP2_Section_end(opari2_region_21) #line 181 "test10.f90" !$omp section call POMP2_Section_begin(opari2_region_21, & opari2_ctc_21 ) #line 182 "test10.f90" i = 18 call POMP2_Section_end(opari2_region_21) #line 183 "test10.f90" !$omp end sections nowait call POMP2_Sections_exit(opari2_region_21) #line 184 "test10.f90" call POMP2_Barrier_enter(opari2_region_22,& pomp2_old_task, opari2_ctc_22 ) #line 185 "test10.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_22, pomp2_old_task) #line 186 "test10.f90" call POMP2_Flush_enter(opari2_region_23, & opari2_ctc_23 ) #line 187 "test10.f90" !$omp flush call POMP2_Flush_exit(opari2_region_23) #line 188 "test10.f90" #line 189 "test10.f90" !$omp threadprivate( i ) call POMP2_Init_lock( lock ) call POMP2_Destroy_lock( lock ) call POMP2_Finalize() #line 196 "test10.f90" end program test10 subroutine POMP2_Init_reg_000() include 'test10.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) call POMP2_Assign_handle( opari2_region_7, & opari2_ctc_7 ) call POMP2_Assign_handle( opari2_region_8, & opari2_ctc_8 ) call POMP2_Assign_handle( opari2_region_9, & opari2_ctc_9 ) call POMP2_Assign_handle( opari2_region_10, & opari2_ctc_10 ) call POMP2_Assign_handle( opari2_region_11, & opari2_ctc_11 ) call POMP2_Assign_handle( opari2_region_12, & opari2_ctc_12 ) call POMP2_Assign_handle( opari2_region_13, & opari2_ctc_13 ) call POMP2_Assign_handle( opari2_region_14, & opari2_ctc_14 ) call POMP2_Assign_handle( opari2_region_15, & opari2_ctc_15 ) call POMP2_Assign_handle( opari2_region_16, & opari2_ctc_16 ) call POMP2_Assign_handle( opari2_region_17, & opari2_ctc_17 ) call POMP2_Assign_handle( opari2_region_18, & opari2_ctc_18 ) call POMP2_Assign_handle( opari2_region_19, & opari2_ctc_19 ) call POMP2_Assign_handle( opari2_region_20, & opari2_ctc_20 ) call POMP2_Assign_handle( opari2_region_21, & opari2_ctc_21 ) call POMP2_Assign_handle( opari2_region_22, & opari2_ctc_22 ) call POMP2_Assign_handle( opari2_region_23, & opari2_ctc_23 ) end opari2-2.0.9/test/data/PaxHeaders/test10.f90.opari.inc.out0000644000000000000000000000013214770056734020030 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test10.f90.opari.inc.out0000644000175100001440000001233014770056734020357 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "66*regionType=parallel*sscl=test10.f90:30:30*escl=test10.f90:32:32**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "68*regionType=paralleldo*sscl=test10.f90:34:34*escl=test10.f90:38:38**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "68*regionType=paralleldo*sscl=test10.f90:40:40*escl=test10.f90:44:44**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "74*regionType=parallelsections*sscl=test10.f90:45:45*escl=test10.f90:50:50**" INTEGER( KIND=8 ) :: opari2_region_5 CHARACTER (LEN=999), parameter :: opari2_ctc_5 =& "75*regionType=parallelworkshare*sscl=test10.f90:53:53*escl=test10.f90:55:55**" INTEGER( KIND=8 ) :: opari2_region_6 CHARACTER (LEN=999), parameter :: opari2_ctc_6 =& "70*regionType=parallel*sscl=test10.f90:113:113*escl=test10.f90:115:115**" INTEGER( KIND=8 ) :: opari2_region_7 CHARACTER (LEN=999), parameter :: opari2_ctc_7 =& "72*regionType=paralleldo*sscl=test10.f90:117:117*escl=test10.f90:121:121**" INTEGER( KIND=8 ) :: opari2_region_8 CHARACTER (LEN=999), parameter :: opari2_ctc_8 =& "72*regionType=paralleldo*sscl=test10.f90:123:123*escl=test10.f90:127:127**" INTEGER( KIND=8 ) :: opari2_region_9 CHARACTER (LEN=999), parameter :: opari2_ctc_9 =& "78*regionType=parallelsections*sscl=test10.f90:128:128*escl=test10.f90:133:133**" INTEGER( KIND=8 ) :: opari2_region_10 CHARACTER (LEN=999), parameter :: opari2_ctc_10 =& "79*regionType=parallelworkshare*sscl=test10.f90:136:136*escl=test10.f90:138:138**" INTEGER( KIND=8 ) :: opari2_region_11 CHARACTER (LEN=999), parameter :: opari2_ctc_11 =& "68*regionType=single*sscl=test10.f90:140:140*escl=test10.f90:142:142**" INTEGER( KIND=8 ) :: opari2_region_12 CHARACTER (LEN=999), parameter :: opari2_ctc_12 =& "68*regionType=master*sscl=test10.f90:144:144*escl=test10.f90:146:146**" INTEGER( KIND=8 ) :: opari2_region_13 CHARACTER (LEN=999), parameter :: opari2_ctc_13 =& "70*regionType=critical*sscl=test10.f90:148:148*escl=test10.f90:150:150**" INTEGER( KIND=8 ) :: opari2_region_14 CHARACTER (LEN=999), parameter :: opari2_ctc_14 =& "70*regionType=critical*sscl=test10.f90:152:152*escl=test10.f90:154:154**" INTEGER( KIND=8 ) :: opari2_region_15 CHARACTER (LEN=999), parameter :: opari2_ctc_15 =& "71*regionType=workshare*sscl=test10.f90:156:156*escl=test10.f90:158:158**" INTEGER( KIND=8 ) :: opari2_region_16 CHARACTER (LEN=999), parameter :: opari2_ctc_16 =& "71*regionType=workshare*sscl=test10.f90:160:160*escl=test10.f90:162:162**" INTEGER( KIND=8 ) :: opari2_region_17 CHARACTER (LEN=999), parameter :: opari2_ctc_17 =& "69*regionType=ordered*sscl=test10.f90:164:164*escl=test10.f90:166:166**" INTEGER( KIND=8 ) :: opari2_region_18 CHARACTER (LEN=999), parameter :: opari2_ctc_18 =& "66*regionType=task*sscl=test10.f90:168:168*escl=test10.f90:170:170**" INTEGER( KIND=8 ) :: opari2_region_19 CHARACTER (LEN=999), parameter :: opari2_ctc_19 =& "70*regionType=taskwait*sscl=test10.f90:172:172*escl=test10.f90:172:172**" INTEGER( KIND=8 ) :: opari2_region_20 CHARACTER (LEN=999), parameter :: opari2_ctc_20 =& "68*regionType=atomic*sscl=test10.f90:174:174*escl=test10.f90:175:175**" INTEGER( KIND=8 ) :: opari2_region_21 CHARACTER (LEN=999), parameter :: opari2_ctc_21 =& "84*regionType=sections*sscl=test10.f90:177:177*escl=test10.f90:183:183*numSections=2**" INTEGER( KIND=8 ) :: opari2_region_22 CHARACTER (LEN=999), parameter :: opari2_ctc_22 =& "69*regionType=barrier*sscl=test10.f90:185:185*escl=test10.f90:185:185**" INTEGER( KIND=8 ) :: opari2_region_23 CHARACTER (LEN=999), parameter :: opari2_ctc_23 =& "67*regionType=flush*sscl=test10.f90:187:187*escl=test10.f90:187:187**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4,& opari2_region_5,& opari2_region_6,& opari2_region_7,& opari2_region_8,& opari2_region_9,& opari2_region_10,& opari2_region_11,& opari2_region_12,& opari2_region_13,& opari2_region_14,& opari2_region_15,& opari2_region_16,& opari2_region_17,& opari2_region_18,& opari2_region_19,& opari2_region_20,& opari2_region_21,& opari2_region_22,& opari2_region_23 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test10.f900000644000000000000000000000013214770056734015341 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test10.f900000644000175100001440000000567214770056734015703 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * @authors Bernd Mohr, Peter Philippen ! * ! * @brief Tests user instrumentation directives. program test10 integer (kind=omp_lock_kind) lock !$POMP INST INIT !$POMP INST OFF !$POMP NOINSTRUMENT !$OMP PARALLEL i = 1 !$OMP end PARALLEL !$OMP PARALLEL DO do 100, i = 2, 50 j++ 100 continue !$OMP END PARALLEL DO !$OMP PARALLEL DO do i = 3, 50 j++ enddo !$OMP PARALLEL SECTIONS !$OMP SECTION i = 4 !$OMP SECTION i = 5 !$OMP END PARALLEL SECTIONS !$OMP PARALLEL WORKSHARE i = 6 !$OMP END PARALLEL WORKSHARE !$OMP SINGLE i = 7 !$OMP END SINGLE !$OMP MASTER i = 8 !$OMP END MASTER !$OMP critical i = 9 !$omp end critical !$OMP critical test i = 10 !$omp end critical test !$OMP workshare i = 11 !$OMP end workshare !$OMP workshare i = 12 !$OMP end workshare nowait !$OMP ordered i = 13 !$OMP end ordered !$OMP task i = 14 !$OMP end task !$OMP taskwait !$OMP atomic update i = 15 !$OMP sections i = 16 !$omp section i = 17 !$omp section i = 18 !$omp end sections nowait !$OMP barrier !$OMP flush !$OMP threadprivate( i ) call omp_init_lock( lock ) call omp_destroy_lock( lock ) !$POMP INSTRUMENT !$OMP PARALLEL i = 1 !$OMP end PARALLEL !$OMP PARALLEL DO do 100, i = 2, 50 j++ 100 continue !$OMP END PARALLEL DO !$OMP PARALLEL DO do i = 3, 50 j++ enddo !$OMP PARALLEL SECTIONS !$OMP SECTION i = 4 !$OMP SECTION i = 5 !$OMP END PARALLEL SECTIONS !$OMP PARALLEL WORKSHARE i = 6 !$OMP END PARALLEL WORKSHARE !$OMP SINGLE i = 7 !$OMP END SINGLE !$OMP MASTER i = 8 !$OMP END MASTER !$OMP critical i = 9 !$omp end critical !$OMP critical test i = 10 !$omp end critical test !$OMP workshare i = 11 !$OMP end workshare !$OMP workshare i = 12 !$OMP end workshare nowait !$OMP ordered i = 13 !$OMP end ordered !$OMP task i = 14 !$OMP end task !$OMP taskwait !$OMP atomic update i = 15 !$OMP sections i = 16 !$omp section i = 17 !$omp section i = 18 !$omp end sections nowait !$OMP barrier !$OMP flush !$OMP threadprivate( i ) call omp_init_lock( lock ) call omp_destroy_lock( lock ) !$POMP INST FINALIZE end program test10 opari2-2.0.9/test/data/PaxHeaders/test1.prep.c.out0000644000000000000000000000013214770056734016660 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.prep.c.out0000644000175100001440000007504314770056734017221 0ustar00builderusers# 1 "test1.input.c" # 1 "/private/peterp/work/test/scorep/prep//" # 1 "" # 1 "test1.input.c" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 1 3 4 # 1 "/usr/include/stdint.h" 1 3 4 # 25 "/usr/include/stdint.h" 3 4 # 1 "/usr/include/features.h" 1 3 4 # 345 "/usr/include/features.h" 3 4 # 1 "/usr/include/stdc-predef.h" 1 3 4 # 346 "/usr/include/features.h" 2 3 4 # 375 "/usr/include/features.h" 3 4 # 1 "/usr/include/sys/cdefs.h" 1 3 4 # 385 "/usr/include/sys/cdefs.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 386 "/usr/include/sys/cdefs.h" 2 3 4 # 376 "/usr/include/features.h" 2 3 4 # 399 "/usr/include/features.h" 3 4 # 1 "/usr/include/gnu/stubs.h" 1 3 4 # 10 "/usr/include/gnu/stubs.h" 3 4 # 1 "/usr/include/gnu/stubs-64.h" 1 3 4 # 11 "/usr/include/gnu/stubs.h" 2 3 4 # 400 "/usr/include/features.h" 2 3 4 # 26 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wchar.h" 1 3 4 # 22 "/usr/include/bits/wchar.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 23 "/usr/include/bits/wchar.h" 2 3 4 # 27 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/stdint.h" 2 3 4 # 36 "/usr/include/stdint.h" 3 4 typedef signed char int8_t; typedef short int int16_t; typedef int int32_t; typedef long int int64_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned long int uint64_t; # 65 "/usr/include/stdint.h" 3 4 typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; typedef long int int_least64_t; typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; typedef unsigned long int uint_least64_t; # 90 "/usr/include/stdint.h" 3 4 typedef signed char int_fast8_t; typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; # 103 "/usr/include/stdint.h" 3 4 typedef unsigned char uint_fast8_t; typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; # 119 "/usr/include/stdint.h" 3 4 typedef long int intptr_t; typedef unsigned long int uintptr_t; # 134 "/usr/include/stdint.h" 3 4 typedef long int intmax_t; typedef unsigned long int uintmax_t; # 4 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 2 3 4 # 2 "test1.input.c" 2 # 1 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 1 # 29 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 1 3 4 # 34 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 3 4 typedef struct { unsigned char _x[4] __attribute__((__aligned__(4))); } omp_lock_t; typedef struct { unsigned char _x[16] __attribute__((__aligned__(8))); } omp_nest_lock_t; typedef enum omp_sched_t { omp_sched_static = 1, omp_sched_dynamic = 2, omp_sched_guided = 3, omp_sched_auto = 4 } omp_sched_t; extern "C" { extern void omp_set_num_threads (int) throw (); extern int omp_get_num_threads (void) throw (); extern int omp_get_max_threads (void) throw (); extern int omp_get_thread_num (void) throw (); extern int omp_get_num_procs (void) throw (); extern int omp_in_parallel (void) throw (); extern void omp_set_dynamic (int) throw (); extern int omp_get_dynamic (void) throw (); extern void omp_set_nested (int) throw (); extern int omp_get_nested (void) throw (); extern void omp_init_lock (omp_lock_t *) throw (); extern void omp_destroy_lock (omp_lock_t *) throw (); extern void omp_set_lock (omp_lock_t *) throw (); extern void omp_unset_lock (omp_lock_t *) throw (); extern int omp_test_lock (omp_lock_t *) throw (); extern void omp_init_nest_lock (omp_nest_lock_t *) throw (); extern void omp_destroy_nest_lock (omp_nest_lock_t *) throw (); extern void omp_set_nest_lock (omp_nest_lock_t *) throw (); extern void omp_unset_nest_lock (omp_nest_lock_t *) throw (); extern int omp_test_nest_lock (omp_nest_lock_t *) throw (); extern double omp_get_wtime (void) throw (); extern double omp_get_wtick (void) throw (); void omp_set_schedule (omp_sched_t, int) throw (); void omp_get_schedule (omp_sched_t *, int *) throw (); int omp_get_thread_limit (void) throw (); void omp_set_max_active_levels (int) throw (); int omp_get_max_active_levels (void) throw (); int omp_get_level (void) throw (); int omp_get_ancestor_thread_num (int) throw (); int omp_get_team_size (int) throw (); int omp_get_active_level (void) throw (); int omp_in_final (void) throw (); } # 30 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 150 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long int ptrdiff_t; # 213 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long unsigned int size_t; # 33 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 extern "C" { # 54 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" typedef void* POMP2_Region_handle; typedef int64_t POMP2_Task_handle; # 66 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern size_t POMP2_Get_num_regions( void ); extern void POMP2_Init_regions( void ); extern const char* POMP2_Get_opari2_version( void ); extern POMP2_Task_handle POMP2_Get_new_task_handle( void ); extern void POMP2_Finalize( void ); extern void POMP2_Init( void ); extern void POMP2_Off( void ); extern void POMP2_On( void ); extern void POMP2_Begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_End( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ); # 163 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 179 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 195 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ); # 211 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ); # 294 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ); # 318 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 336 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ); # 452 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 468 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ); # 505 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 523 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ); # 558 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 575 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 586 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern int POMP2_Lib_get_max_threads( void ); extern void POMP2_Init_lock( omp_lock_t* s ); extern void POMP2_Destroy_lock( omp_lock_t* s ); extern void POMP2_Set_lock( omp_lock_t* s ); extern void POMP2_Unset_lock( omp_lock_t* s ); extern int POMP2_Test_lock( omp_lock_t* s ); extern void POMP2_Init_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Set_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Unset_nest_lock( omp_nest_lock_t* s ); extern int POMP2_Test_nest_lock( omp_nest_lock_t* s ); } # 3 "test1.input.c" 2 #include "test1.prep.c.opari.inc" # 1 "/private/peterp/work/test/scorep/prep/test1.c" # 21 "/private/peterp/work/test/scorep/prep/test1.c" # 1 "/usr/include/stdio.h" 1 3 4 # 29 "/usr/include/stdio.h" 3 4 extern "C" { # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 34 "/usr/include/stdio.h" 2 3 4 # 1 "/usr/include/bits/types.h" 1 3 4 # 27 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/bits/types.h" 2 3 4 typedef unsigned char __u_char; typedef unsigned short int __u_short; typedef unsigned int __u_int; typedef unsigned long int __u_long; typedef signed char __int8_t; typedef unsigned char __uint8_t; typedef signed short int __int16_t; typedef unsigned short int __uint16_t; typedef signed int __int32_t; typedef unsigned int __uint32_t; typedef signed long int __int64_t; typedef unsigned long int __uint64_t; typedef long int __quad_t; typedef unsigned long int __u_quad_t; # 130 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/typesizes.h" 1 3 4 # 131 "/usr/include/bits/types.h" 2 3 4 typedef unsigned long int __dev_t; typedef unsigned int __uid_t; typedef unsigned int __gid_t; typedef unsigned long int __ino_t; typedef unsigned long int __ino64_t; typedef unsigned int __mode_t; typedef unsigned long int __nlink_t; typedef long int __off_t; typedef long int __off64_t; typedef int __pid_t; typedef struct { int __val[2]; } __fsid_t; typedef long int __clock_t; typedef unsigned long int __rlim_t; typedef unsigned long int __rlim64_t; typedef unsigned int __id_t; typedef long int __time_t; typedef unsigned int __useconds_t; typedef long int __suseconds_t; typedef int __daddr_t; typedef int __key_t; typedef int __clockid_t; typedef void * __timer_t; typedef long int __blksize_t; typedef long int __blkcnt_t; typedef long int __blkcnt64_t; typedef unsigned long int __fsblkcnt_t; typedef unsigned long int __fsblkcnt64_t; typedef unsigned long int __fsfilcnt_t; typedef unsigned long int __fsfilcnt64_t; typedef long int __fsword_t; typedef long int __ssize_t; typedef long int __syscall_slong_t; typedef unsigned long int __syscall_ulong_t; typedef __off64_t __loff_t; typedef __quad_t *__qaddr_t; typedef char *__caddr_t; typedef long int __intptr_t; typedef unsigned int __socklen_t; # 36 "/usr/include/stdio.h" 2 3 4 # 44 "/usr/include/stdio.h" 3 4 struct _IO_FILE; typedef struct _IO_FILE FILE; # 64 "/usr/include/stdio.h" 3 4 typedef struct _IO_FILE __FILE; # 74 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/libio.h" 1 3 4 # 32 "/usr/include/libio.h" 3 4 # 1 "/usr/include/_G_config.h" 1 3 4 # 15 "/usr/include/_G_config.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 16 "/usr/include/_G_config.h" 2 3 4 # 1 "/usr/include/wchar.h" 1 3 4 # 82 "/usr/include/wchar.h" 3 4 typedef struct { int __count; union { unsigned int __wch; char __wchb[4]; } __value; } __mbstate_t; # 21 "/usr/include/_G_config.h" 2 3 4 typedef struct { __off_t __pos; __mbstate_t __state; } _G_fpos_t; typedef struct { __off64_t __pos; __mbstate_t __state; } _G_fpos64_t; # 33 "/usr/include/libio.h" 2 3 4 # 50 "/usr/include/libio.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 1 3 4 # 40 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 3 4 typedef __builtin_va_list __gnuc_va_list; # 51 "/usr/include/libio.h" 2 3 4 # 145 "/usr/include/libio.h" 3 4 struct _IO_jump_t; struct _IO_FILE; # 155 "/usr/include/libio.h" 3 4 typedef void _IO_lock_t; struct _IO_marker { struct _IO_marker *_next; struct _IO_FILE *_sbuf; int _pos; # 178 "/usr/include/libio.h" 3 4 }; enum __codecvt_result { __codecvt_ok, __codecvt_partial, __codecvt_error, __codecvt_noconv }; # 246 "/usr/include/libio.h" 3 4 struct _IO_FILE { int _flags; char* _IO_read_ptr; char* _IO_read_end; char* _IO_read_base; char* _IO_write_base; char* _IO_write_ptr; char* _IO_write_end; char* _IO_buf_base; char* _IO_buf_end; char *_IO_save_base; char *_IO_backup_base; char *_IO_save_end; struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; int _flags2; __off_t _old_offset; unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; _IO_lock_t *_lock; # 294 "/usr/include/libio.h" 3 4 __off64_t _offset; # 303 "/usr/include/libio.h" 3 4 void *__pad1; void *__pad2; void *__pad3; void *__pad4; size_t __pad5; int _mode; char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; }; struct _IO_FILE_plus; extern struct _IO_FILE_plus _IO_2_1_stdin_; extern struct _IO_FILE_plus _IO_2_1_stdout_; extern struct _IO_FILE_plus _IO_2_1_stderr_; # 339 "/usr/include/libio.h" 3 4 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf, size_t __n); typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w); typedef int __io_close_fn (void *__cookie); typedef __io_read_fn cookie_read_function_t; typedef __io_write_fn cookie_write_function_t; typedef __io_seek_fn cookie_seek_function_t; typedef __io_close_fn cookie_close_function_t; typedef struct { __io_read_fn *read; __io_write_fn *write; __io_seek_fn *seek; __io_close_fn *close; } _IO_cookie_io_functions_t; typedef _IO_cookie_io_functions_t cookie_io_functions_t; struct _IO_cookie_file; extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write, void *__cookie, _IO_cookie_io_functions_t __fns); extern "C" { extern int __underflow (_IO_FILE *); extern int __uflow (_IO_FILE *); extern int __overflow (_IO_FILE *, int); # 435 "/usr/include/libio.h" 3 4 extern int _IO_getc (_IO_FILE *__fp); extern int _IO_putc (int __c, _IO_FILE *__fp); extern int _IO_feof (_IO_FILE *__fp) throw (); extern int _IO_ferror (_IO_FILE *__fp) throw (); extern int _IO_peekc_locked (_IO_FILE *__fp); extern void _IO_flockfile (_IO_FILE *) throw (); extern void _IO_funlockfile (_IO_FILE *) throw (); extern int _IO_ftrylockfile (_IO_FILE *) throw (); # 465 "/usr/include/libio.h" 3 4 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, __gnuc_va_list, int *__restrict); extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, __gnuc_va_list); extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t); extern size_t _IO_sgetn (_IO_FILE *, void *, size_t); extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int); extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int); extern void _IO_free_backup_area (_IO_FILE *) throw (); # 527 "/usr/include/libio.h" 3 4 } # 75 "/usr/include/stdio.h" 2 3 4 typedef __gnuc_va_list va_list; # 90 "/usr/include/stdio.h" 3 4 typedef __off_t off_t; typedef __off64_t off64_t; typedef __ssize_t ssize_t; typedef _G_fpos_t fpos_t; typedef _G_fpos64_t fpos64_t; # 164 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/bits/stdio_lim.h" 1 3 4 # 165 "/usr/include/stdio.h" 2 3 4 extern struct _IO_FILE *stdin; extern struct _IO_FILE *stdout; extern struct _IO_FILE *stderr; extern int remove (const char *__filename) throw (); extern int rename (const char *__old, const char *__new) throw (); extern int renameat (int __oldfd, const char *__old, int __newfd, const char *__new) throw (); extern FILE *tmpfile (void) ; # 205 "/usr/include/stdio.h" 3 4 extern FILE *tmpfile64 (void) ; extern char *tmpnam (char *__s) throw () ; extern char *tmpnam_r (char *__s) throw () ; # 227 "/usr/include/stdio.h" 3 4 extern char *tempnam (const char *__dir, const char *__pfx) throw () __attribute__ ((__malloc__)) ; extern int fclose (FILE *__stream); extern int fflush (FILE *__stream); # 252 "/usr/include/stdio.h" 3 4 extern int fflush_unlocked (FILE *__stream); # 262 "/usr/include/stdio.h" 3 4 extern int fcloseall (void); extern FILE *fopen (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; # 295 "/usr/include/stdio.h" 3 4 extern FILE *fopen64 (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen64 (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; extern FILE *fdopen (int __fd, const char *__modes) throw () ; extern FILE *fopencookie (void *__restrict __magic_cookie, const char *__restrict __modes, _IO_cookie_io_functions_t __io_funcs) throw () ; extern FILE *fmemopen (void *__s, size_t __len, const char *__modes) throw () ; extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) throw () ; extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) throw (); extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, int __modes, size_t __n) throw (); extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, size_t __size) throw (); extern void setlinebuf (FILE *__stream) throw (); extern int fprintf (FILE *__restrict __stream, const char *__restrict __format, ...); extern int printf (const char *__restrict __format, ...); extern int sprintf (char *__restrict __s, const char *__restrict __format, ...) throw (); extern int vfprintf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg); extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg); extern int vsprintf (char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw (); extern int snprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 3, 4))); extern int vsnprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 3, 0))); extern int vasprintf (char **__restrict __ptr, const char *__restrict __f, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 2, 0))) ; extern int __asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 2, 0))); extern int dprintf (int __fd, const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) ; extern int scanf (const char *__restrict __format, ...) ; extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) throw (); # 463 "/usr/include/stdio.h" 3 4 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 2, 0))) ; extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 1, 0))) ; extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__scanf__, 2, 0))); # 522 "/usr/include/stdio.h" 3 4 extern int fgetc (FILE *__stream); extern int getc (FILE *__stream); extern int getchar (void); # 550 "/usr/include/stdio.h" 3 4 extern int getc_unlocked (FILE *__stream); extern int getchar_unlocked (void); # 561 "/usr/include/stdio.h" 3 4 extern int fgetc_unlocked (FILE *__stream); extern int fputc (int __c, FILE *__stream); extern int putc (int __c, FILE *__stream); extern int putchar (int __c); # 594 "/usr/include/stdio.h" 3 4 extern int fputc_unlocked (int __c, FILE *__stream); extern int putc_unlocked (int __c, FILE *__stream); extern int putchar_unlocked (int __c); extern int getw (FILE *__stream); extern int putw (int __w, FILE *__stream); extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 638 "/usr/include/stdio.h" 3 4 extern char *gets (char *__s) __attribute__ ((__deprecated__)); # 649 "/usr/include/stdio.h" 3 4 extern char *fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 665 "/usr/include/stdio.h" 3 4 extern __ssize_t __getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getline (char **__restrict __lineptr, size_t *__restrict __n, FILE *__restrict __stream) ; extern int fputs (const char *__restrict __s, FILE *__restrict __stream); extern int puts (const char *__s); extern int ungetc (int __c, FILE *__stream); extern size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s); # 726 "/usr/include/stdio.h" 3 4 extern int fputs_unlocked (const char *__restrict __s, FILE *__restrict __stream); # 737 "/usr/include/stdio.h" 3 4 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream); extern int fseek (FILE *__stream, long int __off, int __whence); extern long int ftell (FILE *__stream) ; extern void rewind (FILE *__stream); # 773 "/usr/include/stdio.h" 3 4 extern int fseeko (FILE *__stream, __off_t __off, int __whence); extern __off_t ftello (FILE *__stream) ; # 792 "/usr/include/stdio.h" 3 4 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos); extern int fsetpos (FILE *__stream, const fpos_t *__pos); # 815 "/usr/include/stdio.h" 3 4 extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence); extern __off64_t ftello64 (FILE *__stream) ; extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos); extern int fsetpos64 (FILE *__stream, const fpos64_t *__pos); extern void clearerr (FILE *__stream) throw (); extern int feof (FILE *__stream) throw () ; extern int ferror (FILE *__stream) throw () ; extern void clearerr_unlocked (FILE *__stream) throw (); extern int feof_unlocked (FILE *__stream) throw () ; extern int ferror_unlocked (FILE *__stream) throw () ; extern void perror (const char *__s); # 1 "/usr/include/bits/sys_errlist.h" 1 3 4 # 26 "/usr/include/bits/sys_errlist.h" 3 4 extern int sys_nerr; extern const char *const sys_errlist[]; extern int _sys_nerr; extern const char *const _sys_errlist[]; # 854 "/usr/include/stdio.h" 2 3 4 extern int fileno (FILE *__stream) throw () ; extern int fileno_unlocked (FILE *__stream) throw () ; # 873 "/usr/include/stdio.h" 3 4 extern FILE *popen (const char *__command, const char *__modes) ; extern int pclose (FILE *__stream); extern char *ctermid (char *__s) throw (); extern char *cuserid (char *__s); struct obstack; extern int obstack_printf (struct obstack *__restrict __obstack, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))); extern int obstack_vprintf (struct obstack *__restrict __obstack, const char *__restrict __format, __gnuc_va_list __args) throw () __attribute__ ((__format__ (__printf__, 2, 0))); extern void flockfile (FILE *__stream) throw (); extern int ftrylockfile (FILE *__stream) throw () ; extern void funlockfile (FILE *__stream) throw (); # 943 "/usr/include/stdio.h" 3 4 } # 22 "/private/peterp/work/test/scorep/prep/test1.c" 2 int main() { printf("before...\n"); # 33 "/private/peterp/work/test/scorep/prep/test1.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test1.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test1.c" # 33 "/private/peterp/work/test/scorep/prep/test1.c" {{ printf("parallel 1...\n"); }} { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 37 "test1.c" # 39 "/private/peterp/work/test/scorep/prep/test1.c" { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 39 "test1.c" #pragma omp parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); #line 40 "test1.c" { printf("parallel 2...\n"); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 44 "test1.c" # 76 "/private/peterp/work/test/scorep/prep/test1.c" { } # 88 "/private/peterp/work/test/scorep/prep/test1.c" { printf("#pragma omp parallel"); printf("\" and continuation in the next line #pragma omp parallel\" and especially strange escape character usage\n"); } printf("after...\n"); printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.9/test/data/PaxHeaders/test1.prep.c.opari.inc.out0000644000000000000000000000013214770056734020541 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.prep.c.opari.inc.out0000644000175100001440000000114014770056734021065 0ustar00builderusers#define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = (OPARI2_Region_handle)0; #define opari2_ctc_1 "61*regionType=parallel*sscl=test1.c:33:33*escl=test1.c:36:36**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = (OPARI2_Region_handle)0; #define opari2_ctc_2 "61*regionType=parallel*sscl=test1.c:39:39*escl=test1.c:43:43**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.9/test/data/PaxHeaders/test1.prep.c0000644000000000000000000000013214770056734016052 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.prep.c0000644000175100001440000007226314770056734016414 0ustar00builderusers# 1 "test1.input.c" # 1 "/private/peterp/work/test/scorep/prep//" # 1 "" # 1 "test1.input.c" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 1 3 4 # 1 "/usr/include/stdint.h" 1 3 4 # 25 "/usr/include/stdint.h" 3 4 # 1 "/usr/include/features.h" 1 3 4 # 345 "/usr/include/features.h" 3 4 # 1 "/usr/include/stdc-predef.h" 1 3 4 # 346 "/usr/include/features.h" 2 3 4 # 375 "/usr/include/features.h" 3 4 # 1 "/usr/include/sys/cdefs.h" 1 3 4 # 385 "/usr/include/sys/cdefs.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 386 "/usr/include/sys/cdefs.h" 2 3 4 # 376 "/usr/include/features.h" 2 3 4 # 399 "/usr/include/features.h" 3 4 # 1 "/usr/include/gnu/stubs.h" 1 3 4 # 10 "/usr/include/gnu/stubs.h" 3 4 # 1 "/usr/include/gnu/stubs-64.h" 1 3 4 # 11 "/usr/include/gnu/stubs.h" 2 3 4 # 400 "/usr/include/features.h" 2 3 4 # 26 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wchar.h" 1 3 4 # 22 "/usr/include/bits/wchar.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 23 "/usr/include/bits/wchar.h" 2 3 4 # 27 "/usr/include/stdint.h" 2 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/stdint.h" 2 3 4 # 36 "/usr/include/stdint.h" 3 4 typedef signed char int8_t; typedef short int int16_t; typedef int int32_t; typedef long int int64_t; typedef unsigned char uint8_t; typedef unsigned short int uint16_t; typedef unsigned int uint32_t; typedef unsigned long int uint64_t; # 65 "/usr/include/stdint.h" 3 4 typedef signed char int_least8_t; typedef short int int_least16_t; typedef int int_least32_t; typedef long int int_least64_t; typedef unsigned char uint_least8_t; typedef unsigned short int uint_least16_t; typedef unsigned int uint_least32_t; typedef unsigned long int uint_least64_t; # 90 "/usr/include/stdint.h" 3 4 typedef signed char int_fast8_t; typedef long int int_fast16_t; typedef long int int_fast32_t; typedef long int int_fast64_t; # 103 "/usr/include/stdint.h" 3 4 typedef unsigned char uint_fast8_t; typedef unsigned long int uint_fast16_t; typedef unsigned long int uint_fast32_t; typedef unsigned long int uint_fast64_t; # 119 "/usr/include/stdint.h" 3 4 typedef long int intptr_t; typedef unsigned long int uintptr_t; # 134 "/usr/include/stdint.h" 3 4 typedef long int intmax_t; typedef unsigned long int uintmax_t; # 4 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdint.h" 2 3 4 # 2 "test1.input.c" 2 # 1 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 1 # 29 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 1 3 4 # 34 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/omp.h" 3 4 typedef struct { unsigned char _x[4] __attribute__((__aligned__(4))); } omp_lock_t; typedef struct { unsigned char _x[16] __attribute__((__aligned__(8))); } omp_nest_lock_t; typedef enum omp_sched_t { omp_sched_static = 1, omp_sched_dynamic = 2, omp_sched_guided = 3, omp_sched_auto = 4 } omp_sched_t; extern "C" { extern void omp_set_num_threads (int) throw (); extern int omp_get_num_threads (void) throw (); extern int omp_get_max_threads (void) throw (); extern int omp_get_thread_num (void) throw (); extern int omp_get_num_procs (void) throw (); extern int omp_in_parallel (void) throw (); extern void omp_set_dynamic (int) throw (); extern int omp_get_dynamic (void) throw (); extern void omp_set_nested (int) throw (); extern int omp_get_nested (void) throw (); extern void omp_init_lock (omp_lock_t *) throw (); extern void omp_destroy_lock (omp_lock_t *) throw (); extern void omp_set_lock (omp_lock_t *) throw (); extern void omp_unset_lock (omp_lock_t *) throw (); extern int omp_test_lock (omp_lock_t *) throw (); extern void omp_init_nest_lock (omp_nest_lock_t *) throw (); extern void omp_destroy_nest_lock (omp_nest_lock_t *) throw (); extern void omp_set_nest_lock (omp_nest_lock_t *) throw (); extern void omp_unset_nest_lock (omp_nest_lock_t *) throw (); extern int omp_test_nest_lock (omp_nest_lock_t *) throw (); extern double omp_get_wtime (void) throw (); extern double omp_get_wtick (void) throw (); void omp_set_schedule (omp_sched_t, int) throw (); void omp_get_schedule (omp_sched_t *, int *) throw (); int omp_get_thread_limit (void) throw (); void omp_set_max_active_levels (int) throw (); int omp_get_max_active_levels (void) throw (); int omp_get_level (void) throw (); int omp_get_ancestor_thread_num (int) throw (); int omp_get_team_size (int) throw (); int omp_get_active_level (void) throw (); int omp_in_final (void) throw (); } # 30 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 150 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long int ptrdiff_t; # 213 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 3 4 typedef long unsigned int size_t; # 33 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" 2 extern "C" { # 54 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" typedef void* POMP2_Region_handle; typedef int64_t POMP2_Task_handle; # 66 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern size_t POMP2_Get_num_regions( void ); extern void POMP2_Init_regions( void ); extern const char* POMP2_Get_opari2_version( void ); extern POMP2_Task_handle POMP2_Get_new_task_handle( void ); extern void POMP2_Finalize( void ); extern void POMP2_Init( void ); extern void POMP2_Off( void ); extern void POMP2_On( void ); extern void POMP2_Begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_End( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ); # 163 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 179 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 195 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ); # 211 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ); # 294 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ); # 318 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 336 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ); extern void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ); extern void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ); # 452 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 468 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); extern void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ); # 505 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ); # 523 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ); extern void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ); # 558 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ); # 575 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ); # 586 "/private/peterp/work/scorep/REL-1.2.2/gnu/install/include/opari2/pomp2_lib.h" extern int POMP2_Lib_get_max_threads( void ); extern void POMP2_Init_lock( omp_lock_t* s ); extern void POMP2_Destroy_lock( omp_lock_t* s ); extern void POMP2_Set_lock( omp_lock_t* s ); extern void POMP2_Unset_lock( omp_lock_t* s ); extern int POMP2_Test_lock( omp_lock_t* s ); extern void POMP2_Init_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Set_nest_lock( omp_nest_lock_t* s ); extern void POMP2_Unset_nest_lock( omp_nest_lock_t* s ); extern int POMP2_Test_nest_lock( omp_nest_lock_t* s ); } # 3 "test1.input.c" 2 ___POMP2_INCLUDE___ # 1 "/private/peterp/work/test/scorep/prep/test1.c" # 21 "/private/peterp/work/test/scorep/prep/test1.c" # 1 "/usr/include/stdio.h" 1 3 4 # 29 "/usr/include/stdio.h" 3 4 extern "C" { # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 34 "/usr/include/stdio.h" 2 3 4 # 1 "/usr/include/bits/types.h" 1 3 4 # 27 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/wordsize.h" 1 3 4 # 28 "/usr/include/bits/types.h" 2 3 4 typedef unsigned char __u_char; typedef unsigned short int __u_short; typedef unsigned int __u_int; typedef unsigned long int __u_long; typedef signed char __int8_t; typedef unsigned char __uint8_t; typedef signed short int __int16_t; typedef unsigned short int __uint16_t; typedef signed int __int32_t; typedef unsigned int __uint32_t; typedef signed long int __int64_t; typedef unsigned long int __uint64_t; typedef long int __quad_t; typedef unsigned long int __u_quad_t; # 130 "/usr/include/bits/types.h" 3 4 # 1 "/usr/include/bits/typesizes.h" 1 3 4 # 131 "/usr/include/bits/types.h" 2 3 4 typedef unsigned long int __dev_t; typedef unsigned int __uid_t; typedef unsigned int __gid_t; typedef unsigned long int __ino_t; typedef unsigned long int __ino64_t; typedef unsigned int __mode_t; typedef unsigned long int __nlink_t; typedef long int __off_t; typedef long int __off64_t; typedef int __pid_t; typedef struct { int __val[2]; } __fsid_t; typedef long int __clock_t; typedef unsigned long int __rlim_t; typedef unsigned long int __rlim64_t; typedef unsigned int __id_t; typedef long int __time_t; typedef unsigned int __useconds_t; typedef long int __suseconds_t; typedef int __daddr_t; typedef int __key_t; typedef int __clockid_t; typedef void * __timer_t; typedef long int __blksize_t; typedef long int __blkcnt_t; typedef long int __blkcnt64_t; typedef unsigned long int __fsblkcnt_t; typedef unsigned long int __fsblkcnt64_t; typedef unsigned long int __fsfilcnt_t; typedef unsigned long int __fsfilcnt64_t; typedef long int __fsword_t; typedef long int __ssize_t; typedef long int __syscall_slong_t; typedef unsigned long int __syscall_ulong_t; typedef __off64_t __loff_t; typedef __quad_t *__qaddr_t; typedef char *__caddr_t; typedef long int __intptr_t; typedef unsigned int __socklen_t; # 36 "/usr/include/stdio.h" 2 3 4 # 44 "/usr/include/stdio.h" 3 4 struct _IO_FILE; typedef struct _IO_FILE FILE; # 64 "/usr/include/stdio.h" 3 4 typedef struct _IO_FILE __FILE; # 74 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/libio.h" 1 3 4 # 32 "/usr/include/libio.h" 3 4 # 1 "/usr/include/_G_config.h" 1 3 4 # 15 "/usr/include/_G_config.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stddef.h" 1 3 4 # 16 "/usr/include/_G_config.h" 2 3 4 # 1 "/usr/include/wchar.h" 1 3 4 # 82 "/usr/include/wchar.h" 3 4 typedef struct { int __count; union { unsigned int __wch; char __wchb[4]; } __value; } __mbstate_t; # 21 "/usr/include/_G_config.h" 2 3 4 typedef struct { __off_t __pos; __mbstate_t __state; } _G_fpos_t; typedef struct { __off64_t __pos; __mbstate_t __state; } _G_fpos64_t; # 33 "/usr/include/libio.h" 2 3 4 # 50 "/usr/include/libio.h" 3 4 # 1 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 1 3 4 # 40 "/usr/lib64/gcc/x86_64-suse-linux/4.7/include/stdarg.h" 3 4 typedef __builtin_va_list __gnuc_va_list; # 51 "/usr/include/libio.h" 2 3 4 # 145 "/usr/include/libio.h" 3 4 struct _IO_jump_t; struct _IO_FILE; # 155 "/usr/include/libio.h" 3 4 typedef void _IO_lock_t; struct _IO_marker { struct _IO_marker *_next; struct _IO_FILE *_sbuf; int _pos; # 178 "/usr/include/libio.h" 3 4 }; enum __codecvt_result { __codecvt_ok, __codecvt_partial, __codecvt_error, __codecvt_noconv }; # 246 "/usr/include/libio.h" 3 4 struct _IO_FILE { int _flags; char* _IO_read_ptr; char* _IO_read_end; char* _IO_read_base; char* _IO_write_base; char* _IO_write_ptr; char* _IO_write_end; char* _IO_buf_base; char* _IO_buf_end; char *_IO_save_base; char *_IO_backup_base; char *_IO_save_end; struct _IO_marker *_markers; struct _IO_FILE *_chain; int _fileno; int _flags2; __off_t _old_offset; unsigned short _cur_column; signed char _vtable_offset; char _shortbuf[1]; _IO_lock_t *_lock; # 294 "/usr/include/libio.h" 3 4 __off64_t _offset; # 303 "/usr/include/libio.h" 3 4 void *__pad1; void *__pad2; void *__pad3; void *__pad4; size_t __pad5; int _mode; char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; }; struct _IO_FILE_plus; extern struct _IO_FILE_plus _IO_2_1_stdin_; extern struct _IO_FILE_plus _IO_2_1_stdout_; extern struct _IO_FILE_plus _IO_2_1_stderr_; # 339 "/usr/include/libio.h" 3 4 typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf, size_t __n); typedef int __io_seek_fn (void *__cookie, __off64_t *__pos, int __w); typedef int __io_close_fn (void *__cookie); typedef __io_read_fn cookie_read_function_t; typedef __io_write_fn cookie_write_function_t; typedef __io_seek_fn cookie_seek_function_t; typedef __io_close_fn cookie_close_function_t; typedef struct { __io_read_fn *read; __io_write_fn *write; __io_seek_fn *seek; __io_close_fn *close; } _IO_cookie_io_functions_t; typedef _IO_cookie_io_functions_t cookie_io_functions_t; struct _IO_cookie_file; extern void _IO_cookie_init (struct _IO_cookie_file *__cfile, int __read_write, void *__cookie, _IO_cookie_io_functions_t __fns); extern "C" { extern int __underflow (_IO_FILE *); extern int __uflow (_IO_FILE *); extern int __overflow (_IO_FILE *, int); # 435 "/usr/include/libio.h" 3 4 extern int _IO_getc (_IO_FILE *__fp); extern int _IO_putc (int __c, _IO_FILE *__fp); extern int _IO_feof (_IO_FILE *__fp) throw (); extern int _IO_ferror (_IO_FILE *__fp) throw (); extern int _IO_peekc_locked (_IO_FILE *__fp); extern void _IO_flockfile (_IO_FILE *) throw (); extern void _IO_funlockfile (_IO_FILE *) throw (); extern int _IO_ftrylockfile (_IO_FILE *) throw (); # 465 "/usr/include/libio.h" 3 4 extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, __gnuc_va_list, int *__restrict); extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, __gnuc_va_list); extern __ssize_t _IO_padn (_IO_FILE *, int, __ssize_t); extern size_t _IO_sgetn (_IO_FILE *, void *, size_t); extern __off64_t _IO_seekoff (_IO_FILE *, __off64_t, int, int); extern __off64_t _IO_seekpos (_IO_FILE *, __off64_t, int); extern void _IO_free_backup_area (_IO_FILE *) throw (); # 527 "/usr/include/libio.h" 3 4 } # 75 "/usr/include/stdio.h" 2 3 4 typedef __gnuc_va_list va_list; # 90 "/usr/include/stdio.h" 3 4 typedef __off_t off_t; typedef __off64_t off64_t; typedef __ssize_t ssize_t; typedef _G_fpos_t fpos_t; typedef _G_fpos64_t fpos64_t; # 164 "/usr/include/stdio.h" 3 4 # 1 "/usr/include/bits/stdio_lim.h" 1 3 4 # 165 "/usr/include/stdio.h" 2 3 4 extern struct _IO_FILE *stdin; extern struct _IO_FILE *stdout; extern struct _IO_FILE *stderr; extern int remove (const char *__filename) throw (); extern int rename (const char *__old, const char *__new) throw (); extern int renameat (int __oldfd, const char *__old, int __newfd, const char *__new) throw (); extern FILE *tmpfile (void) ; # 205 "/usr/include/stdio.h" 3 4 extern FILE *tmpfile64 (void) ; extern char *tmpnam (char *__s) throw () ; extern char *tmpnam_r (char *__s) throw () ; # 227 "/usr/include/stdio.h" 3 4 extern char *tempnam (const char *__dir, const char *__pfx) throw () __attribute__ ((__malloc__)) ; extern int fclose (FILE *__stream); extern int fflush (FILE *__stream); # 252 "/usr/include/stdio.h" 3 4 extern int fflush_unlocked (FILE *__stream); # 262 "/usr/include/stdio.h" 3 4 extern int fcloseall (void); extern FILE *fopen (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; # 295 "/usr/include/stdio.h" 3 4 extern FILE *fopen64 (const char *__restrict __filename, const char *__restrict __modes) ; extern FILE *freopen64 (const char *__restrict __filename, const char *__restrict __modes, FILE *__restrict __stream) ; extern FILE *fdopen (int __fd, const char *__modes) throw () ; extern FILE *fopencookie (void *__restrict __magic_cookie, const char *__restrict __modes, _IO_cookie_io_functions_t __io_funcs) throw () ; extern FILE *fmemopen (void *__s, size_t __len, const char *__modes) throw () ; extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) throw () ; extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) throw (); extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf, int __modes, size_t __n) throw (); extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf, size_t __size) throw (); extern void setlinebuf (FILE *__stream) throw (); extern int fprintf (FILE *__restrict __stream, const char *__restrict __format, ...); extern int printf (const char *__restrict __format, ...); extern int sprintf (char *__restrict __s, const char *__restrict __format, ...) throw (); extern int vfprintf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg); extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg); extern int vsprintf (char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw (); extern int snprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 3, 4))); extern int vsnprintf (char *__restrict __s, size_t __maxlen, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 3, 0))); extern int vasprintf (char **__restrict __ptr, const char *__restrict __f, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__printf__, 2, 0))) ; extern int __asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))) ; extern int vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 2, 0))); extern int dprintf (int __fd, const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); extern int fscanf (FILE *__restrict __stream, const char *__restrict __format, ...) ; extern int scanf (const char *__restrict __format, ...) ; extern int sscanf (const char *__restrict __s, const char *__restrict __format, ...) throw (); # 463 "/usr/include/stdio.h" 3 4 extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 2, 0))) ; extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 1, 0))) ; extern int vsscanf (const char *__restrict __s, const char *__restrict __format, __gnuc_va_list __arg) throw () __attribute__ ((__format__ (__scanf__, 2, 0))); # 522 "/usr/include/stdio.h" 3 4 extern int fgetc (FILE *__stream); extern int getc (FILE *__stream); extern int getchar (void); # 550 "/usr/include/stdio.h" 3 4 extern int getc_unlocked (FILE *__stream); extern int getchar_unlocked (void); # 561 "/usr/include/stdio.h" 3 4 extern int fgetc_unlocked (FILE *__stream); extern int fputc (int __c, FILE *__stream); extern int putc (int __c, FILE *__stream); extern int putchar (int __c); # 594 "/usr/include/stdio.h" 3 4 extern int fputc_unlocked (int __c, FILE *__stream); extern int putc_unlocked (int __c, FILE *__stream); extern int putchar_unlocked (int __c); extern int getw (FILE *__stream); extern int putw (int __w, FILE *__stream); extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 638 "/usr/include/stdio.h" 3 4 extern char *gets (char *__s) __attribute__ ((__deprecated__)); # 649 "/usr/include/stdio.h" 3 4 extern char *fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream) ; # 665 "/usr/include/stdio.h" 3 4 extern __ssize_t __getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getdelim (char **__restrict __lineptr, size_t *__restrict __n, int __delimiter, FILE *__restrict __stream) ; extern __ssize_t getline (char **__restrict __lineptr, size_t *__restrict __n, FILE *__restrict __stream) ; extern int fputs (const char *__restrict __s, FILE *__restrict __stream); extern int puts (const char *__s); extern int ungetc (int __c, FILE *__stream); extern size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __s); # 726 "/usr/include/stdio.h" 3 4 extern int fputs_unlocked (const char *__restrict __s, FILE *__restrict __stream); # 737 "/usr/include/stdio.h" 3 4 extern size_t fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream) ; extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size, size_t __n, FILE *__restrict __stream); extern int fseek (FILE *__stream, long int __off, int __whence); extern long int ftell (FILE *__stream) ; extern void rewind (FILE *__stream); # 773 "/usr/include/stdio.h" 3 4 extern int fseeko (FILE *__stream, __off_t __off, int __whence); extern __off_t ftello (FILE *__stream) ; # 792 "/usr/include/stdio.h" 3 4 extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos); extern int fsetpos (FILE *__stream, const fpos_t *__pos); # 815 "/usr/include/stdio.h" 3 4 extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence); extern __off64_t ftello64 (FILE *__stream) ; extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos); extern int fsetpos64 (FILE *__stream, const fpos64_t *__pos); extern void clearerr (FILE *__stream) throw (); extern int feof (FILE *__stream) throw () ; extern int ferror (FILE *__stream) throw () ; extern void clearerr_unlocked (FILE *__stream) throw (); extern int feof_unlocked (FILE *__stream) throw () ; extern int ferror_unlocked (FILE *__stream) throw () ; extern void perror (const char *__s); # 1 "/usr/include/bits/sys_errlist.h" 1 3 4 # 26 "/usr/include/bits/sys_errlist.h" 3 4 extern int sys_nerr; extern const char *const sys_errlist[]; extern int _sys_nerr; extern const char *const _sys_errlist[]; # 854 "/usr/include/stdio.h" 2 3 4 extern int fileno (FILE *__stream) throw () ; extern int fileno_unlocked (FILE *__stream) throw () ; # 873 "/usr/include/stdio.h" 3 4 extern FILE *popen (const char *__command, const char *__modes) ; extern int pclose (FILE *__stream); extern char *ctermid (char *__s) throw (); extern char *cuserid (char *__s); struct obstack; extern int obstack_printf (struct obstack *__restrict __obstack, const char *__restrict __format, ...) throw () __attribute__ ((__format__ (__printf__, 2, 3))); extern int obstack_vprintf (struct obstack *__restrict __obstack, const char *__restrict __format, __gnuc_va_list __args) throw () __attribute__ ((__format__ (__printf__, 2, 0))); extern void flockfile (FILE *__stream) throw (); extern int ftrylockfile (FILE *__stream) throw () ; extern void funlockfile (FILE *__stream) throw (); # 943 "/usr/include/stdio.h" 3 4 } # 22 "/private/peterp/work/test/scorep/prep/test1.c" 2 int main() { printf("before...\n"); # 33 "/private/peterp/work/test/scorep/prep/test1.c" #pragma omp parallel # 33 "/private/peterp/work/test/scorep/prep/test1.c" {{ printf("parallel 1...\n"); }} # 39 "/private/peterp/work/test/scorep/prep/test1.c" #pragma omp parallel { printf("parallel 2...\n"); } # 76 "/private/peterp/work/test/scorep/prep/test1.c" { } # 88 "/private/peterp/work/test/scorep/prep/test1.c" { printf("#pragma omp parallel"); printf("\" and continuation in the next line #pragma omp parallel\" and especially strange escape character usage\n"); } printf("after...\n"); printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.9/test/data/PaxHeaders/test1.f90.out0000644000000000000000000000013214770056734016067 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.f90.out0000644000175100001440000001064714770056734016427 0ustar00builderusers #line 1 "test1.f90" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 implicit none include 'test1.f90.opari.inc' #line 23 "test1.f90" integer a, b !************************************************ !* The following pragmas should be instrumented * !************************************************ pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_1 ) #line 28 "test1.f90" !$omp parallel & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 29 "test1.f90" call POMP2_Barrier_enter(opari2_region_2,& pomp2_old_task, opari2_ctc_2 ) #line 29 "test1.f90" !$omp barrier call POMP2_Barrier_exit(opari2_region_2, pomp2_old_task) #line 30 "test1.f90" call POMP2_Implicit_barrier_enter(opari2_region_1,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 30 "test1.f90" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, pomp2_old_task) #line 31 "test1.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_3,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_3 ) #line 32 "test1.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_3) #line 34 "test1.f90" call POMP2_Implicit_barrier_enter(opari2_region_3,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_3, pomp2_old_task) call POMP2_Parallel_end(opari2_region_3) #line 34 "test1.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_3, pomp2_old_task) #line 36 "test1.f90" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4,& pomp2_if, pomp2_num_threads, pomp2_old_task, & opari2_ctc_4 ) #line 37 "test1.f90" !$omp parallel & !$omp& default(shared) & !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) & !$omp num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 39 "test1.f90" call POMP2_Implicit_barrier_enter(opari2_region_4,& pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 39 "test1.f90" !$omp end & !$omp& parallel call POMP2_Parallel_join(opari2_region_4, pomp2_old_task) #line 41 "test1.f90" !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" !************************************** !* Test for handling lines with * !* multiple statements separated by ; * !************************************** a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; end program test1 subroutine POMP2_Init_reg_000() include 'test1.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) end opari2-2.0.9/test/data/PaxHeaders/test1.f90.opari.inc.out0000644000000000000000000000013214770056734017750 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.f90.opari.inc.out0000644000175100001440000000216614770056734020305 0ustar00builderusers INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=999), parameter :: opari2_ctc_1 =& "64*regionType=parallel*sscl=test1.f90:28:28*escl=test1.f90:30:30**" INTEGER( KIND=8 ) :: opari2_region_2 CHARACTER (LEN=999), parameter :: opari2_ctc_2 =& "63*regionType=barrier*sscl=test1.f90:29:29*escl=test1.f90:29:29**" INTEGER( KIND=8 ) :: opari2_region_3 CHARACTER (LEN=999), parameter :: opari2_ctc_3 =& "64*regionType=parallel*sscl=test1.f90:32:33*escl=test1.f90:34:35**" INTEGER( KIND=8 ) :: opari2_region_4 CHARACTER (LEN=999), parameter :: opari2_ctc_4 =& "64*regionType=parallel*sscl=test1.f90:37:38*escl=test1.f90:39:40**" common /cb000/ opari2_region_1,& opari2_region_2,& opari2_region_3,& opari2_region_4 integer ( kind=4 ), external :: pomp2_lib_get_max_threads logical, external :: pomp2_test_lock integer ( kind=4 ), external :: pomp2_test_nest_lock integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task logical :: pomp2_if integer ( kind=4 ) :: pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1.f900000644000000000000000000000013214770056734015261 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.f900000644000175100001440000000325114770056734015612 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 implicit none integer a, b !************************************************ !* The following pragmas should be instrumented * !************************************************ !$OMP PARALLEL !$OmP BaRRiEr !$omp end parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & !$OmP& parallel !$OmP parallel & !$OmP& default(shared) !$OmP end & ! some comment !$OmP& parallel !************************************** !* The following should be ignored * !************************************** ! comment $omp ! comment !$omp parallel !!$omp mo ! $ omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" !************************************** !* Test for handling lines with * !* multiple statements separated by ; * !************************************** a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; a = 1; a = 2; a = 3; end program test1 opari2-2.0.9/test/data/PaxHeaders/test1.f.out0000644000000000000000000000013214770056734015716 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.f.out0000644000175100001440000001226414770056734016253 0ustar00builderusers #line 1 "test1.f" ! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 include 'test1.f.opari.inc' #line 20 "test1.f" integer a !************************************************ !* The following pragmas should be instrumented * !************************************************ pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_1, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_1 ) #line 24 "test1.f" c$omp parallel !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_1) #line 25 "test1.f" call POMP2_Barrier_enter(opari2_region_2, &pomp2_old_task, &opari2_ctc_2 ) #line 25 "test1.f" *$omp barrier call POMP2_Barrier_exit(opari2_region_2, &pomp2_old_task) #line 26 "test1.f" call POMP2_Barrier_enter(opari2_region_3, &pomp2_old_task, &opari2_ctc_3 ) #line 26 "test1.f" !$omp barrier call POMP2_Barrier_exit(opari2_region_3, &pomp2_old_task) #line 27 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_1, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_1, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_1) #line 27 "test1.f" !$omp end parallel call POMP2_Parallel_join(opari2_region_1, &pomp2_old_task) #line 28 "test1.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_4, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_4 ) #line 29 "test1.f" !$omp parallel !$omp& default(shared) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_4) #line 31 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_4, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_4, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_4) #line 31 "test1.f" !$omp end !$omp+ parallel call POMP2_Parallel_join(opari2_region_4, &pomp2_old_task) #line 33 "test1.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_5, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_5 ) #line 34 "test1.f" !$omp parallel !$omp& default(shared) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_5) #line 36 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_5, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_5, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_5) #line 36 "test1.f" !$omp end !$omp+ !$omp+ parallel call POMP2_Parallel_join(opari2_region_5, &pomp2_old_task) #line 39 "test1.f" pomp2_num_threads = pomp2_lib_get_max_threads() pomp2_if = .true. call POMP2_Parallel_fork(opari2_region_6, &pomp2_if, pomp2_num_threads, pomp2_old_task, &opari2_ctc_6 ) #line 40 "test1.f" !$omp parallel !$omp&private(a) !$omp& firstprivate(pomp2_old_task) private(pomp2_new_task) !$omp& num_threads(pomp2_num_threads) call POMP2_Parallel_begin(opari2_region_6) #line 42 "test1.f" call POMP2_Implicit_barrier_enter(opari2_region_6, &pomp2_old_task) !$omp barrier call POMP2_Implicit_barrier_exit(opari2_region_6, &pomp2_old_task) call POMP2_Parallel_end(opari2_region_6) #line 45 "test1.f" !$omp end !$omp¶llel call POMP2_Parallel_join(opari2_region_6, &pomp2_old_task) #line 47 "test1.f" !************************************** !* The following should be ignored * !************************************** c $omp no !!$omp mo c comment ! $omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 subroutine POMP2_Init_reg_000() include 'test1.f.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) call POMP2_Assign_handle( opari2_region_2, & opari2_ctc_2 ) call POMP2_Assign_handle( opari2_region_3, & opari2_ctc_3 ) call POMP2_Assign_handle( opari2_region_4, & opari2_ctc_4 ) call POMP2_Assign_handle( opari2_region_5, & opari2_ctc_5 ) call POMP2_Assign_handle( opari2_region_6, & opari2_ctc_6 ) end opari2-2.0.9/test/data/PaxHeaders/test1.f.opari.inc.out0000644000000000000000000000013214770056734017577 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.f.opari.inc.out0000644000175100001440000000310214770056734020123 0ustar00builderusers INTEGER*8 opari2_region_1 CHARACTER*999 opari2_ctc_1 PARAMETER (opari2_ctc_1= &"62*regionType=parallel*sscl=test1.f:24:24*escl=test1.f:27:2"// &"7**") INTEGER*8 opari2_region_2 CHARACTER*999 opari2_ctc_2 PARAMETER (opari2_ctc_2= &"61*regionType=barrier*sscl=test1.f:25:25*escl=test1.f:25:25"// &"**") INTEGER*8 opari2_region_3 CHARACTER*999 opari2_ctc_3 PARAMETER (opari2_ctc_3= &"61*regionType=barrier*sscl=test1.f:26:26*escl=test1.f:26:26"// &"**") INTEGER*8 opari2_region_4 CHARACTER*999 opari2_ctc_4 PARAMETER (opari2_ctc_4= &"62*regionType=parallel*sscl=test1.f:29:30*escl=test1.f:31:3"// &"2**") INTEGER*8 opari2_region_5 CHARACTER*999 opari2_ctc_5 PARAMETER (opari2_ctc_5= &"62*regionType=parallel*sscl=test1.f:34:35*escl=test1.f:36:3"// &"8**") INTEGER*8 opari2_region_6 CHARACTER*999 opari2_ctc_6 PARAMETER (opari2_ctc_6= &"62*regionType=parallel*sscl=test1.f:40:41*escl=test1.f:45:4"// &"6**") common /cb000/ opari2_region_1, & opari2_region_2, & opari2_region_3, & opari2_region_4, & opari2_region_5, & opari2_region_6 integer*4 pomp2_lib_get_max_threads external pomp2_lib_get_max_threads logical pomp2_test_lock external pomp2_test_lock integer*4 pomp2_test_nest_lock external pomp2_test_nest_lock integer*8 pomp2_old_task, pomp2_new_task logical pomp2_if integer*4 pomp2_num_threads opari2-2.0.9/test/data/PaxHeaders/test1.f0000644000000000000000000000013214770056734015110 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.f0000644000175100001440000000275514770056734015451 0ustar00builderusers! * This file is part of the Score-P software (http://www.score-p.org) ! * ! * Copyright (c) 2009-2011, ! * RWTH Aachen University, Germany ! * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ! * Technische Universitaet Dresden, Germany ! * University of Oregon, Eugene, USA ! * Forschungszentrum Juelich GmbH, Germany ! * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ! * Technische Universitaet Muenchen, Germany ! * ! * See the COPYING file in the package base directory for details. ! * ! * Testfile for automated testing of OPARI2 ! * ! * ! * @brief Test the parsers ability to find directives and filter strings and comments. program test1 integer a !************************************************ !* The following pragmas should be instrumented * !************************************************ c$OMP PARALLEL *$oMp BaRrIeR !$OmP Barrier !$omp end parallel !$OmP parallel !$OmP& default(shared) !$OmP end !$OmP+ parallel !$OmP parallel !$OmP& default(shared) !$OmP end !$OmP+ !$OmP+ parallel !$omp parallel !comment will be deleted !more comment, which will be deleted !$omp&private(a) !and some more comment... !$omp end !$omp¶llel !************************************** !* The following should be ignored * !************************************** c $omp no !!$omp mo c comment ! $omp parallel write(*,*) "!$omp parallel" write(*,*) """!$omp parallel""" end program test1 opari2-2.0.9/test/data/PaxHeaders/test1.cpp.out0000644000000000000000000000013214770056734016253 xustar0030 mtime=1742757340.111533378 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.cpp.out0000644000175100001440000000666114770056734016614 0ustar00builderusers#include "test1.cpp.opari.inc" #line 1 "test1.cpp" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2021, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to handle C++14/17 numeric literals. */ int main(int argc, char** argv) { // binary integers auto bin = 0b0101010; auto binWithSep = 0b0'10'10'10; auto binWithSuffix = 0b0101010L; auto binWithSuffixAndSep = 0b0'10'10'10l; // octal integers auto oct = 07232; auto octWithSep = 07'232; auto octWithSuffix = 07232L; auto octWithSuffixAndSep = 07'232l; // decimal integers auto dec = 424242; auto decWithSep = 42'4242; auto decWithSuffix = 424242L; auto decWithSuffixAndSep = 42'4242l; // hexadecimal integers auto hex = 0x0420DEAD; auto hexWithSep = 0x04'20'DE'AD; auto hexWithSuffix = 0x0420DEADL; auto hexWithSuffixAndSep = 0x04'20'DE'ADl; // decimal floating-points auto dfp = 424242.0123; auto dfpWithSep = 42'42'42.01'23; auto dfpWithSuffix = 424242.0123F; auto dfpWithSuffixAndSep = 42'42'42.01'23f; auto dfpExp = 424242.0123e-17; auto dfpExpWithSep = 42'4242.01'23e+1'7; auto dfpExpWithSuffix = 424242.0123e17F; auto dfpExpWithSuffixAndSep = 42'4242.01'23e-1'7f; auto dfpInt = 424242.; auto dfpIntWithSep = 42'4242.; auto dfpIntWithSuffix = 424242.F; auto dfpIntWithSuffixAndSep = 42'4242.f; auto dfpIntExp = 424242.e-12; auto dfpIntExpWithSep = 42'42'42.e+1'2; auto dfpIntExpWithSuffix = 424242e+12F; auto dfpIntExpWithSuffixAndSep = 42'42'42e-1'2f; auto dfpFrac = .424242; auto dfpFracWithSep = .42'4242; auto dfpFracWithSuffix = .424242F; auto dfpFracWithSuffixAndSep = .42'4242f; auto dfpFracExp = .424242e+15; auto dfpFracExpWithSep = .42'42'42e-1'5; auto dfpFracExpWithSuffix = .424242e-15F; auto dfpFracExpWithSuffixAndSep = .42'42'42e+1'5f; // hexadecimal floating-points auto hfp = 0xdead.BEEFp10; auto hfpWithSep = 0xDE'AD.be'efp1'0; auto hfpWithSuffix = 0XDEad.BeeFp+10F; auto hfpWithSuffixAndSep = 0XdE'Ad.Be'Efp+1'0f; auto hfpInt = 0XDEAD.p-10; auto hfpIntWithSep = 0Xd'e'ad.p1'0; auto hfpIntWithSuffix = 0xdead.p10F; auto hfpIntWithSuffixAndSep = 0xd'e'Ad.p-1'0f; auto hfpFrac = 0x.beefp+10; auto hfpFracWithSep = 0x.b'e'efp1'0; auto hfpFracWithSuffix = 0X.BEEFP-10F; auto hfpFracWithSuffixAndSep = 0X.BE'E'FP1'0f; auto expr = 0x.beefp+10 + 0xdead.p10F + .42'42'42e+1'5f + .424242 + 424242.e-12 + 42'4242. + 42'4242.01'23e+1'7 + 424242.0123F + 0x04'20'DE'AD + 4 + 07'232 + 0b0'10'10'10l; return 0; } opari2-2.0.9/test/data/PaxHeaders/test1.cpp.opari.inc.out0000644000000000000000000000013214770056734020134 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.107533403 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.cpp.opari.inc.out0000644000175100001440000000000014770056734020452 0ustar00builderusersopari2-2.0.9/test/data/PaxHeaders/test1.cpp0000644000000000000000000000013214770056734015445 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.cpp0000644000175100001440000000657614770056734016013 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2021, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to handle C++14/17 numeric literals. */ int main(int argc, char** argv) { // binary integers auto bin = 0b0101010; auto binWithSep = 0b0'10'10'10; auto binWithSuffix = 0b0101010L; auto binWithSuffixAndSep = 0b0'10'10'10l; // octal integers auto oct = 07232; auto octWithSep = 07'232; auto octWithSuffix = 07232L; auto octWithSuffixAndSep = 07'232l; // decimal integers auto dec = 424242; auto decWithSep = 42'4242; auto decWithSuffix = 424242L; auto decWithSuffixAndSep = 42'4242l; // hexadecimal integers auto hex = 0x0420DEAD; auto hexWithSep = 0x04'20'DE'AD; auto hexWithSuffix = 0x0420DEADL; auto hexWithSuffixAndSep = 0x04'20'DE'ADl; // decimal floating-points auto dfp = 424242.0123; auto dfpWithSep = 42'42'42.01'23; auto dfpWithSuffix = 424242.0123F; auto dfpWithSuffixAndSep = 42'42'42.01'23f; auto dfpExp = 424242.0123e-17; auto dfpExpWithSep = 42'4242.01'23e+1'7; auto dfpExpWithSuffix = 424242.0123e17F; auto dfpExpWithSuffixAndSep = 42'4242.01'23e-1'7f; auto dfpInt = 424242.; auto dfpIntWithSep = 42'4242.; auto dfpIntWithSuffix = 424242.F; auto dfpIntWithSuffixAndSep = 42'4242.f; auto dfpIntExp = 424242.e-12; auto dfpIntExpWithSep = 42'42'42.e+1'2; auto dfpIntExpWithSuffix = 424242e+12F; auto dfpIntExpWithSuffixAndSep = 42'42'42e-1'2f; auto dfpFrac = .424242; auto dfpFracWithSep = .42'4242; auto dfpFracWithSuffix = .424242F; auto dfpFracWithSuffixAndSep = .42'4242f; auto dfpFracExp = .424242e+15; auto dfpFracExpWithSep = .42'42'42e-1'5; auto dfpFracExpWithSuffix = .424242e-15F; auto dfpFracExpWithSuffixAndSep = .42'42'42e+1'5f; // hexadecimal floating-points auto hfp = 0xdead.BEEFp10; auto hfpWithSep = 0xDE'AD.be'efp1'0; auto hfpWithSuffix = 0XDEad.BeeFp+10F; auto hfpWithSuffixAndSep = 0XdE'Ad.Be'Efp+1'0f; auto hfpInt = 0XDEAD.p-10; auto hfpIntWithSep = 0Xd'e'ad.p1'0; auto hfpIntWithSuffix = 0xdead.p10F; auto hfpIntWithSuffixAndSep = 0xd'e'Ad.p-1'0f; auto hfpFrac = 0x.beefp+10; auto hfpFracWithSep = 0x.b'e'efp1'0; auto hfpFracWithSuffix = 0X.BEEFP-10F; auto hfpFracWithSuffixAndSep = 0X.BE'E'FP1'0f; auto expr = 0x.beefp+10 + 0xdead.p10F + .42'42'42e+1'5f + .424242 + 424242.e-12 + 42'4242. + 42'4242.01'23e+1'7 + 424242.0123F + 0x04'20'DE'AD + 4 + 07'232 + 0b0'10'10'10l; return 0; } opari2-2.0.9/test/data/PaxHeaders/test1.c.out0000644000000000000000000000013214770056734015713 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.c.out0000644000175100001440000001033614770056734016246 0ustar00builderusers#include "test1.c.opari.inc" #line 1 "test1.c" /* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_1, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_1 ); #line 33 "test1.c" #pragma omp parallel POMP2_DLIST_00001 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_1 ); #line 34 "test1.c" {{ printf("parallel 1...\n"); }} { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_1, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_1, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_1 ); } POMP2_Parallel_join( &opari2_region_1, pomp2_old_task ); } #line 37 "test1.c" #line 36 "test1.c" //end { int pomp2_num_threads = omp_get_max_threads(); int pomp2_if = 1; POMP2_Task_handle pomp2_old_task; POMP2_Parallel_fork(&opari2_region_2, pomp2_if, pomp2_num_threads, &pomp2_old_task, opari2_ctc_2 ); #line 38 "test1.c" # pragma \ omp \ parallel POMP2_DLIST_00002 firstprivate(pomp2_old_task) num_threads(pomp2_num_threads) { POMP2_Parallel_begin( &opari2_region_2 ); #line 41 "test1.c" { printf("parallel 2...\n"); } { POMP2_Task_handle pomp2_old_task; POMP2_Implicit_barrier_enter( &opari2_region_2, &pomp2_old_task ); #pragma omp barrier POMP2_Implicit_barrier_exit( &opari2_region_2, pomp2_old_task ); } POMP2_Parallel_end( &opari2_region_2 ); } POMP2_Parallel_join( &opari2_region_2, pomp2_old_task ); } #line 44 "test1.c" //************************************************* //* The treatment of else blocks doesn't work yet * //************************************************* /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* { */ /* printf("parallel 3 thread 0 ...\n"); */ /* } */ /* else */ /* { */ /* printf("parallel 3 other threads ...\n"); */ /* } */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* printf("parallel 4 thread 0 ...\n"); */ /* else */ /* printf("parallel 4 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 5 thread 0 ...\n"); */ /* else printf("parallel 5 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 6 thread 0 ...\n"); else printf("parallel 6 other threads ...\n"); */ //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.9/test/data/PaxHeaders/test1.c.opari.inc.out0000644000000000000000000000013214770056734017574 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.c.opari.inc.out0000644000175100001440000000113114770056734020120 0ustar00builderusers#include #define POMP2_DLIST_00001 shared(opari2_region_1) static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "61*regionType=parallel*sscl=test1.c:33:33*escl=test1.c:36:36**" #define POMP2_DLIST_00002 shared(opari2_region_2) static OPARI2_Region_handle opari2_region_2 = NULL; #define opari2_ctc_2 "61*regionType=parallel*sscl=test1.c:38:40*escl=test1.c:43:43**" #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); POMP2_Assign_handle( &opari2_region_2, opari2_ctc_2 ); } opari2-2.0.9/test/data/PaxHeaders/test1.c0000644000000000000000000000013214770056734015105 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/test1.c0000644000175100001440000000553114770056734015441 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * * Testfile for automated testing of OPARI2 * * * @brief Test the parsers ability to find directives and filter strings and comments. */ #include #ifdef _OPENMP #include //just testing #endif int main() { printf("before...\n"); //************************************************ //* The following pragmas should be instrumented * //************************************************ #pragma omp parallel {{ printf("parallel 1...\n"); }} //end # /*complicated*/ pragma \ omp \ /*more*/ parallel { printf("parallel 2...\n"); } //************************************************* //* The treatment of else blocks doesn't work yet * //************************************************* /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* { */ /* printf("parallel 3 thread 0 ...\n"); */ /* } */ /* else */ /* { */ /* printf("parallel 3 other threads ...\n"); */ /* } */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) */ /* printf("parallel 4 thread 0 ...\n"); */ /* else */ /* printf("parallel 4 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 5 thread 0 ...\n"); */ /* else printf("parallel 5 other threads ...\n"); */ /* #pragma omp parallel */ /* if ( omp_get_thread_num() == 0 ) printf("parallel 6 thread 0 ...\n"); else printf("parallel 6 other threads ...\n"); */ //************************************** //* The following should be ignored * //************************************** //#pragma omp parallel { //printf("parallel 1...\n"); } /* #pragma omp parallel { printf("parallel 1...\n"); } */ { printf("#pragma omp parallel"); // printf("#pragma omp parallel"); /* printf("#pragma omp parallel");*/ /* printf("#pragma omp parallel"); */ printf("\" and continuation \ in the next line #pragma omp parallel\" \ and especially strange escape character usage\\ n"); } printf("after...\n"); //********************************************** //* Tests for the string parsing part of opari.* //********************************************** printf(""); printf("\\"); printf("\\\\"); printf("\\\""); printf("\"\""); } opari2-2.0.9/test/data/PaxHeaders/jacobi0000644000000000000000000000013214770056734015053 xustar0030 mtime=1742757340.107533403 30 atime=1742757371.935339406 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/0000755000175100001440000000000014770056734015460 5ustar00builderusersopari2-2.0.9/test/data/jacobi/PaxHeaders/F770000644000000000000000000000013214770056734015416 xustar0030 mtime=1742757340.107533403 30 atime=1742757371.935339406 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F77/0000755000175100001440000000000014770056734016023 5ustar00builderusersopari2-2.0.9/test/data/jacobi/F77/PaxHeaders/main.f0000644000000000000000000000013214770056734016566 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F77/main.f0000644000175100001440000000776414770056734017134 0ustar00builderusers program main ************************************************************ * program to solve a finite difference * discretization of Helmholtz equation : * (d2/dx2)u + (d2/dy2)u - alpha u = f * using Jacobi iterative method. * * Modified: Sanjiv Shah, Kuck and Associates, Inc. (KAI), 1998 * Author: Joseph Robicheaux, Kuck and Associates, Inc. (KAI), 1998 * * Directives are used in this code to achieve paralleism. * All do loops are parallized with default 'static' scheduling. * * Input : n - grid dimension in x direction * m - grid dimension in y direction * alpha - Helmholtz constant (always greater than 0.0) * tol - error tolerance for iterative solver * relax - Successice over relaxation parameter * mits - Maximum iterations for iterative solver * * On output * : u(n,m) - Dependent variable (solutions) * : f(n,m) - Right hand side function ************************************************************* implicit none integer n,m,mits double precision tol,relax,alpha common /idat/ n,m,mits common /fdat/tol,alpha,relax * * Fix input for test cases * n=200 m=200 alpha=0.8 relax=1 tol=1e-10 mits=5 * * Calls a driver routine * call driver stop end subroutine driver ( ) ************************************************************* * Subroutine driver () * This is where the arrays are allocated and initialzed. * * Working varaibles/arrays * dx - grid spacing in x direction * dy - grid spacing in y direction ************************************************************* implicit none double precision omp_get_wtime integer n,m,mits double precision tol,relax,alpha double precision r0 double precision c0 common /idat/ n,m,mits common /fdat/tol,alpha,relax double precision u(n,m),f(n,m),dx,dy * Initialize data call initialize (n,m,alpha,dx,dy,u,f) * Solve Helmholtz equation r0 = omp_get_wtime() call jacobi (n,m,dx,dy,alpha,relax,u,f,tol,mits) r0 = omp_get_wtime() - r0 write (*,'(a,f12.6)') ' elapsed time usage ', r0 write (*,'(a,f12.6)') ' MFlop/s ', & 1d-6*mits*(m-2d0)*(n-2d0)*13d0 / r0 * Check error between exact solution call error_check (n,m,alpha,dx,dy,u,f) return end subroutine initialize (n,m,alpha,dx,dy,u,f) ****************************************************** * Initializes data * Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) * ****************************************************** implicit none integer n,m double precision u(n,m),f(n,m),dx,dy,alpha integer i,j, xx,yy double precision PI parameter (PI=3.1415926) dx = 2.0 / (n-1) dy = 2.0 / (m-1) * Initilize initial condition and RHS C$omp parallel do private(i,j) do j = 1,m do i = 1,n xx = -1.0 + dx * dble(i-1) ! -1 < x < 1 yy = -1.0 + dy * dble(j-1) ! -1 < y < 1 u(i,j) = 0.0 f(i,j) = -alpha *(1.0-xx*xx)*(1.0-yy*yy) & - 2.0*(1.0-xx*xx)-2.0*(1.0-yy*yy) enddo enddo C$omp end parallel do * return end subroutine error_check (n,m,alpha,dx,dy,u,f) implicit none ************************************************************ * Checks error between numerical and exact solution * ************************************************************ integer n,m double precision u(n,m),f(n,m),dx,dy,alpha integer i,j double precision xx,yy,temp,error dx = 2.0 / (n-1) dy = 2.0 / (m-1) error = 0.0 do j = 1,m do i = 1,n xx = -1.0d0 + dx * dble(i-1) yy = -1.0d0 + dy * dble(j-1) temp = u(i,j) - (1.0-xx*xx)*(1.0-yy*yy) error = error + temp*temp enddo enddo error = sqrt(error)/dble(n*m) print *, 'Solution Error : ',error return end opari2-2.0.9/test/data/jacobi/F77/PaxHeaders/jacobi_test_3.out0000644000000000000000000000013214770056734020734 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F77/jacobi_test_3.out0000644000175100001440000000330614770056734021266 0ustar00builderusers 3: begin parallel 3: enter for 3: enter implicit barrier of paralleldo 3: exit implicit barrier of paralleldo 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.9/test/data/jacobi/F77/PaxHeaders/jacobi_test_2.out0000644000000000000000000000013214770056734020733 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F77/jacobi_test_2.out0000644000175100001440000000330614770056734021265 0ustar00builderusers 2: begin parallel 2: enter for 2: enter implicit barrier of paralleldo 2: exit implicit barrier of paralleldo 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.9/test/data/jacobi/F77/PaxHeaders/jacobi_test_1.out0000644000000000000000000000013214770056734020732 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F77/jacobi_test_1.out0000644000175100001440000000330614770056734021264 0ustar00builderusers 1: begin parallel 1: enter for 1: enter implicit barrier of paralleldo 1: exit implicit barrier of paralleldo 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.9/test/data/jacobi/F77/PaxHeaders/jacobi_test_0.out0000644000000000000000000000013214770056734020731 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F77/jacobi_test_0.out0000644000175100001440000000371614770056734021270 0ustar00builderusers 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of paralleldo 0: exit implicit barrier of paralleldo 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.9/test/data/jacobi/F77/PaxHeaders/jacobi.f0000644000000000000000000000013214770056734017071 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F77/jacobi.f0000644000175100001440000000447214770056734017430 0ustar00builderusers subroutine jacobi (n,m,dx,dy,alpha,omega,u,f,tol,maxit) ****************************************************************** * Subroutine HelmholtzJ * Solves poisson equation on rectangular grid assuming : * (1) Uniform discretization in each direction, and * (2) Dirichlect boundary conditions * * Jacobi method is used in this routine * * Input : n,m Number of grid points in the X/Y directions * dx,dy Grid spacing in the X/Y directions * alpha Helmholtz eqn. coefficient * omega Relaxation factor * f(n,m) Right hand side function * u(n,m) Dependent variable/Solution * tol Tolerance for iterative solver * maxit Maximum number of iterations * * Output : u(n,m) - Solution ***************************************************************** implicit none integer n,m,maxit double precision dx,dy,f(n,m),u(n,m),alpha, tol,omega * * Local variables * integer i,j,k,k_local double precision error,resid,rsum,ax,ay,b double precision error_local, uold(n,m) real ta,tb,tc,td,te,ta1,ta2,tb1,tb2,tc1,tc2,td1,td2 real te1,te2 * * Initialize coefficients ax = 1.0/(dx*dx) ! X-direction coef ay = 1.0/(dy*dy) ! Y-direction coef b = -2.0/(dx*dx)-2.0/(dy*dy) - alpha ! Central coeff error = 10.0 * tol k = 1 do while (k.le.maxit .and. error.gt. tol) error = 0.0 * Copy new solution into old C$omp parallel private(j,i) C$omp do do j=1,m do i=1,n uold(i,j) = u(i,j) enddo enddo C$omp end do * Compute stencil, residual, & update C$omp do reduction(+:error) do j = 2,m-1 do i = 2,n-1 * Evaluate residual resid = (ax*(uold(i-1,j) + uold(i+1,j)) & + ay*(uold(i,j-1) + uold(i,j+1)) & + b * uold(i,j) - f(i,j))/b * Update solution u(i,j) = uold(i,j) - omega * resid * Accumulate residual error error = error + resid*resid end do enddo C$omp end do C$omp end parallel * Error check k = k + 1 error = sqrt(error)/dble(n*m) * enddo ! End iteration loop * print *, 'Total Number of Iterations ', k print *, 'Residual ', error return end opari2-2.0.9/test/data/jacobi/PaxHeaders/F0000644000000000000000000000013214770056734015240 xustar0030 mtime=1742757340.107533403 30 atime=1742757371.935339406 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F/0000755000175100001440000000000014770056734015645 5ustar00builderusersopari2-2.0.9/test/data/jacobi/F/PaxHeaders/main.F900000644000000000000000000000013214770056734016521 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F/main.F900000644000175100001440000001707614770056734017064 0ustar00builderusersprogram MAIN !*********************************************************************** ! program to solve a finite difference * ! discretization of Helmholtz equation : * ! (d2/dx2)u + (d2/dy2)u - alpha u = f * ! using Jacobi iterative method. * ! * ! Modified: Abdelali Malih, Aachen University (RWTH), 2007 * ! Modified: Sanjiv Shah, Kuck and Associates, Inc. (KAI), 1998 * ! Author : Joseph Robicheaux, Kuck and Associates, Inc. (KAI), 1998 * ! * ! Directives are used in this code to achieve paralleism. * ! All do loops are parallized with default 'static' scheduling. * ! * ! Input : n - grid dimension in x direction * ! m - grid dimension in y direction * ! alpha - Helmholtz constant (always greater than 0.0) * ! tol - error tolerance for iterative solver * ! relax - Successice over relaxation parameter * ! mits - Maximum iterations for iterative solver * ! * ! On output * ! : u(n,m) - Dependent variable (solutions) * ! : f(n,m) - Right hand side function * !*********************************************************************** use VariableDef use JacobiMod #ifdef _OPENMP use omp_lib #endif implicit none double precision get_wtime TYPE(JacobiData) :: myData ! sets default values or reads from stdin ! * inits MPI and OpenMP if needed ! * distribute MPI data, calculate MPI bounds ! */ call Init(mydata) if ( allocated(myData%afU) .and. allocated(myData%afF) ) then ! /* matrix init */ call InitializeMatrix(myData) ! /* starting timer */ mydata%fTimeStart = get_wtime() ! /* running calculations */ call Jacobi(myData) ! /* stopping timer */ mydata%fTimeStop = get_wtime() ! /* error checking */ call CheckError(myData) ! /* print result summary */ call PrintResults(myData) else write (*,*) " Memory allocation failed ...\n" end if ! /* cleanup */ call Finish(myData) end program MAIN subroutine Init (myData) use VariableDef use omp_lib implicit none type(JacobiData), intent(inout) :: myData character(len=8) :: env = ' ' integer :: ITERATIONS = 5 integer :: iErr, i call get_environment_variable("ITERATIONS", env) if (len_trim(env) > 0) then read(env,*,iostat=iErr) i if ((iErr == 0) .and. (i > 0)) then ITERATIONS=i else print*, "Ignoring ITERATIONS=", env endif endif #ifdef _OPENMP write (6,*) 'Jacobi', omp_get_max_threads(), 'OpenMP-', _OPENMP, ' thread(s)' #else write (6,*) 'Jacobi (serial)' #endif !/* default medium */ myData%iCols = 2000 myData%iRows = 2000 myData%fAlpha = 0.8 myData%fRelax = 1.0 myData%fTolerance = 1e-10 myData%iIterMax = ITERATIONS write (*,327) "-> matrix size: ", myData%iCols, myData%iRows write (*,329) "-> alpha: " , myData%fAlpha write (*,329) "-> relax: ", myData%fRelax write (*,329) "-> tolerance: ", myData%fTolerance write (*,328) "-> iterations: ", myData%iIterMax flush(6) 327 format (A22, I10, ' x ', I10) 328 format (A22, I10) 329 format (A22, F10.6) ! /* MPI values, set to defaults to avoid data inconsistency */ myData%iMyRank = 0 myData%iNumProcs = 1 myData%iRowFirst = 0 myData%iRowLast = myData%iRows - 1 ! /* memory allocation for serial & omp */ allocate(myData%afU (0 : myData%iCols -1, 0 : myData%iRows -1)) allocate(myData%afF (0 : myData%iCols -1, 0 : myData%iRows -1)) ! /* calculate dx and dy */ myData%fDx = 2.0d0 / DBLE(myData%iCols - 1) myData%fDy = 2.0d0 / DBLE(myData%iRows - 1) myData%iIterCount = 0 end subroutine Init subroutine InitializeMatrix (myData) !********************************************************************* ! Initializes data * ! Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) * ! * !********************************************************************* use VariableDef implicit none type(JacobiData), intent(inout) :: myData !.. Local Scalars .. integer :: i, j, xx, yy !.. Intrinsic Functions .. intrinsic DBLE ! Initilize initial condition and RHS !$omp parallel do private (j, i, xx, yy) do j = myData%iRowFirst, myData%iRowLast do i = 0, myData%iCols -1 xx = INT(-1.0 + myData%fDx*DBLE(i)) ! -1 < x < 1 yy = INT(-1.0 + myData%fDy*DBLE(j)) ! -1 < y < 1 myData%afU(i, j) = 0.0d0 myData%afF(i, j) = - myData%fAlpha * (1.0d0 - DBLE(xx*xx)) & * (1.0d0 - DBLE(yy*yy)) - 2.0d0 * (1.0d0 - DBLE(xx*xx)) & - 2.0d0 * (1.0d0 - DBLE(yy*yy)) end do end do !$omp end parallel do end subroutine InitializeMatrix subroutine Finish(myData) use VariableDef implicit none integer :: iErr type(JacobiData), intent(inout) :: myData deallocate (myData%afU) deallocate (myData%afF) end subroutine Finish subroutine PrintResults(myData) use VariableDef implicit none type(JacobiData), intent(inout) :: myData if (myData%iMyRank == 0) then write (*,328) " Number of iterations : ", myData%iIterCount write (*,329) " Residual : ", myData%fResidual write (*,329) " Solution Error : ", myData%fError write (*,330) " Elapsed Time : ", & myData%fTimeStop - myData%fTimeStart write (*,330) " MFlops/s : ", & 0.000013 * DBLE (myData%iIterCount) & * DBLE((myData%iCols - 2) * (myData%iRows - 2)) & / (myData%fTimeStop - myData%fTimeStart) flush(6) 328 format (A, I8) 329 format (A, F15.12) 330 format (A, F15.6) end if end subroutine PrintResults subroutine CheckError(myData) use VariableDef implicit none type(JacobiData), intent(inout) :: myData !.. Local Scalars .. integer :: i, j, iErr double precision :: error, temp, xx, yy !.. Intrinsic Functions .. intrinsic DBLE, SQRT ! ... Executable Statements ... error = 0.0d0 do j = myData%iRowFirst, myData%iRowLast do i = 0, myData%iCols -1 xx = -1.0d0 + myData%fDx * DBLE(i) yy = -1.0d0 + myData%fDy * DBLE(j) temp = myData%afU(i, j) - (1.0d0-xx*xx)*(1.0d0-yy*yy) error = error + temp*temp end do end do myData%fError = sqrt(error) / DBLE(myData%iCols * myData%iRows) end subroutine CheckError double precision function get_wtime() #ifdef _OPENMP use omp_lib get_wtime = omp_get_wtime() #else real, dimension(2) :: tarray get_wtime = dtime(tarray) #endif return end function get_wtime opari2-2.0.9/test/data/jacobi/F/PaxHeaders/jacobi_test_3.out0000644000000000000000000000013214770056734020556 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F/jacobi_test_3.out0000644000175100001440000000330614770056734021110 0ustar00builderusers 3: begin parallel 3: enter for 3: enter implicit barrier of paralleldo 3: exit implicit barrier of paralleldo 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter for 3: enter implicit barrier of do 3: exit implicit barrier of do 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.9/test/data/jacobi/F/PaxHeaders/jacobi_test_2.out0000644000000000000000000000013214770056734020555 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F/jacobi_test_2.out0000644000175100001440000000330614770056734021107 0ustar00builderusers 2: begin parallel 2: enter for 2: enter implicit barrier of paralleldo 2: exit implicit barrier of paralleldo 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter for 2: enter implicit barrier of do 2: exit implicit barrier of do 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.9/test/data/jacobi/F/PaxHeaders/jacobi_test_1.out0000644000000000000000000000013214770056734020554 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F/jacobi_test_1.out0000644000175100001440000000330614770056734021106 0ustar00builderusers 1: begin parallel 1: enter for 1: enter implicit barrier of paralleldo 1: exit implicit barrier of paralleldo 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter for 1: enter implicit barrier of do 1: exit implicit barrier of do 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.9/test/data/jacobi/F/PaxHeaders/jacobi_test_0.out0000644000000000000000000000013214770056734020553 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F/jacobi_test_0.out0000644000175100001440000000371614770056734021112 0ustar00builderusers 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of paralleldo 0: exit implicit barrier of paralleldo 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter for 0: enter implicit barrier of do 0: exit implicit barrier of do 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.9/test/data/jacobi/F/PaxHeaders/jacobi.F900000644000000000000000000000013214770056734017024 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F/jacobi.F900000644000175100001440000001004714770056734017356 0ustar00builderusersmodule JacobiMod use VariableDef implicit none contains subroutine Jacobi(myData) implicit none !******************************************************************** ! Subroutine HelmholtzJ * ! Solves poisson equation on rectangular grid assuming : * ! (1) Uniform discretization in each direction, and * ! (2) Dirichlect boundary conditions * ! Jacobi method is used in this routine * ! * ! Input : n,m Number of grid points in the X/Y directions * ! dx,dy Grid spacing in the X/Y directions * ! alpha Helmholtz eqn. coefficient * ! omega Relaxation factor * ! myData%afF(n,m) Right hand side function * ! myData%afU(n,m) Dependent variable/Solution * ! tol Tolerance for iterative solver * ! maxit Maximum number of iterations * ! * ! Output : myData%afU(n,m) - Solution * !******************************************************************** !.. Formal Arguments .. type(JacobiData), intent(inout) :: myData !.. Local Scalars .. integer :: i, j, iErr double precision :: ax, ay, b, residual, fLRes, tmpResd !.. Local Arrays .. double precision, allocatable :: uold(:,:) !.. Intrinsic Functions .. intrinsic DBLE, SQRT allocate(uold (0 : myData%iCols -1, 0 : myData%iRows -1)) ! ... Executable Statements ... ! Initialize coefficients if (allocated(uold)) then ax = 1.0d0 / (myData%fDx * myData%fDx) ! X-direction coef ay = 1.0d0 / (myData%fDx * myData%fDx) ! Y-direction coef b = -2.0d0 * (ax + ay) - myData%fAlpha ! Central coeff residual = 10.0d0 * myData%fTolerance do while (myData%iIterCount < myData%iIterMax .and. residual > myData%fTolerance) residual = 0.0d0 ! Copy new solution into old, including the boundary. !$omp parallel private(fLRes, tmpResd, i) !$omp do do j = myData%iRowFirst, myData%iRowLast do i = 0, myData%iCols - 1 uold(i, j) = myData%afU(i, j) end do end do !$omp end do !$omp do reduction(+:residual) ! Compute stencil, residual, & update. ! Update excludes the boundary. do j = myData%iRowFirst + 1, myData%iRowLast - 1 do i = 1, myData%iCols - 2 ! Evaluate residual fLRes = (ax * (uold(i-1, j) + uold(i+1, j)) & + ay * (uold(i, j-1) + uold(i, j+1)) & + b * uold(i, j) - myData%afF(i, j)) / b ! Update solution myData%afU(i, j) = uold(i, j) - myData%fRelax * fLRes ! Accumulate residual error residual = residual + fLRes * fLRes end do end do !$omp end do !$omp end parallel ! Error check myData%iIterCount = myData%iIterCount + 1 residual = SQRT(residual) / DBLE(myData%iCols * myData%iRows) ! End iteration loop end do myData%fResidual = residual deallocate(uold) else write (*,*) 'Error: cant allocate memory' call Finish(myData) stop end if end subroutine Jacobi end module JacobiMod opari2-2.0.9/test/data/jacobi/F/PaxHeaders/VariableDef.f900000644000000000000000000000013214770056734020001 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/F/VariableDef.f900000644000175100001440000000215014770056734020327 0ustar00builderusersmodule VariableDef implicit none TYPE JacobiData integer :: iRows integer :: iCols integer :: iRowFirst integer :: iRowLast integer :: iIterMax double precision :: fAlpha double precision :: fRelax double precision :: fTolerance ! /* calculated dx & dy */ double precision :: fDx double precision :: fDy ! /* pointers to the allocated memory */ double precision, allocatable :: afU(:,:) double precision, allocatable :: afF(:,:) ! /* start and end timestamps */ double precision :: fTimeStart double precision :: fTimeStop ! /* calculated residual (output jacobi) */ double precision :: fResidual ! /* effective interation count (output jacobi) */ integer :: iIterCount ! /* calculated error (output error_check) */ double precision :: fError ! /* MPI-Variables */ integer :: iMyRank !/* current process rank (number) */ integer :: iNumProcs !/* how many processes */ END TYPE JacobiData end module VariableDef opari2-2.0.9/test/data/jacobi/PaxHeaders/C0000644000000000000000000000013214770056734015235 xustar0030 mtime=1742757340.107533403 30 atime=1742757371.935339406 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C/0000755000175100001440000000000014770056734015642 5ustar00builderusersopari2-2.0.9/test/data/jacobi/C/PaxHeaders/main.c0000644000000000000000000000013214770056734016402 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C/main.c0000644000175100001440000001346314770056734016741 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #include #include #include #include #ifdef _OPENMP #include #else #include #endif #include "jacobi.h" #define U( j, i ) data->afU[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] #define F( j, i ) data->afF[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] /* * setting values, init mpi, omp etc */ void Init( struct JacobiData* data, int* argc, char** argv ) { int i; int block_lengths[ 8 ]; int ITERATIONS = 5; char* env = getenv( "ITERATIONS" ); if ( env ) { int iterations = atoi( env ); if ( iterations > 0 ) { ITERATIONS = iterations; } else { printf( "Ignoring invalid ITERATIONS=%s!\n", env ); } } #ifdef _OPENMP printf( "Jacobi %d OpenMP-%u thread(s)\n", omp_get_max_threads(), _OPENMP ); #else printf( "Jacobi (serial)\n" ); #endif /* default medium */ data->iCols = 2000; data->iRows = 2000; data->fAlpha = 0.8; data->fRelax = 1.0; data->fTolerance = 1e-10; data->iIterMax = ITERATIONS; printf( "\n-> matrix size: %dx%d" "\n-> alpha: %f" "\n-> relax: %f" "\n-> tolerance: %f" "\n-> iterations: %d \n\n", data->iCols, data->iRows, data->fAlpha, data->fRelax, data->fTolerance, data->iIterMax ); /* MPI values, set to defaults to avoid data inconsistency */ data->iMyRank = 0; data->iNumProcs = 1; data->iRowFirst = 0; data->iRowLast = data->iRows - 1; /* memory allocation for serial & omp */ data->afU = ( double* )malloc( data->iRows * data->iCols * sizeof( double ) ); data->afF = ( double* )malloc( data->iRows * data->iCols * sizeof( double ) ); /* calculate dx and dy */ data->fDx = 2.0 / ( data->iCols - 1 ); data->fDy = 2.0 / ( data->iRows - 1 ); data->iIterCount = 0; return; } /* * final cleanup routines */ void Finish( struct JacobiData* data ) { free( data->afU ); free( data->afF ); return; } /* * print result summary */ void PrintResults( const struct JacobiData* data ) { if ( data->iMyRank == 0 ) { printf( " Number of iterations : %d\n", data->iIterCount ); printf( " Residual : %le\n", data->fResidual ); printf( " Solution Error : %1.12lf\n", data->fError ); printf( " Elapsed Time : %5.7lf\n", data->fTimeStop - data->fTimeStart ); printf( " MFlops : %6.6lf\n", 0.000013 * data->iIterCount * ( data->iCols - 2 ) * ( data->iRows - 2 ) / ( data->fTimeStop - data->fTimeStart ) ); } return; } /* * Initializes matrix * Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) */ void InitializeMatrix( struct JacobiData* data ) { int i, j, xx, yy, xx2, yy2; /* Initialize initial condition and RHS */ #pragma omp parallel for private(i, j, xx, yy, xx2, yy2) for ( j = data->iRowFirst; j <= data->iRowLast; j++ ) { for ( i = 0; i < data->iCols; i++ ) { xx = ( int )( -1.0 + data->fDx * i ); yy = ( int )( -1.0 + data->fDy * j ); xx2 = xx * xx; yy2 = yy * yy; U( j, i ) = 0.0; F( j, i ) = -data->fAlpha * ( 1.0 - xx2 ) * ( 1.0 - yy2 ) + 2.0 * ( -2.0 + xx2 + yy2 ); } } } /* * Checks error between numerical and exact solution */ void CheckError( struct JacobiData* data ) { double error = 0.0; int i, j; double xx, yy, temp; for ( j = data->iRowFirst; j <= data->iRowLast; j++ ) { if ( ( data->iMyRank != 0 && j == data->iRowFirst ) || ( data->iMyRank != data->iNumProcs - 1 && j == data->iRowLast ) ) { continue; } for ( i = 0; i < data->iCols; i++ ) { xx = -1.0 + data->fDx * i; yy = -1.0 + data->fDy * j; temp = U( j, i ) - ( 1.0 - xx * xx ) * ( 1.0 - yy * yy ); error += temp * temp; } } data->fError = sqrt( error ) / ( data->iCols * data->iRows ); return; } double get_wtime() { #ifdef _OPENMP return omp_get_wtime(); #else struct timeval tp; gettimeofday( &tp, 0 ); return tp.tv_sec + ( tp.tv_usec * 1.0e-6 ); #endif } int main( int argc, char** argv ) { int retVal = 0; /* return value */ struct JacobiData myData; /* sets default values or reads from stdin * inits MPI and OpenMP if needed * distribute MPI data, calculate MPI bounds */ Init( &myData, &argc, argv ); if ( myData.afU && myData.afF ) { /* matrix init */ InitializeMatrix( &myData ); /* starting timer */ myData.fTimeStart = get_wtime(); /* running calculations */ Jacobi( &myData ); /* stopping timer */ myData.fTimeStop = get_wtime(); /* error checking */ CheckError( &myData ); /* print result summary */ PrintResults( &myData ); } else { printf( " Memory allocation failed ...\n" ); retVal = -1; } /* cleanup */ Finish( &myData ); return retVal; } opari2-2.0.9/test/data/jacobi/C/PaxHeaders/jacobi_test_3.out0000644000000000000000000000013214770056734020553 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C/jacobi_test_3.out0000644000175100001440000000333414770056734021106 0ustar00builderusers 3: begin parallel 3: enter for 3: enter implicit barrier of parallelfor 3: exit implicit barrier of parallelfor 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.9/test/data/jacobi/C/PaxHeaders/jacobi_test_2.out0000644000000000000000000000013214770056734020552 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C/jacobi_test_2.out0000644000175100001440000000333414770056734021105 0ustar00builderusers 2: begin parallel 2: enter for 2: enter implicit barrier of parallelfor 2: exit implicit barrier of parallelfor 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.9/test/data/jacobi/C/PaxHeaders/jacobi_test_1.out0000644000000000000000000000013214770056734020551 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C/jacobi_test_1.out0000644000175100001440000000333414770056734021104 0ustar00builderusers 1: begin parallel 1: enter for 1: enter implicit barrier of parallelfor 1: exit implicit barrier of parallelfor 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.9/test/data/jacobi/C/PaxHeaders/jacobi_test_0.out0000644000000000000000000000013214770056734020550 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C/jacobi_test_0.out0000644000175100001440000000374414770056734021110 0ustar00builderusers 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of parallelfor 0: exit implicit barrier of parallelfor 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.9/test/data/jacobi/C/PaxHeaders/jacobi.h0000644000000000000000000000013214770056734016712 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C/jacobi.h0000644000175100001440000000167014770056734017246 0ustar00builderusers#ifndef _JACOBI_H #define _JACOBI_H struct JacobiData { /* input data */ int iRows; int iCols; int iRowFirst; int iRowLast; int iIterMax; double fAlpha; double fRelax; double fTolerance; /* calculated dx & dy */ double fDx; double fDy; /* pointers to the allocated memory */ double* afU; double* afF; /* start and end timestamps */ double fTimeStart; double fTimeStop; /* calculated residual (output jacobi) */ double fResidual; /* effective interation count (output jacobi) */ int iIterCount; /* calculated error (output error_check) */ double fError; /* MPI-Variables */ int iMyRank; /* current process rank (number) */ int iNumProcs; /* how many processes */ }; /* jacobi calculation routine */ void Jacobi( struct JacobiData* data ); /* final cleanup routines */ void Finish( struct JacobiData* data ); #endif opari2-2.0.9/test/data/jacobi/C/PaxHeaders/jacobi.c0000644000000000000000000000013214770056734016705 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C/jacobi.c0000644000175100001440000000660114770056734017240 0ustar00builderusers/* ****************************************************************** * Subroutine HelmholtzJ * Solves poisson equation on rectangular grid assuming : * (1) Uniform discretization in each direction, and * (2) Dirichlect boundary conditions * * Jacobi method is used in this routine * * Input : n,m Number of grid points in the X/Y directions * dx,dy Grid spacing in the X/Y directions * alpha Helmholtz eqn. coefficient * omega Relaxation factor * f(n,m) Right hand side function * u(n,m) Dependent variable/Solution * tolerance Tolerance for iterative solver * maxit Maximum number of iterations * * Output : u(n,m) - Solution ***************************************************************** */ #include #include #include #include "jacobi.h" #define U( j, i ) afU[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] #define F( j, i ) afF[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] #define UOLD( j, i ) uold[ ( ( j ) - data->iRowFirst ) * data->iCols + ( i ) ] void Jacobi( struct JacobiData* data ) { /*use local pointers for performance reasons*/ double* afU, * afF; int i, j; double fLRes; double ax, ay, b, residual, tmpResd; double* uold = ( double* )malloc( data->iCols * data->iRows * sizeof( double ) ); afU = data->afU; afF = data->afF; if ( uold ) { ax = 1.0 / ( data->fDx * data->fDx ); /* X-direction coef */ ay = 1.0 / ( data->fDy * data->fDy ); /* Y_direction coef */ b = -2.0 * ( ax + ay ) - data->fAlpha; /* Central coeff */ residual = 10.0 * data->fTolerance; while ( data->iIterCount < data->iIterMax && residual > data->fTolerance ) { residual = 0.0; /* Copy new solution into old, including the boundary. */ #pragma omp parallel { #pragma omp for private(j, i) for ( j = data->iRowFirst; j <= data->iRowLast; j++ ) { for ( i = 0; i < data->iCols; i++ ) { UOLD( j, i ) = U( j, i ); } } /* Compute stencil, residual and update. * Update excludes the boundary. */ #pragma omp for private(j, i, fLRes) reduction(+:residual) for ( j = data->iRowFirst + 1; j <= data->iRowLast - 1; j++ ) { for ( i = 1; i < data->iCols - 1; i++ ) { fLRes = ( ax * ( UOLD( j, i - 1 ) + UOLD( j, i + 1 ) ) + ay * ( UOLD( j - 1, i ) + UOLD( j + 1, i ) ) + b * UOLD( j, i ) - F( j, i ) ) / b; /* update solution */ U( j, i ) = UOLD( j, i ) - data->fRelax * fLRes; /* accumulate residual error */ residual += fLRes * fLRes; } } } /* end omp parallel */ /* error check */ ( data->iIterCount )++; residual = sqrt( residual ) / ( data->iCols * data->iRows ); } /* while */ data->fResidual = residual; free( uold ); } else { fprintf( stderr, "Error: cant allocate memory\n" ); Finish( data ); exit( 1 ); } } opari2-2.0.9/test/data/jacobi/PaxHeaders/C++0000644000000000000000000000013214770056734015363 xustar0030 mtime=1742757340.107533403 30 atime=1742757371.935339406 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C++/0000755000175100001440000000000014770056734015770 5ustar00builderusersopari2-2.0.9/test/data/jacobi/C++/PaxHeaders/main.cpp0000644000000000000000000000013214770056734017070 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C++/main.cpp0000644000175100001440000001266714770056734017434 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #include #include #include #include #include #ifdef _OPENMP #include #else #include #endif #include "jacobi.h" #define U( j, i ) data.afU[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] #define F( j, i ) data.afF[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] using namespace std; // setting values, init mpi, omp etc void Init( JacobiData &data, int & argc, char** argv ) { int ITERATIONS = 5; char* env = getenv( "ITERATIONS" ); if ( env ) { int iterations = atoi( env ); if ( iterations > 0 ) { ITERATIONS = iterations; } else { printf( "Ignoring invalid ITERATIONS=%s!\n", env ); } } #ifdef _OPENMP printf( "Jacobi %d OpenMP-%u thread(s)\n", omp_get_max_threads(), _OPENMP ); #else printf( "Jacobi (serial)\n" ); #endif // default medium data.iCols = 2000; data.iRows = 2000; data.fAlpha = 0.8; data.fRelax = 1.0; data.fTolerance = 1e-10; data.iIterMax = ITERATIONS; cout << "\n-> matrix size: " << data.iCols << "x" << data.iRows << "\n-> alpha: " << data.fAlpha << "\n-> relax: " << data.fRelax << "\n-> tolerance: " << data.fTolerance << "\n-> iterations: " << data.iIterMax << endl << endl; // MPI values, set to defaults to avoid data inconsistency data.iMyRank = 0; data.iNumProcs = 1; data.iRowFirst = 0; data.iRowLast = data.iRows - 1; // memory allocation for serial & omp data.afU = new double[ data.iRows * data.iCols ]; data.afF = new double[ data.iRows * data.iCols ]; // calculate dx and dy data.fDx = 2.0 / ( data.iCols - 1 ); data.fDy = 2.0 / ( data.iRows - 1 ); data.iIterCount = 0; return; } // final cleanup routines void Finish( JacobiData &data ) { delete[] data.afU; delete[] data.afF; return; } // print result summary void PrintResults( const JacobiData &data ) { if ( data.iMyRank == 0 ) { cout << " Number of iterations : " << data.iIterCount << endl; cout << " Residual : " << data.fResidual << endl; cout << " Solution Error : " << data.fError << endl; cout << " Elapsed Time : " << data.fTimeStop - data.fTimeStart << endl; cout << " MFlops : " << 0.000013 * data.iIterCount * ( data.iCols - 2 ) * ( data.iRows - 2 ) / ( data.fTimeStop - data.fTimeStart ) << endl; } return; } // Initializes matrix // Assumes exact solution is u(x,y) = (1-x^2)*(1-y^2) void InitializeMatrix( JacobiData &data ) { /* Initilize initial condition and RHS */ #pragma omp parallel for for ( int j = data.iRowFirst; j <= data.iRowLast; j++ ) { for ( int i = 0; i < data.iCols; i++ ) { int xx = ( int )( -1.0 + data.fDx * i ); int yy = ( int )( -1.0 + data.fDy * j ); int xx2 = xx * xx; int yy2 = yy * yy; U( j, i ) = 0.0; F( j, i ) = -data.fAlpha * ( 1.0 - xx2 ) * ( 1.0 - yy2 ) + 2.0 * ( -2.0 + xx2 + yy2 ); } } } // Checks error between numerical and exact solution void CheckError( JacobiData &data ) { double error = 0.0; for ( int j = data.iRowFirst; j <= data.iRowLast; j++ ) { if ( ( data.iMyRank != 0 && j == data.iRowFirst ) || ( data.iMyRank != data.iNumProcs - 1 && j == data.iRowLast ) ) { continue; } for ( int i = 0; i < data.iCols; i++ ) { double xx = -1.0 + data.fDx * i; double yy = -1.0 + data.fDy * j; double temp = U( j, i ) - ( 1.0 - xx * xx ) * ( 1.0 - yy * yy ); error += temp * temp; } } data.fError = sqrt( error ) / ( data.iCols * data.iRows ); } double get_wtime() { #ifdef _OPENMP return omp_get_wtime(); #else struct timeval tp; gettimeofday( &tp, 0 ); return tp.tv_sec + ( tp.tv_usec * 1.0e-6 ); #endif } int main( int argc, char** argv ) { int retVal = 0; // return value JacobiData myData; // sets default values or reads from stdin // inits MPI and OpenMP if needed // distribute MPI data, calculate MPI bounds Init( myData, argc, argv ); if ( myData.afU && myData.afF ) { // matrix init InitializeMatrix( myData ); // starting timer myData.fTimeStart = get_wtime(); // running calculations Jacobi( myData ); // stopping timer myData.fTimeStop = get_wtime(); // error checking CheckError( myData ); // print result summary PrintResults( myData ); } else { cout << " Memory allocation failed ...\n"; retVal = -1; } // cleanup Finish( myData ); return retVal; } opari2-2.0.9/test/data/jacobi/C++/PaxHeaders/jacobi_test_3.out0000644000000000000000000000013214770056734020701 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C++/jacobi_test_3.out0000644000175100001440000000333414770056734021234 0ustar00builderusers 3: begin parallel 3: enter for 3: enter implicit barrier of parallelfor 3: exit implicit barrier of parallelfor 3: exit for 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel 3: begin parallel 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter for 3: enter implicit barrier of for 3: exit implicit barrier of for 3: exit for 3: enter implicit barrier of parallel 3: exit implicit barrier of parallel 3: end parallel opari2-2.0.9/test/data/jacobi/C++/PaxHeaders/jacobi_test_2.out0000644000000000000000000000013214770056734020700 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C++/jacobi_test_2.out0000644000175100001440000000333414770056734021233 0ustar00builderusers 2: begin parallel 2: enter for 2: enter implicit barrier of parallelfor 2: exit implicit barrier of parallelfor 2: exit for 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel 2: begin parallel 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter for 2: enter implicit barrier of for 2: exit implicit barrier of for 2: exit for 2: enter implicit barrier of parallel 2: exit implicit barrier of parallel 2: end parallel opari2-2.0.9/test/data/jacobi/C++/PaxHeaders/jacobi_test_1.out0000644000000000000000000000013214770056734020677 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C++/jacobi_test_1.out0000644000175100001440000000333414770056734021232 0ustar00builderusers 1: begin parallel 1: enter for 1: enter implicit barrier of parallelfor 1: exit implicit barrier of parallelfor 1: exit for 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel 1: begin parallel 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter for 1: enter implicit barrier of for 1: exit implicit barrier of for 1: exit for 1: enter implicit barrier of parallel 1: exit implicit barrier of parallel 1: end parallel opari2-2.0.9/test/data/jacobi/C++/PaxHeaders/jacobi_test_0.out0000644000000000000000000000013214770056734020676 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C++/jacobi_test_0.out0000644000175100001440000000374414770056734021236 0ustar00builderusers 0: init 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of parallelfor 0: exit implicit barrier of parallelfor 0: exit for 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: fork parallel 0: begin parallel 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter for 0: enter implicit barrier of for 0: exit implicit barrier of for 0: exit for 0: enter implicit barrier of parallel 0: exit implicit barrier of parallel 0: end parallel 0: join parallel 0: finalize opari2-2.0.9/test/data/jacobi/C++/PaxHeaders/jacobi.h0000644000000000000000000000013214770056734017040 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C++/jacobi.h0000644000175100001440000000161614770056734017374 0ustar00builderusers#ifndef _JACOBI_H #define _JACOBI_H struct JacobiData { // input data int iRows; int iCols; int iRowFirst; int iRowLast; int iIterMax; double fAlpha; double fRelax; double fTolerance; // calculated dx & dy double fDx; double fDy; // pointers to the allocated memory double* afU; double* afF; // start and end timestamps double fTimeStart; double fTimeStop; // calculated residual (output jacobi) double fResidual; // effective interation count (output jacobi) int iIterCount; // calculated error (output error_check) double fError; // MPI-Variables int iMyRank; // current process rank (number) int iNumProcs; // how many processes }; // jacobi calculation routine void Jacobi( JacobiData &data ); // final cleanup routines void Finish( JacobiData &data ); #endif opari2-2.0.9/test/data/jacobi/C++/PaxHeaders/jacobi.cpp0000644000000000000000000000013214770056734017373 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/jacobi/C++/jacobi.cpp0000644000175100001440000000644014770056734017727 0ustar00builderusers/* ****************************************************************** * Subroutine HelmholtzJ * Solves poisson equation on rectangular grid assuming : * (1) Uniform discretization in each direction, and * (2) Dirichlect boundary conditions * * Jacobi method is used in this routine * * Input : n,m Number of grid points in the X/Y directions * dx,dy Grid spacing in the X/Y directions * alpha Helmholtz eqn. coefficient * omega Relaxation factor * f(n,m) Right hand side function * u(n,m) Dependent variable/Solution * tolerance Tolerance for iterative solver * maxit Maximum number of iterations * * Output : u(n,m) - Solution ***************************************************************** */ #include #include #include #include "jacobi.h" using namespace std; #define U( j, i ) afU[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] #define F( j, i ) afF[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] #define UOLD( j, i ) uold[ ( ( j ) - data.iRowFirst ) * data.iCols + ( i ) ] void Jacobi( JacobiData& data ) { /*use local pointers for performance reasons*/ double* afU, * afF; afU = data.afU; afF = data.afF; double* uold = new double[ data.iCols * data.iRows ]; if ( uold ) { double ax = 1.0 / ( data.fDx * data.fDx ); /* X-direction coef */ double ay = 1.0 / ( data.fDy * data.fDy ); /* Y_direction coef */ double b = -2.0 * ( ax + ay ) - data.fAlpha; /* Central coeff */ double residual = 10.0 * data.fTolerance; while ( data.iIterCount < data.iIterMax&& residual > data.fTolerance ) { residual = 0.0; /* Copy new solution into old, excluding the boundary. */ #pragma omp parallel { #pragma omp for for ( int j = data.iRowFirst; j <= data.iRowLast; j++ ) { for ( int i = 0; i < data.iCols; i++ ) { UOLD( j, i ) = U( j, i ); } } double fLRes; /* Compute stencil, residual and update. * Update excludes the boundary */ #pragma omp for reduction(+:residual) for ( int j = data.iRowFirst + 1; j <= data.iRowLast - 1; j++ ) { for ( int i = 1; i < data.iCols - 1; i++ ) { fLRes = ( ax * ( UOLD( j, i - 1 ) + UOLD( j, i + 1 ) ) + ay * ( UOLD( j - 1, i ) + UOLD( j + 1, i ) ) + b * UOLD( j, i ) - F( j, i ) ) / b; /* update solution */ U( j, i ) = UOLD( j, i ) - data.fRelax * fLRes; /* accumulate residual error */ residual += fLRes * fLRes; } } } /* end omp parallel */ /* error check */ data.iIterCount++; residual = sqrt( residual ) / ( data.iCols * data.iRows ); } /* while */ data.fResidual = residual; delete[] uold; } else { cerr << "Error: cant allocate memory\n"; Finish( data ); exit( 1 ); } } opari2-2.0.9/test/data/PaxHeaders/awk_script_test.input0000644000000000000000000000013214770056734020167 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/awk_script_test.input0000644000175100001440000000036114770056734020517 0ustar00builderusers0000000000000357 t _GLOBAL__sub_I_POMP2_Init_reg_kkbk2e7u08rek_1 0000000000000000 T POMP2_Init_reg_kkbk2e7u08rek_1 0000000000000357 t _GLOBAL__sub_I_POMP2_USER_Init_reg_kkbk2e7uxxrek_2 0000000000000000 T POMP2_USER_Init_reg_kkbk2e7uxxrek_2 opari2-2.0.9/test/data/PaxHeaders/awk_script_test.out.in0000644000000000000000000000013214770056734020244 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.191368321 opari2-2.0.9/test/data/awk_script_test.out.in0000644000175100001440000000067214770056734020601 0ustar00builderusers #ifdef __cplusplus extern "C" { #endif #include extern void POMP2_Init_reg_kkbk2e7u08rek_1(); extern void POMP2_USER_Init_reg_kkbk2e7uxxrek_2(); void POMP2_Init_regions() { POMP2_Init_reg_kkbk2e7u08rek_1(); } size_t POMP2_Get_num_regions() { return 1; } void POMP2_USER_Init_regions() { POMP2_USER_Init_reg_kkbk2e7uxxrek_2(); } size_t POMP2_USER_Get_num_regions() { return 2; } #ifdef __cplusplus } #endif opari2-2.0.9/PaxHeaders/src0000644000000000000000000000013214770056767012531 xustar0030 mtime=1742757367.263367882 30 atime=1742757371.935339406 30 ctime=1742757367.263367882 opari2-2.0.9/src/0000755000175100001440000000000014770056767013136 5ustar00builderusersopari2-2.0.9/src/PaxHeaders/opari0000644000000000000000000000013214770056767013643 xustar0030 mtime=1742757367.387367126 30 atime=1742757371.935339406 30 ctime=1742757367.387367126 opari2-2.0.9/src/opari/0000755000175100001440000000000014770056767014250 5ustar00builderusersopari2-2.0.9/src/opari/PaxHeaders/opari2_config.h0000644000000000000000000000013214770056734016604 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.387367126 opari2-2.0.9/src/opari/opari2_config.h0000644000175100001440000000570314770056734017141 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_config.h * * @brief */ #include #include class OPARI_Config { /* ****************************************** Implemented public methods */ public: /** Constructor */ OPARI_Config( void ); /** Destructor */ virtual ~ OPARI_Config( void ); /** Reads the configuration data from a file. To handle the read data you need to implement the AddLibDir() AddIncDir() AddLib() and SetCompilerFlags() methods. @param arg0 The first argument to the toll call. Should contain the tool name. Needed to find the executable path. @returns SCOREP_SUCCESS if the file was successfully parsed. */ void readConfigFile( std::string arg0 ); /** Changes from the install path to the build path. */ void setBuildCheck( void ); /* **************************************** Protected implmented methods */ private: /** This function gives a (key, value) pair found in a configuration file and not processed by one of the former functions. @param key The key @param value The value */ virtual void set_value( std::string key, std::string value ); /** Extracts parameter from configuration file It expects lines of the format key=value. Furthermore it truncates line at the scrpit comment character '#'. @param line input line from the config file @returns SCOREP_SUCCESS if the line was successfully parsed. Else it returns an error code. */ void read_parameter( std::string line ); /* *************************************************** Public members */ public: /**nm command*/ std::string m_nm; /** awk command*/ std::string m_awk; /** egrep command*/ std::string m_egrep; /** version information*/ std::string m_version; /** pomp2 api version information*/ std::string m_pomp2_api_version; /** awk script to use */ std::string m_script; /** include path for installed headers */ std::string m_cflags; }; opari2-2.0.9/src/opari/PaxHeaders/opari2_config.cc0000644000000000000000000000013214770056734016742 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.387367126 opari2-2.0.9/src/opari/opari2_config.cc0000644000175100001440000002600414770056734017274 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, 2019, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2025, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ /** @internal * * @file opari2_config.cc * * @brief Implementation of the OPARI2 config tool. * */ #include #include #include #include #include #include "opari2_config.h" #if HAVE( READLINK ) #include #endif #define ACTION_NM 1 #define ACTION_AWK 2 #define ACTION_SCRIPT 3 #define ACTION_EGREP 4 #define ACTION_VERSION 5 #define ACTION_NM2AWK 6 #define ACTION_CFLAGS 7 #define ACTION_POMP2_API_VERSION 8 #define ACTION_CFLAGS_GNU 9 #define ACTION_CFLAGS_INTEL 10 #define ACTION_CFLAGS_CLANG 11 void opari2_print_help( char** argv ) { std::string usage = #include "opari2-config_usage.h" ; std::cout << "\n\n" << usage << std::endl; } int main( int argc, char** argv ) { int i; int action = 0; char* config_file = NULL; int n_obj_files = 0; char** obj_files = NULL; OPARI_Config app; bool fortran = false; /* parsing the command line */ for ( i = 1; i < argc; i++ ) { if ( strcmp( argv[ i ], "--help" ) == 0 || strcmp( argv[ i ], "-h" ) == 0 ) { opari2_print_help( argv ); return EXIT_SUCCESS; } else if ( strcmp( argv[ i ], "--nm" ) == 0 ) { action = ACTION_NM; } else if ( strcmp( argv[ i ], "--awk-cmd" ) == 0 ) { action = ACTION_AWK; } else if ( strcmp( argv[ i ], "--awk-script" ) == 0 ) { action = ACTION_SCRIPT; } else if ( strcmp( argv[ i ], "--region-initialization" ) == 0 ) { action = ACTION_SCRIPT; } else if ( strcmp( argv[ i ], "--egrep" ) == 0 ) { action = ACTION_EGREP; } else if ( strcmp( argv[ i ], "--cflags=gnu" ) == 0 ) { action = ACTION_CFLAGS_GNU; } else if ( strcmp( argv[ i ], "--cflags=intel" ) == 0 ) { action = ACTION_CFLAGS_INTEL; } else if ( strcmp( argv[ i ], "--cflags=clang" ) == 0 ) { action = ACTION_CFLAGS_CLANG; } else if ( ( strcmp( argv[ i ], "--cflags" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=sun" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=pgi" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=ibm" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=cray" ) == 0 ) || ( strcmp( argv[ i ], "--cflags=fujitsu" ) == 0 ) ) { action = ACTION_CFLAGS; } else if ( strcmp( argv[ i ], "--create-pomp2-regions" ) == 0 ) { int j = 0; n_obj_files = argc - i - 1; if ( n_obj_files > 0 ) { obj_files = new char*[ n_obj_files ]; while ( ++i < argc ) { obj_files[ j++ ] = argv[ i ]; } action = ACTION_NM2AWK; } else { std::cerr << "\nERROR: Object files missing. Abort.\n" << std::endl; return EXIT_FAILURE; } } else if ( strcmp( argv[ i ], "--version" ) == 0 ) { action = ACTION_VERSION; } else if ( strcmp( argv[ i ], "--interface-version" ) == 0 ) { action = ACTION_POMP2_API_VERSION; } else if ( strcmp( argv[ i ], "--revision" ) == 0 ) { std::cout << SCOREP_COMPONENT_REVISION << std::endl; exit( EXIT_SUCCESS ); } else if ( strcmp( argv[ i ], "--opari2-revision" ) == 0 || strcmp( argv[ i ], "--common-revision" ) == 0 ) { std::cerr << "[OPARI2] warning: " << argv[ i ] << " is deprecated" << std::endl; std::cout << SCOREP_COMPONENT_REVISION << std::endl; exit( EXIT_SUCCESS ); } else if ( strncmp( argv[ i ], "--config", 8 ) == 0 ) { // Expect the config file name after an equal sign if ( ( argv[ i ][ 8 ] == '=' ) && ( argv[ i ][ 9 ] != '\0' ) ) { config_file = &argv[ i ][ 9 ]; } else { std::cerr << "\nConfig file name missing. Abort.\n" << std::endl; return EXIT_FAILURE; } } else if ( strcmp( argv[ i ], "--build-check" ) == 0 ) { app.setBuildCheck(); } else if ( strcmp( argv[ i ], "--fortran" ) == 0 ) { fortran = true; } else { std::cerr << "\nUnknown option " << argv[ i ] << ". Abort.\n" << std::endl; std::cerr << "Print " << argv[ 0 ] << " --help to get a list of options" << std::endl; return EXIT_FAILURE; } } /* read data in case a config file was specified */ if ( config_file != NULL ) { app.readConfigFile( config_file ); } switch ( action ) { case ACTION_NM: std::cout << app.m_nm; std::cout.flush(); break; case ACTION_AWK: std::cout << app.m_awk; std::cout.flush(); break; case ACTION_SCRIPT: std::cout << app.m_script; std::cout.flush(); break; case ACTION_EGREP: std::cout << app.m_egrep; std::cout.flush(); break; case ACTION_CFLAGS: std::cout << app.m_cflags; std::cout.flush(); break; case ACTION_CFLAGS_GNU: if ( fortran ) { std::cout << app.m_cflags << " -Wno-unused"; } else { std::cout << app.m_cflags; } std::cout.flush(); break; case ACTION_CFLAGS_INTEL: if ( fortran ) { std::cout << app.m_cflags << " -warn nounused"; } else { std::cout << app.m_cflags; } std::cout.flush(); break; case ACTION_CFLAGS_CLANG: if ( fortran ) { std::cout << app.m_cflags; // As of 2025-03, just '-Werror' is supported. } else { std::cout << app.m_cflags << " -Wno-unused-command-line-argument"; } std::cout.flush(); break; case ACTION_NM2AWK: std::cout << app.m_nm << " "; for ( int i = 0; i < n_obj_files; i++ ) { std::cout << obj_files[ i ] << " "; } std::cout << " | " << app.m_script; break; case ACTION_VERSION: std::cout << app.m_version << "\n"; std::cout.flush(); break; case ACTION_POMP2_API_VERSION: std::cout << app.m_pomp2_api_version << "\n"; std::cout.flush(); break; default: opari2_print_help( argv ); } return EXIT_SUCCESS; } OPARI_Config::OPARI_Config( void ) { m_nm = NM; m_awk = AWK; m_egrep = EGREP; m_version = VERSION; m_pomp2_api_version = POMP2_API_VERSION; m_script = SCRIPT; m_cflags = CFLAGS; } OPARI_Config::~OPARI_Config( void ) { } void OPARI_Config::setBuildCheck( void ) { #if !HAVE( READLINK ) std::cerr << "Option --build-check not supported without readlink support." << std::endl; exit( EXIT_FAILURE ); #endif /* !HAVE(READLINK) */ const unsigned bufsize = 8192; char buffer[ bufsize ]; memset( buffer, 0, bufsize ); ssize_t result = readlink( "/proc/self/exe", buffer, bufsize ); if ( result >= bufsize || result == -1 ) { std::cerr << "Could not determine executable path. Option --build-check not supported." << std::endl; exit( EXIT_FAILURE ); } std::string opari2_config_exe = std::string( buffer ); std::size_t found = opari2_config_exe.rfind( "opari2-config" ); std::string opari2_config_build_path = opari2_config_exe.substr( 0, found ); m_script = opari2_config_build_path + "pomp2-parse-init-regions.awk"; m_cflags = "-I" + opari2_config_build_path + "../include"; } void OPARI_Config::readConfigFile( std::string config_file ) { std::ifstream inFile; inFile.open( config_file.c_str(), std::ios_base::in ); if ( !( inFile.good() ) ) { std::cerr << "Cannot open config file: " << config_file << std::endl; abort(); } while ( inFile.good() ) { char line[ 512 ] = { "" }; inFile.getline( line, 512 ); read_parameter( line ); } } void OPARI_Config::set_value( std::string key, std::string value ) { if ( key == "EGREP" ) { m_egrep = value; } else if ( key == "VERSION" ) { m_version = value; } else if ( key == "POMP2_API_VERSION" ) { m_pomp2_api_version = value; } else if ( key == "NM" ) { m_nm = value; } else if ( key == "AWK" ) { m_awk = value; } else if ( key == "OPARI_SCRIPT" ) { m_script = value; } else if ( key == "CFLAGS" ) { m_cflags = value; } /* Ignore unknown entries */ } void OPARI_Config::read_parameter( std::string line ) { /* check for comments */ size_t pos = line.find( "#" ); if ( pos == 0 ) { return; // Whole line commented out } if ( pos != std::string::npos ) { // Truncate line at comment line = line.substr( pos, line.length() - pos - 1 ); } // Ignore empty lines if ( line == "" ) { return; } /* separate value and key */ pos = line.find( "=" ); if ( pos == std::string::npos ) { std::cerr << "Error while parsing config file: Missing separator '='." << std::endl; abort(); } std::string key = line.substr( 0, pos ); std::string value = line.substr( pos + 2, line.length() - pos - 3 ); /* process parameter */ set_value( key, value ); } opari2-2.0.9/src/opari/PaxHeaders/opari2_directive.h0000644000000000000000000000013214770056734017315 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.359367297 opari2-2.0.9/src/opari/opari2_directive.h0000644000175100001440000004406514770056734017656 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive.h * * @brief Abstract base class of all directives. */ #ifndef OPARI2_DIRECTIVE_H #define OPARI2_DIRECTIVE_H #include using std::string; #include using std::vector; #include using std::set; #include using std::stringstream; #include using std::ostream; #include using std::pair; using std::make_pair; #include "opari2.h" /** * @brief Abstract base class to store and manipulate directive * related data */ class OPARI2_Directive { public: OPARI2_Directive( const string& fname, const int ln, vector& lines, vector& directive_prefix ); virtual ~ OPARI2_Directive( void ) { } public: /********************************************************** * * * INTERFACE FOR DERIVED CLASSES * * * **********************************************************/ /********************************************************** * The following functions MUST be implemented by derived * * classes * **********************************************************/ /** * @brief Each paradigm must provide this method * * Each paradigm must keep a separate count of regions encountered * of this type. See the example for derived classes for a * standard implementation. */ virtual void IncrementRegionCounter( void ) = 0; /** * @brief Generate region descriptors * * The function generate_descr_common() is provided to take care * of the generic descriptor information. See * OPARI2_DirectiveTemplate::GenerateDescr() for a standard * implementation. */ virtual void GenerateDescr( ostream& os ) = 0; /********************************************************** * These functions may be implemented. * * Default implementations are provided below. * **********************************************************/ public: /** * @brief Find the name of the directive */ virtual void FindName( void ) { find_name_common(); }; private: /** * @brief Identifies clauses and their arguments */ virtual void identify_clauses( void ) { }; /********************************************************** * * * BASE CLASS MEMBERS AND METHODS * * * **********************************************************/ private: /** * @brief Generates the part of the ctc-string which contains the * paradigm specific information. * * The function generate_ctc_string_common() is provided to take * care of the generic source code region information. */ virtual string generate_ctc_string( OPARI2_Format_t form ) { return generate_ctc_string_common( form ); }; public: /** * @brief Writes Directive for ending a loop */ virtual OPARI2_Directive* EndLoopDirective( const int lineno ) { return NULL; }; /** * @brief Returns true for directives ending a loop region */ virtual bool EndsLoopDirective( void ) { return false; }; /******************************************************************* * Furthermore there are some static functions implemented in the * * derived classes, which are necessary or might be useful (and * * should be named the same), when deriving a class for a new * * paradigm. * *******************************************************************/ /** * static OPARI2_ErrorCode * ProcessOption( string option ); * * static uint32_t * String2Group( const string name ); * * static void * GenerateHeader( ostream& os ); * * static void * FinalizeDescrs( ostream& os ); * * static void * GenerateInitHandleCalls( ostream& os, * const string incfile = "" ); */ protected: /** Name of currently processed file. This is not constant for one source file, as other files may have been included and the source code information is written correctly into the line directives */ string m_filename; OPARI2_ParadigmType_t m_type; /** directive name */ string m_name; /** A vector of pairs, consisting of clauses and their arguments */ OPARI2_StrStr_map_t m_clauses; /* Global ID of instrumented region */ int m_id; /** line numbers of the first and last line of the beginning and the end of the directive region in the sourcce file */ int m_begin_first_line; int m_begin_last_line; int m_end_first_line; int m_end_last_line; /* Specifies whether there is an outer region */ bool m_outer_reg; /* The Compile Time Context (CTC) string, its length and the variable it is stored in, in the instrumented file */ string m_ctc_string; int m_ctc_string_len; string m_ctc_string_variable; /** set of relevant region descriptors */ set m_descrs; /** the index of the currently parsed line within the directive statements */ unsigned int m_pline; /** position index within the currently parsed line */ string::size_type m_ppos; /** all lines */ vector m_lines; /** all original lines */ vector m_orig_lines; /** A series of tokens that identify a pragma/directive */ vector m_directive_prefix; /** In Fortran a common block is inserted in the output file with * all region ids, the values are collected here and printed at * the end*/ static vector s_common_block; /** In Fortran directives are usually ended with an "!$par end * loop" directive. In case of directives that refer to a * directly following loop, the end of the loop also ends the * code region for the directive. The end directive is inserted * by OPARI2, if m_needs_end_loop_directive is true.*/ bool m_needs_end_loop_directive; /* The necessary directive for explicitly ending a loop * region. */ string m_end_loop_directive; /** directive of enclosing directive */ OPARI2_Directive* m_enclosing; /** Static variables. This is information which is constant for the processed file and frequently accessed in the directives */ /** pointer to outer directive */ static OPARI2_Directive* s_outer; /** Region counter for all region types */ static int s_num_all_regions; /** Language the input file is written in */ static OPARI2_Language_t s_lang; /** Type of format (currently only needed for Fortran, distinguishes between fixed-form and free-form Fortran */ static OPARI2_Format_t s_format; /** Specifies whether the source code information via #line directives is to be inserted */ static bool s_keep_src_info; /** Specifies whether the file was already preprocessed */ static bool s_preprocessed_file; /** A unique id that is needed to distinguish the initialization routines of the different compile units of the target application. It should not be placed here as it is strictly speaking not part of the necessary information of a directive, but it is used and needed here in the GenerateInitHandleCalls... functions. */ static string s_inode_compiletime_id; public: /** @brief Return 'type', for dynamic_cast */ OPARI2_ParadigmType_t GetParadigmType( void ); /** @brief Return the directive name */ string& GetName( void ); /** @brief Returns whether a clause is present */ bool HasClause( const string& clause ); /** @brief Returns the argument of a clause */ string GetClauseArg( const string& clause ); /** @brief Deletes comments in directive lines */ void DelInlineComments( void ); /** @brief Returns the filename of the file the directive belongs to */ string& GetFilename( void ); /* Return beginning line number of directive */ int& GetLineno( void ); /** @brief Update line information after the parser reaches the end of this directive region */ void SetEndLineno( const int endline_begin, const int endline_end ); /** @brief Prints the #line directive to update the source code information */ void ResetSourceInfo( ostream& os ); /** @brief Enter region */ void EnterRegion( bool new_outer = false, bool save_on_vec = true ); /** @brief Initialize region information. */ void InitRegion( bool outer = false ); /** @brief Initialize region information. */ void InitRegion( OPARI2_Directive* parent, bool outer = false ); /** @brief Exit region */ int ExitRegion( bool end_outer = false ); /** @brief Inserts the id of a region nested inside another region */ void InsertDescr( int descr ); /** @brief Check if the directive has accociated descriptors */ bool DescrsEmpty(); /** @brief Returns the id of the directive region */ int GetID( void ) { return m_id; }; /** @brief Returns the ctc-string */ string GetCTCStringVariable( void ) { return m_ctc_string_variable; }; /** @brief Sets all necessary static information */ static void SetOptions( OPARI2_Language_t lang, OPARI2_Format_t form, bool keep_src, bool preprocessed, const string id ); /** @brief Returns the file specific identifier to distinguish different compilation units */ static string GetInodeCompiletimeID( void ) { return s_inode_compiletime_id; } /** * @brief Generate a function to initialize all region handles. */ static void GenerateInitHandleCalls( ostream& os, const string incfile, const string paradigm_prefix, const stringstream& init_handle_calls, const int num_regions ); /** @brief Fortran specific finalization of descriptors */ static void FinalizeFortranDescrs( ostream& os ); void FinishRegion( void ); /** @brief Returns value of m_needs_end_loop_directive.*/ bool NeedsEndLoopDirective( void ); /** @brief Sets value of m_needs_end_loop_directive.*/ void NeedsEndLoopDirective( bool val ); /** @brief Prints directive to stream and updates source information */ void PrintDirective( ostream& os, const string& adds = "" ); /** @brief Prints directive without updating source information */ void PrintPlainDirective( ostream& os, const string& adds = "" ); protected: /** * @brief Generates the part of the ctc-string which contains the * generic region information */ string generate_ctc_string_common( OPARI2_Format_t form, string specific_part = "" ); /** * @brief Generate the generic part of the region descriptors */ void generate_descr_common( ostream& os ); /** * @brief Generic part of identifying a directive name */ void find_name_common( void ); /** * @brief Removes all unnecessary commas */ void remove_commas( void ); /** * @brief Returns the arguments of a clause. */ string find_arguments( unsigned& line, string::size_type& pos, bool remove, string clause ); /** * @brief Removes empty lines */ bool remove_empty_line( unsigned& line ); /** * @brief Check if 'word' can be found in directive 'm_lines'. * * If true, save the line number within 'm_lines' in 'line' and * offset within the line in 'pos'. * * @return true if 'word' is found in m_lines. * false otherwise. */ bool find_word( const string word, unsigned& line, string::size_type& pos ); /** * @brief Find the next word in directive lines, starting from * 'm_pline' and 'm_ppos'. */ string find_next_word( void ); /** * @brief Takes care of moving arguments of clauses for split * directives to the newly created inner directive. * * When combined directives are split the clauses are either kept * at the outer directive or moved to the inner directive. This * function takes care of moving all arguments of clauses * belonging to the inner directive. */ void fix_clause_arg( vector& outer, vector& inner, unsigned& line, string::size_type& pos ); /** * @brief Remove empty lines in directive 'lines'. */ void remove_empties( void ); public: /** * @brief Split combined parallel and worksharing constructs. * * They are split into two separate pragmas to allow the insertion of * POMP function calles between the parallel and the worksharing * construct. The clauses need to be matched to the directive they * belong to. this is a template function as it needs to return the * right derived type of OPARI2_Directive*. */ template T* SplitCombinedT( OPARI2_StrStr_pairs_t& outer_inner, OPARI2_StrBool_pairs_t& inner_clauses ) { remove_commas(); vector inner_lines; string sentinel = m_directive_prefix[ 0 ]; string::size_type slen = sentinel.length(); // make empty copy with continuation characters if ( s_lang & L_C_OR_CXX ) { for ( unsigned i = 0; i < m_lines.size(); ++i ) { inner_lines.push_back( string( m_lines[ i ].size(), ' ' ) ); if ( i != m_lines.size() ) { inner_lines[ i ][ inner_lines[ i ].size() - 1 ] = '\\'; } } } else if ( s_lang & L_FORTRAN ) { for ( unsigned i = 0; i < m_lines.size(); ++i ) { inner_lines.push_back( string( m_lines[ i ].size(), ' ' ) ); string::size_type s = m_lines[ i ].find( sentinel ); // & continuation characters string::size_type com = m_lines[ i ].find( "!", s + slen ); if ( com != string::npos ) { --com; } string::size_type amp2 = m_lines[ i ].find_last_not_of( " \t", com ); if ( m_lines[ i ][ amp2 ] == '&' ) { inner_lines[ i ][ amp2 ] = '&'; } string::size_type amp1 = m_lines[ i ].find_first_not_of( " \t", s + slen ); if ( m_lines[ i ][ amp1 ] == '&' || m_lines[ i ][ amp1 ] == '+' ) { inner_lines[ i ][ amp1 ] = m_lines[ i ][ amp1 ]; } } } // copy sentinel/directive_prefix unsigned line = 0; string::size_type pos = 0; for ( vector::iterator it = m_directive_prefix.begin(); it != m_directive_prefix.end(); ++it ) { for ( size_t i = 0; i < m_lines.size(); ++i ) { pos = m_lines[ i ].find( *it ); if ( pos != string::npos ) { inner_lines[ i ].replace( pos, ( *it ).length(), *it ); } } } // fix pragma name for ( OPARI2_StrStr_pairs_t::iterator it = outer_inner.begin(); it != outer_inner.end(); ++it ) { line = pos = 0; if ( find_word( ( *it ).first, line, pos ) ) { string name = ( *it ).second; string blanks( name.length(), ' ' ); if ( find_word( name, line, pos ) ) { m_lines[ line ].replace( pos, name.length(), blanks ); inner_lines[ line ].replace( pos, name.length(), name ); } } } // fix pragma clauses for ( OPARI2_StrBool_pairs_t::iterator it = inner_clauses.begin(); it != inner_clauses.end(); ++it ) { string name = ( *it ).first; bool has_args = ( *it ).second; string blanks( name.length(), ' ' ); line = pos = 0; while ( find_word( name, line, pos ) ) { m_lines[ line ].replace( pos, name.length(), blanks ); inner_lines[ line ].replace( pos, name.length(), name ); pos += name.length(); if ( has_args ) { fix_clause_arg( m_lines, inner_lines, line, pos ); } } } T* inner = new T( m_filename, m_begin_first_line, inner_lines, m_directive_prefix ); // final cleanup remove_empties(); inner->remove_empties(); return inner; } bool active; }; #endif //OPARI2_DIRECTIVE_H opari2-2.0.9/src/opari/PaxHeaders/opari2_directive.cc0000644000000000000000000000013214770056734017453 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.359367297 opari2-2.0.9/src/opari/opari2_directive.cc0000644000175100001440000007355414770056734020021 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014, 2019, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_directive.cc * * @brief Methods of abstract base classs 'OPARI2_Directive'. * */ #include #include #include #include using std::cerr; #include using std::transform; using std::remove_if; #include "common.h" #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_manager.h" OPARI2_Directive::OPARI2_Directive( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : m_filename( fname ), m_begin_first_line( ln ), m_lines( lines ), m_directive_prefix( directive_prefix ) { m_pline = 0; m_ppos = 0; DelInlineComments(); for ( vector::iterator dp = directive_prefix.begin(); dp != directive_prefix.end(); ++dp ) { string token = find_next_word(); if ( token != *dp ) { std::cerr << "ERROR: Directive token mismatch!\n"; cleanup_and_exit(); } } m_orig_lines = lines; m_name.clear(); m_needs_end_loop_directive = false; } OPARI2_ParadigmType_t OPARI2_Directive::GetParadigmType( void ) { return m_type; } string& OPARI2_Directive::GetName( void ) { if ( m_name.empty() ) { FindName(); } if ( m_name == "" ) { m_name = "$END$"; } return m_name; } /** @brief Returns whether a clause is present */ bool OPARI2_Directive::HasClause( const string& clause ) { return m_clauses.find( clause ) != m_clauses.end(); } /** @brief Returns the argument of a clause */ string OPARI2_Directive::GetClauseArg( const string& clause ) { if ( m_clauses.find( clause ) != m_clauses.end() ) { return m_clauses[ clause ]; } else { return ""; } } void OPARI2_Directive::DelInlineComments( void ) { if ( s_lang & L_FORTRAN ) { for ( vector::iterator l = m_lines.begin(); l != m_lines.end(); ++l ) { // find first ! int c = ( *l ).find( "!" ); for ( unsigned i = c + 1; i < ( *l ).size(); ++i ) { // zero out string constants and free form comments if ( ( *l )[ i ] == '!' ) { /* -- zero out partial line F90 comments -- */ for (; i < ( *l ).size(); ++i ) { ( *l )[ i ] = ' '; } break; } } } } } string& OPARI2_Directive::GetFilename( void ) { return m_filename; } int& OPARI2_Directive::GetLineno( void ) { return m_begin_first_line; } void OPARI2_Directive::SetEndLineno( const int endline_begin, const int endline_end ) { m_end_first_line = endline_begin; m_end_last_line = endline_end; } void OPARI2_Directive::ResetSourceInfo( ostream& os ) { if ( m_name == "$END$" ) { os << "#line " << m_begin_first_line + 1 << " \"" << m_filename << "\"" << "\n"; } else { os << "#line " << m_begin_first_line + m_lines.size() << " \"" << m_filename << "\"" << "\n"; } } void OPARI2_Directive::EnterRegion( bool new_outer, bool save_on_vec ) { /** initialize region information */ InitRegion( new_outer ); if ( save_on_vec ) { SaveForInit( this ); } DirectiveStackPush( this ); } void OPARI2_Directive::InitRegion( bool outer ) { m_id = ++s_num_all_regions; this->IncrementRegionCounter(); /** by default, region name is the same as directive name */ m_begin_last_line = m_begin_first_line + m_lines.size() - 1; m_end_first_line = m_begin_first_line; m_end_last_line = m_begin_first_line + m_lines.size() - 1; m_outer_reg = outer; // to keep track of nested directives m_enclosing = s_outer; if ( m_outer_reg ) { s_outer = this; } if ( s_outer ) { s_outer->InsertDescr( m_id ); } DirectiveStackInsertDescr( m_id ); stringstream stream; stream << string_id_prefix << m_id; m_ctc_string_variable = stream.str(); } void OPARI2_Directive::InitRegion( OPARI2_Directive* parent, bool outer ) { --s_num_all_regions; InitRegion( outer ); m_id = parent->GetID(); } int OPARI2_Directive::ExitRegion( bool end_outer ) { OPARI2_Directive* d_top = DirectiveStackTop( this ); assert( d_top != NULL ); string& name_top = d_top->GetName(); /** * For FORTRAN, some directive block ends with "end directive_name" */ #if defined( __GNUC__ ) && ( __GNUC__ < 3 ) if ( m_name[ 0 ] != '$' && m_name.substr( 3 ) != name_top ) { #else if ( m_name[ 0 ] != '$' && m_name.compare( 3, string::npos, name_top ) != 0 ) { #endif cerr << m_filename << ":" << d_top->GetLineno() << ": ERROR: missing end" << name_top << " directive for " << name_top << " directive\n"; cerr << m_filename << ":" << m_begin_first_line << ": ERROR: non-matching " << m_name << " directive\n"; cleanup_and_exit(); } /** Set end line information of the corresponding region */ if ( m_lines.size() ) { d_top->SetEndLineno( m_begin_first_line, m_begin_first_line + m_lines.size() - 1 ); } else { // C/C++ $END$ pragma d_top->SetEndLineno( m_begin_first_line, m_begin_first_line ); } if ( end_outer ) { d_top->FinishRegion(); } int region_id = d_top->GetID(); DirectiveStackPop(); return region_id; } void OPARI2_Directive::InsertDescr( int descr ) { m_descrs.insert( descr ); } bool OPARI2_Directive::DescrsEmpty() { return m_descrs.empty(); } void OPARI2_Directive::FinishRegion( void ) { if ( m_outer_reg ) { s_outer = m_enclosing; } } bool OPARI2_Directive::NeedsEndLoopDirective( void ) { return m_needs_end_loop_directive; } void OPARI2_Directive::NeedsEndLoopDirective( bool val ) { m_needs_end_loop_directive = val; } void OPARI2_Directive::PrintDirective( ostream& os, const string& adds ) { if ( m_lines.size() && s_keep_src_info && !InstrumentationDisabled( D_USER ) ) { // print original source location information reset pragma os << "#line " << m_begin_first_line << " \"" << m_filename << "\"" << "\n"; } PrintPlainDirective( os, adds ); } void OPARI2_Directive::PrintPlainDirective( ostream& os, const string& adds ) { // print pragma text if ( m_lines.size() ) { for ( unsigned i = 0; i < m_lines.size() - 1; ++i ) { os << m_lines[ i ] << "\n"; } os << m_lines.back() << adds << "\n"; } } /* *INDENT-OFF* */ /** * The generated code might look like this (OpenMP example): * * @code #ifdef __cplusplus extern "C" #endif void POMP2_Init_reg_000() { POMP2_Assign_handle( &opari2_region_1, opari2_ctc_1 ); ... ... } * @endcode * * or in Fortran: * * @code subroutine POMP2_Init_reg_000() include 'test7.f90.opari.inc' call POMP2_Assign_handle( opari2_region_1, & opari2_ctc_1 ) ... ... end * @endcode * * This generated function needs to be called from * POMP2_Init_regions. There will be one of these for each compile * unit. */ /* *INDENT-ON* */ void OPARI2_Directive::GenerateInitHandleCalls( ostream& os, const string incfile, const string paradigm_prefix, const stringstream& init_handle_calls, const int num_regions ) { if ( num_regions > 0 ) { if ( s_lang & L_FORTRAN ) { if ( init_handle_calls.rdbuf()->in_avail() != 0 ) { //add a Function to initialize the handles at the end of the file os << "\n subroutine " << paradigm_prefix << "_Init_reg_" << s_inode_compiletime_id << "_" << num_regions << "()\n" << " include \'" << incfile << "\'\n" << init_handle_calls.str() << " end\n"; } } else if ( s_lang & L_C_OR_CXX ) { if ( s_lang & L_C ) { os << "\n#ifdef __cplusplus\nextern \"C\"\n#endif"; } else if ( s_lang & L_CXX ) { os << "extern \"C\" \n{"; } os << "\nvoid " << paradigm_prefix << "_Init_reg_" << s_inode_compiletime_id << "_" << num_regions << "()\n{\n" << init_handle_calls.str(); if ( s_lang & L_C ) { os << "}\n"; } else if ( s_lang & L_CXX ) { os << "}\n}\n"; } } } } void OPARI2_Directive::FinalizeFortranDescrs( ostream& os ) { if ( !s_common_block.empty() ) { vector::iterator it = s_common_block.begin(); os << " common /" << "cb" << s_inode_compiletime_id << "/ " << region_id_prefix << *it++; for (; it < s_common_block.end(); it++ ) { if ( s_format == F_FIX ) { os << ",\n & " << region_id_prefix << *it; } else { os << ",&\n " << region_id_prefix << *it; } } os << std::endl; } } void OPARI2_Directive::find_name_common( void ) { if ( m_lines.empty() ) { // automatically generated END pragma for C/C++ m_name = "$END$"; return; } if ( !m_name.empty() ) { return; } m_name = find_next_word(); } string OPARI2_Directive::generate_ctc_string_common( OPARI2_Format_t form, string specific_part ) { stringstream stream1, stream2; stream1 << "*regionType=" << m_name << "*" << "sscl=" << m_filename << ":" << m_begin_first_line << ":" << m_begin_last_line << "*" << "escl=" << m_filename << ":" << m_end_first_line << ":" << m_end_last_line << "*" << specific_part << "*"; stream2 << "\"" << stream1.str().length() + 2 << stream1.str() << "\""; m_ctc_string_len = stream2.str().length(); string ctc_string = stream2.str(); if ( form == F_FIX ) { for ( unsigned int i = 58; i < ctc_string.size() - 1; i += 68 ) { ctc_string.insert( i, "\"//\n &\"" ); } } else if ( form == F_FREE ) { for ( unsigned int i = 58; i < ctc_string.size() - 1; i += 68 ) { ctc_string.insert( i, "\"//&\n \"" ); } } return ctc_string; } /* *INDENT-OFF* */ /** * This function writes the definitions of the region handle and the * CTC-string for the region referred to by this directive object. * * Fortran 90 example: * @code INTEGER( KIND=8 ) :: opari2_region_1 CHARACTER (LEN=268), parameter :: opari2_ctc_1 =& "265*regionType=parallel*sscl=/some/path/to/source.f90:26"// ":26*escl=/some/path/to/source.f90:43:43*has_if=1*has_num"// "_threads=4*has_reduction=1**" * @endcode * * C/C++ example: * @code static OPARI2_Region_handle opari2_region_1 = NULL; #define opari2_ctc_1 "261*regionType=parallel*sscl=/some/path/to/source.c:35:35*escl=/some/path/to/source.c:54:54*has_if=1*has_num_threads=4*has_reduction=1**" * @endcode */ /* *INDENT-ON* */ void OPARI2_Directive::generate_descr_common( ostream& os ) { string ctc_string = generate_ctc_string( s_format ); if ( s_lang & L_F77 ) { os << " INTEGER*8 " << region_id_prefix << m_id << "\n"; os << " CHARACTER*" << m_ctc_string_len << " " << m_ctc_string_variable << "\n"; if ( s_format == F_FIX ) { os << " PARAMETER (" << m_ctc_string_variable << "=\n"; os << " &" << ctc_string << ")\n\n"; } else { os << " PARAMETER (" << m_ctc_string_variable << "=&\n"; os << " " << ctc_string << ")\n\n"; } s_common_block.push_back( m_id ); } else if ( s_lang & L_F90 ) { os << " INTEGER( KIND=8 ) :: " << region_id_prefix << m_id << "\n\n"; if ( s_format == F_FREE ) { os << " CHARACTER (LEN=" << m_ctc_string_len << "), parameter :: "; os << m_ctc_string_variable << " =&\n " << ctc_string << "\n\n"; } else { os << " CHARACTER (LEN=" << m_ctc_string_len << "), parameter :: "; os << m_ctc_string_variable << " =\n &" << ctc_string << "\n\n"; } s_common_block.push_back( m_id ); } else if ( s_lang & L_C_OR_CXX ) { os << "static " << "OPARI2_Region_handle " << region_id_prefix << m_id; if ( s_preprocessed_file ) { os << " = (OPARI2_Region_handle)0;\n"; } else { os << " = NULL;\n"; } os << "#define " << m_ctc_string_variable << " " << ctc_string << "\n"; } } void OPARI2_Directive::remove_commas( void ) { int bracket_counter = 0; for ( unsigned int line = 0; line < m_lines.size(); line++ ) { for ( unsigned int c = 0; c < m_lines[ line ].length(); c++ ) { if ( m_lines[ line ][ c ] == '(' ) { bracket_counter++; } if ( m_lines[ line ][ c ] == ')' ) { bracket_counter--; } if ( bracket_counter == 0 && m_lines[ line ][ c ] == ',' ) { m_lines[ line ][ c ] = ' '; } } } return; } /** @brief Returns the arguments of a clause. */ string OPARI2_Directive::find_arguments( unsigned& line, string::size_type& pos, bool remove, string clause ) { string arguments; int bracket_counter = 0; if ( remove ) { m_lines[ line ].replace( pos, clause.length(), string( clause.length(), ' ' ) ); } pos += clause.length(); pos = m_lines[ line ].find_first_not_of( " \t", pos ); if ( ( pos != string::npos ) && ( m_lines[ line ][ pos ] == '(' ) ) { bracket_counter++; if ( remove ) { m_lines[ line ][ pos ] = ' '; } pos++; } bool contComm = false; // Continuation line or comment found while ( bracket_counter > 0 ) { if ( m_lines[ line ][ pos ] == '(' ) { bracket_counter++; } if ( ( s_lang & L_C_OR_CXX && m_lines[ line ][ pos ] == '\\' ) || ( s_lang & L_FORTRAN && m_lines[ line ][ pos ] == '&' ) ) { pos = m_lines[ line ].length(); } else { if ( s_lang & L_FORTRAN && m_lines[ line ][ pos ] == '!' ) { contComm = true; } else { arguments.append( 1, m_lines[ line ][ pos ] ); if ( remove ) { m_lines[ line ][ pos ] = ' '; } pos++; } } if ( pos >= m_lines[ line ].length() || contComm ) { if ( s_lang & L_FORTRAN && !remove_empty_line( line ) ) { line++; } contComm = false; if ( line >= m_lines.size() ) { std::cerr << m_filename << ":" << m_begin_first_line << ": ERROR: Missing ) for " << clause << " clause \n" << std::endl; cleanup_and_exit(); } else if ( s_lang & L_FORTRAN ) { pos = m_lines[ line ].find_first_of( "!*cC" ) + 6; pos = m_lines[ line ].find_first_not_of( " \t", pos ); if ( m_lines[ line ][ pos ] == '&' ) { pos++; } } else if ( s_lang & L_C_OR_CXX ) { pos = 0; } } if ( m_lines[ line ][ pos ] == ')' ) { bracket_counter--; } } //remove last bracket if necessary if ( remove && pos != string::npos ) { m_lines[ line ][ pos ] = ' '; //remove comma after the removed clause if needed while ( m_lines[ line ][ pos ] == ' ' ) { pos++; } if ( m_lines[ line ][ pos ] == ',' ) { m_lines[ line ][ pos ] = ' '; } } size_t p; p = arguments.find( ' ' ); while ( p != string::npos ) { arguments.erase( p, 1 ); p = arguments.find( ' ' ); } return arguments; } /** remove empty continued lines inside of pragma*/ bool OPARI2_Directive::remove_empty_line( unsigned& line ) { string lline = m_lines[ line ]; lline.erase( remove_if( lline.begin(), lline.end(), isspace ), lline.end() ); transform( lline.begin(), lline.end(), lline.begin(), tolower ); if ( lline.compare( m_directive_prefix[ 0 ] ) == 0 ) { if ( m_lines.size() == ( line + 1 ) ) { m_lines[ line - 1 ][ m_lines[ line - 1 ].find_last_of( "&" ) ] = ' '; } m_lines.erase( m_lines.begin() + line ); return true; } return false; } bool OPARI2_Directive::find_word( const string word, unsigned& line, string::size_type& pos ) { if ( s_lang & L_C_OR_CXX ) { for ( unsigned i = line; i < m_lines.size(); ++i ) { string::size_type w = m_lines[ i ].find( word ); while ( w != string::npos ) { char a; char b; //word may start at position 0 of a continuation line if ( w == 0 ) { b = ' '; } else { b = m_lines[ i ][ w - 1 ]; } if ( m_lines[ i ].length() > w + word.length() ) { a = m_lines[ i ][ w + word.length() ]; } else { a = ' '; } if ( ( b == ' ' || b == '\t' || b == '/' || b == ')' || b == ',' || b == '#' ) && ( a == ' ' || a == '\t' || a == '/' || a == '(' || a == ',' ) ) { line = i; pos = w; return true; } else { w++; if ( w != string::npos ) { w = m_lines[ i ].find( word, w ); } } } pos = 0; } } else if ( s_lang & L_FORTRAN ) { for ( unsigned i = line; i < m_lines.size(); ++i ) { string::size_type s = ( pos == 0 ) ? m_lines[ i ].find( m_directive_prefix[ 0 ] ) + m_directive_prefix[ 0 ].length() : pos; string::size_type w = m_lines[ i ].find( word, s ); string::size_type c = m_lines[ i ].find( '!', s ); // if word found and found before comment while ( w != string::npos && ( c == string::npos || ( c != string::npos && w < c ) ) ) { char b = m_lines[ i ][ w - 1 ]; char a; if ( m_lines[ i ].length() > w + word.length() ) { a = m_lines[ i ][ w + word.length() ]; } else { a = ' '; } if ( ( b == ' ' || b == '\t' || b == '!' || b == ')' || b == ',' ) && ( a == ' ' || a == '\t' || a == '!' || a == '(' || a == ',' || a == '&' ) ) { line = i; pos = w; return true; } else { w++; if ( w != string::npos ) { w = m_lines[ i ].find( word, w ); } } } pos = 0; } } return false; } string OPARI2_Directive::find_next_word( void ) { if ( s_lang & L_C_OR_CXX ) { while ( m_pline < m_lines.size() ) { string::size_type wbeg = m_lines[ m_pline ].find_first_not_of( " \t", m_ppos ); if ( wbeg == string::npos || m_lines[ m_pline ][ wbeg ] == '\\' ) { ++m_pline; if ( m_pline < m_lines.size() ) { m_ppos = 0; } else { return ""; } } else if ( m_lines[ m_pline ][ wbeg ] == '(' || m_lines[ m_pline ][ wbeg ] == ')' || m_lines[ m_pline ][ wbeg ] == '#' ) { m_ppos = wbeg + 1; return string( 1, m_lines[ m_pline ][ wbeg ] ); } else { m_ppos = m_lines[ m_pline ].find_first_of( " \t()", wbeg ); return m_lines[ m_pline ].substr( wbeg, m_ppos == string::npos ? m_ppos : m_ppos - wbeg ); } } } else if ( s_lang & L_FORTRAN ) { string sentinel = m_directive_prefix[ 0 ]; while ( m_pline < m_lines.size() ) { string::size_type wbeg = m_lines[ m_pline ].find_first_not_of( " \t", m_ppos ); if ( wbeg == string::npos || m_lines[ m_pline ][ wbeg ] == '&' ) { ++m_pline; if ( m_pline < m_lines.size() ) { m_ppos = m_lines[ m_pline ].find( sentinel ) + sentinel.length(); m_ppos = m_lines[ m_pline ].find_first_not_of( " \t", m_ppos ); if ( m_lines[ m_pline ][ m_ppos ] == '&' || m_lines[ m_pline ][ m_ppos ] == '+' ) { ++m_ppos; } } else { return ""; } } else if ( m_lines[ m_pline ][ wbeg ] == '(' || m_lines[ m_pline ][ wbeg ] == ')' ) { m_ppos = wbeg + 1; return string( 1, m_lines[ m_pline ][ wbeg ] ); } else { m_ppos = m_lines[ m_pline ].find_first_of( " \t()&", wbeg ); return m_lines[ m_pline ].substr( wbeg, m_ppos == string::npos ? m_ppos : m_ppos - wbeg ); } } } return ""; } void OPARI2_Directive::fix_clause_arg( vector& outer, vector& inner, unsigned& line, string::size_type& pos ) { char* optr = &( outer[ line ][ pos ] ); char* iptr = &( inner[ line ][ pos ] ); string sentinel = m_directive_prefix[ 0 ]; string::size_type slen = sentinel.length(); while ( *optr != ')' ) { while ( ( ( s_lang & L_C_OR_CXX ) && *optr == '\\' ) || ( ( ( s_lang & L_FORTRAN ) && ( *optr == '!' || *optr == '&' ) ) || pos >= outer[ line ].size() ) ) { // skip to next line ++line; if ( line >= outer.size() ) { return; } if ( s_lang & L_FORTRAN ) { pos = outer[ line ].find( sentinel ) + slen; pos = outer[ line ].find_first_not_of( " \t", pos ); if ( outer[ line ][ pos ] == '&' ) { ++pos; } } else if ( s_lang & L_C_OR_CXX ) { pos = 0; } optr = &( outer[ line ][ pos ] ); iptr = &( inner[ line ][ pos ] ); } *iptr = *optr; *optr = ' '; ++iptr; ++optr; ++pos; } *iptr = ')'; *optr = ' '; } /** * @brief Remove empty lines in directive 'lines'. */ void OPARI2_Directive::remove_empties( void ) { if ( s_lang & L_C_OR_CXX ) { vector::iterator it = m_lines.begin(); while ( it != m_lines.end() ) { string::size_type l = it->find_first_not_of( " \t&" ); if ( l == string::npos || ( *it )[ l ] == '\\' ) { it = m_lines.erase( it ); } else { ++it; } } // make sure last line is not a continued line int lastline = m_lines.size() - 1; string::size_type lastpos = m_lines[ lastline ].size() - 1; if ( m_lines[ lastline ][ lastpos ] == '\\' ) { m_lines[ lastline ][ lastpos ] = ' '; } } else if ( s_lang & L_FORTRAN ) { // remove lines without content string sentinel = m_directive_prefix[ 0 ]; vector::iterator it = m_lines.begin(); while ( it != m_lines.end() ) { string::size_type pos = it->find( sentinel ) + sentinel.length(); if ( ( *it )[ pos ] == '&' || ( *it )[ pos ] == '+' ) { ++pos; } pos = it->find_first_not_of( " \t&", pos ); if ( pos == string::npos || ( *it )[ pos ] == '!' ) { it = m_lines.erase( it ); } else { ++it; } } // make sure 1st line is not a continuation line string::size_type pos = m_lines[ 0 ].find( sentinel ); if ( pos == 0 ) { m_lines[ 0 ][ sentinel.length() ] = ' '; } else { string::size_type l = m_lines[ 0 ].find_first_not_of( " \t", pos + sentinel.length() ); if ( m_lines[ 0 ][ l ] == '&' || m_lines[ 0 ][ l ] == '+' ) { m_lines[ 0 ][ l ] = ' '; } } // make sure last line is not a continued line int lastline = m_lines.size() - 1; pos = m_lines[ lastline ].find( sentinel ) + sentinel.length(); pos = m_lines[ lastline ].find( '!', pos ); if ( pos != string::npos ) { --pos; } string::size_type amp = m_lines[ lastline ].find_last_not_of( " \t", pos ); if ( m_lines[ lastline ][ amp ] == '&' ) { m_lines[ lastline ][ amp ] = ' '; } } } /** Initialize static variables */ void OPARI2_Directive::SetOptions( OPARI2_Language_t lang, OPARI2_Format_t form, bool keep_src, bool preprocessed, const string id ) { s_lang = lang; s_format = form; s_keep_src_info = keep_src; s_preprocessed_file = preprocessed; s_inode_compiletime_id = id; } /** * Where/when are they modified? */ vector OPARI2_Directive:: s_common_block; OPARI2_Directive* OPARI2_Directive::s_outer = NULL; int OPARI2_Directive:: s_num_all_regions = 0; string OPARI2_Directive:: s_inode_compiletime_id; OPARI2_Language_t OPARI2_Directive::s_lang = L_NA; OPARI2_Format_t OPARI2_Directive:: s_format = F_NA; bool OPARI2_Directive:: s_keep_src_info = false; bool OPARI2_Directive:: s_preprocessed_file = false; opari2-2.0.9/src/opari/PaxHeaders/opari2_directive_entry.h0000644000000000000000000000013214770056734020536 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.359367297 opari2-2.0.9/src/opari/opari2_directive_entry.h0000644000175100001440000000325714770056734021075 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry.h * * @brief Macro definitions for the creation of the table holding all * supported directives */ #ifndef OPARI2_DIRECTIVE_ENTRY_H #define OPARI2_DIRECTIVE_ENTRY_H /** * @brief MACRO definition for the creation of a directive table entry * with a corresponding end-directive. */ #define OPARI2_CREATE_TABLE_ENTRY( type, name, loop, disable_with_paradigm, version, group, paradigm ) \ { type, #name, "end" #name, #version, group, true, true, true, loop, false, disable_with_paradigm, h_ ## paradigm ## _ ## name, h_end_ ## paradigm ## _ ## name } /** * @brief MACRO definition for the creation of a directive table entry * without a corresponding end-directive. */ #define OPARI2_CREATE_TABLE_ENTRY_NOEND( type, name, loop, version, group, paradigm ) \ { type, #name, "", #version, group, true, true, false, loop, false, true, h_ ## paradigm ## _ ## name, NULL } /** * @brief MACRO definition for the creation of a directive table entry * for a directive that applies only to the next statement. */ #define OPARI2_CREATE_TABLE_ENTRY_SINGLE_STATEMENT( type, name, loop, disable_with_paradigm, version, group, paradigm ) \ { type, #name, "", #version, group, true, true, true, loop, true, disable_with_paradigm, h_ ## paradigm ## _ ## name, h_end_ ## paradigm ## _ ## name } #endif opari2-2.0.9/src/opari/PaxHeaders/opari2_directive_definition.h0000644000000000000000000000013214770056734021525 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.355367322 opari2-2.0.9/src/opari/opari2_directive_definition.h0000644000175100001440000000561114770056734022060 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_definition.h * * @brief This file defines data structures to represent directive and runtime API. */ #ifndef OPARI2_DIRECTIVE_DEFINITION_H #define OPARI2_DIRECTIVE_DEFINITION_H #include #include using std::ostream; #include using std::string; #include "opari2.h" #include "opari2_directive.h" typedef void ( * DirectiveHandler )( OPARI2_Directive*, ostream& ); /** * @brief Structure definition for a paradigm directive. */ typedef struct { OPARI2_ParadigmType_t type; /**< paradigm the directive belongs to. */ const string name; /**< directive name. */ const string end_name; /**< directive closing name, if any. */ const string version; /**< version of standard/specification. */ uint64_t group; /**< group the directive belongs to */ bool active; /**< directive enabled? */ bool inner_active; /**< inner begin/end instrumentation enabled? */ bool require_end; /**< need end handling? */ bool loop_block; /**< Directive must be followed by a loop */ bool single_statement; /**< Directive only applies to the next statement */ bool disable_with_paradigm; /**< Specfies whether this directive gets instrumented, even when the paradigm is disabled, e.g. omp parallel */ DirectiveHandler do_enter_transformation; /**< handler for region enter instrumentation */ DirectiveHandler do_exit_transformation; /**< handler for region exit instrumentation */ } OPARI2_DirectiveDefinition; /** * @brief Structure definition for a paradigm runtime API. */ typedef struct { OPARI2_ParadigmType_t type; /**< paradigm the API belongs to */ const string name; /**< API name */ const string version; /**< version of standard/specification */ uint64_t group; /**< group the API belongs to */ bool active; /**< API enabled? */ const string wrapper; /**< name of the wrapper funtion */ const string header_file_c; /***< name of the include file of the API */ const string header_file_f; /***< name of the include file of the API */ } OPARI2_RuntimeAPIDefinition; #endif // OPARI2_DIRECTIVE_DEFINITION_H opari2-2.0.9/src/opari/PaxHeaders/opari2_directive_manager.h0000644000000000000000000000013214770056734021007 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.355367322 opari2-2.0.9/src/opari/opari2_directive_manager.h0000644000175100001440000001263014770056734021341 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_manager.h * * @brief Interface declaration of 'DirectiveManager' */ #ifndef OPARI2_DIRECTIVE_MANAGER_H #define OPARI2_DIRECTIVE_MANAGER_H #include using std::vector; #include using std::map; #include using std::stack; #include using std::string; #include #include "opari2_directive.h" /* Map entry. Matches string to enum */ typedef struct { /** string representation*/ string mString; /** matching region type*/ int mEnum; } OPARI2_MapString2ParadigmNameType; /** @brief Disables the instrumentation of whole paradigms or specific * directives. * * Check if the combination of directive/paradigm is supported by * looking up the directive_table. * * @param paradigm name of the paradigm. * @param directive name of the directive. * * @return true ONLY if the combination of paradigm and directive * is found in the diretive_table. * false otherwise. */ bool DisableParadigmDirectiveOrGroup( const string& paradigm, const string& directiveOrGroup, bool inner ); /** * @brief Different levels for full or partial disabling if * instrumentation. * * Bitfield for disabling specific types of instrumentation. E.g. for * OpenMP, when POMP directives are used to disable instrumentation * (D_USER) it must still be activated for the parallel regions so a * measurement system can manage events for different threads in a * threadsafe manner. For the case that code is put on a device where * there is no measurement system, even this instrumentation must be * disabled, thus the level D_FULL. */ typedef enum { D_NONE = 0x00000000, D_USER = 0x00000001, D_FULL = 0xFFFFFFFF } OPARI2_Disable_level_t; /** @brief Disables instrumentation for a specified level */ void DisableInstrumentation( OPARI2_Disable_level_t l ); /** @brief Re-enables instrumentation for a specified level */ void EnableInstrumentation( OPARI2_Disable_level_t l ); /** @brief Checks whether instrumentation for a specified level is * disabled. * * This function checks whether instrumentation for the requested * level or a superior level is disabled. * * @param l specific level to check for * * @return true if current disable level is D_NONE * or l is in the group of current level */ bool InstrumentationDisabled( OPARI2_Disable_level_t l = D_NONE ); bool IsValidSentinel( const string& lowline, string::size_type p, string& sentinel ); /** * @brief Check the validality of a given paradigm and directive. * * Check if the combination of directive/paradigm is supported by * looking up the directive_table. * * @param paradigm name of the paradigm. * @param directive name of the directive. * * @return true ONLY if the combination of paradigm and directive * is found in the directive_table. * false otherwise. */ bool IsValidDirective( const string& paradigm, string& directive ); /** * @brief Check if a directive's active flag is true. * * @param type type of the paradigm. * @param directive name of the directive. * * @return the active member of the to @a directive corresponding * directive_table entry. Return false if no directive_table entry * could be found. */ bool DirectiveActive( OPARI2_ParadigmType_t type, const std::string& directive ); OPARI2_Directive* NewDirective( vector& lines, vector& directive_prefix, OPARI2_Language_t lang, const string& file, const int lineno ); void SetLoopDirective( OPARI2_Directive* d ); OPARI2_Directive* GetLoopDirective( void ); void ProcessDirective( OPARI2_Directive* d, ostream& os, bool* require_end = NULL, bool* is_for = NULL ); bool IsSupportedAPIHeaderFile( const string& include_file, OPARI2_Language_t lang ); /** * @brief Replace a runtime API in the line with its wrapper API if enabled. */ void ReplaceRuntimeAPI( string& lowline, string& line, const string& file, OPARI2_Language_t lang ); void SaveForInit( OPARI2_Directive* d ); void DirectiveStackPush( OPARI2_Directive* d ); OPARI2_Directive* DirectiveStackTop( OPARI2_Directive* d = NULL ); void DirectiveStackPop( OPARI2_Directive* d = NULL ); void PrintDirectiveStackTop( void ); void DirectiveStackInsertDescr( int ); /** * @brief Generate the final *.opari.inc file. * * Need revision if multiple kinds of paradigms are used in the source * fle. Current implementation considers OpenMP and POMP ONLY! * */ void Finalize( OPARI2_Option_t& options ); void SaveSingleLineDirective( OPARI2_Directive* d ); void HandleSingleLineDirective( const int lineno, ostream& os ); #endif // OPARI2_DIRECTIVE_MANAGER_H opari2-2.0.9/src/opari/PaxHeaders/opari2_directive_manager.cc0000644000000000000000000000013214770056734021145 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.355367322 opari2-2.0.9/src/opari/opari2_directive_manager.cc0000644000175100001440000006644314770056734021512 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014, 2016, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_manager.cc * * @brief This file contains APIs to disable, process directive * and runtime entries in a separate namespace. */ #include #include using std::cerr; #include using std::string; #include using std::vector; #include using std::map; #include using std::stack; #include #include using std::toupper; #include "opari2.h" #include "opari2_directive_definition.h" #include "opari2_directive_manager.h" #include "openmp/opari2_omp_handler.h" #include "openmp/opari2_directive_openmp.h" #include "openmp/opari2_directive_entry_openmp.h" #include "pomp/opari2_pomp_handler.h" #include "pomp/opari2_directive_pomp.h" #include "pomp/opari2_directive_entry_pomp.h" #include "offload/opari2_offload_handler.h" #include "offload/opari2_directive_offload.h" #include "offload/opari2_directive_entry_offload.h" static const OPARI2_MapString2ParadigmNameType paradigm_identifiers[] = { OPARI2_OPENMP_SENTINELS, OPARI2_POMP2_USER_SENTINELS, OPARI2_OFFLOAD_SENTINELS }; /** * @brief Array holding all definitions for all supported directives * of all supported paradigms. */ OPARI2_DirectiveDefinition directive_table[] = { OPARI2_OPENMP_DIRECTIVE_ENTRIES, OPARI2_POMP_DIRECTIVE_ENTRIES, //OPARI2_OPENACC_DIRECTIVE_ENTRIES, //OPARI2_TMSE_DIRECTIVE_ENTRIES, OPARI2_OFFLOAD_DIRECTIVE_ENTRIES }; /** * @brief Array holding all definitions for all supported API * functions of all supported paradigms. */ OPARI2_RuntimeAPIDefinition api_table[] = { OPARI2_OPENMP_API_ENTRIES //OPARI2_OPENACC_API_ENTRIES }; OPARI2_Directive* saved_single_line_directive = NULL; /** * @brief Convert paradigm string to ParadigmType. */ OPARI2_ParadigmType_t string_to_paradigm_type( const string& str ) { int n = sizeof( paradigm_identifiers ) / sizeof( OPARI2_MapString2ParadigmNameType ); for ( int i = 0; i < n; i++ ) { if ( str.compare( paradigm_identifiers[ i ].mString ) == 0 ) // if( str == paradigm_identifiers[ i ].mString ) { return ( OPARI2_ParadigmType_t )paradigm_identifiers[ i ].mEnum; } } return OPARI2_PT_NONE; } string paradigm_type_to_string( OPARI2_ParadigmType_t type ) { string str; switch ( type ) { case OPARI2_PT_OMP: str = "OpenMP"; break; case OPARI2_PT_POMP: str = "POMP"; break; case OPARI2_PT_OPENACC: str = "OpenACC"; break; case OPARI2_PT_OFFLOAD: str = "Offload"; break; case OPARI2_PT_TMSE: str = "TMSE"; break; default: str = "Unknown paradigm type"; break; } return str; } /** * @brief Convert group name to group number (uint64_t). * * In case of the same group names in different paradigm, * ParadigmType is used jointly to get a correct group number. * * @param [in] type paradigm type * @param [in] str group name in string * * @return G_NONE: conversion failed * others: OK */ uint64_t string_to_group( OPARI2_ParadigmType_t type, const string& str ) { switch ( type ) { case OPARI2_PT_OMP: return OPARI2_DirectiveOpenmp::String2Group( str ); case OPARI2_PT_POMP: return OPARI2_DirectivePomp::String2Group( str ); case OPARI2_PT_OFFLOAD: return OPARI2_DirectiveOffload::String2Group( str ); case OPARI2_PT_TMSE: default: return G_OMP_NONE; } } vector tmp_directives; vector directive_vec; vector directive_stack; /** * Keep track of the paradigm used in the source file. * Can be 'OR'ed with multiple paradigm types */ uint32_t instrumented_paradigm_type = 0; bool pomp2_header_included = false; bool DisableParadigmDirectiveOrGroup( const string& paradigm, const string& directiveOrGroup, bool inner ) { OPARI2_ParadigmType_t type = string_to_paradigm_type( paradigm ); if ( type == OPARI2_PT_NONE ) { cerr << "Unknown paradigm " << paradigm << std::endl; return false; } bool disableWholeParadigm = directiveOrGroup.compare( "" ) == 0; OPARI2_ParadigmType par_type = string_to_paradigm_type( paradigm ); uint64_t group = string_to_group( par_type, directiveOrGroup ); if ( !disableWholeParadigm && group == 0 && !IsValidDirective( paradigm, ( string& )directiveOrGroup ) ) { cerr << "Unknown group or directive: " << directiveOrGroup << std::endl; return false; } int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == directive_table[ i ].type && ( ( disableWholeParadigm && directive_table[ i ].disable_with_paradigm ) || directiveOrGroup.compare( directive_table[ i ].name ) == 0 || directive_table[ i ].group & group ) ) { // printf( "Disabling directive: %s:%s inner:%d\n", paradigm.c_str(), directive_table[ i ].name.c_str(), inner ); if ( inner ) { directive_table[ i ].inner_active = false; } else { directive_table[ i ].active = false; } } } size = sizeof( api_table ) / sizeof( OPARI2_RuntimeAPIDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == api_table[ i ].type && ( disableWholeParadigm || api_table[ i ].group & group ) ) { api_table[ i ].active = false; } } return true; } typedef pair OPARI2_Disable_level_cur_max_t; static stack disable_levels( std::deque( 1, OPARI2_Disable_level_cur_max_t( D_NONE, D_NONE ) ) ); void DisableInstrumentation( OPARI2_Disable_level_t l ) { OPARI2_Disable_level_cur_max_t level; level.first = l; level.second = ( OPARI2_Disable_level_t )( l | disable_levels.top().second ); disable_levels.push( level ); } void EnableInstrumentation( OPARI2_Disable_level_t l ) { disable_levels.pop(); if ( disable_levels.empty() ) { cerr << "Invalid nesting of regions, disabling certain instrumentation. " << "Check usage of pomp noinstrument/instrument directives." << std::endl; cleanup_and_exit(); } } bool InstrumentationDisabled( OPARI2_Disable_level_t l ) { /* This works for now (only one group and one sublevel */ return disable_levels.top().second != D_NONE && l <= disable_levels.top().second; /* If more fields are added it might be changed to something like the expression below */ // return ( disable_levels.top().second != D_NONE && // ( ( l < disable_levels.top().second && l | disable_levels.top().second ) || // ( l == disable_levels.top().second ) ) ); } bool IsValidSentinel( const string& lowline, string::size_type p, string& sentinel ) { int n = sizeof( paradigm_identifiers ) / sizeof( OPARI2_MapString2ParadigmNameType ); for ( int i = 0; i < n; i++ ) { if ( lowline.find( paradigm_identifiers[ i ].mString ) == p ) { sentinel = paradigm_identifiers[ i ].mString; return true; } } return false; } bool IsValidDirective( const string& paradigm, string& directive ) { OPARI2_ParadigmType_t type = string_to_paradigm_type( paradigm ); int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( ( type == directive_table[ i ].type ) && ( directive.compare( directive_table[ i ].name ) == 0 ) ) { return true; } } return false; } /** * @brief Check if a given paradigm/directive is enabled. * * @param type name of the paradigm type. * @param directive name of the directive. * * @return true if the given directive is found in the "directive_table" and enabled. false otherwise. */ bool directive_enabled( OPARI2_ParadigmType_t type, string& directive ) { int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == directive_table[ i ].type && ( directive.compare( directive_table[ i ].name ) == 0 || directive.compare( directive_table[ i ].end_name ) == 0 ) ) { // We know the directive. // It might be disabled, indicated by the active flag. // The active flag is evaluated in ProcessDirective() and // HandleSingleLineDirective(); if inactive, the directive is printed // preceded by a #line directive. IMO (CF) the #line directive makes // no sense but if it is omitted, make check fails. Therefore just // return true instead of directive_table[ i ].active. return true; } } // We don't know the directive. return false; } OPARI2_DirectiveDefinition* get_directive_table_entry( OPARI2_ParadigmType_t type, const std::string& directive ) { int size = sizeof( directive_table ) / sizeof( OPARI2_DirectiveDefinition ); for ( int i = 0; i < size; i++ ) { if ( type == directive_table[ i ].type && directive.compare( directive_table[ i ].name ) == 0 ) { return ( OPARI2_DirectiveDefinition* )( &( directive_table[ i ] ) ); } } return NULL; } /** * @brief Given a OPARI2_Directive object, get the matching entry in * the directive_table. * * The entry is matching if both the type and name are the same as the * object. */ OPARI2_DirectiveDefinition* get_directive_table_entry( OPARI2_Directive* d ) { return get_directive_table_entry( d->GetParadigmType(), d->GetName() ); } bool DirectiveActive( OPARI2_ParadigmType_t type, const std::string& directive ) { OPARI2_DirectiveDefinition* d = get_directive_table_entry( type, directive ); if ( d ) { return d->active; } return false; } OPARI2_Directive* NewDirective( vector& lines, vector& directive_prefix, OPARI2_Language_t lang, const string& file, const int lineno ) { OPARI2_ParadigmType_t type = OPARI2_PT_NONE; OPARI2_Directive* new_directive = NULL; string sentinel; if ( directive_prefix.size() ) { sentinel = directive_prefix[ directive_prefix.size() - 1 ]; type = string_to_paradigm_type( sentinel ); } else if ( lang & L_C_OR_CXX ) { /* If the directive_prefix is not provided, this is an * automatically generated end region directive */ type = DirectiveStackTop()->GetParadigmType(); } else { cerr << "ERROR: Undefined directive type!\n"; cleanup_and_exit(); } OPARI2_DirectiveDefinition* d_def; switch ( type ) { case OPARI2_PT_OMP: new_directive = new OPARI2_DirectiveOpenmp( file, lineno, lines, directive_prefix ); /* Needed for Fortran end do loop detection */ d_def = get_directive_table_entry( new_directive ); if ( d_def ) { new_directive->NeedsEndLoopDirective( d_def->loop_block ); } break; case OPARI2_PT_POMP: new_directive = new OPARI2_DirectivePomp( file, lineno, lines, directive_prefix ); break; case OPARI2_PT_OFFLOAD: new_directive = new OPARI2_DirectiveOffload( file, lineno, lines, directive_prefix ); break; /*no directives supported so far for openacc and tmse*/ case OPARI2_PT_NONE: case OPARI2_PT_OPENACC: case OPARI2_PT_TMSE: break; } if ( new_directive ) { if ( directive_enabled( type, new_directive->GetName() ) || new_directive->GetName() == "$END$" ) { tmp_directives.push_back( new_directive ); return new_directive; } delete new_directive; } return NULL; } void ProcessDirective( OPARI2_Directive* d, ostream& os, bool* require_end, bool* is_for ) { OPARI2_DirectiveDefinition* d_def = NULL; string name = d->GetName(); //std::cout << "Processing " << name << std::endl; if ( name == "$END$" || // end of a directive (block) in C/C++ ( name.find( "end" ) != string::npos && // end of a directive (block) in Fortran name != "instaltend" && name != "instend" ) ) // except for POMP directive "inst altend/end" { // get the directive object at the top of the stack OPARI2_Directive* d_top = DirectiveStackTop( d ); if ( d->GetParadigmType() != d_top->GetParadigmType() ) { cerr << "\nWrong directive type for 'END' processing!\n"; } d_def = get_directive_table_entry( d_top ); if ( d_def ) { d->active = d_def->active; } else { d->active = true; } if ( d_def && d_def->active ) // enabled { if ( d_def->do_exit_transformation ) { d_def->do_exit_transformation( d, os ); } } else //disabled { if ( d_top->GetName() == "parallelfor" || d_top->GetName() == "paralleldo" || d_top->GetName() == "parallelsections" ) { d_def->do_exit_transformation( d, os ); } else { //simply output lines without any modification d->PrintDirective( os ); } // maintain the directive stack if ( d_def->require_end ) { DirectiveStackPop(); } } } else // beginning of a directive (block) { d_def = get_directive_table_entry( d ); if ( d_def ) { d->active = d_def->active; } else { d->active = true; } if ( d_def && d_def->active ) { instrumented_paradigm_type |= d_def->type; //std::cout << "Doing enter transformation" << std::endl; d_def->do_enter_transformation( d, os ); if ( require_end ) { *require_end = d_def->require_end; } if ( is_for ) { *is_for = ( name == "for" || name == "parallelfor" ); } } else // the directive is disabled { if ( d_def == NULL ) { // Unsupported directives should be ignored silently! // cerr << "Unsupported / invalid directive keyword \"" << d->GetName() << "\"\n"; } else { if ( require_end ) { *require_end = d_def->require_end; } /* * If the directive is disabled, always set 'is_for' to false */ if ( is_for ) { *is_for = false; } /** Even if the directive is disabled and not * instrumented, The directive, if requires "END", * should still be pushed onto the stack, so the * "END" directive can find the corresponding * end. */ if ( d_def->require_end ) { DirectiveStackPush( d ); } if ( d_def->single_statement ) { SaveSingleLineDirective( d ); } /** Directives that might be implicitly ended by the * end of a do loop*/ d->NeedsEndLoopDirective( d_def->loop_block ); } if ( name == "parallelfor" || name == "paralleldo" || name == "parallelsections" ) { instrumented_paradigm_type |= d_def->type; d_def->do_enter_transformation( d, os ); } else { // if disabled, simply output lines, without any modification d->PrintDirective( os ); } } } return; } /** @brief Check whether the current line is an omp function declaration */ bool is_runtime_decl( const string& file, const string& header_file ) { // If it is in the header file, its a declaration string::size_type pos = file.length() - header_file.length() - 1; return file == header_file || ( file[ pos ] == '/' && file.substr( pos + 1 ) == header_file ); } /** Replaces a runtime call with the wrapper function. This function is currently used only by the Fortran parser */ void ReplaceRuntimeAPI( string& lowline, string& line, const string& file, OPARI2_Language_t lang ) { size_t i = 0; size_t pos = 0; if ( InstrumentationDisabled() ) { return; } //Functions my not be replaced in a line like: use omp_lib, only: omp_init_lock if ( lowline.find( ":", lowline.find( "only", lowline.find( "omp_lib", lowline.find( "use" ) ) ) ) != string::npos ) { return; } for ( i = 0; i < sizeof( api_table ) / sizeof( OPARI2_RuntimeAPIDefinition ); i++ ) { pos = 0; if ( api_table[ i ].active && !( lang & L_FORTRAN && is_runtime_decl( file, api_table[ i ].header_file_f ) ) && !( lang & L_C_OR_CXX && is_runtime_decl( file, api_table[ i ].header_file_c ) ) ) { while ( ( pos = lowline.find( api_table[ i ].name, pos ) ) != string::npos ) { /** * when "omp_test_lock" and "omp_test_nest_lock" functions are defined, * they may not be replaced. */ if ( ( !api_table[ i ].name.find( "test" ) ) || !( lowline.find( "logical" ) < pos ) ) { instrumented_paradigm_type |= api_table[ i ].type; line.replace( pos, 3, "POMP2" ); //Keep other letters unchanged, except for line[ pos + 6 ] line[ pos + 6 ] = std::toupper( line[ pos + 6 ] ); } pos += api_table[ i ].name.length(); } } } } set header_files_f; set header_files_c; bool IsSupportedAPIHeaderFile( const string& include_file, OPARI2_Language_t lang ) { if ( header_files_f.empty() || header_files_c.empty() ) { for ( unsigned long i = 0; i < sizeof( api_table ) / sizeof( OPARI2_RuntimeAPIDefinition ); i++ ) { header_files_f.insert( api_table[ i ].header_file_f ); header_files_c.insert( api_table[ i ].header_file_c ); } } string file; set::iterator it, itb, ite; if ( lang & L_FORTRAN ) { itb = header_files_f.begin(); ite = header_files_f.end(); if ( ( *( include_file.begin() ) == '\"' && *( include_file.end() - 1 ) == '\"' ) || ( *( include_file.begin() ) == '\'' && *( include_file.end() - 1 ) == '\'' ) ) { file = include_file.substr( 1, include_file.length() - 2 ); } } else if ( lang & L_C_OR_CXX ) { itb = header_files_c.begin(); ite = header_files_c.end(); if ( ( *( include_file.begin() ) == '\"' && *( include_file.end() - 1 ) == '\"' ) || ( *( include_file.begin() ) == '<' && *( include_file.end() - 1 ) == '>' ) ) { file = include_file.substr( 1, include_file.length() - 2 ); } } if ( file.empty() ) { return false; } for ( it = itb; it != ite; ++it ) { if ( *it == file ) { if ( file == "omp.h" || file == "omp_lib.h" ) { // If we remove the api include, we must generate a // header to include it again via .opari.inc. instrumented_paradigm_type |= OPARI2_PT_OMP; } return true; } } return false; } void SaveForInit( OPARI2_Directive* d ) { if ( !tmp_directives.empty() ) { vector::iterator it = tmp_directives.begin(); while ( it != tmp_directives.end() ) { if ( *it == d ) { it = tmp_directives.erase( it ); break; } else { ++it; } } } directive_vec.push_back( d ); } void DirectiveStackPush( OPARI2_Directive* d ) { directive_stack.push_back( d ); } OPARI2_Directive* DirectiveStackTop( OPARI2_Directive* d ) { if ( directive_stack.empty() ) { if ( d ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":" << "ERROR: unbalanced pragma/directive nesting for " << d->GetName() << " directive \n"; } else { cerr << "ERROR: unbalanced pragma/directive nesting!\n"; } cleanup_and_exit(); } else { return directive_stack.back(); } return NULL; } void DirectiveStackPop( OPARI2_Directive* d ) { OPARI2_Directive* d_top = DirectiveStackTop( d ); if ( !tmp_directives.empty() ) { vector::iterator it = tmp_directives.begin(); while ( it != tmp_directives.end() ) { if ( *it == d_top ) { /* This is the only reference left to this directive, so perform cleanup */ tmp_directives.erase( it ); directive_stack.pop_back(); delete d_top; return; } else { ++it; } } } directive_stack.pop_back(); } void PrintDirectiveStackTop( void ) { if ( directive_stack.empty() ) { cerr << "Error: Directive stack empty \n"; cleanup_and_exit(); } else { OPARI2_Directive* d = directive_stack.back(); if ( d ) { cerr << " near \"" << paradigm_type_to_string( d->GetParadigmType() ) << ": " << d->GetName() << "\" construct at " << d->GetFilename() << ":" << d->GetLineno() << std::endl; } } } void DirectiveStackInsertDescr( int id ) { for ( vector::iterator it = directive_stack.begin(); it != directive_stack.end(); ++it ) { if ( !( ( *it )->DescrsEmpty() ) ) { ( *it )->InsertDescr( id ); } } } void Finalize( OPARI2_Option_t& options ) { // check region stack if ( !directive_stack.empty() ) { cerr << "ERROR: unbalanced pragma/directive nesting\n"; while ( !directive_stack.empty() ) { PrintDirectiveStackTop(); DirectiveStackPop(); } cleanup_and_exit(); } // generate opari include file ofstream incs( options.incfile.c_str() ); if ( !incs ) { cerr << "ERROR: cannot open opari include file " << options.incfile << "\n"; exit( 1 ); } if ( options.lang & L_C_OR_CXX ) { /** In order to please the PGI compiler, the order of the header * generation between OpenMP and user instrumentation must not * be switched. Take care to test additions in that respect. * * The error that was encountered was that the * threadprivate(pomp_tpd) that is added for the * --thread=omp:pomp_tpd option caused: * "PGCC-S-0155-pomp_tpd_ is not threadprivate * (.../jacobi/cxx/main.cpp: 167) PGCC/x86 Linux 14.1-0: * compilation completed with severe errors" */ if ( instrumented_paradigm_type & OPARI2_PT_POMP ) { OPARI2_DirectivePomp::GenerateHeader( incs ); } if ( instrumented_paradigm_type & OPARI2_PT_OMP ) { OPARI2_DirectiveOpenmp::GenerateHeader( incs ); } } if ( directive_vec.size() ) { for ( vector::iterator it = directive_vec.begin(); it != directive_vec.end(); ++it ) { if ( ( *it )->GetName() != "offload" && ( *it )->GetName() != "declspec" ) { ( *it )->GenerateDescr( incs ); } } } if ( options.lang & L_FORTRAN ) { OPARI2_Directive::FinalizeFortranDescrs( incs ); OPARI2_DirectiveOpenmp::GenerateInitHandleCalls( options.os, options.incfile_nopath ); OPARI2_DirectiveOpenmp::FinalizeDescrs( incs ); OPARI2_DirectivePomp::GenerateInitHandleCalls( options.os, options.incfile_nopath ); } else if ( options.lang & L_C_OR_CXX ) { OPARI2_DirectiveOpenmp::GenerateInitHandleCalls( incs ); OPARI2_DirectivePomp::GenerateInitHandleCalls( incs ); } /*cleanup tmp_directives and directive_vec vectors*/ for ( vector::iterator it = tmp_directives.begin(); it != tmp_directives.end(); it++ ) { delete *it; } for ( vector::iterator it = directive_vec.begin(); it != directive_vec.end(); it++ ) { delete *it; } } void SaveSingleLineDirective( OPARI2_Directive* d ) { saved_single_line_directive = d; } void HandleSingleLineDirective( const int lineno, ostream& os ) { if ( saved_single_line_directive ) { OPARI2_DirectiveDefinition* d_def = get_directive_table_entry( saved_single_line_directive ); if ( d_def->active ) { /** @TODO This is currently the only case, nonetheless it should be generalized */ extra_openmp_atomic_handler( saved_single_line_directive, lineno, os ); } else { DirectiveStackPop(); saved_single_line_directive = NULL; } } } opari2-2.0.9/src/opari/PaxHeaders/opari2_parser_f.cc0000644000000000000000000000013214770056734017276 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.351367345 opari2-2.0.9/src/opari/opari2_parser_f.cc0000644000175100001440000011527014770056734017634 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2014, 2016, 2025, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_parser_f.cc * * @brief All functions to parse fortran files are collected here. */ #include #include using std::tolower; using std::toupper; #include using std::string; #include using std::getline; #include using std::transform; using std::sort; using std::min; #include using std::strlen; using std::remove_if; #include "config.h" #include "opari2_parser_f.h" #include "opari2_directive_manager.h" struct fo_tolower { int operator()( int x ) const { return std::tolower( x ); } }; OPARI2_FortranParser::OPARI2_FortranParser( OPARI2_Option_t& options ) : m_options( options ), m_os( options.os ), m_is( options.is ) { m_line = ""; m_lowline = ""; m_unprocessed_line = ""; m_lineno = 0; //m_loop_directives = NULL; m_need_pragma = false; m_in_string = 0; m_normal_line = false; m_in_header = false; m_continuation = false; m_sentinel = ""; m_offload_pragma = false; m_offload_attribute = ""; m_current_offload_function = ""; m_offload_subroutine = false; m_offload_function = false; m_waitfor_loopstart = false; m_waitfor_loopend = false; m_lineno_loopend = 0; m_curr_file = m_options.infile; if ( m_options.keep_src_info ) { /** The preprocessor of the Sun Studio compiler breaks if the * first line is a preprocessor directive, so we insert a * blank line at the beginning */ m_os << std::endl; m_os << "#line 1 \"" << m_options.infile << "\"" << "\n"; } } /**@brief Check if the line belongs to the header of a subroutine or function. * After lines in the header, we can insert our variable definitions.*/ bool OPARI2_FortranParser::is_sub_unit_header( void ) { string sline; string lline; string keyword; bool result; static bool continuation = false; static int openbrackets = 0; static bool inProgram = false; static bool inModule = false; static bool inInterface = false; static bool inContains = false; size_t pos; pos = m_lowline.find_first_not_of( " \t" ); /*string is empty*/ if ( pos == string::npos ) { pos = 0; sline.clear(); } else { sline = m_lowline.substr( pos ); } lline = sline; sline.erase( remove_if( sline.begin(), sline.end(), isspace ), sline.end() ); //Set number of open brackets to 0 if new unit begins, since we might have missed //closing brackets on continuation lines. if ( ( ( sline.find( "program" ) == 0 ) && lline.find( "program" ) != string::npos ) || ( ( sline.find( "module" ) == 0 ) && !inProgram && lline.find( "module" ) != string::npos ) || ( ( sline.find( "interface" ) == 0 ) && inModule && lline.find( "interface" ) != string::npos ) || ( ( sline.find( "abstractinterface" ) == 0 ) && inModule ) || ( ( sline.find( "contains" ) != string::npos ) && inModule && lline.find( "contains" ) != string::npos ) || ( sline.find( "subroutine" ) == 0 && lline.find( "subroutine" ) != string::npos ) || ( ( sline.find( "function" ) == 0 && lline.find( "function" ) != string::npos ) && !m_in_header && ( ( sline.find( "=" ) >= sline.find( "!" ) ) || ( sline.find( "=" ) >= sline.find( "kind" ) ) ) ) ) { openbrackets = 0; } //Check if we are in Fortran77 and have a character in column 6 if ( ( m_options.form & F_FIX ) && m_lowline.length() >= 6 && m_lowline[ 5 ] != ' ' && m_lowline.find( "\t" ) > 6 ) { continuation = true; } //Check if we enter a program block inProgram = inProgram || ( sline.find( "program" ) == 0 ); //Check if we enter a module block inModule = !inProgram && ( inModule || ( sline.find( "module" ) == 0 ) && sline.find( "subroutine" ) == string::npos ); //Check if we enter an interface block inInterface = inModule && ( inInterface || ( sline.find( "interface" ) == 0 ) || ( sline.find( "abstractinterface" ) == 0 ) ); //Check if we enter a contains block inContains = inModule && ( inContains || ( sline.find( "contains" ) != string::npos ) ); //search for words indicating, that we did not reach a point where //we can insert variable definitions, these keywords are: //program, function, result, subroutine, save, implicit, parameter, //and use bool func = ( ( lline.find( "function" ) != string::npos ) && !( lline.find( "function" ) > lline.find( "pure" ) ) && !( lline.find( "function" ) > lline.find( "elemental" ) ) && !( lline.length() >= ( lline.find( "function" ) + 8 ) && ( isalnum( lline[ lline.find( "function" ) + 8 ] ) || ( lline[ lline.find( "function" ) + 8 ] == '_' ) ) ) && !( ( lline.find( "function" ) != 0 ) && ( isalnum( lline[ lline.find( "function" ) - 1 ] ) || ( lline[ lline.find( "function" ) - 1 ] == '_' ) ) ) && ( isalpha( sline[ sline.find( "function" ) + 8 ] ) || sline[ sline.find( "function" ) + 8 ] == '&' ) ); bool sub = ( ( lline.find( "subroutine" ) != string::npos ) && !( lline.find( "subroutine" ) > lline.find( "pure" ) ) && !( lline.find( "subroutine" ) > lline.find( "elemental" ) ) && !( lline.length() >= ( lline.find( "subroutine" ) + 10 ) && ( isalnum( lline[ lline.find( "subroutine" ) + 10 ] ) || ( lline[ lline.find( "subroutine" ) + 10 ] == '_' ) ) ) && !( ( lline.find( "subroutine" ) != 0 ) && ( isalnum( lline[ lline.find( "subroutine" ) - 1 ] ) || ( lline[ lline.find( "subroutine" ) - 1 ] == '_' ) ) ) && ( isalpha( sline[ sline.find( "subroutine" ) + 10 ] ) || sline[ sline.find( "subroutine" ) + 10 ] == '&' ) ); bool key = ( ( sline.find( "save" ) == 0 && m_in_header ) || ( sline.find( "result" ) == 0 && m_in_header ) || ( sline.find( "implicit" ) == 0 && m_in_header ) || ( sline.find( "use" ) == 0 && m_in_header ) || ( sline.find( "include" ) == 0 && m_in_header ) ); bool noend = ( sline.find( "endfunction" ) == string::npos && sline.find( "endsubroutine" ) == string::npos && sline.find( "endmodule" ) == string::npos && sline.find( "endprogram" ) == string::npos ); size_t pos_e = sline.find( "=" ); bool validequal = ( pos_e >= sline.find( "!" ) || pos_e > sline.find( "kind" ) || pos_e > sline.find( "only:" ) || pos_e == ( sline.find( ">" ) - 1 ) || pos_e > sline.find( "bind(" ) ); bool misc = ( ( sline.find( "#" ) == 0 && m_in_header ) || ( sline.find( "&" ) == 0 && m_in_header ) || ( sline.empty() && m_in_header ) || ( sline.find( "parameter" ) == 0 && m_in_header ) || ( sline.find( "dimension" ) == 0 && m_in_header ) || ( openbrackets != 0 && m_in_header ) || ( continuation && m_in_header ) ); /* Debug output */ /*std::cout << std::endl << lline << std::endl; std::cout << "continuation= " << continuation << std::endl; std::cout << "m_in_header= " << m_in_header << std::endl; std::cout << "func= " << func << std::endl; std::cout << "sub= " << sub << std::endl; std::cout << "key= " << key << std::endl; std::cout << "validequal= " << validequal << std::endl; std::cout << "misc= " << misc << std::endl; std::cout << "openbrackets= " << openbrackets << std::endl; std::cout << "inModule= " << inModule << std::endl; std::cout << "inInterface= " << inInterface << std::endl; std::cout << "inContains= " << inContains << std::endl; std::cout << "noend= " << noend << std::endl;*/ if ( ( ( sline.find( "program" ) == 0 || func || sub || key ) && noend && validequal ) || misc ) { result = !inModule || ( !inInterface && inContains ); } else { result = false; } //Check if we leave a program block inProgram = inProgram && sline.find( "endprogram" ) == string::npos; //Check if we leave a module block inModule = inModule && sline.find( "endmodule" ) == string::npos; //Check if we leave an interface block inInterface = inInterface && sline.find( "endinterface" ) == string::npos; //Check if we leave an contains block inContains = inContains && sline.find( "endmodule" ) == string::npos; if ( sline.length() && sline[ sline.length() - 1 ] == '&' ) { continuation = true; } else { continuation = false; } /*count open brackets, to see if a functionheader is split across different lines*/ for ( string::size_type i = 0; i < m_lowline.length(); i++ ) { bool in_string = false; if ( m_lowline[ i ] == '(' ) { openbrackets++; } if ( m_lowline[ i ] == ')' ) { openbrackets--; } if ( ( m_lowline[ i ] == '\'' || m_lowline[ i ] == '"' ) && in_string ) { in_string = false; } else { in_string = true; } /*rest of line is a comment*/ if ( m_lowline[ i ] == '!' && !in_string ) { break; } } return result; } bool OPARI2_FortranParser::is_empty_line( void ) { return m_lowline.find_first_not_of( " \t" ) == string::npos; } /**@brief check if this line is a comment line*/ bool OPARI2_FortranParser::is_comment_line( void ) { if ( m_options.form & F_FIX ) { if ( m_lowline[ 0 ] == '!' || m_lowline[ 0 ] == '*' || m_lowline[ 0 ] == 'c' ) { // fixed form comment if ( m_lowline[ 1 ] == '$' && m_lowline.find_first_not_of( " \t0123456789", 2 ) > 5 ) { // Conditional Compilation for fixed form m_lowline[ 0 ] = ' '; m_lowline[ 1 ] = ' '; return false; } else if ( m_lowline[ 1 ] == 'p' && m_lowline[ 2 ] == '$' && m_lowline.find_first_not_of( " \t0123456789", 3 ) > 5 ) { /** POMP Conditional Compilation for fixed form. This * allows code to be only active after processing * with OPARI2 by using the !P$ sentinel to start a * comment */ m_lowline[ 0 ] = m_line[ 0 ] = ' '; m_lowline[ 1 ] = m_line[ 1 ] = ' '; m_lowline[ 2 ] = m_line[ 2 ] = ' '; return false; } else { return true; } } } // free form comment size_t first_char = m_lowline.find_first_not_of( " \t" ); if ( ( first_char != string::npos ) && ( m_lowline[ first_char ] == '!' ) ) { if ( m_lowline[ first_char + 1 ] == '$' && ( m_lowline[ first_char + 2 ] == ' ' || m_lowline[ first_char + 2 ] == '\t' ) ) { // Conditional Compilation for free form m_lowline[ first_char ] = ' '; m_lowline[ first_char + 1 ] = ' '; return false; } else if ( m_lowline[ first_char + 1 ] == 'p' && m_lowline[ first_char + 2 ] == '$' && ( m_lowline[ first_char + 3 ] == ' ' || m_lowline[ first_char + 3 ] == '\t' ) ) { /** POMP Conditional Compilation for fixed form. This * allows code to be only active after processing with * OPARI2 by using the !P$ sentinel to start a * comment */ m_lowline[ first_char ] = m_line[ first_char ] = ' '; m_lowline[ first_char + 1 ] = m_line[ first_char + 1 ] = ' '; m_lowline[ first_char + 2 ] = m_line[ first_char + 2 ] = ' '; return false; } else { return true; } } return false; } /**@brief check if this line starts a do loop*/ bool OPARI2_FortranParser::is_loop_start( string& label ) { string::size_type poslab = string::npos; label = ""; if ( !( m_line.size() ) ) { return false; } // is there a 'do ' string::size_type pstart = m_lowline.find( "do" ); if ( pstart == string::npos || ( m_lowline[ pstart + 2 ] != '\0' && m_lowline[ pstart + 2 ] != ' ' && m_lowline[ pstart + 2 ] != '\t' ) ) { return false; } string::size_type pos = m_lowline.find_first_not_of( " \t" ); // cerr << "pos: " << pos << std::endl; if ( pos != pstart ) { // there is a DO_construct_name, i.e, this is a named do-loop poslab = m_lowline.find_first_of( ":", pos ); if ( poslab == string::npos ) { return false; } label = m_line.substr( pos, poslab - pos ); // skip white space pos = m_lowline.find_first_not_of( " \t", poslab + 1 ); } //check again, if pos now start of do, otherwise not a correct do statement pstart = m_lowline.find( "do", pos ); if ( pstart != pos || ( m_lowline[ pstart + 2 ] != '\0' && m_lowline[ pstart + 2 ] != ' ' && m_lowline[ pstart + 2 ] != '\t' ) ) { return false; } pos = m_lowline.find_first_not_of( " \t", pos + 2 ); // cerr << "pos2: " << pos << std::endl; if ( pos != string::npos && isdigit( m_lowline[ pos ] ) ) { // there is a stmtlabel poslab = pos; pos = m_lowline.find_first_not_of( "0123456789", pos ); // cerr << "2pos: " << pos << ", poslab: " << poslab << std::endl; label = m_line.substr( poslab, pos - poslab ); } // cerr << label << "\n\n"; return true; } /**@brief check if this line is the end of a do loop*/ bool OPARI2_FortranParser::is_loop_end( void ) { string toplabel = m_loop_stack.top().label; string label; if ( !( m_line.size() ) ) { return false; } string::size_type pos = m_lowline.find_first_not_of( " \t" ); // is it a nonblock DO loop? string::size_type poslab = toplabel.find_first_not_of( "0123456789" ); if ( ( toplabel.size() > 0 ) && ( poslab == string::npos ) ) { // search for nonblock Do loop poslab = pos; pos = m_lowline.find_first_not_of( "0123456789", pos ); // is there a label in this line? if ( poslab == pos ) { return false; } label = m_line.substr( poslab, pos - poslab ); // is it the label of the top loop if ( toplabel == label ) { return true; } else { return false; } } else { // search for block Do loop pos = m_lowline.find( "end", pos ); if ( pos == string::npos || ( pos != m_lowline.find_first_not_of( " \t0123456789" ) ) ) { return false; } // pos = m_lowline.find( "do", pos + 3 ); pos = m_lowline.find_first_not_of( " \t", pos + 3 ); if ( pos == string::npos || ( m_lowline.find( "do", pos ) > pos ) ) { return false; } pos = m_lowline.find( "do", pos ); if ( pos == string::npos || ( m_lowline.find( "=", pos ) < m_lowline.find( "!", pos ) ) ) { return false; } // search for label if ( toplabel.size() ) { // skip white space poslab = m_lowline.find_first_not_of( " \t", pos + 2 ); pos = m_lowline.find_first_of( " \t", poslab ); if ( poslab == pos ) { return false; } label = m_line.substr( poslab, pos - poslab ); // is it the label of the top loop if ( toplabel == label ) { return true; } else { return false; } } else { return true; // end do without label } } } void OPARI2_FortranParser::test_and_insert_enddo( void ) { if ( !m_loop_directives.empty() && m_waitfor_loopend ) { m_waitfor_loopend = false; if ( m_loop_directives.top()->NeedsEndLoopDirective() ) { OPARI2_Directive* d_new = m_loop_directives.top()->EndLoopDirective( m_lineno_loopend ); ProcessDirective( d_new, m_os ); m_loop_directives.pop(); delete d_new; } } } /** @brief Delete comments and strings before the lines are parsed * to avoid finding keywords in comments or strings.*/ void OPARI2_FortranParser::del_strings_and_comments( void ) { // zero out string constants and free form comments for ( string::size_type i = 0; i < m_lowline.size(); ++i ) { if ( m_in_string ) { // inside string if ( m_lowline[ i ] == m_in_string ) { m_lowline[ i ] = '@'; ++i; if ( i >= m_lowline.size() ) { // eol: no double string delimiter -> string ends m_in_string = 0; break; } if ( m_lowline[ i ] != m_in_string ) { // no double string delimiter -> string ends m_in_string = 0; continue; } } m_lowline[ i ] = '@'; } else if ( m_lowline[ i ] == '!' ) { /* -- zero out partial line F90 comments -- */ for (; i < m_lowline.size(); ++i ) { m_lowline[ i ] = ' '; } break; } else if ( m_lowline[ i ] == '\'' || m_lowline[ i ] == '\"' ) { m_in_string = m_lowline[ i ]; m_lowline[ i ] = '@'; } } } bool OPARI2_FortranParser::is_directive( void ) { m_sentinel = ""; string::size_type pos = string::npos; if ( m_options.form == F_FIX ) { if ( m_lowline.size() && ( m_lowline[ 0 ] == '!' || m_lowline[ 0 ] == 'c' || m_lowline[ 0 ] == '*' ) ) { pos = 0; } } else if ( m_options.form == F_FREE ) { string::size_type pstart = m_lowline.find_first_not_of( " \t" ); if ( pstart != string::npos && m_lowline.size() > pstart + 1 && m_lowline[ pstart ] == '!' ) { pos = pstart; } } if ( pos == string::npos ) { return false; } return IsValidSentinel( m_lowline, pos, m_sentinel ); } bool OPARI2_FortranParser::get_next_line( void ) { if ( getline( m_is, m_line ) ) { /* workaround for bogus getline implementations */ while ( m_line.size() == 1 && m_line[ 0 ] == '\0' ) { get_next_line(); } /* remove extra \r from Windows source files */ if ( m_line.size() && *( m_line.end() - 1 ) == '\r' ) { m_line.erase( m_line.end() - 1 ); } ++m_lineno; m_lowline = m_line; transform( m_line.begin(), m_line.end(), m_lowline.begin(), fo_tolower() ); /*check for Fortran continuation lines*/ if ( m_options.form == F_FREE ) { m_continuation = m_next_is_continuation; string::size_type amp = m_line.find_last_not_of( " \t" ); if ( amp != string::npos && m_line[ amp ] == '&' ) { m_continuation = true; } else { m_continuation = false; } } return true; } return false; } void OPARI2_FortranParser::handle_line_directive( const string::size_type lstart ) { /* line directive */ string::size_type loc = m_line.find_first_not_of( " \t", lstart + 1 ); if ( loc != string::npos && isdigit( m_line[ loc ] ) ) { string::size_type nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", lstart + 1 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); filename = m_line.substr( nrstart, nrend - nrstart ); if ( nrstart != 0 ) { if ( filename[ 0 ] == '/' ) { /*absolute path*/ m_curr_file = filename; } else { /*relative path*/ string path( m_options.infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_curr_file = path + "/" + filename; } } m_os << m_line << std::endl; } else if ( m_line.substr( lstart + 1, 5 ) == "line " && isdigit( m_line[ m_line.find_first_not_of( " \t", lstart + 5 ) ] ) ) { int nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", lstart + 5 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); if ( nrstart != 0 ) { filename = m_line.substr( nrstart, nrend - nrstart ); if ( filename[ 0 ] == '/' ) { /*absolute path*/ m_curr_file = filename; } else { /*relative path*/ string path( m_options.infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_curr_file = path + "/" + filename; } } m_os << m_line << std::endl; } else { /*keep other C/C++ preprocessor directives like #if and #endif*/ m_os << m_line << std::endl; } } void OPARI2_FortranParser::handle_directive( void ) { if ( m_in_header == true ) { m_in_header = false; if ( !InstrumentationDisabled( D_FULL ) ) { m_os << " include \'" << m_options.incfile_nopath << "\'" << std::endl; } if ( m_options.keep_src_info ) { m_os << "#line " << m_lineno << " \"" << m_curr_file << "\"" << "\n"; } } vector lines; lines.push_back( m_lowline ); bool found_continuation_line; string prev_sentinel = m_sentinel; unsigned ignored_lines = 0; do { found_continuation_line = false; if ( m_options.form == F_FREE ) { string::size_type com = m_lowline.find( m_sentinel ) + m_sentinel.length(); com = m_lowline.find( "!", com ); if ( com != string::npos ) { --com; } string::size_type amp = m_lowline.find_last_not_of( " \t", com ); if ( m_lowline[ amp ] == '&' ) { found_continuation_line = true; } else { /** There is no continuation line, so jump out * of while loop */ break; } } if ( get_next_line() ) { m_unprocessed_line = true; ignored_lines++; prev_sentinel = m_sentinel; if ( is_directive() ) { if ( m_options.form == F_FIX ) { string::size_type p = m_lowline.find( m_sentinel ) + m_sentinel.length(); if ( ( m_sentinel == prev_sentinel && ( m_lowline[ p ] != ' ' && m_lowline[ p ] != '\t' && m_lowline[ p ] != '0' ) ) ) { found_continuation_line = true; } } if ( found_continuation_line ) { m_unprocessed_line = false; ignored_lines--; lines.push_back( m_lowline ); } } else if ( is_comment_line() ) { found_continuation_line = true; m_sentinel = prev_sentinel; } else if ( found_continuation_line && !is_empty_line() ) { cerr << m_curr_file << ":" << m_lineno - 1 << ": ERROR: missing continuation line\n"; cleanup_and_exit(); } } else { break; } } while ( found_continuation_line ); vector directive_prefix( 1, prev_sentinel ); OPARI2_Directive* d_new = NewDirective( lines, directive_prefix, m_options.lang, m_curr_file, m_lineno - lines.size() - ignored_lines + 1 ); if ( d_new ) { m_waitfor_loopstart = d_new->NeedsEndLoopDirective(); if ( !d_new->EndsLoopDirective() ) { test_and_insert_enddo(); } ProcessDirective( d_new, m_os ); if ( d_new->NeedsEndLoopDirective() ) { m_loop_directives.push( d_new ); } else if ( d_new->EndsLoopDirective() ) { m_loop_directives.pop(); m_waitfor_loopend = false; } d_new = NULL; m_need_pragma = false; } else { // Print orig code if directive is ignored. for ( vector::const_iterator line = lines.begin(); line != lines.end(); ++line ) { m_os << *line << std::endl; } } } bool OPARI2_FortranParser::is_free_offload_directive() { string::size_type lstart = string::npos; return m_lowline.size() && ( ( lstart = m_lowline.find_first_not_of( " \t" ) ) != string::npos ) && ( lstart == m_lowline.find( "!dir$" ) ) && ( m_lowline.find( "offload" ) != string::npos ); } void OPARI2_FortranParser::handle_free_offload_directive() { string::size_type pstart = 0; if ( ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 5 ) ) != string::npos ) && ( ( m_lowline.find( "offload", pstart ) == pstart ) || ( m_lowline.find( "omp", pstart ) == pstart && ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 3 ) ) != string::npos ) && m_lowline.find( "offload", pstart ) == pstart ) ) ) { if ( ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 7 ) ) != string::npos ) && m_lowline.find( "begin", pstart ) == pstart ) { /*begin of an offload regions*/ m_os << m_line << std::endl; DisableInstrumentation( D_FULL ); } else { /*next pragma must be offloaded*/ m_os << m_line << std::endl; m_offload_pragma = true; } } else if ( m_lowline.find( "end", pstart ) == pstart && ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 3 ) ) != string::npos ) && m_lowline.find( "offload", pstart ) == pstart ) { /*end of an offload regions*/ m_os << m_line << std::endl; EnableInstrumentation( D_FULL ); } else if ( m_lowline.find( "attributes", pstart ) == pstart && ( ( pstart = m_lowline.find_first_not_of( " \t", pstart + 10 ) ) != string::npos ) && m_lowline.find( "offload", pstart ) == pstart ) { string::size_type nstart = m_lowline.find( "::", pstart ); nstart = m_lowline.find_first_not_of( " \t", nstart + 2 ); string::size_type nend = m_lowline.find_first_of( " \t\n\0", nstart ); m_offload_attribute = m_lowline.substr( nstart, nend - nstart ); m_os << m_line << std::endl; } else { /*print lines with !dir$ where no offload is present and continue*/ m_os << m_line << std::endl; } } void OPARI2_FortranParser::handle_offloaded_functions( void ) { string::size_type pos_function = m_lowline.find( "function" ); string::size_type pos_subroutine = m_lowline.find( "subroutine" ); string::size_type pos_end = m_lowline.find( "end" ); string::size_type pos_offload_attribute = m_lowline.find( m_offload_attribute ); string::size_type pos_offload_function = m_lowline.find( m_current_offload_function ); if ( ( ( pos_function < pos_offload_attribute || pos_subroutine < pos_offload_attribute ) && pos_offload_attribute != string::npos ) && !( pos_end < pos_function || pos_end < pos_subroutine ) ) { /* begin of offload function or subroutine */ DisableInstrumentation( D_FULL ); m_current_offload_function = m_offload_attribute; m_offload_attribute = ""; m_offload_function = true; } else if ( ( ( ( pos_function < pos_offload_function || m_offload_function ) && pos_end < pos_function ) || ( ( pos_subroutine < pos_offload_function || m_offload_subroutine ) && pos_end < pos_subroutine ) ) && pos_offload_function != string::npos ) { /*end of offload function*/ EnableInstrumentation( D_FULL ); m_offload_function = false; m_current_offload_function = ""; } } void OPARI2_FortranParser::handle_normal_line() { bool isComment = is_comment_line(); if ( m_need_pragma && !isComment && m_lowline.find_first_not_of( " \t" ) != string::npos ) { cerr << m_curr_file << ":" << m_lineno - 1 << ": ERROR: missing continuation line\n"; cleanup_and_exit(); } else if ( !m_loop_directives.empty() && !isComment && m_lowline.find_first_not_of( " \t" ) != string::npos ) { test_and_insert_enddo(); } if ( isComment ) { m_os << m_line << '\n'; } else if ( ( m_line.size() == 0 || m_lowline.find_first_not_of( " \t" ) == string::npos ) && m_lineno != 0 ) { // empty line m_os << m_line << '\n'; ++m_lineno_loopend; } else { // really normal line /*if no pragma follows the offload, a function is offloaded and * the next pragma must be processed normally*/ m_offload_pragma = false; del_strings_and_comments(); /* split line at ; */ string complete_line( m_line ); string complete_m_lowline( m_lowline ); size_t position = 0; while ( position != string::npos ) { if ( position == 0 ) { m_line = complete_line.substr( position, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position ); m_lowline = complete_m_lowline.substr( position, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position ); } else { m_line = complete_line.substr( position + 1, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position - 1 ); m_lowline = complete_m_lowline.substr( position + 1, min( complete_m_lowline.find( ";", position + 1 ), complete_m_lowline.size() + 1 ) - position - 1 ); } position = complete_m_lowline.find( ";", position + 1 ); if ( is_sub_unit_header() ) { m_in_header = true; } else if ( m_in_header == true ) { m_in_header = false; if ( !InstrumentationDisabled( D_FULL ) ) { m_os << " include \'" << m_options.incfile_nopath << "\'" << std::endl; } if ( m_options.keep_src_info ) { m_os << "#line " << m_lineno << " \"" << m_curr_file << "\"" << "\n"; } } // replace rumtime API call in this line if possible ReplaceRuntimeAPI( m_lowline, m_line, m_curr_file, L_FORTRAN ); if ( m_lineno != 0 ) { if ( position == string::npos ) { m_os << m_line << '\n'; } else { m_os << m_line << ';'; } } /* * instrumentation of the end of regions which are * implicitly ended after a single line of code */ if ( !m_continuation ) { HandleSingleLineDirective( m_lineno, m_os ); } else { } // search for loop start statement string label; if ( is_loop_start( label ) ) { LoopDescriptionT loop; loop.is_directive_loop = m_waitfor_loopstart; loop.label = label; m_loop_stack.push( loop ); } // search for loop end statement else if ( ( !m_loop_stack.empty() ) && is_loop_end() ) { LoopDescriptionT top_loop = m_loop_stack.top(); m_waitfor_loopend = top_loop.is_directive_loop; m_loop_stack.pop(); if ( !m_loop_stack.empty() ) { top_loop = m_loop_stack.top(); } else { top_loop.is_directive_loop = false; top_loop.label = ""; } // more than one loop ending on same statement (only numerical labels) while ( ( top_loop.label.find_first_of( "0123456789" ) != string::npos ) && ( is_loop_end() ) ) { m_waitfor_loopend = top_loop.is_directive_loop; m_loop_stack.pop(); if ( !m_loop_stack.empty() ) { top_loop = m_loop_stack.top(); } else { top_loop.is_directive_loop = false; top_loop.label = ""; } } m_lineno_loopend = m_lineno; } else { // normal line } m_waitfor_loopstart = false; } } } /** @brief This function processes fortran files and searches for a * place to insert variables, pragmas/directives and the begin * and end of do loops which are needed to ensure correct * instrumentation of parallel do constructs.*/ void OPARI2_FortranParser::process() { while ( m_unprocessed_line || get_next_line() ) { m_normal_line = false; m_unprocessed_line = false; if ( !( m_offload_attribute.empty() && m_current_offload_function.empty() ) ) { handle_offloaded_functions(); } string::size_type lstart = m_line.find_first_not_of( " \t" ); if ( m_in_string && !is_comment_line() ) { del_strings_and_comments(); ReplaceRuntimeAPI( m_lowline, m_line, m_curr_file, L_FORTRAN ); m_os << m_line << '\n'; } else if ( lstart != string::npos && m_line[ lstart ] == '#' ) { handle_line_directive( lstart ); } else if ( is_directive() ) { handle_directive(); } else if ( is_free_offload_directive() ) { handle_free_offload_directive(); } else { handle_normal_line(); } } } opari2-2.0.9/src/opari/PaxHeaders/opari2_parser_f.h0000644000000000000000000000013214770056734017140 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.351367345 opari2-2.0.9/src/opari/opari2_parser_f.h0000644000175100001440000000711414770056734017473 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_parser_f.h * * @brief */ #ifndef OPARI2_PROCESS_F_H #define OPARI2_PROCESS_F_H #include using std::cerr; using std::ostream; using std::istream; #include using std::vector; #include using std::stack; #include "opari2.h" #include "opari2_directive_manager.h" #include "opari2_directive.h" /** @brief information about loops*/ typedef struct { /** loop belongs to preceeding directive */ bool is_directive_loop; /** loop label */ string label; } LoopDescriptionT; class OPARI2_FortranParser { public: OPARI2_FortranParser( OPARI2_Option_t& options ); ~OPARI2_FortranParser() { }; /** @brief This function processes fortran files and searches for a * place to insert variables, OpenMP pragmas and the begin and * end of do loops which are needed to ensure correct * instrumentation of parallel do constructs.*/ void process( void ); private: string m_line; string m_lowline; bool m_unprocessed_line; int m_lineno; string m_curr_file; std::stack m_loop_directives; bool m_need_pragma; char m_in_string; bool m_normal_line; bool m_in_header; bool m_continuation; bool m_next_is_continuation; string m_sentinel; bool m_offload_pragma; string m_offload_attribute; string m_current_offload_function; bool m_offload_subroutine; bool m_offload_function; // for endloop instrumentation stack m_loop_stack; // Line_type m_type_of_last_line; bool m_waitfor_loopstart; bool m_waitfor_loopend; int m_lineno_loopend; OPARI2_Option_t& m_options; ofstream& m_os; ifstream& m_is; /**@brief Check if the line belongs to the header of a subroutine or function. * After lines in the header, we can insert our variable definitions.*/ bool is_sub_unit_header( void ); /**@brief check if this line is empty*/ bool is_empty_line( void ); /**@brief check if this line is a comment line*/ bool is_comment_line( void ); /**@brief check if this line is a continuation line*/ bool is_continuation_line( void ); /**@brief check if this line starts a do loop*/ bool is_loop_start( string& label ); /**@brief check if this line is the end of a do loop*/ bool is_loop_end( void ); void test_and_insert_enddo( void ); /** @brief Delete comments and strings before the lines are parsed * to avoid finding keywords in comments or strings.*/ void del_strings_and_comments( void ); bool is_directive( void ); bool get_next_line( void ); void handle_line_directive( const string::size_type lstart ); void handle_directive( void ); bool is_free_offload_directive( void ); void handle_free_offload_directive(); void handle_offloaded_functions( void ); void handle_normal_line(); }; #endif // __PROCESS_F_H opari2-2.0.9/src/opari/PaxHeaders/opari2_parser_c.cc0000644000000000000000000000013214770056734017273 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.351367345 opari2-2.0.9/src/opari/opari2_parser_c.cc0000644000175100001440000005760614770056734017641 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2016, 2020, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_parser_c.cc * * @brief This file contains all functions to parse and process C or C++ files. */ #include #include using std::istream; using std::cerr; #include using std::stack; #include using std::vector; #include using std::map; #include using std::string; #include using std::getline; #include using std::isalnum; using std::isalpha; #include #include #include "opari2.h" #include "opari2_parser_c.h" #include "openmp/opari2_directive_openmp.h" #include "pomp/opari2_directive_pomp.h" #include "offload/opari2_directive_offload.h" #include "opari2_directive_manager.h" OPARI2_CParser::OPARI2_CParser( OPARI2_Option_t& options ) : m_options( options ), m_os( options.os ), m_is( options.is ) { m_line = ""; m_pos = 0; m_in_comment = false; m_in_string = false; m_pre_cont_line = false; m_require_end = true; m_is_for = false; m_block_closed = false; m_lineno = 0; m_level = 0; m_num_semi = 0; m_lstart = string::npos; m_current_file = options.infile; m_infile = options.infile; m_next_end.push( -1 ); } string OPARI2_CParser::find_next_word( unsigned& pline, string::size_type& ppos ) { unsigned size = m_pre_stmt.size(); while ( pline < size ) { string::size_type wbeg = m_pre_stmt[ pline ].find_first_not_of( " \t", ppos ); if ( m_pre_stmt[ pline ][ wbeg ] == '\\' || wbeg == string::npos ) { ++pline; if ( pline < size ) { ppos = 0; } else { return ""; } } else { ppos = m_pre_stmt[ pline ].find_first_of( " \t()", wbeg ); return m_pre_stmt[ pline ].substr( wbeg, ppos == string::npos ? ppos : ppos - wbeg ); } } return ""; } /** @brief Check whether the current line is an extern function declaration */ bool OPARI2_CParser::is_extern_decl( void ) { // If it starts with 'extern' it is an declaration int nrstart = m_line.find_first_not_of( " \t" ); int nrend = m_line.find_first_of( " \t", nrstart + 1 ); if ( nrend > nrstart && m_line.substr( nrstart, nrend ) == "extern" ) { return true; } return false; } /** * @brief Instrument pragma directives. * * Preprocessor lines are passed to this function and checked, whether they are * pragmas. */ bool OPARI2_CParser::process_prestmt( int ln, string::size_type ppos ) { unsigned s = m_pre_stmt.size(); bool in_comment = false; vector orig_stmt; /* "remove" comments */ for ( unsigned i = 0; i < s; ++i ) { string::size_type pos = 0; string& line = m_pre_stmt[ i ]; string orig_line( line ); orig_stmt.push_back( orig_line ); while ( pos < line.size() ) { if ( in_comment ) { /* look for comment end */ if ( line[ pos ] == '*' && line[ pos + 1 ] == '/' ) { line[ pos++ ] = ' '; in_comment = false; } line[ pos++ ] = ' '; } else if ( line[ pos ] == '/' ) { pos++; if ( line[ pos ] == '/' ) { // c++ comments / line[ pos - 1 ] = ' '; line[ pos++ ] = ' '; while ( pos < line.size() ) { line[ pos++ ] = ' '; } } else if ( line[ pos ] == '*' ) { // c comment start line[ pos - 1 ] = ' '; line[ pos++ ] = ' '; in_comment = true; } } else { pos++; } } } vector directive_prefix( 1, "#" ); unsigned pline = 0; string first = find_next_word( pline, ppos ); if ( first == "pragma" ) { directive_prefix.push_back( first ); string paradigm_identifier = find_next_word( pline, ppos ); directive_prefix.push_back( paradigm_identifier ); OPARI2_Directive* d = NewDirective( m_pre_stmt, directive_prefix, m_options.lang, m_current_file, m_lineno - m_pre_stmt.size() + 1 ); if ( d ) { ProcessDirective( d, m_os, &m_require_end, &m_is_for ); return true; } } else if ( first == "include" ) { // include (for supported runtime API) -> remove it string word = find_next_word( pline, ppos ); if ( IsSupportedAPIHeaderFile( word, m_options.lang ) ) { s = 0; } } for ( unsigned i = 0; i < s; ++i ) { m_os << orig_stmt[ i ] << "\n"; } orig_stmt.clear(); return false; } bool OPARI2_CParser::handle_closed_block() { bool newline_printed = false; size_t next_char = m_line.find_first_not_of( " \t", m_pos ); /* The treatment of else blocks doesn't work yet, but it should go * somewhere here */ if ( ( m_next_end.top() == m_level && ( next_char != string::npos && m_line.substr( next_char, 4 ) != "else" ) ) || next_char == string::npos ) { bool more_chars = ( m_pos < m_line.size() ); if ( !m_block_closed ) { m_os << '\n'; newline_printed = true; } // while because block can actually close more than one pragma while ( m_next_end.top() == m_level ) { OPARI2_Directive* d_top = DirectiveStackTop( NULL ); if ( d_top ) { vector directive_prefix; int l = m_lineno; if ( m_block_closed ) { l--; } OPARI2_Directive* d = NewDirective( m_end_stmt, directive_prefix, m_options.lang, m_current_file, l ); if ( d ) { ProcessDirective( d, m_os ); } else { cerr << "Error when handling end of directive:" << d_top->GetName() << "\n"; } } m_next_end.pop(); } if ( more_chars && !m_block_closed ) { if ( next_char != string::npos ) { m_os << "#line " << m_lineno << " \"" << m_current_file << "\"" << "\n"; } for ( unsigned i = 0; i < m_pos; ++i ) { m_os << ' '; } } } return newline_printed; } void OPARI2_CParser::handle_preprocessor_directive( void ) { if ( ( isdigit( m_line[ m_line.find_first_not_of( " \t", m_lstart + 1 ) ] ) ) ) { /** * which compiler supports the line directive in this form? */ int nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", m_lstart + 1 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); // -1 because the next line has the number specified in this directive m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); filename = m_line.substr( nrstart, nrend - nrstart ); if ( nrstart != 0 ) { if ( filename[ 0 ] == '/' ) { /*absolute path*/ m_current_file = filename; } else { /*relative path*/ string path( m_infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_current_file = path + "/" + filename; } } m_os << m_line << std::endl; } else if ( m_line.compare( m_lstart + 1, 5, "line " ) == 0 && isdigit( m_line[ m_line.find_first_not_of( " \t", m_lstart + 5 ) ] ) ) { int nrstart, nrend; string filename; nrstart = m_line.find_first_not_of( " \t", m_lstart + 5 ); nrend = m_line.find_first_of( " \t", nrstart + 1 ); // -1 because the next line has the number specified in this directive m_lineno = atoi( m_line.substr( nrstart, nrend ).c_str() ) - 1; nrstart = m_line.find_first_not_of( " \t\"", nrend + 1 ); nrend = m_line.find_first_of( " \t\"", nrstart + 1 ); if ( nrstart != 0 ) { filename = m_line.substr( nrstart, nrend - nrstart ); if ( filename[ 0 ] == '/' ) { /* absolute path */ m_current_file = filename; } else { /* relative path */ string path( m_infile ); path = path.substr( 0, path.find_last_of( "/" ) ); m_current_file = path + "/" + filename; } } m_os << m_line << std::endl; } else { /* * other preprocessor directive */ m_pre_stmt.push_back( m_line ); if ( m_line[ m_line.size() - 1 ] == '\\' ) // escaped Backslash { m_pre_cont_line = true; } else { if ( process_prestmt( m_lineno, m_lstart + 1 ) ) { if ( m_require_end ) { m_next_end.push( m_level ); m_num_semi = m_is_for ? 3 : 1; } else { m_num_semi = 0; } } m_pre_stmt.clear(); } } } void OPARI2_CParser::handle_preprocessor_continuation_line( void ) { m_pre_stmt.push_back( m_line ); /* check for multiline comments in preprocessor directives */ if ( !m_in_comment && m_line.find( "/*" ) != string::npos && !( m_line.find( "*/" ) != string::npos && m_line.find( "/*" ) < m_line.find( "*/" ) ) ) { m_in_comment = true; } else if ( m_in_comment && m_line.find( "*/" ) != string::npos ) { m_in_comment = false; } if ( m_line[ m_line.size() - 1 ] != '\\' && !m_in_comment ) { m_pre_cont_line = false; if ( process_prestmt( m_lineno - m_pre_stmt.size() + 1, m_lstart + 1 ) ) { if ( m_require_end ) { m_next_end.push( m_level ); m_num_semi = m_is_for ? 3 : 1; } else { m_num_semi = 0; } } m_pre_stmt.clear(); } } void OPARI2_CParser::handle_regular_line() { bool newline_printed = false; while ( m_pos < m_line.size() ) { newline_printed = false; if ( m_in_comment ) { // look for comment end if ( m_line[ m_pos ] == '*' && m_line[ m_pos + 1 ] == '/' ) { m_os << "*/"; m_in_comment = false; m_pos += 2; } else { m_os << m_line[ m_pos++ ]; } } else if ( m_line[ m_pos ] == '/' ) { m_pos++; if ( m_line[ m_pos ] == '/' ) { // c++ comments m_pos++; m_os << "//"; while ( m_pos < m_line.size() ) { m_os << m_line[ m_pos++ ]; } } else if ( m_line[ m_pos ] == '*' ) { // c comment start m_pos++; m_os << "/*"; m_in_comment = true; } else { m_os << '/'; } } else if ( m_in_string || m_line[ m_pos ] == '\"' ) { // character string constant if ( m_in_string ) { m_in_string = false; m_pos--; // to make sure current character gets reprocessed } else { m_os << "\""; } m_pos++; while ( m_line[ m_pos ] != '\"' ) { // handle C++11 multiline string, see https://en.cppreference.com/w/cpp/language/string_literal if ( m_pos == m_line.size() ) { m_in_string = true; break; } if ( m_line[ m_pos ] == '\\' ) { m_os << '\\'; m_pos++; if ( m_line[ m_pos ] == '\0' ) { m_in_string = true; break; } else if ( m_line[ m_pos ] == '\\' ) { if ( m_line[ m_pos + 1 ] == '\0' ) { m_os << '\\'; m_in_string = true; break; } } } m_os << m_line[ m_pos ]; m_pos++; } if ( !m_in_string ) { m_os << '\"'; } m_pos++; } else if ( m_line[ m_pos ] == '\'' ) { // character constant m_os << "\'"; do { m_pos++; if ( m_line[ m_pos ] == '\\' ) { m_os << '\\'; m_pos++; if ( m_line[ m_pos ] == '\'' ) { m_os << '\''; m_pos++; } } m_os << m_line[ m_pos ]; } while ( m_line[ m_pos ] != '\'' ); m_pos++; } else if ( ( m_options.lang & L_CXX ) && isdigit( m_line[ m_pos ] ) ) { // numeric literal, optional sign already processed handle_numeric_literal(); } else if ( isalpha( m_line[ m_pos ] ) || m_line[ m_pos ] == '_' ) { // identifier string::size_type startpos = m_pos; while ( m_pos < m_line.size() && ( isalnum( m_line[ m_pos ] ) || m_line[ m_pos ] == '_' ) ) { m_pos++; } string ident( m_line, startpos, m_pos - startpos ); /* Replace if valid runtime function */ ReplaceRuntimeAPI( ident, ident, m_current_file, L_C_OR_CXX ); m_os << ident; if ( ident == "for" && m_num_semi == 1 ) { m_num_semi = 3; } } else if ( m_line[ m_pos ] == '{' ) { // block open m_os << m_line[ m_pos++ ]; m_level++; m_num_semi = 0; } else if ( m_line[ m_pos ] == '}' ) { // block close m_os << m_line[ m_pos++ ]; m_level--; size_t next_char = m_line.find_first_not_of( " \t", m_pos ); if ( next_char != string::npos ) { newline_printed = handle_closed_block(); } else { m_block_closed = true; } } else if ( m_line[ m_pos ] == ';' ) { // statement end m_os << m_line[ m_pos++ ]; m_num_semi--; if ( m_num_semi == 0 ) { //newline_printed = handle_closed_block(); m_block_closed = true; } } else { m_os << m_line[ m_pos++ ]; } } if ( !newline_printed ) { m_os << '\n'; } } void OPARI2_CParser::handle_numeric_literal( void ) { const bool is_zero_prefixed = ( m_line[ m_pos ] == '0' ); m_os << m_line[ m_pos++ ]; if ( m_pos == m_line.size() ) { // EOL => single digit, we're done return; } bool is_hex = false; bool is_dec = false; if ( is_zero_prefixed && ( ( m_line[ m_pos ] == 'b' ) || ( m_line[ m_pos ] == 'B' ) ) ) { m_os << m_line[ m_pos++ ]; handle_binary_literal(); } else if ( is_zero_prefixed && ( ( m_line[ m_pos ] == 'x' ) || ( m_line[ m_pos ] == 'X' ) ) ) { is_hex = true; m_os << m_line[ m_pos++ ]; handle_hexadecimal_literal(); } else if ( isdigit( m_line[ m_pos ] ) ) { // We don't distinguish octal/decimal here, as it might be the // integer part of a floating-point literal is_dec = true; handle_decimal_literal(); } // Optional fractional part of floating-point literal if ( ( m_pos < m_line.size() ) && ( m_line[ m_pos ] == '.' ) ) { if ( is_dec ) { m_os << m_line[ m_pos++ ]; handle_decimal_literal(); } else if ( is_hex ) { m_os << m_line[ m_pos++ ]; handle_hexadecimal_literal(); } } // Exponent of floating-point literal if ( ( m_pos < m_line.size() ) && ( ( is_dec && ( ( m_line[ m_pos ] == 'e' ) || ( m_line[ m_pos ] == 'E' ) ) ) || ( is_hex && ( ( m_line[ m_pos ] == 'p' ) || ( m_line[ m_pos ] == 'P' ) ) ) ) ) { m_os << m_line[ m_pos++ ]; if ( ( m_pos < m_line.size() ) && ( ( m_line[ m_pos ] == '+' ) || ( m_line[ m_pos ] == '-' ) ) ) { m_os << m_line[ m_pos++ ]; } handle_decimal_literal(); } } void OPARI2_CParser::handle_binary_literal( void ) { while ( ( m_pos < m_line.size() ) && ( ( m_line[ m_pos ] == '0' ) || ( m_line[ m_pos ] == '1' ) || ( m_line[ m_pos ] == '\'' ) ) ) { m_os << m_line[ m_pos++ ]; } } void OPARI2_CParser::handle_decimal_literal( void ) { while ( ( m_pos < m_line.size() ) && ( isdigit( m_line[ m_pos ] ) || ( m_line[ m_pos ] == '\'' ) ) ) { m_os << m_line[ m_pos++ ]; } } void OPARI2_CParser::handle_hexadecimal_literal( void ) { while ( ( m_pos < m_line.size() ) && ( isxdigit( m_line[ m_pos ] ) || ( m_line[ m_pos ] == '\'' ) ) ) { m_os << m_line[ m_pos++ ]; } } bool OPARI2_CParser::get_next_line( void ) { bool success = ( bool )getline( m_is, m_line ); ++m_lineno; m_pos = 0; //std::cout << m_lineno << ": " << m_line << std::endl; if ( success ) { /* workaround for bogus getline implementations */ while ( m_line.size() == 1 && m_line[ 0 ] == '\0' ) { success = ( bool )getline( m_is, m_line ); ++m_lineno; } /* remove extra \r from Windows source files */ if ( m_line.size() && *( m_line.end() - 1 ) == '\r' ) { m_line.erase( m_line.end() - 1 ); } } return success; } /** Parse source file line by line, search for directives and the * related code blocks. Comments and strings are removed to avoid * finding keywords in comments. */ void OPARI2_CParser::process( void ) { while ( get_next_line() ) { string::size_type ls; if ( m_block_closed && !( ( ( m_line.size() - m_line.find_first_not_of( " \t" ) ) > 3 ) && ( m_line.find_first_not_of( " \t" ) != string::npos ) && m_line.substr( m_line.find_first_not_of( " \t" ), 4 ) == "else" ) ) { handle_closed_block(); m_block_closed = false; } /* start offload region if __declspec is found and continue to * parse the rest of the line as usual without the __declspec */ if ( !m_in_comment && ( ( ls = m_line.find_first_not_of( " \t" ) ) != string::npos ) && m_line.substr( ls, 10 ) == "__declspec" ) { m_pre_stmt.push_back( m_line ); vector directive_prefix( 1, "__declspec" ); OPARI2_Directive* d = NewDirective( m_pre_stmt, directive_prefix, m_options.lang, m_current_file, m_lineno ); assert( d ); ProcessDirective( d, m_os ); m_pre_stmt.clear(); m_next_end.push( m_level ); int cl_brackets = 0; string::size_type pos = 0; while ( cl_brackets < 2 && pos < m_line.size() ) { if ( m_line[ pos ] == ')' ) { cl_brackets++; } m_os << m_line[ pos ]; m_line[ pos ] = ' '; pos++; } m_os << "\n"; } if ( m_pre_cont_line ) { handle_preprocessor_continuation_line(); } else if ( !m_in_comment && m_options.preprocessed_file && ( m_line == "___POMP2_INCLUDE___" || m_line == "___POMP2_INCLUDE___ " ) ) // Studio compiler appends a blank during preprocessing { m_os << "#include \"" << m_options.incfile << "\"" << "\n"; } else if ( !m_in_comment && ( ( m_lstart = m_line.find_first_not_of( " \t" ) ) != string::npos ) && m_line[ m_lstart ] == '#' ) { handle_preprocessor_directive(); } else { handle_regular_line(); } } if ( m_block_closed ) { handle_closed_block(); m_block_closed = false; } // check end position stack if ( m_next_end.top() != -1 ) { cerr << "ERROR: could not determine end of OpenMP construct (braces mismatch?)\n"; PrintDirectiveStackTop(); cleanup_and_exit(); } } opari2-2.0.9/src/opari/PaxHeaders/opari2_parser_c.h0000644000000000000000000000013114770056734017134 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 29 ctime=1742757367.34736737 opari2-2.0.9/src/opari/opari2_parser_c.h0000644000175100001440000000427614770056734017476 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014, 2021, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_parser_c.h * * @brief */ #ifndef OPARI2_PARSER_C_H #define OPARI2_PARSER_C_H class OPARI2_CParser { public: OPARI2_CParser( OPARI2_Option_t& options ); ~OPARI2_CParser() { }; private: string m_line; string::size_type m_pos; bool m_in_comment; bool m_in_string; bool m_pre_cont_line; bool m_require_end; bool m_is_for; bool m_block_closed; int m_lineno; int m_level; int m_num_semi; string::size_type m_lstart; vector m_pre_stmt; vector m_end_stmt; stack m_next_end; string m_current_file; string m_infile; OPARI2_Option_t& m_options; ofstream& m_os; ifstream& m_is; string find_next_word( unsigned& pline, string::size_type& ppos ); /** @brief Check whether the current line is an extern function declaration */ bool is_extern_decl( void ); /** * @brief Instrument pragma directives. * * Preprocessor lines are passed to this function and checked, whether they are * pragmas. */ bool process_prestmt( int ln, string::size_type ppos ); bool handle_closed_block(); void handle_preprocessor_directive( void ); void handle_preprocessor_continuation_line( void ); void handle_regular_line(); void handle_numeric_literal(); void handle_binary_literal(); void handle_decimal_literal(); void handle_hexadecimal_literal(); bool get_next_line( void ); public: /** @brief Instrument directives / runtime APIs in C/C++ source file. */ void process( void ); }; #endif //__PROCESS_C_H opari2-2.0.9/src/opari/PaxHeaders/opari2.h0000644000000000000000000000013114770056734015256 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 29 ctime=1742757367.34736737 opari2-2.0.9/src/opari/opari2.h0000644000175100001440000001144514770056734015614 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2.h * * @brief This file contains some definitions that are used * throughout OAPRI2 */ #ifndef OPARI2_H #define OPARI2_H #include using std::string; #include using std::ifstream; using std::ofstream; #include #include using std::map; #include using std::vector; #include using std::pair; /** * @brief Convenience type definition */ typedef map OPARI2_StrStr_map_t; /** * @brief Convenience type definition */ typedef map > OPARI2_StrVStr_map_t; /** * @brief Convenience type definition */ typedef vector > OPARI2_StrBool_pairs_t; /** * @brief Convenience type definition */ typedef vector > OPARI2_StrStr_pairs_t; /** * @brief Bitfield for supported languages and dialects. */ typedef enum { L_NA = 0x00, L_F77 = 0x01, L_F90 = 0x02, L_FORTRAN = 0x03, L_C = 0x04, L_CXX = 0x08, L_C_OR_CXX = 0x0C } OPARI2_Language_t; /** * @brief Fortran specific differentiation between free-form and * fixed-form Fortran format. */ typedef enum { F_NA = 0x00, F_FIX = 0x01, F_FREE = 0x02 } OPARI2_Format_t; /** * @brief All necessary information to process a file. */ typedef struct { /** Language of the input file */ OPARI2_Language_t lang; /** Fortran format of the input file */ OPARI2_Format_t form; /** Specifies whether the source code information should be kept up-to-date with line directives*/ bool keep_src_info; /** Specifies whether the input file was already partially preprocessed */ bool preprocessed_file; /** Name of the input file */ string infile; /** Name of the output file */ string outfile; /** Name of the generated include file (without path) */ string incfile_nopath; /** Name of the generated include file (including path) */ string incfile; /** Input file stream object */ ifstream is; /** Output file stream object */ ofstream os; } OPARI2_Option_t; /** * @brief Definition of directive group. */ typedef enum OPARI2_ParadigmType { /** Unknown paradigm */ OPARI2_PT_NONE = 0, /** OpenMP */ OPARI2_PT_OMP, /** POMP user instrumentation */ OPARI2_PT_POMP, /** OpenACC */ OPARI2_PT_OPENACC, /** Intel offload model */ OPARI2_PT_OFFLOAD, /** Transactional memory / speculative execution */ OPARI2_PT_TMSE } OPARI2_ParadigmType_t; /** * @brief Definition of error codes. */ typedef enum OPARI2_ErrorCode { OPARI2_NO_ERROR = 0, /** No message was printed when the error occurred */ OPARI2_ERROR_NO_MESSAGE, /** A message was printed directly when the error occurred */ OPARI2_ERROR_WITH_MESSAGE } OPARI2_ErrorCode; /** * @brief Definition of null group * * Currently the max number of groups for each paradigm is 32. * This limitation can be removed if using macro definion instead of enum. * Note a group is identified by both the group number and the paradigm type. */ #define G_NONE 0x00000000 //extern OPARI2_Option_t opt; /** * @brief This function can be called anywhere upon an error. * * When this function is called, the output file is deleted and the * program is exited. */ void cleanup_and_exit( void ); #endif opari2-2.0.9/src/opari/PaxHeaders/opari2.cc0000644000000000000000000000013214770056734015415 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.343367395 opari2-2.0.9/src/opari/opari2.cc0000644000175100001440000005302414770056734015751 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2015, 2025, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2.cc * * @brief This File containes the opari main function. It is used to * handle input arguments and open input and output * files. Afterwards the C or Fortran parsers are used, * depending on the file type or provided arguments. */ #include #include using std::ifstream; using std::ofstream; #include using std::stringstream; #include using std::cout; using std::cerr; #include using std::sprintf; using std::remove; #include using std::string; using std::strcmp; using std::strrchr; using std::strncpy; using std::strcat; using std::strlen; #include using std::exit; #include #include #include #include #include #include #include "opari2.h" #include "opari2_directive_manager.h" #include "openmp/opari2_directive_openmp.h" #include "opari2_parser_c.h" #include "opari2_parser_f.h" #define DEPRECATED_ON /* cmd line options */ OPARI2_Option_t opt; void print_usage_information( char* prog, std::ostream& output ) { std::string usage = #include "opari2_usage.h" ; output << prog << "\n\n" << usage << std::endl; } void cleanup_and_exit( void ) { if ( !opt.outfile.empty() ) { remove( opt.outfile.c_str() ); } exit( 1 ); } void print_deprecated_msg( const string old_form, const string new_form ) { #ifdef DEPRECATED_ON cerr << "Warning: Option \"" << old_form << "\" is deprecated.\n\ Please use \"" << new_form << "\" for future compatibility.\n"; #endif } /** * @brief Disable directive entry in the directive_table. * * Currently supported option: * --disable=xx,xx,... * Here xx can possibly be an openmp/pomp directive name, openmp/pomp * group name, or a paradigm type name. * * Not supported anymore: * -disable xx,xx,... * * Current --help output (27.03.2014): * [--disable=paradigm[:directive|group[:inner],...][+paradigm...] * [OPTIONAL] Disable the instrumentation of whole paradigms, or * specific directives or groups of directives of a paradigm. * Furthermore it gives the possibility to suppress the insertion of * instrumentation functions inside code regions, i.e. only the * surrounding instrumentation is inserted. * */ bool set_disabled( const string& constructs ) { typedef std::pair dir_and_inner_t; char* str = strdup( constructs.c_str() ); std::vector paradigms; char* paradigm = strtok( str, "+" ); while ( paradigm != NULL ) { paradigms.push_back( paradigm ); paradigm = strtok( NULL, "+" ); } for ( vector::iterator it = paradigms.begin(); it != paradigms.end(); ++it ) { paradigm = strtok( *it, ",:" ); dir_and_inner_t directive; std::vector directives; directive.first = strtok( NULL, "," ); directive.second = false; while ( directive.first != NULL ) { directives.push_back( directive ); directive.second = false; directive.first = strtok( NULL, "," ); } for ( vector::iterator it = directives.begin(); it != directives.end(); ++it ) { if ( strchr( it->first, ':' ) ) { it->first = strtok( it->first, ":" ); char* inner = strtok( NULL, ":" ); if ( strcmp( inner, "inner" ) == 0 ) { it->second = true; } else { cerr << "Error, unknown identifier " << inner << std::endl; free( str ); return false; } } } if ( directives.empty() ) { if ( !DisableParadigmDirectiveOrGroup( paradigm, "", false ) ) { free( str ); return false; } } else { for ( vector::iterator it = directives.begin(); it != directives.end(); ++it ) { if ( !DisableParadigmDirectiveOrGroup( paradigm, it->first, it->second ) ) { free( str ); return false; } } } } free( str ); return true; } /** * @brief Parse and handle cmd line options. * * First hanlde global options, * then handle paradigm-specific options. */ void process_cmd_line( int argc, char* argv[] ) { int a = 1; OPARI2_ErrorCode err_flag = OPARI2_NO_ERROR; const char* ptr = NULL; opt.lang = L_NA; opt.form = F_NA; opt.keep_src_info = true; opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); /* parse global options */ while ( a < argc && argv[ a ][ 0 ] == '-' ) { if ( strncmp( argv[ a ], "--omp", 5 ) == 0 ) { err_flag = OPARI2_DirectiveOpenmp::ProcessOption( argv[ a ] ); if ( err_flag ) { cerr << "ERROR: unknown option " << argv[ a ] << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else if ( strcmp( argv[ a ], "--f77" ) == 0 ) { opt.lang = L_F77; } else if ( strcmp( argv[ a ], "--f90" ) == 0 ) { opt.lang = L_F90; } else if ( strcmp( argv[ a ], "--c++" ) == 0 ) { opt.lang = L_CXX; } else if ( strcmp( argv[ a ], "--c" ) == 0 ) { opt.lang = L_C; } else if ( strcmp( argv[ a ], "--free-form" ) == 0 ) { opt.form = F_FREE; } else if ( strcmp( argv[ a ], "--fix-form" ) == 0 ) { opt.form = F_FIX; } else if ( strcmp( argv[ a ], "--version" ) == 0 ) { std::cout << "opari2 version " << PACKAGE_VERSION << std::endl; } else if ( strcmp( argv[ a ], "--help" ) == 0 ) { print_usage_information( argv[ 0 ], std::cout ); exit( 0 ); } else if ( strcmp( argv[ a ], "--nosrc" ) == 0 ) { opt.keep_src_info = false; } else if ( strcmp( argv[ a ], "--preprocessed" ) == 0 ) { opt.preprocessed_file = true; } /* handle "--disable=" */ else if ( strncmp( argv[ a ], "--disable", 9 ) == 0 ) { ptr = strchr( argv[ a ], '=' ); if ( ptr ) { ptr++; if ( !set_disabled( ptr ) ) { err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else { err_flag = OPARI2_ERROR_WITH_MESSAGE; cerr << "ERROR: missing value for option --disable\n"; } } /* handle deprecated options */ else if ( strcmp( argv[ a ], "--tpd" ) == 0 ) { print_deprecated_msg( "--tpd", "--omp-tpd" ); omp_opt->copytpd = true; #if HAVE( PLATFORM_K ) || HAVE( PLATFORM_FX10 ) || HAVE( PLATFORM_FX100 ) cerr << "WARNING: option --tpd not supported on Fujitsu systems.\n"; #endif } else if ( strncmp( argv[ a ], "--tpd-mangling=", 15 ) == 0 ) { print_deprecated_msg( "--tpd-mangling=", "--omp-tpd-mangling=" ); char* tpd_arg = strchr( argv[ a ], '=' ); if ( tpd_arg != NULL ) { tpd_arg++; if ( strcmp( tpd_arg, "gnu" ) == 0 || strcmp( tpd_arg, "sun" ) == 0 || strcmp( tpd_arg, "intel" ) == 0 || strcmp( tpd_arg, "pgi" ) == 0 || strcmp( tpd_arg, "cray" ) == 0 ) { omp_opt->pomp_tpd = "pomp_tpd_"; omp_opt->tpd_in_extern_block = false; } else if ( strcmp( tpd_arg, "ibm" ) == 0 ) { omp_opt->pomp_tpd = "pomp_tpd"; omp_opt->tpd_in_extern_block = true; } else { cerr << "ERROR: unknown option for --tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else { cerr << "ERROR: missing value for option --tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else if ( strncmp( argv[ a ], "--task=", 7 ) == 0 ) { print_deprecated_msg( "--task=", "--omp-task=" ); char* token = strtok( argv[ a ], "=" ); token = strtok( NULL, "," ); while ( token != NULL ) { if ( strcmp( token, "abort" ) == 0 ) { omp_opt->task_abort = true; } else if ( strcmp( token, "warn" ) == 0 ) { omp_opt->task_warn = true; } else if ( strcmp( token, "remove" ) == 0 ) { omp_opt->task_remove = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --task\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } token = strtok( NULL, "," ); } } else if ( strncmp( argv[ a ], "--untied=", 9 ) == 0 ) { print_deprecated_msg( "--untied=", "--omp-task-untied=" ); char* token = strtok( argv[ a ], "=" ); token = strtok( NULL, "," ); do { if ( strcmp( token, "abort" ) == 0 ) { omp_opt->untied_abort = true; } else if ( strcmp( token, "no-warn" ) == 0 ) { omp_opt->untied_nowarn = true; } else if ( strcmp( token, "keep" ) == 0 ) { omp_opt->untied_keep = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --untied\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } token = strtok( NULL, "," ); } while ( token != NULL ); } else if ( strcmp( argv[ a ], "-disable" ) == 0 ) { cerr << "ERROR: -disable not supported by this version of OPARI2. " << "Please use --disable=paradigm[:directive|group[:inner],...][+paradigm...]. " << "Use opari2 --help or refer to the documentation for more details." << std::endl; err_flag = OPARI2_ERROR_WITH_MESSAGE; } else if ( strcmp( argv[ a ], "-f77" ) == 0 ) { print_deprecated_msg( "-f77", "--f77" ); opt.lang = L_F77; } else if ( strcmp( argv[ a ], "-f90" ) == 0 ) { print_deprecated_msg( "-f90", "--f90" ); opt.lang = L_F90; } else if ( strcmp( argv[ a ], "-c++" ) == 0 ) { print_deprecated_msg( "-c++", "--c++" ); opt.lang = L_CXX; } else if ( strcmp( argv[ a ], "-c" ) == 0 ) { print_deprecated_msg( "-c", "--c" ); opt.lang = L_C; } else if ( strcmp( argv[ a ], "-nosrc" ) == 0 ) { print_deprecated_msg( "-nosrc", "--nosrc" ); opt.keep_src_info = false; } else if ( strcmp( argv[ a ], "-rcfile" ) == 0 ) { cerr << "WARNING: Option \"-rcfile\" is deprecated and ignored.\n"; } else if ( strcmp( argv[ a ], "-table" ) == 0 ) { cerr << "WARNING: Option \"-table\" is deprecated and ignored.\n"; } /* End of deprecated options */ ++a; } /* parse file arguments, prepare input/output stream if specified */ switch ( argc - a ) { case 2: if ( strcmp( argv[ a + 1 ], "-" ) == 0 ) { opt.os.std::ostream::rdbuf( cout.rdbuf() ); } else { opt.os.open( argv[ a + 1 ] ); if ( !opt.os ) { cerr << "ERROR: cannot open output file " << argv[ a + 1 ] << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } opt.outfile = string( argv[ a + 1 ] ); } /*NOBREAK*/ case 1: if ( *argv[ a ] != '/' ) { int pathlength = 10; char* tmp_inf = new char[ pathlength ]; while ( !getcwd( tmp_inf, pathlength ) ) { pathlength += 10; delete[] tmp_inf; tmp_inf = new char[ pathlength ]; } pathlength += strlen( argv[ a ] ) + 1; delete[] tmp_inf; tmp_inf = new char[ pathlength ]; if ( !getcwd( tmp_inf, pathlength ) ) { cerr << "ERROR: cannot determine path of input file " << tmp_inf << "\n"; exit( -1 ); } tmp_inf = strcat( tmp_inf, "/" ); tmp_inf = strcat( tmp_inf, argv[ a ] ); opt.infile = string( tmp_inf ); delete[] tmp_inf; } else { opt.infile = string( argv[ a ] ); } opt.is.open( opt.infile.c_str() ); if ( !opt.is ) { cerr << "ERROR: cannot open input file " << opt.infile << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } break; default: err_flag = OPARI2_ERROR_NO_MESSAGE; break; } /* determine language and format by filename if not specified */ if ( !err_flag && !opt.infile.empty() && opt.lang == L_NA ) { size_t pos = opt.infile.find_last_of( '.' ); if ( pos < opt.infile.length() + 1 && opt.infile[ pos + 1 ] ) { switch ( opt.infile[ pos + 1 ] ) { case 'f': case 'F': opt.lang = opt.infile[ pos + 2 ] == '9' ? L_F90 : L_F77; break; case 'c': /*Files *.CUF and *.cuf are CUDA Fortran files*/ if ( opt.infile[ pos + 2 ] == 'u' && opt.infile[ pos + 3 ] == 'f' ) { opt.lang = L_F90; break; } case 'C': if ( opt.infile[ pos + 2 ] == 'U' && opt.infile[ pos + 3 ] == 'F' ) { opt.lang = L_F90; break; } opt.lang = opt.infile[ pos + 2 ] ? L_CXX : L_C; break; } } } if ( !err_flag && opt.infile.empty() && opt.lang == L_NA ) { cerr << "ERROR: cannot determine input file language\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } /* if no format is specified, default is free format for f90 and fix form for f77 */ if ( ( opt.form == F_NA ) && ( opt.lang & L_FORTRAN ) ) { if ( opt.lang & L_F77 ) { opt.form = F_FIX; } else { opt.form = F_FREE; } } /* generate output file name if necessary */ if ( !err_flag && opt.outfile.empty() ) { size_t pos = opt.infile.find_last_of( '.' ); if ( pos != string::npos ) { opt.outfile = opt.infile; opt.outfile.replace( pos, 1, ".mod." ); if ( opt.keep_src_info && ( opt.lang & L_FORTRAN ) ) { if ( opt.outfile.find( "cuf", pos ) == pos + 5 || opt.outfile.find( "CUF", pos ) == pos + 5 ) { opt.outfile[ pos + 5 ] = 'C'; opt.outfile[ pos + 6 ] = 'U'; opt.outfile[ pos + 7 ] = 'F'; } else { opt.outfile[ pos + 5 ] = 'F'; } } opt.os.open( opt.outfile.c_str() ); if ( !opt.os ) { cerr << "ERROR: cannot open output file " << opt.outfile << "\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } // opt.os << "\n"; } else { cerr << "ERROR: cannot generate output file name\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } /* print usage and die on error */ if ( err_flag ) { if ( err_flag == OPARI2_ERROR_NO_MESSAGE ) { print_usage_information( argv[ 0 ], std::cerr ); } exit( 1 ); } return; } void misc_init() { struct stat status; timeval compiletime; //long long int id[ 3 ]; uint64_t id[ 3 ]; stringstream id_str; int rest = 0; /* query inode number of the infile and timestamp as unique attribute */ int retval = stat( opt.infile.c_str(), &status ); // initialize inod_compiletime_id assert( retval == 0 ); gettimeofday( &compiletime, NULL ); //id[ 0 ] = ( long long int )status.st_ino; id[ 0 ] = static_cast< uint64_t > ( status.st_ino ); id[ 1 ] = static_cast< uint64_t > ( compiletime.tv_sec ); id[ 2 ] = static_cast< uint64_t > ( compiletime.tv_usec ); for ( int i = 0; i < 3; i++ ) { while ( id[ i ] > 36 || ( i > 1 && id[ i ] > 0 ) ) { rest = id[ i ] % 36; id[ i ] -= rest; id[ i ] /= 36; if ( rest < 10 ) { id_str << ( char )( rest + 48 ); } else { id_str << ( char )( rest + 87 ); } } if ( i < 2 ) { id[ i + 1 ] += id[ i ]; } } // generate opari2 include file name // only need base filename without path for include statement // in Fortran files and if an output file without dir is used size_t sep_in = opt.infile.find_last_of( '/' ); opt.incfile_nopath = string( opt.infile.substr( sep_in + 1 ) + ".opari.inc" ); size_t sep_out = opt.outfile.find_last_of( '/' ); if ( sep_out == string::npos ) { opt.incfile = ""; } else { opt.incfile = opt.outfile.substr( 0, sep_out + 1 ); } opt.incfile += opt.incfile_nopath; OPARI2_Directive::SetOptions( opt.lang, opt.form, opt.keep_src_info, opt.preprocessed_file, id_str.str() ); return; } /** * @brief Main function. * * Initialize directive and API table, handle command line options, * open files and call appropriate process function. */ int main( int argc, char* argv[] ) { process_cmd_line( argc, argv ); misc_init(); /* instrument source file */ if ( opt.lang & L_FORTRAN ) { /* in Fortran no Underscore is needed */ OPARI2_DirectiveOpenmp::SetOptPomptpd( "pomp_tpd" ); OPARI2_FortranParser parser( opt ); parser.process(); } else { if ( !opt.preprocessed_file ) { // const char* basename = strrchr( opt.incfile, '/' ); // basename = basename ? ( basename + 1 ) : opt.incfile; opt.os << "#include \"" << opt.incfile_nopath << "\"" << "\n"; if ( opt.keep_src_info ) { opt.os << "#line 1 \"" << opt.infile << "\"" << "\n"; } } OPARI2_CParser parser( opt ); parser.process(); } /* generate *.opari.inc ( by directive_manager ) */ Finalize( opt ); return 0; } opari2-2.0.9/src/opari/PaxHeaders/common.h0000644000000000000000000000013214770056734015353 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.343367395 opari2-2.0.9/src/opari/common.h0000644000175100001440000000353214770056734015706 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file common.h * @brief Functions to handle parallel regions. Including the creation * and initialization of region handles. */ #ifndef COMMON_H #define COMMON_H #include const std::string region_id_prefix( "opari2_region_" ); const std::string string_id_prefix( "opari2_ctc_" ); #endif /* COMMON_H */ opari2-2.0.9/src/opari/PaxHeaders/opari2_config_tool_frontend.h.in0000644000000000000000000000013114770056734022144 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 29 ctime=1742757367.31136759 opari2-2.0.9/src/opari/opari2_config_tool_frontend.h.in0000644000175100001440000000135114770056734022475 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2018, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_config_tool_frontend.h.in * * @brief */ /* @configure_input@ */ #define NM "@NM@" #define AWK "@AWK@" #define SCRIPT "@LIBEXECDIR@/pomp2-parse-init-regions.awk" #define EGREP "@EGREP@" #define VERSION "@PACKAGE_VERSION@" #define POMP2_API_VERSION "@LIBRARY_INTERFACE_VERSION@" #define CFLAGS "-I@INCLUDEDIR@" opari2-2.0.9/src/opari/PaxHeaders/Makefile.inc.am0000644000000000000000000000013214770056734016516 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.271367834 opari2-2.0.9/src/opari/Makefile.inc.am0000644000175100001440000000643414770056734017055 0ustar00builderusers## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2013, 2014 ## Forschungszentrum Juelich GmbH, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## ## ## @internal ## ## @file Makefile.inc.am ## ## @brief ## ## -*- mode: makefile -*- bin_PROGRAMS += opari2 opari2-config opari2_SOURCES = \ $(SRC_ROOT)src/opari/common.h \ $(SRC_ROOT)src/opari/opari2.cc \ $(SRC_ROOT)src/opari/opari2.h \ $(SRC_ROOT)src/opari/opari2_parser_c.h \ $(SRC_ROOT)src/opari/opari2_parser_c.cc \ $(SRC_ROOT)src/opari/opari2_parser_f.h \ $(SRC_ROOT)src/opari/opari2_parser_f.cc \ $(SRC_ROOT)src/opari/opari2_directive_manager.cc \ $(SRC_ROOT)src/opari/opari2_directive_manager.h \ $(SRC_ROOT)src/opari/opari2_directive_definition.h \ $(SRC_ROOT)src/opari/opari2_directive_entry.h \ $(SRC_ROOT)src/opari/opari2_directive.cc \ $(SRC_ROOT)src/opari/opari2_directive.h \ $(SRC_ROOT)src/opari/openmp/opari2_directive_entry_openmp.h \ $(SRC_ROOT)src/opari/openmp/opari2_directive_openmp.h \ $(SRC_ROOT)src/opari/openmp/opari2_directive_openmp.cc \ $(SRC_ROOT)src/opari/openmp/opari2_omp_handler.h \ $(SRC_ROOT)src/opari/openmp/opari2_omp_handler.cc \ $(SRC_ROOT)src/opari/pomp/opari2_directive_entry_pomp.h \ $(SRC_ROOT)src/opari/pomp/opari2_directive_pomp.h \ $(SRC_ROOT)src/opari/pomp/opari2_directive_pomp.cc \ $(SRC_ROOT)src/opari/pomp/opari2_pomp_handler.h \ $(SRC_ROOT)src/opari/pomp/opari2_pomp_handler.cc \ $(SRC_ROOT)src/opari/offload/opari2_directive_entry_offload.h \ $(SRC_ROOT)src/opari/offload/opari2_directive_offload.h \ $(SRC_ROOT)src/opari/offload/opari2_directive_offload.cc \ $(SRC_ROOT)src/opari/offload/opari2_offload_handler.cc \ $(SRC_ROOT)src/opari/offload/opari2_offload_handler.h \ opari2_usage.h opari2_CPPFLAGS = $(AM_CPPFLAGS) -DPACKAGE_VERSION="\"@PACKAGE_VERSION@\"" -I$(INC_ROOT)src/opari opari2includedir = $(includedir)/opari2 opari2include_HEADERS = $(PUBLIC_INC_SRC)pomp2_lib.h opari2include_HEADERS += $(PUBLIC_INC_SRC)pomp2_user_lib.h opari2_config_SOURCES = $(SRC_ROOT)src/opari/opari2_config.cc \ $(SRC_ROOT)src/opari/opari2_config.h \ opari2-config_usage.h BUILT_SOURCES += opari2_usage.h opari2-config_usage.h opari2_usage.h: $(INC_ROOT)doc/doxygen-user/opari2_usage.dox.in $(AM_V_GEN)$(AWK) '{print "\"" $$0 "\\n\""}' $(INC_ROOT)doc/doxygen-user/opari2_usage.dox.in > opari2_usage.h opari2-config_usage.h: $(INC_ROOT)doc/doxygen-user/opari2-config_usage.dox.in $(AM_V_GEN)$(AWK) '{print "\"" $$0 "\\n\""}' $(INC_ROOT)doc/doxygen-user/opari2-config_usage.dox.in > opari2-config_usage.h CLEANFILES += opari2_usage.h opari2-config_usage.h opari2-2.0.9/src/opari/PaxHeaders/pomp0000644000000000000000000000012614770056767014621 xustar0028 mtime=1742757367.3753672 30 atime=1742757371.935339406 28 ctime=1742757367.3753672 opari2-2.0.9/src/opari/pomp/0000755000175100001440000000000014770056767015223 5ustar00builderusersopari2-2.0.9/src/opari/pomp/PaxHeaders/opari2_pomp_handler.cc0000644000000000000000000000013014770056734021116 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 28 ctime=1742757367.3753672 opari2-2.0.9/src/opari/pomp/opari2_pomp_handler.cc0000644000175100001440000001421714770056734021455 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_pomp_handler.cc * * @brief This file contains all handler funtions to instrument and print POMP directives. */ #include #include using std::ostream; using std::cerr; #include "common.h" #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_pomp.h" #include "opari2_directive_manager.h" extern OPARI2_Option_t opt; OPARI2_DirectivePomp* cast2pomp( OPARI2_Directive* d_base ) { OPARI2_DirectivePomp* d = dynamic_cast( d_base ); if ( d == NULL ) { cerr << "INTERNAL ERROR: OPARI2_DirectivePomp* expected. Please contact user support.\n"; cleanup_and_exit(); } return d; } void h_pomp_inst( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); string& name = d->GetName(); char c1 = toupper( name.substr( 4 )[ 0 ] ); if ( opt.lang & L_FORTRAN ) { os << " call POMP2_" << c1 << name.substr( 5 ) << "()\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_" << c1 << name.substr( 5 ) << "();\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst init". */ void h_pomp_instinit( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp inst finalize". */ void h_pomp_instfinalize( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp inst on". */ void h_pomp_inston( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp inst off". */ void h_pomp_instoff( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); h_pomp_inst( d, os ); } /** * @brief handling "pomp instrument" . */ void h_pomp_instrument( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); EnableInstrumentation( D_USER ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp noinstrument" . */ void h_pomp_noinstrument( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); DisableInstrumentation( D_USER ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst begin" . */ void h_pomp_instbegin( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); d->EnterRegion(); int id = d->GetID(); d->SetName( "userRegion" ); d->FindUserRegionName(); if ( opt.lang & L_FORTRAN ) { os << " call POMP2_Begin(" << region_id_prefix << id; os << ", " << d->GetCTCStringVariable() << ")\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_Begin(&" << region_id_prefix << id; os << ", " << d->GetCTCStringVariable() << ");\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst altend" . */ void h_pomp_instaltend( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); OPARI2_DirectivePomp* d_top = cast2pomp( DirectiveStackTop( d ) ); d->FindUserRegionName(); string& subname = d->GetUserRegionName(); string& subname_top = d_top->GetUserRegionName(); if ( subname != subname_top ) { string& filename = d->GetFilename(); cerr << filename << ":" << d_top->GetLineno() << ": ERROR: missing inst end(" << subname_top << ") pragma/directive\n"; cerr << filename << ":" << d->GetLineno() << ": ERROR: non-matching inst end(" << subname << ") pragma/directive\n"; cleanup_and_exit(); } if ( opt.lang & L_FORTRAN ) { os << " call POMP2_End(" << region_id_prefix << d_top->GetID() << ")\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_End(&" << region_id_prefix << d_top->GetID() << ");\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } /** * @brief handling "pomp inst end" . */ void h_pomp_instend( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectivePomp* d = cast2pomp( d_base ); // change the directive/region name explicity. //d->SetRegionName( "endregion" ); d->SetName( "enduserRegion" ); d->FindUserRegionName(); OPARI2_DirectivePomp* d_top = cast2pomp( DirectiveStackTop( d ) ); string& subname = d->GetUserRegionName(); string& subname_top = d_top->GetUserRegionName(); int id = d->ExitRegion( false ); if ( subname != subname_top ) { string& filename = d->GetFilename(); cerr << filename << ":" << d_top->GetLineno() << ": ERROR: missing inst end(" << subname_top << ") pragma/directive\n"; cerr << filename << ":" << d->GetLineno() << ": ERROR: non-matching inst end(" << subname << ") pragma/directive\n"; cleanup_and_exit(); } if ( opt.lang & L_FORTRAN ) { os << " call POMP2_End(" << region_id_prefix << id << ")\n"; } else if ( opt.lang & L_C_OR_CXX ) { os << "POMP2_End(&" << region_id_prefix << id << ");\n"; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } opari2-2.0.9/src/opari/pomp/PaxHeaders/opari2_pomp_handler.h0000644000000000000000000000013014770056734020760 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 28 ctime=1742757367.3753672 opari2-2.0.9/src/opari/pomp/opari2_pomp_handler.h0000644000175100001440000000270414770056734021315 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_pomp_handler.h * * @brief */ #ifndef OPARI2_POMP_HANDLER_H #define OPARI2_POMP_HANDLER_H #include using std::ostream; void h_pomp_inst( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instinit( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instfinalize( OPARI2_Directive* ptr, ostream& os ); void h_pomp_inston( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instoff( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instrument( OPARI2_Directive* ptr, ostream& os ); void h_pomp_noinstrument( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instbegin( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instaltend( OPARI2_Directive* ptr, ostream& os ); void h_pomp_instend( OPARI2_Directive* ptr, ostream& os ); void h_end_pomp_instbegin( OPARI2_Directive* ptr, ostream& os ); #endif opari2-2.0.9/src/opari/pomp/PaxHeaders/opari2_directive_pomp.cc0000644000000000000000000000013014770056734021457 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 28 ctime=1742757367.3753672 opari2-2.0.9/src/opari/pomp/opari2_directive_pomp.cc0000644000175100001440000000761714770056734022024 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_pomp.cc * * @brief Methods of POMP base class. */ #include #include using std::string; #include using std::ostream; #include #include "common.h" #include "opari2_directive_pomp.h" #include "opari2_directive_entry_pomp.h" /** This seems overkill in this case, but it should be consistent with the other paradigms*/ typedef struct { uint32_t mEnum; const string mGroupName; } OPARI2_POMPGroupStringMapEntry; OPARI2_POMPGroupStringMapEntry pompGroupStringMap[] = { { G_POMP_REGION, "userRegion" }, { G_POMP_ALL, "pomp" }, }; uint32_t OPARI2_DirectivePomp::String2Group( const string name ) { size_t n = sizeof( pompGroupStringMap ) / sizeof( OPARI2_POMPGroupStringMapEntry ); for ( size_t i = 0; i < n; ++i ) { if ( pompGroupStringMap[ i ].mGroupName.compare( name ) == 0 ) { return pompGroupStringMap[ i ].mEnum; } } return 0; } void OPARI2_DirectivePomp::IncrementRegionCounter( void ) { ++s_num_regions; } /** * @brief Generate CTC string for POMP region. */ string OPARI2_DirectivePomp::generate_ctc_string( OPARI2_Format_t form ) { stringstream s; if ( m_name == "userRegion" ) { s << "userRegionName=" << m_user_region_name << "*"; } return generate_ctc_string_common( form, s.str() ); } void OPARI2_DirectivePomp::GenerateHeader( ostream& os ) { if ( s_lang & L_C_OR_CXX ) { if ( !s_preprocessed_file ) { os << "#include \n\n"; } } } void OPARI2_DirectivePomp::GenerateDescr( ostream& os ) { OPARI2_Directive::generate_descr_common( os ); if ( s_lang & L_FORTRAN ) { s_init_handle_calls << " call " << s_paradigm_prefix << "_Assign_handle( " << region_id_prefix << m_id << ","; if ( s_format == F_FIX ) { s_init_handle_calls << "\n & "; } else { s_init_handle_calls << " &\n "; } s_init_handle_calls << m_ctc_string_variable << " )\n"; } else if ( s_lang & L_C_OR_CXX ) { s_init_handle_calls << " " << s_paradigm_prefix << "_Assign_handle( " << "&" << region_id_prefix << m_id << ", " << m_ctc_string_variable << " );\n"; } } /** * @brief Generate a function to allow initialization of all region handles for Fortran. * * These functions need to be called from POMP2_Init_regions. */ void OPARI2_DirectivePomp::GenerateInitHandleCalls( ostream& os, const string incfile ) { OPARI2_Directive::GenerateInitHandleCalls( os, incfile, s_paradigm_prefix, s_init_handle_calls, s_num_regions ); return; } void OPARI2_DirectivePomp::FindName( void ) { find_name_common(); if ( m_name == "inst" ) { m_name += find_next_word(); } } void OPARI2_DirectivePomp::SetName( string name_str ) { m_name = name_str; } void OPARI2_DirectivePomp::FindUserRegionName( void ) { string user_region_name = find_next_word(); if ( user_region_name == "(" ) { m_user_region_name = find_next_word(); } } string& OPARI2_DirectivePomp::GetUserRegionName( void ) { return m_user_region_name; } stringstream OPARI2_DirectivePomp::s_init_handle_calls; int OPARI2_DirectivePomp:: s_num_regions = 0; string OPARI2_DirectivePomp:: s_paradigm_prefix = "POMP2_USER"; opari2-2.0.9/src/opari/pomp/PaxHeaders/opari2_directive_pomp.h0000644000000000000000000000013214770056734021323 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.371367223 opari2-2.0.9/src/opari/pomp/opari2_directive_pomp.h0000644000175100001440000000427114770056734021657 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_pomp.h * * @brief Class definitions for POMP directives. */ #ifndef OPARI2_DIRECTIVE_POMP_H #define OPARI2_DIRECTIVE_POMP_H #include using std::string; #include using std::ostream; #include using std::vector; #include "opari2.h" #include "opari2_directive.h" /** @brief Base Class to store and manipulate POMP directive and related data. */ class OPARI2_DirectivePomp : public OPARI2_Directive { public: OPARI2_DirectivePomp( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : OPARI2_Directive( fname, ln, lines, directive_prefix ) { m_type = OPARI2_PT_POMP; } virtual ~ OPARI2_DirectivePomp( void ) { } /** Increment region counter */ void IncrementRegionCounter( void ); void GenerateDescr( ostream& os ); /** @brief Generate first lines of "include" directives. */ static void GenerateHeader( ostream& os ); /** generate call POMP2_Init_reg_XXX function to initialize * all handles, in the Fortran case */ static void GenerateInitHandleCalls( ostream& os, const string incfile = "" ); virtual void FindName( void ); /** @brief Change the default directive name. */ void SetName( string name_str ); void FindUserRegionName( void ); string& GetUserRegionName( void ); /** Parse string and return POMP group id */ static uint32_t String2Group( const string name ); private: string m_user_region_name; virtual string generate_ctc_string( OPARI2_Format_t form ); static stringstream s_init_handle_calls; static string s_paradigm_prefix; static int s_num_regions; }; #endif opari2-2.0.9/src/opari/pomp/PaxHeaders/opari2_directive_entry_pomp.h0000644000000000000000000000013214770056734022544 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.371367223 opari2-2.0.9/src/opari/pomp/opari2_directive_entry_pomp.h0000644000175100001440000000454714770056734023106 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry_pomp.h * * @brief Define POMP directive entries. */ #ifndef OPARI2_DIRECTIVE_ENTRY_POMP_H #define OPARI2_DIRECTIVE_ENTRY_POMP_H #include "opari2.h" #include "opari2_directive_entry.h" /** * @brief Definition of OpenAcc directive/runtime API group. * More directive group definition can be added before G_OMP_ALL. */ enum OPARI2_PompGroup { G_POMP_NONE = 0x00000000, G_POMP_REGION = 0x00000001, G_POMP_DEFAULT = 0x00010000, G_POMP_ALL = 0xFFFFFFFF }; #define OPARI2_POMP2_USER_SENTINELS \ { "!$pomp", OPARI2_PT_POMP }, \ { "c$pomp", OPARI2_PT_POMP }, \ { "*$pomp", OPARI2_PT_POMP }, \ { "!pomp$", OPARI2_PT_POMP }, \ { "!pomp$", OPARI2_PT_POMP }, \ { "cpomp$", OPARI2_PT_POMP }, \ { "*pomp$", OPARI2_PT_POMP }, \ { "pomp", OPARI2_PT_POMP } #define OPARI2_CREATE_POMP_TABLE_ENTRY( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY( OPARI2_PT_POMP, name, false, true, version, group, pomp ) #define OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY_NOEND( OPARI2_PT_POMP, name, false, version, group, pomp ) /** * TODO: * Set the correct version / group number for POMP directives */ #define OPARI2_POMP_DIRECTIVE_ENTRIES \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instinit, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instfinalize, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( inston, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instoff, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instrument, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( noinstrument, 1.1, G_POMP_DEFAULT ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instbegin, 1.1, G_POMP_REGION ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instaltend, 1.1, G_POMP_REGION ), \ OPARI2_CREATE_POMP_TABLE_ENTRY_NOEND( instend, 1.1, G_POMP_REGION ) #endif // OPARI2_DIRECTIVE_ENTRY_POMP_H opari2-2.0.9/src/opari/PaxHeaders/openmp0000644000000000000000000000013214770056767015141 xustar0030 mtime=1742757367.367367248 30 atime=1742757371.935339406 30 ctime=1742757367.367367248 opari2-2.0.9/src/opari/openmp/0000755000175100001440000000000014770056767015546 5ustar00builderusersopari2-2.0.9/src/opari/openmp/PaxHeaders/opari2_omp_handler.cc0000644000000000000000000000013214770056734021263 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.367367248 opari2-2.0.9/src/opari/openmp/opari2_omp_handler.cc0000644000175100001440000015247314770056734021627 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2016-2017, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_omp_handler.cc * * @brief This file contains all handler funtions to instrument and print * OpenMP pragmas. * * @todo A lot of functionality here might be generalized into a * separate writer class. This is planned for the future. */ #include #include using std::vector; #include using std::map; #include using std::stack; #include using std::cerr; #include using std::ifstream; using std::ofstream; #include using std::string; using std::getline; #include using std::exit; #include using std::strcmp; #include using std::toupper; #include using std::ostream; #include #include "common.h" #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_openmp.h" #include "opari2_directive_manager.h" extern OPARI2_Option_t opt; namespace { bool in_workshare = false; void generate_num_threads( ostream& os, OPARI2_DirectiveOpenmp* d ) { string num_threads = d->GetClauseArg( "num_threads" ); if ( opt.lang & L_FORTRAN ) { if ( num_threads.length() ) { os << " pomp2_num_threads = " << num_threads << "\n"; } else { os << " pomp2_num_threads = pomp2_lib_get_max_threads()\n"; } } else { if ( num_threads.length() ) { os << " int pomp2_num_threads = " << num_threads << ";\n"; } else { os << " int pomp2_num_threads = omp_get_max_threads();\n"; } } } void generate_if( ostream& os, OPARI2_DirectiveOpenmp* d ) { string if_clause = d->GetClauseArg( "if" ); if ( opt.lang & L_FORTRAN ) { if ( if_clause.length() ) { os << " pomp2_if = ( " << if_clause << " )\n"; } else { os << " pomp2_if = .true.\n"; } } else { if ( if_clause.length() ) { os << " int pomp2_if = (int)( " << if_clause << " );\n"; } else { os << " int pomp2_if = 1;\n"; } } } void generate_call( const char* event, const char* type, int id, ostream& os, OPARI2_DirectiveOpenmp* d ) { char c1 = toupper( type[ 0 ] ); string ctc_string; if ( opt.lang & L_FORTRAN ) { if ( strcmp( type, "task" ) == 0 || strcmp( type, "untied_task" ) == 0 ) { os << " if (pomp2_if) then\n"; } os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( strstr( type, "task" ) != NULL && strcmp( type, "taskwait" ) != 0 && strcmp( event, "begin" ) == 0 ) { os << ", pomp2_new_task"; } if ( d != NULL ) { if ( opt.form == F_FIX ) { os << ",\n &" << d->GetCTCStringVariable() << " "; } else { os << ", &\n " << d->GetCTCStringVariable() << " "; } } os << ")\n"; if ( strcmp( type, "task" ) == 0 || strcmp( type, "untied_task" ) == 0 ) { os << " end if\n"; } } else { if ( strcmp( event, "begin" ) == 0 || strcmp( event, "fork" ) == 0 || strcmp( event, "enter" ) == 0 ) { os << "{ "; } if ( strcmp( type, "task" ) == 0 || strcmp( type, "untied_task" ) == 0 ) { os << "if (pomp2_if)"; } os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "( &" << region_id_prefix << id; if ( strstr( type, "task" ) != NULL && strcmp( type, "taskwait" ) != 0 && strcmp( event, "begin" ) == 0 ) { os << ", pomp2_new_task"; } if ( d != NULL ) { os << ", " << d->GetCTCStringVariable() << " "; } os << " );"; if ( strcmp( event, "end" ) == 0 ) { os << " }"; } os << "\n"; if ( strcmp( event, "join" ) == 0 || strcmp( event, "exit" ) == 0 ) { os << " }\n"; } } } void generate_call_save_task_id( const char* event, const char* type, int id, ostream& os, OPARI2_DirectiveOpenmp* d ) { char c1 = toupper( type[ 0 ] ); string ctc_string; if ( opt.lang & L_FORTRAN ) { if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " if (pomp2_if) then\n"; } os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( ( strcmp( type, "task_create" ) == 0 ) || ( strcmp( type, "untied_task_create" ) == 0 ) ) { if ( opt.form == F_FIX ) { os << ",\n &pomp2_new_task"; } else { os << ", pomp2_new_task"; } } if ( opt.form == F_FIX ) { os << ",\n &pomp2_old_task"; } else { os << ",&\n pomp2_old_task"; } if ( d != NULL ) { if ( opt.form == F_FIX ) { if ( d->GetName() == "task" ) { os << ",\n &pomp2_if"; } os << ",\n &" << d->GetCTCStringVariable() << " "; } else { if ( d->GetName() == "task" ) { os << ", pomp2_if"; } os << ", " << d->GetCTCStringVariable() << " "; } } os << ")\n"; if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " end if\n"; } } else { os << "{ POMP2_Task_handle pomp2_old_task;\n"; if ( ( strcmp( type, "task_create" ) == 0 ) || ( strcmp( type, "untied_task_create" ) == 0 ) ) { os << " POMP2_Task_handle pomp2_new_task;\n"; } if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << "if (pomp2_if)"; } os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "( &" << region_id_prefix << id; if ( ( strcmp( type, "task_create" ) == 0 ) || ( strcmp( type, "untied_task_create" ) == 0 ) ) { os << ", &pomp2_new_task"; } os << ", &pomp2_old_task"; if ( d != NULL ) { if ( d->GetName() == "task" ) { os << ", pomp2_if"; } os << ", " << d->GetCTCStringVariable() << " "; } os << " );\n"; } } void generate_call_restore_task_id( const char* event, const char* type, int id, ostream& os ) { char c1 = toupper( type[ 0 ] ); string ctc_string; if ( opt.lang & L_FORTRAN ) { if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " if (pomp2_if) then\n"; } os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( opt.form == F_FIX ) { os << ",\n &pomp2_old_task)\n"; } else { os << ", pomp2_old_task)\n"; } if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << " end if\n"; } } else { if ( strcmp( type, "task_create" ) == 0 || strcmp( type, "untied_task_create" ) == 0 ) { os << "if (pomp2_if)"; } os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "( &" << region_id_prefix << id; os << ", pomp2_old_task ); }\n"; } } /** @brief Instrument an OpenMP Fork. * * The pomp2_num_threads variable is * used to pass the number of requested threads for the * parallel region to the POMP library. It is either the * result of omp_get_max_threads() or of the num_threads() * clause, if present. */ void generate_fork_call( const char* event, const char* type, int id, ostream& os, OPARI2_DirectiveOpenmp* d ) { char c1 = toupper( type[ 0 ] ); if ( opt.lang & L_C_OR_CXX ) { os << "{\n"; } generate_num_threads( os, d ); generate_if( os, d ); if ( opt.lang & L_FORTRAN ) { os << " call POMP2_" << c1 << ( type + 1 ) << "_" << event << "(" << region_id_prefix << id; if ( opt.form == F_FIX ) { os << ",\n &pomp2_if, pomp2_num_threads, pomp2_old_task"; if ( d != NULL ) { os << ",\n &" << d->GetCTCStringVariable() << " "; } } else { os << ",&\n pomp2_if, pomp2_num_threads, pomp2_old_task"; if ( d != NULL ) { os << ", &\n " << d->GetCTCStringVariable() << " "; } } os << ")\n"; } else { os << " POMP2_Task_handle pomp2_old_task;\n"; os << " POMP2_" << c1 << ( type + 1 ) << "_" << event << "(&" << region_id_prefix << id << ", pomp2_if, pomp2_num_threads, " << "&pomp2_old_task"; if ( d != NULL ) { os << ", " << d->GetCTCStringVariable() << " "; } os << ");\n"; } } /** @brief Generate the OpenMP pragma/directive. */ void generate_directive( const char* p, int lineno, const char* filename, ostream& os ) { if ( lineno && opt.keep_src_info ) { // print original source location information reset pragma os << "#line " << lineno << " \"" << filename << "\"" << "\n"; } if ( opt.lang & L_FORTRAN ) { os << "!$omp " << p << "\n"; } else { os << "#pragma omp " << p << "\n"; } } void generate_barrier( int n, ostream& os, const char* filename ) { generate_call_save_task_id( "enter", "implicit_barrier", n, os, NULL ); generate_directive( "barrier", 0, filename, os ); generate_call_restore_task_id( "exit", "implicit_barrier", n, os ); } } //end-of-namespace OPARI2_DirectiveOpenmp* cast2omp( OPARI2_Directive* d_base ) { OPARI2_DirectiveOpenmp* d = dynamic_cast( d_base ); if ( d == NULL ) { cerr << "INTERNAL ERROR: OPARI2_DirectiveOpenmp* expected. Please contact user support.\n"; cleanup_and_exit(); } return d; } /** * @brief Print the directive's lines, together with additional * statements to support OpenMP task. */ void print_directive_parallel( OPARI2_DirectiveOpenmp* d, ostream& os ) { opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); stringstream adds; if ( opt.lang & L_FORTRAN ) { if ( opt.form == F_FIX ) // fix source form { adds << "\n!$omp& firstprivate(pomp2_old_task) private(pomp2_new_task)\n!$omp&"; if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads)"; if ( omp_opt->copytpd ) { adds << " copyin(" << omp_opt->pomp_tpd << ")"; } if ( d->ChangedDefault() ) { adds << "\n!$omp& shared(/" << "cb" << d->GetInodeCompiletimeID() << "/)\n" << "!$omp& private(pomp2_if,pomp2_num_threads)"; } } else // free source form { adds << " &\n !$omp firstprivate(pomp2_old_task) private(pomp2_new_task) &\n"; adds << " !$omp"; if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads)"; if ( omp_opt->copytpd ) { adds << " copyin(" << omp_opt->pomp_tpd << ")"; } if ( d->ChangedDefault() ) { adds << " &\n !$omp shared(/" << "cb" << d->GetInodeCompiletimeID() << "/)" << " &\n !$omp private(pomp2_if,pomp2_num_threads)"; } } } else //C/C++ { adds << " firstprivate(pomp2_old_task)"; if ( omp_opt->copytpd ) { if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads) copyin(" << omp_opt->pomp_tpd << ")"; } else { if ( d->HasClause( "if" ) ) { adds << " if(pomp2_if)"; } adds << " num_threads(pomp2_num_threads)"; } } /* Parallel directives must always be instrumented to enable * a measurement system to do its memory management in a * threadsafe manner. Therefore the line directive must be * inserted even if instrumentation is turned off. */ if ( opt.keep_src_info && !InstrumentationDisabled( D_FULL ) ) { // print original source location information reset pragma os << "#line " << d->GetLineno() << " \"" << d->GetFilename() << "\"" << "\n"; } d->PrintPlainDirective( os, adds.str() ); } void enter_handler_notransform( OPARI2_DirectiveOpenmp* d, ostream& os ) { DirectiveStackPush( d ); d->PrintPlainDirective( os ); } void exit_handler_notransform( OPARI2_DirectiveOpenmp* d ) { DirectiveStackPop(); } /** * @brief OpenMP pragma transformation functions. * * These functions are called by directive manager ONLY if the directive is enabled. */ /** * Note: parallel directive MUST ignore "pomp noinstrument" * to ensure the measurement library is thread-safe. */ void h_omp_parallel( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_parallel( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); if ( !InstrumentationDisabled( D_USER ) && DirectiveActive( OPARI2_PT_OMP, "barrier" ) ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "end", "parallel", id, os, NULL ); d->PrintDirective( os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info && !InstrumentationDisabled( D_FULL ) ) { d->ResetSourceInfo( os ); } } } void h_omp_for( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); if ( !d->HasClause( "nowait" ) ) { d->AddNowait(); } generate_call( "enter", "for", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_end_omp_for( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( false ); if ( d_top->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "for", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_do( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "do", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_end_omp_do( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); } else { d->AddNowait(); d->PrintDirective( os ); generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "do", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_sections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); if ( !d->HasClause( "nowait" ) ) { d->AddNowait(); } generate_call( "enter", "sections", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_omp_section_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); //Init region using the parent directive's region ID! d->InitRegion( d_top ); DirectiveStackPush( d ); int num_sections = d_top->GetNumSections(); if ( num_sections ) { d->PrintPlainDirective( os ); } else { d->PrintDirective( os ); } generate_call( "begin", "section", d_top->GetID(), os, d_top ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } num_sections += 1; d_top->SetNumSections( num_sections ); } } void h_end_omp_section_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); generate_call( "end", "section", d_top->GetID(), os, NULL ); DirectiveStackPop(); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_section( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_C_OR_CXX ) { h_end_omp_section_c( d_base, os ); } } void h_end_omp_sections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( false ); if ( d_top->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "sections", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_sections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "sections", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_omp_sections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_sections_f( d_base, os ); } else { h_omp_sections_c( d_base, os ); } } void h_omp_section_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int num_sections = d_top->GetNumSections(); if ( num_sections ) { // close last section if necessary generate_call( "end", "section", d_top->GetID(), os, NULL ); } d->PrintDirective( os ); generate_call( "begin", "section", d_top->GetID(), os, d_top ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } d_top->SetNumSections( ++num_sections ); } } void h_omp_section( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_section_f( d_base, os ); } else { h_omp_section_c( d_base, os ); } } void h_end_omp_sections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "section", id, os, NULL ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); } else { d->AddNowait(); d->PrintDirective( os ); generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "sections", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_sections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_sections_f( d_base, os ); } else { h_end_omp_sections_c( d_base, os ); } } void h_omp_single_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); if ( !d->HasClause( "nowait" ) && !d->HasClause( "copyprivate" ) ) { d->AddNowait(); } int id = d->GetID(); generate_call( "enter", "single", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_single_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( false ); generate_call( "end", "single", id, os, NULL ); if ( d_top->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } generate_call( "exit", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_single_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); int id = d->GetID(); generate_call( "enter", "single", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_single( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_single_f( d_base, os ); } else { h_omp_single_c( d_base, os ); } } void h_end_omp_single_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "single", id, os, NULL ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); } else { if ( !d->HasClause( "copyprivate" ) ) { d->AddNowait(); } d->PrintDirective( os ); if ( d->IsNowaitAdded() ) { generate_barrier( id, os, d->GetFilename().c_str() ); } } generate_call( "exit", "single", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_single( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_single_f( d_base, os ); } else { h_end_omp_single_c( d_base, os ); } } void h_omp_master( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); d->PrintDirective( os ); generate_call( "begin", "master", d->GetID(), os, d ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_master_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "master", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_master_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "master", id, os, NULL ); d->PrintDirective( os ); } } void h_end_omp_master( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_master_f( d_base, os ); } else { h_end_omp_master_c( d_base, os ); } } void h_omp_critical( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); /** 'critical' should NOT be instrumented if inside 'workshare' construct */ if ( InstrumentationDisabled( D_USER ) || in_workshare ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); int id = d->GetID(); generate_call( "enter", "critical", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "critical", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_critical( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); if ( InstrumentationDisabled( D_USER ) || in_workshare ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); string& name = d->GetName(); string& subname = d->GetUserName(); string& subname_top = d_top->GetUserName(); if ( name[ 0 ] != '$' ) { if ( subname != subname_top ) { cerr << d->GetFilename() << ":" << d_top->GetLineno() << ": ERROR: missing end critical(" << subname << ") directive\n"; cerr << d->GetFilename() << ":" << d->GetLineno() << ": ERROR: non-matching end critical(" << subname << ") directive\n"; cleanup_and_exit(); } } generate_call( "end", "critical", id, os, NULL ); d->PrintDirective( os ); generate_call( "exit", "critical", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_parallelfor( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); OPARI2_DirectiveOpenmp* for_directive = d->SplitCombined(); if ( InstrumentationDisabled( D_USER ) || !( d->active ) ) { generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); } else { for_directive->AddNowait(); generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); generate_call( "enter", "for", id, os, d ); } for_directive->PrintDirective( os ); // #omp for nowait delete for_directive; } } void h_end_omp_parallelfor( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_barrier( id, os, d->GetFilename().c_str() ); generate_call( "exit", "for", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_paralleldo( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); generate_fork_call( "fork", "parallel", id, os, d ); OPARI2_DirectiveOpenmp* do_directive = d->SplitCombined(); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_call( "enter", "do", id, os, d ); } do_directive->PrintDirective( os ); // #omp do delete do_directive; } } void h_end_omp_paralleldo( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); string& filename = d->GetFilename(); int lineno = d->GetLineno(); if ( InstrumentationDisabled( D_USER ) || !( d->active ) ) { generate_directive( "end do", lineno, filename.c_str(), os ); } else { generate_directive( "end do nowait", lineno, filename.c_str(), os ); generate_barrier( id, os, filename.c_str() ); generate_call( "exit", "do", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_directive( "end parallel", lineno, filename.c_str(), os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_parallelsections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); OPARI2_DirectiveOpenmp* d_section = d->SplitCombined(); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { d_section->AddNowait(); } generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_call( "enter", "sections", id, os, d ); } d_section->PrintDirective( os ); // #omp sections delete d_section; } } void h_omp_parallelsections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); OPARI2_DirectiveOpenmp* sec_directive = d->SplitCombined(); generate_fork_call( "fork", "parallel", id, os, d ); print_directive_parallel( d, os ); // #omp parallel generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_call( "enter", "sections", id, os, NULL ); } sec_directive->PrintDirective( os ); // #omp sections delete sec_directive; } } void h_omp_parallelsections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_omp_parallelsections_f( d_base, os ); } else { h_omp_parallelsections_c( d_base, os ); } } void h_end_omp_parallelsections_c( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); if ( !InstrumentationDisabled( D_USER ) && ( d->active ) ) { generate_barrier( id, os, d->GetFilename().c_str() ); generate_call( "exit", "sections", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_parallelsections_f( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); int lineno = d->GetLineno(); string& filename = d->GetFilename(); if ( InstrumentationDisabled( D_USER ) || !( d->active ) ) { generate_directive( "end sections", lineno, filename.c_str(), os ); // generate_barrier( id, os, filename.c_str() ); } else { generate_call( "end", "section", id, os, NULL ); generate_directive( "end sections nowait", lineno, filename.c_str(), os ); generate_barrier( id, os, filename.c_str() ); generate_call( "exit", "sections", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_directive( "end parallel", lineno, filename.c_str(), os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_parallelsections( OPARI2_Directive* d_base, ostream& os ) { if ( opt.lang & L_FORTRAN ) { h_end_omp_parallelsections_f( d_base, os ); } else { h_end_omp_parallelsections_c( d_base, os ); } } void h_omp_barrier( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { /** initialize region information */ d->InitRegion(); SaveForInit( d ); int id = d->GetID(); generate_call_save_task_id( "enter", "barrier", id, os, d ); d->PrintDirective( os ); generate_call_restore_task_id( "exit", "barrier", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_flush( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { d->InitRegion(); SaveForInit( d ); int id = d->GetID(); generate_call( "enter", "flush", id, os, d ); d->PrintDirective( os ); generate_call( "exit", "flush", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_atomic( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); SaveSingleLineDirective( d ); /** * 'atomic' directive should NOT be instrumented if inside a 'workshare' region. */ if ( InstrumentationDisabled( D_USER ) || in_workshare ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "atomic", d->GetID(), os, d ); d->PrintDirective( os ); } } /** * Special handler for the end of 'atomic' region in Fortran. */ void extra_openmp_atomic_handler( OPARI2_Directive* d_base, const int lineno, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( d && ( InstrumentationDisabled( D_USER ) || in_workshare ) ) { exit_handler_notransform( d ); SaveSingleLineDirective( NULL ); } else { if ( d ) { d->SetEndLineno( lineno, lineno ); generate_call( "exit", "atomic", d->GetID(), os, NULL ); DirectiveStackPop(); if ( opt.keep_src_info ) { os << "#line " << ( lineno + 1 ) << " \"" << opt.infile << "\"" << "\n"; } SaveSingleLineDirective( NULL ); } } } void h_end_omp_atomic( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) || in_workshare ) { exit_handler_notransform( d ); SaveSingleLineDirective( NULL ); } else { int id = d->ExitRegion( false ); generate_call( "exit", "atomic", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } SaveSingleLineDirective( NULL ); } } void h_omp_workshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); in_workshare = true; if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); generate_call( "enter", "workshare", d->GetID(), os, d ); d->PrintDirective( os ); } } void h_end_omp_workshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); in_workshare = false; if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); if ( d->HasClause( "nowait" ) ) { d->PrintDirective( os ); generate_call( "exit", "workshare", id, os, NULL ); } else { d->AddNowait(); d->PrintDirective( os ); generate_barrier( id, os, d->GetFilename().c_str() ); generate_call( "exit", "workshare", id, os, NULL ); } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_parallelworkshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_FULL ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); int id = d->GetID(); d->AddDescr( id ); generate_fork_call( "fork", "parallel", id, os, d ); OPARI2_DirectiveOpenmp* ws_directive = d->SplitCombined(); print_directive_parallel( d, os ); // #omp parallel generate_call( "begin", "parallel", id, os, NULL ); if ( !InstrumentationDisabled( D_USER ) ) { generate_call( "enter", "workshare", id, os, d ); } ws_directive->PrintDirective( os ); // #omp workshare in_workshare = true; delete ws_directive; } } /*2.0*/ void h_end_omp_parallelworkshare( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); in_workshare = false; if ( InstrumentationDisabled( D_FULL ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( true ); int lineno = d->GetLineno(); string& filename = d->GetFilename(); if ( InstrumentationDisabled( D_USER ) ) { generate_directive( "end workshare", lineno, filename.c_str(), os ); //generate_barrier( id, os, filename.c_str() ); } else { generate_directive( "end workshare nowait", lineno, filename.c_str(), os ); generate_barrier( id, os, filename.c_str() ); generate_call( "exit", "workshare", id, os, NULL ); } generate_call( "end", "parallel", id, os, NULL ); generate_directive( "end parallel", lineno, filename.c_str(), os ); generate_call_restore_task_id( "join", "parallel", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } /*2.5*/ void h_omp_ordered( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion(); int id = d->GetID(); generate_call( "enter", "ordered", id, os, d ); d->PrintDirective( os ); generate_call( "begin", "ordered", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } /*2.5*/ void h_end_omp_ordered( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { int id = d->ExitRegion( false ); generate_call( "end", "ordered", id, os, NULL ); d->PrintDirective( os ); generate_call( "exit", "ordered", id, os, NULL ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } /*3.0*/ void h_omp_task( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { enter_handler_notransform( d, os ); } else { d->EnterRegion( true ); const char* inner_call, * outer_call; opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); int id = d->GetID(); if ( !InstrumentationDisabled( D_FULL ) ) { d->AddDescr( id ); } outer_call = "task_create"; inner_call = "task"; if ( omp_opt->task_abort ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "ERROR: Tasks are not allowed with this configuration." << std::endl; cleanup_and_exit(); } if ( omp_opt->task_warn ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "WARNING: Tasks may not be supported by the measurement system." << std::endl; } if ( d->HasClause( "untied" ) ) { if ( omp_opt->untied_abort ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "ERROR: Untied tasks are not allowed with this configuration." << std::endl; cleanup_and_exit(); } if ( !omp_opt->untied_nowarn && !omp_opt->untied_keep ) { cerr << d->GetFilename() << ":" << d->GetLineno() << ":\n" << "WARNING: untied tasks may not be supported by the measurement system.\n" << " All untied tasks are now made tied.\n" << " Please consider using --omp-task-untied=abort|keep|no-warn" << std::endl; } if ( omp_opt->untied_keep ) { outer_call = "untied_task_create"; inner_call = "untied_task"; } } if ( !omp_opt->task_remove ) { if ( ( opt.lang & L_C_OR_CXX ) ) { os << "{\n"; } generate_if( os, d ); generate_call_save_task_id( "begin", outer_call, id, os, d ); stringstream adds; if ( opt.lang & L_FORTRAN ) { if ( opt.form == F_FIX ) // Fix source form { adds << "\n!$omp& if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if)"; if ( d->ChangedDefault() ) { adds << "\n!$omp& shared(/" << "cb" << d->GetInodeCompiletimeID() << "/) "; } } else // Free source form { adds << " if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if)"; if ( d->ChangedDefault() ) { adds << "&\n !$omp shared(/" << "cb" << d->GetInodeCompiletimeID() << "/)"; } } } else { adds << " if(pomp2_if) firstprivate(pomp2_new_task, pomp2_if)"; } d->PrintDirective( os, adds.str() ); generate_call( "begin", inner_call, id, os, NULL ); } else { os << "//!!! Removed task directive due to user option \"--task=remove\"!" << std::endl; } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_end_omp_task( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); exit_handler_notransform( d ); } else { OPARI2_DirectiveOpenmp* d_top = cast2omp( DirectiveStackTop( d ) ); int id = d->ExitRegion( true ); const char* inner_call, * outer_call; opari2_omp_option* omp_opt = OPARI2_DirectiveOpenmp::GetOpenmpOpt(); if ( d_top->HasClause( "untied" ) && omp_opt->untied_keep ) { outer_call = "untied_task_create"; inner_call = "untied_task"; } else { outer_call = "task_create"; inner_call = "task"; } if ( !omp_opt->task_remove ) { generate_call( "end", inner_call, id, os, NULL ); d->PrintDirective( os ); generate_call_restore_task_id( "end", outer_call, id, os ); if ( ( opt.lang & L_C_OR_CXX ) ) { os << "}\n"; } } if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_taskwait( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); if ( InstrumentationDisabled( D_USER ) ) { d->PrintPlainDirective( os ); } else { d->InitRegion(); SaveForInit( d ); int id = d->GetID(); generate_call_save_task_id( "begin", "taskwait", id, os, d ); d->PrintDirective( os ); generate_call_restore_task_id( "end", "taskwait", id, os ); if ( opt.keep_src_info ) { d->ResetSourceInfo( os ); } } } void h_omp_threadprivate( OPARI2_Directive* d_base, ostream& os ) { OPARI2_DirectiveOpenmp* d = cast2omp( d_base ); d->PrintDirective( os ); } opari2-2.0.9/src/opari/openmp/PaxHeaders/opari2_omp_handler.h0000644000000000000000000000013214770056734021125 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.367367248 opari2-2.0.9/src/opari/openmp/opari2_omp_handler.h0000644000175100001440000001167114770056734021463 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_omp_handler.h * * @brief */ #ifndef OPARI2_OMP_HANDLER_H #define OPARI2_OMP_HANDLER_H #include using std::ostream; void h_omp_parallel( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallel( OPARI2_Directive* d, ostream& os ); void h_omp_for( OPARI2_Directive* d, ostream& os ); void h_end_omp_for( OPARI2_Directive* d, ostream& os ); void h_omp_do( OPARI2_Directive* d, ostream& os ); void h_end_omp_do( OPARI2_Directive* d, ostream& os ); void h_omp_sections( OPARI2_Directive* d, ostream& os ); void h_omp_section( OPARI2_Directive* d, ostream& os ); void h_end_omp_section( OPARI2_Directive* d, ostream& os ); void h_end_omp_sections( OPARI2_Directive* d, ostream& os ); void h_omp_single( OPARI2_Directive* d, ostream& os ); void h_end_omp_single( OPARI2_Directive* d, ostream& os ); void h_omp_master( OPARI2_Directive* d, ostream& os ); void h_end_omp_master( OPARI2_Directive* d, ostream& os ); void h_omp_critical( OPARI2_Directive* d, ostream& os ); void h_end_omp_critical( OPARI2_Directive* d, ostream& os ); void h_omp_parallelfor( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallelfor( OPARI2_Directive* d, ostream& os ); void h_omp_paralleldo( OPARI2_Directive* d, ostream& os ); void h_end_omp_paralleldo( OPARI2_Directive* d, ostream& os ); void h_omp_parallelsections( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallelsections( OPARI2_Directive* d, ostream& os ); void h_omp_barrier( OPARI2_Directive* d, ostream& os ); void h_omp_flush( OPARI2_Directive* d, ostream& os ); void h_omp_atomic( OPARI2_Directive* d, ostream& os ); void h_end_omp_atomic( OPARI2_Directive* d, ostream& os ); void h_omp_workshare( OPARI2_Directive* d, ostream& os ); void h_end_omp_workshare( OPARI2_Directive* d, ostream& os ); void h_omp_parallelworkshare( OPARI2_Directive* d, ostream& os ); void h_end_omp_parallelworkshare( OPARI2_Directive* d, ostream& os ); void h_omp_ordered( OPARI2_Directive* d, ostream& os ); void h_end_omp_ordered( OPARI2_Directive* d, ostream& os ); void h_omp_task( OPARI2_Directive* d, ostream& os ); void h_end_omp_task( OPARI2_Directive* d, ostream& os ); void h_omp_taskwait( OPARI2_Directive* d, ostream& os ); void h_omp_threadprivate( OPARI2_Directive* d, ostream& os ); void extra_openmp_atomic_handler( OPARI2_Directive* d, const int lineno, ostream& os ); void finalize_handler( ostream& os ); #endif opari2-2.0.9/src/opari/openmp/PaxHeaders/opari2_directive_openmp.cc0000644000000000000000000000013214770056734022327 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.367367248 opari2-2.0.9/src/opari/openmp/opari2_directive_openmp.cc0000644000175100001440000006744114770056734022673 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014, 2017, 2023, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file opari2_directive_openmp.cc * * @brief Methods of Openmp abstract base class, * useed to process OpenMP pragmas in C/C++ and Fortran program. */ #include #include using std::cerr; #include using std::string; #include #include "common.h" #include "opari2_directive_openmp.h" #include "opari2_directive_entry_openmp.h" #include "opari2_directive_manager.h" #define MAKE_STR( x ) MAKE_STR_( x ) #define MAKE_STR_( x ) #x typedef struct { uint32_t mEnum; const string mGroupName; } OPARI2_OpenMPGroupStringMapEntry; OPARI2_OpenMPGroupStringMapEntry ompGroupStringMap[] = { { G_OMP_ATOMIC, "atomic" }, { G_OMP_CRITICAL, "critical" }, { G_OMP_MASTER, "master" }, { G_OMP_SINGLE, "single" }, { G_OMP_LOCKS, "locks" }, { G_OMP_FLUSH, "flush" }, { G_OMP_TASK, "tasks" }, { G_OMP_SYNC, "sync" }, { G_OMP_OMP, "omp" }, { G_OMP_ALL, "all" }, }; /** * @brief Handle Openmp specific command line options ONLY in the form of "--omp-xx=xxx" */ OPARI2_ErrorCode OPARI2_DirectiveOpenmp::ProcessOption( string option ) { OPARI2_ErrorCode err_flag = OPARI2_NO_ERROR; if ( option != "" ) { /* handle new openmp-specific options */ if ( option == "--omp-nodecl" ) { s_omp_opt.add_shared_decl = false; } else if ( option == "--omp-tpd" ) { s_omp_opt.copytpd = true; } else if ( option.find( "--omp-tpd-mangling=" ) != string::npos ) { size_t p1 = option.find( "=" ); string tpd_arg = option.substr( p1 + 1 ); if ( tpd_arg != "" ) { if ( tpd_arg == "gnu" || tpd_arg == "sun" || tpd_arg == "intel" || tpd_arg == "pgi" || tpd_arg == "cray" ) { s_omp_opt.pomp_tpd = "pomp_tpd_"; s_omp_opt.tpd_in_extern_block = false; } else if ( tpd_arg == "ibm" ) { s_omp_opt.pomp_tpd = "pomp_tpd"; s_omp_opt.tpd_in_extern_block = true; } else { cerr << "ERROR: unknown option for --omp-tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else { cerr << "ERROR: missing value for option --omp-tpd-mangling\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } } else if ( option.find( "--omp-task=" ) != string::npos ) { size_t p1 = option.find( "=" ) + 1; size_t p2 = option.find( ",", p1 ); size_t len = p2 == string::npos ? p2 : p2 - p1; string token = option.substr( 11, len ); do { if ( token == "abort" ) { s_omp_opt.task_abort = true; } else if ( token == "warn" ) { s_omp_opt.task_warn = true; } else if ( token == "remove" ) { s_omp_opt.task_remove = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --omp-task\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; } p2 = option.find( ",", p1 + 1 ); if ( p2 == string::npos ) { break; } len = p2 - p1; p1 = p2 + 1; p2 = option.find( ",", len ); token = option.substr( p1, p2 ); } while ( true ); } else if ( option.find( "--omp-task-untied=" ) != string::npos ) { size_t p1 = option.find( "=" ) + 1; size_t p2 = option.find( ",", p1 ); size_t len = p2 == string::npos ? p2 : p2 - p1; string token = option.substr( 18, len ); do { if ( token == "abort" ) { s_omp_opt.untied_abort = true; } else if ( token == "no-warn" ) { s_omp_opt.untied_nowarn = true; } else if ( token == "keep" ) { s_omp_opt.untied_keep = true; } else { cerr << "ERROR: unknown option \"" << token << "\" for --omp-task-untied\n"; err_flag = OPARI2_ERROR_WITH_MESSAGE; break; } p2 = option.find( ",", p1 + 1 ); if ( p2 == string::npos ) { break; } len = p2 - p1; p1 = p2 + 1; p2 = option.find( ",", len ); token = option.substr( p1, p2 ); } while ( true ); } else { err_flag = OPARI2_ERROR_NO_MESSAGE; } } return err_flag; } opari2_omp_option* OPARI2_DirectiveOpenmp::GetOpenmpOpt( void ) { return &s_omp_opt; } void OPARI2_DirectiveOpenmp::IncrementRegionCounter( void ) { ++s_num_regions; } uint32_t OPARI2_DirectiveOpenmp::String2Group( const string name ) { size_t n = sizeof( ompGroupStringMap ) / sizeof( OPARI2_OpenMPGroupStringMapEntry ); for ( size_t i = 0; i < n; ++i ) { if ( ompGroupStringMap[ i ].mGroupName.compare( name ) == 0 ) { return ompGroupStringMap[ i ].mEnum; } } return 0; } /* * @breif Set class variable "omp_pomp_tpd". * * This static method is intended to be called by main() * when handling a FORTRAN source file. */ void OPARI2_DirectiveOpenmp::SetOptPomptpd( string str ) { s_omp_opt.pomp_tpd = str; return; } /** * @brief Find and store the directive name. */ void OPARI2_DirectiveOpenmp::FindName( void ) { find_name_common(); if ( m_name == "parallel" || m_name == "endparallel" ) { string w = find_next_word(); if ( w == "do" || w == "sections" || w == "for" || w == "workshare" /*2.0*/ ) { m_name += w; } } else if ( m_name == "end" ) { string w = find_next_word(); m_name += w; if ( w == "parallel" ) { w = find_next_word(); if ( w == "do" || w == "sections" || w == "for" || w == "workshare" /*2.0*/ ) { m_name += w; } } } if ( m_name == "critical" || m_name == "endcritical" ) { string cname = find_next_word(); if ( cname == "(" ) { m_user_name = find_next_word(); } } identify_clauses(); } void OPARI2_DirectiveOpenmp::identify_clauses( void ) { for ( vector::iterator it = s_directive_clauses[ m_name ].begin(); it != s_directive_clauses[ m_name ].end(); ++it ) { unsigned line = 0; string::size_type pos = 0; if ( find_word( *it, line, pos ) ) { bool remove = ( *it == "if" || *it == "num_threads" || ( *it == "untied" && !s_omp_opt.untied_keep ) ); m_clauses[ *it ] = find_arguments( line, pos, remove, *it ); } } } string OPARI2_DirectiveOpenmp::generate_ctc_string( OPARI2_Format_t form ) { stringstream s; s.clear(); if ( m_name == "critical" ) { if ( !m_user_name.empty() ) { s << "criticalName=" << m_user_name << "*"; } } else if ( m_name == "sections" ) { s << "numSections=" << m_num_sections << "*"; } for ( OPARI2_StrStr_map_t::iterator it = m_clauses.begin(); it != m_clauses.end(); ++it ) { /** Clauses not to appear on CTC-string */ if ( ( *it ).first != "private" && ( *it ).first != "lastprivate" && ( *it ).first != "firstprivate" && ( *it ).first != "copyin" && ( ( *it ).first != "default" || ChangedDefault() ) ) { string name = ( *it ).first; name[ 0 ] = toupper( name[ 0 ] ); s << "has" << name << "="; /** Clauses for which the argument is put on the CTC-string */ if ( ( *it ).first == "schedule" || ( *it ).first == "default" ) { /*replace * with @ in the CTC String to distinguish it from the CTC String delimited '*' */ while ( ( *it ).second.find( '*' ) != string::npos ) { ( *it ).second.replace( ( *it ).second.find( '*' ), 1, "@" ); } s << ( *it ).second << "*"; } else { s << "1" << "*"; } } } return generate_ctc_string_common( form, s.str() ); } /** * @brief Is the default data sharing changed by default(none) or default(private) clause? */ bool OPARI2_DirectiveOpenmp::ChangedDefault( void ) { if ( m_clauses.find( "default" ) == m_clauses.end() ) { return false; } else { return m_clauses[ "default" ] == "none" || m_clauses[ "default" ] == "private"; } } void OPARI2_DirectiveOpenmp::FindUserName( void ) { string cname = find_next_word(); if ( cname == "(" ) { m_user_name = find_next_word(); } } string& OPARI2_DirectiveOpenmp::GetUserName( void ) { return m_user_name; } void OPARI2_DirectiveOpenmp::SetNumSections( int n ) { m_num_sections = n; } int OPARI2_DirectiveOpenmp::GetNumSections( void ) { return m_num_sections; } bool OPARI2_DirectiveOpenmp::IsNowaitAdded( void ) { return m_nowait_added; } void OPARI2_DirectiveOpenmp::GenerateDescr( ostream& os ) { if ( s_lang & L_FORTRAN ) { s_init_handle_calls << " call " << s_paradigm_prefix << "_Assign_handle( " << region_id_prefix << m_id << ","; if ( s_format == F_FIX ) { s_init_handle_calls << "\n & "; } else { s_init_handle_calls << " &\n "; } s_init_handle_calls << m_ctc_string_variable << " )\n"; } else if ( s_lang & L_C_OR_CXX ) { if ( !m_descrs.empty() ) { stringstream ids; ids << m_id; os << "#define POMP2_DLIST_" << string( 5 - ids.str().length(), '0' ) << ids.str() << " shared("; for ( set::const_iterator it = m_descrs.begin(); it != m_descrs.end(); ++it ) { if ( it != m_descrs.begin() ) { os << ","; } os << region_id_prefix << *it; } os << ")\n"; } s_init_handle_calls << " " << s_paradigm_prefix << "_Assign_handle( " << "&" << region_id_prefix << m_id << ", " << m_ctc_string_variable << " );\n"; } OPARI2_Directive::generate_descr_common( os ); } void OPARI2_DirectiveOpenmp::GenerateHeader( ostream& os ) { if ( s_lang & L_C ) { if ( !s_preprocessed_file ) { os << "#include \n\n"; } if ( s_omp_opt.copytpd ) { if ( !s_preprocessed_file ) { os << "#include \n"; } os << "extern int64_t " << MAKE_STR( FORTRAN_ALIGNED ) " " << s_omp_opt.pomp_tpd << ";\n"; os << "#pragma omp threadprivate(" << s_omp_opt.pomp_tpd << ")\n"; } } else if ( s_lang & L_CXX ) { if ( !s_preprocessed_file ) { os << "#include \n\n"; } if ( s_omp_opt.copytpd ) { if ( !s_preprocessed_file ) { os << "#include \n"; } os << "extern \"C\" \n{\n"; os << "extern int64_t " << MAKE_STR( FORTRAN_ALIGNED ) " " << s_omp_opt.pomp_tpd << ";\n"; if ( !s_omp_opt.tpd_in_extern_block ) { os << "}\n"; } os << "#pragma omp threadprivate(" << s_omp_opt.pomp_tpd << ")\n"; if ( s_omp_opt.tpd_in_extern_block ) { os << "}\n"; } } } } /** * @brief Generate a function to allow initialization of all region handles for Fortran. * * These functions need to be called from POMP2_Init_regions. */ void OPARI2_DirectiveOpenmp::GenerateInitHandleCalls( ostream& os, const string incfile ) { OPARI2_Directive::GenerateInitHandleCalls( os, incfile, s_paradigm_prefix, s_init_handle_calls, s_num_regions ); return; } /** @brief add a nowait to a pragma */ void OPARI2_DirectiveOpenmp::AddNowait( void ) { if ( s_lang & L_FORTRAN ) { int lastline = m_lines.size() - 1; string::size_type s = m_lines[ lastline ].find( m_directive_prefix[ 0 ] ) + m_directive_prefix[ 0 ].length(); // insert on last line on last position before comment string::size_type c = m_lines[ lastline ].find( '!', s ); if ( c == string::npos ) { m_lines[ lastline ].append( " nowait" ); } else { m_lines[ lastline ].insert( c, " nowait" ); } m_nowait_added = true; } else if ( s_lang & L_C_OR_CXX ) { int lastline = m_lines.size() - 1; m_lines[ lastline ].append( " nowait" ); m_nowait_added = true; } } /** @brief add region descriptors to shared variable list*/ void OPARI2_DirectiveOpenmp::AddDescr( int id ) { if ( s_lang & L_C_OR_CXX ) { std::ostringstream os; if ( s_omp_opt.add_shared_decl ) { std::stringstream ids; ids << id; os << " POMP2_DLIST_" << string( 5 - ids.str().length(), '0' ) << ids.str(); } else { // not 100% right but best we can do if compiler doesn't allow // macro replacement on pragma statements os << " shared(" << region_id_prefix << id << ")"; } int lastline = m_lines.size() - 1; m_lines[ lastline ].append( os.str() ); } } /** * @brief Split combined parallel and worksharing constructs in two * seperate pragmas to allow the insertion of POMP function * calles between the parallel and the worksharing construct. * clauses need to be matched to the corresponding pragma */ OPARI2_DirectiveOpenmp* OPARI2_DirectiveOpenmp::SplitCombined( void ) { return SplitCombinedT( s_outer_inner, s_inner_clauses ); } void OPARI2_DirectiveOpenmp::FinalizeDescrs( ostream& os ) { if ( s_lang & L_FORTRAN ) { if ( s_lang & L_F77 ) { os << "\n integer*4 pomp2_lib_get_max_threads"; os << "\n external pomp2_lib_get_max_threads"; os << "\n logical pomp2_test_lock"; os << "\n external pomp2_test_lock"; os << "\n integer*4 pomp2_test_nest_lock"; os << "\n external pomp2_test_nest_lock\n"; } else if ( s_lang & L_F90 ) { os << "\n integer ( kind=4 ), external :: pomp2_lib_get_max_threads"; os << "\n logical, external :: pomp2_test_lock"; os << "\n integer ( kind=4 ), external :: pomp2_test_nest_lock\n"; } if ( !s_common_block.empty() ) { if ( s_omp_opt.copytpd ) { if ( s_lang & L_F77 ) { os << " integer*8 pomp_tpd\n"; } else { os << " integer( kind=8 ) pomp_tpd\n"; } os << " common /pomp_tpd/ pomp_tpd\n"; os << "!$omp threadprivate(/pomp_tpd/)\n"; } if ( s_lang & L_F77 ) { os << " integer*8 pomp2_old_task, pomp2_new_task\n"; os << " logical pomp2_if\n"; os << " integer*4 pomp2_num_threads\n"; } else { os << " integer ( kind=8 ) :: pomp2_old_task, pomp2_new_task\n"; os << " logical :: pomp2_if\n"; os << " integer ( kind=4 ) :: pomp2_num_threads\n"; } } } } /** Writes Directive for ending a loop */ OPARI2_Directive* OPARI2_DirectiveOpenmp::EndLoopDirective( const int lineno ) { if ( s_lang & L_FORTRAN ) { FindName(); string pragma = ""; for ( string::size_type c = 0; c < m_indent; c++ ) { pragma += " "; } pragma += m_directive_prefix[ 0 ]; if ( m_name == "do" ) { pragma += " end do"; } else if ( m_name == "paralleldo" ) { pragma += " end parallel do"; } vector lines; lines.push_back( pragma ); return new OPARI2_DirectiveOpenmp( m_filename, lineno, lines, m_directive_prefix ); } return NULL; } /** Returns true for enddo and endparalleldo directives */ bool OPARI2_DirectiveOpenmp::EndsLoopDirective( void ) { if ( s_lang & L_FORTRAN ) { if ( m_name.empty() ) { FindName(); } if ( m_name == "enddo" || m_name == "endparalleldo" ) { return true; } } return false; } /* Initialize class static variables */ #ifndef FORTRAN_MANGLED #define FORTRAN_MANGLED( str ) str #endif #define OPARI2_STR_( str ) #str #define OPARI2_STR( str ) OPARI2_STR_( str ) /** * @brief Creates pairs of directive keywords that can be combined * and are split by OPARI2. * * This function is called during initialiazation of static * variables, so the language is not yet set in s_lang. */ static OPARI2_StrVStr_map_t make_directive_clauses( void ) { OPARI2_StrVStr_map_t dc; vector clauses; clauses.push_back( "if" ); clauses.push_back( "num_threads" ); clauses.push_back( "default" ); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "shared" ); clauses.push_back( "copyin" ); clauses.push_back( "reduction" ); clauses.push_back( "proc_bind" ); dc[ "parallel" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "lastprivate" ); clauses.push_back( "reduction" ); clauses.push_back( "schedule" ); clauses.push_back( "collapse" ); clauses.push_back( "ordered" ); clauses.push_back( "nowait" ); dc[ "for" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "astprivate" ); clauses.push_back( "reduction" ); clauses.push_back( "schedule" ); clauses.push_back( "collapse" ); clauses.push_back( "ordered" ); dc[ "do" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "lastprivate" ); clauses.push_back( "reduction" ); clauses.push_back( "nowait" ); dc[ "sections" ] = clauses; clauses.clear(); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "copyprivate" ); clauses.push_back( "nowait" ); dc[ "single" ] = clauses; clauses.clear(); clauses.push_back( "nowait" ); clauses.push_back( "copyprivate" ); dc[ "end single" ] = clauses; dc[ "endsingle" ] = clauses; clauses.clear(); clauses.push_back( "nowait" ); dc[ "end do" ] = clauses; dc[ "enddo" ] = clauses; dc[ "end sections" ] = clauses; dc[ "endsections" ] = clauses; dc[ "end workshare" ] = clauses; dc[ "endworkshare" ] = clauses; /** Commented out are the ones that are new with the OpenMP 4.0 specification */ clauses.clear(); clauses.push_back( "if" ); //clauses.push_back( "final" ); clauses.push_back( "untied" ); clauses.push_back( "default" ); //clauses.push_back( "mergeable" ); clauses.push_back( "private" ); clauses.push_back( "firstprivate" ); clauses.push_back( "shared" ); //clauses.push_back( "depend" ); dc[ "task" ] = clauses; dc[ "parallelfor" ] = dc[ "parallel" ]; dc[ "parallelfor" ].insert( dc[ "parallelfor" ].end(), dc[ "for" ].begin(), dc[ "for" ].end() ); dc[ "paralleldo" ] = dc[ "parallel" ]; dc[ "paralleldo" ].insert( dc[ "paralleldo" ].end(), dc[ "do" ].begin(), dc[ "do" ].end() ); dc[ "parallelsections" ] = dc[ "parallel" ]; dc[ "parallelsections" ].insert( dc[ "parallelsections" ].end(), dc[ "sections" ].begin(), dc[ "sections" ].end() ); dc[ "parallelworkshare" ] = dc[ "parallel" ]; dc[ "parallelworkshare" ].insert( dc[ "parallelworkshare" ].end(), dc[ "workshare" ].begin(), dc[ "workshare" ].end() ); /** Doing the work anyway and usintg the OpenMP 4.0 specification, I went ahead and added these clauses too */ // clauses.clear(); // clauses.push_back( "safelen" ); // clauses.push_back( "linear" ); // clauses.push_back( "aligned" ); // clauses.push_back( "private" ); // clauses.push_back( "lastprivate" ); // clauses.push_back( "reduction" ); // clauses.push_back( "collapse" ); // dc[ "simd" ] = clauses; // clauses.clear(); // clauses.push_back( "simdlen" ); // clauses.push_back( "linear" ); // clauses.push_back( "aligned" ); // clauses.push_back( "uniform" ); // clauses.push_back( "inbranch" ); // clauses.push_back( "notinbranch" ); // dc[ "declare simd" ] = clauses; // clauses.clear(); // clauses.push_back( "device" ); // clauses.push_back( "map" ); // clauses.push_back( "if" ); // dc[ "target data" ] = clauses; // clauses.clear(); // clauses.push_back( "device" ); // clauses.push_back( "map" ); // clauses.push_back( "if" ); // dc[ "target" ] = clauses; // clauses.clear(); // clauses.push_back( "to" ); // clauses.push_back( "from" ); // clauses.push_back( "device" ); // clauses.push_back( "if" ); // dc[ "target update" ] = clauses; // clauses.clear(); // clauses.push_back( "num_teams" ); // clauses.push_back( "thread_limit" ); // clauses.push_back( "default" ); // clauses.push_back( "private" ); // clauses.push_back( "firstprivate" ); // clauses.push_back( "shared" ); // clauses.push_back( "reduction" ); // dc[ "teams" ] = clauses; // clauses.clear(); // clauses.push_back( "private" ); // clauses.push_back( "firstprivate" ); // clauses.push_back( "collapse" ); // clauses.push_back( "dist_schedule" ); // dc[ "distribute" ] = clauses; // clauses.clear(); // clauses.push_back( "parallel" ); // clauses.push_back( "sections" ); // clauses.push_back( "for" ); // clauses.push_back( "do" ); // clauses.push_back( "taskgroup" ); // clauses.push_back( "if " ); // dc[ "cancel" ] = clauses; // clauses.clear(); // clauses.push_back( "parallel" ); // clauses.push_back( "sections" ); // clauses.push_back( "for" ); // clauses.push_back( "do" ); // clauses.push_back( "taskgroup" ); // dc[ "cancellation point" ] = clauses; return dc; } OPARI2_StrVStr_map_t OPARI2_DirectiveOpenmp::s_directive_clauses = make_directive_clauses(); /** * @brief Creates pairs of directive keywords that can be combined * and are split by OPARI2. * * This function is called during initialiazation of static * variables, so the language is not yet set in s_lang. */ static OPARI2_StrStr_pairs_t make_outer_inner( void ) { OPARI2_StrStr_pairs_t oi; oi.push_back( make_pair( string( "parallel" ), string( "sections" ) ) ); /* These are Fortran specific */ oi.push_back( make_pair( string( "parallel" ), string( "do" ) ) ); oi.push_back( make_pair( string( "parallel" ), string( "workshare" ) ) ); /* This one is C/C++ specific */ oi.push_back( make_pair( string( "parallel" ), string( "for" ) ) ); return oi; } OPARI2_StrStr_pairs_t OPARI2_DirectiveOpenmp:: s_outer_inner = make_outer_inner(); /** * @brief Specifies the clauses that belong to the "inner" directive * of a combined directive. */ static OPARI2_StrBool_pairs_t make_inner_clauses( void ) { OPARI2_StrBool_pairs_t ic; ic.push_back( make_pair( string( "ordered" ), false ) ); /* Comment out due to ticket #939 in Score-P (silc) The same treatment does not work for lastprivate, although this does not currently work. (Philippen) TODO: fix */ // ic.push_back( make_pair( string( "firstprivate" ), true ) ); ic.push_back( make_pair( string( "lastprivate" ), true ) ); ic.push_back( make_pair( string( "schedule" ), true ) ); ic.push_back( make_pair( string( "collapse" ), true ) ); return ic; } OPARI2_StrBool_pairs_t OPARI2_DirectiveOpenmp::s_inner_clauses = make_inner_clauses(); #define POMP_TPD_MANGLED FORTRAN_MANGLED( pomp_tpd ) opari2_omp_option OPARI2_DirectiveOpenmp::s_omp_opt = { true, false, false, false, false, false, false, false, false, OPARI2_STR( POMP_TPD_MANGLED ) }; stringstream OPARI2_DirectiveOpenmp:: s_init_handle_calls; int OPARI2_DirectiveOpenmp:: s_num_regions = 0; const string OPARI2_DirectiveOpenmp:: s_paradigm_prefix = "POMP2"; opari2-2.0.9/src/opari/openmp/PaxHeaders/opari2_directive_openmp.h0000644000000000000000000000013214770056734022171 xustar0030 mtime=1742757340.107533403 30 atime=1742757340.163533062 30 ctime=1742757367.363367273 opari2-2.0.9/src/opari/openmp/opari2_directive_openmp.h0000644000175100001440000001250414770056734022523 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_openmp.h * * @brief Class definitions for Openmp directives in C/C++ and Fortran. */ #ifndef OPARI2_DIRECTIVE_OPENMP_H #define OPARI2_DIRECTIVE_OPENMP_H #include using std::string; #include using std::vector; #include using std::ostream; #include "opari2.h" #include "opari2_directive.h" /** @brief Anonymous namespace including structure definition for OpenMP specific cmd line options. */ /** @brief Structure for OpenMP specific cmd line options. */ typedef struct { bool add_shared_decl; bool copytpd; bool task_abort; bool task_warn; bool task_remove; bool untied_abort; bool untied_keep; bool untied_nowarn; bool tpd_in_extern_block; string pomp_tpd; } opari2_omp_option; /** @brief Base Class to store and manipulate OpenMP directive related data. */ class OPARI2_DirectiveOpenmp : public OPARI2_Directive { public: /**@brief Constructor. */ OPARI2_DirectiveOpenmp( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : OPARI2_Directive( fname, ln, lines, directive_prefix ) { m_type = OPARI2_PT_OMP; m_nowait_added = false; m_has_untied = false; m_has_ordered = false; m_num_sections = 0; if ( lines.empty() ) { m_indent = 0; } else { m_indent = lines[ 0 ].find_first_not_of( " \t" ); m_indent = m_indent == string::npos ? 0 : m_indent; } } /** @brief Destructor. */ virtual ~ OPARI2_DirectiveOpenmp( void ) { } /** Increment region counter */ virtual void IncrementRegionCounter( void ); /** * @brief Parse OpenMP-specific command-line option and store it * in 's_omp_opt'. */ static OPARI2_ErrorCode ProcessOption( string option ); /** @brief Set value for 'opt.omp_pomp_tpd'. */ static void SetOptPomptpd( string str ); /** return 's_openmp_opt' */ static opari2_omp_option* GetOpenmpOpt( void ); /** Parse string and return OpenMP group id */ static uint32_t String2Group( const string name ); virtual void FindName( void ); /** is the default data sharing changed, * i.e. is default(none) or default(private) present? */ bool ChangedDefault( void ); /** returns value in brackets, if present, "" otherwise*/ void FindUserName( void ); string& GetUserName( void ); void SetNumSections( int n ); int GetNumSections( void ); string& GetReduction( void ); /** split compined constructs in two seperate statement */ virtual OPARI2_DirectiveOpenmp* SplitCombined( void ); /** add OpenMP descriptors at the right place */ virtual void AddDescr( int n ); virtual void GenerateDescr( ostream& os ); static void FinalizeDescrs( ostream& os ); /** Generate header of the include file */ static void GenerateHeader( ostream& os ); /** generate call POMP2_Init_reg_XXX function to initialize * all handles, in the Fortran case */ static void GenerateInitHandleCalls( ostream& os, const string incfile = "" ); /** add a nowait to a directive*/ virtual void AddNowait( void ); bool IsNowaitAdded( void ); /** Returns a directive for ending the loop region */ virtual OPARI2_Directive* EndLoopDirective( const int lineno ); /** Returns true for enddo and endparalleldo directives */ virtual bool EndsLoopDirective( void ); private: /** * @brief Identifies clauses and their arguments */ virtual void identify_clauses( void ); private: string m_arg_num_threads; /**< argument of the 'num_threads' clause */ string m_arg_if; /**< argument of the 'if' clause */ string m_arg_reduction; /**< argument of the 'reduction' clause */ string m_arg_schedule; /**< argument of the 'schedule' clause */ string m_arg_collapse; /**< argument of the 'collapse' clause */ string m_user_name; /**< name of named critical sections */ bool m_has_untied; /**< true if has 'untied' clause */ bool m_has_ordered; /**< true if hase 'ordered' clause */ int m_num_sections; /**< number of sections */ string::size_type m_indent; bool m_nowait_added; virtual string generate_ctc_string( OPARI2_Format_t form ); /** Static members */ static opari2_omp_option s_omp_opt; /**< OMP-specific cmd-line options */ static stringstream s_init_handle_calls; static int s_num_regions; static const string s_paradigm_prefix; static OPARI2_StrVStr_map_t s_directive_clauses; static OPARI2_StrStr_pairs_t s_outer_inner; static OPARI2_StrBool_pairs_t s_inner_clauses; }; #endif opari2-2.0.9/src/opari/openmp/PaxHeaders/opari2_directive_entry_openmp.h0000644000000000000000000000013214770056734023412 xustar0030 mtime=1742757340.103533427 30 atime=1742757340.159533085 30 ctime=1742757367.363367273 opari2-2.0.9/src/opari/openmp/opari2_directive_entry_openmp.h0000644000175100001440000001227514770056734023751 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry_openmp.h * * @brief Define Openmp directive and runtime API entries. */ #ifndef OPARI2_DIRECTIVE_ENTRY_OPENMP_H #define OPARI2_DIRECTIVE_ENTRY_OPENMP_H #include "opari2.h" #include "opari2_directive_entry.h" /** * @brief Definition of Openmp directive/runtime API group. * More directive group definition can be added before G_OMP_ALL. */ enum OPARI2_OmpGroup { /** invalid group */ G_OMP_NONE = 0x00000000, G_OMP_ATOMIC = 0x00000001, G_OMP_CRITICAL = 0x00000002, G_OMP_MASTER = 0x00000004, G_OMP_SINGLE = 0x00000008, G_OMP_LOCKS = 0x00000010, G_OMP_FLUSH = 0x00000020, G_OMP_TASK = 0x00000040, G_OMP_ORDERED = 0x00000080, G_OMP_SYNC = 0x000000FF, G_OMP_DEFAULT = 0x00001000, G_OMP_OMP = 0x0000FFFF, G_OMP_REGION = 0x00010000, G_OMP_ALL = 0xFFFFFFFF }; #define OPARI2_OPENMP_SENTINELS \ { "!$omp", OPARI2_PT_OMP }, \ { "c$omp", OPARI2_PT_OMP }, \ { "*$omp", OPARI2_PT_OMP }, \ { "omp", OPARI2_PT_OMP }, \ { "openmp", OPARI2_PT_OMP } #define OPARI2_CREATE_OPENMP_TABLE_ENTRY( name, loop, disable_with_paradigm, version, group ) \ OPARI2_CREATE_TABLE_ENTRY( OPARI2_PT_OMP, name, loop, disable_with_paradigm, version, group, omp ) #define OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( name, loop, version, group ) \ OPARI2_CREATE_TABLE_ENTRY_NOEND( OPARI2_PT_OMP, name, loop, version, group, omp ) #define OPARI2_CREATE_OPENMP_TABLE_ENTRY_SINGLE_STATEMENT( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY_SINGLE_STATEMENT( OPARI2_PT_OMP, name, false, true, version, group, omp ) /* *INDENT-OFF* */ #define OPARI2_OPENMP_DIRECTIVE_ENTRIES \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallel, false, false, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( for, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( do, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( sections, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( section, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( single, false, true, 3.0, G_OMP_SINGLE ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( master, false, true, 3.0, G_OMP_MASTER ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( critical, false, true, 3.0, G_OMP_CRITICAL ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallelfor, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( paralleldo, true, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallelsections, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( workshare, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( parallelworkshare, false, true, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( ordered, false, true, 3.0, G_OMP_ORDERED ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY( task, false, true, 3.0, G_OMP_TASK ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_SINGLE_STATEMENT( atomic, 3.0, G_OMP_ATOMIC ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( barrier, false, 3.0, G_OMP_DEFAULT ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( flush, false, 3.0, G_OMP_FLUSH ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( taskwait, false, 3.0, G_OMP_TASK ), \ OPARI2_CREATE_OPENMP_TABLE_ENTRY_NOEND( threadprivate, false, 3.0, G_OMP_DEFAULT ) /* *INDENT-ON* */ #define OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( name, version, group, wrapper ) \ { OPARI2_PT_OMP, #name, #version, group, true, #wrapper, "omp.h", "omp_lib.h" } #define OPARI2_OPENMP_API_ENTRIES \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_init_lock, 3.0, G_OMP_LOCKS, POMP2_Init_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_destroy_lock, 3.0, G_OMP_LOCKS, POMP2_Destroy_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_set_lock, 3.0, G_OMP_LOCKS, POMP2_Set_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_unset_lock, 3.0, G_OMP_LOCKS, POMP2_Unset_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_test_lock, 3.0, G_OMP_LOCKS, POMP2_Test_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_init_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Init_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_destroy_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Destroy_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_set_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Set_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_unset_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Unset_nest_lock ), \ OPARI2_CREATE_OPENMP_API_TABLE_ENTRY( omp_test_nest_lock, 3.0, G_OMP_LOCKS, POMP2_Test_nest_lock ) #endif opari2-2.0.9/src/opari/PaxHeaders/offload0000644000000000000000000000013214770056767015255 xustar0030 mtime=1742757367.383367151 30 atime=1742757371.935339406 30 ctime=1742757367.383367151 opari2-2.0.9/src/opari/offload/0000755000175100001440000000000014770056767015662 5ustar00builderusersopari2-2.0.9/src/opari/offload/PaxHeaders/opari2_offload_handler.h0000644000000000000000000000013214770056734022060 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.383367151 opari2-2.0.9/src/opari/offload/opari2_offload_handler.h0000644000175100001440000000164114770056734022412 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_offload_handler.h * * @brief */ #ifndef OPARI2_OFFLOAD_HANDLER_H #define OPARI2_OFFLOAD_HANDLER_H #include using std::ostream; #include "opari2.h" #include "opari2_directive.h" void h_offload_target( OPARI2_Directive* d, ostream& os ); void h_end_offload_target( OPARI2_Directive* d, ostream& os ); void h_offload_declspec( OPARI2_Directive* d, ostream& os ); void h_end_offload_declspec( OPARI2_Directive* d, ostream& os ); #endif opari2-2.0.9/src/opari/offload/PaxHeaders/opari2_offload_handler.cc0000644000000000000000000000013214770056734022216 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.383367151 opari2-2.0.9/src/opari/offload/opari2_offload_handler.cc0000644000175100001440000000242614770056734022552 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_offload_handler.cc * * @brief Handler functions for Intel OFFLOAD directives. */ #include #include "opari2.h" #include "opari2_directive.h" #include "opari2_directive_manager.h" void h_offload_target( OPARI2_Directive* d, ostream& os ) { DirectiveStackPush( d ); d->PrintPlainDirective( os ); DisableInstrumentation( D_FULL ); } void h_end_offload_target( OPARI2_Directive* d, ostream& os ) { DirectiveStackPop(); EnableInstrumentation( D_FULL ); } void h_offload_declspec( OPARI2_Directive* d, ostream& os ) { DisableInstrumentation( D_FULL ); // Only go to the directive stack, not the vector DirectiveStackPush( d ); } void h_end_offload_declspec( OPARI2_Directive* d, ostream& os ) { EnableInstrumentation( D_FULL ); // maintain stack DirectiveStackPop(); } opari2-2.0.9/src/opari/offload/PaxHeaders/opari2_directive_offload.cc0000644000000000000000000000013214770056734022557 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.379367175 opari2-2.0.9/src/opari/offload/opari2_directive_offload.cc0000644000175100001440000000272414770056734023114 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_offload.cc * * @brief Methods of base class for OFFLOAD directives. */ #include #include using std::string; #include using std::ostream; #include #include "common.h" #include "opari2_directive_offload.h" #include "opari2_directive_entry_offload.h" uint32_t OPARI2_DirectiveOffload::String2Group( const string name ) { return 0; } void OPARI2_DirectiveOffload::IncrementRegionCounter( void ) { ++s_num_regions; } void OPARI2_DirectiveOffload::GenerateDescr( ostream& os ) { if ( s_lang & L_C_OR_CXX ) { OPARI2_Directive::generate_descr_common( os ); s_init_handle_calls << " " << s_paradigm_prefix << "_assign_handle( " << "&" << region_id_prefix << m_id << ", " << m_ctc_string_variable << " );\n"; } } void OPARI2_DirectiveOffload::SetName( string name_str ) { m_name = name_str; } int OPARI2_DirectiveOffload:: s_num_regions = 0; stringstream OPARI2_DirectiveOffload::s_init_handle_calls; string OPARI2_DirectiveOffload:: s_paradigm_prefix = "POFLD"; opari2-2.0.9/src/opari/offload/PaxHeaders/opari2_directive_offload.h0000644000000000000000000000013214770056734022421 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.379367175 opari2-2.0.9/src/opari/offload/opari2_directive_offload.h0000644000175100001440000000357014770056734022756 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_offload.h * * @brief Base class for Intel OFFLOAD directives */ #ifndef OPARI2_DIRECTIVE_OFFLOAD_H #define OPARI2_DIRECTIVE_OFFLOAD_H #include using std::string; #include using std::ostream; #include using std::vector; #include "opari2.h" #include "opari2_directive.h" /** @brief Base Class to store and manipulate Intel offload directive and related data. */ class OPARI2_DirectiveOffload : public OPARI2_Directive { public: OPARI2_DirectiveOffload( const string& fname, const int ln, vector& lines, vector& directive_prefix ) : OPARI2_Directive( fname, ln, lines, directive_prefix ) { m_type = OPARI2_PT_OFFLOAD; if ( directive_prefix.size() ) { string sentinel = directive_prefix[ directive_prefix.size() - 1 ]; if ( sentinel == "__declspec" ) { SetName( "declspec" ); } } } virtual ~ OPARI2_DirectiveOffload( void ) { } /** Increment region counter */ void IncrementRegionCounter( void ); void SetName( string name_str ); /** Parse string and return offload group id */ static uint32_t String2Group( const string name ); virtual void GenerateDescr( ostream& os ); private: static string s_paradigm_prefix; static stringstream s_init_handle_calls; static int s_num_regions; }; #endif opari2-2.0.9/src/opari/offload/PaxHeaders/opari2_directive_entry_offload.h0000644000000000000000000000013214770056734023642 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.379367175 opari2-2.0.9/src/opari/offload/opari2_directive_entry_offload.h0000644000175100001440000000303114770056734024167 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2013, * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /** @internal * * @file opari2_directive_entry_offload.h * * @brief Define Intel Offload directive entries. */ #ifndef OPARI2_DIRECTIVE_ENTRY_OFFLOAD_H #define OPARI2_DIRECTIVE_ENTRY_OFFLOAD_H #include "opari2.h" #include "opari2_directive_entry.h" /** * @brief Definition of Intel Offload directive/runtime API group. * More directive group definition can be added before G_OFF_ALL. */ enum OPARI2_OffloadGroup { G_OFFLOAD_NONE = 0x00000000, G_OFFLOAD_DEFAULT = 0x00001000, G_OFFLOAD_ALL = 0xFFFFFFFF }; #define OPARI2_OFFLOAD_SENTINELS \ { "!dir$", OPARI2_PT_OFFLOAD }, \ { "cdir$", OPARI2_PT_OFFLOAD }, \ { "*dir$", OPARI2_PT_OFFLOAD }, \ { "offload", OPARI2_PT_OFFLOAD }, \ { "__declspec", OPARI2_PT_OFFLOAD } #define OPARI2_CREATE_OFFLOAD_TABLE_ENTRY( name, version, group ) \ OPARI2_CREATE_TABLE_ENTRY( OPARI2_PT_OFFLOAD, name, false, true, version, group, offload ) /* *INDENT-OFF* */ #define OPARI2_OFFLOAD_DIRECTIVE_ENTRIES \ OPARI2_CREATE_OFFLOAD_TABLE_ENTRY( target, 1.0, G_OFFLOAD_DEFAULT ),\ OPARI2_CREATE_OFFLOAD_TABLE_ENTRY( declspec, 1.0, G_OFFLOAD_DEFAULT ) /* *INDENT-ON* */ #endif opari2-2.0.9/src/PaxHeaders/config-frontend.h.in0000644000000000000000000000013114770056753016440 xustar0030 mtime=1742757355.559439221 29 atime=1742757366.47137271 30 ctime=1742757367.207368224 opari2-2.0.9/src/config-frontend.h.in0000644000175100001440000001077014770056753016776 0ustar00builderusers/* ../src/config-frontend.h.in. Generated from configure.ac by autoheader. */ /* Name of the sub-build. */ #undef AFS_PACKAGE_BUILD /* Symbol name of the sub-build in upper case. */ #undef AFS_PACKAGE_BUILD_NAME /* Symbol name of the sub-build in lower case. */ #undef AFS_PACKAGE_BUILD_name /* The package name usable as a symbol in upper case. */ #undef AFS_PACKAGE_NAME /* Relative path to the top-level source directory. */ #undef AFS_PACKAGE_SRCDIR /* The package name usable as a symbol in lower case. */ #undef AFS_PACKAGE_name /* Makes C variable alignment consistent with Fortran */ #undef FORTRAN_ALIGNED /* define if the compiler supports basic C99 syntax */ #undef HAVE_C99 /* define if the compiler supports basic C++11 syntax */ #undef HAVE_CXX11 /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Set if we are building for the AIX platform */ #undef HAVE_PLATFORM_AIX /* Set if we are building for the ALTIX platform */ #undef HAVE_PLATFORM_ALTIX /* Set if we are building for the BG/L platform */ #undef HAVE_PLATFORM_BGL /* Set if we are building for the BG/P platform */ #undef HAVE_PLATFORM_BGP /* Set if we are building for the BG/Q platform */ #undef HAVE_PLATFORM_BGQ /* Set if we are building for the Cray platform */ #undef HAVE_PLATFORM_CRAY /* Set if we are building for an otherwise unspecified Cray platform */ #undef HAVE_PLATFORM_CRAYGENERIC /* Set if we are building for the Cray XC platform */ #undef HAVE_PLATFORM_CRAYXC /* Set if we are building for the Cray XE platform */ #undef HAVE_PLATFORM_CRAYXE /* Set if we are building for the Cray XK platform */ #undef HAVE_PLATFORM_CRAYXK /* Set if we are building for the Cray XT platform */ #undef HAVE_PLATFORM_CRAYXT /* Set if we are building for the FX10 platform */ #undef HAVE_PLATFORM_FX10 /* Set if we are building for the FX100 platform */ #undef HAVE_PLATFORM_FX100 /* Set if we are building for the K platform */ #undef HAVE_PLATFORM_K /* Set if we are building for the Linux platform */ #undef HAVE_PLATFORM_LINUX /* Set if we are building for the macOS platform */ #undef HAVE_PLATFORM_MAC /* Set if we are building for the Intel MIC platform */ #undef HAVE_PLATFORM_MIC /* Set if we are building for the MinGW platform */ #undef HAVE_PLATFORM_MINGW /* Set if we are building for the Solaris platform */ #undef HAVE_PLATFORM_SOLARIS /* Can link a readlink function */ #undef HAVE_READLINK /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the 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 /* Revision of OPARI2 */ #undef SCOREP_COMPONENT_REVISION /* Defined if we are working from git. */ #undef SCOREP_IN_DEVELOPEMENT /* Defined if we are working from a make dist generated tarball. */ #undef SCOREP_IN_PRODUCTION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to 1 if needed to make fixed-width integer constant macros available in C++ */ #undef __STDC_CONSTANT_MACROS /* Define to 1 if needed to make fixed-width integer format macros available in C++ */ #undef __STDC_FORMAT_MACROS /* Define to 1 if needed to make fixed-width integer limit macros available in C++ */ #undef __STDC_LIMIT_MACROS opari2-2.0.9/src/PaxHeaders/config-custom.h0000644000000000000000000000013214770056734015526 xustar0030 mtime=1742757340.095533476 30 atime=1742757340.159533085 30 ctime=1742757367.171368443 opari2-2.0.9/src/config-custom.h0000644000175100001440000000152714770056734016063 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #ifndef CONFIG_CUSTOM_H #define CONFIG_CUSTOM_H /** * @file config-custom.h * * @brief This file gets included by config.h (resp. config-frontend.h and * config-backend.h) and contains supplementary macros to be used with the * macros in config.h. * */ #endif /* CONFIG_CUSTOM_H */ opari2-2.0.9/src/PaxHeaders/config.h0000644000000000000000000000013214770056734014216 xustar0030 mtime=1742757340.095533476 30 atime=1742757340.159533085 30 ctime=1742757367.171368443 opari2-2.0.9/src/config.h0000644000175100001440000000236214770056734014551 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * Technische Universitaet Dresden, Germany * University of Oregon, Eugene, USA * Forschungszentrum Juelich GmbH, Germany * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * Technische Universitaet Muenchen, Germany * * See the COPYING file in the package base directory for details. * */ #ifndef CONFIG_H #define CONFIG_H /** * @file config.h * * @brief Provide a single config.h that hides the frontend/backend * issues from the developer * */ #if defined CROSS_BUILD #if defined FRONTEND_BUILD #include #elif defined BACKEND_BUILD #include #else #error "You cannot use config.h without defining either FRONTEND_BUILD or BACKEND_BUILD." #endif #elif defined NOCROSS_BUILD #include #else #error "You cannot use config.h without defining either CROSS_BUILD or NOCROSS_BUILD." #endif #include #include #endif /* CONFIG_H */ opari2-2.0.9/src/PaxHeaders/opari-lib-dummy0000644000000000000000000000013214770056767015540 xustar0030 mtime=1742757367.343367395 30 atime=1742757371.935339406 30 ctime=1742757367.343367395 opari2-2.0.9/src/opari-lib-dummy/0000755000175100001440000000000014770056767016145 5ustar00builderusersopari2-2.0.9/src/opari-lib-dummy/PaxHeaders/getfname.f0000644000000000000000000000013214770056734017544 xustar0030 mtime=1742757340.095533476 30 atime=1742757340.159533085 30 ctime=1742757367.343367395 opari2-2.0.9/src/opari-lib-dummy/getfname.f0000644000175100001440000000221314770056734020072 0ustar00builderusers!> !> This file is part of the Score-P software (http://www.score-p.org) !> !> Copyright (c) 2009-2011, !> RWTH Aachen University, Germany !> !> Copyright (c) 2009-2011, !> Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Dresden, Germany !> !> Copyright (c) 2009-2011, !> University of Oregon, Eugene, USA !> !> Copyright (c) 2009-2011, 2013 !> Forschungszentrum Juelich GmbH, Germany !> !> Copyright (c) 2009-2011, !> German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Muenchen, Germany !> !> This software may be modified and distributed under the terms of !> a BSD-style license. See the COPYING file in the package base !> directory for details. !> @internal !> !> @file getname.f !> !> @brief This file is needed to check the Fortran name mangling of !> the used compiler. foo_foo is called and depending on ! the mangling, this is linked against a c function ! foo_foo_, _foo_foo, ... #include #include static char* header = "/*\n" " * Fortan subroutine external name setup\n" " */\n" "\n" "#define POMP2_Finalize_U POMP2_FINALIZE\n" "#define POMP2_Init_U POMP2_INIT\n" "#define POMP2_Off_U POMP2_OFF\n" "#define POMP2_On_U POMP2_ON\n" "#define POMP2_Atomic_enter_U POMP2_ATOMIC_ENTER\n" "#define POMP2_Atomic_exit_U POMP2_ATOMIC_EXIT\n" "#define POMP2_Implicit_barrier_enter_U POMP2_IMPLICIT_BARRIER_ENTER\n" "#define POMP2_Implicit_barrier_exit_U POMP2_IMPLICIT_BARRIER_EXIT\n" "#define POMP2_Barrier_enter_U POMP2_BARRIER_ENTER\n" "#define POMP2_Barrier_exit_U POMP2_BARRIER_EXIT\n" "#define POMP2_Flush_enter_U POMP2_FLUSH_ENTER\n" "#define POMP2_Flush_exit_U POMP2_FLUSH_EXIT\n" "#define POMP2_Critical_begin_U POMP2_CRITICAL_BEGIN\n" "#define POMP2_Critical_end_U POMP2_CRITICAL_END\n" "#define POMP2_Critical_enter_U POMP2_CRITICAL_ENTER\n" "#define POMP2_Critical_exit_U POMP2_CRITICAL_EXIT\n" "#define POMP2_Do_enter_U POMP2_DO_ENTER\n" "#define POMP2_Do_exit_U POMP2_DO_EXIT\n" "#define POMP2_Master_begin_U POMP2_MASTER_BEGIN\n" "#define POMP2_Master_end_U POMP2_MASTER_END\n" "#define POMP2_Parallel_begin_U POMP2_PARALLEL_BEGIN\n" "#define POMP2_Parallel_end_U POMP2_PARALLEL_END\n" "#define POMP2_Parallel_enter_U POMP2_PARALLEL_ENTER\n" "#define POMP2_Parallel_exit_U POMP2_PARALLEL_EXIT\n" "#define POMP2_Parallel_fork_U POMP2_PARALLEL_FORK\n" "#define POMP2_Parallel_join_U POMP2_PARALLEL_JOIN\n" "#define POMP2_Section_begin_U POMP2_SECTION_BEGIN\n" "#define POMP2_Section_end_U POMP2_SECTION_END\n" "#define POMP2_Section_enter_U POMP2_SECTION_ENTER\n" "#define POMP2_Section_exit_U POMP2_SECTION_EXIT\n" "#define POMP2_Sections_enter_U POMP2_SECTIONS_ENTER\n" "#define POMP2_Sections_exit_U POMP2_SECTIONS_EXIT\n" "#define POMP2_Single_begin_U POMP2_SINGLE_BEGIN\n" "#define POMP2_Single_end_U POMP2_SINGLE_END\n" "#define POMP2_Single_enter_U POMP2_SINGLE_ENTER\n" "#define POMP2_Single_exit_U POMP2_SINGLE_EXIT\n" "#define POMP2_Ordered_begin_U POMP2_ORDERED_BEGIN\n" "#define POMP2_Ordered_end_U POMP2_ORDERED_END\n" "#define POMP2_Ordered_enter_U POMP2_ORDERED_ENTER\n" "#define POMP2_Ordered_exit_U POMP2_ORDERED_EXIT\n" "#define POMP2_Task_begin_U POMP2_TASK_BEGIN\n" "#define POMP2_Task_end_U POMP2_TASK_END\n" "#define POMP2_Task_create_begin_U POMP2_TASK_CREATE_BEGIN\n" "#define POMP2_Task_create_end_U POMP2_TASK_CREATE_END\n" "#define POMP2_Untied_task_begin_U POMP2_UNTIED_TASK_BEGIN\n" "#define POMP2_Untied_task_end_U POMP2_UNTIED_TASK_END\n" "#define POMP2_Untied_task_create_begin_U POMP2_UNTIED_TASK_CREATE_BEGIN\n" "#define POMP2_Untied_task_create_end_U POMP2_UNTIED_TASK_CREATE_END\n" "#define POMP2_Taskwait_begin_U POMP2_TASKWAIT_BEGIN\n" "#define POMP2_Taskwait_end_U POMP2_TASKWAIT_END\n" "#define POMP2_Workshare_enter_U POMP2_WORKSHARE_ENTER\n" "#define POMP2_Workshare_exit_U POMP2_WORKSHARE_EXIT\n" "#define POMP2_Begin_U POMP2_BEGIN\n" "#define POMP2_End_U POMP2_END\n" "#define POMP2_Lib_get_max_threads_U POMP2_LIB_GET_MAX_THREADS\n" "#define POMP2_Init_lock_U POMP2_INIT_LOCK\n" "#define POMP2_Destroy_lock_U POMP2_DESTROY_LOCK\n" "#define POMP2_Set_lock_U POMP2_SET_LOCK\n" "#define POMP2_Unset_lock_U POMP2_UNSET_LOCK\n" "#define POMP2_Test_lock_U POMP2_TEST_LOCK\n" "#define POMP2_Init_nest_lock_U POMP2_INIT_NEST_LOCK\n" "#define POMP2_Destroy_nest_lock_U POMP2_DESTROY_NEST_LOCK\n" "#define POMP2_Set_nest_lock_U POMP2_SET_NEST_LOCK\n" "#define POMP2_Unset_nest_lock_U POMP2_UNSET_NEST_LOCK\n" "#define POMP2_Test_nest_lock_U POMP2_TEST_NEST_LOCK\n" "#define POMP2_Assign_handle_U POMP2_ASSIGN_HANDLE\n" "#define POMP2_USER_Assign_handle_U POMP2_USER_ASSIGN_HANDLE\n" "#define omp_init_lock_U OMP_INIT_LOCK\n" "#define omp_destroy_lock_U OMP_DESTROY_LOCK\n" "#define omp_set_lock_U OMP_SET_LOCK\n" "#define omp_unset_lock_U OMP_UNSET_LOCK\n" "#define omp_test_lock_U OMP_TEST_LOCK\n" "#define omp_init_nest_lock_U OMP_INIT_NEST_LOCK\n" "#define omp_destroy_nest_lock_U OMP_DESTROY_NEST_LOCK\n" "#define omp_set_nest_lock_U OMP_SET_NEST_LOCK\n" "#define omp_unset_nest_lock_U OMP_UNSET_NEST_LOCK\n" "#define omp_test_nest_lock_U OMP_TEST_NEST_LOCK\n" "\n" "#define POMP2_Finalize_L pomp2_finalize\n" "#define POMP2_Init_L pomp2_init\n" "#define POMP2_Off_L pomp2_off\n" "#define POMP2_On_L pomp2_on\n" "#define POMP2_Atomic_enter_L pomp2_atomic_enter\n" "#define POMP2_Atomic_exit_L pomp2_atomic_exit\n" "#define POMP2_Implicit_barrier_enter_L pomp2_implicit_barrier_enter\n" "#define POMP2_Implicit_barrier_exit_L pomp2_implicit_barrier_exit\n" "#define POMP2_Barrier_enter_L pomp2_barrier_enter\n" "#define POMP2_Barrier_exit_L pomp2_barrier_exit\n" "#define POMP2_Flush_enter_L pomp2_flush_enter\n" "#define POMP2_Flush_exit_L pomp2_flush_exit\n" "#define POMP2_Critical_begin_L pomp2_critical_begin\n" "#define POMP2_Critical_end_L pomp2_critical_end\n" "#define POMP2_Critical_enter_L pomp2_critical_enter\n" "#define POMP2_Critical_exit_L pomp2_critical_exit\n" "#define POMP2_Do_enter_L pomp2_do_enter\n" "#define POMP2_Do_exit_L pomp2_do_exit\n" "#define POMP2_Master_begin_L pomp2_master_begin\n" "#define POMP2_Master_end_L pomp2_master_end\n" "#define POMP2_Parallel_begin_L pomp2_parallel_begin\n" "#define POMP2_Parallel_end_L pomp2_parallel_end\n" "#define POMP2_Parallel_enter_L pomp2_parallel_enter\n" "#define POMP2_Parallel_exit_L pomp2_parallel_exit\n" "#define POMP2_Parallel_fork_L pomp2_parallel_fork\n" "#define POMP2_Parallel_join_L pomp2_parallel_join\n" "#define POMP2_Section_begin_L pomp2_section_begin\n" "#define POMP2_Section_end_L pomp2_section_end\n" "#define POMP2_Section_enter_L pomp2_section_enter\n" "#define POMP2_Section_exit_L pomp2_section_exit\n" "#define POMP2_Sections_enter_L pomp2_sections_enter\n" "#define POMP2_Sections_exit_L pomp2_sections_exit\n" "#define POMP2_Single_begin_L pomp2_single_begin\n" "#define POMP2_Single_end_L pomp2_single_end\n" "#define POMP2_Single_enter_L pomp2_single_enter\n" "#define POMP2_Single_exit_L pomp2_single_exit\n" "#define POMP2_Ordered_begin_L pomp2_ordered_begin\n" "#define POMP2_Ordered_end_L pomp2_ordered_end\n" "#define POMP2_Ordered_enter_L pomp2_ordered_enter\n" "#define POMP2_Ordered_exit_L pomp2_ordered_exit\n" "#define POMP2_Task_begin_L pomp2_task_begin\n" "#define POMP2_Task_end_L pomp2_task_end\n" "#define POMP2_Task_create_begin_L pomp2_task_create_begin\n" "#define POMP2_Task_create_end_L pomp2_task_create_end\n" "#define POMP2_Untied_task_begin_L pomp2_untied_task_begin\n" "#define POMP2_Untied_task_end_L pomp2_untied_task_end\n" "#define POMP2_Untied_task_create_begin_L pomp2_untied_task_create_begin\n" "#define POMP2_Untied_task_create_end_L pomp2_untied_task_create_end\n" "#define POMP2_Taskwait_begin_L pomp2_taskwait_begin\n" "#define POMP2_Taskwait_end_L pomp2_taskwait_end\n" "#define POMP2_Workshare_enter_L pomp2_workshare_enter\n" "#define POMP2_Workshare_exit_L pomp2_workshare_exit\n" "#define POMP2_Begin_L pomp2_begin\n" "#define POMP2_End_L pomp2_end\n" "#define POMP2_Lib_get_max_threads_L pomp2_lib_get_max_threads\n" "#define POMP2_Init_lock_L pomp2_init_lock\n" "#define POMP2_Destroy_lock_L pomp2_destroy_lock\n" "#define POMP2_Set_lock_L pomp2_set_lock\n" "#define POMP2_Unset_lock_L pomp2_unset_lock\n" "#define POMP2_Test_lock_L pomp2_test_lock\n" "#define POMP2_Init_nest_lock_L pomp2_init_nest_lock\n" "#define POMP2_Destroy_nest_lock_L pomp2_destroy_nest_lock\n" "#define POMP2_Set_nest_lock_L pomp2_set_nest_lock\n" "#define POMP2_Unset_nest_lock_L pomp2_unset_nest_lock\n" "#define POMP2_Test_nest_lock_L pomp2_test_nest_lock\n" "#define POMP2_Assign_handle_L pomp2_assign_handle\n" "#define POMP2_USER_Assign_handle_L pomp2_user_assign_handle\n" "#define omp_init_lock_L omp_init_lock\n" "#define omp_destroy_lock_L omp_destroy_lock\n" "#define omp_set_lock_L omp_set_lock\n" "#define omp_unset_lock_L omp_unset_lock\n" "#define omp_test_lock_L omp_test_lock\n" "#define omp_init_nest_lock_L omp_init_nest_lock\n" "#define omp_destroy_nest_lock_L omp_destroy_nest_lock\n" "#define omp_set_nest_lock_L omp_set_nest_lock\n" "#define omp_unset_nest_lock_L omp_unset_nest_lock\n" "#define omp_test_nest_lock_L omp_test_nest_lock\n" "\n" "#define XSUFFIX(name) name##_\n" "#define XSUFFIX2(name) name##__\n" "#define XPREFIX(name) _##name\n" "#define XPREFIX2(name) __##name\n" "\n" "#define SUFFIX(name) XSUFFIX(name)\n" "#define SUFFIX2(name) XSUFFIX2(name)\n" "#define PREFIX(name) XPREFIX(name)\n" "#define PREFIX2(name) XPREFIX2(name)\n" "\n" "#define UPCASE(name) name##_U\n" "#define LOWCASE(name) name##_L\n" "\n"; static void generate( char* str ) { FILE* f = fopen( "pomp2_fwrapper_def.h", "w" ); if ( f == NULL ) { perror( "pomp2_fwrapper_def.h" ); exit( 1 ); } fputs( header, f ); fputs( str, f ); fputs( "\n", f ); fclose( f ); } void foo_foo() { generate( "#define FSUB(name) LOWCASE(name)" ); } void foo_foo_() { generate( "#define FSUB(name) SUFFIX(LOWCASE(name))" ); } void foo_foo__() { generate( "#define FSUB(name) SUFFIX2(LOWCASE(name))" ); } void _foo_foo() { generate( "#define FSUB(name) PREFIX(LOWCASE(name))" ); } void __foo_foo() { generate( "#define FSUB(name) PREFIX2(LOWCASE(name))" ); } void _foo_foo_() { generate( "#define FSUB(name) PREFIX(SUFFIX(LOWCASE(name)))" ); } void FOO_FOO() { generate( "#define FSUB(name) UPCASE(name)" ); } void FOO_FOO_() { generate( "#define FSUB(name) SUFFIX(UPCASE(name))" ); } void FOO_FOO__() { generate( "#define FSUB(name) SUFFIX2(UPCASE(name))" ); } void _FOO_FOO() { generate( "#define FSUB(name) PREFIX(UPCASE(name))" ); } void __FOO_FOO() { generate( "#define FSUB(name) PREFIX2(UPCASE(name))" ); } void _FOO_FOO_() { generate( "#define FSUB(name) PREFIX(SUFFIX(UPCASE(name)))" ); } opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/pomp2_fwrapper_base.h0000644000000000000000000000013214770056734021715 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.339367419 opari2-2.0.9/src/opari-lib-dummy/pomp2_fwrapper_base.h0000644000175100001440000000274214770056734022252 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. */ #include #include "pomp2_fwrapper_def.h" #ifndef POMP2_FWRAPPER_BASE_H #define POMP2_FWRAPPER_BASE_H extern void FSUB( omp_init_lock )( omp_lock_t* s ); extern void FSUB( omp_destroy_lock )( omp_lock_t* s ); extern void FSUB( omp_set_lock )( omp_lock_t* s ); extern void FSUB( omp_unset_lock )( omp_lock_t* s ); extern int FSUB( omp_test_lock )( omp_lock_t* s ); extern void FSUB( omp_init_nest_lock )( omp_nest_lock_t* s ); extern void FSUB( omp_destroy_nest_lock )( omp_nest_lock_t* s ); extern void FSUB( omp_set_nest_lock )( omp_nest_lock_t* s ); extern void FSUB( omp_unset_nest_lock )( omp_nest_lock_t* s ); extern int FSUB( omp_test_nest_lock )( omp_nest_lock_t* s ); #endif opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/pomp2_fwrapper_base.c0000644000000000000000000000013214770056734021710 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.335367443 opari2-2.0.9/src/opari-lib-dummy/pomp2_fwrapper_base.c0000644000175100001440000001062514770056734022244 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file pomp2_fwrapper_base.c * * * @brief Basic fortan wrappers calling the C versions.*/ #include #include #include #include "pomp2_fwrapper_base.h" #include #include #include "pomp2_fwrapper_def.h" extern int pomp2_tracing; /* *INDENT-OFF* */ void FSUB(POMP2_Finalize)() { POMP2_Finalize(); } void FSUB(POMP2_Init)() { POMP2_Init(); } void FSUB(POMP2_Off)() { pomp2_tracing = 0; } void FSUB(POMP2_On)() { pomp2_tracing = 1; } void FSUB(POMP2_Begin)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Begin(regionHandle, ctc_string); } void FSUB(POMP2_End)(POMP2_Region_handle* regionHandle) { POMP2_End(regionHandle); } /* *INDENT-OFF* */ /* *---------------------------------------------------------------- * Fortran Wrapper for OpenMP API ******---------------------------------------------------------------- */ /* *INDENT-OFF* */ #if defined(__ICC) || defined(__ECC) || defined(_SX) #define CALLFSUB(a) a #else #define CALLFSUB(a) FSUB(a) #endif void FSUB(POMP2_Init_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: init lock\n", omp_get_thread_num()); } CALLFSUB(omp_init_lock)(s); } void FSUB(POMP2_Destroy_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: destroy lock\n", omp_get_thread_num()); } CALLFSUB(omp_destroy_lock)(s); } void FSUB(POMP2_Set_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: set lock\n", omp_get_thread_num()); } CALLFSUB(omp_set_lock)(s); } void FSUB(POMP2_Unset_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: unset lock\n", omp_get_thread_num()); } CALLFSUB(omp_unset_lock)(s); } int FSUB(POMP2_Test_lock)(omp_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: test lock\n", omp_get_thread_num()); } return CALLFSUB(omp_test_lock)(s); } #ifndef __osf__ void FSUB(POMP2_Init_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: init nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_init_nest_lock)(s); } void FSUB(POMP2_Destroy_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: destroy nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_destroy_nest_lock)(s); } void FSUB(POMP2_Set_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: set nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_set_nest_lock)(s); } void FSUB(POMP2_Unset_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: unset nestlock\n", omp_get_thread_num()); } CALLFSUB(omp_unset_nest_lock)(s); } int FSUB(POMP2_Test_nest_lock)(omp_nest_lock_t *s) { if ( pomp2_tracing ) { fprintf(stderr, "%3d: test nestlock\n", omp_get_thread_num()); } return CALLFSUB(omp_test_nest_lock)(s); } #endif opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/pomp2_fwrapper.c0000644000000000000000000000013214770056734020716 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.335367443 opari2-2.0.9/src/opari-lib-dummy/pomp2_fwrapper.c0000644000175100001440000002440414770056734021252 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file pomp2_fwrapper.c * * @brief This file contains fortran wrapper functions.*/ #include #include #include #include #include #include #include "pomp2_fwrapper_def.h" /* * Fortran wrappers calling the C versions */ /* *INDENT-OFF* */ void FSUB(POMP2_Atomic_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Atomic_enter(regionHandle, ctc_string); } void FSUB(POMP2_Atomic_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Atomic_exit(regionHandle ); } void FSUB(POMP2_Implicit_barrier_enter)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task) { POMP2_Implicit_barrier_enter( regionHandle, pomp2_old_task ); } void FSUB(POMP2_Implicit_barrier_exit)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task) { POMP2_Implicit_barrier_exit( regionHandle, *pomp2_old_task ); } void FSUB(POMP2_Barrier_enter)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task, char* ctc_string) { POMP2_Barrier_enter( regionHandle, pomp2_old_task, ctc_string); } void FSUB(POMP2_Barrier_exit)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ) { POMP2_Barrier_exit( regionHandle, *pomp2_old_task ); } void FSUB(POMP2_Flush_enter)(POMP2_Region_handle* regionHandle, char* ctc_string ) { POMP2_Flush_enter(regionHandle, ctc_string ); } void FSUB(POMP2_Flush_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Flush_exit(regionHandle ); } void FSUB(POMP2_Critical_begin)(POMP2_Region_handle* regionHandle ) { POMP2_Critical_begin(regionHandle ); } void FSUB(POMP2_Critical_end)(POMP2_Region_handle* regionHandle ) { POMP2_Critical_end(regionHandle ); } void FSUB(POMP2_Critical_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Critical_enter(regionHandle, ctc_string); } void FSUB(POMP2_Critical_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Critical_exit(regionHandle ); } void FSUB(POMP2_Do_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_For_enter(regionHandle, ctc_string); } void FSUB(POMP2_Do_exit)(POMP2_Region_handle* regionHandle ) { POMP2_For_exit(regionHandle ); } void FSUB(POMP2_Parallel_begin)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* newTask, char* ctc_string ){ POMP2_Parallel_begin(regionHandle); } void FSUB(POMP2_Parallel_end)(POMP2_Region_handle* regionHandle) { POMP2_Parallel_end(regionHandle); } void FSUB(POMP2_Master_begin)(POMP2_Region_handle* regionHandle, char* ctc_string ) { POMP2_Master_begin(regionHandle, ctc_string ); } void FSUB(POMP2_Master_end)(POMP2_Region_handle* regionHandle ) { POMP2_Master_end(regionHandle ); } void FSUB(POMP2_Parallel_fork)(POMP2_Region_handle* regionHandle, int* if_clause, int* num_threads, POMP2_Task_handle* pomp2_old_task, char* ctc_string) { POMP2_Parallel_fork(regionHandle, *if_clause, *num_threads, pomp2_old_task, "dummy"); } void FSUB(POMP2_Parallel_join)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ) { POMP2_Parallel_join(regionHandle, *pomp2_old_task ); } void FSUB(POMP2_Section_begin)(POMP2_Region_handle* regionHandle, char* ctc_string ) { POMP2_Section_begin(regionHandle, ctc_string ); } void FSUB(POMP2_Section_end)(POMP2_Region_handle* regionHandle ) { POMP2_Section_end(regionHandle ); } void FSUB(POMP2_Sections_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Sections_enter(regionHandle, ctc_string); } void FSUB(POMP2_Sections_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Sections_exit(regionHandle ); } void FSUB(POMP2_Single_begin)(POMP2_Region_handle* regionHandle ) { POMP2_Single_begin(regionHandle ); } void FSUB(POMP2_Single_end)(POMP2_Region_handle* regionHandle ) { POMP2_Single_end(regionHandle ); } void FSUB(POMP2_Single_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Single_enter(regionHandle, ctc_string); } void FSUB(POMP2_Ordered_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Ordered_exit(regionHandle ); } void FSUB(POMP2_Ordered_begin)(POMP2_Region_handle* regionHandle ) { POMP2_Ordered_begin(regionHandle ); } void FSUB(POMP2_Ordered_end)(POMP2_Region_handle* regionHandle ) { POMP2_Ordered_end(regionHandle ); } void FSUB(POMP2_Ordered_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Ordered_enter(regionHandle, ctc_string); } void FSUB(POMP2_Single_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Single_exit(regionHandle ); } void FSUB(POMP2_Task_create_begin)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int* pomp2_if, char* ctc_string){ POMP2_Task_create_begin(regionHandle, pomp2_new_task, pomp2_old_task, *pomp2_if, ctc_string); } void FSUB(POMP2_Task_create_end)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ){ POMP2_Task_create_end(regionHandle, *pomp2_old_task); } void FSUB(POMP2_Task_begin)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task ){ POMP2_Task_begin(regionHandle, *pomp2_new_task); } void FSUB(POMP2_Task_end)(POMP2_Region_handle* regionHandle){ POMP2_Task_end(regionHandle); } void FSUB(POMP2_Untied_task_create_begin)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int* pomp2_if, char* ctc_string){ POMP2_Task_create_begin(regionHandle, pomp2_new_task, pomp2_old_task, *pomp2_if, ctc_string); } void FSUB(POMP2_Untied_task_create_end)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ){ POMP2_Task_create_end(regionHandle, *pomp2_old_task); } void FSUB(POMP2_Untied_task_begin)( POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_new_task ){ POMP2_Task_begin(regionHandle, *pomp2_new_task); } void FSUB(POMP2_Untied_task_end)(POMP2_Region_handle* regionHandle){ POMP2_Task_end(regionHandle); } void FSUB(POMP2_Taskwait_begin)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task, char* ctc_string ){ POMP2_Taskwait_begin(regionHandle, pomp2_old_task, ctc_string ); } void FSUB(POMP2_Taskwait_end)(POMP2_Region_handle* regionHandle, POMP2_Task_handle* pomp2_old_task ){ POMP2_Taskwait_end(regionHandle, *pomp2_old_task); } void FSUB(POMP2_Workshare_enter)(POMP2_Region_handle* regionHandle, char* ctc_string) { POMP2_Workshare_enter(regionHandle, ctc_string); } void FSUB(POMP2_Workshare_exit)(POMP2_Region_handle* regionHandle ) { POMP2_Workshare_exit(regionHandle ); } void FSUB(POMP2_Assign_handle)(POMP2_Region_handle* regionHandle, char* ctc_string, int ctc_string_len) { char *str; str=(char*) malloc((ctc_string_len+1)*sizeof(char)); strncpy(str,ctc_string,ctc_string_len); str[ctc_string_len]='\0'; POMP2_Assign_handle(regionHandle,str); free(str); } void FSUB(POMP2_USER_Assign_handle)(POMP2_Region_handle* regionHandle, char* ctc_string, int ctc_string_len) { char *str; str=(char*) malloc((ctc_string_len+1)*sizeof(char)); strncpy(str,ctc_string,ctc_string_len); str[ctc_string_len]='\0'; POMP2_USER_Assign_handle(regionHandle,str); free(str); } /* *---------------------------------------------------------------- * Wrapper for omp_get_max_threads used in instrumentation * * In Fortran a wrapper function * pomp2_get_max_threads() is used, since it is not possible to * ensure, that omp_get_max_threads is not used in the user * program. We would need to parse much more of the Fortran * Syntax to detect these cases. The Wrapper function avoids * double definition of this function and avoids errors. * ******---------------------------------------------------------------- */ int FSUB(POMP2_Lib_get_max_threads)(void) { return omp_get_max_threads(); } opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/pomp2_user_region_info.h0000644000000000000000000000013214770056734022431 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.335367443 opari2-2.0.9/src/opari-lib-dummy/pomp2_user_region_info.h0000644000175100001440000001065214770056734022765 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_USER_REGION_INFO_H #define POMP2_USER_REGION_INFO_H /** * @file pomp2_user_region_info.h * @date Started Tue Apr 1 2014 * * @brief This file contains function declarations and structs which * handle informations on user defined regions. POMP2_USER_Region_info * is used to store these informations. It can be filled with a * ctcString by ctcString2UserRegionInfo(). * */ #include "opari2_region_info.h" #include /** * POMP2_USER_Region_type * */ typedef enum { POMP2_USER_no_type = 0, POMP2_USER_Region } POMP2_USER_Region_type; /** converts regionType into a string * @param regionType The regionType to be converted. * @return string representation of the region type*/ const char* pomp2UserRegionType2String( POMP2_USER_Region_type regionType ); /** * @brief This struct stores all information on a user defined * region, like the name or corresponding source lines. The function * ctcString2UserRegionInfo() can be used to fill this struct with data * from a ctcString. */ typedef struct { /** @name Generic source code information attributes */ /*@{*/ /** source location info. Needs to be first for the typecasting from generic OPARI2_Region_info to work. */ OPARI2_REGION_INFO /** @name Type of the OpenMP region*/ POMP2_USER_Region_type mRegionType; /*@}*/ /** @name Attributes for user region types */ /*@{*/ /** name of a user defined region*/ char* mUserRegionName; /*@}*/ } POMP2_USER_Region_info; /** CTC Tokens */ #define CTC_USER_REGION_TOKENS \ CTC_USER_Region_name #define CTC_USER_REGION_TOKEN_MAP_ENTRIES \ { "userRegionName", CTC_USER_Region_name } /** * ctcString2UserRegionInfo() fills the POMP2_USER_Region_info object with data read * from the ctcString. If the ctcString does not comply with the * specification, the program aborts with exit code 1. * * @n Rationale: ctcString2UserRegionInfo() is used during * initialization of the measurement system. If an error occurs, it is * better to abort than to struggle with undefined behaviour or @e * guessing the meaning of the broken string. * * @note Can be called from multiple threads concurrently, assuming malloc is * thread-safe. * * @note ctcString2UserRegionInfo() will assign memory to the members of @e * regionInfo. You are supposed to to release this memory by calling * freePOMP2UserRegionInfoMembers(). * * @param ctcString A string in the format * "length*key=value*[key=value]*". The length field is parsed but not * used by this implementation. Possible values for key are listed in * ctcTokenMap. The string must at least contain values for the keys * @c regionType, @c sscl and @c escl. Possible values for the key @c * regionType are listed in regionTypesMap. The format for @c sscl * resp. @c escl values is @c "filename:lineNo1:lineNo2". * * @param regionInfo must be a valid object * * @post At least the required attributes (see POMP2_USER_Region_info) are * set. * @n If @c regionType=userRegion then * POMP2_USER_Region_info::mUserRegionName has a value != 0. * */ void ctcString2UserRegionInfo( const char ctcString[], POMP2_USER_Region_info* regionInfo ); /** * Free the memory of the regionInfo members. * @param regionInfo The regioninfo to be freed. */ void freePOMP2UserRegionInfoMembers( POMP2_USER_Region_info* regionInfo ); #endif /* POMP2_USER_REGION_INFO_H */ opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/pomp2_user_region_info.c0000644000000000000000000000013214770056734022424 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.331367468 opari2-2.0.9/src/opari-lib-dummy/pomp2_user_region_info.c0000644000175100001440000001212414770056734022754 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** * @file pomp2_user_region_info.c * @date Started Tue Apr 1 2014 * * @brief * */ #include #include "opari2_ctc_parser.h" #include "opari2_ctc_token.h" #include "pomp2_user_region_info.h" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ static void checkUSERConsistency( CTCData* obj ); static void initUserRegionInfo( POMP2_USER_Region_info* obj ); bool checkCTCTokenAndAssignUserRegionInfoValues( int ctctoken, char* value, CTCData* obj ); void ctcString2UserRegionInfo( const char string[], POMP2_USER_Region_info* regionInfo ) { assert( regionInfo ); CTCData ctcData; ctcData.mRegionInfo = ( OPARI2_Region_info* )regionInfo; initUserRegionInfo( regionInfo ); OPARI2_CTC_initCTCData( &ctcData, string ); OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues ( &ctcData, checkCTCTokenAndAssignUserRegionInfoValues ); checkUSERConsistency( &ctcData ); OPARI2_CTC_freeCTCData( &ctcData ); } static void initUserRegionInfo( POMP2_USER_Region_info* obj ) { obj->mRegionType = ( POMP2_USER_Region_type )POMP2_USER_no_type; obj->mUserRegionName = 0; } static void assignUserRegionType( CTCData* obj, const char* value ); bool checkCTCTokenAndAssignUserRegionInfoValues( int ctctoken, char* value, CTCData* obj ) { POMP2_USER_Region_info* regionInfo = ( POMP2_USER_Region_info* )obj->mRegionInfo; switch ( ctctoken ) { case CTC_Region_type: assignUserRegionType( obj, value ); return true; case CTC_USER_Region_name: OPARI2_CTC_assignString( ®ionInfo->mUserRegionName, value ); return true; } return false; } /*----------------------------------------------------------------------------*/ /** @brief map with region types (really short but exactly like the other paradigms) */ static const OPARI2_CTCMapType userRegionTypesMap[] = { { "userRegion", POMP2_USER_Region } }; static void assignUserRegionType( CTCData* obj, const char* value ) { POMP2_USER_Region_info* regionInfo = ( POMP2_USER_Region_info* )obj->mRegionInfo; regionInfo->mRegionType = ( POMP2_USER_Region_type )OPARI2_CTC_string2Enum( userRegionTypesMap, OPARI2_CTC_MAP_SIZE( userRegionTypesMap ), value ); if ( regionInfo->mRegionType == POMP2_No_type ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_region_type, value ); } } const char* pomp2UserRegionType2String( POMP2_USER_Region_type regionType ) { if ( regionType ) { return OPARI2_CTC_enum2String( userRegionTypesMap, OPARI2_CTC_MAP_SIZE( userRegionTypesMap ), regionType ); } return "no valid region type"; } /*----------------------------------------------------------------------------*/ static void checkUSERConsistency( CTCData* obj ) { bool requiredAttributesFound; POMP2_USER_Region_info* regionInfo = ( POMP2_USER_Region_info* )obj->mRegionInfo; OPARI2_CTC_checkConsistency( obj ); if ( regionInfo->mRegionType == POMP2_USER_no_type ) { OPARI2_CTC_error( obj, CTC_ERROR_No_region_type, 0 ); return; } if ( regionInfo->mRegionType == POMP2_USER_Region && regionInfo->mUserRegionName == 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_User_region_name_missing, 0 ); return; } } /*----------------------------------------------------------------------------*/ void freePOMP2UserRegionInfoMembers( POMP2_USER_Region_info* regionInfo ) { OPARI2_CTC_freeAndReset( ®ionInfo->mUserRegionName ); } opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/pomp2_region_info.h0000644000000000000000000000013214770056734021373 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.331367468 opari2-2.0.9/src/opari-lib-dummy/pomp2_region_info.h0000644000175100001440000002222414770056734021725 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef POMP2_REGION_INFO_H #define POMP2_REGION_INFO_H /** * @file pomp2_region_info.h * @date Started Fri Mar 20 16:30:45 2009 * * @brief This file contains function declarations and structs * which handle informations on OpenMP regions. POMP2_Region_info * is used to store these informations. It can be filled with a * ctcString by ctcString2RegionInfo(). * */ #include "opari2_region_info.h" #include /** * POMP2_Region_type * */ typedef enum /* POMP2_Region_type */ { POMP2_No_type = 0, POMP2_Atomic, POMP2_Barrier, POMP2_Critical, POMP2_Do, POMP2_Flush, POMP2_For, POMP2_Master, POMP2_Ordered, POMP2_Parallel, POMP2_Parallel_do, POMP2_Parallel_for, POMP2_Parallel_sections, POMP2_Parallel_workshare, POMP2_Sections, POMP2_Single, POMP2_Task, POMP2_Taskuntied, POMP2_Taskwait, POMP2_Workshare } POMP2_Region_type; /** converts regionType into a string * @param regionType The regionType to be converted. * @return string representation of the region type*/ const char* pomp2RegionType2String( POMP2_Region_type regionType ); /** * type to store the scheduling type of a for worksharing constuct * */ typedef enum { POMP2_No_schedule = 0, POMP2_Static, /* needs chunk size */ POMP2_Dynamic, /* needs chunk size */ POMP2_Guided, /* needs chunk size */ POMP2_Runtime, POMP2_Auto } POMP2_Schedule_type; /** converts scheduleType into a string * @param scheduleType The scheduleType to be converted. * @return string representation of the scheduleType*/ const char* pomp2ScheduleType2String( POMP2_Schedule_type scheduleType ); /** * type to store the default value data sharing * */ typedef enum { POMP2_No_defaultSharing = 0, POMP2_None, POMP2_Shared, POMP2_Private, POMP2_Firstprivate } POMP2_DefaultSharing_type; /** converts defaultSharingType into a string * @param defaultSharingType The defaultSharingType to be converted. * @return string representation of the defaultSharingType*/ const char* pomp2defaultSharingType2String( POMP2_DefaultSharing_type defaultSharingType ); /** * @brief This struct stores all information on an OpenMP region, like the * region type or corresponding source lines. The function * ctcString2RegionInfo() can be used to fill this struct with data * from a ctcString. */ typedef struct { /** @name Generic source code information attributes */ //@{ /** Source location info. Needs to be first for the typecasting * from generic OPARI2_Region_info to work. It is included by use * of the macro OPARI2_REGION_INFO to ensure typecasting when * necessary */ OPARI2_REGION_INFO //@} /** OpenMP specific fields */ //@{ /** Type of the OpenMP region*/ POMP2_Region_type mRegionType; /**true if a copyin clause is present*/ bool mHasCopyIn; /**true if a copyprivate clause is present*/ bool mHasCopyPrivate; /**true if an if clause is present*/ bool mHasIf; /**true if a firstprivate clause is present*/ bool mHasFirstPrivate; /**true if a lastprivate clause is present*/ bool mHasLastPrivate; /**true if a nowait clause is present*/ bool mHasNoWait; /**true if a numThreads clause is present*/ bool mHasNumThreads; /**true if an ordered clause is present*/ bool mHasOrdered; /**true if a reduction clause is present*/ bool mHasReduction; /**true if a shared clause is present*/ bool mHasShared; /**true if a collapse clause is present*/ bool mHasCollapse; /**true if a untied clause was present, even if the task was changed to tied during instrumentation.*/ bool mHasUntied; /** schedule type in the schedule clause*/ POMP2_Schedule_type mScheduleType; /** defaultSharing type in the defaultSharing clause*/ POMP2_DefaultSharing_type mDefaultSharingType; /** user group name*/ char* mUserGroupName; /** number of sections*/ unsigned mNumSections; /** name of a named critical region*/ char* mCriticalName; //@} } POMP2_Region_info; /** CTC Tokens */ #define CTC_OMP_TOKENS \ CTC_OMP_Has_copy_in, \ CTC_OMP_Has_copy_private, \ CTC_OMP_Has_defaultSharing, \ CTC_OMP_Has_first_private, \ CTC_OMP_Has_last_private, \ CTC_OMP_Has_no_wait, \ CTC_OMP_Has_ordered, \ CTC_OMP_Has_reduction, \ CTC_OMP_Has_schedule, \ CTC_OMP_Has_shared, \ CTC_OMP_Num_sections, \ CTC_OMP_Critical_name, \ CTC_OMP_User_group_name, \ CTC_OMP_Has_if, \ CTC_OMP_Has_collapse, \ CTC_OMP_Has_num_threads, \ CTC_OMP_Has_untied #define CTC_OPENMP_TOKEN_MAP_ENTRIES \ { "criticalName", CTC_OMP_Critical_name }, \ { "hasCollapse", CTC_OMP_Has_collapse }, \ { "hasCopyIn", CTC_OMP_Has_copy_in }, \ { "hasCopyPrivate", CTC_OMP_Has_copy_private }, \ { "hasDefault", CTC_OMP_Has_defaultSharing }, \ { "hasFirstPrivate", CTC_OMP_Has_first_private }, \ { "hasIf", CTC_OMP_Has_if }, \ { "hasLastPrivate", CTC_OMP_Has_last_private }, \ { "hasNowait", CTC_OMP_Has_no_wait }, \ { "hasNum_threads", CTC_OMP_Has_num_threads }, \ { "hasOrdered", CTC_OMP_Has_ordered }, \ { "hasReduction", CTC_OMP_Has_reduction }, \ { "hasSchedule", CTC_OMP_Has_schedule }, \ { "hasShared", CTC_OMP_Has_shared }, \ { "hasUntied", CTC_OMP_Has_untied }, \ { "numSections", CTC_OMP_Num_sections }, \ { "userGroupName", CTC_OMP_User_group_name } /** * ctcString2RegionInfo() fills the POMP2_Region_info object with data read * from the ctcString. If the ctcString does not comply with the * specification, the program aborts with exit code 1. * * @n Rationale: ctcString2RegionInfo() is used during initialization * of the measurement system. If an error occurs, it is better to * abort than to struggle with undefined behaviour or @e guessing the * meaning of the broken string. * * @note Can be called from multiple threads concurrently, assuming malloc is * thread-safe. * * @note ctcString2RegionInfo() will assign memory to the members of @e * regionInfo. You are supposed to to release this memory by calling * freePOMP2RegionInfoMembers(). * * @param ctcString A string in the format * "length*key=value*[key=value]*". The length field is parsed but not used by * this implementation. Possible values for key are listed in * ctcTokenMap. The string must at least contain values for the keys @c * regionType, @c sscl and @c escl. Possible values for the key @c regionType * are listed in regionTypesMap. The format for @c sscl resp. @c escl values * is @c "filename:lineNo1:lineNo2". * * @param regionInfo must be a valid object * * @post At least the required attributes (see POMP2_Region_info) are set. * @n All other members of @e regionInfo are set to 0 resp. false * resp. POMP2_No_schedule. * @n If @c regionType=sections than POMP2_Region_info::mNumSections * has a value > 0. * @n If @c regionType=critical than POMP2_Region_info::mCriticalName * may have a value != 0. * */ void ctcString2RegionInfo( const char ctcString[], POMP2_Region_info* regionInfo ); /** * Free the memory of the regionInfo members. * @param regionInfo The regioninfo to be freed. */ void freePOMP2RegionInfoMembers( POMP2_Region_info* regionInfo ); #endif /* POMP2_REGION_INFO_H */ opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/pomp2_region_info.c0000644000000000000000000000013214770056734021366 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.331367468 opari2-2.0.9/src/opari-lib-dummy/pomp2_region_info.c0000644000175100001440000003233614770056734021725 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013, 2014 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** * @file pomp2_region_info.c * @date Started Fri Mar 20 16:59:41 2009 * * @brief * */ #include #include "opari2_ctc_parser.h" #include "opari2_ctc_token.h" #include "pomp2_region_info.h" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ static void checkOMPConsistency( CTCData* obj ); static void initOpenmpRegionInfo( POMP2_Region_info* obj ); bool checkCTCTokenAndAssignRegionInfoValues( int ctctoken, char* value, CTCData* obj ); void ctcString2RegionInfo( const char string[], POMP2_Region_info* regionInfo ) { assert( regionInfo ); CTCData ctcData; ctcData.mRegionInfo = ( OPARI2_Region_info* )regionInfo; initOpenmpRegionInfo( regionInfo ); OPARI2_CTC_initCTCData( &ctcData, string ); OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues ( &ctcData, checkCTCTokenAndAssignRegionInfoValues ); checkOMPConsistency( &ctcData ); OPARI2_CTC_freeCTCData( &ctcData ); } static void initOpenmpRegionInfo( POMP2_Region_info* obj ) { obj->mRegionType = POMP2_No_type; obj->mHasCollapse = false; obj->mHasCopyIn = false; obj->mHasCopyPrivate = false; obj->mHasFirstPrivate = false; obj->mHasIf = false; obj->mHasLastPrivate = false; obj->mHasNoWait = false; obj->mHasNumThreads = false; obj->mHasOrdered = false; obj->mHasReduction = false; obj->mHasUntied = false; obj->mScheduleType = POMP2_No_schedule; obj->mNumSections = 0; obj->mCriticalName = 0; obj->mUserGroupName = 0; } static void assignRegionType( CTCData* obj, const char* value ); static void assignScheduleType( CTCData* obj, char* restrict value ); static void assignDefaultSharingType( CTCData* obj, char* restrict value ); bool checkCTCTokenAndAssignRegionInfoValues( int ctctoken, char* value, CTCData* obj ) { POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; switch ( ctctoken ) { case CTC_Region_type: assignRegionType( obj, value ); return true; case CTC_OMP_Has_copy_in: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasCopyIn, value ); return true; case CTC_OMP_Has_copy_private: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasCopyPrivate, value ); return true; case CTC_OMP_Has_first_private: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasFirstPrivate, value ); return true; case CTC_OMP_Has_if: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasIf, value ); return true; case CTC_OMP_Has_last_private: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasLastPrivate, value ); return true; case CTC_OMP_Has_no_wait: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasNoWait, value ); return true; case CTC_OMP_Has_num_threads: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasNumThreads, value ); return true; case CTC_OMP_Has_ordered: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasOrdered, value ); return true; case CTC_OMP_Has_reduction: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasReduction, value ); return true; case CTC_OMP_Has_collapse: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasCollapse, value ); return true; case CTC_OMP_Has_untied: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasUntied, value ); return true; case CTC_OMP_Has_schedule: assignScheduleType( obj, value ); return true; case CTC_OMP_Has_defaultSharing: assignDefaultSharingType( obj, value ); return true; case CTC_OMP_Has_shared: OPARI2_CTC_assignHasClause( obj, ®ionInfo->mHasShared, value ); return true; case CTC_OMP_Num_sections: OPARI2_CTC_assignUnsigned( obj, ®ionInfo->mNumSections, value ); return true; case CTC_OMP_Critical_name: OPARI2_CTC_assignString( ®ionInfo->mCriticalName, value ); return true; case CTC_OMP_User_group_name: OPARI2_CTC_assignString( ®ionInfo->mUserGroupName, value ); return true; } return false; } /*----------------------------------------------------------------------------*/ /** @brief map with region types*/ static const OPARI2_CTCMapType regionTypesMap[] = { { "atomic", POMP2_Atomic }, { "barrier", POMP2_Barrier }, { "critical", POMP2_Critical }, { "do", POMP2_Do }, { "flush", POMP2_Flush }, { "for", POMP2_For }, { "master", POMP2_Master }, { "ordered", POMP2_Ordered }, { "parallel", POMP2_Parallel }, { "paralleldo", POMP2_Parallel_do }, { "parallelfor", POMP2_Parallel_for }, { "parallelsections", POMP2_Parallel_sections }, { "parallelworkshare", POMP2_Parallel_workshare }, { "sections", POMP2_Sections }, { "single", POMP2_Single }, { "task", POMP2_Task }, { "taskuntied", POMP2_Taskuntied }, { "taskwait", POMP2_Taskwait }, { "workshare", POMP2_Workshare } }; static void assignRegionType( CTCData* obj, const char* value ) { POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; regionInfo->mRegionType = ( POMP2_Region_type )OPARI2_CTC_string2Enum( regionTypesMap, OPARI2_CTC_MAP_SIZE( regionTypesMap ), value ); if ( regionInfo->mRegionType == POMP2_No_type ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_region_type, value ); } } const char* pomp2RegionType2String( POMP2_Region_type regionType ) { if ( regionType ) { return OPARI2_CTC_enum2String( regionTypesMap, OPARI2_CTC_MAP_SIZE( regionTypesMap ), regionType ); } return "no valid region type"; } /*----------------------------------------------------------------------------*/ /** @brief map with schedule types*/ static const OPARI2_CTCMapType scheduleTypesMap[] = { { "auto", POMP2_Auto }, { "dynamic", POMP2_Dynamic }, { "guided", POMP2_Guided }, { "runtime", POMP2_Runtime }, { "static", POMP2_Static } }; /** @brief returns a string of the schedule type*/ const char* pomp2ScheduleType2String( POMP2_Schedule_type scheduleType ) { if ( scheduleType ) { return OPARI2_CTC_enum2String( scheduleTypesMap, OPARI2_CTC_MAP_SIZE( scheduleTypesMap ), scheduleType ); } return "no valid schedule type"; } static void assignScheduleType( CTCData* obj, char* restrict value ) { char* token = NULL; POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; token = strtok( value, "," ); if ( token ) { regionInfo->mScheduleType = ( POMP2_Schedule_type )OPARI2_CTC_string2Enum( scheduleTypesMap, OPARI2_CTC_MAP_SIZE( scheduleTypesMap ), value ); } else { regionInfo->mScheduleType = ( POMP2_Schedule_type )OPARI2_CTC_string2Enum( scheduleTypesMap, OPARI2_CTC_MAP_SIZE( scheduleTypesMap ), value ); } if ( regionInfo->mScheduleType == POMP2_No_schedule ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_schedule_type, value ); } } /*----------------------------------------------------------------------------*/ /** @brief map with defaultSharing types*/ static const OPARI2_CTCMapType defaultSharingTypesMap[] = { { "none", POMP2_None }, { "shared", POMP2_Shared }, { "private", POMP2_Private }, { "firstprivate", POMP2_Firstprivate } }; /** @brief returns a string of the defaultSharing type*/ const char* pomp2DefaultSharingType2String( POMP2_DefaultSharing_type defaultSharingType ) { if ( defaultSharingType ) { return OPARI2_CTC_enum2String( defaultSharingTypesMap, OPARI2_CTC_MAP_SIZE( defaultSharingTypesMap ), defaultSharingType ); } return "no valid defaultSharing type"; } static void assignDefaultSharingType( CTCData* obj, char* restrict value ) { char* token = NULL; POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; token = strtok( value, "," ); if ( token ) { regionInfo->mDefaultSharingType = ( POMP2_DefaultSharing_type )OPARI2_CTC_string2Enum( defaultSharingTypesMap, OPARI2_CTC_MAP_SIZE( defaultSharingTypesMap ), value ); } else { regionInfo->mDefaultSharingType = ( POMP2_DefaultSharing_type )OPARI2_CTC_string2Enum( defaultSharingTypesMap, OPARI2_CTC_MAP_SIZE( defaultSharingTypesMap ), value ); } if ( regionInfo->mDefaultSharingType == POMP2_No_defaultSharing ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_default_sharing_type, value ); } } /*----------------------------------------------------------------------------*/ static void checkOMPConsistency( CTCData* obj ) { bool requiredAttributesFound; POMP2_Region_info* regionInfo = ( POMP2_Region_info* )obj->mRegionInfo; OPARI2_CTC_checkConsistency( obj ); if ( regionInfo->mRegionType == POMP2_No_type ) { OPARI2_CTC_error( obj, CTC_ERROR_No_region_type, 0 ); return; } if ( regionInfo->mRegionType == POMP2_Sections && regionInfo->mNumSections <= 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Num_sections_invalid, 0 ); return; } /* A barrier, taskwait and flush does not have an end line number, since it * is not associated to a region.*/ if ( obj->mRegionInfo->mStartLine2 > obj->mRegionInfo->mEndLine1 && regionInfo->mRegionType != POMP2_Barrier && regionInfo->mRegionType != POMP2_Taskwait && regionInfo->mRegionType != POMP2_Flush ) { OPARI2_CTC_error( obj, CTC_ERROR_Inconsistent_line_numbers, 0 ); return; } } /*----------------------------------------------------------------------------*/ void freePOMP2RegionInfoMembers( POMP2_Region_info* regionInfo ) { OPARI2_CTC_freeAndReset( ®ionInfo->mCriticalName ); OPARI2_CTC_freeAndReset( ®ionInfo->mUserGroupName ); } opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/opari2_region_info.h0000644000000000000000000000013214770056734021532 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.327367492 opari2-2.0.9/src/opari-lib-dummy/opari2_region_info.h0000644000175100001440000000436614770056734022073 0ustar00builderusers/**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef OPARI2_REGION_INFO_H #define OPARI2_REGION_INFO_H /** * @file opari2_region_info.h * @date Started Tue Mar 25 2014 * * @brief * */ #define OPARI2_REGION_INFO \ /** name of the corresponding source file from the opening pragma */ \ char* mStartFileName; \ /** line number of the first line from the opening pragma */ \ unsigned mStartLine1; \ /** line number of the last line from the opening pragma */ \ unsigned mStartLine2; \ /** name of the corresponding source file from the closing pragma */ \ char* mEndFileName; \ /** line number of the first line from the closing pragma */ \ unsigned mEndLine1; \ /** line number of the last line from the closing pragma */ \ unsigned mEndLine2; #define CTC_REGION_TOKENS \ CTC_End_source_code_location, \ CTC_Start_source_code_location, \ CTC_Region_type #define CTC_REGION_TOKEN_MAP_ENTRIES \ { "escl", CTC_End_source_code_location }, \ { "sscl", CTC_Start_source_code_location }, \ { "regionType", CTC_Region_type } /** * @brief This struct stores all information on OPARI2 regions */ typedef struct { OPARI2_REGION_INFO } OPARI2_Region_info; #endif /* OPARI2_REGION_INFO_H */ opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/opari2_ctc_parser.h0000644000000000000000000000013214770056734021361 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.327367492 opari2-2.0.9/src/opari-lib-dummy/opari2_ctc_parser.h0000644000175100001440000001032414770056734021711 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef OPARI2_CTC_PARSER_H #define OPARI2_CTC_PARSER_H /** * @file opari2_ctc_parser.h * @date Started Tue Mar 25 2014 * * @brief * */ #include #include #include "opari2_region_info.h" /** @brief CTCData */ typedef struct { /** pointer to source info */ char* mCTCStringToParse; /** memory string*/ char* mCTCStringMemory; /** error string*/ char* mCTCStringForErrorMsg; /** structured region information */ OPARI2_Region_info* mRegionInfo; } CTCData; /** @brief errors the user is responsible for, i.e. just errors in * the passed string */ typedef enum /* CTC_ERROR_Type */ { CTC_ERROR_Ended_unexpectedly, CTC_ERROR_No_region_type, CTC_ERROR_No_separator_after_length_field, CTC_ERROR_Num_sections_invalid, CTC_ERROR_SCL_broken, CTC_ERROR_SCL_line_number_error, CTC_ERROR_Unknown_token, CTC_ERROR_Unsigned_expected, CTC_ERROR_User_region_name_missing, CTC_ERROR_Wrong_clause_value, CTC_ERROR_Unknown_region_type, CTC_ERROR_No_key, CTC_ERROR_No_value, CTC_ERROR_Zero_length_key, CTC_ERROR_Zero_length_value, CTC_ERROR_Unknown_schedule_type, CTC_ERROR_Unknown_default_sharing_type, CTC_ERROR_SCL_error, CTC_ERROR_Inconsistent_line_numbers } CTC_ERROR_Type; /** @brief print error information*/ void OPARI2_CTC_error( CTCData* obj, CTC_ERROR_Type errorType, const char* info1 ); void OPARI2_CTC_initCTCData( CTCData* obj, const char string[] ); void OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues( CTCData * obj, bool ( * checkToken )( int, char*, CTCData* ) ); void OPARI2_CTC_assignUnsigned( CTCData* obj, unsigned* anUnsigned, const char* value ); void OPARI2_CTC_assignString( char** aString, const char* value ); void OPARI2_CTC_assignHasClause( CTCData* obj, bool* hasClause, const char* value ); void OPARI2_CTC_checkConsistency( CTCData* obj ); void OPARI2_CTC_freeCTCData( CTCData* obj ); void OPARI2_CTC_freeAndReset( char** freeMe ); /* Map entry. Matches string to enum */ typedef struct { /** string representation*/ char* mString; /** matching region type*/ int mEnum; } OPARI2_CTCMapType; /** @brief number of entries in regionTypesMap*/ #define OPARI2_CTC_MAP_SIZE( map ) sizeof( map ) / sizeof( OPARI2_CTCMapType ) /** @brief returns the enum associated with a string */ int OPARI2_CTC_string2Enum( const OPARI2_CTCMapType* map, const size_t n_elements, const char* string ); /** @brief returns the string associated with an enum */ const char* OPARI2_CTC_enum2String( const OPARI2_CTCMapType* map, const size_t n_elements, int e_in ); #endif /* OPARI2_CTC_PARSER_H */ opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/opari2_ctc_parser.c0000644000000000000000000000013214770056734021354 xustar0030 mtime=1742757340.095533476 30 atime=1742757340.159533085 30 ctime=1742757367.323367516 opari2-2.0.9/src/opari-lib-dummy/opari2_ctc_parser.c0000644000175100001440000003537714770056734021723 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** * @file opari2_ctc_parser.c * @date Started Tue Mar 25 2014 * * @brief * */ #include #include "opari2_ctc_parser.h" #include "opari2_ctc_token.h" #include "pomp2_region_info.h" #include "pomp2_user_region_info.h" #include #include #include #include #include #include /*----------------------------------------------------------------------------*/ /** @brief print error information*/ void OPARI2_CTC_error( CTCData* obj, CTC_ERROR_Type errorType, const char* info1 ) { bool abort = true; printf( "Error parsing ctc string:\n\"%s\"\n", obj->mCTCStringForErrorMsg ); switch ( errorType ) { case CTC_ERROR_Ended_unexpectedly: printf( "ctc string ended unexpectedly.\n" ); break; case CTC_ERROR_No_region_type: printf( "ctc string has no region type field or value is empty.\n" ); break; case CTC_ERROR_No_separator_after_length_field: printf( "The separator \"*\" is missing after the length field.\n" ); break; case CTC_ERROR_Num_sections_invalid: printf( "The value of numSections must be > 0.\n" ); break; case CTC_ERROR_SCL_broken: printf( "The required attributes sscl and/or escl contain invalid data " "or are missing.\n" ); break; case CTC_ERROR_SCL_line_number_error: printf( "sscl or escl field has invalid line number arguments (%s).\n", info1 ); break; case CTC_ERROR_Unknown_token: printf( "Token \"%s\" not known.\n", info1 ); abort = false; break; case CTC_ERROR_Unsigned_expected: printf( "A value >= 0 is expected, \"%s\" is not allowed.\n", info1 ); break; case CTC_ERROR_User_region_name_missing: printf( "The field or value \"userRegionName\" is missing.\n" ); break; case CTC_ERROR_Wrong_clause_value: printf( "Clause field value must be \"0\" or \"1\", " "\"%s\" is not allowed.\n", info1 ); break; case CTC_ERROR_Unknown_region_type: printf( "Region type \"%s\" not known.\n", info1 ); break; case CTC_ERROR_No_key: printf( "Could not detect key in \"%s\", \"=\" or \"*\" missing.\n", info1 ); break; case CTC_ERROR_No_value: printf( "Could not detect value in \"%s\", \"*\" missing.\n", info1 ); break; case CTC_ERROR_Zero_length_key: printf( "The character sequence \"*=\" is not allowed.\n" ); break; case CTC_ERROR_Zero_length_value: printf( "The character sequence \"=*\" is not allowed.\n" ); break; case CTC_ERROR_Unknown_schedule_type: printf( "Schedule type \"%s\" not known.\n", info1 ); break; case CTC_ERROR_Unknown_default_sharing_type: printf( "Argument of the default close \"%s\" of unknown type.\n", info1 ); break; case CTC_ERROR_Inconsistent_line_numbers: printf( "Warning: line numbers not valid. Expected startLineNo1 <= startLineNo2 <= endLineNo1 <= endLineNo2 \n" ); abort = false; case CTC_ERROR_SCL_error: printf( "Error parsing source code location, " "expecting \"filename:lineNo1:lineNo2\".\n" ); break; default: puts( "ctc internal error: unknown error type." ); } if ( abort ) { OPARI2_CTC_freeCTCData( obj ); puts( "Aborting" ); exit( 1 ); } } /*----------------------------------------------------------------------------*/ static void initRegionInfo( OPARI2_Region_info* regionInfo ); static void copyCTCStringToInternalMemory( CTCData* obj, const char* source ); void OPARI2_CTC_initCTCData( CTCData* obj, const char string[] ) { initRegionInfo( obj->mRegionInfo ); obj->mCTCStringToParse = 0; obj->mCTCStringMemory = 0; obj->mCTCStringForErrorMsg = 0; copyCTCStringToInternalMemory( obj, string ); } static void initRegionInfo( OPARI2_Region_info* regionInfo ) { regionInfo->mStartFileName = 0; regionInfo->mStartLine1 = 0; regionInfo->mStartLine2 = 0; regionInfo->mEndFileName = 0; regionInfo->mEndLine1 = 0; regionInfo->mEndLine2 = 0; } static void copyCTCStringToInternalMemory( CTCData* obj, const char* source ) { assert( obj->mCTCStringToParse == 0 ); assert( obj->mCTCStringMemory == 0 ); assert( obj->mCTCStringForErrorMsg == 0 ); const size_t nBytes = strlen( source ) * sizeof( char ) + 1; obj->mCTCStringMemory = malloc( nBytes ); obj->mCTCStringForErrorMsg = malloc( nBytes ); strcpy( obj->mCTCStringMemory, source ); strcpy( obj->mCTCStringForErrorMsg, source ); obj->mCTCStringToParse = obj->mCTCStringMemory; } void OPARI2_CTC_freeCTCData( CTCData* obj ) { OPARI2_CTC_freeAndReset( &( obj->mCTCStringMemory ) ); OPARI2_CTC_freeAndReset( &( obj->mCTCStringForErrorMsg ) ); obj->mCTCStringToParse = 0; } void OPARI2_CTC_freeAndReset( char** freeMe ) { if ( *freeMe ) { free( *freeMe ); *freeMe = 0; } } static CTCToken getCTCTokenFromString( char* token ); static void assignSourceCodeLocation( CTCData* obj, char** fileName, unsigned* line1, unsigned* line2, char* value ); static void ignoreLengthField( CTCData* obj ); /** @brief map with CTC tokens*/ static const OPARI2_CTCMapType ctcTokenMap[] = { CTC_REGION_TOKEN_MAP_ENTRIES, CTC_OPENMP_TOKEN_MAP_ENTRIES, CTC_USER_REGION_TOKEN_MAP_ENTRIES }; static bool getKeyValuePair( CTCData* obj, char** key, char** value ); void OPARI2_CTC_parseCTCStringAndAssignRegionInfoValues( CTCData* obj, bool ( * checkToken )( int, char*, CTCData* ) ) { char* key; char* value; CTCToken token; ignoreLengthField( obj ); while ( getKeyValuePair( obj, &key, &value ) ) { token = ( CTCToken )OPARI2_CTC_string2Enum( ctcTokenMap, OPARI2_CTC_MAP_SIZE( ctcTokenMap ), key ); switch ( token ) { case CTC_Start_source_code_location: assignSourceCodeLocation( obj, &obj->mRegionInfo->mStartFileName, &obj->mRegionInfo->mStartLine1, &obj->mRegionInfo->mStartLine2, value ); break; case CTC_End_source_code_location: assignSourceCodeLocation( obj, &obj->mRegionInfo->mEndFileName, &obj->mRegionInfo->mEndLine1, &obj->mRegionInfo->mEndLine2, value ); break; default: if ( !checkToken( token, value, obj ) ) { OPARI2_CTC_error( obj, CTC_ERROR_Unknown_token, key ); } } } } static void ignoreLengthField( CTCData* obj ) { /* We expect ctcString to look like "42*key=value*...**" * The length field is redundant and we don't use it in our parsing * implementation. */ while ( obj->mCTCStringToParse && isdigit( *obj->mCTCStringToParse ) ) { ++( obj->mCTCStringToParse ); } if ( !obj->mCTCStringToParse ) { OPARI2_CTC_error( obj, CTC_ERROR_Ended_unexpectedly, 0 ); } if ( *obj->mCTCStringToParse != '*' ) { OPARI2_CTC_error( obj, CTC_ERROR_No_separator_after_length_field, 0 ); } ++( obj->mCTCStringToParse ); if ( !obj->mCTCStringToParse ) { OPARI2_CTC_error( obj, CTC_ERROR_Ended_unexpectedly, 0 ); } } static bool extractNextToken( char** string, const char tokenDelimiter ); static bool getKeyValuePair( CTCData* obj, char** key, char** value ) { /* We expect ctcString to look like "key=value*...**" or "*". */ if ( *( obj->mCTCStringToParse ) == '*' ) { return false; /* end of ctc string */ } if ( *( obj->mCTCStringToParse ) == '\0' ) { return false; /* also end of ctc string. we don't force the second "*" */ } *key = obj->mCTCStringToParse; if ( !extractNextToken( &obj->mCTCStringToParse, '=' ) ) { OPARI2_CTC_error( obj, CTC_ERROR_No_key, *key ); } if ( strlen( *key ) == 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Zero_length_key, 0 ); } *value = obj->mCTCStringToParse; if ( !extractNextToken( &obj->mCTCStringToParse, '*' ) ) { OPARI2_CTC_error( obj, CTC_ERROR_No_value, *value ); } if ( strlen( *value ) == 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Zero_length_value, 0 ); } /*@ in the hasSchedule clause was a '*' originally and needs to be replaced back*/ if ( strcmp( *key, "hasSchedule" ) == 0 ) { while ( strchr( *value, '@' ) ) { ( strchr( *value, '@' ) )[ 0 ] = '*'; } } return true; } static bool extractNextToken( char** string, const char tokenDelimiter ) { *string = strchr( *string, tokenDelimiter ); if ( !( *string && **string == tokenDelimiter ) ) { return false; } **string = '\0'; /* extraction */ ++( *string ); return true; } static void assignSourceCodeLocation( CTCData* obj, char** filename, unsigned* line1, unsigned* line2, char* value ) { /* We assume that value looks like "foo.c:42:43" */ char* token = value; int line1Tmp = -1; int line2Tmp = -1; bool continueExtraction; assert( *filename == 0 ); if ( ( continueExtraction = extractNextToken( &value, ':' ) ) ) { *filename = malloc( strlen( token ) * sizeof( char ) + 1 ); strcpy( *filename, token ); } token = value; if ( continueExtraction && ( continueExtraction = extractNextToken( &value, ':' ) ) ) { line1Tmp = atoi( token ); } token = value; if ( continueExtraction && extractNextToken( &value, '\0' ) ) { line2Tmp = atoi( token ); } if ( *filename != 0 && line1Tmp > -1 && line2Tmp > -1 ) { *line1 = line1Tmp; *line2 = line2Tmp; if ( *line1 > *line2 ) { OPARI2_CTC_error( obj, CTC_ERROR_SCL_line_number_error, "line1 > line2" ); } } else { OPARI2_CTC_error( obj, CTC_ERROR_SCL_error, 0 ); } } void OPARI2_CTC_assignHasClause( CTCData* obj, bool* hasClause, const char* value ) { if ( !isdigit( *value ) ) { OPARI2_CTC_error( obj, CTC_ERROR_Wrong_clause_value, value ); } int tmp = atoi( value ); if ( tmp != 0 && tmp != 1 ) { OPARI2_CTC_error( obj, CTC_ERROR_Wrong_clause_value, value ); } *hasClause = tmp; } void OPARI2_CTC_assignUnsigned( CTCData* obj, unsigned* anUnsigned, const char* value ) { int tmp = atoi( value ); if ( tmp < 0 ) { OPARI2_CTC_error( obj, CTC_ERROR_Unsigned_expected, value ); } *anUnsigned = tmp; } void OPARI2_CTC_assignString( char** aString, const char* value ) { *aString = malloc( strlen( value ) * sizeof( char ) + 1 ); strcpy( *aString, value ); } void OPARI2_CTC_checkConsistency( CTCData* obj ) { bool requiredAttributesFound; requiredAttributesFound = ( obj->mRegionInfo->mStartFileName && obj->mRegionInfo->mEndFileName ); if ( !requiredAttributesFound ) { OPARI2_CTC_error( obj, CTC_ERROR_SCL_broken, 0 ); return; } if ( obj->mRegionInfo->mStartLine1 > obj->mRegionInfo->mStartLine2 ) { OPARI2_CTC_error( obj, CTC_ERROR_Inconsistent_line_numbers, 0 ); return; } if ( obj->mRegionInfo->mEndLine1 > obj->mRegionInfo->mEndLine2 ) { OPARI2_CTC_error( obj, CTC_ERROR_Inconsistent_line_numbers, 0 ); return; } } /*----------------------------------------------------------------------------*/ int OPARI2_CTC_string2Enum( const OPARI2_CTCMapType* map, const size_t n_elements, const char* string ) { int i; for ( i = 0; i < n_elements; ++i ) { if ( strcmp( map[ i ].mString, string ) == 0 ) { return map[ i ].mEnum; } } return 0; } /** @brief returns the string associated with an enum */ const char* OPARI2_CTC_enum2String( const OPARI2_CTCMapType* map, const size_t n_elements, int e_in ) { int i; for ( i = 0; i < n_elements; ++i ) { if ( e_in == map[ i ].mEnum ) { return map[ i ].mString; } } return "no valid region type"; } opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/opari2_ctc_token.h0000644000000000000000000000013214770056734021205 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.323367516 opari2-2.0.9/src/opari-lib-dummy/opari2_ctc_token.h0000644000175100001440000000243214770056734021536 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2014 * Forschungszentrum Juelich GmbH, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ #ifndef OPARI2_CTC_TOKEN_H #define OPARI2_CTC_TOKEN_H #include "pomp2_region_info.h" #include "pomp2_user_region_info.h" /** CTC Tokens */ typedef enum { CTC_No_token = 0, CTC_REGION_TOKENS, CTC_OMP_TOKENS, CTC_USER_REGION_TOKENS } CTCToken; #endif /* OPARI2_CTC_TOKEN_H */ opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/pomp2_lib.c0000644000000000000000000000013214770056734017636 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757367.323367516 opari2-2.0.9/src/opari-lib-dummy/pomp2_lib.c0000644000175100001440000006704514770056734020202 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2013, * RWTH Aachen University, Germany * * Copyright (c) 2009-2013, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2013, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2013, 2014, 2016, 2023, * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2013, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2013, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ /**************************************************************************** ** SCALASCA http://www.scalasca.org/ ** ** KOJAK http://www.fz-juelich.de/jsc/kojak/ ** ***************************************************************************** ** Copyright (c) 1998-2009 ** ** Forschungszentrum Juelich, Juelich Supercomputing Centre ** ** ** ** See the file COPYRIGHT in the package base directory for details ** ****************************************************************************/ /** @internal * * @file pomp2_lib.c * * @brief Dummy implementation of all POMP2 Functions. These functions * only print out messages and do not measure anything.*/ #include #include #include /* *INDENT-OFF* */ #include "pomp2_region_info.h" #include "pomp2_user_region_info.h" #include #include #include #include #include /** @name Functions generated by the instrumenter */ /*@{*/ /** * Returns the number of instrumented regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. Here we return the sum of * all numRegions. */ extern size_t POMP2_Get_num_regions(void); /** * Init all OPARI2-created regions.@n * The instrumenter scans all OPARI2-created include files with nm and greps * the POMP2_INIT_uuid_numRegions() function calls. The instrumentor then * defines this functions by calling all grepped functions. */ extern void POMP2_Init_regions(void); /** * Returns the OPARI2 version. */ extern const char* POMP2_Get_opari2_version(void); /*@}*/ /** @brief All relevant information for a region is stored here */ typedef struct { /** region type of construct */ char* rtype; /** critical or user region name */ char* name; /** sections only: number of sections */ int num_sections; /** start file name*/ char* start_file_name; /** line number 1*/ int start_line_1; /** line number 2*/ int start_line_2; /** end file name*/ char* end_file_name; /** line number 1*/ int end_line_1; /** line number 2*/ int end_line_2; /** region id*/ size_t id; } my_pomp2_region; /** Id of the currently executing task*/ POMP2_Task_handle pomp2_current_task = 0; #pragma omp threadprivate(pomp2_current_task) /** Counter of tasks used to determine task ids for newly created ta*/ POMP2_Task_handle pomp2_task_counter = 1; #pragma omp threadprivate(pomp2_task_counter) POMP2_Task_handle POMP2_Get_new_task_handle(void) { return ( ( POMP2_Task_handle )omp_get_thread_num() << 32 ) + pomp2_task_counter++; } static void free_my_pomp2_region_member( char** member ) { if ( *member ) { free( *member ); *member = 0; } } static void free_my_pomp2_region_members( my_pomp2_region* region ) { if ( region ) { free_my_pomp2_region_member( ®ion->rtype ); free_my_pomp2_region_member( ®ion->name ); free_my_pomp2_region_member( ®ion->start_file_name ); free_my_pomp2_region_member( ®ion->end_file_name ); } } static void assignString( char** destination, const char* source ) { assert( source ); *destination = malloc( strlen( source ) * sizeof( char ) + 1 ); strcpy( *destination, source ); } static void initDummyRegionFromPOMP2RegionInfo( my_pomp2_region* pomp2_region, const POMP2_Region_info* pomp2RegionInfo ) { assignString( &( pomp2_region->rtype ), pomp2RegionType2String( pomp2RegionInfo->mRegionType ) ); assignString( &pomp2_region->start_file_name, pomp2RegionInfo->mStartFileName ); pomp2_region->start_line_1 = pomp2RegionInfo->mStartLine1; pomp2_region->start_line_2 = pomp2RegionInfo->mStartLine2; assignString( &pomp2_region->end_file_name, pomp2RegionInfo->mEndFileName ); pomp2_region->end_line_1 = pomp2RegionInfo->mEndLine1; pomp2_region->end_line_2 = pomp2RegionInfo->mEndLine2; if ( pomp2RegionInfo->mRegionType == POMP2_Critical && pomp2RegionInfo->mCriticalName ) { assignString( &pomp2_region->name, pomp2RegionInfo->mCriticalName ); } pomp2_region->num_sections = pomp2RegionInfo->mNumSections; } static void initDummyRegionFromPOMP2UserRegionInfo( my_pomp2_region* pomp2_region, const POMP2_USER_Region_info* pomp2RegionInfo ) { assignString( &( pomp2_region->rtype ), pomp2UserRegionType2String( (POMP2_USER_Region_type)pomp2RegionInfo->mRegionType ) ); assignString( &pomp2_region->start_file_name, pomp2RegionInfo->mStartFileName ); pomp2_region->start_line_1 = pomp2RegionInfo->mStartLine1; pomp2_region->start_line_2 = pomp2RegionInfo->mStartLine2; assignString( &pomp2_region->end_file_name, pomp2RegionInfo->mEndFileName ); pomp2_region->end_line_1 = pomp2RegionInfo->mEndLine1; pomp2_region->end_line_2 = pomp2RegionInfo->mEndLine2; if ( pomp2RegionInfo->mRegionType == POMP2_USER_Region ) { assignString( &pomp2_region->name, pomp2RegionInfo->mUserRegionName ); } } /* * Global variables */ int pomp2_tracing = 0; my_pomp2_region* my_pomp2_regions; /* * C pomp2 function library */ void POMP2_Finalize(void) { static int pomp2_finalize_called = 0; size_t i; const size_t nRegions = POMP2_Get_num_regions(); if ( my_pomp2_regions ) { for ( i = 0; i < nRegions; ++i ) { free_my_pomp2_region_members( &my_pomp2_regions[ i ] ); } free( my_pomp2_regions ); my_pomp2_regions = 0; } if ( !pomp2_finalize_called ) { pomp2_finalize_called = 1; fprintf( stderr, " 0: finalize\n" ); } } void POMP2_Init(void) { static int pomp2_init_called = 0; if ( !pomp2_init_called ) { pomp2_init_called = 1; atexit( POMP2_Finalize ); fprintf( stderr, " 0: init\n" ); int n_pomp2_regions = POMP2_Get_num_regions() + POMP2_USER_Get_num_regions(); int n_pomp2_user_regions = POMP2_USER_Get_num_regions(); my_pomp2_regions = calloc( n_pomp2_regions + n_pomp2_user_regions, sizeof( my_pomp2_region ) ); if ( n_pomp2_regions > 0 ) { POMP2_Init_regions(); } if ( n_pomp2_regions > 0 ) { POMP2_USER_Init_regions(); } pomp2_tracing = 1; } } void POMP2_Off(void) { pomp2_tracing = 0; } void POMP2_On(void) { pomp2_tracing = 1; } void POMP2_Begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin region %s\n", omp_get_thread_num(), region->name ); } } void POMP2_End( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: end region %s\n", omp_get_thread_num(), region->name ); } } void POMP2_Assign_handle( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { static size_t count = 0; assert( count < POMP2_Get_num_regions() ); POMP2_Region_info pomp2RegionInfo; ctcString2RegionInfo( ctc_string, &pomp2RegionInfo ); initDummyRegionFromPOMP2RegionInfo( &my_pomp2_regions[ count ], &pomp2RegionInfo ); my_pomp2_regions[ count ].id = count; *pomp2_handle = &my_pomp2_regions[ count ]; freePOMP2RegionInfoMembers( &pomp2RegionInfo ); ++count; } void POMP2_USER_Assign_handle( POMP2_USER_Region_handle* pomp2_handle, const char ctc_string[] ) { static size_t count = 0; assert( count < POMP2_USER_Get_num_regions() ); POMP2_USER_Region_info pomp2RegionInfo; ctcString2UserRegionInfo( ctc_string, &pomp2RegionInfo ); initDummyRegionFromPOMP2UserRegionInfo( &my_pomp2_regions[ count ], &pomp2RegionInfo ); my_pomp2_regions[ count ].id = count; *pomp2_handle = &my_pomp2_regions[ count ]; freePOMP2UserRegionInfoMembers( &pomp2RegionInfo ); ++count; } void POMP2_Atomic_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter atomic\n", omp_get_thread_num() ); } } void POMP2_Atomic_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit atomic\n", omp_get_thread_num() ); } } void POMP2_Implicit_barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task ) { POMP2_Barrier_enter( pomp2_handle, pomp2_old_task, "" ); } extern void POMP2_Implicit_barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; POMP2_Barrier_exit( pomp2_handle, pomp2_old_task ); } void POMP2_Barrier_enter( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ) { *pomp2_old_task = pomp2_current_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { if ( region->rtype[ 0 ] == 'b' ) { fprintf( stderr, "%3d: enter barrier\n", omp_get_thread_num() ); } else { fprintf( stderr, "%3d: enter implicit barrier of %s\n", omp_get_thread_num(), region->rtype ); } } } void POMP2_Barrier_exit( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { if ( region->rtype[ 0 ] == 'b' ) { fprintf( stderr, "%3d: exit barrier\n", omp_get_thread_num() ); } else { fprintf( stderr, "%3d: exit implicit barrier of %s\n", omp_get_thread_num(), region->rtype ); } } } void POMP2_Flush_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter flush\n", omp_get_thread_num() ); } } void POMP2_Flush_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit flush\n", omp_get_thread_num() ); } } void POMP2_Critical_begin( POMP2_Region_handle* pomp2_handle ) { if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin critical %s\n", omp_get_thread_num(), region->rtype ); } } void POMP2_Critical_end( POMP2_Region_handle* pomp2_handle ) { if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: end critical %s\n", omp_get_thread_num(), region->name ); } } void POMP2_Critical_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter critical %s\n", omp_get_thread_num(), region->name ); } } void POMP2_Critical_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } my_pomp2_region* region = *pomp2_handle; if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit critical %s\n", omp_get_thread_num(), region->name ); } } void POMP2_For_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter for\n", omp_get_thread_num() ); } } void POMP2_For_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit for\n", omp_get_thread_num() ); } } void POMP2_Master_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin master\n", omp_get_thread_num() ); } } void POMP2_Master_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end master\n", omp_get_thread_num() ); } } void POMP2_Parallel_begin( POMP2_Region_handle* pomp2_handle) { pomp2_current_task = POMP2_Get_new_task_handle(); #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin parallel\n", omp_get_thread_num() ); } } void POMP2_Parallel_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end parallel\n", omp_get_thread_num() ); } } void POMP2_Parallel_fork( POMP2_Region_handle* pomp2_handle, int if_clause, int num_threads, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ) { *pomp2_old_task = pomp2_current_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: fork parallel\n", omp_get_thread_num() ); } } void POMP2_Parallel_join( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: join parallel\n", omp_get_thread_num() ); } } void POMP2_Section_begin( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin section\n", omp_get_thread_num() ); } } void POMP2_Section_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end section\n", omp_get_thread_num() ); } } void POMP2_Sections_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { my_pomp2_region* region = *pomp2_handle; fprintf( stderr, "%3d: enter sections (%d)\n", omp_get_thread_num(), region->num_sections ); } } void POMP2_Sections_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit sections\n", omp_get_thread_num() ); } } void POMP2_Single_begin( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin single\n", omp_get_thread_num() ); } } void POMP2_Single_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end single\n", omp_get_thread_num() ); } } void POMP2_Single_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter single\n", omp_get_thread_num() ); } } void POMP2_Single_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit single\n", omp_get_thread_num() ); } } void POMP2_Workshare_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter workshare\n", omp_get_thread_num() ); } } void POMP2_Workshare_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit workshare\n", omp_get_thread_num() ); } } void POMP2_Ordered_begin( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin ordered\n", omp_get_thread_num() ); } } void POMP2_Ordered_end( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: end ordered\n", omp_get_thread_num() ); } } void POMP2_Ordered_enter( POMP2_Region_handle* pomp2_handle, const char ctc_string[] ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: enter ordered\n", omp_get_thread_num() ); } } void POMP2_Ordered_exit( POMP2_Region_handle* pomp2_handle ) { #pragma omp critical if ( *pomp2_handle == NULL ) { POMP2_Init(); assert( *pomp2_handle ); // check awk script output } if ( pomp2_tracing ) { fprintf( stderr, "%3d: exit ordered\n", omp_get_thread_num() ); } } void POMP2_Task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[]) { *pomp2_old_task = pomp2_current_task; *pomp2_new_task = POMP2_Get_new_task_handle(); if ( pomp2_tracing ) { fprintf( stderr, "%3d: task create begin\n", omp_get_thread_num() ); } } void POMP2_Task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: task create end\n", omp_get_thread_num() ); } } void POMP2_Task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_task ) { pomp2_current_task = pomp2_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: task begin\n", omp_get_thread_num() ); } } void POMP2_Task_end( POMP2_Region_handle* pomp2_handle ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: task end\n", omp_get_thread_num()); } } void POMP2_Untied_task_create_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_new_task, POMP2_Task_handle* pomp2_old_task, int pomp2_if, const char ctc_string[] ) { *pomp2_new_task = POMP2_Get_new_task_handle(); *pomp2_old_task = pomp2_current_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: create untied task\n", omp_get_thread_num() ); fprintf( stderr, "%3d: suspend task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Untied_task_create_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: created untied task\n", omp_get_thread_num() ); fprintf( stderr, "%3d: resume task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Untied_task_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_parent_task ) { pomp2_current_task = POMP2_Get_new_task_handle(); if ( pomp2_tracing ) { fprintf( stderr, "%3d: start untied task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Untied_task_end( POMP2_Region_handle* pomp2_handle ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: end untied task %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Taskwait_begin( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle* pomp2_old_task, const char ctc_string[] ) { *pomp2_old_task = pomp2_current_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: begin taskwait\n", omp_get_thread_num() ); fprintf( stderr, "%3d: suspend task: %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } void POMP2_Taskwait_end( POMP2_Region_handle* pomp2_handle, POMP2_Task_handle pomp2_old_task ) { pomp2_current_task = pomp2_old_task; if ( pomp2_tracing ) { fprintf( stderr, "%3d: end taskwait\n", omp_get_thread_num() ); fprintf( stderr, "%3d: resume task: %" PRIu64 "\n", omp_get_thread_num(), pomp2_current_task ); } } /* *---------------------------------------------------------------- * C Wrapper for OpenMP API ******---------------------------------------------------------------- */ void POMP2_Init_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: init lock\n", omp_get_thread_num() ); } omp_init_lock( s ); } void POMP2_Destroy_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: destroy lock\n", omp_get_thread_num() ); } omp_destroy_lock( s ); } void POMP2_Set_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: set lock\n", omp_get_thread_num() ); } omp_set_lock( s ); } void POMP2_Unset_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: unset lock\n", omp_get_thread_num() ); } omp_unset_lock( s ); } int POMP2_Test_lock( omp_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: test lock\n", omp_get_thread_num() ); } return omp_test_lock( s ); } void POMP2_Init_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: init nestlock\n", omp_get_thread_num() ); } omp_init_nest_lock( s ); } void POMP2_Destroy_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: destroy nestlock\n", omp_get_thread_num() ); } omp_destroy_nest_lock( s ); } void POMP2_Set_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: set nestlock\n", omp_get_thread_num() ); } omp_set_nest_lock( s ); } void POMP2_Unset_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: unset nestlock\n", omp_get_thread_num() ); } omp_unset_nest_lock( s ); } int POMP2_Test_nest_lock( omp_nest_lock_t* s ) { if ( pomp2_tracing ) { fprintf( stderr, "%3d: test nestlock\n", omp_get_thread_num() ); } return omp_test_nest_lock( s ); } opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/Makefile.inc.am0000644000000000000000000000013214770056734020413 xustar0030 mtime=1742757340.095533476 30 atime=1742757340.159533085 30 ctime=1742757367.271367834 opari2-2.0.9/src/opari-lib-dummy/Makefile.inc.am0000644000175100001440000000624514770056734020752 0ustar00builderusers# -*- mode: makefile -*- # This file is part of the Score-P software (http://www.score-p.org) # Copyright (c) 2009-2013, # RWTH Aachen University, Germany # Copyright (c) 2009-2013, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # Copyright (c) 2009-2013, 2020, # Technische Universitaet Dresden, Germany # Copyright (c) 2009-2013, # University of Oregon, Eugene, USA # Copyright (c) 2009-2013, # Forschungszentrum Juelich GmbH, Germany # Copyright (c) 2009-2013, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # Copyright (c) 2009-2013, # Technische Universitaet Muenchen, Germany # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. if HAVE_OPENMP_SUPPORT examplelibdir = $(docdir)/example/lib examplelib_LTLIBRARIES = libpomp.la libpomp_la_SOURCES = \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_lib.c \ $(PUBLIC_INC_SRC)pomp2_lib.h \ $(PUBLIC_INC_SRC)pomp2_user_lib.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_token.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.c \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.h # Currently, the fortran wrappers get a int* parameter whereas the new # POMP_Region_handle is of type void*. Ask a fortran guru if this may cause # problems. # CFLAGS are sufficient here, CPPFLAGS would cause duplication libpomp_la_CFLAGS = $(AM_CFLAGS) $(OPENMP_CFLAGS) libpomp_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(PUBLIC_INC_DIR) libpomp_la_LDFLAGS = -static -avoid-version if SCOREP_HAVE_F77 libpomp_la_SOURCES += \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_fwrapper.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_fwrapper_base.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_fwrapper_base.h BUILT_SOURCES += pomp2_fwrapper_def.h CLEANFILES += pomp2_fwrapper_def.h pomp2_fwrapper_def.h: Makefile getfname$(EXEEXT) $(AM_V_GEN)./getfname$(EXEEXT) noinst_PROGRAMS += getfname getfname_SOURCES = \ $(SRC_ROOT)src/opari-lib-dummy/foos.c \ $(SRC_ROOT)src/opari-lib-dummy/getfname.f endif EXTRA_DIST += $(SRC_ROOT)src/opari-lib-dummy/pomp2_parse_init_regions.awk.in endif pkgdatadeveldir = $(pkgdatadir)/devel pkgdatadevel_DATA = \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_token.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.h \ $(SRC_ROOT)src/opari-lib-dummy/opari2_ctc_parser.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_region_info.c \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.h \ $(SRC_ROOT)src/opari-lib-dummy/pomp2_user_region_info.c opari2-2.0.9/src/opari-lib-dummy/PaxHeaders/pomp2_parse_init_regions.awk.in0000644000000000000000000000013214770056734023720 xustar0030 mtime=1742757340.099533452 30 atime=1742757340.159533085 30 ctime=1742757366.975369637 opari2-2.0.9/src/opari-lib-dummy/pomp2_parse_init_regions.awk.in0000644000175100001440000001157014770056734024254 0ustar00builderusers#!@OPARI2_AWK@ -f ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen University, Germany ## ## Copyright (c) 2009-2011, ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Dresden, Germany ## ## Copyright (c) 2009-2011, ## University of Oregon, Eugene, USA ## ## Copyright (c) 2009-2011, 2013, 2014, 2016-2017, 2020, ## Forschungszentrum Juelich GmbH, Germany ## ## Copyright (c) 2009-2011, ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Muenchen, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## # # pomp2_parse_init_regions.awk # # Expects the output of # $(NM) $ALL_OBJS_AND_LIBS as input. See # for a working example. # # The output is C-code that needs to be linked to your application. It # provides several functions: # # void POMP2_Init_regions(): need to be called from your POMP2 library to # initialize all instrumented POMP2 region by calling the instrumented # functions POMP2_Init_reg_*. # # size_t POMP2_Get_num_regions() returns the number of POMP2 regions found # in $ALL_OBJS_AND_LIBS. # # const char* POMP2_Get_opari2_version() returns a version string. # # Three functions returning int and specifying the library interface version: # int POMP2_Get_required_pomp2_library_version_(current|revision|age)() # # Author: Christian Roessel # function add_region( type_str, regions_arr, n_regions_int ) { for (i = 1; i <= NF; i++) { if (index($i,type_str) != 0) { separator = type_str; } else if (index($i,tolower(type_str)) != 0) { separator = tolower(type_str); } else if (index($i,toupper(type_str)) != 0) { separator = toupper(type_str); } else { continue; } # $i looks like "POMP2_Init_reg_uniqueId_n_regions" or # like "pomp2_init_reg_uniqueId_n_regions" or # like "POMP2_INIT_REG_uniqueId_n_regions" split ($i,splitResult,separator); _uniqueId_n_regions = splitResult[2]; if (!(_uniqueId_n_regions in regions_arr)) { regions_arr[_uniqueId_n_regions] = $i; split(_uniqueId_n_regions, tokens, "_"); n_regions_int += tokens[3]; } } return n_regions_int; } # The pomp OpenMP region symbols contain 'pomp2_init_reg' (case insensitive), are of # (nm) type [TDA], and are not Intel -ipo or -O3 symbols (.ITC.). / [_]*[Pp][Oo][Mm][Pp]2_[Ii][Nn][Ii][Tt]_[Rr][Ee][Gg]_[0-9a-zA-Z][0-9a-zA-Z]*_[1-9][0-9]*/ { if (tolower($0) ~ /pomp2_init_reg/ && $0 ~ / [TDA] / && $0 !~ /\.ITC\./) { n_pomp_regions = add_region("POMP2_Init_reg", pomp_regions, n_pomp_regions) } } # The pomp user region symbols contain 'pomp2_user_init_reg' (case insensitive), are of # (nm) type [TDA], and are not Intel -ipo or -O3 symbols (.ITC.). / [_]*[Pp][Oo][Mm][Pp]2_[Uu][Ss][Ee][Rr]_[Ii][Nn][Ii][Tt]_[Rr][Ee][Gg]_[0-9a-zA-Z][0-9a-zA-Z]*_[1-9][0-9]*/ { if (tolower($0) ~ /pomp2_user_init_reg/ && $0 ~ / [TDA] / && $0 !~ /\.ITC\./) { n_pomp_user_regions = add_region("POMP2_USER_Init_reg", pomp_user_regions, n_pomp_user_regions) } } END{ print tmp "\n" print "#ifdef __cplusplus" print "extern \"C\"" print "{" print "#endif" print "#include \n" # Make a regions array with all regions counter = 0 for (i in pomp_regions) { regions[counter++]=pomp_regions[i]; } for (i in pomp_user_regions) { regions[counter++]=pomp_user_regions[i]; } # cut away leading full-stops for (i in regions) { sub(/^\./, "", regions[i]); } # declare XXXXX_Init_reg_* functions extern. # loop reproducibly as make check (test/awk_script_test.sh) might # fail as it expects an order. For normal operation, order doesn't # matter. for (i = 0 ; i < counter; i++) { print "extern void " regions[i] "();"; } print_init_functions("POMP2", pomp_regions, n_pomp_regions); print_init_functions("POMP2_USER", pomp_user_regions, n_pomp_user_regions); print "#ifdef __cplusplus" print "}" print "#endif" } function print_init_functions(type_str, regions_arr, n_reg_int) { # define XXXXX_Init_regions() and call all XXXXX_Init_reg_* functions print "\nvoid " type_str "_Init_regions()" print "{" if ( n_reg_int != 0) { for (i in regions_arr) { print " " regions_arr[i] "();"; } } print "}\n" # define function XXXXX_Get_num_regions() print "size_t " type_str "_Get_num_regions()" print "{" if (n_reg_int != 0) { print " return " n_reg_int ";" } else { print " return 0;" } print "}\n" } opari2-2.0.9/PaxHeaders/doc0000644000000000000000000000013214770056773012504 xustar0030 mtime=1742757371.915339528 30 atime=1742757371.935339406 30 ctime=1742757371.915339528 opari2-2.0.9/doc/0000755000175100001440000000000014770056773013111 5ustar00builderusersopari2-2.0.9/doc/PaxHeaders/html.tar.gz0000644000000000000000000000013214770056773014654 xustar0030 mtime=1742757371.911339552 30 atime=1742757371.879339747 30 ctime=1742757371.911339552 opari2-2.0.9/doc/html.tar.gz0000644000175100001440000103444114770056773015213 0ustar00builderusers‹ì}@UÙÖÿ0EºQQàv ¡„‚4y“îNQJIQAE ±@DB¤¤D)‘PJBþû€ÎèŒÎ8¾™ùÞ÷ÿîyoäÞsÏÞ{íµWüÖÚëœcåfo'ûg88p ôà æ¿#Ðèù¿ŸÃÁá,‹ƒÁ4ÁüÃtÍî®nDÉÝÚŽBuùƒë¨.®ÿAÿîa­¿¥ ÑÉÊÜŽjIu H;9XþÍc@ Œ]Xïo¬? ç¾^4‰Àÿf:¾yü_ÿÃ:»ÔX–ó-YÔw¨èÁ` —ÀçzfFðoÊ£p%ð‡‘´SM6ýïlá¥c0˜L]e›Wâ@‹çž5Ϧ˜†‡Þê-ÝVÆ Á)v(íйmKE†‡ŸÛQæƒ Y‡«8ßýÔ\¬¢iÕÚí׊o’—äßsU¤öü­ùbÅC¾Ïu–Pž/}Uý~`ñ”SI§<-ŸJ‰‘v%fÑ`v1_µÛף翙 ˆC]‚Žê/üŒ[Ó‡6´Û<<•s\Ùº„‘…at”"¸\k$".¾@\gM5äA[±ö̼êé‹Oüøn…ÓÀIèb%å‡9¨Ÿ.^¿žÑÌÌ º˜™…¥\E¶—Ÿ/~ ÖÖ»L@^²\gŸ«Zã*0´uHJ¨·£æƒ©MÚ“¢5±üÇWÏSs{ÛƒßÒ`Ôk{ýzIŠÎžA¼¥¥åfó"¾ö«†‡‡SSS3•¡F ÍçT#ع¹wæE n鸻V/i¿‘×zÍ“OÈ=ÌjÅ öVî:¯,ù —ÛÜOÔA<Ï¥Kc¥žýíÛ·0˜²²²õ£ëO®_¿>Üu¼£­$ˆej&i‹'Ük¸m{t8DU”nêö’Š F˜SOhAÀ,ßÎøÍ‹`iééþý„‰D"KŸéÖÆk½G4\öÝ®ÎÖ:Mql-r©ëÞ§«»*Z€PÛöú8Äu²¹ÊÊJåu«<&L+'¸œ§i™uö5dL¾½3ÄÎÅňÃáü÷Ílê–÷ôô„Æ[µjÕž"?« ì66¶HaE¡Ò¦«µ'ÚJONMÝ+-]Ìs8ž¦Øöü†eéãÇ,®ÝOTI$±wïß#¬k×1‡(áeeÅäåaGâãC‹>0’+£Ë«ç"##W:bccO*øË:ìݘ-A¥èx\\Ik«°4úêÕ«a°>ð HKž$m »F®¼÷âÿµk×ò|'¤iNg:f>¼‡žÆ9’žžSmºaÉVÉ´QÿbÛ»®‡îÑÛDØ·Š°û^?àÆ«2• Gx|ÿþÝ¡â¹hÀrRÉÁ¥÷Á×B߉u‡‡+9;#(Ôª5k‚KÃØÈoꩽ°b{_Èè¨ÛºõëIÃm%5OŸ–ôÍ___ÕcpŸÓm“%ŒŒJÆÆü·oß¾š›ºU$0&†ímk1àùnîµbb `¤°3g„^¾|yÕ¦!]ò$RÏO"ÈN]Uœ~?të…;ƱšƒC×Ì,z·´ECºáI¼³ØNÎö¾¾ðï»ÉM×zê/sTÄÇ=ºšbiIî~’ÔtºœaÓ××Ï»s§ó^ÈŠœ'[¤¤Xg†GFEÅž:õáéC—7x÷ìÝKœxÛ"±q㇞w‡Üvtå~ ;þ|ۛǧ­ê.²x ½2í¿ OTTTG_¿ôЪµ`ÊùO­¹ã9TQYdv¢u1lj|0"0˜¤˜ÊÒ³Óå'ƧG{ƒ„ä}ÀÜ-+["ÀÊD£Ñ`à^^âû7a0mmíÑþgl%%%x×7+gff®ÒóÁ8£n99Mc^5988‚bmݹsìȉa`…-ZÄ~X…™™ykqÀ,ÐÜàÙé rWUœ“»{Ȩ€éAÜù‹`N}õ{úû#NLLTùO§?šhαmÊwßd¹½³ê¾§¯/`ô$ëùùùMEþ[Œ®˜,Îø–ƒ°)ÖZ©¾KKS³æ¢ÖiY팋ÏŠõÖ×ÔÀ`ëÖ­;”}œ!0.Ž3`vl7ìî†d¿ƒ““^š§±,Õgä3Æž5;’ ùtJØ»xö¬òó÷//uww/W—ó¬­m¹ãÉ,/Î!Ñk$ƒ)züøñ¢­r™@½aXûæ­ºººrIP!ɺõèùÒx4Ô˜e|eÉZßÐÐf)ï;¾U]ý²î ëš³Û ›ŠD"ÙLKCKjkWûŽl cäs7;O¤M”Ü´igAöK%m‰5çòòöÌœ©ì44Þþ"×>69Y&ÀßÎÒ%ååK¿!¶«­½×±;6)I ‘è°²@R††D3ñÃ3ÝÞÒ.®®%<ŠÇ6lP{°T²/øÍ›7ç€ñÐÙ½;ìàÁÑÚ5,,,<<<[ÕÔ˜N:…ñ8 žpæÑ–ö݆†å€=ºFFŒ0fVV®9sþÝ»w/Yº4åêUvØUÿiG§qlË—/ÏsîdFÏÂÒ2,×þEGÙa,vÇºÓ ¢åÜ)—//C¡P’’÷JJå ÊÈØ8\P »û4Umd´·n»9°õ‡ä®ßºU 44öرŠ ©1s/p=Yž{ BÓm× ág\±vM0nnîÃÖ¡+ynÐ>s÷Ù3nã\»—/oœ™‹kx¸¦}F®äVkÀ  3cÏÌ!ñ»bz'Ø6\³ÜýÊXo—¾Ž nƒÍœX,¶©ÀÛ5©/nòÇ’¦&žÐÐP8‡Œ-XË%gÏ%7ÔÔ茾à.ôS–×ÍÝA­ZãÖW¿ŒïjNŽê¾}|ÀÀ¶Ÿ4ü@0Ê2÷Þ°°µ|Pv‰‘‘ŽÃU†²ð· l4„|áý¥d2Ù®%ŸSZZúêÍ›*•тˋ}NP­¬9Â~òÔ©mææÂ&Ò»_:œGJŸXü†I×*`t”54–oÞ¼yO­ušâÜ Ç“'Oj·ûùÉ¿m‰fa¿ÛíóÎÎ{L} “à)COSÇΔ[\s¬ÖÓÛ» pìÑ£bWŽ1¼|¸§&E9ªaIz›S`ÎY½ÖlHn \–ìÁÒW¯@ ð:sŽó˜—•©Ütlª¨¨€Iæ{†GG‡&% æ™Hó:t÷ì¶ ²îÆû÷w455‰ÈÉ DpI݃¬ÁñãK„b68œ5*ÖÔ´g¥ ìÍŠ¼å+V¤œ?o`;[—@ÊÞ,#ÃÖ×ׇ1âÍdc ë}¸¨E=/9öúfC*äáwpL|m°OÚ$/P5‚«°÷:ë…§:.’5j€q2„Á¤ŒOcí×íëãÐã?u³q˜ÊŽ~¢¥%Ó–-[ö†mKX–ï2oe•^3Š_šm*:ŸOmر+D)6SYjt­Ø<øfàkƒu¤¦Û(ÍF"tõùä¹ÀGV{Õ¶½Vi1îÞbôÔòRâaÃÚÊì}WN¢Z—ÉM5¨‚Þ`“¼ãKÆ{9÷wÅQר˜Õgq|lÚÓ6Ö¿žùÒG®…Ê”&·àÉñÀ½€0ýÂmAÅÉG ¦;ôL‘H$Šàö$gÑ2ž;Ø]õSööÎäWõŒ,|ëÖ[£Ýý”Ž'JÊpŸ³¬æ”Øüºô¡- ë0レÕå˜z×­M‡ÂçŸ0˜¾¤ð³Åæ¼™ NËØ- ÈJ˜Ó”›œÆÎ‡TUмûºÊ·f0;­9p"Œ"È»ø±,A>@ŽuùrNw *ç1›s‘kÅ ž$-Ûyà8G`š€E×ÝþÎÀ³{uWñÚæ>°vvæ•6Ó Üªó4jMLeÉPqå¼$¤^õ{«Ô·ê¼+ž8¨'2¦ý¼\ùµÒ ­]ÕÉÅ1ï\R& ·ŠÜ+Xv¿Z&Žh0Oø n¦E».0ê˜ñÛê1Â~»ÆîX]g¥ã‡që•%Ö´ß ™F†‚ÖÂÝ(~Åù3L'Ûö—ª gÔ£>¿qß䆿.W׈U«b×]0~|‹ÂþišcXƒ|{ì¢lm´;Z%ýðõèhï¤MX„ÊJBûÈ©½5e«VA‹lvtb·bⵄÊX£”½ë/UF·Üa ?‘)0ó¡»e}T4ú˜Î;®û‘ '¯&ÄŠ‰ $ê^W}¨8Z7:*÷2Œ#¿eë:Þg”Æ¡­ëY_Þðf}öW­·fÕmëÁ…­û‹Y„²ß\å%ˆ‡1+¾XU©ž‰Æ«Ý¥†uÅÑa¹¼ÞQ— ÏÅçiÐÙcº´¯ŠgWR~ݺ‘yiZž¼ˆ0³ñõ‘Í8yqx¯¾ªêëC3§ÅÜrtÕݳg¹  ËüÀÖàÚZ—´ŒM;5ù¹'®_.] †¹vÞ”±¹gqš[—Á¤§p—\œÇ;É‹ŒuUÏ!¶« ’ŽXŽK»ÊÉo_Zœ¿èpÜ]ZëCi‡9÷‡ ÄÚ ¨ Ø{Ü[ñvÇCÕßÇß;~=õ8=y>Vº¹Õ‡L\»vá•ÜÈõeÄÔzr¾j|þ¹º¶vرcÇ2KEô¶.t“ (üÉ3ë}ŠŠŠr3{ªVÅV(}ú1 àù6o¸'Œw¿ªê¨‹ÊùkŸ”ý¶8;³;súÊꪪխÕÕÕ•ç€ÏäèèɇY0ÐRØ£D‡µµõž<'Q`st.$ÖÖêõJÃ.ã4vAÓóFx¸”Mñ.pXÀ}V¼ÿà¶Võð¡so­øæ=WaQA+¸¤öslØÕvg¨((7 ¾.16~!Ù•Hpe422j*ôÅäv¾ÈäuéB8yÈîBb¦×¢Îx§Êˆ]ÞÒ× EL¢×Ç:DÄßX<‰n€ Iv¶ÌøÀóÅââ|8ë.i ÌíÛ·ÏýãK`ÔáV5" EDB‚¹4”%èÂqpeàqý&Æw#=UóL§\¹©yèåK“´Ë—·™š ._>VPÑ9¢ ÉøÎa_"l(dÍó‰®Ê>žwmÐnhNÊ8÷n}ý0·¨Æª¢üí†CòÞï–´LKiji<3ßOìoÌLÙ—t'],*b!྿ô[NùHlìˆnW©SÄ'‰„†Üƹ÷ÕŠí+íííË*+ÉC¯ {Z‹çÔÇø °’#ÈŠqî3{ó„e»Mßö½aó±}è¡„=#ž÷c%S?¹ª ­÷îå@†Ñ××—y ƒŠšZé“'¬&åî·*c„• 9ÊØ´©à7"‰tp|ðÅÎãÇNœ`rw‹¹²z+ßc]vÕy¼påŠÙ “¸¸xÓ‹‹akÖ¬ˆ{xD «ëš›š Œ£/^¤­UÕà[Ñ2ïÉ  ÕOj2ZqR“ϲ«ï¾D%ºÆÞÿSâ9‰8uߨêA8·èÙ€……±•a5š¹ðdrÙ§åeþ¬¦¦Ý¿ž2U_5OoÚŠzË\n¬TêƒëÑ÷Wågi×ÿá)ƒ^ ÉOy”C¶ )> )*’ ˆõëôQÖÛ´‹åÊ6/Žß÷áüHoic£‘$µn"¥WÝÕ÷MwwêÍ›’TŽÞºúú`€Œ ªºKªÐÏ7Á¶ Un­ˆE $=㿘?VAŒ¼VµôÌ #“½~EzÎT¥£ÇzÍ» ?o¤`íwæÌ`âÓ ª.)×{3î7ܶ`º zØX…+V|ª.IuÅ \>¾³/ôI?‹þcŸ-ûÈfjMdíÕŸ«•#­Àï-¹\TĦuic®%@ OoXj_®C_¹z~¹z-m¾{x‡¡›™ãÉæFþ†Z[>qšÒ‚‚å2@72Í ùBBB„gŸÆ!@TdSI¥RKž>]%ËÜÛÛëäâ’®/·v{ä‘C•uuw<îX—þÌ%g}ܳ©©k×ïJ<5º?Ô9 ÏgLòèÑ£ëâoT+(ÿŠÉm±~ö.#ÿb6ni“»çT#Öa›ÏŒ;s†UMMB¥òâf¼TTTÐi/'¦wÛ6¼<1w÷ÀbÃñ÷UÙõõ—+Û@dúâ–#®çÆ«W¯vìØaõúÐ>VëÁ‰ëGþç*§ÆVó xɃ`ØZ®ñ¡ë„9» `Ô néú©çv/óÝ3š2F‘*;S@ å¾‰\½‚k3­ªˆ­ÒÓÓ»j÷yþÒ%(x3Î3Û¼y¥âì(ÁEV>ròä!Ü­•’by/•±{/8&ß=”qn+‰ ï%?¼íÚÍÊÈ&´´àbk‘¿ŽžÞÁ­"[æ711qúðŽ Ôy¿A¢”.àEzzzMm­ÍðL߬Ë—[ù6*[[o¼wïÞÝî÷‘‡—t'ïuÖ¥uÈü±!YЂ* Zlëè ¨îrqž&jì²…²* þS‡Z/¦€ùŒíÚîôú~lÌ®]ü‰`é%ÞÎø¼{ý`‡¦fÙeýK§.oó/bÎ⿞eí{4æiSå‰7÷î1pqqÁ=›‰ ¨~œóXôzë|@|i}ýÍñK“êûNŸ^œ6éž +Áp׳Õ? ø›ˆÖ°°0rÕñÃ##%`2ŽŸˆ‹w6Vܰ ¬FiÏÓÔk”PÂç_uªZLÍ-Gó‘éÑQ7ȵñ\Ö)Ì͸' +'-+ËWwQ«ô~ìڑ书¥K—v8yž˜C0Å˘¿:ç¸éäéÓŽËL }8[ý'Áª´½yØ¢sD8P|ýöíÛ=×HKA›œ£~lý6‰5÷€Â†ÂoÞDû½ŒãÙâ±9àãKàu¿ÿ*c¬#a§óuîïù¾QÕÝ`j«[çåá‘çwpp8 ôt5GyçÁ  öÞÞÃÀ¸€[MmàÒß©÷b¢}Ö~öÝ;—¼¼¼¶·-w:ª ý>¬Nöç}÷î]ºi%ËóÆ9•ï;UUT,>¼ë»õ°ËÉÉÁ²™ä»©ËåÎfä“K|[aNã{7ï½®rNà‹Ôg®/ˆèW­Ýnñöåí;w–B Ãeë-ÀJìÐÐX½ÿÊE{£:¤úôd­^ph(”–r‡—©øÐtâ7”ˆôŸݲ…ß|ÿ,Ê"Fñã $Bò`ñyy{_æ9OŽ=3ïçTÖÒV~?2²*y¿å“ÄÃà×G ˜€{®S–-_¾ü*õ!W¢â~!(á–ïÞŸ~\tÍr]f{í;*Ävá¶ö)BKŽ-w}}=m@0kp¹õÈ‘#"WêÞ0w³iþšÒ06î¹{ïwçËFQhoo‡I®.ÛÄ( \da44»ƒÊF#¸eBŠQSèë©¢ªÚ~Â<` 8w(‹mVx¯þ²>äʇÚÀÒA ãÈ÷b`1QÖ}ùÜljâò®h^ãî+&F³QÃꉣûÂ;:Hx'ˆa@JÚ&Z÷WÐzÍ¢„¡Àk„‹ÅBYÆãõ…Y¼RHާªªjÏ)Q3,^œBz¨ö+‹°ß­¬dšj ;}š?<""˜ª’ &e€©€.lwr‚MõmЫ!#ñÐ!æ• >>>N®®¥é†NC¯äSùüðÀ!@±²²2”N°‹QÇÙ%'''$:šõ¢vr4°¤y·o/‚¿mÙô1 ??ŸÔ[{¡#C*§¼þ¨_Ïô‘¸¸°,Jºº«€qÃûM^¼!**ÚærÛkzÜ>§?¯èÅ”|ó™¨M(ǶmÛÀpXbiÓ|‹ú4ÝÚÚÙîs>@ s*lÕéüÈsl-ʺ³]U5%/‚ÑM7­9@ü 'W¬8­´¹™O-Zàð1f…>!×7°4ÿÓ 753‹ ð³¶nÌ2÷^C'Àò̽7Ê¦Ç çùÖ¤éùsâý#¢'±ö|¹€¸Á%¥äå…Þx­ƒ@¯¡kœœKú2®‘ÊÃ÷u›“0' è0ëèŠÏÙ)÷×]]‡;OɺKfff©Uk6í¾ dßÎÞá3j¥y›¥Áûüùs8[ºŠµÍô¶éÑé›^2VS£cô¸mߨPkroO|çÎ4k벞o>Ÿ—)ï?uürZÚ?Ú@ÓµÍpø‘$Åýg6JJ^?~|ÍHža†Ñ5QåЫà cà²% ñGÞ¸‘‡¹”‰éàÏáK2’’¤cëµH—/_ŽDTÔ74<¯½°sïŽÌ+–-#‚yTQÅ‹ ETì!EW¬\I)//W+‰Ö54P»«“-޵”u³àåå?˜x•ˆ­] hSUS»µo¾ $d¤ øã”-Ö¹£L6;#4³uêÝè(`¡±©•0‰to³”ÔÞê3ò{ØûìŠés†A!ÁÁpà7 ÊxÈvg><ª¬T›ùLÍÊê~´°â0˜è+£HD.@ø4[ÛMEà¹ØÙïÒ,‘Ž„P@÷A¬ï¸]OÆnÂZµh P_.6m--*ˆŸ6¯[Ü’ï±Èbz|cÿ@m™››[SE? íkGްt Ëû”Á®‚`.ש] ë7éd´o_y³´t´¼ßäp¢ÁP9w·?º|¢ ”GF5fÎÛ¼iÓ&žš”}ÏœýsÝm[Ï,[¶l³¨hÊ“ºb¯‘ƒ‹Žà+Š.¥¦–F n©àö)ÈšÊÊAœ\\È æ%™@ 6KJ¦7Îfä’·ÙO{êè°»º»ÇºdzÇc3+¸Å#ÒÚÖ6â–®••„>Ð1aßêdÅêÑÑQrŽãæøË×¢eÆœÇú ãÏœ1Ë®®g‚qññíª†ÄärFFD+A/^¼XâU!w¯Õ/ëo¤ÄÇÇÃÄÓÿ4•Éø:åðäì¥ä€ªƒî€dñ]È­âæâª¢È›\m úÈ.þ¸:Æ÷ã azü…ãÞÒ¦MÀJíÑÔÔŒBœNH¸ž–&á,—±;›+æEžsê¤ÚÊ-—ö8ï¡·¢¶  à›ÁÁÇçRSmÍt1G*ßû˜NLÓÍONN£ Zß”½Äextt JM¿|)0øâVveTddMŽíî‘i€VÄDDÎVôr¬^=Ü{)9¼õ–uÝö œ'ÖÉ þdr€n½µK!µ€sxr„\àý~»¿MÙ¡UN¡×®!¦ÆúÃ@WáûSZÝnÈ{ ZZÙØ4ZºZ®SZØØ,‡+ Eµ@8;¶=øaœ»/JfCà¡©©©íiªZϳìd•Ûo[”ml$!d] ðä‘ÄÄÈàà%#qk`W¯_OÉÕ¶ï’óe.**êhöŽB›ôë’ ßZ.u ,p[Fvѽ¯·LŽyyÜNN¾¨ušÑÔÔrÀ{US¦À£ïº;yH™ °Èä³â![<ßn1¦ŒYA À1€X“Ê9ƒ>‚p ¬ùL­‰Ä€Á` ])\øeû¹ôÁ=:ɳÓÉ‘QQå/vëëslß¾½c»ç`s‡öîØ~àÛ¢Žj ûúY«ŸQÜ}îœX¦é.Å“kÃïl6 ãóPÆÛEœ/.¹Ä%T½` TY{ ¡³™™š¤äª'O€ëG9~4Ó±„0kÌýÇ8XÅÃsèÀb¦ÆM¡oÒR*•­‡8¢â$­ÂD[Îõ\¯¨h>³¿kJ}«ª-ФÆ=FÀŽŒô5l:LnŽÃe_id` º¤,&%uîÂÖϵ,4‚ÒïжY’¬ûA°ª°­ªªKÃX•¶m[D"“G^8'‡Û½@´¶°c}÷îÖÃ×7%‹œ¾æ°s mÎÀ›ðHâ…8*qA«užõíyzRqQ™“””TYy¹º7pÖNÀ?JºW4x&šQ¿EzãÆËÎ{aw=Z t7lǺ{¹ö/ =›%K—–TU-÷S0ŸDc0ªnnèWEþÃÃNvMW>|¸©Èß7 ñû `p1=}9›À•@j'gÞW§œ;wÓyÑ›R/ŽMѶQT~qç¹¹¹Í ÿþý#yÌ:ffщ‰PÜ)9¿·,¡íËb›-\7í_ä6ÎÞyç `,6mJÅþÅf$òz5]›ÀB(B[w®££s0<=³¸JQ§_ÀnFFF˜ä“Y¥ŽsÑ:*4Úz¶jÀŒ“ôûó“lÏef®ô÷÷çáå•–¾R‘å±ê‚¦_(ÔF«o˜½¶½ÿÐ1ÅÌ&¬ ¢©é53í³ ¦³gÏ¡äýyϼ&ÇÍÍ(ïË¥}Fnìe‘?i(‹²®®nT2Á© dÜÂÚú0ˆ SmŸ]CåÒ®$§‰·¦ë6lP^·š8;5ÖSw‰ \–Ào±—Sõ;{Yö‘ õ™J[½ë`Dâ_©P(ëBYøaì‡U:8bnÜ@I›0kiiA?À³²²z𚘚®Z³fÝ[OÀÒ“8G!àyûLŸ¥-s?-$D±‘G‘¼’‰U 0'œÃ˼ELLL†¤æã;‚½>‚)ggË@XÖµë"ù0/Û.åžÜ‡`R@ÞÇÀäÛÖ¬þÉÙÖ|»þ¾šñÌSùù²ƒƒ×l$GB¯_Gn6Î] ÜsšË¥TÙœAóÁ6/Š OŽÇÅ-J³:>òqnjò¤ýú¬Î®–0“<§E4 £R`×Ã÷ÏM·¶¹ô'c'§§#&ÞÉMõzU¢›˜¡¦kkþ:"ŠÅr­_¿ €ù³äÃ¶Š¤9›xx`±/ Éû´U ï/{ýàX,@ßýå¹oÎ^™öWŽ «}µo°ÊÚ>ß­—H0¢ŒŒ¼>¼»PÆÉ â÷Lób!ªmßÎ851Óõðij¦Ãs‹_uéÒ@·´¦†Ú ÉÕ /›aþÎã'Ž+:(êP0j”G1X¼&À¬»Øþþ„ø n`ØÙqǽŸk“ŒŒ¥RÊ´ä9u½~m°7úÞ=%þF©Ã{ú5„6íâx~´’Q÷|ûë¬mT¼PŸe›[ʘQÄbwL€Œˆˆ8Æã1ØŒ‰?qbC@rbâ#!¿û ÜðN)»†“’Š‚@*çš5§54–ƒqã󈵾~ ÉÐyÇ_!ŸGg‹˜¼x<ÀÛЗ‘é™?.~~cñ@}v–¦P«< xMáfN¼þ‰®ìÞöìqIIR“Æ{½½ ;wì°£%µäfÞ<>½º»ØÑ™¾o¯Ýrl çWM¯x€‘Ãîþ@Olª¯ -[r¯Ò¼8À´@pŽW{ß¾„¼‘‹;Ö‘@WÜÉýo"øðó¤øÊëÙ³Õ{TSߎo€NœKÓªÎçh×7Š„—ž¤Pk€¹»ûðaÆ^Å\½3˜ò©$8‘!0üá€ÊGu_ß§)Öê¾þŠ^Ã0X ”ò<®}~ÃæÍ+¹¸¸Vùñs„•n0J?Žë¨îVN|ïÞ½5ñîx=åî±ÐËKÚ•O [›âX5µ´ø ´ãn:hé-ìpdE=z4¯):¶MÑr>‘|>Êfg#¯éBÆ4öú3Äü\—¾DºK‰~»Ò¶SLªi´—ŽUiÈQ>¶p9‰Ë#gÏV…\Î]e¿©Â]²Uô–Ào†4«Ü™ú¬.Q¨ÓC‘î×t™´cƒÞ‘VUE¨Â>>“dj{c ÛTt¿*x¥fY Sç‘LÎÅâc1¾M[]·}Ú9;y©LõÙû’vçôäÀEb‹D6soˆ(¥ê4•Iµ({¥s.rÐJ¶'öT]Ž|Ý}BL&›ÇÛ[üþc©í×ʦ V¿îâ\‹º“âNI)jsÚWyâè‘|/ÞÕ£ ³kªö+Ú¡Ù6h¿:pçgž‰ì™ØÆÊš"A35îzgÖQ&k‹žý,Îï̳ä¼Wè‘]4ëtêêö2º-jsi¸Û.±m÷ÄΓ§e2‚1•Kcv;#Œ×‘Ø™ƒÛœ`¸[¯Æ^ UF ¦Úï1o† èèZæÕf¼Ú¬-žkœÛ‘C»— s)âÂSéé¤àPF%WבãÕ'Üñ«ÏÊ{°Š‹k}ƒ7:÷¥‰‚Ç`8SLå‹´3™¥Ö× Úºº »{ ªN·íïvæ,:‘±\ú–Ö…’^¹m.†:fgB vZdš„?½å—À()<ÀWÚøp)£ßsÎøWsý·Ä…*mõ.p|1óáîWÇ*F&¥Ç‡ö‡ß»75Øx¦8ûúðƒcý'ËššöÌæ‰®†É¬0#e5H¬Ys°´=p…ôÝEÁb)enËM–¦mJWÖ×å4lV6Vå<þ‚\œ¶1­Á·hjjJÏW…¶sVá†Æ‘뤥wyš›Ÿ§$ÝÙ‚¿Îº"Ðí–e@€‚ÆÎôrošL2+Î8±.]ê73Q¼AÓtܶ°Ž‘Q¼ÆsµhËÎ/mðÎsß´béRª„„„Z@oxx0;³Êêº/§ÛpFæ18#À¥¬(Ë„mº±6 óÄ™ò¼ªàl3¤™©v¥´iñ¯÷’Ø´ÚH_I•”žriɆ9+ÇtI¡Wz1[sú­â^ß¡°1^F1”cƒÃâ­IÉëß¿Ù_““V^'ç3ͬüŒMÕAWºJÕ}QÒîT“a+óröã•ã©kãB¼|Äı\Bl|>><œì0ÓM›ö†©~Œ?±;R|gtûh¯¼ân— Àm6V¶eou?¿±²éÅœAö%çÛ&yùûH•Ñ—u ìYœù‚Î[v»KJ²m|öNTbÕ¶;w$GìîÝÝűQ÷Ã!¶]A;†‹Ò¼¼y#±iÙ⢾ågôúó”ö-öQ2Я­Ñ)ɵW`^™¸ײƒSSƒö$y7ß¶ŠpþëK‹UÍZ®”9ß-Ñ»uA/:rF߇sò–ƒ§°/ݸöA‹}šÙ|É8æ:—ÐGžñqÅö羑JÛïVU®ÖçE z—¨©¹JHÔÞ¬îrûÜädX|I—´Ï|e^îÆ¥]åJM††Pñ<žyLvo<·u¿²©¹õìÈÍÛË$Òß·]°$7blŸ/iùÙ„Sç­)”5 2dë@¨œëÃ8ºš­¹¹OGO/0ÉÔ³é¹{eM ­¦F'Ëç6ÏŒZ|Og.ÅëØc×ÁæcIWó;Êó¹uÚôøK/O>zМ‰õ8OEûÈYª]¤î¢E=*ÕÉŽ..tí¹ñF{à9Ç2ְűi¹×2pï<]Vàü¯qvœ·"¦u¼¤7Ï„u½vnyŒ¢^iãêeIr1%+G›}ÎÚŽš*o#¸ñxÒ»VÖõ™EÜÖ~ÎÎ2ímÃRïòpl¸a?ÔÖAÚXÚs(+k™ÏøÀr3©–UÎøÀì!Ë=·Ä/Îé _\ɦ„rv(ѧ¬[Ó k¯ux#Ì)/°]GˉÏ3™#ô2w¿Òá^Åš8}Âð»®-Nßbóº¸Cà‘·œôjŽ96θî7"Øg—ÄÆªç¹t­ÒÓwM¹p!TTYáX)¼l‚>'lã}骊«,¥Ã"c‹ªB ³ÏJ:qZ<-gh]9ǘÌ6“x´~=W×PÌéE‹^Uu;á{^ÞÁmwhe•"“yUžÉ?±âš÷{U»f·e¬LJ)iUhŸAçÎ Oä¡hØÝî½M…[V3±–ÍÔÜcߢ™÷{…ÒpÎT {Ê Q,ôæ¤XAtUiÆ}¹×r23µqÏ&ŸUvÔª®ízÝÛ5J×X¸›i,2©KSuß)‰°Ïú;3Ÿí0jº{ exzh…íÌ£‡'†ØyO­Ûe> G×sí^ää6°Èݽ÷ær{{—×ö‚§¼žæ­q;t8½ÃOÊZIV-¡âýfá£7GáψÒoX“Vhjñnés¾¼²óîýXLt·¤Dàî{åË÷Ìõ›¯Þ½÷AåNM¿æ­³^SèÂæók`k8½OÊûJ]qsìè¹Å_}Í×sÝ“3…LòòRNÃ’¶dƒxŸ-®ú#àLë~EFs?„GIUl7·+ûX§íðû¥5hÐIë½Pº•-›î¶2©±«ë1hÚÖ‡-Û¬°´*î­û•dÃ}û¢O㎭Z¥›ùª8™A\\ˆqe£ït8%g·L¡QZzÍHœôž¹L.âÀVƒ‘&‚ê1³+¾ËLµL×YŠ“ëÌO_Ýbƒó2ºÈ–]~%âiŽén^µW÷¡¯ u“LߣXïòädïùwï’Ho(¾#£×ð$‰4 «?y²È³£Li¥@SÖÆ{6c*b¡O“ƳsO0úöwšÏ]/Ísž½Ûé<ÒŸÝ>٦Ͼ\DûmNcýÖß&»žßö8‡§ÉZ©îˆô;4LWW]·1“õà˜=‘øôÂ6*…ÆÕÖœcy(RóÞ…lGΜ‰a¬'ÚÚ.ßrç­“GîÖî'nÔì¢ðIU§Ö¾èûbaÖAE­ö)C{‹{7ñßàþØ=kxr© ¿ÌfwÓåÒ\×™oæåQ– ‡66i$gœ…EdÍ6;£÷V¤ãýnà Úà6ZÜGä¦:`–ƒ˜lËÙxEku Ê*ÛKŸIwh=.¿JäÚsÕ‚ÇÎn]ÆÍ5\ïˆÔ1á5Ü'@Dañ+ ìÇîíº8y"¯òø±Õnê·ê»Öˆ_Ê:°£ìÈ‘#ïß_§¢²®LMB†ûœ¯§ ~ËDp¡¿'`*‹††ÁîëÒw"¤-ž(âcÂ2„ï™T4÷N2((9†v\rUlwn&Gö`Ìeý—]Ú¥%àüpbæuFÁÝ&§3ON¨™——8zÅ´Ç‚ÖX›ãçW³mL¬xÛ²ªÍ…`Èg-)1 wHÄ`í§L¶¯Êõãå]ÚT¬ÈwÇSí\ 3›í£S0Žc»0´Ç uM9›¶mCµ ¼|ç›#ñD²2#M(ªZUŽ\´´>ÃÿìY%Å“¯ÙÁìty;:ÌDÄÎu¤ÛèéñÆÕÇæ-ß:ôjê:«þ•¸eUÃÆ£Ž'·¸½eºÄ‰Xõäå– ÷îg¢SÖè)Þñ V¸¢¦žWNzL¸‰'˜Jm²!.Ú¦~Ø‹'ìáRŽÃ 0‰´´ûð{ñCÀ¹Ä9*ò%dæÌÙ £Qù¦qgèÓM6ዤ¡Wò>||é'eÝÙiOnÅ7†edøŸŽ¸¤²°|V¸L,.*³ŒT°²º´?MŽ¢ zp5·©]óGÓý‹ûd5®³ÆÄÕ{~URnñîýÎu|Fº­éQÞR°æ¯"º(Ùñ‚yE˜T™ÝçV©*·N(4 £,;>t=d_¶¤MRòà¥4æœ]IgÏ_ }°ÿã²3«“ïíN®&¿È}Ç —•ÝêØ”¶|¹œœ_^<Ÿ%ö?î yz|Ódv÷¬$’×ã$¼„±ªÊm"ãú÷gĦÕ£v ‹ìe³Ûøt씹—$,ÒØux]ŠN0Û+$r·ŒÂV“—+œð£Ï9=D§ñ,å&ï¹×Çë¥7\bÖÕ­¿•~“²†"ÒfË5m ½W«¤yóÔ¡¸µ»ÏùvÇûfhí o-,Ýek»rO{PÑG>³rõÞ‘Þ:ü`ĵmÛà/9—ª¾ãâä2Å;;Å+&aêåE¡¬~SÝãXì^z|c…‡ø>>Ù<|­šƒˆHÛòW…›‚œœ’½WUµµ1åJW‘Zƒ{œ"%5SY, ¬ºž" ÌmÍ»Î=S¢3~í–rýBWn·(¿Ï9y“ß}POxèèѳ-…6¤ýí§‡_¿$hz­y(“JŠ$VDBÛ»wžà2¼ÜòÔ^ØÒ¥I}[W«ƒÀ[YGg «p£PLÄa¦»Ïž­2Í¿yÌÝJ+:Yf«†æ"³íoÄÄ/n}9‘V}u¦àÍvóóÏËÐcYÍ“¯pgöùÒ¤®l0¯´¨+ÙÓ‘¿$Õ'æÜØ$ã"œ-ʘӬ¬Kú{t8ÓÌÈÌ+W–ÎͶZ (ÕðT=O|Ûâuö,s"Þ™ßôŽ ±j±æ)$_Vö6ó‘;.&{"/#:Nvtmaõ,zJÈþ¹A<*lÊÈÞDW;õêÛ—²‰·÷3^ÔBÌÝøp’¬È$ž5´®çújg‹×;š%E”´lêwJ(ô0+mñG}¨à ¨—o®ôjµþ˜kÂù= é3V[š¹w|x¸çYzÿj•r}LöS€ÓzžÛlUOê‹É]}˜Ôý`°)ßV¯¾jßý÷4Z—›oÙUÍÀºTº¡7ëAŽ”1û ââíÄÀ+99™¥±¾À…¥n·?xNŒmƒö¯x4\væ}÷¹2:ãPÌþ›-»»W”¯”Üç¶YÌ}ûƒ±ûëoÙ´´x»3ñÏ5*}Ʀ¬½“ÍUð émÍíƒ ²¦se*b§åxo˘“úBVè8¼0j}C}Ý^voRÇÌÈ8ºîFš5ÇÅУŒ ‹³Åäå…“ý›ô®´µUK’öjB~Jú2Ïâ™ü*YÚë`¸ûŒsŽÞ8z­7[«I0‡ÄuLZ•¤gå=ÍÑ»Äâ8-©¢MÏy}3ÞkoØÚ[-†í½1n1=¾qxølÆ£ï±>Áñ¡˜ò³OÙó0’Þš„q¹ŸØ0/>]íî¯æ¦„3XŸI­oÛ¨›³©Ö (ècþ±¬}w ŽÊ D=_1÷þã}ÉGODqÇß–RfkkâPÀ¼¢td£>üe«paA!U0ú¥ºÖãcu>‘| L?r@gnïW\zÇ#¤3FÑAÙØXPA!À[«›Þ[Rg}Ãâ¨:Ö—`³¢|pžswûÇL}øPRZº8::ø,Ûº·mÇŽ[OcíÛÚÚ€Tжê^;wfÈ|ÿlˆþ¥]ćñR×Wž†\k­‹Nk:¦sÅ$s!oxò“ÙàJëĹgÌ~½£â‰>:ݽ0ökRož/N¾a™á?cm+Î~0ƒ}Ý×öòvvJzúºþ#¯ïMïztP @ÿ%;^ÀxEtŽC¬»s§GAÈŽ2 ‹K‡wÅÛßm¯jMÚ¸e˨ÈÙÌÌŒyÅŠÒ¦kd„M½DÓ‹-w<¡Û…|Æú "AØ •bë©B¡œÏTÞ`¨ë¢±O¬lúDŒš©g€à¹äí©ÉDÅI–÷¥¯+éÌ-8fczx Cp$Øõ{J“‰ò+–rú,ç†ÍLvòÎLÙò†0¨ŠLÿ²í­›7ÑÐþJõùÒ#¢Êp÷>·©éÞØØX¨Ä|ÒOá¢æ©ƒÂûgVA%‘BÕã‡NȘ‡;¶{¾}I˜ßNŸ½|4±¢¼\g߸q#.Ûmî¿ÔÕÕ–†©h®ˆeܲ|ûŽMëØ™Ÿ·ÜÉnʵßíi*îÆÓbšÏMZš¿)si¯JÙÈLú¸ûI­ë ý7žM1—§Ò¯G›{RZ“gÎP9)d7ŸòšéN¶ó?!=ðTxÿ}Ù5§ªm¶02š#Þ°Šu—@ŽÍx3ß~çI³›‘ºqÓäh×ÖºP‚^_Þ«´ƒqË–¹e/f{ís3ö L“mÄîöK= ØgB¶ ÁÉɉux‰÷x}Ö©mëÅŒŒ‡M€%ƒƒ§‚‚J™ºù׬)315ͱ}-¾~ýuyßq¸  `®k÷®\r%kãÓ-mwUð ‚æîÝ'>|øp-U-æúeýKH[[[¨žå^ié©ððåÆ×HKW°²Ò°X,Tø|*{T^Þä,ˆw dáE#*š@ë“çΉßv‡êr8ÖkZlß¾=ad™µV¸kG†Ÿ3 šW…cOïÜRxS-¼þé­¾ÃÎME³.½Æ çS—aµ›#9×îþ ö •?Œå¸æòZÃmè¥OŸ…‡0au¡¿Ÿ“u¯^Ïøà ­ÅAlûÓBˆ‘a)={×6‡å¬¤g‚£UZT×C5â»×Ú§í“^{ÄÌ›Çå7ç–éb¬Î\Ö0žs fccB÷-ó”Þ´®» ˜cem½MUué Úã©´<‡Ö¢¨W…¾äæ›Ö:FF‹ŸMßçο{Çí­c’÷…%WgÏ‹_Œ²¿";ÃÖ;YÞ¾5žH>d|«HÍn@c³1v5l¸UÕÎ ƒqW@µsg‚£Û45_)é(Wƒn{Z¾â2:oÄÝæÅ²ŒíÙ÷"’Í,"&¸L|=Xä‹úMd½ÍŸIÈ,µE&g™±°ÈËÏôö¯ˆÝ* —ÉÖ»œ&…SÌè?½bÚ¹C×Lº¬·n„cÃQÝþò%i ã.UÊk$„…ì8ôaV/ —½ÝÖ‚èrqÄgõ‡¾}Û,¬©¹ºY¤ªŠÓ‡­Í½û÷™÷íãT¬}‘c;ñÔÈtƒg~~¾“§§š›ÛMüƒÏ!!=}ýöž‰€ çÏ‹¼1Bò óLMMOž:µöèÑ£#‰‰&ƒ3»ñü§Ç y?>Øø°‹‚Ia®ˆäÕ¿Äc˯¦ÀjJ?ÏÚ Gß ‰‰±+2d*h<7md¸Û¨’{ÜÜ"¾esâmOFÛêÌÁ˜Ü¬7#iË«ªxnÛó³F îIÞÚR{á:ëåe•Å‹ç›MeWƒ(álâzÝ=÷ÕvÜwxÉzËÑawré®äןoÞÿä†^Aø£Ò ©Í©Za Âaéu» —¥-“ÄØ¯Z"!-Í;™ &+ËçØZ¤êå…‡ÊQËÊTìZ‹ÓÓÓyä}Ðoª“etããã¹®˜† Øn‡–1uBÕ4¥alD"QñxÿÇ÷‘ŠE~ƹv%ãƒ/V­Y³dÓ¦MÃü€ B4b£ý4v-ûãäTuNݸõºcÀӖÆqÛïÆly9!#K›æ9é.Ÿ©~CŽžH“È}d4(øèQ[ž §´”1cж ‹=½’Z;ã@(tÛu‚8ܦ ÷¼ù„üÑQ?<{é1‘5ápëÚ­P@^þÕ¢µ›É^ü»wÇz{qÆí~:‘Ï »/÷2†Çihhø²Ð—›J¥êèé) ©ªª‚Á zy 4P?¶¾}¤³2Ï­wu`¸ñXÆîìŠw]SRSƒº«“ÉÃm%“³­P9·Öi,q´çiM}}Ù¾ú°­­EþrÅJ/oïöž§©pŽ)¹º’Mq&ðõkÊ|éb$Îáe`PÐâÀ9Ç¡6EÓŠÑŠSgÜL]üàš=¯ªÑ2·¡WLVo.m´s¾‘q{¼*ßá„-ŠÈƒUγ‘°;iÛ$©Aó8|9”Ù:ÝYvVvß=ÖEÂ*N¹ïòn™;×Y íê€+xÒ]ÐZƒî¹ Ü—Ud3ᣉŽ\yIIn?ÿ 3¯’$n3§âMÆc³ŤñÇYÒÆ /Êù‡˜‘Ù”ë3m.¯>ô ¾<¥6yÖ‰6U]VepkN9;æÒú]¯õ|dï¬ó" VÝhõXvËh¨àFÈ;Îñ‘jæL®›ù^Öß½'§ÏØc .ncÝÅHjxöbžÉƒËZ!&»dR.*EqØ÷b3KŸ§Òzz{Ä ‰¥¡Ë'ÀqôÖ^XV«éùóEï|‡ ÐsôèÑ´¬¬ ™™‘““^°Š(þÊØµj=YüOž<Þ;þþýÀó8¹»wîã ¢¥¥Úôøà2fæ<÷Çåܼ¼êÙf…WoÜHÍËã166ÎuhÑxvÅt¨o¤a·9õõýX …¢£¯¯la!âááúêF¥¯üz¾íçÎ[©ÄhäÚ8ךE±®Õ³iÈÑ ð@ƈÅ{X}Èô¼pôäÝ­™ù]å2Å*ÚæjãäïÝr vV<ó×{1ˆ–Ú®lÓW¹÷˜&©Ã`7•='q2…¯·ÆJu‘jY\Š6V<¨\½!Ùã¤ü«›¶áá÷>ìißœöýêêÊ–AXˆÒ¶]»X¿÷ë¨lÛ¶èÊ•+#³>±‰ú¢ z¶ÕF†F’{}½¤"ÆeÎmÕ½Û£zJÞ;›?Zçau±­Rø9Ú]]4‹=Sl<×ÈG±äf_só¤uŸwwÒªf‡Kº !o²÷8ƒË '—ÿîÍi呉¡ ®ý16Q»Î¬ æºï$©âz9ËÐuj”SOÏ¥©x]c¾U[;æUáàȈ7ƒyë†áw.%5W»Z’2Ò/‹½Ý#°b\ª­>N?Ëá½A…er¬ì~rñTø®Ù}ÕmYz €å\Çä§6ѯ6KK‹K¿•°mOw?}É#éeÈÔ-7hˆ¢9¯•cÆÏ.íß‘J4ÞÃó,`êð „u0 éðø \êÓÕkÝÎzð Ü ;—ªß”‡\»ÖßÌçÁ1Ü+¥ÊèükÛtS_Êê½õXóYµá«*!÷w×ʺn³öðß¼Úkp¨bCéeöüŽqqÛ™”LM÷ÊÕÀªû’^¹4¢’îo)éXñÜ̓Ո5x:„CABàan>BB.ó]écçPLaÓÚÝYµ[XrmŸí÷kóûøaÝö¨¾T@ÕºµrOŸnx‰iÓEÍêÌ䢓 }FØÞqõçkÎH§&‘ùe§÷uôØ6v¢ˆpv`‘‰ËS"’³Nyß.§e¼áêºþúîêsú©ˆœˆϰꊢÂÂ\c_«µµMr´•…î×¥¤éxuÅävtñœÒÁ éá§jû<¶Œ3²Ý¡1uX[QþîH'·WßF5@H»ÌþÞˆ¤£nû˜î%Wìñp #Cjxw…X-s¨6ÒÒ”{,S|üfž¡jÈÁ1µFŽ8vU]ëUd¹Šá·®CµuW. $6¾ïv‰9yÕ–[¼âƒÃ2›ú%L2©™šågäoÀO íùnܤͺN×(k*~fætÊÇ"¶˜;k&ì´ ÍP”@ØdTwjÛÊ ˜2R ÕÝ—Ðj™qñRrj~~n9%#ÝÆ L8¢»³Pø˜é­#Æì¨YËŽÖ:óYòìîZ,#ûg7Å-_Ê11P’’tavhÿevÊ`ü­ÄÛág[Øš1â×®…ŽÞ•’ŸßÖfé5ˆQÌw¯ÛõÑÎÛsBOãþNC§.«e ]6&•Íc¹AFS«ÎqƶŠ¿r–‘ޱñH~ùx&øƒ€‚ïÉ¢¤i$¹gåúÑäÀEC|»ßtspðì˜8+ÂzîfË“ÅÓã/6¯ßeR~/„̳%·8÷…·ˆâìñꩱËvÏ]"=›‘À#›y—3mÚtƒ6táÝvE{éu2ªÛÚO¹¬Œ»Öoyà˜ã–Ä)ÄPš±­IˆU Ïy.ÇúðóôJ!K``±B-;¸û¥UVFY$T£5£Ü'êϸ2±^•Ú¹êaüS~Ï‹Á—»‰)G—®ä©‰ŠÛ4¤pO÷…’hY$€æ÷q£¼£g…½Ù-iÓ„]Qy`Ði4·ìUƒ2G‹I«¤ÊŠõ@5²žQ2Xyj´,ßIUsžé¬;¯½7©€Ï•Ãõâ´ÖÒŽ%o›Ù½†äw9¶T^’™˜”Óò$Y/)<·ÔÛ»|àÅnófÍ›-µÂéW®P§Ç…'gÞ+S¨¦ ½5~¢*Ç 6«©ï|`Tx± Â2Lü!¥ë¸QüêŽU÷˜Ö*´®L®ñ°õLËJ'•¾¯Nu´ºŸ'¸¯}üXuç‰õïl˜žœêgžÌôx«§§÷àÍc^¿ñçÛÂ#vò*¼Œzf.yçŽþ1sãÔFDÓ’rÊRïËýæžòöopï?½TT4nD¢nÌ®AÏp#Œ¥½($q“œ´¡¯äEO&«ïÜ6©~,î1ét†•…ZÃ$lu'éN">¶²çiò»W¾Õï›mšºY¹e¸nд§±ÈgµwÚ]¬prWRÂø‘ņê,'b$nŸt z¨væ9¨ CÂ*Ä{Ä/fzUQQ¡”QXòFÆüLÙ5òí¼Û¸{ºLI‰?mW¤¥Z|&«m»ƒ8«Ù û,*§QéÐh´xôð°zDÉõ,ñö {§z96éfžÊ’Þ´vüv7üFŽø:!ùѬ ýÞÅì÷Ó21Á¿zÕlœalt‘æ8Ùáøà±¥§ÆL3©/"F»sÂÀÌàñ˜+gӄ㳞œöÇÛ)+­»`×À ºhS±ñƒÚóêÓmOÍ Pįu¨™y~¥8QîAEìÚŸ~)ÆG'Ÿ<Ë>çwöl¹f²BðýûíûzS®ê¨k>"6^ѺìÙýØ·**“8‡ábÆåÕÇ]7:oò­?_(Ê1q'åR6ÿNž`v6-0®Jé¬nnú±ccYÛr× ãâ4…Ìž›ÐYϯ¶¢±Ö*–žMÍ/ž˜M7\·R”œëPþª4uo6 N/7ñrƒ[EE¼”#º÷˜åjKþš\;BhHÈ2™â™ÍÇ6Lפ(w†¼1×4:2‘t°À`i—jÃIy‡àc·Äw)Ä»½;2 +ºl9{Tÿ¸]Ãë×µµOÎ=­±{žnˆ1,Œ —-MÌwIÿ€Ó¶FÛùvq^¡Ò±¹Fï<²hÌÔZ·.Q XÍöæÎø`ÊÓ|¹Š×^i&ö„VהּLLPÖºÀ7ý‘ ÿaO툵ëþ J7¹€&‰&Äcoöcµeo¯ðTó¤-}Dò›áéà 67Uñã-[YvÑRûà³ì0Z³øÜcœâ»©~„Šš6mÒéÖúb3ww©eËN/*0ƒÈ~®ô¾Ã7ÊBåã<w`†§7c³|Ć–D°m¦Õ=ÕÂï!°¿åÞ@øæXÓæ»]£nÊJ<ï²÷?ݰ9óÁ}äÄBYŒU€2ºvcÓ5¨â##¼™&Þ‡Ì6ï9ó(‘÷.ªº^±ÍÜPïa×Zñ×$®úWE¾"Ûñ]#‹ª¬vPÉ7a‹1æ–Ä q¦xö$¾¨E‹ˆ‹KOÊûaÇù/|4Ë;ɹéäU× ¹W®h¹°äy3¡ð^¼œœ†¯ä3Ô‹4˜î?Ü´‹jj*MkૈìÕöÊ3/ò3W4W7 ?¸óòò€޼=ÛÔ<]}Š&yžhV¼¬ÉœÂ ñÔMÍ•š!)¹&Sñú™´`‰pžND¨g²ï‰3òüí†31Û³h›®I¼¿LkÇݦ—ºýÏ>t+ÞzßuÂzݺnîÛ³“OyŸjÈ(& |5kÙ¡"sQ‹ß`HË!afSà˜_3ƒ±=ª®þ ¤¡áŒu#ÂgÅòêÑÅ+Ã¥}xÛÃY§/—),u€0Ù9ªU•]C~§n÷†GÝÃÏKG_žàU¶„§Ì-Y9ʰah¦$ÈOÞzõ¶'jû˹ùM²wSVïŸ[êå}ûªK×ùí—÷–F nØS$wø†evû`KÒe}ÿeÌ=³K ¶Õr-&óʆ|RÚ‡õßõ®ZüõC%sÓŠÈÎæ–;'X[ò1i\/ n<4¤Í?ÆùO Q-v”’”ìRœSêj ±Ó1ôMñ‡7:g¼Îuú'›^ySõtõ;=N ©”‚´„³ÕwÈC—[ÖꇰK…,|öÆë†ßs±cý×Òã֪<#Ôé9p÷nSž™{ßæ}7c¨Y¯ºvk¾|)ÐgºwëHŽ­þó«¢,¨ØHÁÉ`ÂoïäÞºy6<¢uãýFNcLâ}|,ØÂGNïrʼXÝ¿áôxÍRQ• qˆåcÞMv Oãæ¬³øÓù×™hXÌ]˜­·²9äu·47Àv‹íò÷ä®|±QþÖd®éBó>–®$Ê]˜±Ÿÿ`ŸiwF¶ô‘„}QQË<¼¼š,(£•—6±àÙ™ÂæXJ¯Hµ©¸-J’ÛÜ3àûÞm½þé‹êËØ•äô »pKfÞ­gå… ž´Œh¾ᨋ}¯T#709›ù±§·W·…yn ¯—÷ÜÓztÚöÓXÓ§uu©×‘ÜyžÚ###ÁÁÁ/§üÝoó-&Ë/+åVBçJiùj†³+õ>IÊê}ù<â0GáÛ*£–«¢‚úú8±µÉ•ÕÕÚ/²úΗ1µŽ¡ÖêŠÍ˜Ÿ¢!bäô45#ZK%$t,™ä²[*‚Ù•`"Âþ!ì17£¥t36Ýl eW:Ô ù6¨Ò×-,ã|…¯åü)¶L\ZZÓÔ ]]] •Š™Lpí~"ŽÃÝ*q‡îÙ~óøô³6Y%æ§ЇÂ@¸9zw±¥‘—Æ…ë%ÏìZ‹äCCqWÞ?Æ?¾>#Zï²Ýqâ^fÑ„ph¨§ Pþ¾§‡ùî)”ež×ȹø-«•]ÕÕ¿AO®‹äA”÷‡žÉrã*%%ådBÃY½Ë{n9P²½+º’UPVÅÆF’F£yùúvöö.»[àýžç 0=1TÙØÅÑ3^»ñÛ¶og´o¾Yr÷n sgEËh b gì{2Np½ örré6`哨´)Âûý›öŽ% ‘¨¨©µúøuUÅíÙ»wÏŽ}ûøúŸe3YÔ]Ô?‘Õ'Þ¶ì½j±H]]ý–Í•=×øùùåäå ®oVR©Ô•Br'_ú¢œÚ¶†²ð{´Ê û /R‹ BÝãá¹jõôÜ×`öÑIú¢ÁVK8°„‰i±Óì”{m]£<Ö® ¾=Fˆ%P)EDJ**!D"A·¾ÏN-¾ÛÜœ°tôØ™€©^cL?ôœF º©·&¥T¾Ç9uJÝÏO.>>º-hxv¢7x¬8‹ä"Ð ÜÜ'Œ‹s¯^¬«ŒŒŠZt¿ºúÒõëG›šö@¬ÛJ¥Šã^n½ ·¨m`À¯µÿUÆ®äÁü’5w[ZL ÞÅ¢|Š>&gMAÝ'“êX8ÖhZÅoùÖ·Å·á¶[ïjqqqÏ™L‡aN%fSq[àæ•VØÙÛ÷Ö_æàååÅËÊvôôÜ!÷Þk¤¥>>>þööƒþýy·o§èHìÐÔ\âpanì™9®·HLèÑ-@šR + æ>N?:… ³‘›¢wŽBu¦Æ(ä¹ >¿N]VŸ8Ðtmÿ¾Ê{÷ÏÍùÍŒT–••5\¶|yÇp{éãáå!ìçFÑ|QÛ_hmÀöööBY«™™™›-á»øä¼à ºju‡ST¥ÿ–jQ#÷¼ÖÈ*C,Š”‚‚Ôá§N­ 6g¹ï{¤SIØ}õ=™`«õƯ'õDËÖÊ((˜½ê)8°˜ÉæÎRpBé-ðªP#SÑÊ ŸZD¡E=Öð"?ý˜42§c“4rÃ&Ýz@°ºê.•+Jÿ§PL?þÑcáùßvŽ$¢«9…Js•†Îü½cüñó¿pûÛçãPôçÿ+‡œ¨””È-M+*Ì_„æè"Bqôò¶¤:ˆ ¤ñÒ¸””Âr9Qmeƒ½:ª"xˆè*iª+‹ˆIÉÈìF)ËȨ¨ˆì™ï! 1p!:¸Z»Y;:íddTw‰‰ˆY¹¹9ÉÊ@ÏD’öDI;ºXÊèÉxA}! ÆŸ>J¹}ÑRšâF#Ïèeoçà*ÿnÀ§/´ž¿Ìü±§ºE k¥¨ÎîÖòbÊŽnT7)o'ª˜y᛼˜ÕËm¡ñ²ÑÅ•ê&oh°] /&ó­NöHn“Rv´w"ºY“ì¾ìG]Užðk¢=U^ ðêBtstùâ:•¯ø:ßÂÍÚÍŽª ­³MO)+¢¶ ˆr2 §—ËÙY;ØŠX¹Pi€X"ÉUšìê*&âBµ“su󶣺ZQ©nb"n`ZŸf]õëJv±vrûò¢qᬘˆ« Y^ÌÆÙêâ-mã*¦ '³ðË5¤x;¸RÉÐ*¹þ¶õôºR‰.d+™…?+á_õL!ºb_S÷WÚ+,Y'Aq$»ÛƒEÝ(ídÎ[‚æî0ω"¾"ÖÖnæ ]KlÜ"â¿qËòoóè“¢ýwD öÈ|q’#Åü¡X{ˆXSÀEŽN`.SEÝ@göŽT7+kWpÑfk7ð‘lçèJ¥ˆ¼?븨ȼzÿÒ$wD0%H›€ÄÙQEÈT;;W'"ÙÚÁR^ .6ÿ݉H¡ÌG`Ä!†È¹-Ð>¸ˆÌOè*ÕÚÒÊMVƒuòÚ2Ï597Êü N.Ž6@~ì-ÑÖö–"D; šÐ÷…Õùt…9t‰´«‡%  ”otB´³¶tû<æ'º¤ì¨402\Cµ_Zä—~j)éǨöNnÞ"DWh°y]%Z;¸ÎkñIƒÌüŠAæ/œ—*èë“iw"º¸-,7ôƒÚ‚Z†¯-ÓÂE¢Àm.ȸ’£—ˆ¼ˆÕSDÿów ±_~Û,ò鋨f0nÔÍ.Ûð•Z|Á¢‡‹£'ˆšÑÕuÁò-¬¢ˆœ»Ýgí¬]Ý>ý~²³V#~R,k ÕKzÁ-̯›‚XÕ…uÔ!ZR?­œ ü~«'pëW}èQí †ýÚëôCt µûª/`·:Ò Lvswù£Þ>OšìîâdAì×ÞiÖv¿¡r;tæûôñ †ký²n¿ðü×SêD`Ù<¨b_4œ×„OWBºöÅoàWH£¿èVŸjýk»kO´ÒzÙŒØMçG{G€¶€ùr‘s¡Î8ü*hÒÚ_öªoåè)±ñ»]¸»ýi;¬)Ôoô0o‘ ‡ô弜ܿԱ/g¹ÝšjGñ Ú¹ƒŸΉ‰Édª««-Õœú•4àE\åÅ~OÛ|oÛ¡_%€tP7Љü¾1ÉÎÝåOÚÎëÛ7’ܾÛZÙŠè`I• z@î7\ø$X_Š€ dé¿’pñKî(C~Gì“ÈþjFdþ =ª«»›ën ¾óëªð[Yš¿JÝÞRL„äèBþµ`Í;¸y±úe !øý~æ_lóü—Ï "'ãn·`k?ݯÍò+ó„ü‹öéÛZ»`4A«Ÿ±Ÿ¢¸¯zýP~£»?›!ê?šá·¨Ùfg÷#ós8 aª¯yô dýÙýÜ ¤¯_õP¤ûW:¡_ÿU'ªàä>ÿ˜š?]¬_Cî_ýÙÅñ‡láϼ/ðïWÇî9¯="®À4, Uˆ›ŽNóô~ ù¾²Ò š÷ÉRý´!þYó;o–ÀøÚl'Õû³uúî,ÌÞšæ!·/g¿Ð €ÄóÆEDâ L¥Á¹ßäÈWÆæs×óÁÓ¯6ÌÃÑš"Vvþç/ìÒ/&f!"üº[±o 5?—…Q¾˜DÖg9Zˆ$¡ ?aRH" ‰U6P6×ÖÒ17ÐÞ©ºK¹,d?5¢Ú}6¼N xEš›»ÌCKsskàÌñVóâ·–HÆcIhM†£I8š@ÂáñDJÆ!(d<,¦°ÐüSk¨±´Õ¼m]ÐÏTê«ê™ë©ª©kïú!j ÄÊ÷h" hT…ˆ&Pph’D# Ñx8Š'aIX*‡ûLÓ|ß%l^m¾Ð–Ï\üUeæS4GG·?H€€Ë T‘Ûçë~EÓV.Ÿ'·ðäs@ äÍõ7?·'Újô¨NŽ 9ÉÝÒ(¯È/fÁž4ÕQÖÕÝ ú}«+ÙÑ…*åe:ľqòÓ,:_…N}Ž >*,ÿ~þç«üß/VîïÍ1ýIþ†c~—ÿ—ÑóÿÂAÏÿÑóôü=ÿGÏÿÑóôü=ÿGÏÿ-ôü=ÿGÏÿýÍÿýyÚî'óôü=ÿ÷Ïäÿt´µtæ* óÑÁ,˜ü¼èÿL*€"áI8A#ãp N¥!¨H2–J¥QÉd áGR - ØŸ&‹‡qh’J ÉD8„# ÈX O#áH(<âÇ Ñ'[Q)îvÔŸç ‰H!Âd,PCDÀá2ŽG‘ˆp,‡%â~œ”…é2æÒ£``šBE!à4E¢oÐO¥aáX8œžýOÓ£ÿß_åq•ïVÿ‰ç~›ÿÅÁéùßã çéù_zþ—žÿ¥çéù_zþ—žÿ¥çzþ—žÿ¥çÿ÷åÿQP4`kþ|ýç)p·ÿ$¥ª_ŽÁâpH<Š†Ã’8†€!ÓÅ!I8øB¤ýØèŽ „¶Fš‡è:ŸëùËkEcÐp §"È@ˆX8 þ£bIôwÖâ7[~j€ïÏSÝÁÚígä˜K‚c)4B¡`T M¥bà$ŒÄofßý§A¥¢(`Op*†FBQh‰JÃ#q42œ†&ÿùĵi´Ÿ˜7GÂbh4¸  ø"4 MDà0h"†„Ebá?8oퟑ&°Ôd ‡%#1X4‡CQÈT2F.ˆF$ÃQ?8öü ɰƒ`V4$I$Â1$ ‰JÁ2Цáàˆ¿BË_TôoÙ<8zr !`…$™BD£€É!"ðØµºóÔü‘ü)4°J@¢"¡‘8<C"ð ¸?%eþgÊWwö@! raý$ȃã1X2… bñT*@D ñDŽ@¦ÀQHé‡n¬™¿b«üÇô ($šˆEP°C#ÓÐCDRH­ H˜¦çó}>ÿ1Eà°x<Ããðx8– |5E¢80ýÃýŠèþMx×`’ˆBSˆE cà4ž D¿ë‡~×Ï_îÿÿ[ÿóÇïÿƒØ ýÛç?¡èÏÿ—úþ?}ÿŸ¾ÿOßÿ§ïÿÓ÷ÿéûÿôýúþÿÂAßÿ§ïÿÓ÷ÿÿò ÿuÿ[žõß¹ÿÿ»Cµ`¨¿(’kç}¦9ù3!䙯§F´Ïh¡‘ãçFŽ?#íŸ:qú܉½d‚^2ñÇ%_ž†ü7ÉΑl+¦°ƒêB…b#¢¤"Ž4à9ìD>x`ÖŸc;×ÍÀ½»XC|Œ°v€>@¶ü! íöÉ”r³½ùL&ÄÑÏýÍ›Ù_(µB)üš&:­ „4Í_µ´”YD Ä~àbúÿ¨Z^ó¶þ\iŸåö[9¤WÓüõjšdºãg¦;þ–éÿîöüsþ8}æÓoùó¾Vé¿îAôâ)zñÔ_*žú«šþªÁúÉÂ,zñÔÿõâ)únéeÿË Êþ;CL¯t£WºÑ+ÝþíJ·ùú¯_w#þ‘£?yþ @9ØßÖH¯ÿú7zý×Sý´ (²°ÿG¯£W€Ñ+Àè`ô 0z½Œ^F¯ûÿ¡ì¯jñT„ým`ôê˜ÿsÕ1 ¸@ìéþêô<ümÝ̹/¨ÓoˆÐB¿°áo¬Æe¡Àf:ž/ð ’ÄO…5_öM±vëëèâý ýÖ/.óüzm7ÿE³!‘šççnÐõ Æïæô´¦¸YÉ" ”K±vu²#zËZ;ŒO•šŸÀŸŸàã'ü¬®Ÿ6Ä~›ü2wutw!U£øytkÀ?ÀŠùPåuþFní;=/t)âFt±¡®äòütñïògóó‹©C|ûtvw~É3„ù?Ʀ¯6¬þæü~ìw,ùÍn×·9aEV4þ2ÌzQÁUŸ*A?‹ï|Æý×:2‘ï0ù/ Þ·ÓÁkH쾓Tþa^ææ× ‡ªð\çá4°VÖÀJ/l@‰@#¸Ø^‘OñÖ§méo¦¨:ZØ.ù¼Uò‰Ô…AÆP^lž¸…kÁGàæý‹¡‰¿s30p¶Ôy‘Y81+E]À8pu,‡ΪˆHKK‹}½åõq ²–îÿqs\êÓõëK‹¨»‰ ¤yßm®ž· `ÒŸKÓ ÷õÇ}»ožîïhê7%_nªý}Rÿ»­ºïˆü×ûrÿ–mAÿ»¶å›Û:7¯ÿ‚ùöÑ¿el Ñ? Sþ‚əߢýÏ Ï·†ÿÂúÌç¹¾gv쬿0<_nÿ»Öç?+„ý~ùíïìÐ× ´…|êg˜¸êé‰ôãÿŸcaÿ÷³ó0÷ ºüýÁöü,÷›ý_ KÿÇ¿rÐ÷ÿ›ö¡-‘ùü+p*"FŸo6¢ïÓwƒé»ÁôÝ`únðÿÞÝàïïüü»ÃôÝ`ún0}7øÛnð?eæGüøF_ _Õ!ÓøSu'Ÿ£ÆïŒ³€cÿ^=òmÂ~òå#߈?÷ø>ÿ—žÖñ§Ã°ÿL›=}ß¾áÿ#oùóÛ¬í?ßfmÿÛÛ¬í•]@°N&Úíã}ç6?ÞC[KDSÑ,†Š¥ ÉH<AÃqD Âa 4,‹ýΦ×÷žØ«üŸ¤…DA((œ ÇQT  'ƒ$2žŠ ’ ÌТê@ðÖŸ2äÓüߢ‚ˆBÑ($ƒ@# H8‚J…# (*ŽŒ¢AO@øúöÿ_Èøö=¯6i<Ž€cÈD8 Dh$‹¤âá Š‚à0øïMúFûÎþÅZ"•LKMDÓp84™€ÃRðx4 K¤bP8 †LÃýцÃo¸­ií@Eü,«qt#9 áœ†„ã 2 Ö‡F“þfVÐ žÇ“H4<AhT G&‘É4ŽÀý¬FT"‰ÀÁ*…H Óð‡ "±T4 ÿ‹¬Fþ,«±"•@B"P(2ŒÆáO&P h$˜=ý7³šBEâh@€) t7’ˆDcdž†Gà©$<íŸ`5‹%À1xEÃqÀv5ÅBwsãÀò¢©Èeõ¢«²£ÑÉõg NÆ@KAà±4øCƒE&Áq(" ŽÄà?`Èæ‰pòVwøI4 EAPÈ<öŒ†ÂŠ(x* O"`I?N‚Ž‹µ€Æ?ë_H€<’JÆbH@ÅÁ?D’@EÁqd‰ö}óö5Û­]\ÝþCBàxƒ†F¤a$K¥Qx §Ñð?â\!ê´Ÿ ŠÇÀ‰ÀÆ"¨(`ßÁb©T< Ø"–†þ±á5‰ÿ)ðT,8¢ðD2¿5fá_í/¿|Z¹_ÞÅñ€ýô’–¿B·Î?I·Î_£û3­ qÙϾôåòÑ_’ó™¨/_´0¡ßúQ¾»…ò½ ’ïÑó—yñ].üð€ß˜¶Âo~ûÍE¿,ßÿ”y ï'Ðí˜Ïÿ @ÿö1þ$ÿB Q¿½ÿ‰…ÓóÿÿÆAÏÿÿ÷æÿéÏ §þé©z꟞ú§§þé©z꟞úÿÿ$õÿoÙz꟞úÿÿ2õïú÷dý{Џ#)¸ÕJG :RБ‚_)Ønß{G§ ŸÎŸ=US[õÓÇð£!WE1A&‰Ý® Líl2ùä+£Â{ñ÷âOÒ­û¾X kV¦ð‰BjYVKø>žY£:×ö Œê‹ÇðÖטþgè4X௶„¯uŽ5æÛ¼f)†J­‰ƒ5a¢É.\·ÄИø¢%´ðíïËÜAlwuû؉„“1/3<3ƒ?n< ˆu·f!î(BP/yYð°‘ðKq åÌBÍ'L( -:ÙU_j8¼oa¦ó‰þZ9o0‡Ò|Á{þãÕò˜.`ˆNàÍ©bK°¦Zrêš-dõÒ-³„«öËêCŽPœÏ'0ÔFÿØôÇ)ÖÈ{Ž.¦yb U ö3¥¤Æ¸ú»æ›« пe!ÆÚdÔ9“zºWƒö&“.y ²31éŸ,cðôÛë}$(“I17é˜sµÀöX©{´*YùÛ èš![“É/…,lFÿL:O/©øeãúX7 LûœŒAL¡,Ûj=D¦ÐÑÓÇs˜]óÒ§#Z`æ/6”-?hЋòûÞ»¢*FW•+¦,–èŒ\I6Ç• |³eÃU>(5׃0³cŠ_@çc¡ëó®^ÚÚµ ìü/ Æ«!€šÁ9ûÆ'%&·z¨ÓsZlñÉLäea=@µ˜]Ã|dÜ3 ßø)CÁÙ;À|Ä{÷ …(P¶'ðÝO0:¬ZµT¨=_‹kmó„Ô"‹åÊ ¬oÚIºÚ¸—c~‹vüY#^7 O¡à™/Õü;=q¡ã«Âd®ƒ—rÃf *ZËñܤ&_mTxüh/Š¼Ã¥°¼Å~}ã ÿù>ùÚvã&ØsE¡Õ¿æ´¡¯Þë´èFôETÄ ”ñUuuá.]cÃV¿\Õ"k[}ß»ïß>ÿá;ûæ·0NÂ{¿ÔÎKÛ‹/Þ½øùí»Ÿ®Þü`߆?<²9Î/üÐ^Ê««7ÿº.âÕxVN æ½^ë(ïí§åJMÛ‹ÃI¢³Ök‡þxÜ«æÔo/ê»þúÇW%4ßýÊPƒÁr+;`óæ»¿¾-»º Ü:èŽòÞ¨K­ï7ì•’·ï_¿~þÓX)±¿Y‰˜?Ãy Ò‹+0Ì7œ®¨ÐŒ©â“nµ¬æK1™‹ œcXÅWrí{Lo^ z¶ET×n'ÅêP\¾½§óEôËq×¢Œ¦ÒïÁHe‹1Ñß Fyæk+j4}µõñý1´d¡j€"SŠu`K@éƒî‚y ¦(¶ÁØGð÷ÑCès¹hY +Ì«‹ua%#¡¿…Ú˜MƷ׊îïÉソ™v>µm| öålú7ï“ÕŸ þ?ËŸAy î\þázõgïë>ÊA7·Þ5»5ë‡âðm£ˆ5½§ã”b œåzV&ö »…ƒ]#»´Ò_Ñ¥Ukxm™‡uŠ/@u*É+ÖwP¸€¥{z>:þèÏqJâDÔÏXÀðzP’%*U9’³áÁ¶üÿ0ÜŒÿ%Iäâ'y\üïœâË…ð^VI(?©|°b]ÐÏý\ÐÏý\ÐïrÏrA>äÛj¥ ò]LÏEô¾Ìˆž]`USi?øƒþ] €¥lkŸPÓݧ—wö¤<ƒÎVÚ¹·;"ÊGˆ>îõ.Ž86v Lš?R‰ÉÒî¨5 $Æn(&å!þÏžÞò;×x¹lÙ±ê0ÿå-D—–7-Û>Æåí†lí^kÆx¥¦Op(hÎ"E9÷cßÏœ…,WIG!¡oì`€¯àÅW¸ž•W.ÍÖ<µ~½K`ãlûf9?5_­]T°SjÚšj¥FS’&cþHÞN§ŸÖ[6aX*ø&úŸO6;ù¶üäAc0¶/رCÂñŠ_ØSñy&Â<ϳ(a2J²\Ò8PqÀHe4ʳûãÿ|¸ÉÿEqäø¿S<Žÿ;'þÏÕè(@G: ÐQ€Žt £è(@G^(ÃPÄ!xΜ+®D’G~–†D„©ä)'Ô*k›•[iè>Utò×-_DNL4ÞåÆœ-רWQË4Úõ³•cll-8ˆLÔÉ‹Çâ[v:˜„U¶ëË?›¬PûÎb^øïç¡e˜Ê}W÷ñsÝùg{:‡_0]3‡Nk *S[ŸÂ£‹D¥Öªö„“=¿¾Â{ÊÞãû£@÷y}CÈÙ |‡]*;e þÞ IØÊ"Žÿò)ñßÔSñÿâO‡ÕÑvþOF[ü¿;þÿãÿÏŽÿ_Gw] À\ À\ À\ À\ À\ à’ä÷)~HÒèi£mNÍ0ñ­[ ??O¼§aXQù¡¹T²Éïy¿g|Ÿ´üÙ!~ÇU¨%9Þ»ßDÑ߉Ð@–¾ºÏ³AÕã =æ>Í¥=+ , 9Qõ[EõÑK«i‘Ë?ä]Ô9ÿüà$×áŽF£=wô¢;]^*ª«Ç2—ͼ«Uy^û;MËý`mnðpÕñÔ¯ó‰¶Bh}÷*Þb9‡aÓkŸÆ`+}éìu}%/MÊòÎx‹ ®þÍ+•¹ ñ‰‡ß«7i}ƒ^ý¯`³ª!7Ñ~¼áãš‹|oV˜{;óÌ*÷øá?1ƒRÅz\ †·Œâ‡ 0 MîÞÃÇ%z- - ˜*×Mø‡÷îXm©ˆ6*êXhØRh¸ß;ƒ‘²tØô³µ¯ôm§ eî E+ÿf,¥êdÔÒ”hëÆ<1—µŠÃ°[êŽÁ6i)4ÙÀÖ{¡û„ŽSéØ•Éš%!"Š©¹k¹3ªiK#Ò¨¾ŸÕêïbÖRWvŠw¡¿%¡F­˜ÆËR<¡'æšO+&u©í fТl‚`˜?êú¾ÅK[+]‹mwtƒECÐmQ*ÝB÷¹·g]«?;£×¢k‚¦®)kÁ»Ríd×÷œÚŸñÓ>èµh— :½µÄ}esQ¬ÀôßÏ…$»Ä³¬RKh@[Kh‹ ²Þ€ŽAI=NÒ¢yˆ¿N]aO0I‹b!Á`’…AH ˜·Ö„F›íª¶ß¤'- †Ð]ëϲ—f$-Š…„‡ ×¢0H´…Þ[¼ÃÝâc04 áÕõ†¥C³8í·T[T ‰wš™å U+Ïz5ú¦cÅ-J…4•Š·õ¬uZCÕt­¾EÍ´µz£j³kÕ-ʈdmUÈëÖTǪi‹ê¡~·ªõ*‰ (¸n¸xv¬½EѦ6úGÇR[Ô%}²#÷¤cñ-ІÒ-È´šy8ÅýMRk¾®ø´èÚÔ7k5¶fsJÿY p=ítO&–ÂÕ±á*kwû‰ñ§ÊÒ¢á§à±kczmè‹FL]SSky=eèï+¿ªeY'ã³Ñ¯{7ìµÑ©b3ø×øì_•‰IϾz^î.ƒ7?a‰Ð•9ôF»+š£1{åŠREb ×lÜ«è\u*¡ºaÞ”Ž%Úk|ÂÄËÅyàc‚ZA[sZ6êÚ_”ml³¤™w;;¤°®—Ý[…Ðå3›+3å±i))Ýê¥fZøšÀ¯0[UþÄ8Ç›,”ñ#søg‡v9Wbœu3¡‹ ³—ªî˜Ä/#l±(>.û ?ƒ2¹µo×÷&‚G~Ë&ã¿ÃG»ü¯Š5àjõQ›»úX”+äÚº’ë~©Y JÓNóyW8P»^ß27^žß.æe,o¶Jäm6•qšÑƒ¿CÁ¥!ÅfµÅäU@ã ÆUµ7!ÿFi\~ ¿/ŠÛë›Út™ãÙÚ+¥lAI†ýGd£õŸb³õk9ݶvôƳ¥)Üt‹Õo¸€(eli¿¶kIÌÅ´­U1˜ 6U ‘ôÁºøQYå†xº4°/ìÙÎÿšÊèÈuÜÿ…,¨¿™ÿRêò¿NñÐ4ÉóTñ8¢~œ3”¦’ŠŒË„çyþ¹Ûçžû}ôüïrð€:Zò?ã˜&ÍùO|B‰›ÿ§x\þç9åî>jÄ3ÉAn/¸K u©¡.5Ô¥†~ ©¡UöÏíba2m\ª¨KÝh¥K½”TÑ-õDê‰ôÔOÇÕ%—ÛR–ùõ Uc'ÍRݺµ»\-)»Ûç6ÖùIµ÷³w½³‡th n•ƒ{ßgKΔATçk~¦3 ËÓ)ËhÆc`!0)0¯uP¡~råÈi©Béw\ä1ž ðpFF1Ì ðOñìÓg¿+(ÀÐy_Pš‡©Þu8«‰ÈëM0í¾O0˜ßòGlÀñêµÔ“[§l×PY]Å_lÚV‹R¸°O i5µÞ®p¹Ð3áÎÓÉ3"sA³„ù’‹ÔU‰ñ„ ¢Ð9à¨dX¼‡Ç:&¡“¬uèÈô-†£Ð$~cÔå,…Þè 8™I&cÅü(§~“T1ÎišÅ¹òs•ä°‘¸-á—ÒO9ÕX´wÅŒÅ+ÐŒA§è ÎÈeL}%„ÓHªØT†Dù) aÜ•AÑÞ•õ@t:]¤78CB ‘’…y’„"Kb™¦!™Šh"#‘'£›Ú;2ýn&{i¦¾Ø ‡ Ë Á¾ðƒLI–‰É9ˤ2™3p E’1¦.flïÈtíÑv^&ûÂÓÿ´´Òã+]=Ã*ÏW7r³øR ñ—Êð4ZU€kØ$CÔ¯+>)ćÏ]ч®0޾™C{F@»ãÞK¿eµØ­7;]ZoÖ†ÏNÔ[Å ÚbÍo&(¹f¦uxoM\7„Ö|'íÃ=iOž4 L?-yîuÙ›‡6›, a6®ù1+ÝNÒ·Êè!Ñ_™v‹˜iZ ¨N×í¼ƒyõù/M§;1·¦ä@ÀqNÖ66Â|±\éÉz  ;P4¹ áKÇù¡t¶dƒ>ˆt¹Úöm xo”’:Û—ަ‘N`“HÀP îz ®-ºßä0©VÃo–2å¬/´z`“¸¶îˆ‚v,F^OY€·p˜ d¨¸Î/ksÇ(´w¢oB_X† A§‘Šã„Š ”ŠÄ±ÏsBBÅX…<‰/bÚ;Ñ7•¿/,C† ~àG‚Á2F B¨¨ÔÏ"*“ˆFéh¢ö.ôNâï‹Ê =Â\Ëý”ó†S]”3?VIÌ’’à{+n@‹OÔÉ)¾v˜¦eÛ:“|}¡2Ì\™¤èÒDJ&±/àG.R(‘‡¹ý‡™ò”'¹ r‘$A”ú*±R9Z›Y9Ì/M.ãÙõÉ»¬i³…‡¼ï0 šÙ©P\„i Ã0s?™Å>¨vÄ,e|lï‚Þyø†5ºŸ!Ö—A¦5•q”)*ÓˆBé*‘‚Ðæv®¡—‘ÑÞ‰)8—oí®˜nÖuO\‘Œ*ŒâHÅ’’¨û~Â8 igyœÄ‡åAœv´waúb1^›t?#¨',_ÈA¿åäÆ{8¨ƒǦõæ~õæl9Únuü ša ¿s¿ún8;ØŸÎS›{;Gn—á5püd£H£ì}¶ÁË0ñú h‡\§sœylV‡´¦³9ªäROÌê¹tÞŸÿaY¸·Ï1òj;ám0ŒÆ]öºk[d©yÁαW¾÷;~¬5Ÿç\59KGÄsþi<†f‡ÔœóE³J8*¤åÅîÃpmOú8O\›é-GV/\GA¶CJÓy"‹)[ÇÂs†ÿc‡”˜ó„ñ»ùÄEÿ(âÙ!ÙåvØTuAäú{âvŽQ}wÚÀ!²Ñµå\ý?{oÞÞ¶‘ìÎßü=ÊûŽeD+I'ö½Š,;:ãí±ä“ÌÍÉ£`iHˆI‚C€¶5“ùî·ªlÑI-™=3ŽDÝÕÕÕUÕÕU¿ö ô`‡ðdí-Am&°AÂÌh7ÎyªœÂböѶ(õ¢±ÂYHúaûSÈñd·ÐÿçÿÉÐÿg aSÀÝ0'±à§Ž·ˆˆlâôÕÙ»·—go_¾Ã×é,^.Šƒýr 6uF<ÎYÜÜÝ­ À9¨ý#](Ðã¡sùáß%Ð Çí!*ÜR2ß–Lfw°ì®CĽ›@}u—lqY@ÿ­yÜc¾ÿ_‡šUÆÿ7t»Ãÿ¿‹Ÿÿÿ!áÿ¯ú‘ÝÝÝÝÝÝÝÝÝÝÝÝÿÄËéÔYÜì±°³o ¨ê@uçyyýZ¯¹G Ñ&Ë¿õ‹ʧ«Øúk2;×Àå U!7ñÐ^¿·}ê8†øn Yæ8°M}¬4JúØ Cϼ‡Sçº~ÖŒ¡5Út[¶lSj<ŽåøÃ‘a™ sc£±å™æÐ׆¦¹Õí”{×L‚zíà¦Ûre«‚û±CÇ®®†x¦å ,Ãyc:6u/´Í°<ï|Ô£h‡7Ý–+[ÁéѱG†7²]˱ZàY>ô¨†múÚ€þÔz \¿Ñ–1[N‚oÚ×ÀS˜v›m¤ /Ï2ôͰ?î|¨GÑöþ¶|ÙfgPÃhMxÞРƸw82õÑf¨žw>êQ´½€£-_þ3€'ÊÎð-`14ðtîûÐugòG-6oàÔ<€4–uüþƒT›7ð[8“~¹y·äAjÝ&gÞY’a䡊ô)˰“ñàÙüÒ ï,Mn« ]—(·E¢ÜèËÿÃÒ+`“Z”Ádýe?õù–¥™åü?˶Ì.ÿï.~ºü¿‡—ÿGÎÞž_¿~Ý¥úu©~]ª_—ê×¥úÝ}ªßú½íRÿºT¿.Õo…Ê.Õï’ê×e«uÙj­Ò̤/O6O)[{¶¶Hãl: ÌL½„훬„Ïo뼊€‰)%.D_ú½Þ îù¯– qˆMHïIõO¯÷nÎ7hä%u˜}z ¬9<ôÃݎ×§Ç?œŠ™~¨LF“_îÇ8Ñ®:Ë¿öl=fÍ?þùÙñ‡W¿•v~†ŸÝÐø—ü;1X>Øì-–`„ ž`‰¹ ”„mó ,ÔáûK¼§äשó‰’ÿ~¦=z\I±&- J-LB7‰¢É!ÎdD8ø„ gŠê’¸àeBŸ fŠNxëq±Œ@Nç¤ÈQàîbéYœœCïšò^ØøÆËr¶ ^t5 ÿ ‹Srëèðâ ÕUḩÐOgÞ îÌEƒñœa2,ç MèaNKò3Pùb¶'A—Ä ~${€dãà߯…¹dPM??{ÿ·W翤ʛπq&/ðŸcò³P7 DEÀ€¬·¦ö]U#e± œ89k*k ù6޲À >R\vÅÖ²µó¸‚ž"_;8‡ïOþvü*u¦X|Xt|$P¾²*ò‹Ü:Ë÷‘®2ö¡Mç ê‹Ãx&ôÙþ•çýºÓßCPA“ßa–yøûìóõÜû}~þ:gvõ»ÁSÎÔg=.{¹Ÿ vfÄ{ ¬†çÁ˜Ïö¥sÎ v7ƒ@ü¨iŽc„3òÞ_ü@~bégc¹š-¡áìô#웘™:ÉèÅäÕÛž]‘ÖP|/¢(yöâìoˆR›äÄ_ªàñâ÷x‰¤ã¨bÞ¢dáä d ê?Õ|Mq¨ø’³$©¡³ÏáŒ?v ¯åDhÞÄ!: kýòå»—ß<{ý"{ˆ$¨¡Àdx—= ´ÕÇ^o¢%ñ@^{\ïIž°T^’fqÞÀ$÷ŒÕ!Þ"Šc)?½S¿¾· }¢ `ÀÌN|Æ=Ù ¤ºÂ;º€جù0Øï¶Eù)ê=[ùa<ùÏ.&7<t^žX1ùµ”JÝ·wÉü_¹Iz„q¤%°ô©©Îqlâ©Â>¡Ï·iÖLoŠ‚åËÔäBœù!¢!ß² ’øë‡ÓãoN‰¤5XNÅØˆÄædŠ´Ð/óÇÅŸ±œöPïWç­‚T¤¡é|B™OŒ#‘é\"t’f Q¿Ç2|tè„OˆØ˜ƒó/Þášô*Dh]¹uâГ¨€áäU­a… Á}ÿºáòÌí?î~Ò±ˆ{ó”y`yÂvo`¦ØpN¢Æñݧ°§z ~\õ_(8ˆ¼Âár!Î’üé÷À.¤± ƒ!Æ~÷“›9^má¿0‰’&‚>ê!<êâs]úëá!ûêßVx§!ÆEîðäÑc¾õŒÁ÷Àé§iT&5D‘£1<ÇÂ0.>v $9f uܰ|(›ùY G ßJ éx^ˆ £螨¼h‘ÉåCð‡;„3ÊA°AO,gËxé0=7ã¦SLA^Èœ[ÙdqÓc&›mÄQ‡_G_ «ÍCJXñB¡‘…è ~rÀÜ:`ÄÈÁ‚ .¤LÚãºF[ª=cöÎà TŠOräé ÏèWŒö1¢ûé°Q'/cytÀ˜#„2éÅLÁFá,)IDv /§›ò£Ù#4`36+Ÿ(° .V‘ù¤€a-œdz)/ûÀ®¾ã=b‘™ÜGá )ŒÓ‹Dù²êåy좎>R*ÆÎ2‰ð™G0Þ¿Ë9.u¾2/Éæp言„• ¢…ùäürðpfœêÅl…ü¶Œ“Cô‰À¤Í„C„ ìºêŒ3Oyæ[™E3‡ž­6 _„Ë ß¶RLafì¦3Ù ‡é‡VQðÁš}%Ñ—׎ÃÙE¼Ôå`¾«ˆLJàú‚O³ÏÈátbvÝÅÕrâ,x3˜vÉÕC„¦‡i â çרéWê-i.þ>^A¼Œ²ÖNœh/7`¸ìâ¢wšÈ‰bÇÙ\ÉIÊ2\à¾Ê™lÚä¦ID*˜ƒž8‹+Šþ"ÅaŸ3èš„~¶:’ÜóÈ,ÉkÆ1Á,Ìï =ü&._6 ‚+rn‰0¢ŒBgì:@5ƒ‘è8›¾ÂÉ® Mä냛Ü0>Û}¦þ˜£"SÐRÌØÄæ•…„ʤx¹˜3]“©&6ôPWð%f† ÷"â>GÖ#o†7ÍFQ0’L§ûàÏFDzU ž¹;¬‡ ¹¤Ì©Â]šx|änñ¸ L¸5ÌÈëKÓuÁ(tÄsèP¡š¥‹Cþ¸˜[&fœb†žðuÄý/1(ad3Íìc„>‚eœ[v¿I¬"saYH½nšHrÀÝ„ý9ó"æ(¤j"—ùðÕ¦;=g*xÌ–7!Ù®˜‰Â–\8H™ÌXãVªÖĺKå%]6ùyt®€ 8–dx¸ï=`ˇ’nhø@aÉ õ#´É¬ ÂÎg’+î+ÁmñÕµ0r0©“…[§“ˆÕ?˽ë¨_Ü#–#ß0ÎáăíF¤[IÆ¡‡Q„˜2:æ‹íÑn¸KÂüQ9ÝÌz£Ág-³]&N¤PSL b~‘{Iàò[™dJ~5¯è©0ÎÙ)v »d„a(–eɳ¤¾ƒàKü8[^ ÈãwRž§^±Ìª ؽóé6ý%Œrr½Sœ”÷œ|•êÕO3p“f®Q  ÁLŒÉüQð±jh¬Lf…ÜbÂÇ —åAwe¤ÞC¯¹@ÛüÁp²=nqkÆ’¦ QqÏE£“0¼ÿl»+ΑÃûtN/DöƒitPS?ŽV~Ì''ϼñXD¼Ÿ^±Ðò³ÃÉ<ŠÃ¯ìù'o1ð‚m]˜ÿNŸ°° °`W:ïø$&¢¼O=„®Éñ¶T åéŒÕbP%¯×ʼs˜úÛŽ—U2áV«ÇŽÀÑP ”Î',‡™—vLn0àäˆM y<ÌqcãóQ¦ØpQ£nà$<”ó­{™û B¶(SÂv¿ÌŸI»WûVÚ)ge:Lµ$r“z$=õéåͪ¼É=%nÅL†Š +#=9ÆÁ¥y Ìàðc ì¢ ‹‘nØ÷,`7;»Y=‹ãÇ2=7Âó× T^_m`V÷°Ï¼{‰‚ásŸSûWÒ€Ç;¹­š8_í2fª:Ê4Pëö5™F”Ø\G8ן£ÉçtpüØ9;âO —Žk³šúgýp±(©ôžÐGÖ.Ì@¥/ iñ®£ˆ¯Éô™ì†6¶"&“^!hœÛÎä2Rª”ä^N’Ñ}ÃÈd¶¶ro§É‘òÐ/¯ãzè¤ððÙš5Â4;sñA½ >‚ŽEk+YÂl® ­àæ¢4¿<ýtAÄ;0hs„ Ã`¦òL4 9e¹=FƳô©b°¹ùUqq0îSq|Æ2YgQ*M"ºøƒ\'üH>F¼-áÞâ$œ†INXE)ˆ8èF6/+ Öl*Ø>.ˆEÚ ]óûé¤{Û.Í¥HÏWàãžeË8 àÈ_óäùÜÁ®¿fy0wèÅéù3’³|ôª×­ôjaÐàÛT>÷Õ,'*,K¦B@2 3Áe)Ú´^ziPCn ²)fLdóì/01¡Iƒ‚ïf9ÊË?ÀìÖ”ËbŽ'V)¬NkÇK*¤ÇÍX>/FÌzlÊ™ åÎÐ…ùJMG¶x×,Ð^iã‰k±_Qn²ê»ÊSÕ¼—#òŽâ4üÉöZìjÎÔ¯‘¹ä2ÊÈqg¼!u41k=`¿É >›ÙÌÓ$%O³—÷4YWe÷ cñÙ—¼ùgç_â—ý, –™7Ì>HžaÁlb¹@&¿wë\?îÜÊ‚t’<žl;•g%Á嬇 <ÝMóªHÈ—¤¤î4ÿÃ(ì$C8k˜¤ïÄœ à˜ìK…ûáµ`äœmnóÅÓËŽœY®™ "ÐÈ!™‚ª?ÄéEOJFZ#v/™CXÖ@ôXÀg‰j¸Ç²çør»“ùÌ7ÒÍÏÇdx„?Äœ¶g’ƒ^>ŽTóÈáÀ¿ŠNbîí¢>`§ŠzÅ ær›ÏØ[‘1–ÆÏýÝp&7Å#\L1%PÈM¡©oâÄ”iKW(\áÆf¡ð…<áÍEz•E[Ðæ;“\ÖÅ4œ…S ³u!*K.3çæ0$|k†¢wr"J5ÚAzŠ‘;ŒRùÊ\ãt³1ë¥G>b7–ë YÊÁ˜É1l—^\þôîýéÛËów?œœ>³ƒ½Ëça'‘N*í̈¤f¤8äNA®^Á˜P90Ö¤‘µwç/4âô?õ>¹X,mS¸9"1"Nwh«lôXÙ=è‚;ƒõ„Iª_þ¥‰©R žnp‘ßkÏ"?ùôHf˱“'î9l,ΓçÒé 5Óö—; ¹‰Á”ÌìYÇÞZ6Ö½H8Ù{’}çÈ#†­yú ©xeé¹À=eÇÆ3ž£ñ+uÓˆïJzV’~ÆM,ñob‰}‚öDXØoÓhsÆflëÕŠ!. óôÙGC¸ƒœŒ±œË4<À“iRR{E"ØH€Á—Æ/óͤKÌ ?-QXDŽo›~€[u~Üòë‘EÉÎðêÓn Ñ&žiØbU­ž4•ï¬×;ÏvòØ7A,Í£æEúÊ Ê,·KùÂH3_J Ç“¥‘õ*,ÔL^ÀíãÁÔw¾Â7MÄõS–.Wˆß÷˜!ÀcA–Bò‘[É^‹WJ)Bîñ…/¶Vì-fb.ñäæ²‹Wmpšb‹"Z&yÃ*ƒ™Db‡ñ3Läàyö)’“†uÀïBî7`l ôÏÿJb\‡…Ð9Ô3ä1Ž#½®ù{¼áx‰'L0ñrf‚̲¨4ÍëüEn_®Elz)6'ï?ž¼{óþøíßÏÿ~~qú¦×ãÞÿ‹‘Ã\ „ fûÙÆ»sþß¿~x{úúþd¾€HŽ.ä…ÆK÷Q–hÅ1GƒÖÙV6@¤¦öz…÷B¦žÒ;ÏYè+K@cv®ø‘Ti=™ÉÎkËsSH¡Ä5|É&¦õ2Óò¸o'¬¹ E–/†¯‰œs¹J3wŸp‹‰F÷‰a!Ä]ž» sŒbÞ“qv %SÉ$2Éïúº”“)\jefEœ¶AœžÜÏå˜)b$?5OäÇ”wøz{×Qœì¥Ï‘ý°Oû¢O¶QG1Ãö2PÊ\Í e¹²µ+Væã4›æ|Â:U°ž¸®^p{»êäT±C¥Ò@çB³«G›<[C™‡œæqÇXO\Èš.eãŸCÌ ®è3‹TñýÉÉÉ#Ô3˜yzÉrÄù¶÷WIíŽ&Q$ÎVåÛ»#FëQ¡®è×å¡è÷äÓ4ñÖ?‹›öE¶Ež1•tòîí˳W—çg ¨UÉi˜ŒÖ —ˆó‹÷ޱøâ§iMûq„"þ]x½·š°Î½M`ñº`^úR9ƒÌ½ÂÁò€y¡²·\?ähÅŒ‡bÄKnkX.ðr–˜ð"AL—Ó(¦Á¼ùÌ IÈTS¤½LP„uÀ2àÑüÔmæ(\±ñ#¸â¥,QešæSÒ¶³óˆ¡ýúßÇž1:£¹kñÌ;ÑÑ÷9ºò¼^O„ ™¤a˜_á«GÂê W–=‘ó–÷—3†žÁó:s[y_ž;¬øˆÐþÉÃd¼*=^ê]ÏÂ,))®Ø²‘ÂüÃ)ÖÏøKÞîΜñÔlæ:xƸâ:ñ5É~+ð°òá^aÍŸÍ>‹uµÆcçßÈ‚kv^|³,¢ Ûj‡Is»Ð*K•ÉI¿^?âcz¾ .~k+Êêd­‚A<µ„%Ë6Ÿ1åQú'º„]Ôgº¾Ÿ|K>«¥Z©G"Ù±ºoQÄ;–;v´gíÆ2ëåyKĦž­ ŒäêÆr‰—¬8n–È¢»O”Ê‚sEì"‘%ÿ]`v&¾D6¤â)‹Ò ÉÒºɬl”§ WÕòòìõ©xötÆu¸,x*6ã>«kÉ'Èùà æ0,lETð' Çe²s© u <)-0—”#Ÿ~>š-y"fš†ÈáyQŒ šµt(Šu°ê†?|< a ××ëð&þ± )—:xÁ_ÿ!šyÁ ç˜÷žåò ß]_xFú.e©,°ggYY‚ÙË9;hbkb†7dq£åûXÂ+_ó£ÞG¡%'3~ÓÎÙ††j»ûjö˜$^xòØ™¿óZZËbžD)é*ÛJÛÙieÙ0Õ–í½øÖ?}·°aãôˆ½dF– #ˆ‰Ðî) Ð=¯÷[Íyú4Ë6ΧúÉ´¦ÁØîG.Ül'ÏqBÄÂìÒ«¬Ü¡úÀ”“?‹¹o‡1{”Ö†ðµ*i>ÿ|¯£V‡0ì]~Rz#&<—;Ü/jqžŠíyžç‰CáÙÄ_BŸ²: ¬|;Ããù¹V ùÅdÈ½ÏàW‡·Þý<ĆÿþöôÇóc¾çêñßuK7Êøï<ßá¿ßÅO‡ÿþðß_;¬Žã¯™%oé—¸ï@à;ø¾ï@à;ø¾ï@à‹/v ðüg;øœÁ9ÿ:Õ~ðû› €¸›/÷0jÍåÑy»#ÀàÁ†'ì¼8-[“8ÕÎRÜV€âwŠN_±Ó¸ˆúkíyõ ”oÞ½øøXòÿ]œ½{+n›||Á̤Ê»œ5vKã…ˆ.ò7+¦©F˜§¦÷Gã ‹ úeÈz3~¼(ÊPxÎ7¦ÿÇ¡8§ó1/Dp+‹âaA—^ñtê™@ZgöþÝ›÷:Ë*“ÕÇs˜ŠºÆš #²²7\&×&Ãsð$Þ ý:§àùÍ<šž&@´x“--¬<“œåÙ\üf•éÅï÷³t–«ædÀmgqµä@ðYy+oá'®ù[w1h’bÎñŠÄù>/·v𬜷 3ê9ßUÆé>‰WÓNx},®)ž“Éã8Ù™8-bI\Ž<6b²~-òÛri&ù~1‚"ãXÂ?ÈKÚö f‹|‡g}Ïa¤—¢ÛïŽØ'8+ —'–ÇÑ|I‰Ú8qY‹DÍ=M‘2‡cÆ2.–æ‘¥üðQ.W{¼Ì—›±<Ù/XS$G+FbX´fÆ[.Y7) ¢eõ ú2ÇP\U/åXä_Ñärê|•í°øò§¡y™âóV,i¦”ø »—9ZðQײN(ɼ<¬_ őϟŸÍ$4Ov‡vÔRÕ(Ð_Y8ó9ÆáÅ'óŠG/úé§ËŸ$SİÒ72[¦#¥H9Òµd ÆP@d‰˜G’s)\©#ÃζýðJ<ËiÄŠ£P–ò½®¼ñ…ù<ôgŠ ²Ì“¸Ù˜«/0~ØØ|Ìmeª™ÓAo:þ|o"ÏÝ>žÅˆ¸ÐÚ2Œ¯å%ÜéšÈ#´*Ô(›ð?„ ó,Œ’˜¼™*¨¸T?â5Ý‹©poe¢çÔ‰æ7âÌ08¿q ÁJ/P+—¼Ê8ó–R]“•*ôIÞùàçéˆf-¡¤Äý!êÐ*ý’ëA¬°œq" \ß8Ž™S–)ˆvlͲDDl“¸È8°ÓW4ËÌ”s,e"Í"c¶C†²Gé$;ò³4›0]ëI^ä6clJzêA¹´¿rˆ|˜NAÎã¾KÄzóð" Aœ9Z¢ EÈ>²0µq\ÐÀÄFé.dÊÛD..K˜ß?9JûbiHrNXhš£EÄ"ož»ƒ«‰à8~XF¡LŸRKö ô9_2¸ó„NøfçU¾ö'.öƉ'ÛJ™¸$òÖ’³ïßÈc†â#ȃ“>ÉÔ¢xŒ7-±*Ç™Àžmå=n›3?ÌÈW@¾('+ÎÇÉ–f=#›»V”o3 Ò"ñ — ât“–Ÿ­¢‡æx˜×™{ˆrÈΪd«ôËÅñùßÎÞ¾êå6"˜YÀôfz–>Š3ƒïŽàWö·Ñð?¤S›”[`{åPD#P9Oxh,Ö¨à…ÃÊw¿0sübmbJ´§©³L©_ÉÚ9^1Àk qzenGòÅé2^¦u8ñ pbÍþ;­3„-érH ~áN›·$aKl±œ3Ê iºÀ™’m3@\†œZ SMinÑîKxx±ÕÇ]p±œ×ÃTHª©§«W¨Öl×ç6Ü[ÀI¼äžæ%ß_¤á„ÂwxJƒZƒi6îâxÑÂÏ­e¶—åìÄ%uҲ⒗grÜ3¶¯"§’ÊðhJ[¸|óì.¢ !PÇE†íbX¦8^æF‹¢”£ŠÍ^VÙÀ2ÂfžHµf“*‹@ÜÜs!wÒÏ™)ó”Z rÁöÿ¾Ø§‚+Åf ß]ÃmKDGZÞ$ 806[ãnËÙ ­ u)Ü $*â¥P"¡¯Ÿrâô{¶:™pðéLØË´Ø_¤ž9>Ö·B3Yº¾èZ¦ª/01åÜÏ„£bP,¸•¶&× cIn‡&šÏ¡’}¦±¢‰‰_qw˜~a=æ•üЕâ™)¼»`v%pNÄ̤ª&I›(S¬×•%ÙçXq…j DÀ¦"¶œ¿œNoö¤.VহëlêÌÞc•«Ìó¸¢Î%F2•c´¥bðâLª?e@5òËvI̲]‡W×b™”JCxŒ·!L~1^v]ƒu£J‘³+†%õÐË:uÅfõeÌ ´ÞÓïÜæ½P¦¢ÞÄÙðp%Ÿbðÿð{9ü>·’Ž-7q(œ$iB'Ý-âa2t¾Äk iöÏò=X[Ÿ¼‰®ääz¾8LÛ‡¿DËéä[ðÃ&äE¸øDνëièOx¶ôK: ¿’£I )=›=%ï‘×G~Û@‚^þˆ°×Ñœ]bÊepÿìGÐk°±zýöäü€|Ž&}bkìæó>ÑcM×d£/Þ=E´>m0‡£CãÐ6õCxZŽ/ǪÀJŠ}‡µhQpÉ3~YQ,C,ùgX5Ï ø1m1F(ÃQN½äö0j{[nå%!±H]åx,¹šæô’Šlòm{°p¿Cöã*ce« œé¤´CÐ *qXÁ‰ƒÙÓtgÀw”áºÏr¡˜²=Àçè,fM0¨S£Ä•oºÍà÷!x)sRÏšé?Þ? EÄj¢‰8¾ÕöxtâØ÷Kµ>úXà2ñ?£@À×gÌO÷üÛóWÝËKùFBC°k‘0è /9ï•¿d¡]ý(Ù“]^^rC}ööäõǧð·È3^O&lü!£7÷ƒ[…ê99ºE_¦¦çvÒÔ¦"éå,¨zrŸßvšnzSQ6ð–j®ô=_0ÍèÉ.Êb/Ë6ó"æ‘i¤ '÷ˆ -³xbhýì ˨)ÕAf\’‹Qx¸xwWq³_‘2Ö–õ€ZŠJXúùeÝdœ&9êòÆï;9öÁËÿ>ýéøÍû×§·•^Ÿÿ­Áwƒrþ·1´ºüï»øéò¿Rþ÷)?pGÌ7Ú%~w‰ß]âw—øÝ%~w‰ß]âw—øÝ%~w‰ß]âw—ø½eâw~‹q ߢâ>+*î.Ø»`` ì‚]0° vÁÀ.Ø»`` Ü2¸v¿q+‘A–›ḭ̀d¦28U %Í™çÓOÓ»Fe0ŒU`=%øçú|KÞ¯ßÁ¾˜Þ«ü†ÕAìór´K¡ÇÕÏá€3¿ÁƒÊ§fQ6üÊ&ÄWiØR”K)ýçÿÃæôìíùüsvÑ+}öý髳·+”åŸ8~}qúöEí#5ß¿}‡O|øøæôm¹oña: ìªü=Ê,W€ð»²ƒ HÁÒ)y&6-kù'lŒùÚÝuÂ8ÒêhV²Íû^½Ýñºeõ#‹«Ì#öEŸŽðÛ£~¿ÏbÈXÙÁ*Ʊ0WÄ2uŸdè:z8ëågbð°ëºWpŽ‹/HYÁ/u“6Fÿw9ÎV«2±ê…Ý´„мзø’¼v3«9–Tå缚íÅïäÊ.Uì1#æ¢ mPÖYbÊV¶&tiò…ÒÙ†dѯˆ½ÑB^å%ý}ò¾ê1Q¾X8H˹Y7%kzAÂ.a*0éËKìþÓônž*ó’OÝ,î )!"*ÃËêfrý {¯Y­;,¨Æ²áª¶‹Àßw„övXüajÎÞ¾º§üß¡6XÁ6ƒ.þ?]üÿ!Åÿ_‹Ã`ð&WåÇoÿëNºS€î ;èNºS€î ;èNºS€î ;Ø º~×qkg,$´œ—E-}”Eó¨Qi+ÃÁsÑm<±VÂß ¸gŽV¢cø\Šè“Ý!—GÈ'î"@˜ Eú…ØZÌY˜›Jº9<“pæ8³(__Âv-AŠ6ÔýÆÑ(5Ɔ錆>µ× šéº4éÃÀ¦Ç}ôË3Ü‹ˆ¸åþc”¸ƒI:K/øe¼ìvôÌUŒªSàOdz ¯ùΗOò$DîðÖM4‡-G"§‘—| Æ*øÂŸC‡Ÿeˆs[ÑE»~h4ÉŠRìጰµo1Øé¢ØÄ7 Ž¿Ö‘~Ä ]Ÿ’âDÿüî=^Dð ÁS<œ6!~ v§×KÁ[Vä3æWL£‘êvu0'ž¯õÅ[•âUzKLFŠk™ÎHÙy/ýäÄSh>ÇŠ—ó–Ùs‡ò«Ôù—ëh’]6bÙºbžŠ.“rÂïŒÍ0Ùi^Ѩçhá;ô¦þê(~~AaËÛ?`‡Uë˜&°•û¿(Ø’tZž¤C0ünéàJ2èՂΫ޺M2x§%†xxÿülÿj¶ü6'¿ÇËÙïé‹)VSîÆqe%{ž_…¿‡îôwoáÜü, “x ˆ[€© C ävßÏ•-À"ž]=þ¥L»¸ÊÞc L±À„Ç- ùâ,ð\;V %t9c+Kb¸Æ9lÁÈó– E›±â°Zr00·+?g3] ©Ý9xçâ lwÉï{ âõ¾‚ŽóhJ’çIÈ>3„BÁRÎ*E[ùŒ-gW‘H÷Æsz4™S´4‹R¼t­Ë+ÔW~r²(öHòQîQËÒKÊMå`Z¸ÊgÉ rW°¹VžÆ£½É”¶ˆçÖП>“¿è@¥±Å ¦ì¯—®|<í1&ñ!ÜaÁ[)TYj¬ÄÚä¶êçÃCvÖyÈîÐÎ/ª Œè—,£H`oÜû*¦<q/8 aäD2 k«¾¼›ˆß6Ï æÄ<㖙х³ƒ†èÿÀàºÙe?òZîŒúUZ¡¾GaŒJ¹ ©o5u;îî÷þß’"ñýÃò?N.N.Ï/>ÜV ˆ"ÿìäÀG]þÇütù)ÿâá9»‹¼ °Ñ…_ºœ.ç£Ëùèr>ºœ.ç£Ëùèr>ºœ.ç£Ëùèr>¶Ìù¨ØiÜJžÇ ;^„SzÈÆú5!ûÐûcÂ/ž…Û5³°5ps·Ýò›<²lY_‡WDŠ $ø˜ÂÜauþ :ÃãÃÀ[Ÿœö¯úü ¼,C£Œ•ñpqa†7ýˆK>ÞˆŒw‡U‰¿…Ÿ°_r/îòû®¸X\ËÆî)ŒELáæžìr~ä#*$y¸™9ˆhްzŽÕ˜ÅóhƦU\üÑï÷ej€ Ûgy, c}úÁ"Gx–‡à;£À£ãÑÀY®ïÙÖxäŒFc×Ó]g8ë{ϽÄã"¦óÏà}‘‰PIrU‡u·%çnþÌ]™ÌÒ PñK«ó|ew&¸3>qBŸ —+ó”âTÜð§Lôq]º“p‰fWÉõ4ûÌÈýösúë/Ožä \e†Ãs¼=ìÉHÂ)ÁðÅ3Y›ø$޽ɳ¯ðxß{jkìv1øïšÿ؆ÿ=¹vâ³à™öä‰lõ ðÁaðŒ@¿‡Ÿ˜§ÉFÐVÖ%¿¸ì‚ W—·}v $ zœOå7>þêËôúœrKq· ;a–â´W-Îp¹Eš¶øÚ©l°Ù-íâ’*î È›åÝKs‘ã 9³Ê`çÛåôB^ŒäœÓKgYê×ÅÊÕÆËÜÕÊòÖ:–-žti„lªŠmÎðßRc+/½Ce‡÷ÏߌøÇÊ×?Pa’JÃYÈÏ•-œ‹K È‹•ïŸD“‰3Ëï{âãÒû \‘œ8¶ Ä%ö”%± rNÈ û´/’SðÆi/!˜ñBrNù{T©bÒ85©6ø{´dÆò£TÝ­Rewc³úL5qÒrÂäªzó61B'ä2 `x`óÓ+´W M¬©^í¤+qîÎïþ×ÿ°ó¿çǯníö'ÕùŸnjºY®ÿÖ¬îüïN~ºó¿‡tþ÷½‡a)ªÝ¹_wî×ûuç~ݹ_wî×ûuç~ݹ_wî×ûuç~[žûåv·sûSZ¡æÌŠõ²#b‘é\!í¡ ²²XL4f®*Ûb` Tî\Ž##^”ʺØW·Š¢]çÊa`¬¥èíb9ÃR™B¥./µ¼aS#CÉX°‹õܬÎÈY-JG‚÷ñèO¢,VIC[OYj_{—ÉÕ7çß¼9þð÷½çâö+üY.v§Ñp?®(¬ ܺv²X4Î;~­„¿üÒë=Yù!|O< †Ãßáßñþõðÿý+–µ‰þ_ÿBÎy%X¸® Ñ)*-¥A|n¿ù‘hO”}pNŠ+ÕNkñ ‚Ué-“Ô^Ú&¼|sï:¨õRÜRì…q$^Aø•8}>œ¥X6­„oÃcâ1gŒ)ž«À.Ž#Π Ø!:×¾…çǃ£±%¨¿6!"üÊ»Ü%Ã!'a²/õȲ>¬=²êG@îhEP…’oØÙŸÇ®VÃÄh…Ÿ'pœU^ ÓÅg~"{âé8 çÌüú5*Š´z$ q OìRÄW½È&( Íâ"VäFlëÒBÉt0ì°"N 6x9PŸ0å&ÙÇqÖŸóÓcÜû±b?¼šþü4=füýj-ç?? gÐÂ/°bùù¯ò9ü«8 /xKë0xyU°|=>öörå˜i¯1&#°žyÆDîs<ÜKû‡—_rÅ5°¬0a[²/ŽCQÉ,ÀSŽ…ÌæÒÐØ1¢zd…Ò,O¾O¨„/Í,2tñÈø!~±©0!`ˆÄã•ôã»"2âǧèÂBý²”¯–~æÓ &,¦¯å›a‡yâ–BñnNÞÊ4Ë2Ih$-±eŬiY¦ æ˜Ï‚Di‡­^àò¢ý+ÊËËKñöäõǧð7 §`ŸC°Ò Ð.ܬ X”ÙýœV–#j¥¯OÓaoacõ++eÜ"õ°Î6UÆè*bC©•*´ôn™ŸDm„+uU#-E,{Ž+Ù4òûBá‡AÙ„±ÄJOó'ûU¦’™K¡9Òu%ÍfõãÊfeõ¬®óc!¯Sô¶èPD9`ëBïÑy^8ؤ>^xžw^Ý&4Áç•êò•¬ œh zWëTÞ¸Ðä‚V¾¢^¼>;¿ø  oÉ|·¯ÈÎg‘¤øäE•ZE6èÌ©ó‰ F‰¼~èv( àûh^¦³I£Æ´{ ˾€f)ÚG´Ž ’‚fä=oÖ=ê#N@Ʋd^֑LjÀ*Îyç¼h~ÎöÙ•¥ðÊ%¼‚'û1ozv“‘7¤ÂN3¯€C€OKðÀ +ÎT0Lv„0`¢å]‡Ag\%DÊbI ÀÐ5tÁ÷ !‡®bNÐèsÂ.›ÀÅXBþÐìvº•aW=ˆÇŠ z‡Ù$v¨à¾FN•ÍpR·¢ÀÉÃ)x¨ ÎQòH «~W•ÛÌÕÁ½Àý&ö‰{| Öpy:²Ëléö1¢`$,ªîLA3r"œÆ)0 ÎÜЬ!9*–U4M]zã3v“Æ1pÝ` ¨„`¬ƒ*ü©5 C+ì@:m}…×Á ÌŒå kž9.ŒówDžø¼ ‡ÏÅÖ1Ac=t„9ÔC^?áÇ÷ŸÂ+¸Ý/¯b¶˜À\”l\c¶g2)­K4õ0€\ˆË)õ€Fâ ‚‘)eH=s´žð°@ÌÀ§8õOá)v|Ķeešù!n§©/ð‰Òùï³è¬ç· »‹EôÐâ4¹ôÚù2ï’ÏXz¤•¾ž¾‰¹ŒQÙ1ì6A5¼Åì6ˆ.ó¥p´`ý‹#–¬oËû|°3? +ÌÏ”a™jìY†½“¥s»êÇsŸÊÇ+µÆ§hûÓ뽟PØÙMm2, 7Ñã-ÒoZÝsŒ§ôNh‰ï^è—æPÂ}‰ wK§ù˜…·ÑýÊZ(›ñb ªº_±+sÀ~…í#ÛAÌÁõÉðþÖÝ̱ŠÝ&Ò¯YR;‹ØÀs EFšdÑb1ÿÀî$]ÐæW. ²š#^ŸkúàK¾Vð¸} ElÆCåçÌByi [Qì• ýì€Ä1#ŠÚ>³hÒ¬s]^“ûŸOm‡'³´|pã™Ô»/êk8]Nó€fL‘Å e"Áö‹/wܳß+ T=bk(N>òª+?ˆõ|M MûzE œë 9ò­EÙajBââýsˆ{ÅÄW*çTæË“ºtâ.ø÷Ãòñ.´ãׯïéþ§© WîÒô.ÿ÷.~ºü߇”ÿ{Æ+Y^ŠÕ%w À]p—Ü%w À]p—Ü%w ÀÛv—Ü%?Ïo1n%Ô|Ô"øéàq9°+šË£„ãea/^ßÎò…P('‘ãó[—°ŽqwXìÑcZˆŸ ÜDK.ŽÖ"‘±+îL/'´&t.C¼ÑDèlmÇjûG,œ’ïÜúÕäç¿Ì|'¾þ–Ã0¸qMXØ•á˜ðÓ”<ôbÿ²ÒŽöP"ÆË0¡i«WžÇãùñ<I÷œ e‡ôq²ôÃ(k8 1c.Gñ/  ÆË$5vÈ&<…Èh© ]þ/ ]²øŸ8ØÂW5ÐÇv}ÔÇÿ ÛÒôbüO‡ï­.þw?]üï!ÅÿøBdë°€sCp;G>ˆt  v¡Á.4Ø…ï!4ø0Cë–]h° v¡Á[ ®¨'½ žô–ú©zÕr}ðÞj¢W®&‘ ó[håÿ¬òõ.ØÙ;Û;ýpqit{èkÆ`ìhN0¢#}<¤é4p=ßu„Â`S‰kÓ¼85\w`ÁÐÐôÀ1€mÛ2uCsEóòsº‡þr:½Ùm\5†&Å rU®¯of4«}Èž Àp4Ù$o­çèêæ·¹—x Ðᔢo/½a¥^ÕÏRð ³'Oá/Q4¶æyÜddÏ¿”)˜ìá’¢j.n¼#Ý4Ìñ{w ‹§åVDV ÑþñüôÀګºÏ¡µ³­Ã:˜öI˜jgô”ÑÚe >VC# iâxÆ‚èoÈjNy?IáƒQeÕ$¹¯~ãø=òÇv=×5ÇÔÐ m4v¬gu]:yâÐN¨¸OHaA° ]X 0;_·óõG ¬ŒáQSLþòe”|[5S±2ˆKÎè¼Ò¨@Íòš Ö/÷Œ50‰ï"É5ÕžKažÛ1Ôð¶HÖ«Hæ ±`…',],•ŸÄ>œŸ/\5Ì$‹üR‡ÂÙ‹p϶“ï®uù «±•ð;Ê*ë9æ0­(»kïÁù®3×1P&túTôœ~x¾ÆÍa›té&¢‹Ìþd1 ±ØÄ›µ¿Òȇâ{n”$ÑsÒhµ×,¾µ#ôiì•Fˆ±ñ=_C=>Ài~'ŠeÆ+sšá“ߦªIª1TQ\² ˜²ÊŠtsj«O²3 &“Y­^Ø ­žË˜bõ LÁмžËoö Ë'?¹¼1f¹õuYv%غ”þ„r9:c# ï˜chŽu7ëæh0¦#×vmJ‡ÃÖ«ðovµ^£zx½-_̧¯ÎÞ½½¼x÷·Ó·çLË32óÿfÏòÎÓ*AiÍÉ'IEG“ÉQÑÛTK¸ãéƒ.†i¸¶éw®¹öˆ6:îIÒµ3Ýß@–ÔƒX5 »!”Zµl´åK Ù¸s1)î/˜˜ä6jQÛ d·Ìw("›Û>&$û ™³Z™Qûù—ƒÍ÷&u[qoöþX©ÅÚÎNcI­„@wϱjjúÐ0Ftlèt?‚½14ƒ?‚$¨Ç€nlvŠ‚ð†¯ .÷?ïmçb›y§ŽæêŽaúޝQÓÖL ÎŒÍQDîFóž[ROîÒX(ÇÂÉæ³t¾â×Ïým[©ìZ/µd´­¶~M/çÊr/'S—ùêkŒÒ öì^P;eÉy`ƒêÀI»8Óÿ®8“ˆ#M2Ù“í$xºï'³ÅàeøÏÏ1mÆp±¤äx¾ Ñš‰AM”\?!¯“I¶÷”(ä…ÈqrÒYy%]“-KaÌɶPª{+ŸÎQeçJe¯§6dç[,I ;þ*¬hþ¬ØÔ‘êT‹MTîP-ëµ”–PŒy{,ІúÑ' Mk1žß[7'¹} ¿Â°ùœ4pÝïoNØÖè ÈÖóXÝt«9•›ŽsÙÀ¹½¿¹DÇ•¬Óe¤ÈqÖÂóýŠe³ Qyš÷Œr6¸æ-‘õD§™fe èlƒ²vâëÆÈšýDoöžW £Ù(nÇEnË‘En#V½®bJ%¯eÌê,·û ñ¢;¯ÇúãyC‘‹éx¹È4ƒŠÌ0$³õYPü$C|ÆJyÙ-;ÛÈ®94$ÂÈ!ébþ(ýÊðÈ|J´Ï]Vš|px¶4Þà{O3-ýD~T×Y‹Ä•ÂêE¢É4T—& ¿¼›ñA EL®®&O´ &Ç \.×,iKí% @dß“ê¾Úzäl©ÐêÇM/ Ï_¾Çïø3 _éÄçv –´L8ª|,áø³AS©OÞ30õ •—$c±^{ŒÓ‡ÉhK èeŽögλÄN—àL™8¯)@b¾)q‹r,Àó7ˆ tEþ¿œÃ²Û.8faöi5¥ò’æ5­—F‘}§|ÆÆV)A«Ð_¥ERÊa±ä<œÙ§x¤ú6ÒÄõ=I}.ÔQ/ùµ$Dƒ1”‹ÃÂT¾°;…SËOˆPeA–ú Öc"Ä~Cp·{ÊB¢ådrT3†úžCùõ&ÿü±¼¼ŸViž+¢ôl™* 9ýìB™MYðcê¾= ì³zà:cßÓÆ~à€vö†cÇ¡ëh~útš)°·l Zomq¸D’??#ƒ~>8QÞ=Uï„„{ïy'T¯Á·Ù=ÈDºô×ï¶Ù¼\ˆJ`aƒÓÛìÓ ¦0ð<\vûæ°Bé]¤!W0$Šß'MT_3Éoξ?É϶êOÈúsƒ] ÿ-‹6[ܦßþÊ–¦¸Ëʺ-!ßå‚à£^YŒ*”Êémº(*üž ÏðýžQ/†Œ·Íиp“FÒ+"uk-NðGûY­ÿÏÁ[ï¨úúSeüO[ÓÍ®þÿ.~ºúÿZÿ˰«ûïêþ»ºÿ®î¿«ûïêþ»ºÿ®î¿«ûïêþ»ºÿ®îÿÁÔýû¦éÙ¦e]—ºÔÖ`<2uÏùîÈÕ !‚¢`v£Úÿ`ì™AŒ­¡ã[Ãqà¶FmÍÑ¡Wà ƅ2ÞÛ/ùG%žÁ\ðvUc_½ëÛqm=¿—=—qO&üž°ìæ¦Ý–ióbi`Ue­tåÃá,Ù¤°š°p=õŠ1K”I’ºjäP›a%Œ`:¾¦Qc`»#cì¶å7*£dvw;……«óÔƒàay¨ÀSð×Waç ÚòçÁd¶¬´[í ·(Y?”Rgcyuvycîš¾…„®/æøh}dÇã¡kƒð|Ç4F¾çh#{³â8ü'½Ln_úÔÄ玵^Ñävõâ„LTná:iPCÓ’I[UÕYæÀP:¹¦>ù–;kŽ’¯†5ôVU]a:Ô¤ç¦C^eÙv.Úòg›¹¿È¸ºÓ<ÏÕ{02áÿÔv-mè9æÃ¬t+̉z|NpuqÁn›Ii˨­Êµ!x§øŸãÙº;´FCª¹šæ¸àc‚Gù€ˆšt>/ñžbС­tTK¶l3ã¡ Ýíkfàû¾¥ShRj ,}ìé£ÍÖÅÝLšôì¦Ý6ìoË’mØ?dajCG ì±nº¦£ -Ó±\[·7ƒi¸ö«Içìm¸ß–#Ûp4ç»CÛÓ-Û‡†ïQ6µ¶3o`<`î«IÜo¥üÛ2dæcžÁxäÙçSª l#F®ŒFfø#úÀÐ' ÌW“Ιÿ=øD‚ÿ«IY¢„ù ï&½ ½€G!îJÿùõÔµeçVFä,kÖÕ\g¬YàD{ÚÈ€ËæXŽol¶Ó¸#£¡$ÏÔéÌo3q ¬JKžm3?à1ŒÝÓg`¹–K}ËÓ,oLÍ´ëp =àùQ“ž›cV“‹DÜÁ:kËÛ? Cã€dþš¢5$‰0Z‹ÒàÁ¢ûK ÎåžÔMí2´¶MRí¬)–qúÀÿ0¸!"‹!ÅǸˆˆÃ¢ŒYÕœ~âÌW‘vÛåá ŒÙ=Eä ü6IàëÕUÛ\í¼zcÙÚ÷Y"¾U¡»PÆ¢ÒýRØ}«O^¼å2Á@½Y¬¢â*”¯¼»*ð(JF.£]ˆšÈ)ÚJF\ê¹ü”• *…M‘Ƕ"o%î°’¤oõ ÔÅ)W>HeqË¥ÿÙ‹c»*(u°ïAÈ® dn#À¥-„ZTo¹O ‰{¼\úß™ƒ`1$-¬ØžÅ¬ÄGŠî7sžú‰bÃNè0q³_íUÏwƒøúèz[w˜ð$¢æŠÍ¬¸X rEý4)Ù’ J«ÕZ–7V9×-&¯A¨üaLÞ’Â>íbê„ðÄÔ­Æ8èî¡ 5?»åPN_Œ»Ø@å÷L ¼g!|G~ÈçiSë.÷Sy?KšÑ/“F*Žè~hSvú„'ð‘õÙsÿAæ!/g¼ê÷ï¹DÊ Z$/_”-Iì93‡Ä7‡Þ‚:Š'C³’x7›²wµ óœIº<{{vq¹\†>r™«ÚxÿqmkqŸüâN¾P±`y”a9•g-Ù«mEêG¿J‘:Uïá˜Ì|>ât³mW…dÖŠtt—"½Ò5ëâá½Xà•§Ç‡yôA$ûœ#~cé|±5yþ5é~ÿäñ_ªðŸvÑG=þ‹¥é†]ƱõA‡ÿr?þËÃé¿h·ƒ€é `:˜¦ƒ€‰;˜¦ƒ€é `:ÒAÀt0÷ct{èkÆ`ìhN0¢#}<¤é4p=ßu„Â`7‚1Ç¢†ë"Ðt044=pL' CÛ¶LÝÐÜ<üËá$týåtzsû803Š×L²'(0M6É[kç9º†ºùmB¥x_»¼ª½êÙâÜÅ˸«ž/Fä°"¶…¥©ßŒî™fËÛ8ËuJ¸ÿ­¯¬(õ™»­"˜½îÒŠÜ•÷rùæš«„œQàÑñh`Œ,×÷lkÅ’®^ak‡åÓØ+ ?bƒz¾†d|€üüN^8$Ž¿R•y§ë\ê©£Pÿp1CÏîÉc×£9ù ò²S«ú™«Öl VÏ^V5ùàžÊ¾[~Ò!P€y#Û5Ïô¦« ̱;œ1&…h¾ӺѲÊŽkn«…O=¼DC\2Üö«-WœT½>&E×O-cùÃÀ×o8ԬрÕ=›‚ÓæyBܰˆïD.Ôäsmñ‚o¹Î¯Ô)Ùõökjá[2¥…`Ôb@ÎÐÔt:öÏ€<Ž Ð³Æ(p‡®1Ú¬,þîæBM~Á²*æ -3v4c Ý@óì!ôìhƒï ÇÃuX!ílq‡ëAI>ŸƒsïšúË U®„–ìØd(HâŠh¨ ‡Z±K÷ƒVÁ(ÎÅÁ&æ5û×'Ù-ojˆ‹¶± T‰¡¼‘ïÏ ¾Cmgì †v0ã%¶g?ìIWSŸ^ž¸rq"Ÿú{šâ¶lßfŠýÁȲ½¡¡Q{Ôœ9rÀÜxþÀÐÇîff÷¡׬oå(Øë~ÁÊ]¸~ºoÕ[¥§Áúo9aÛ‡©ºéØšo¡xé–£û®¡;šký1„C= öúÊý‘ Ŧž`v…¡ZÚNÌV8|Ži飑­ G°EØžo ‡†KÁÞø#ê=8pÖêYQ‚½.]Ãè†Ñ8GCTÀ–Óó„¼êN:þð'å7Y&ã; åE2/à·´Bæ\ z¼\„ä è}@4û©1xjZðû`œ¯‘©‡8caB¿“ Ûá\5ˆÝ_Yˆ?’räo«2÷ùcÞÍÓïŽÜÂæÓñ|©Ü§XÏB?8ñ¥Ío@l$ÿ#VÞÂoWÞœ/ÂÏ ­Þ,úP-Þ ÂEœä:mþ&|—lFí,ºüâ„Éb9ÔßàMxkÉVÛAÛ7¥%:hÝg Ó‘#¶á›o—ÓK™ݮϓ¬nÏ™\âêh5N¼:ü’©ŒìÝæã ƒlŒm%~2qæñ¼ÅòÐäó¥ã–Ô.gIHýÕ¹¾1Ë¡.NÈEô‰²½æP‚¹è;a7q7Wµ bÎ÷§jYó®÷†[$&â.ôÔO»Mž[ÉÏcÞk+ˆ$uhú6UîØ¶ž¢•VÛÌCƒàôm6Þ2ÝÂb¦å32gñ°ÞëK´ø$— ÛÅâ^à–WÄ|ï¹À»Ê÷ߦº{+àóq5^-iK$ `È7‚wþ¶@ÆY’ј*-yå¢%'<ÚãqW6óX8ß( ©EO“›­.§Ø=bDŽ‘?x;fV2”öÏÎÝLs¨ph-nd¨8ºF~U¨·>ù{´$°å$ ¿A„Èà :™œ¢Å´Åž)ŠXX>tuëˆO9kX†_ 9¬ ×RdoBgWÉõ¬±b„'?§¿þòdçOòg@mÒ‰23Ç:p÷e´È2–$"&#hšº7}ò>‚iŰ&cæKAlÒ°À‡Až nb;Ï7Μw)ˆ.Á2q6Î7…Cæ`ÇÊ’³Ã‘| ¾ˆco">bdþ)Í>­¦T4¿®õÒ(²ïãt ‚ÏØØ*%¨ðû«´H B9,Vð„3û7øo#MüWß“Ô7FæÊ¯ !ŒÉ HvÜâ ËÒŠ«BWÁ*L„8Ãoš3îç ‰>–“ÉMà?–á‚xÂ|ƒ<Á ÷cúG¶Ë¹:¢ Ì«0‰ÇÐ}-/ÚL¾‰ l dƒ• Šßyo£4>—u6¬,¢ÏdDM ³^í ûdÃuN dŽ{2ßÓ Ût ÓrÝ(ï“ñͧO§o—Ósš«°¹vb.aKJ°\€ êÉ÷DhokòMjZ¶Em_÷ôÑHóƒ¡ã¦1´Ç=´íjòedñ-¬FÿÔ¹1|¦é þüŒ ¡-jWƒ,{ÞÔ­7eÛlíΦè–!Á^û¤ï‚~‡põ2"¤¸+8ý •‘„\E…ƒÇ†@¸¿K Æ9+V½>Kh×R›ñã¶KcuÐw±D€÷Ÿ)n'W»Cû­ ¯ý.VHr+¥‚J¾bÄ8š®š–x‘‚ :û/=j©N*hjmФ= õ¹’¨u§ërÃÂÍLկìÛ{YùQ¯X¨‡±Þò»‚Ö ­A²ÖZhÉpwk7=j»ØòwwºÜòßË‚+Ž<·ä ”Ýû¢+PS³ê:øÙîçö~òø¯¹+DwÚG=þ«>Ô´A ÿÕêF‡ÿz?þëÃÃ…uØá¾v¸¯îk‡ûÚá¾v¸¯îk‡ûÚá¾v¸¯îk‡ûú`p_}ÓôlӲƮK]ê k0™ºgŽ|wäê†A¨¸ök0öÌ ÆÖÐñ­á8ð [£¶æèЫaãÌãíC¾¢’‡ Ïg.øw ÈZ½;Ü1+?…ó²ÊdqK¿ý1wcÖ.á>9è&°´s³òáp–´èä1®ŒË¹"fÌVe²¦†59Ï4:‚5êøšF펌±;Ø–¿œ ‹°$š]Ãäß4 ŸGKŠ—Ê6ÂlË™‡¸-â•éQ_ ®éMÏÕumlPÓ¹cè ܃xU5ÑüÈì8q1G¸([ËÛ‡ó7Æ"–¸Øõç_à•´äåV 5–7rŒ¡¡[®aøîÀðF¾g à7ߌÑf 5œ9NüI0ãV'Q9N»+–~¹L2²øT¢”5˜”–Œj1)««5gÕØrý¡T “«|@%)]ý*¬´©Æõ‘ mW­±5ŸÓê®?€?œ`3üevEïmN·šìÜtgW·™ê¶œÙfýi”c÷ЧVàT3Áï Fú0ð¹ÜîmëM5Ñâ®ÕÜíµm& -S¶™Øj˜—šªy k{02áÿÔv-mè9°©0jâ³Å @ëaϳʂæÓÑ–E@Фƻîª×‚èºEÅrïñþòþù“º°]úÚÛä ýÀšbY$¡üƒ›T«‹ˆ8lÑ•þ‰}Î|i·]µÞÀé{×’|ámÜ*=è¶¹hy›å¢ÝgûVeøb êðÿ(è'ìþuâå,üÇ’’©3Ÿ3Ì4š|¡tF*Ç ™ÇZ¨y<”åÀ•ÓÚ'ßC/_†7á$ÕÐF;¼¬4:_$|›Î‘ìq†t:žÚñ5aå¢SôÀåO$Aùúd×W€Þ$÷rŸâÕ{¹pû„…jDˆ´`×á¹8è(”šP(yG8Д÷qô$Õ:œŠ>uEŸzƒ>É’Õó› ¾Î"‘ïI «WÜÏ…raÊÇíÈ6dÈn×§©èÓlƪ“h~ÃL5¨µÇ,ÝŽ KA†ÕŒŒ—Ñ"ö®—³«øŸðlnÈ-é$­ûjêþp“Åԙݴ£ÍVÐfß´ }[Hp*¥xOŸ ÿ‰ü0ñjIØ¿ùa,î—ôÙu½übO°ÒS¬’oGôHAô¨ÑùþüÅ!Ûv˜;:¯ ¶ü渓wïÿ~öö•X–¼èlîxŸ`ÇD\'¦í(+(7£, 8x£‹ò£¡~+R´A=)Ú`÷R¦)t³ÖD7“'Gí:U(g­‰r>z²ÃŸvä+”´ÖDI?yBÈùÉñëcøŬ`=xØsXxš¨Ú’¯Ð÷Z}äÿíÝÿMÐ#?øçáo\ãö}zô[ì}Š~s>­I[òvBkb'v);-ÉW˜­‰)AîÍ­6uÐf äe+î+¬’ÖÄ*!ùkÍôAj¯Ï—sº€—æË÷O'øÝ’|…}ÒšØ'$G?mÉW+­‰±bšG˜RfBÑž~8{õÃE•1­6l›‘¯+ œÞÄÀírå¶3[ºÂVê5¶rŽWxE­‹`wøMÌk‰W ~6>¸ª|f ÈÖv©ry·­”®­X"¶¾‰ÒµëVóæ,ûÆ |ÛèÖPw ˧öÀ¢CÓÔé`¤›îС܎٣¦¢š•éã™ Øl0C…›?¬tu? fš-߆¢=¬3!ÛÌ“©ûö€‚ÒÙ-3ö=mìŽ6{ñãPθaå<5Ó±kx¼+ò¦™:| ìjaɆŠMípÜÈ,7S!«Ò Ë"R;R÷h°ÆÝŠ;6øŽ9ö‡æXwƒ±nŽc:rmצEéUø°Õ;Ä“‹“ÂþðâÝßNßžò?­téHa}F5‘È"]¸ 2š87fL Û£ð|GÖ&S«poG5ñ¾¼¿|süþòôíŇ³Óó|€©å„(<äQã#öý/±·^4ÿì z¾È¿ÛÑ«p‚G›8Á#…>Û7ª)¢!Z9²V¥cŠGizý"ƒïwã5û=òÁQv=×5Ç`‘ °Ž5ðì±®kCg‚¹“œsÏ„öÝ_㡵ßL¬iŸ?ÿÒl?ªéõZ¾_1ÀÕ?·c¦ž7×ÔÍ×ôz%ßo ÒF}8¾¿-‘6ê}pø~7"è°ßs쀚š>4ŒºR>2ÀšÁÞó`A)›«¢D¿á,ÕmïE …26ˆÉj†BÁì!5E Wkè¥3? *KsgÉkcÞ¹³íõ}¬—Þ$ñxz]m…Nöeƒ¸C±eQdÐ8ÏkûÈÆ*ˆg’øÔ ‹7¡õìWïÆr¡‹Çù’ÕjV*–Î¥ÈX­ãÕ¶«¯’fÚ¬Ú!8KDBáóÑIø‰Ë1W(Z/Z@ óh†e'²z~²â窙@|n÷ù l–ÕÀ=ýîÈ}¾¶&ì)STÌn ·j5¹­ÜîB¯—]¯[ß@…Ü"…äI¦„w$¸— öÚ[‹v“ }õˆŸ>­Øèר®VÞÙðb0d« m­t·Q­çìºwvÀY<ÖÚgÕ‚m9»Ý–C¡Ö½º_¼ï1Ý]¬žJm¢"Öª4°i›VIÊ’Ûev7f¸wøÝÏÚŸUü‡Õ’·í£ÿÁ2¬^ÂZ³Ã¸‹Ÿÿáâ?ðkÞ;܇÷¡Ã}èp:܇÷¡Ã}èp:܇÷¡Ã}èpîƒošžmZÖØu©K½a` Æ#S÷Ì‘ïŽ\Ý"(j6Â~ÆžÁØ:¾5¾akÔÖz5¬`\ŽÝäÛªíê!w[q‡ðÐ!<ÜÂÃ`|¨4ãà^p>üxñ9v<¼†ñã,d€&7ÿûðv3);ÂmxEcÜ×{×N` v³tÂ'° ÂérÂÕÎÔý|¿p–3øâ ìè7œ¶Ý`7ÜHÃn¦mGè ä‚z×3>IéRrhB^€ÃâÓÙf³³”‡¶³³ h†ÍÎ.€€˜L»¡iz· W˜,rºÄñùx~|÷ø m§e ;›–]@ÜÐÐNð ÚNÎ.@v59;`†™O`WÃw^çÞuMØÙTÎ {!^†‹ówĽŠÍfp€Mgp€ÝÏ`˺ÿ¶6éͦlóéQèär6üN¦G¡qõ†ï"y)RÆI9e|Ñw‡ä¥+ôºÞP¯ïÉKW¨qýÔ¸®Pãz35ÞÅP¨k£‰º¾?$/E ©+axH^Š:R®ƒXKþý y)ªH¹a ù÷&< SR®{XËýûAòÚJç yµEÌYKþŽ~Ú’¿6Ï@òj‹äsëK·¥ÙRØJ£ÆV*‘¼^Ÿ}ß*ËTXQ³ÆŠ*¼6 GaÍ’UlÖ¨ÂV™ÍQÊJ`T0ä °¨ja£ÇvÚŒžp–lBO;0§[Árª—sóËKo>YÆøÿv£kòT] L¿ÂNfVY ³,üI8“=ÀvRb#Mñ¯Ú¡D)+ÛñéVPÌ·š˜Ê£'ä˜ÕEÀæs¼ŽI°ˆ¦äÝ\\JΓ¥Fs[Á-HYôÅ lgc|Öj«Jߥ˜ «áž.‰È‚úK~æ$ŠæqŸ¼ÃC_âL¾871ØË˜. Låbœóâ%¸/ì…Øz·£]1—VÃ3VÈ™ û;Ÿi¿¥½³öÎjcïdÙâ>hƒóoßxwyBÚ‚Ú ƒg77xsžÛH‹hq9…O1ŽìGAp@N/ß¾ûñøìâòÃé‹'XÔ &±%© ch7ýl¯Z‚M5lT¡ìæˆ$Âù¹¼,V];3Ò.xc·VZ—ìð3r¨M‡¶FG¦é9¾¦Qc`»#cì¶åù0WÁ”ªÍN$±ƒuhKÛÐ\¼ÍYò¸1pQ-Äá `íœÌ]L»B1ÙÍSûÕÕ§¬a£ }1T£b¬ˆ\ÕÌW”ò/šÒ©P-ÃMTËHÑè¨ ~d›WXnqøOzÙ¼¯g‹p0¬<}-×0øõ†þÈÇC×»®ç;¦1ò=G¡ŠËMÚ+š\ΖS±x$VHåÒݱ-¾V£FÇ 7ð¦sÜf0VHà¸54La†Ë„Ý:¥ã‘kêÑo¹ã±æ ¨5ð†^a†Ï°^ç§w¬æñ&Ûc…™ט‰Ó{‹0±c…M·Ûp)Hæy®îذÌàÿÔv-mè9¦\ßÂ>²ÃKD)Þ¹ hƒzß·—M‘£ßßã×ÙŒðývJ\êž9€ÿ9ž­»Ck4¤š«iŽ…;)>¿/Ù3t+³ª@?l€D¨)rüàû{ÕúU ßo5«ã¡ Ýíkfàû¾¥ShRj ,}ìé£tբξU¤ jå´Áf*Öi]¶ÛíϨ"ýM+§¿µœÑ8XV¦6t´Àë¦k:ÚÐ2˵u;…Uy·2¡Š%ZN£kÖ¨b‰Ö¥ÝÁ„*–h9Q¬å„‚Yõ|wh{ºe›ãáÐð=êßvÆã¡Mz+†T‘x¦•Ïš5ÚKòŽç³-*dËù7a8yvàù”jÛ‚‘ë£Q þkÁù|~²˜Òu{Z)'þj äY;ÖJù@…ÓÜ]¹¬åSb/ñ.cÔ\4Z¡œMÔ `±%†æÝŠf[ Ê¶Þ€IÜ™«¹ÎX³`£îi#o8Çr|#ݨŸÎü6‚Ù‡ó6 3§ÈZÝ)òíϨâPY+*·œQpÓÇîéŽ3°\Ë¥¾åi–7¦f~ÂëÓrSxÇáU>„ºcÍ£8ëÖJgÝë“J”Rœ˜kåóf*VBùØ;ÿØ.O¨5ÅQ¹V:*ÿwÃV&¶îÜ{Ûø¶¦8ÉÖÊ'ÙÍU£ò õæ#ªÆàbbPíb4‡ÜÎwQ€ æž®€ÖãIAÕ"Î`º^€®g˜zÓ´!ÃZîÆ± žÝÇ?·±zã¿áˆÛF ÞÁ˜•îͦcnç752<ÛpIlÅuXoCžl/lÄùÂöò vŽ6ûv^W#.¬¾z¯ T¤Ø•í¢Íôçl{ÑQinºl¶<+]Ï~.LÖ¿¾=WÔÉreó,…D<©L"¨~I ÍàJžÚm¸ ,T£mÈÂíÎçÖ³±pÃÁº&¶-õ ó†|Ùê躹ªÎ¿YÅ þG‡0ýƒ0Ç.£–ï ºÿYÓu>+à?ëð\‡ÿ|'?þóÃÃ. üwÐtÝA@wÐôjké1[ÝA@‹—;躃€î  oÚéöÐ׌ÁØÑœ`DGúxHÓ3hàz¾ë„Á¦צy#p,j¸.^³ MÓ èж-S747ÿ|8 ÝC9Þ¤]Ý%téb6ìiPÐÕ—ÁuhЕ}vhÐÛ£AkôÃCƒn;)tÃ>o ºå´uhÐå>o ºíìthÐw‚­Z‹ÿšíèꀡ‹}Þ*0tËåÓC?8`è¶3ØC—û쀡;`è")0t ]ñÓCÈÛütÀÐò;`èz-ù· ýáô¢Ož½}ùî`CoAÑmÀC[ •omÇÌÑ+ ‰EÖöšã‘"¬¡<’qžð„ŽKa ¬M Ø,…†¶ZÀ:±«]Ø o^Ýa¸Q£µÈ«µ U³úcÎÐÔt:öÏŒÝáØðlËîÐ5FZ çº+Tнçt¶œV>‘‡Uë‘ӌͶõµ[¢Ä6ÄÁ¶+Ò.®H´|$o#>ŠgdЬ^~`+‰m®éê8‰¦¡×´Ū±­5½|Ï¡›vÓ^7ëæd&!ì šö£pìUxÞÏ‹¨iíc³^N–ñuÓNÚ!Àæ:‰šÎHKœ×¬‹7Nœ4ž÷–À¯Y/ï0UƒúM»i‡ÛšuóÞY8“ m*^CÅò®[þ²ŸK¿©œ ˸nù§]ÍeA¡†ë”@Ú—LPoÚ¡B שƒ´C0%ŸâkgÑ}d0T(†á:ÅpÞrd õ0\§Îñª†Æ£Qè‡á:ýpáÄŸö1R(ˆÑ:},gIØxõŽJb´NI`Ox@Ó~Ú1gýü(…­a?í•ÿ]‹¾©ß¶âA!I÷‰‘((DËûœ§÷l–ÔD"OßF?:¾);wo–‚1n`œÀŽëXPK£±îêC°Ÿ®ïñuoß³YRÉØ¹œ^\#V^܆¥»·Jºé€_D=˦êAmðQØÕsÇɾg«¤&Y*R’Úðs÷¦ÉÖÇ`ò(¸Êõ¾ézC:ðA0ð‡çç=›&5‘ÈÏÔ_²Üš­ÍZÛŒ£š>ÙêRØ èVÅù¾ë®©;|‹5¼g»¤&9ʦmع{“4x–»md°wÔ‚aÜÁÐpŒn 5ÎÎ{6Ij"¹k?™8ó¸¯Í¤Û¡Ãñ 0Ç#/ÙÔ…úÈûåc,fl‡œ¡«'"2tKÆ*‰EÆ~dÙamØZËÚŒ­Ôý²9ôÌ¡¡¹&Õ`1nà–£Àœ­Ã]EV6?ëÛf:Ôƒœæ4ÛÌH]$v³q}mìcPoC_£þÐxð«ë¨F½±Æ½/ÌlÜÑŒlÆÞlFÔƒœ¾X‰·˜—Ú\Ê WÊÈ£®gŽ4ß453Œ¬¡?¶ CÍvF›—Ñj‰H½Ê©ìP©‰~ŒéâÕ"ZÎß×Ú°¶îkCoÎðmkL d@úl5aašààë7–˜.ÚŠµË^ Dýµú}C¯NIìv2_º cwo4MjZ¶Em_÷ôÃ`0t\Ã4†ö8°‡6?Sµ5š·$³jb§² ¦­È*΀FÅ3 uGȪã®Â¡~Þ†DÅAi9+¸Q£ãWÉy#Û5Ïô¦« ̱;cƒW5i¾7 xìj¬¨’«.<=¹8¹ö]^¼ûÛéÛóL”þ§ÕaßX‘+0®Á6(Ò…}KšÀU»ô¢ù pã`Cº'ÿãÆ¬•t‰|Šƒöt)RèÆoX-ÓU<Ý>hK—âÂÕqã"Ö2]‚s kI—â¼tÜøÊÖ2]ðL²Å<*ܸ& ¤ž®YtÉJK6”{…V7¾¶LW$ ã6¤K‘@1n\Ê_¦k!£9Ð¥+rŸõAã‚þ2]2Uò`~éŠÄg}Py£ ‹'·m¦ïuE¦´>ØH߃û–UòmFW½¾×é{éý\bG›ÉW½¾×Ë)ÓÍèÂÄån%2ÊZÒU¯ïáûMå+ 2ÙÚ€®z}ßon·yPmCùª×÷ðýÆúd?á'&›Ìc½¾×ë²çëéZŠXYbꕼ^N–oÔ¨"{\¯õ­ñ|ߟ¾•Îïå›ã÷—§o/>œž“•Ÿvó¡@ýÕëPWçã_6ÅËíÂø'kÕùwKßOW€ëu`Àëi¾ÎâØ9’+—ä$+Ô}–°‚dLRÊ\¹+Ù€b…!¨VR,rR²×íW6 [a'ê‰kÉÁƧ×og6 \aHê`k Ï'¶Hê×îw6 [ahê`ké> ŠR½j·7 Va}êpk‰}í¬ðxíæm²vªJ¹–ì·nÝÖk±·kO±¢ÈD¯Ã[®§8ó>*óN6 Za ë@–k©k•‡Ø«n@±ÂÖA4×RœæT˜ïÂ.vš¶°ɹ–fyB·Î|§ÚíIVÃ:xçz’Ùævýä›ß V˜Á:lèZ‚ù‰ôz‚¹¾Á óW‡ ½žàYvÌR%ùmü$+,_]]Õz’—ùC·Œè5;iòïv$+ì_¹ØªQ£ d4Ý®‘µÂ©^BÖj8 °4½–¶Ií˜3 <: Œ‘åúžmGÎh4v=Ýu†#šbÇ>õÂ5/T=‘îói ÑxúÝ‘ûœTܪøY 5,\»DÕeµ\ܾ*ce>}ZQ¨±ž¯˜IVÞØŽ±¬˜e[Ϊ“n¶â¬ºù*ΖÒ|Ö³Uf"‘â+[ò¢¶å«ºŠb+¾ª›_#±Åº›a[y5w  ” ÀÛieókøš¥7à©|xK~hÖZã¤Æ$ÚÜ8m‡w´ž‰l#@ÐÏ'OȺ&ö+ìXÔèñö’¨®†ÞJÕͯ‘Ĭþº$ʇ·”D¬LßJÕ¾÷æ’¸­_¿ž¸‰!ë_Þ_™!ò$óêw ‚êjç파²ù5"È뫈>¸­èÙÛóQ]ưÕÍWñ±\8ÑÊi'¥×·µ4Ã-×·ºb‹mÐv…*¾V¾¶%?µì‰Ô•[ ­ºù*¡­®-ـŤ²©mÅx¼¥«!–7ãmà›Û¸K+ Íc~†Ð¼ GIYý¼£¤l~•ÊÕ[70UéÓÛn‚Ø«ZTã²m.ƒ»À|k#‹kÚ_¯VßÙŒª±x¶’Quó5Î|»Sám}«lØÕ•å[qVÝüÎfµì ˜*ÞÖþì"`§Ä>Ø.`§l~ ? h Xš{~[:ÚR£ªQé6ר"Þ©<¦ÂãÛñ/_Û:*§Ä;Ø.*§l~­úÌéNùø¶ ½A<¥†ÙäÛ9;}6ÎÞáÉ©À?ºpÀ¦çž{Qà+{# “ }Îo‡x*Œ¬Ãþ59çÖûe8ûÂë}7 gŸ„žM7î{q¼NÀÍãÍ„Æ×”&{̣ðŸØ[„ó$ÿÍoÎg‡ºGâ…÷lï·,éâ¦ÿ[Ì’UÙ7Í^ôof²Š£üvŽÞ˜: ïúˆÿg§„ZöÄÙ` EêÚ¼ÿ¼GÈÿÙwn‰vúqSÜnöƒåŒqdÿ1ùAà’7½ÿø[òïÇßöªy$^3î#f¹È c‰.úbI4ßãž‚‘Y”@cÓè3úŒàpÂC$LHˆ¶=Š©OܹæÿÌý´”;†„« $nB‰G'“xîxàa>Û챿ç`¶Ùßšõ‘!ß%œøeAØ`íÒðê:yJ,{þõ[ƵïŸÑo ?“è A¯Âé8Á°Z^ãß|vÄ—øH?þ|…îÉQâW4âL«ٞìSÐu8¡ô<è[tÊ»&éÅ{ÂÙŽÑé<¹!NL°3¶vp³UÍx/çsÉóm,1[gï¹ÞôÇdA?‡1zçŸÙE8ëûyt¸‹Gáï¿GïÏ!Ç3Ÿpo“œÍÐFI‹i+‚ðŸÿtØŒI’;€Úª>sÿð‹W\aqi(j*þb|3Êeüûè+yFfô 9—ïï¥_íñÇÞAàLbzðˆ?ö¨°,r¬™9ŸÑm/u®AóñY$ß-'¹O'aœˆ/à«I˜m™O¿Š-›·ço`Vù<¾w®hš{x±ª9<Úø@'Ȱ¬™¸I;Î $¾Whëè-ÞÐ9Ûè,u­¥• KØðaeBÚzö¢H%Z:Âzi¡‘dø›tÞRžgÍÐlŸé^îÅBñ¬µÜwð-®è\³çt‚^Ô»Sç ä¤?Ÿ]íå^e?Ñl÷êkñloA3³LÐúïfùVϯ£/û×6±L”-üú´¢¦‘Ð åÇ5›/óëa/?Ê—!ø{ä³3YÂ×ü³=âxXò‰ÞÀGT`Eâg{«´±Ö^â·û ôñY}Ù,ŠwÙz«|HZÎ×¾}ríÌ®è>ýŒ®Ä…ŠÊ—jú‚ °*¶wNÐîȺ¦L<ÍúgO| ñr’Ä?Âòeóú¼,K쩳éÕqY 7³HyÁbމU:…lǹ2€L˜SÝÌþ 代å„ëZ©t‹êI/¨'½¥~ª^µ\¼㤉^¹šD.Ìo¡•Wü³Ê×K#bFà ã4‰aa CL@Æ ¢9/Ó-¸…ÍgIHõÆ‹vÓ¥ÊDúŸ)_û½‘’œšF>ú0X •Ïž7îD²Ÿs˜xúÈãJŽ»‘M3G;“w<:ØÀŠd_çd8G¾›(6»WÑ ï%7ªœŒ¾å:Rø€ýÍå gTà;`Ôt/@J'r±úáâÒ7MÏ6-kìºÔ¥Þ0°ã‘©{æÈwG®n gÞdéÓTêÚtŒ=3‚±5t|k8|ÃÖ¨­9:ôjXÁ¸N{B½G‡8›(Ñ#wƒöÒÅ\ø˜y¾{¥P'ÿ,·Kã=dk(í7RîQ†í°ÝÒq¾ˆa½Š0¤†ò'÷"pÕEŸ:׸ 㨫5“V !50¹RÈ6U· !5@iŸä ¹ÃÇÝ s`O(9g!Å÷$Ž‚ä ìXÈ~.X‹7>nGv}™2!5eÊ9²ÛõY_ LH ØEžU˜ÀÅ,1h­ÇˆL9>ÔšqÐŽ˜úJ`BjÀòÄ|øñârìx×°©ø8÷q‡ÉÍì:SgvÓŽ¦úBbBj°*6ž”ú:cBjêŒw?)õù„ÔÀ(å‰yEcÜÌ{×N` V¶°tb9§Ë W;S÷òýÂYÎà‹/°ßpÚêQ”©AQÚtÚ`€¤ pçÓ¦Àú#uXH½ëŸ¤t)94!/ÀKñél³ÙQ€ú‘:P¿gG¡]ëPùv?; µ[¸—'&ÓnhšÞ-èžØž.1 |@>ž·£J¡ëðô6ž…~­ƒÂk2-ˆFÅ`@Ú­PÜu ny¢òýù‹Cv†B`qÑYLûäœò”£“wïÿ~öö•Ø„ÍØgsÇûä\Qâ:1mG±B¯×a¸å)öÃõ’hqÃϯiâ„“¸ßŽ…/c³íDÊj\o¦ÆZuj(ÔµÑD]=ÙáO;òÊÚh¢¬ŸG·$_aŸŒ&öéIõf›ü´%_a¬Œ&ÆŠiaJ™ E{úáìÕUÆ´Ú°mH¾ÂÀM Ü.WnK³¥°•FcîoÂü¬@Ta¼>ûþò‡V”˜ j¶¾abcJ¶Ð,ÙÂf*,”ÙÓ|—g´™ÂΘAª¿ÇPä/“ä[Pgýë¿\%ß¶#Fa5ÌÆðÓd²]ç on€Å90šØl ÷\`oœø0á›pX¡ZÍæ0ž%zÂY² = ]in€y;0Ìl£ÁØÂºôæ“eŒÿo5:K¡À¬–)Ó¯°GU")ǬÐmÂÎdï9GÑ>áÿ‘/ü«!© g5¾`ƒ¥g)4¡¥o ¶‚ùv³í9fe‡_œÅ x“`MÉ»l^(9O–~ÌUcAÂ€ÌØMØÎ2Æ*#påX«­ “¶b2ì†ID²û &Q4ûäžägòʉÁŠé"2Á Z,B‚`J¼Ç”½p@â¨특´ÆÛÐCÌ Á‹Ï´ßÒ“±¶ÍnaÛÂ]´ÁùÇ·ï?¼»™oÔ¨â”DÛö”d;ö+F´ÒÁçõ÷<š¾ë…¬8'ÑJç$•ÆnÅ=Ä4NK4ñ™÷Õ”…R·Œ?Žéµ{kƒ™¦ˆckå8öÝ ¶âÎT­tgjI°›)–†’¤¸ùT+Ý|ÚH¬ÉŠX7[aºí b7šâüA+Ÿ?4jt¤P£çîö%l¤P#£BÂΦóIè…É¥{;:t¤Xé#S­µÚ(ÓÆR7Rx!£Mâ #… mp”¦)â`Z9v·R7V¬Þq•ã½*u»Tpú ~ñÃ÷Í…n‡šNWT¨Ã÷íÅCW” Ã÷›4ª¸{pŸ2§+Jnáû ™{9YÆ×;Voº" ¨kJI{ .™®Hêå€d³FnוyÞ¾) Bu­j«'Äh·;=]Qª— A5ªpéuõ·Ï}E¤L/EÊ8¯åm —.0}¶ËPÄÌôMbfº¢L¯«»ƒP(ùRD¯4tæï”ÿ ^®kÔ¨¢.F¯«‹¹}þ+az)¶ÂÿZ2EÜK/Žª¥‡bÌ3}“À™®¨JÐËU w+LŠòݬU§»¶gŠ:½\çЬQ…¾*g¯ßñ(˜Yé”F»ÞqëŠø®n)\Ò‡²†‘`½œ"߬Q…ʵîÕ!µ:تtH£ÆÛçæ¼WèOký©HU×ëRÕoŸ÷ŠìuÝ®Šž½qb §±3Úp+×u[3{(‹X‘Ø®—Û›5ªÐ´å€ñÝ ’"ò¬—"ÏAÚ±O]›ïޤl¢BGŠFG÷ê)Bôú¨Ê zï,œÉ„Þ®R“×G›øAŠ„^½œÐ{Ç3 X£*?(¯€±b1Ž782©‰F95ñNùo(`$áû:þÑâÓÎ,™¡€—„ï7;³æ¬ gɪ™?apé±¢À¦”Ö¯)c >ÝRÌŒO®ñz¸)­õ+Ì(…¿+iÝY^‚¡êøƒqW EÜØ$n("‹F Ùí«  ™QB!+©‹ß¢:¾†Ì(¡“5l²"ØÅA– BM)RH¨Ù È^AQ»mS‘»lš íש=u:'9 š«°dfÃúÚ‡¢£°ðæ&°ð¦"´kÞkÖ¯©Èú5+³~ó:¢™ÇÕP ©¿¦Õ eg§§ð¦¥ðF­ pMEŽ­Y}û"¡[›v•ȸ½c{¡ˆP›¶Êý«„VB ˆO››Ä§Mr±Y‡\|ûB ˆž›Ãª¬ ÆéoÁrs8cs¬àýø^y?Vð~\Åû³$¤\¹Ý’û6VÌĸ šÆ.½8EHÏ7ÈÜjFXKgNÍ3ÇMʳŸ;ñé!?sÜÈ×Ò|®ÇÄÜÏ×RdŸZ ºîNXŠ|RK«:ªP#»ôð,$«¥5ÜqU¯ÔLÞÛ:z–âÞt«|oz£Fˆ¥VÝ-ÎÛM¾"2déªÉß­ñ°± Kßt§My«éV„ƒ¬MÂA–ÓÀºW”RKr`U¢”æEb·ž¥€*µÊwæ6jT±…·Ê[ø»E~¥e®ÛmãÝH»^’ŠtJËlbéwæ,YŠ„Jë”Pi)*­M*-E ³u¯5Ì–¢†Ùª¬aNe{§N†"¾b5¨aÞ¥k¡¨X›Ô![Š ºµÓô¶lÑ8ÅTf·½ÝË+š\N¯²&mÇXŠT7«|Q³FŠkx¯V¨ÐDÃJˆD¼]eyŸö ˆ<ûí2yBâÆŒVäÌY圹f*D¾\Ï|·ŒV€Z£*™AÁ´D7ÛñZ!Ô›€‰ZЬ;ë^³î,EÖU™uwN·“iErµI9·¥ˆõYã{•iEÈÏWÉôÇY¼-§]ÎÑkÖ¨BfÆ»<«oi0mh¬=¨<ªå± ŸmE&ž½ $¬­¸"Ê._u§m+àìAÕá3‡³"·Ó?[²¼~h6ÈP·ijv9MínY®ˆ’ÚZ•lKø®+B¡ö&¥õ¶"Ͼ×<>[‘ÇgWæñÓ]ɹ"uÏÖ6‘sÅåVvùr«»å¸"ØkëUrÎånx®ˆùÚ›Ü)e+`l}—µ¶fS‘`ë•ñ4äîŽ8^B³7S°Qd».Š\u{0‘,Í?˜¿õ^ÜòE²+××7ÙnzëuX][6¶ËaãöˆKÎ.½ùdãÿ[Nq?•]ºŸêß [­òÙu`ÛÞm+°2lcƒS[za×á ·Q’x{$ôK^↗ n–-6…`#Ùýeµœôbw>õBntÈêKûøùcñZËq«/Jn=î-î^^?t~¹4©|s›ñ«¯ o=þÍoµWÌü“ÊKÑ«_‰sŸ¿ÀKëC%xúÝ‘û\„¨ÚþõSDXÜ„cê»x[sl»ë}×sì<¸Þ­kbéQßhÛš[^’»ž«gkÚŠ%Ê›`Û³dÓËeiÒÂ[û‡LäIá‰ä¤*úWâÿãχ‡$X8WèM‘ÃÃ繡™>ñãû䇋7¯IEà ÃľÞ\ÑÑú£¾6H‹g‘Èçæø;ûêz!É¿Ú;®úþ¬cé °µSg2yÞû@ç¼î.¯b’D$„©N’èi¼œã÷ÿoìE z8ïG‹+PÄ«"«aÀ¼Qøƒwй‘ƒÿÅy|ÞûS÷?È‹#¡‚„»¼ gA„k(Ž– 2¹ß¦üئ‰ÿÕ†–ÆþÖøßD)Ö óOš9âñãÐþi  Ãþìju?K`Bþä.ÉO5Ï‚¾ ‚îö'[ê×Ôñk–ú‹w'JPÈûß¿>;!{‡GG?'GG/.^ŸX+Z@.Î,fvÞ™¾Ý#{×I2ztôåË—þWéÑŇ£¯Ø–†/‹_“Ü›}?Ý8hìðët2•±ÚŒ6ùÛìYügJPðì!ýÇ2üülï„k·Ã ܹK]úöúüåoQÆ4yöñâåá”UE#?~<><åë$¡;É·svúlœ½ÃwÀ?ºpØ dϽ(𕽑„É„ ì) Q¬C\†ýkrÎV!y¢áÏ÷¾ƒ=É'¡Çû^ï‘<Û‹“› ¯)MöF*Ä0ñì0öá<Éó›óÙáŸî‘xá=ÛûíKº¸éÿ³-4û¦Ù‹þÍ,¨Så·sôÆÔYx×Gü?;%¼Ð²ï$Îc(R׿ýç=BþϾyK´¯û˜p³,gŒ#ûÉ¿º¿—¼éýÇß’?þ¶WÍ#±›q‡1«Æe_9ô2Ð)J¢ù·ð~DfQM£Ï”$×aLà¡&$D›ÅÔ'î\üæv;â‰K|¤¾B·â(ñ+q&àGíÉ>]‡@σ¾E§¼k’ŽP¼'<@àΓâÄ;c‹Ø g1[ÞŒ7ðr> oc9uѳÑûƒþ˜ì/èç}{ò™}ðXXïÜ?« Ã]„¸mz7§³7ïÉ{ôÚr<ó ÷ɸ} &iÑ"mEðþ³àÿ‘.›1érÇB[Bçgn~ñŠk.. E•ÅR¬‚Ï`O¹Œ}%ϸóä\þ½¿—~µw@Ä{3‰éÁ#þأ²ȱfæ|^D_´½ÔÍÇg‘|·œä>„q"¾€¯&aæÑ‡3Ÿ~ís{Áæíù˜Uru®h°A^¬jcÏÅ…6>Ð 2,k&nÒŽ3ƒ‰ïÚzz‹7tì%ËE]kiŒt¹X°iÚzö¢H%Z:Âzif¢dø›tÞRžgÍÐlŸé^îÅBØ ÖZî;øWt®Ùs:A/êÝ©s rÒŸÏ®ör¯²Ÿh6À õµx¶· À™Y&hýw³|«ç×Ñ—ýÇk›X&Ê~}ZÑÓHhòãšÍ—ùõ°—åËNü=òÙ™,ákþÙq< ~¢7ðQ•X‘øÙÞ*m¬µ—øí>H}¼GV_v'Ë…â]¶Þ*_’–óµoŸÀ¶óŠîÓÏháJ\¨ˆÇ/PÓd€à¾.Ç´;{Bd35ò4ëŸ=ñÆËIÿË—Íëó²,±§Î¦W{Ä•Y¤¼`1ÇÄ*B¶S\@&Ì©nfÈòÝÑrÂu­TºEõ¤Ô“ÞR?U¯Z®^‡qÒD¯\M"æ·ÐÊ+þYåë¥1#ð…qšÄ°ŒÀn‚»@ †{ühμ¢{PXÑ|–„To¼h7]ªL„¡ÿ™òµ¿Ñ)É©i䣃Zùüèy#à>1A$û9‡‰|ö¸’#ÁÅndÓÌÑÎäC@ûX‘ìëœ §âÈ·Åf÷*ºbcá½äF•“ÑCØÀ\§B °¿™ äŒ |Œš2£">¢¹Xýpqit{èkÆ`ìhN0¢#}<¤é4p=ßu„Â`S‰kÓ¼85\sŽ‚¡¡éc:Ú¶eê†æŠæÙ®épº‡þr:½I»’’½¯8›-Ñ5÷…öÒ]ø˜¹¿{¥À#ÿ¬jÏÆ»ÊVTÚ3o­Üµ ¾ar¯‰Éˆ!¿Š0D†r)÷®JܳG5ÒgŒÈu#CÅ çê)Ø@‘kEH TOî°v‡?mN X4BjŽ%SòŸžžÓ¤°ŽÚÀÇE:©÷k:ÎÖ‹÷ZñEQõMôÆÉLí»VXüº‹¯VºfgÁLNÏñl÷o¡+%üÅvÜSX}½qâÔæ$(,w]öç* ËÄÃsñ5´£µeaû!(¬wù­F\lKƒÂ—óD[³Q¿}6*Ìpó¬Ôö]+Lh9´ÉRžžÎüMWq[ú«¤yÆêæ$(l‰ÑØ–¸¸é*n=…-iž» £RÎmÉFýÛvÔ(ìC9±¶Y£ _¾ÖMíuœ\œH—ãâÝßNßžoÎ~…*7Z©r¤ /2r.½È§XÀ‚>íiS¨x£•ŠGÚ˜r_C]KÚºÛh£»ù|òÏ´£D¡ÊË€ÉUà³ùeÈ^¾9~yúöâÃÙi^z[Nƒÿ˜”¯ì«Ÿ†‘¿üc%ßÒØ›ðßjEšü»½P+ð‘‰ÙJçJŠãÅëinI±BC›­4´¤˜Œ1Ó)Own·£R¡¹ÍM4w-€NvÀÞ”iCì4\l åxD¼ÅÄ‘–þ¯ãZZä…|€õSWåµ÷œ÷ØŽY QÂÒùW³V­:¥±·¾qgPÃhMxÞÐ ÆŽ=vw82õ‘Ïȵ+üDQ[Ý›7‡B©X¥*$’ —ZcI(&àØkCÑ´zÄÚ$>¢¸_’ÔÝ/¹Q\U˜hË¢¹4Ñ~=ÿ/Å‘s]Ný†³W™=y{Ï/ð¼‹7 ÿ‰4&ÎdBð½ÅTœŠÍ?ˆ¨Ñé“6u*U'|OQÕtö]†ýü‡åÿ‹™ÛêƒëXÖšüöSÌÿ×tÛü‰X·EPþçyþ~þgèKïZäí®úú Í*Í¿ezWÿq?÷\Øñœ—lˆ2ˆ¬¼a',Ÿ^™<Ÿ/Jè·.6(WäÓð¥>ÿ€)Á2{=¨óg˜‡\J(:ÿ»Ëd)²ºÞFoøjÜ{þ6"â÷‚·± ƒ›_ÿéˆv,cõëß2`¹—Ö¿iÍnýßÅ,OÁ%õ™.’‹èÌßç‚ð¸÷¯!˜ÍÏ“É3òèÑ·ðúªûá³Á·áwBd&tv•\þõ¯áû±œE|уwäÊ‚åyœì‡¿Í¾Á×ûæ¶wðí@| œ}¯Ï¬ÑþÑÏÎá?‡ãÿY£Ááÿ,_ÂÏ/G³'ÿ%ò#9‰}æñþÍþ¥“˜ò¶fßivõ {—ƒ½¿z³~³ÒÙ}x°ÜÆškÞÃÿ‹ìSþü·½÷z)³¯hòÓû(Þ:ÍØŒÅlIƯúQ€Jû1ô“댱_®1)„=@þò‚ÿýó3™ØGPéWøÿ_Ÿ‘\ƒ¯i|+¾e;}ï`%AåX¾® ãï«Ã¸i6ŒÆãH-—GrÍå@#)å† vÊÇ\ýVPyLÖÁMr¿Â瑲Z˜/arO†M2ô{Ø6t[\ØiÅOñO^ D.àYö+Ëɤ„ge#‡BV>•\; ´ [U—æ²Ðq ËsŽa[Î@;Í<Ú'ä,&3J} vn.%¼È3N1O:î÷Rù|﹇S{ñ)Ð^lÙrp# ƒå™÷že“™•è Õ2Ó:B^.اÇ¥>×8½f#üýwòçÜãXé{pÐ&û{oÂ8ÆáÌS!9i_ý=,ƒC.Á¶Vþ°ê&xÊ®A–ôY‡+?Ï«¿•åˆ)<”û<}ö½¹àü+68¨xâ5Ósò k=ÃÒÁyZ9F_EƒÏˆ‘{Ä,á#ÿo,I{ÚÛ+<òAyUùÈuèÓU‚óôr eFíǬ|'ÿ+ IŸ郾ØÄÚÂPjí5JFá9&+ß®Lî!yñî 9P\çqO¶æ M˜´ruFºpS ÚG4òý ­b½ ˆ—«bÛ|†6o\”,Õ¶Îsý·íCT ¬ôô>š/ç…„ÿÍ{’ :ÙvPÅ:ˆ5ücE<›÷Ák‰¤B)6ÍK7lëßR’‹²|HN±‚„üÀà8±xâÄ™LÐh\Óaµ\Xcëø¨¾£…¨ÁõI°ˆ¦y› èö%í«e[ù„1_¾™Ae/±Á`eßÛËózµàf…-©W õz‰ßϹvqn%§ú êU|)uùÊZ§èÇ`»XS-Iÿ)×Íãosa}ìïëc-ýõYžÒ¼ŸBþJlù(¶Vù䬒Y €Í;V ÉÙŒ¥5 s\Nâ¡U¦öÙî´ï‡ñ|âÜ<{ä"¶ß£‡ÏªÞË‘û­ªuÁ81lòhþõ‘òÁEÎÍü;k<ãÝNнrý®øØ“#Àï2ÒÑÆ3¯nQ\9Û_\ç‹oVMYZúâÙ ?ŸBr‰GÍaÐD{áá\íÉr7Â*çjt åUë–7g9)Pϼ¼¿îñâÏÔ­JË?róºŸõnY¦KšU±-I¯=¯™N+€]£¤yul~Ðôs’;ÆÌ¡|Œ$|ÂMÀb9›1¿?õõs›{¿0µ9WVx{©Œá¢£(…Œ$òÿÀô%ä©(óì³¹dsŽ›„³Ó”\ŠmâæüÙ3s€~~îÍ(Ê >¾¬¬„ïÅö-Û¿­3Aûé08¡@Õ3µÁŸ\(^ê{°¥ôßuq)$Q&D ðqàIñÕŸÃ_+@9vNŠ[¿pFœÜÛ,¨€oôÙæ33Ÿ={Ä©<ƒ è£Ç¹‡ÿUVþs ò#Á¾óŸý»·ú[ñ)ùyëSÊ @ã~Ñý®ºøku~˜”LØ6ºy3ý·Îç·°±L£7©0@KY{åáþ»dFʲ¦ÙÂ8=gèeår,_Åbÿq+á÷‹k¤Æ»… F^³hF•ȹ›ÍÞ)ïüd$-} uÛxa¾ü.?Õyc±ç>I(ȧÇöÆy·KöQÍD;d Ö£ûGä¯GW°¿Ìûaùfþü¬rl~Äl°ɵ“jǵPjzÃ×Od…¿"ެ Þà'ä¢ÃåÜ^µÊÿÏÞµ7·#ùÿý)hïÕÉ>;^ðMŽãleœd6µÎ£¬dçªr9H‚‰fdI%É“¸®ö»_ãE$(RŸÆ“#k&¦Hh4к€¡ûìÉ3:‹½wF}FfÖ|þd•= V¯ŒÖGð÷ôÁoë…=ú¡’I5¢+…v1¿óæIQ3õÒPôWâý¸Ž2¿Mq÷VÚª¹X­ŽmzKÀ%–⬅kc²‘g““_¾;ŽÑÂfsýÄH7Y®ÖôÖ~9?çü¨çà°ïa8#Kêz<ýû_ϋδެFÃjÒ ¬²æñ‹­…mÏ”t³Í0dlxƒ¡Ä½Jm1{43³M‡Ò "é(Æ÷Ía t)¹ÚÖeƽsÈóL½2úý²>ÿÖA6™–ËþùÁµÚ7̉|`˜ßnAÿU.AD çѺÖu½1xKÕ|f¶€2ºlÅØçþ>˜kV‹±ú±M±Ê>›™5«£}¬zW£©ëi¾§:}~b£ï b¤¼_l$äÑ£{$ÄõkómÍÒû”!’Úçzvì%û¬+-ÓØ=‹ÑÎyÊ·(”òM‹år)7wÝeO'l³tO'ñÇöíÇõ6è¨ÇÆÓÍÄÛž DHî¾%Ko¹ª¼âÏpC¡õY« saò[0ERÁÝߣÔþ´šŽv9ra£•–Ûéz~9ÿB–˜5ÅAÍFïâëÝvÙütu›á‡èÄqÌ|”uÐ×g BÎãs^84û ¿áÍ/^Ð'zíž@fŒ%·Ëåü4¶³ÀÓJÐEW IU¥r4Ùþ cç¦z (ÿJÿLçs XÅ ô{·ó¡.úOYÒ7å¡ \c<Ù?äšÚ„—N¾2]),ŽwÇÑ©—]B÷Âà¯#øW'“‚šU“>šöš¦e²é–Ù S¬Ò½ŒŸÈñèo£c¦±úè©6ùIi^Þ’†êe“%á’þ O¦ÌùKÇ0æ%ðÈɲÜ0cþ¶ª[{*Ý[u·Ö„jÍyWï+æ7\SÝúW›ãnÈÊTwûÒ6lé‰î^j¸œ4OOí>™ÑUªÚÝ"Žw[¹³‘/†ª›#‹9ᣄ.é–—€÷F[å kJs0-Qç˹cÄÀìc÷Ü1óÈI¸uìG ÅÝÌ9?<:܆^’ã°I÷øèÖü¶<ê_ó«%jŠ¡ÏRî·Õ,N½WInˆÇôç6ç‘cõÍÔsóè {nÜ3CKü¦NaëÒýeo {%ºKdUdÍÖðÉôÌÑÅr°x‚ªY¤9MË‹6œ™éLeZÓ¸u8ëüGÅò…@XÚJh¸rØÎ@¸úYcbÑ>d½G3¶>„çI'ËÊéÃàÔŠj¥¡+†ðò®z²´Í^j6À‹§tEÌ0µž¬+öo£«ž#ó°ÌDL½¬ ´Û©7œ°Qå]¬;³[pf•^M“¹Ë’ÛFÏÏ‘2 Ï1׎Sm KGpçv-I·ÒºÛ«ë KÆšÏۣ㉳û~ÕFLªÙnRÓ;µO8á]ä[*w n1¢8Ý©¢4Fß•Ó/tlŒ·b‰G£zÂfÔ•H¨Û#hÄ þñ;.–äñ‡,Ÿê²Òcç3Ûþ£têÓzðžf $üœH±HD¶%9u£¼§‚Ohí©û‘¾|,­0ONMÄâÏ¥Õ7ÈèOaÂEðúÍLµKEÌüÓ§©PAt[ôl2¬ï¤gœ óQ'ìËg/@ø™Q„è4Íd¦ÉsÁ¢?Uâ¶(Ÿ‰š@ªŒ ;¦H."Xå0i·ûçÆ·M+©tÑŒ©¡’Ë t·g/ÿ9Ò2Ò¥ ÞŽ¯õÈn9Æñµnëܾh€õ•¥øðÈ^ Æ.ba”*_¥—¦$IùºO2zۻ훭lÂÅ\ûaºe›…ð&¤µ·{dû·?}³o«ïÙž–›Æ”î®Ô§V.Ù|ÊM¸Â¥´KÂT‘VÕ%K«ÜfihÙí}£å«†÷«GßhͪŽI­\ÍÆU'Y‰‰y¥Ìø‘\4„›é¸%¡s–Ù\…DŸÈ&kg¥øj­Ôóû«K‡È"’ÉÔO§_ðÝJˆüŠ ô'ÎjB£¦ç´œJáQÏļ¿£=9[½–™ÀxÃGšè¦è1!?_­èA7š nÚòø°Ô Ù/*ïÿ’n¬À«ÕjÁ7*ø@İÖL(lÜÌÅŒAG|vr¥à‹´ Žþ6jfp;3¬3škwÏ^”Å”Ø4Vjnù 98ÇÿÖÈa½Ä“ig»¢–Ȳ”ÇÀ³C\Í¿¬ì£âêÇ»wøŠÉoÆð(áƒ2Õ ûŸBji‡óX+Lø'í.Ã%³àh‰©s¬Z-${¤2Găñ=íQ>ðC/›Ò<&……ôj&¯~j¿ZþWñ×Ð|£‘Þ|£ÕÒõüëQ]¯‹vãx|ndÊ‚Ê7Ô¹Y°²ã9Ÿëج?˦Ç4.ѰÊYÅÅ@Ýš³W15%lgšÔ¯N{<6×? GõøM£,Êòª£B¿á&=7z`kjf£@“‡õPШ  XY¢Ø{)Õ¨¦,ÔŽÒdb uû²ä+¶á0€·¦ëšý ÃÃçÉ':²°F1à§D "ÌÌÓ×ÀÌsG½‚5a‰¬’ËÙ% =8f«ÞUe¸êW¹ÔôŠú€WõCC€ú­Ù"çñI¶$ø×0x¿*ŽuR6Pd»«|Îg·Ó©V?Óý/³;ÔšAǀЖo—ä·¡-X[*/~ÿ¶|Ë7ø‰º±ˆ„49e{„ѱUœ£rÐlÅ–9¾ñZª«²lº ÛÉXJe,6ж7Tå3$5èÕb:«Ð÷ɧÙ|)µ¡$ÉÁ%ùli™´ÖêvÑÆÈ† ¥“ŵ†×sÙ?GVQ®EÌœPÿÒ.Î[Ɖ7Bh\ÿ¨9ÚèͧõFè‚Gµ -¹^1ú¢¹4‚ÎÈ—**JÖí‘æˆ0•œ² w(?nÓ%Ý1äöp—þÑfȲLž! `ás­óaf?Ö c nÒ)tŽÎ×7 J«ù¢RßZ/mp¦ÐX™Fr³(Gæ¹Aw ­/¹~<ºÎáW-^tžÙQíU½Ls̰ÖÊD³ô’`¨MÖû…Ô4¶=Û™‰¡ÍVÜÝÕTGj¬¨ D Ïñ…‡lx#"¹V9Þ%O{®­m§¡¡M 1×G†ÛdØ|<ÙŒ$Ψ´žùµXôÐbÆê)¿ÒŒ%­wß(»ÖfߢjTšÐÈÚAê ŦÙRŽN}¸¡Gvô?eÕ¿¢®bk'x@-ydmÇúü¹«Â|1 ÝtãÏZ_묳¥ºÆÚF……¢YU‘¶ãÏêÉ¿Q/uPJq ¥t¶+îtB-¦·QNR„.&°®&ùß öª0‹ Dn…JšvWè­Ý$bÓq ?l4‹Ì”ÈM-3Ö3Nœ_notä]ÍJ|oÑÜÅÀ¨XWI/ÐÕÆCSìsu g±V^9ÔÁ´‰oºn’#‹6®·QdÚƒl‹ {3ùÿ§fÒ7lZš¿ˆgl>ÁìàÊŸ¬Ÿ®×ËIv»&‡£ê4Õ‘Ly¶!!›&÷Jy»Ð’ÕH¼ ~ú îZécÞ€OÓR^å0¨’éåå ֤Ь«íyÖâ!Öè+µÊžX˜Åä&Z{£Ñã¼åÊ,‡Ô7H›•S‡&ü@>~@Ϫ׫å•Üz­¢‚,GøQ1ùMb=™ºVÿI1:¯®Aôå˜o0Y~Fñ;™!'á9EêI™/û’fËnÌ\/éæŒí™bU)šÒV%®Îˆ*ZëÚü«“‘q°¶^™Ÿû{ŸŽZ¨ç9Œ¯Æw7Ù|Z£§ZXÖh?W5¡àÀ)^,ˆ@f"߯¢*õµè, ®øô{2£žxÍ… 5•3t7ËÑIƒ"F”ጷ%q?6,TÖBÖx ²Mp͵ਡ×xó9µµ62]r¨¾­±Ÿ}ÌøOo´düÍæ€ÿ¼ê [3°\š«œ€å7ÀéÉ¢búª/×GóËeãáTc0)<© q^ÉÀž~‚Öà–üüĈ’‰+Õ”SÕ”?nés€Åœ\m˜`BQF™å|ºàö«VÁåø#׿©É0Ë¡]ˆyKj’ ÿæš<·±ÉÒ©Úèm§üب‘bÉ”PPÆ^^»déI~»QXáJ­Õ$ýmˆ°]jd†àT™–}/ Qª¥àŸ‰5kú¨L÷ß¿^‰XÄmÆdûjúè àƒž£ª/bq¦+sdžöŸ¦Mm 0‰±Nº5ñ|–O'ù¯\!OcÑäè(Öz5˃mZ~ü¸`â®öp‰Ë&ÿ÷{úK§ü»qCþC…ƒüïâúžÏa™ð3ø>‘%çKíÛgÆqk;81F¯Æ‘1ଙË9[·pðDÜœžžêòl¤±»:òn#áìл½šuýl‰WÕ • èý¤º­µý¡9=èmµ+HÕ²¨küà¬ýÃöXnù©‚ÕâÿùR[Óy`$¡6 Ó&nÖYÜqRPSÿ‡;Ǿç7ðŸú—ÿ‰/=tí ®—óâ–ÍNà'žÑ‡òøÿ†àÕí’uløµº[Q·&@²Kž”â¼R‰œq•PÛåË×ÿxùú'‹5ÿ)Ý–Šf Êò p"ÀPã%{å\ñÎkñ2}ýüçñ`_ü}—MþþóùßÅ5à¿]ã¿`Àþ{ÀøÏß½ÿׂÿûßn.;þÓll½¬ýð%¬rþús_6ùøo˜ÿíäðß®ñŸ?à¿ÿ=`üçíÿùnÿ¹ƒþßÅeÇä+¾YL óò„"¾çü‰s!~|þŸO_½½|> À?óe“ÿÿùßÉ5à¿]ã?oÀþ{ÀøÏÝ=þ ƒ&þâ¿wrÙñ_¾Î¯½‚o© ° á–¿‹wøÁ{Î3í1àAxs=~wewóða^6ùø ò¿‹kÀ»Æî€ÿü÷€ñúü¿aÿ þŸ\vü—áÕ$g €¡KPx÷#}༗?í½?ýi°ýýé/›ü?ü‡â!þc'×€ÿvÿЀÿü÷ ñŸØîæÞ`þ QÿÁ“ÿíäj·ÿ…%Ý&,×ó_Él%L×t_—woþñüõXà@ºUŒw}½$Ÿèâàëɬœ_'Ÿ†ø Γ( Ê<ÈQ¹(H³8IpZ’.›þö_º$pÐÿ;¸ü¿;ü¯ðÕ€þôÿп©ÿånè÷=è²ÿ¡W×ÿ^4ÄÿïäÚ¸ÿ£†?ãY1%jWF‰Õs…§“LÁÄŠX]’AŽ ×%>вÄ”¢°à`ß–çáÑühž+dJa£žþŸDze~ÏPµEþïvÛò¹þÛÉ5à¿Ýá?c| àÔõu>Î=ÀÍúß…¹>jøÿÐpþËN.;þ»®³žäx:cÇæÂƒ ñàµx lÅ4âfD‰¥„yA±€a’¨ðr/IÜ¡g~àÇQZB;G Š[ú±2`Þ˜Ögi¼1­Îï”Ѳ‹ ¬pÓÂOAqá’"ŽP·Yž—ä©vDfÝr¼bÊóYApjðDàK Ø÷Ë"+¡‡/õKòRŸÄ¹_摟үøA/ìðHá®*'9rQ˜cä'ž‡ÝÀ‹"$( ý"ý0±W¹WiÌrl+“ä9´6Ê8ò4ŽŠ$ ²“Ћ0/c­LÝúl/Xç=ŒÎÄ•Œ¿”?úp=NKâ"N|Ð,®‹J%i˜t„8²\g%õgyaR¢$ËÊ„$¡—–¤Èâ<Ëó²,@nbù¦¢Zùí¦)ÁçÆÈMIÓ¼LB?‰]ìE$ðÔÉïªÔ:³=Ù^_fG)&iæ¹¾Ÿ—ybúA’§$ <`t2ÛëÏì‚xq ]¹p¡wž‡½ Ló8)7!YRv1»­¨Vfã(JQ˜ø…_F8-MEd”E@™ÔƒÙžÁìÏ€?æÓ)^¬¸Vù;^]h¿ûH9ÊC?Ê#7‰Jþ”D;C±}ä…±Û©Ø ‹»ÉL°¸{9ëY¼WÆ¥_¸Ež&aƒv+ý¨)â'Ye}‹_,'¿TÔix«õq2 $ñH…ˆ9üƒS/%>Šs7+Û´IH9Y®Ö5J^Ðg[’‚’8 cP3%.C/s‹ˆ¹Ÿø~’”  }H™”’€—eÏb¡°$D”­K|Pô0ÐD!I ÊÈÊ O±ªë ¸ÄÛÖ?!a×üçÐ1ªwý(N‚$Îû2›Á“µ¤áõügñ«Gña £GÒ0DŽs\æö“ú5 ¥E¯âooÖ0ÕÃŪ"áöæzÒ§9RêÐÆe”ø8Ã!‚vHR/óbŒ¬È{õ‚ù`))$ oÔÏ>¢`7#‚.Iàú^¢Š|/Íò´—hBiü@I•þ ‘—¤'˜9ÉQdyLPQ‰Š“²EI›DP¨˜0®~õ(æI„HFÊ ìM¨?½È2? <Œú;[OTñï«_}$!NQ¤ ËÉ¢%8-ʰ S 4Š[ð€V<õ‰ÃYÐ ÇÚï> àQz°`€ÝˆÄE‚`FgÉîñ›+Îm¼}(+Ç>t°J%A rèIæòínXQ‘ *¶ ‚`©‚8bßÍâBð³2óCì!¿›˜)® À˜>Ùv P’æ>q„Ü2 @I^ MR€ÆlÇGFqýAR„€ÿI–äq† |iœ¦qœ¥¾¤aR´(žåµ"%¯L½¢Ìý4ƨ€I Hg1Î=BÊÍH©Q´Ù j*Àn5þA„ á%JH‰ÜÄK€ÿ£<ÜÁÿm§ å–œFDÏÏ „]€‹YÞ"{} kå|lì.}è\^B0hº$J‚J»^Î7§Û=“í½§á¤$~Ê×õP±Lé\:DxIуí[L Â( IÅ~î0Iˆ ½KÏ @„aÅ-Ƈ>…µ²½,"·=èY‰PH`jéÁ€ãA˜tÌÃÌr+¶S³Ó§åüvQézêîOôɦ’äÐט–Àä4Œ‹4B0o€á'¸SõQ2ø `ÐÁ·ÒÊ©À+`@†QøUf0æ. ‰ØM`ê‚làÔ÷íÛýÕfÿ½O`·ÿ¯~þcÃþO;¹ÿßîü¦epÀ?Þ¨ëÿòvƧ•÷¼t‡þ½Æù¿að¿ì]oŒ$ÇU_”€ÁR";(A€†ˆ}xÏÕUÕõgýÜííú–Ü/Þ³ð£þúÏî¬fæ|g'€@B($ ä(€ø‚(€‘BH ‚ð!Ê·ðE >ðª»g¦{zz¦×Y÷ŽC•½w×Õµ]¯^Õ{õ{¯ª^¥qÿW'iõù®þ‹Õí_9,»”¿X»û‹g±@HS#©Ñ'’¸`ŒJ f¡Æ¥C³ÍVÕã °ßñ¼âËÓÇ•»ÀD¸†ycúŒx/´òBø„X0ˆÏ&4ÔíŽí¼æ½c»¶^I]†du¨6I™O”r–ŸHí4qC½¾ÓdÿÕ¿÷K9+)p dž"ø_†5Ow‰N¥½÷iålÍ* @ƒÁŸ Â5~iÉxŠ„Ùëõ!5BNpª ±:¸?¬!þe‰'…?|å@(Hº{4Û–8^ ^•^4*†cAœ•XwÂÑ"‘2ÃIâ˜pÎK•P¡4—&_œj{êr¾4±HÝ|•âT…2ªXb™$<õÆS+Qª°Õ«D§-©*¯W,ÒU^º8e)Ì¡X–pÁ…@ÌØ°ãA;¬@C[R6÷ä-£mîÔk¤nå™P`V„ZeGYB¥XŠ$^+ãu<ºi©Éþ;_ÿC(îÿï$Eÿ_wþ¿ª%úÿ¢ÿoSýg{ÈÚøt‰ÿ/Æÿê$-÷ÿ âJè:à³#w¤ †·™a’#Åx{}þvŽ%Xa-A†8«ؘqæ¥ +¬Ø¿ÇΨ›cÙ& çx¶‘ÊUxÖ¸6Š…}s˜"œ+€ +¨ò„SÿÆÇ³Mòîø/žÿé$Eüwø/Þñß&ã¿.Ï‚ÖOêø^GýßAjŒÿœ;K0 &ÈÏ]‚%è×Ê׫„7N DDª­a©J© à+.$^ùæUA_•ª*Ükó¬P§ÓFk*IH"¤J‘aã„×Ö‹ßx8¯)5Éÿ¹ã¿¸ÿ¯“ñßy࿸ÿ/â¿ ÄýÁ¹ÜÿËÀØ_ŒÿLcüçNÒêýaOvwfËÃÅ>¦-3LZ¥9]•ïUÔZ$ÙPA±}¢FmikÃê «¿»‚þ%h°%èœUy¾Ðq™üoBü_D¢üw‘"þëÿÍæ×ˆý"ö;ìR]ÿŸÃý¿µøo4%Ñþï$µÿ[†>ÅÛe°§xµÉˆ'¦rZ&ÿÿ¢ý×IŠø¯kü}ÿm&þË8ú:x×á?BkñßQ¼ÿ­›´ÚÿWµûÕúó5ÖÕhNá^[~3YSM f"Òl–ËÿÙ"Àõë¿õûI<ÿßIŠø¯;üWž_#Œpà2ýÖÀµþ?–Öñ_Üÿ×I:ÿ¯~ûW —5ÆŒl3ÓrùßüÏu’"þëÿE`Ä›ˆÿÔ`p[œùêïZýÏ]Ôÿã¸þÛIŠñÿV„eªF@ ¡ðŠÛrZª‘Ýž¾\wF-4÷6ñO*ó‰Ã†9çÃm!²e ŸŸ0Æ'Œñ c|Âo&>áÙìïþÿåðõ]{Ý÷ÊÏ*¨Îe}mç0&â4ܰe•QHj.‰a)^sMDÛà}@Æ4R^¢i˜¼öóªVV¡Ä€²tR…+ž —ˆh…ÂðŠ·§)²ü– dÙñ ‘³]Â>‡)««¬Ji¹‰uA]+’3O­# ‚‰€hFAÐD3áƒPá@ÅŠ•Œ–¹•^ÝÀ²Ö/,” ÞƒÄ J @ÅÄÆ'‘`´³ÔÊ%·–æß|ì5ù=Ϫºe¶ð븩gUñÔà&§ºþßü×;Iÿw‹ÿyÄÿÿo0þgãÿ$Áõø8‰û¿;IËñÿŒŸIߨÁì¶÷Ý"ã—ÎSGS–:f±ÁB$!®4¡„3顟ÙÚKçë^ýŒ”+5W~K‚´M¤%9Ämâ,gÈÀ?µ.qF&éZ‚ܱ &ÇŒ){Çvžkõ0Ûa'%`£ŒòF+",Œƒà[“¶Uõw&`ê);ž‘p÷èÖ<§MwȰ£Wy&ˆÒ*EÐBb9†¶¦Õ(Ž–:;¥á™ùcѤ*IA RæSá#‚ˆj¶oÁÈV¢ µåÝ) Ï–3ZÁ°DIꔣÆd©6Ü!«GÖ+ç”t•ˆçL8œ=µ¨ì ÁÓÎÓ°t ›Ã¬ÖDS¬P›êïOúóꟛ=µ‘.‘§RÀ´Ìœf %­Om0$ã x T=ŒÃ±Ë‡gÀ(<,=·ébY zÐ0P sÜDªÌÎ ’ëç‡ù.ŒŒ‚ù¶‹–¨Ë(¢,‚Zõ ‡˜ ò]ßåM* å)-‰p f*Ê å$ÑÔ%0ˆöš¤ #²ž°'à0äœÖðN‚ÝAŒ`:U %Þ¤PöÐ%4f3>ªT×$16 ka¸NS>É¥ä\KB¨L…mP-ëkDJØKl½!’+dÁÈBÔ¥¹•æÊ`çüj¤T«ºÚ sS +x*cøo)CÐñ€’¥2çQ"°þŒÂj ÿOk€–X 6̈.u˜h@©à¢6 ²×¦²FÎ[``·'0¸°p 4Ì;äOpÎ×M‚Ûq•í­Í„”ðŽ¤ |Œ F/ƒ­BP,l ¶ŸÂ0H™Hcœ˜„‚‘À ¿=Æt@šRÍœm*kd»·,ƒÛF–u ¥LK † •[c‡Uë±=¸^ ïžÌtNØKötÈ9…+Æ c‚YNiBÁ8M¹• ÝÓj­ê›oūБn"¤‘S[n{¤À/¯a:4Ù©¤D€é­àT\ <ÛT÷ÿnÈú_ôÿv’âú_·ë,®ÿÅõ¿ ^ÿK»ßÿ‡^Œÿ×ÿºJË×ÿ‚ GÚ1š Æ?ø9rj|w” mx¿2ž¸£ú®åE{“aOõ®Ï õgE^;¸ñÞƒO/9ãÌè‰qø0(_ø†ƒdþkÙ«Þ³ù‹Þ">zcï…Ãó95ñ­“êò¿!ø/ÞÿÓIŠø¯[ü—Füñßã?zø/Y†ÿbüçNÒrüW>dÀÖÁÂ3€¯âTFÄ_oìT—ÿ Áñþ‡NRÄÝâ?ñ_ÄŒÿÈ9à¿”’:þ‹ú¿“´ÿù‘s¥5aáõÈià@@ám¶:›¯ËÀÛëó·ë‚Ã,Œ°– CœUŽ)ig^ʰ"ÌŠð+ƒĄ̃›¯J7Q8_¤n¤rUµ2Š…}s˜"œ$X1aUžpZƸxæÆÒ6¯òJâ·ŠJË©ÄÚKL’Nh¦™s¼O¿¹ùyÛKžØ@äçM/ù`[E2WÀu'""ÕÖ°T %„ÔkÅ…Ä­:¤ ¨ê}­RUõ»¶g›õLX¥˜6ZS阆Bª&1Nxíâ¦7žÃuÃR]ÿoþ§<êÿ.RÄÿÝâÿx÷{Äÿ›ŒÿÏúî÷Öïÿ¬éŒâþÿNÒrü¯Õ¸o²kM@ôv9dôž›>˜{îðÒÓÑ÷û†OuùßüíÿNRÄÝâ¿x÷{Ä›Šÿæ#úluÌjýŸ ìAÿ3ãÿw’ž¼°½Š‘×»<¼ß»ðäƒ>ºŸg„ç:ìõü`¨&;½ó“§ü(q}±Ä½;ý‰ÛŸ(ãz;½ãὑ:y*{s2̧žÒãáàîÄ=UþfŠ<£“^ÿ8DÊ3ÔèÅþñödx²Ó'÷óÌQÿÅ;ð«hú|¯o'wvz Ÿå¼ºÁSÈC8ÏÑʼÂ*Ûm3 G;9ɵæ\ |ðƒŠô`h^ZhMµ1á—v’‚ðìùŽË(Nä4cNÍÎÝÑà±wç‚x{pñäøÅw?LÙ¹P¥5Úgõg<¨PèÎLz§%}%­ðùŒ!½¥•d­¦ÓrEË æ–%§Eöûn`OMo[^¼Ì¹=-œ×Ü™º¼ùI’L?WŒ¸¬ms®œ(æƒíy“Cn1’•(ü—ç ïfAÓÊ#ÛÙéI˜‹.újðDïy7²êX=ÑHÚ=Ó÷9gJ’·ŒKeÚ’Evf£7ï„Óò4ïŸùø âöMæQûÁ\S,»ƒáØ-4£ÄÐ&’© Z§«Wþåb”rr¶f %üvö÷bÏïTsz¹&'ådÝÕcËå¤\°ÐkxZrÞ±—̤ÿ²[:&¦c0Ÿ[³_lVñ¾?˜¸?y<Ñ\ßWDöМÃ{§ç}ÞJôTÞ ¨Êk®îÛ +—/ïî5)åG÷åþåýÝE-^Âj7Osõp2•^l _ÝÎ)Øœ»;.¿¼çôKýÉô=|2«V³~Z[2§§ÝW‹²k?|{|GA÷ìô@úg?£µz =Ñ+þ¿˜¤ç(ïу‰;šNä™&k4QMáõò1YÎ/Æj2{1íjTŒ^ÀÇ0Z®«ÑKU%V|`ÖÈ@Ú¶WGý ·£áñ0iÛÎuy0T¿–ˆG*“3qTõÆÏsI!6~yA¬z«ª[¯\ܶ@àŽsbüD5Oå2¿TÊ{gÁ–;×AT+ØÏR£x’+œˆÝ×Ö+Y5wGãð¡“aŒòÑSK;f¥ FÓ½\OÖ÷#°ù§jljU}°Œ rÕé«—¤î¨2ç¿÷zë¿LI7pwooŸîó‚½E,IYó|´°ù§]9€öì€J¹SŒ“E 9ƒŸÝ;žŒ^)i‡íqÿUpóÉdÙÀNÜì7ƒã¡×ü±ðœ Óšƒy:ýFY-äŠ ÏéÛ½VÚÈ¥ªÔ ¦Öº‹Ð±½¾²Ð­yÙÃWŽôpPnȽb¨@¶-X9í)Šù®äK4×:½ºB6ê˜B²Ìð¤…Jl¢^$eœ*”V¯”“«¬'ætWÊd­V«„Árëo6…T8PízR¹w¨Z:ƒTùÐk¤y^®Èú5è›é‡sµÐ8p®<1¼£ŠÞ)CõÞYW'¿d:Y.Qw{÷A?«Aá+‚¶@§u±¯T[Ôº P¡}¶/òÖ„oŒ{:/\5ƒËÜšâ RâZéËý#ø ô`ýw]¼øäDéÛ*`ýप–ÌqÿNÕË:} cP¦ÂOÀ„ð9Ì13­Í—ÙisÑ<ó]¼Ó,ÛÙ4°¢§ªOû«à}™Ì²§bÖ¯çíìY’Êþ?èÈÛ` „Î;Ó:Ö­ÿ V;ÿÍyôÿu’~éæ§zð{ÃÐ|èàê•gáïGàçáïx3üù«¿¼ý9øë;O®~šþ]‡Ÿ¶~óSï€Ìž¹úìõ­­£ßØÚÿÊÖÖ¿ˆ­­_øÊÖÖ«oÙÚú›?ÜÚ"W¶¶¾ïå³ ŸßÚzà®\ºuÿ«ÿö±?ýÈ».=ò‹þÕïÙy럼éÉûozßÛ®}ù=_æ0¾ö–¯¿ý‘ý@ÂÉÛÆ_{þʇÙ×ÞsóÖ#õ¿{tó§?úýÿôéOÞ}èGÞÿ?öûÿú¿ÿõù©Ãþí}è3?ûõ¿ýŸoüüŸ}ã ÿý¡OüÚ?üï£/úÏþà'¯}ôïþã÷n]øöo{à?/ܼú¸üôzÇO}àÞ½û¹Ÿø¿¿óÖï~ó¾ôΟ9|âKïúø¿ïÂÇÿÚâ?xþGýgß Ÿ¸úC—?ÿ“?÷yûÏôÀc¿þ¥[ÞN¯?ü[7¯^øÈ_¾úì= tE¶£€08ˆÑm> N&=ßLH\M2 ‚†„ø€¡3ÓIFæÇ|òAå' h@V] (ž ²ÂJž¢ FE`5 øyŠèVuõ§º»z’ðØìó,“éLߺUuûÖ­û«ÛÛvmòýÃàç÷ ùñüÅf'ýÂþûo:œ¦{«´ÛðÆö­ô>W˜òÍÄ>]g2ÙúiÃî9Ϋu “tŸ÷Ë‘ÛÿnÙñîÚÝŸë4üi圦-X‡ï:aÒ}íýИµ?>ôûSßMÞöäÎc Ï=ðK}jŸ._EßÓÍs=¿àÆ ]þ7ûžÓ•Y=ë0ÿÄ_Žž™ÓpbE£×wø‹èànty7¾þËÆÎWeï­]×t¼æ–͇¯«Û;ë¹”±Æ'o»¥áÄ㣠®5û''LÝÚ£¤äÑÕ«ë:OÛ>ÞþÌð-Ÿ4-núa÷~óÔØ‹gí|øüÅ»íÏL]û÷_OžŸ|“nô [*Þ¹ç­UU òïv®Ë0ýßǬW>—ýƒË7t>]véß|þÕ¬:ÿi͸rþ«M>ù-üÇÉÿ_ª~„â;±WlĶî®;:I¼!¡GÞyM¶­®Ê+¿Æ’òþ§US’í¹¤îðî™oΘzô½ †ƒ›®;Y“47éo“æeï}|å‹ ¿˜ï}ú]ÇüW×Ýuô {ç¼EìœçRþ–5ÿDúãé/ìȽw_õ÷Ù¯·O?´)¿¤$º”5$½z榦-;Ê ë:õèóë&žl4ß»ðd±ËÔyFdñ ¦Ú?7œø0aÓ2ç˜]»«ÞËÙÖ¯`Ñùî£Güპ§~¦ŽÄê&6ÊéºÌÛû¿F§ÜùT:½wÊùœ½½ MMS—²½|kãnï˜P³°K·üÿ¡ÒMÿEžúËÙGsú¼–¯›éÊûÚæCXÿÝu‚þ·ô‰qßé.ƒþ÷5ÒÿV|¸}uïœ×|ü±nCÂÄú{[ñćÞÚ½<º [ÑÑ­yïÞºbØ’òN+ºŠÆæö›0ךš[˜ÓwÙ’ý%_?½aÏéw OÙqÝ«W-ݹ ò§s3cƒoÞ1§{n¿sLcèyû“Cëï{eÌÅ"ã’‹®çûÎ?píг£gö+èÚþáo²ƒ?öMõdìköj}æ½ñÿçìÅÚ…‹¾{èQföçá‚ߎÚ5é››NœâÝ_W,Ø7iú¢îECWxç¦ÌýË(ݧˣM[ÎL|åÐð5ûçZwLí8Ï”2÷ê¤éëšèÎí^Ûe&óBÑ;«¾?w¡|ûÑë?{ø­ÄvîÎO¯\^˜²¬èÅe÷­Ÿ¨»ï¥Mw^?s~NI óô€A‹|‡7M§ª+íÿÝðcmÉš’T¿Ôgü÷¯Õ7 6ìx_o·Â{èãâÔ¹W7ZŸbw?voÖ®_ºÁéüìÏ×&ý¼zìŒ!©Ýf›9ûñ¶}Í3NÖÜVR2õýýëûíÉ> 6ó᩹ÎBãè‚Nÿ0yé°UU¹³ƒºe§®ßhÈúûWãÏ%ÿ\ëß“yïšÅ‰]fÕ¡|ØÜ8å«ÏMéÔ­ïðâОn /GǨ{¯ì¶=çîj˜tºË™µ÷±ñD¿ƒÍLüºÌ“Á^îÍóO8¦nï¨_åšG.…¼õ*RS‚ü÷·±ü§Í»Zþ_ÑÿÚäCÿWë ü‡ÿÛî» ˆx]ûòœá9:ÝG?¼g”üÝ+š?*Z,‹V1aV—ã –²Tô±Œ§fÒÛl6¢‘Ì/5¤§—O˜0!{ÚÇìŸú6yöÏ¿þzûÂÒR]»1…†®7 |²¥Ã ÝÕuõ¯Ïžv,ÿŠ©Ù¦Âú¿ìÀfõ?‹Zÿ»’ÿ×6Ÿ6ñÿG²à¥‘·­9T˜8mÏÛ™¦áî ]=þQè¼1}é–í[nü$«ÇÐ完nËûõ‘‹¦ªŸqó‘¹³—9gìJYû»‚O¬®·VÔÚºåÙgû¸œŽüõÜ›ü'ý‡[Ölüøˆoóáö'ûÌ3]¸ÖôÊ×ßý~ë»Öɧ¶œžå³O©Ýý¹sðÒ™+½…=úÿžYÕÈEííêì7öÇ.ÖÔu[éMZ<4§ÑÚ©ï_ËOÑMxeLýÀÚ·W•¾üÓ†1k“êöî¤;I}3óα¯ë¨C§ìuw¯Z?¬ñë0£{FÇÍZÔ}Ɇž×ÖÎþô£ûmŸl0$μªo{c‡³ÙëG—Ôå¿ã8ùê5Ù¦»–VG×nH^¾è;ï€Úc#ÊΞýàìÅŽéÏ>))ÙøxÉ®ÄôÖ›¾ëµÿäc‡f^ûØ«M“>2w‹ýxþ⾯÷×wÝ·ù‡É7?ÂtJÚòláˆEë矸päTåO¿ûlŽóxCøµ §]8zû˜íG+};\Ï{k§é‡…¾kŸ£KÚòjŸ_Ê;¼QýìÙ:q^ùÆ^ùý—8}º8Ò¾ßl7!õ‘Ÿ¾¬yöð™³G— ­oØW<²ä†¢w¶÷¸¶ï-óf-½eÌÚ'u…ŸËX½Ú~ÝΔµ˽OïÈ\°øÍ3WélŸï¿ïýS/Bžº"½;Nþ{ÐIˆËŸù>ñå¿Ý”aRúÿ,vÓý¯M>部‘,ˆð0a•W\L•ÔGv8†‹0Ã$ eJ}¬òx+ Tü†aT=J$³Ò4e²†ªÓÍ0À^, FƒEN+èïî}¶Ô–;SA c+YŠaW˜ŒÜ=x²…KEÒã9(6º?жr‡„HÝ:Èݪ±è A_½rõbÎI…Y9$YŽž,—Ç‘‘kˢÄô(›Ý–‘ÛüÁ°Ÿñ‰Cà£ÆÆ .'I/Ësä²ÞõÄ$G½øN󄪰Ä#§e2PfðÏþYÁ?øg‡ÐB¢¡txk0®§h£-ÂÅã™0è˯l)h¤¥Á¶ J‘o!¤A¾ó« „ ‹pa.lÂ…»€Rä.ÐFÊ]Ã8´ž¨HsU~X?FÌõº¹$#D=póÒÊøø¹g/<¬;ƒ Á¢n Ý}†ŒüK¼ÁÊE—˜6,ã:ïy€¨ €Ø€ÇçÅn Ì(ƒõ cW"J‚0‹™0Ô†“n&Ä%)kÒ”Kò±å°ÊÂPä÷d@–¾çãó–Žq³(ý-šJ éQG™-Àî$.Y™”ÆS Ä&”„$¿\—ÅeÏäŠL äXòìÎŒ,žÑZÔOˆ‰V@ Éd^ž4cåW¾44ì (׆$°á›©âhJmø@ØL™ ª!Ùâdâð2#3¸Ò Ö0ëÁñZí[Ž%›‰)ªjtòT1†'‹6¯C†iÀžUf^žÙiÅ|÷Q< ~pz"Ó¶n.®{?` ‘<è+9ÉŒ´ Sõc0 Ë’¹£±;8üœÅfQ€‡'CnT€I ðÀî ±a†²¦Ù ÀA¸œ¡•£… @ǶPÈ?"`A>e3Únå@¹ÉBÑ÷ó4›E¦¢e¤øR¶ë±SMY$ÕÌ'¦…éÄŠ‡o ¤£&ä¶ž˜ ‡¡¾¥V[\Ñ€9r‰ˆ#ññ/ m0.ÖKA¶¾D%T½T‘ªÇÏqÊ)+§¼¶0‚â` ²(p½ƒ?b*Ø?Òé4ñ(ƒ‹&KŽ|üÁ¤¦byÀñà£aÈÓJv:à¦êñà’Z@h”ç€?"é˜ Å5f*È J} Ì¥'ªªm_¡µZ°•†´eÙŠ„OÑÌ)ï‚E”‹Vx@²X0êò‡¾h£Mf(n w GÛø[8˜‘x繓333exメ$Â3±já3Ä…¾ÊáKAf™;+ÏÉðWˆš`—ý)É,˦ÀݘžjàAZ@§ÐF`±&[­ÖÔTrpШ©O¤=£Þ nŠîPVî v"2 Wd)’1¶£ú¼‘¨úœ¶×¦ ǘ÷y1tŠ£îiÒ¹'Ø”S¾‡ˆ&¼ü$]ÅqèDY«“Ã7,l-l‡¸:#Ä%ßÐËWRÉÀˆ!(à ÓÒ„ïTÂ˜Ìøw¼Ðqð¶IÔcäh:‘Õ™d]5|mEFÜ.Íü`î7¾”áÒA•XÃkÀPÀÖg|‚4–M¡’ñÅØæ&oÀ„)': ý¬r°VoÒ©³± Øo1㌄D«Km†zýå @Å·NçWÒÀïõx|¬Ähijô#g'Ì¡¸!ÓzT*°@¬?0NÉ­'A€@¥Œ€) £6C­ãœhòBKîxdŒmøž ðx$ÞÉŒx6›“€Û¡šˆ›[4í‚KÜyXꇲÓVÚ¬‚*ãõŠ•ãrý¼=!B88¿½vp Û¸±‚a9˜ïU ö5f|òÁ›A—R‡L˜åÀ¡*+<>·Ü Fá3M—•Q2(ˆO„Âr ‘¦\€ÊPÀù‚å^·ªK'·'ÅÀSÇmW‚%•áÊqåf)Ì[^àa •ànPIRÊÌÕ%Î9ÉyœcCøËN𢥎+É©k±p;=y߀ëkEZjD'¡7ŠE±†¸/­²gâ 5½G"²–-ãüBpV@ŒF½RÐýâñ†y/n Kê@êcBÐD¸Šïƒr´Êռˆ¿ç@#·HK–Ɔ!(z©¸€¬wkŽ#/'‡G‚‰Ñ*V¹ìÐ )'‹ B1‚-\Lj^˜èaݾØ€˜$+õ*Ñ)kõ(c¬?Á¡¤¢arààŠuùÛ°.—yÈŸð%Xž²°ˆÑïü8 H;€™».‚ükà:‡•„[è/ìæHÖòÉ!į˜ô]!fü G(+¢\x˜C g}'NiQïÔ˜L¾Ð˜O í„Îm6›Hëb6Äpu UÞNR€Ñ™ŸouÑZnD’g/¾¤&¸ŒÂؘˆº-†Aœ¿2IxJÏ~Ü>pqîàqÊ·3•¬‹2^>ž nsuQH›»Ãz(Äã”P´OR¯à`£p°L”Ul%\ߪ¡Ç㢠=#v€©¼?nWòU†ŠâÈlq,!TløÄ¼¨L ÆÍjg‡ÜZã;´áüFŠK¢AšÛ(£ÈÍ7ˆ´>Ø*ðÖÀŠv<’”}½þPhÌñ¯ElA¦ pTs"ò’×3 ʆÂ2RžP ø«Ò(AOYb–0Lª <>c˜-ãŒG:@£RX€¾’éÌÔPt›‡ ‹‚M PäO;o¦Ûñª\ð#¬/³Íj·añ¢8ä’Gõùz&¡°’Ùf3PÒ´13•…BN(®XõãËPù3"(_A^šN#Ê s¾Ó… M â‚\ä!bÝÞ2`œ€§=ˆC ÏH¼Ôl¡(õ#ÕªC¥€"W¶âÇXæ|¬Ž7Êù±ág)[bîO8 eE)mHEÑ~ÈHxÅñ¥âR7n [TŸLX¬`c“/UO‹´ ~q!°–®Y2´æÊ¥ÈKWH¹RxÔZÔÅÂËVº%˱ü2-G¼>Ï7-XŽÍ„SÃÅ]„—À­Z”ø‚Aã!¬MØ8+ñV{+—fËhݪ|ò­+§µƒâÕvT€øúÅ«SÒÂÒ!«ùb]/hcøy'9Á‹)‚CMmŸƒâÌ­h?YšÍ°VH«Ä ‚Î,ƒi'²p‹,{I6«°[Âl´–´2²Õn–ór€ëhH08ä”B3Šá·¦ò·Ä~(i|b—”Œ ¶8ª…F@¸­è‹2¼Š¸L|ÄZ üoX‰^HÖHrca/0’lU’ÿà¨ÃgF‚‡ÉÇ”²q¼K(ÂCqäW箩¬V¬…PßVS}U´ÖälÎÁ+–È2‚õÁÆ÷óf˜Á®g"íUƒ±ÑfÉ´åZUP¨ªo³`|­^u@HÇï÷¤È‘Lßå!ŠÈ¡H§<àdÁ½©‚À´`áDä…9Päg/*¢²ø£l„¥˜0ËÙõÑ0ËR•^¶ŠòS H†Jábj©¨J—wæ­„îZÖ ŠÕ qiª–¢&Ò'¯­N)!U¦Ÿ4d/ªt4Ñ+-9¥í46-—ŠÈÂj•á4²X Gnäñ›Š˜]–‚$å@htÂ`ÝÕ¥ÌPb¯““ O'•5‚¾9|&ø3Pγ•q=­Yé5´c~÷ç~Œ´PYØÈVrõ'õ¤ÞãÄŒäxøØ¥ò±¦YÔg*¤‘Ð)ŠrÖ …Dáö‰–Ì–+!æù×ÎõñÿdÆž û_5[€úß?I¤Ç+U'ùÁ»8Gýļ¨ÕÄ“h‚4W½ÐEŠÿcîŠ40VÐ D½4ŽÐÖkKl½–¸ÖkÈj=á;)'Hˆ·!s޶›pú«O•r )w$¢ÈœǨ}À˜¼ò« < SRÍN›ÍîÀµy˜õ™€$c"”‚ϰ;2\טìС 7éÇeê•MÖ=–x'}®¤`Îb J¸IН‘ÃrSU¸÷59U—äÚ#·ou®­ºgu2¯¹y+Aé‡ç(³@*Hž-%gÉ1ðÕ„X.þŽÂÉWymqü¨Ygx³~Ž •l ÚI{IëÆ¦Zqð‡—yÑhš–À×Är˜¥Ñƨ<Ñ)Ï%Á›Fã„)$óN‹ÍÚ>ô¦u(T+ä¨ùf“Èüݘ²‹^Œ$Ühq0«ñ±–¾Gøÿ)lª8+:Œ€I¤ÌC‰±õx~1w΢²¼±ºöaQûRôØëäÀ&¯—Vx=6 ØòÄ/œÎù¦(vErß„®ã±®ž¬!Ri6|¦ž˜Oÿ ñm²#'7#ËB¤åjòã93ߊOYœ1ï}’ç ÒÊ©û¼pêÒñ‰4(ïy‡½ñ¸Ü-b’¡|ž¶8T+uÄ!ö2"Õ„ônž$»Ýž‘§œ ¼¢Ÿb¤$L rH(^¶¦uüY¯x£†¤A:¬y6g–âåÀa1·×ÃPw†À€ w²¶’1ˆ†»Yò²Ú—Í 1Zq#Ð":‡• ††’íŽs®SE7”¹š€xH !ÊYŽ/þ&(oál¢¹KÈ»ŠË) %ÃÈ·‘o;†ƒw’q–Q$æ맆 è=˜*[(“h ðÛ?ª,B ð Oï ±­V@‚~`f]D!®Ð@4ûßÞ‡£h¾3d&´dC¯h͆7ýSð™ËÒ°I‹â€3,W‡&O“Ã#Àâ[?<¾•2ˆ’ºhü•/0c#—ºQÅ„Œ»f¢ð´Õ…°^”»ð*°ìè/ Ü wXü zPÚV”åÁKc\ñpAïbƒP‡Fõ¤˜(•†cLP©yXZiò/g"ìàÂë3•U·ÅsŸtžð*-Ò´í€\.öiÛQÑ´•Äm;  „Q@þkk*äÑùRÿ€íÛ¶ mÁú«­m»Ï£ùù%N«ð™  É¡pð~é –Ã‡EN3ÖŒ°«ŽÐDPN;g¯Q2ä0^•OaâDÓNåzÀÈ'4,4&·°Mú;˜ÉTýŒ"èDòZ²@6/èþÉÞ“€C¹¶=“-KQ„tCÙ×1ÃØ²$‘%ÊÒFÖÁ#c+d)R'm*K%uÙ²&¢²gKJéØJ(Ç|fÁ˜yß9þÿ|—çºÆŒ÷}ö{y–{Ã7;[¹' é8W;Tþ/Õ>ÃBg»ì×BŸ«VáïÕJXŒl=‘¶ó$ ßóÕ+h¯y3„«nü L– 2h/§éUÝy YÝ0öKÍꀲ]jV’“¨Ù-   ô4ÚøBt&-‘~ì§÷+$SY &Í—ÙÂ8›yžb×ÌV¦(‡ ×?&;ìÌ>#ë0 7e`f2Ρ¢Ôý’!3@q2 m¯y7Qsv01´6Ô³«#|›Ò6­o\·*é tthÞ‡"H7…¤å¬QÊžgÎðó}óYKÎêÉQl“$6räVÁø¡»¢/–HAîì|݉îæ‚YC0öžÓ pº1üDŒ¦™ ÒºÄkY¨ŒülüÅ­H[ oˆét‰™óeDF2  ¾¢È xšçÙmfÎ0 å/"‘¤º„™Ð6O$’йy܈– 7‘£p@í ß“}+àÕBZ='5R¹!§QÆ Ø •*ß|‰ е© ÈÓ*0ë.²ŒV ­6à´JÀgõ9QîÎÓp𲦧- zH‚Ø4=LöRñàÿµørÜó.Œ©LAfƒ|’•rº1[½—'á\‡÷nç h2ïo(åqx 54ÚÕ åñDâmÉ „† ÜÑDC3/¯y –Faà~nô@û"=ÍPO 3t@:Úz»ÒV¯£íµƒš=q„R›N2f$}Tç›yÎÜ*áY6©ád‰_ŽhG„ßþƸyôuNáKàqþßü‚¿šíM=¢¹ÅåfÄÕÈH!Žub ŸŽé«|>ñ®î5a<ÚÚbõýÊ„£SošÈqP0Ó±Õ ö“¸N-nÐY9Þ„“º·†>DgZ¿9\YzŒ „6€cÑB#-lžqš}MSkJVÅ ÍWºðåEgh5ÁŸíSêQZ zä1t°O.k½¥³k“ìîSe‹(Þ Q±^ŒRáxÔEƒ¯Š Ã-W¤^žN«x2±‹³ºA]÷S½î3ö[1ÛÔF^Ÿùå·D‰oþ³Ã×âÊ…èìâe ñZ§l.2ç>¾[¥hpx°ÅÙðí]yåÝëﵬ>é$WôÅÁÝ<ÙÅ!Öœ^QÜn¼Iï¼l@!;ä…ýêK6^ÞF«C!5 ¹’Y³/—¡†ÕWóëVîâ‘Ý,P-1wz˜"ĦÚ=¦t×_¼ëôðîšKÁ­nq¯÷¯²uY8þEîhÐ[9hì™v?i…ê&$±á7 }Žä#™ç~M4f‡ŒŠ„3ßú-œ¹|ðõ‡®÷ƒ¦ üø.õ¡MWtKØAB›}êûB÷yç7å¶„ö–ø¹è«¥íf>qßuƒ§ëó+îNGkÿÙ7fQcu Ý Gï=_lưuŠ4µŽç :¹áÌEºHcć–ý¿7‘â¿ÛÿCWÿ„´ÿ‡MöçóyÅåýÿÏIKáÿ™3ûÿgÆœn\ƒâQmÂì òô6"„+8ì]º¤joèáfÙ§ßhÐ߆ Å…ôå+³.áÕ)×Ñ×Ú¿ïˆ@çç"uëO„EÅñyᛀIø|–3Ú|o•‡hÇZQ~,«—€Æ'½>yºÏâÏ3aë æqæñ[.;çë=.ç!.Å2vqp—¸;Ý,sS—*=Üià!P/?l¢ÑP"¥þ²êQ:UºPWãågÈ;òê#ÂèWÃlãÜð½-‚krÆo•š2Mä—ç™Zn–3êñåÙݾ__kS—½òÅ&ÿMU°v©Œw㠲ʌ‡¾hâ[ÒLWïßáol®Wy1³ÓT¬)—=+)ñT³¸¤GŸç—®ÏŽê/ods–¹Úò˜F˜Ÿ<Êuþ‰–@qd®ªËšüÖ‰‘OµúU6·ÓŠ+¢ì¹xS§îœ5mi³\¿}Ä}Bõü¾c«%!ïXÃôÍe›úAÒ£]I_ó„ÝT@§˜¾.–{ÔÛ}|usÓ‹^Ô ƒó)è¹Xósº1\æÐ!·¨‡¼Ö†öTkÅφì_œGr6ºltåãT5(<Ã^t/WuÊ÷B„BÙhýÑçÉy‘ïóe¡°«I°m&âQa“ sÈŠ­å/ZY;³¹$îE"7Û‹/uCñwòŠvíèÉÐúàjÝõÉŸŸ²BM¾øp!®ÛÎßM9\Ñ\ªqñÌsæ©°Áë½­JÖàÖÐcež÷Çåʬ;­pÞ´=Ð5yxêòÛíj#v¡·zbw™¿@Ô¼(ß驿~ÛYG¤­Í®4Vi“µ—If¯Qй‡º'}ù“Û%áýÐ’ÝÈz3œg8ô¼øã¤¸¸J‰–¦üǽnÒ_’S‡¤ù­œüfäVŠ5DáËúcÂ\W]ŠÀáß¹„øÎ°éf>«1ŒÝi3ùdÞ©°£[¼—?P|e¦*¤Xz÷¶ØáxÄ™éü‚u®eZ7„º^÷G#V8<‰¯oõÒ<}åͶÒÛ:ò4‘N9e¨ Û†J†g‹,íŽ öíD#V#T²ù¿¤Ô5J¤òaÄÞ¼lW¨çŸý¨‡Ò­M%M‹ÁôÄen’X#ýDî°zAúgûÏ:èE:^Z½à¢ý‚¯°½¯à2³´–€eïædS¶¾žeÐ\!zfñѹ™=•­ëøN† — ÓvLSƒüç¿3ê8þü¢Á/¢ñwëUÕïŸÿPÃO<ÿõ{ÊOâ?ô™Ît8þkLy ½¹Œîÿ Ç g™¦.ßG¸4mæÜ5î qË·a¨FZrõ…¶=£Ò¦>ËÐX˜Þ-òÌjøþ‚ìIW*I©Çˆhƒ>²»®q;µÛyÅGÒÁ¶«v_ÆñåÍ"eNºà²÷fˆ•ÿvWú¯,°ÿÿ²Oþ¹åo÷ÿ´~ô͉ÏÿKù‰ÿ @ÿÜü/q*ô0¨ÉHþwK /Äÿ¨æ|¡¡xÒµxªv2EFâŒNxÄG 9Ù›ÍW¾j«œ¾]¶Q¥Ü@õ¦k™7Ý«r>êú¤sêB¤êœËòÉ ?ÿT`ÿÿeO~rËßÎÿøïŸÿQS›XÿýžòOüßjÄÿý„d¦o©Xê+Y¤©uÓ*Äiäð¥%Üü4Ôùqö$£—¾‘ˆ³ª1ñ›–/¾åqè†m–0Noê{*®0EdJ :…e3gÖt‡kEí‰@ðïÞóëB½] ð7þ¯¥ªùƒÿkâ'öÿKù‰ÿû€ÿE°ÿÏÐÛV‹@ˆ„<ÿN*óŽVã\"l'{rÖÛÙò÷÷4Š\zð¼iuõjbˆÕ1RÑ “Å[ëë“O阞/%?¤Ç#š?^?½¨å؃WÚ‘Íïïæ}è#f6_.‰Ê,èíŽjlþЭãžÚy!ú­££ã$£…ˆgü¦‘ˆÓ|ˆëûO×T§#ôg: Ze%oˆaƒ{]½|1+Ô1mF‡N×bõ›Øš£¾òë+!O&!†ˆú*ÆMƒa“¶˜ÙN› ô‡ˆ:’ŒÔuáGh¬aHCˆ²[N t#n¢¤Mw܋ל ÁÕêr`–ú”½=yFÈ»©¹Ò­…9=S¬:$Ñ:×,ìvµ|ž„\”¾,s¥]òÖ÷ähÝæ©Býò¡Öë×i½Í*·æ+¸wgÂhR–“/õ£KÐÌ’gÙŠÉÒ3> b§Š¼\P+QòrµE`æ -Óåë¯òºUÔh¸Å*Ó¶ðvlœ–ƒ³«¦a×” ŽaãE›Zôýœ‹VVä¡/†ž­« ²Å'ˆÅ‰¼tD-ÙÁ»\@ÓZ3³ûhuš¹íLEÖ%wT&kGÒÆå*e-÷{øb§ ÙÈíÞ4èfûH¨«fÚ´hIiDRZüm …‘ý×gFEÌA¬i ‰Ò;äg˜Ú²±,Ñ0õix=.NvÐÙ6v»{·1üÙ[|Vi·ÓLÇ3×Bæ%‰ô.}°¡®©•£;¸às.òC¹¼Õ´ÓMK„RZ7"©œ o[’S‡ôí®3ëj_Ô³^b_Þò=ÞG°w6仪ÏÉÛ#¸WMų Ð=Yv09“èù4䮢NFõ€xä˶ئ¹~@G=|ڨǴ]v»¨Æùƾ´Ýx=ýS'‚߫ڞmêͱÆ]ò©n%Vñùÿ<­±EbKqó5Y crÛ‘‹b†ÌþÉ~¡êÞ~¦§ªeŸ[Oš÷ÿ/r±WÝcQ²¶.½ÕÞÀXzOI7¤Våªú"y÷NbëëöC=­:q×7’NGÄ61ˋʪ¬LJYêýÝH¶heÑq€wÛÃg"w)0¶ÛŸZ=oN‚EÎ{ÏsYÒ=î=9¡¢Æˆ5B׺gïÔÝ0Ù-}³)VjpËñý„p»c§OOo¼´‘Tl×Lþðzú½ÎIGÙï½p÷†úå)÷Äš¼ãÙ·=ô,ó:ÖTˆ?8ø>%œÝŒsêœÝdÕ!~èžùìÂóxlê¢Ó[H•û¶.®ôÇJ+’Œž†ŒnÀ xûÅÙu·ø›ûSÿ}Þ”1?'ã|ØÜ÷_ßÙ#*ï*jïúœ¿õ\ì½9AY-謜ð)Ò LÍõ ·Õu÷9a†Šü§s?E®¨8–zyí×Ɇü¡'Ú2nV‰M[Ø^uåí£Ë75®øƒüǪwöÑ_3]ö´¿Õ€ù}ÛŒƒq‚CíÓR¥òvøÞ“[МÄo$õÕmÓqÁ¸¦…7Ýà Ï6·½óu{JÁäi~¢Áò%'hI[Ž—Ý=#cB(õ–ìDúëÝA®t»oÐ:žùe†»”°Da<ã^©¼²ºâ*âµ gBWbÒ,ÉzÎ!yT÷í][glÛ¯–ôa“½lD[…üäS¬ái´¢Çë†ÂwÝ/uS#B“šÕ©QÙöûì ûZ·Ê N>'Ó’¥Åo5ÅíZDRúÃVÝ—+ã¦ukVݦa´‡;l´^v«²áŠäýŒ‚¢ï¶:t2«$_{"Z‹ :|EßÛ%ëø¼ªhÔ[Ù7ŸHÝZqèø~Æ’)uI = *ž&U‡éÕ™VÚ®U¾›¢æœhµ:Bñ†üîrvÇ—œŽ¥ÑyõΖ±',ÉZ®¢df^¾o}¶ÃyÙd?¨@ÙΫÐz§c–2m¬ŽÇmÙ¸W‚Î]ÅÂÏ_è9Ùd =.Œ« =—§Óv;ÿ*ÂѲY‚Ù4ûî1ÍW–½6Mg¬´ÚWeÞÐ]—KE:&ߢfÙo0¥mµº@²6tßã_ñˆ3üÈ麳§Ä ´Læ#²ý+SìºãC×ßÎ뉔·(¼c¶¾üXKEÓÐÃM;î\n›ñ^µR\+®úUýåkÍD—÷ObúPL~¬û^ÝIå+dê+|ëw×V5®ŽHt2”VZðÜhŸRY†²¼Só\Ä~ç…'â«V[-ϹÔÐ7e¶«Ý§¾Rû>¯¯Ü}Ù¹5H¸îMyUZ—MuõjÓüè£>Ö®©éÉZÕ;k©ffKß§Ü´vfÿÍcyÚŸz–øÔtŠW°.q¬mEû3å†5:ŸÝïÂïK—‘DèÏØ®kp¢¸˜-6ý¬èNŽ)¥/;Ó¯)/Sus}”zÎÆ»ïªÀsbÓóRNe˜ìr]˜³ðj2ÝÑúêëêó¡ÃAó 3¢µ6Kù‰ 2­p¬ cŸÄ}×t¨¡RYñÃ=êmüˆìõvv/ºž¬n6|ûÖåÐ)zÛûÍó°SÂ5½ }å;>ÎȽú.CÌ{ó‚¥?÷ÔÇ”¾øRÑUÓ×ù`qä1ân÷ƒÍ…èîmî‡MÓÞ|úXsád’U'aŽ¡¬jŠòéL¾ƒÉI!ÏIÁõª•NWt²òsè-abK‚oè¯Û»Èö‚Ü|&ëüü×'¶ïWËòˆ'eo~§VÏ*ÛÞå{\m¯ÀK—[Ê"9ɬaÁE,•‚%‘˜bcg[ù†c÷_ÙÉ`TJ‰K”×uÊãW)¸Å͈ßî˜O^|òìéÙb·›7JUp9˜b™.¹8DNçZL³Þ ʨ½7Z¥VˆÉw‚ÕZ/qî¸øîÛŠº÷~­¬f­¡œfwÝøÐ±upïð ÆºûŒƒ’'–íLJŽæ\2ì™é9?÷pŠ­”½mžQîÑS ųïû;)'•gZ¡¾¶»¸‰gȺF/\ðÖÿ“cmƒ¯_~wUŒÀ=õOûý×ôĨ³ËH…iO‚N_uxtö™ÎÙ­÷êi“#òxœ¼¬òh×ÃÙ¶‡¢•™ë‡Q¯ï2jˆmœ»¶¸÷òTd|a*kÆpN‡?‚ÿ ó½‰Á¦m¹ée3>³ß,ÿ<$ËH›üIm½Ëò8yÑÐhÃÀ©%Kå½¼Nò'ìÒ^ZîÜdŒ‹'$cKVg¶'´qÞ™nžÒi›º,'â¬Î´ðzDè'™(ÄÑ› {ÜÐe¥þ ÖÎe¡³ ç:„3¦!>_¢”[´..Ù´{—OÙÞêvetý¶¼+±}G53XåS‚¤´QzÕ¬•ñݯ§¼¬î²8÷ða|¸ÈdYQOo 9’aVKÚè·%äâЗ)!2óÄ<óÒ|l_O®Í9ù|s SV‘BHÝÄ$eædvï"i89“†íœZv•D–zV.Ž«¸uò:®.\°ÿ̥ؔǚۖîîDïpKYƒ©i‰ÈW?hY™”ã™}aÚëmû wžéêöK]ùdRj§^çòÈácßÔ'µwk¦ë†¯G–<¯»Ÿ^:]1oçëGu(ãõ³ï;Šì5¾\#jn¶¡OàéÁžù:ˆ‡´RµÇg,•ñ#…+k>/ÌÕðòs9ÑúÙ‚dз“+º:§5ªïÓÙw ö¿Ð@ 'ذӲžÔÎIÏYé…“n¢§lÒô=P¬01dú1üËÓÆ£âŽëÖíí6vÒiõ[Ÿ,¥ñja»µM©tóp•Kœ¦ý4_‘müj«Ý½é…ë}|‰î×¢SÂùjdZÖЛ¤îëa´×ŸKß¹?·½)ocö7UIžwJDŽgÇ/TĉwµmÞùµÙ¤W:§oè)ñªóç%Ï*ÝÕýÒÑÚbT!~¨~ïÎaw‘ Ûì7„7Köç®@ ìqë—<ÕÌh2Û€xV¾!-ãé±7¥bé«Ü«ô>M}S±+µYšX\”·÷jÈ`jÃìC± zmWinxp»P*Wå‹gð¹ÏÖU¹~6ÑÖtZò¥äT–æEµIog9<[´XbETà"é!¶Þ±¡ûñeI>Љ-_–&ònÏõ®¾ÜœzöN£v8ª£´hšÙ§-ÌÁúb‡†z{+¸$Õ6–g/*píní-Ù)œ¢ù¡÷uÇíþ©ñ)+º ˜aß°xÿLY™„¡É1†RW ŽÝiŸþÂ*_ ñÅð&­#º#W1¯„°Aò˜âKòrË)/5Ñåm·”GE75€VqîÖ_föKNuœŽ<þZ«Nìýßî翼ÓÒ~¿{þGUý‡ý¼ÚÄç¿¿¥üdÿg:ø—†÷fÇx#“}Gö:¬ìWÌ‹.Ëo+ðã„ô–Õí³ª¼Ò®8 j¼\xÀE^àÂ]¤5«ŠÊ:zT%êMŠútTÖ<¯Ët÷J„W 8Íé?ÕÞ`Þe{jåç6÷YÔ¡3ou-8Òüõpø‘®A¾å®­oVeŠ-Û3³Xí"fr^ï²Í…œý%XÛ‡ÃíÓ‚¯ë“ÖFm `–ˆÖ% ÛzíÃV1[N )î:>}Ax{¸þc«EWW”[éĸ'ö¦· oÁlVjLí~ kôIùŽâ}äœyïí8(¾aK¡ê ÿXWt@í‡#“E»œ‰#íè¯9·iÆbSZòŠÁÀþèÖ6¸?6ò¨Ú‰’›fÌ4l›¬¹þ-–S:ÃôEyƒt³bãöÃÔjE±Ú^G8-B,×n¿›Ny[žxæ€Ôö0±­Û ñ4á÷¿¯Œú¿Ï¿øý¿~ÿ ø¿ê„ÿÿŽò'þ/û?¶Ý‚ýý§[䬢JÝ‹*·:Þ ô^%˜$ÙïÎ.Ï>99®©ùÙî~Ãâ‡S¶Yv~u›pãÿ‚û?tÆø/\þíü¯9áÿÿVùÿ—ƒý¿dn‰+x ™ÿ'‰ÜÂ#Œ*Š g'&ÄNŸm²les¾n_0ÍõðCÒMò•H•R/º‡bÎz•7µE'ú”X„Üv¬¹¨’ÿâVÙSôýUÎmûª2¼$IÂqðåê—ã¼Ï¥ZHí1mê#á;·,­3Áoÿº±³í¹JZòâ¤fÎ&«ñä”QÿÿçÿŸø?AkâùŸßRþÿ?|KxƒÑ,3ïWüÝk´š®»ÄlðÙf.6i…sí£}µëµÃ¯l³hŠîŠïŠðÓI­Cm´2 ˆ²q(_Ö½mÁµDªD].MoåÕ8ù­bµU±GüZ›®NÖ²w\jmö°%SJwÊMÕ³Ú¥˜òø°cÔ×I'·H{ø¹@¬Nøÿ/(£þOùý_ã‡ïÿ4'üÿ·”âÿ#óÿCáBü,ÓçÝ"sW.XŠû£5ažÐ½] õ¶`ÖÏ7Ãßùõ³ºëæëM‹üv­šnT›º¿‹Ïþ,“Ð"BZ²a¦$Óæj‚«O#>«èº¸"J;Ï"~ÛY‚¾Ì¾A§÷ë]|0º7ž=Tù$.•®y§¡âpÂíeõò¿èÿª„ý"ÿÿ-åŸøÿê‘ù?_x3~ÖÆbJÇçÌQ×'Lå_(<¸Ë4ÂrQÖË’¾Ô[6[ú]œÓÏwèæQéĨµ¨o'½|c¶uuíöªŽ*»òý©Í²ó‡f åM¦²o]ŸøÉ¯pŸÿerhTèàOníÿ½‘ÿÿk~øþÏÄù/¿«x1aÅ#YÞÞ Ú*è˜5:ƒŠfЙ¾v”µ蘷` " ™CC‘r£ 8r` ­@÷TÀèqAFXƒ d” .J ʼêQ0Þái߃ñªGÁÙtooû{0^õQ6•(‡æÕŽ0*aºÍË£sÐ #çÈ)`ˆDb ;ˆ†áà6ãC÷¤¡1ðAk<®qV¯jüØ==—0È€’ûå9 ŽMócÓxµÐWji\É@ý~¼à8Ahcz£ñð=ƒÆôôQÖÆ()Œ})Ɖ¤18´o¹ÇÚ·ã0ŽÛoXexl ÿ;n xÀîÈwˆyÌ "Ù´À 6éElÃgŽšZ¿'9f0ùÓ8hØÀ ƒ,„AÃyÒÙ ±€ãF¨þf´`´yÑ4ö˜RuyõcãâV|KkèÖ ‰f@¯ÍLõAtFóÌ6<°Ì@:G÷ÄÁ'è¡<@‡¡èÒy&L÷óVPí1*K5 f –̃%³Ù 6Cæ_‰€=ó›þ­ªéÀR¼ Í á«Ÿh~‚§|PÈ8hR@+ÈËêhjâõÆ€a†0ãÍnÄ,avˆÄÄ— ä8Êßó3ÂçÏ8ÒÐþg…2Î1àc#áëïLñg–bÿ8>šîɵ t’Ê S}Á(جA®æ¨Alè¬í•¬ž A“‡‚è§'ÈíGf0 x’{èÏÑÀÄqØpLÚº@c d£¸¸`8(3i!È•4o³uþh÷zJ $’§’‡œ‰¢ƒ€4‹ÉE²˜4&(`Ö\Éeâ|Ä'Ç;ÌH$±f˜(àЃ•ÀeÇ‹ÎæB(€8ÏŸ‘!4$Œs™…©…íRA®ÑRs¸/°¢¿ ð 6ÍŸA¦ÒÐIWHøÌ+$% Ÿ{Ç»C‘Â) 7jó¨oc2j|è3 Æ9Ãߢ†zÿÔSÆ«åJ÷t'BÆ‚‚Œå†uHH°¶!K… h ޹ÔÎÓ‰ý2;'®R¾íxaÙŽ“ôo투~"ÜѦïÄËú,Üqñ§–Åùδ8\@2…µ16þ{þ8ÿaôßÿŸÚÕŸ`þK³c•€, «ìçO"í÷¡Ö‚{Îíh¬¡é™ã„‹ã…UÞôêçý=€‡ ‚6Ž!…Qp¸Àà òûl0ìÿ<¶À]¨ÐôÅ;œW«,<"§ˆý‡¹ß·sÚϨÁ©‹2hQàzqàErµ‚¤’Áâ…ƒ\äç¤3¡P bøºÿœ³ó¼ÿÕÑÃåÿA×ÿk‚h`íð –þpùËõ¿ºš†¦úûÿjø‰ßÿø-EEQF©ˆ\»²¤%9˜lO!:iM§°¡µ|0§…#@0>þº*#ÆBeù©€Z¨a Ë?”;Õ©â ,Ò’åÃi)‡î µš‘HæÒ˜PÖÄô䥾6H0%.]n\D ͪ#pÜYlo^3®“Êò‘ÍžVnk9ãzqີœFàÒð`ÊZËBš³Sdh‚ÀV‚L—ü§X¤‰½)Ifz [c#˜Út‘6`¶¬`¤*üéºx5˜R¯Ç8Á±Ä˜BÁZcÂá%_0‘BÁy²¨AP†¥A·Lr0Ý› –¡X ºg°¨0‹zðV q\‚ ã ˜Ç0ã±&œ—uCKŠ9΋ æF0µÂXŠ)&Kq„s5¥,ƒnä@ –âLTqG꺺Ëê»)¢õ]I!$'7%Œ«»›¢\„,ªQvSÄÈaT°¢ ɼ[€^$ޏ25%9pe êôѤ% ‰£HR14hõI*$‚Æj·í®$7¬nx$‰pƒ*'ЙQG‘H$Š“èäŠWÖ!+{+›»…«GbT¼±”åD”«;Å$±ÝQÐŒo7D0ƒŒeC° ˜H8’§"ÆÂI3ssU¬C-C‹%Q4¸GèF`1,`Ó£µ„‚–Å—ˆqE’TÜ QãÜ” !¯M`d“¡.8Å`®ùb ¿‡[àü8t'Œ«´‡*Yatƒ×ÝÉÖ\a)&De´+Y9Ì-¸F…rÂRöã(‡?Ñ6šBPBl-åèø[  iz5‘„ƒ"˜±7lb«°”%X–bM´£¬¥QqþlV +0ÔŸºÚÃS?–²ôÇF2Ç.„¹:*ŽŒ&ŒhÌf“CÇAøq|°«ê9ëb)vD.öñÙt?,%ø‡ ù¥­³óÂRÖÃ#õ`&‚×Qb8ÈbAšmÖèṞ}ë~#u,EçªXŠlùšzt/´ ?ê в4ÔQð8&Ë“æPcÂáµ*¼Í¶.ݸâ݈¼\ÏM‡ˆ½0€¼Eay†¢äåe(êòòä`tû>r°ÞJ/„h0K>Ë É¥ÇÍÔP˜pî¨>d¶q å¨(}ÀÈX¸ÉäàVn+·Î€DEQ%ºB¾ƒÒƒÞÝ"¡¼ª¦8ãhëhT€UU^¼¸Ü""ÀH1\êÐ=@¢N¤¨ƒDL¬L*̧¹!EŒV—¢®GÑ$¢)êà–J4¶)/êEDPÔuÉÁ= H1%é ²nèÍäàËd:“k•h˜*+!•MØŒ»Gz@|¸qmÎmqT°"ᙜ¸óÆzS4Þ;’B€ŒNÌÙdo¨ôuãÁˆ€,:@nàAþΤAµ^¼>Ýñ78xmd ¬ÉS-èäGc{ÓàÝ*,$e.y ÈD¼i<îLB-䡆0bB4FÀèãáJ×q$•(ÀûàJp°BQÚ>Lõ‡ÄF5Èðxñ’øƒ‚¸©ƒ'ä€a8²¿?Ü©BóÏjGŒ™WIQa›Ìu\±¨^Gn`jPp‚LE¤1~£N%ô7·†($ ¨F:f:jÕ…C)QÔ”Phð†WBaP‘£ÚWÄBÛþß gœì͹Ÿ p]nŠÄ¦ø­ª ÀF±6R(–@[0pXïEXZÀwÝðD¥1Oƒƒ¼2«gx…€t¿¹(1cáÍŠ?3>Zâ“AþKeŒ÷Ï€Fm Œ•«{Xd¶7Ê9, F€ÂŽXóXn-‹ÎD£°( ãGöÿ©mOrF.‘1pÕñI.äÁp„W…õ¡Š‰„ðÓ˜ž:ˆQsŒˆøÁÐ!¿â9‰.% Ëa±u]ÝpÐ;ú Èº…¯x™ œ\ËMàJ¨ Ø4`ƒ{?ró}…øæ&æšXŠŠú#"9""äpêDÈCÇx®¥h¹Ÿ±K 4¸‰ ,e˜iƒØ®÷ VŒU`UŸQh€À‰bÁ‚s˜oƒ¯äð ‹qS´¡Ø¥••)ê‘^@~«>E ¼*)Áóš¢3Ž2EÝ #Ç.L8MQ…6¥(:°áS4Àäêg:ð6â.Ä´„?£=¦y0<%Å™×òŠ6 š½#FR8yFXŸêÀ3ƒëN«q4À¨}Âcºr&£Q<_f§fâ?Úú‚èJš@¬–h— ú--2 ‚wjA3Ï2…^Ü?iÞÆû~Zµ qÑßQK1¦Y·ÏWÉL£"ôS³®€—Û9WNªº‡yÂ[_=§=j $¬Îå¥~€Ý 4¢·16·iõˆ`² x*´ÖK{`S·ñm§ `ß0cjð^?Æ#|ѹ½kÅýØûÙ"ðÇ@^¶pÈš='þŒÂ´·õþí&[tê¸á(H04*šQ¿µ™«î¸ªo좈úš¾â.Í3Î’>ëáœ@i_ažÜjn7>k: rTûÝÂrÑ·ŠYghrA7Šˆ"d!”2EªÁóñE·Ój¡¼{:LãžáP¸m6µ“C¼ˆEÄ‘H?dŽeVy¡‘:Ö¤>Ät†s˜»/Ocdö¶®;¨·<›lë̶ۼ˜Ùؼ®¿KƒŒÐ‹w` {ù/^Àä‘hÑÈ€%…îžg4Yp'æ#EJ¦ò’¨âX,À³Þx¾óÎþÈÐìÀƒ±«‡÷—^²O ÊœrÓ ‘²m Ìubso030Zîfoûö®ÿ0µLE¦‰Ü&5–ìNq1€Ý€ÃévAq¶­·­¨õÛÆ—¼»´ù¯ß¿›BÐÌŒ*EztÂðèíªF‹åQ$êƒ?rÔ‡»Tk ÞåúqrcšŽ>Þÿn-åù0 iýü:®^ïE'¦O:CÞ÷ÓD hIÒÞ~NH³‘¢IsY†Ïo\¸äÅ’]Q`åEbe¤Å;Õ%iùAœçÕíܪ“@‡2L~tÛòŒ†?®Aoƒø³pÞÛ&`£^粟ƒÁ@Ã6™«c.@3¸Í B„ 8H }‹Ä&LX‰E;•ÄvmKeÐÛx8©_½¤™öhÈ]Z"OY*}O¬®.t¬y´;;›¼tÚêDõÖ6|4ƒqÐx«ö6—õ:|¿`#Ë"²,g^Œ8í\ÎID,”ϲ}p£o¡6sŠ2àò5ðn{Y€6‚èÄÇÁ7b\„¹B]1§ª g©\]*rX…¤z5!+.¯«ˆœ{YúhQ³ìÈè bp9ìE>[%Í{Z)&XV Ü‹gQñ;‚–˜&?E@:o”òD³âË•é/7Ÿó­á[çtÏ$½£L‚¿þÆ ô÷K笢åÑÌŠÖôÜSŽÞWŸ¥QžU4ašc‘eQI8¢LÑ4O6Xi_hã_~Ô ‡*èÆWñèÎKPÇEVÃhç┆ í£Ül'gR œÉTD‚fíj÷¥Ú)¸&±­XŠ/ Õ·õþ5ˆí£4)' f9*–™JBµ—ÐATñPÁ;%Z—³(ÀÊÅA+¶Öí ÎÄ2˜…a*dj¨»Fª£F¹øµé‹4Êe¬½‚šëhñî× ó’&ë½/P"˜RÔùþÎ@烧Êþ‹û¥~ìÐL¦bNkP¿¸ˆ{=¬Ö˜&Ò%ܪ¢Œœì“ºf <Ö]¤][#n…{`¼m3Ôsã+6ÇBôFNh)\ˆVêJ¢Î1 ºâ›s¤š¨UQ´WÑ2ÁR*˜B©ªÉWA“/«†XxöôÂT¹f*–#N«'‰ÁEs‚´ï#‡Â>ò÷õ·Èº¢á[ `¡âF”Ô=È%jâ#ûáƒýPT÷¬iR6Ôûhàæù/ñœ[®ñ8w†ÀDí$%¢çrÿ%%,)xÀ²õî#{vÚÒ/*è-¹ c @/'F'†’N î`-îÝïu–Œr•P «á‚¥~ÅrâÓ±YKÚÃ,j!’Ë€û¨búÍ KjBK°‰ M'Ó‰2äqñÐðˆZIJ9lîu¨i¢žVç¶ò +úŒ ªbÑnµO“‰_QwÞk{Sïݦ˜©Ñ¢Rа*–Œ§XñÄuÁKy~dAÎ÷Îø(¦ø–äÜ;gØ9ÅGäpFÓÑgÆ£s2T¾ áßg¦øœvæ]N )„:òsÂ*9UA 2¬ör½úe½Û¤¦¨²ÈÞ·Q­€B<¦œ}ëáóy&_Aóýø[~m…¬ä«ÌS¢Å6%ZØþ ¥šÒ•ú“¹Z3§Ÿ¨QÁÿ‚†Íêv21°=L› uÖ·* %Ê¿ÏhÏÒ^+¾¤¬dQ€[9 Š N'VßFí zª—ТCès:Š0륳ø<ÄëŽa*q |¢EQžu4Dfd¯/4| u£!!ìÁY| ϶tçƒId4¯–ñ̵a4¬¦¡gøl<þŒ…>.>€ÄþlÒ¿£ z¢A=Q ÍœL;;2ƒÝ z€üíÑí.Žö5ž5ÜÝ—Ñkø—†»/΢] ú{a$2Â>Ÿ=£/„ŠÛXnd³=G@åÚ0wßnþ¸Q-°…Æ:ø |»! à>A¬ÖÈaÄxe°"Xbµ4”P(ízT £Áx ht€¤ò1„Æe^̦m²¬½Œ¡¦âï7΢ڹb;¨?%êAÝa®×ïܽoïˆè7’~X„nõåV´¡§‰šsQ¯C›F“1 á©wݼì#úß2*~@eHyGhÛa‰¸#eÉý•Íp¤•ü„{Oë(â ÐBRµ¿¡mïÌ"À>&ŠFý€Ò™©aõ C-èþ°•81P­î£›bF<ó‡aØ?€B@ÀåîÎÞËhþÅÑ<Ï.n$À¤™Ã®Ú9Í=’Ç6F¹ìÿì¾ £GœZ6[QÏ5x®e³0lhŒïGáE6‹ˆë(ø´$|w‚²‡³›œ_Ì·ó2ÚƒÕwe¸;Æò…0î‰Õ¨AŒúW{)i»Ý›yˆD-¼Ç…3«Îºp^ˆ6&A«c[@;›ÐAó¸°9`èô€-Ìi“®þ ÐËÉ“-wPfçÌù£BxAθu.ÒR A0H,­%÷ {ufe¸„Q@eêÙsõ˜L4·³ÅX¸þ:Ä w„§J¤ïJ·â˸ë4ƒ3$P40÷¢-@„ÿÌÛûV¿ˆCïúE‰ [aĽN N#…nLj| YíN¿yùPzƒDã©Ñicä)€h¶  ý^懲BRDüF@¤{ÆrÄ|iK5°!Z7*ñl(eýëØ¾ÅÚ&KÞBþ 2FÛös8„t´åçTÿH¸Ü©·†õ‡ž ñÔ€ÂßÖžRƒ³^¸mÞ5»¥€FgDÒœÚÉ´sö#ælyá@ž,¹w΋y†š9^{(Òkz3÷x#¼ó‰ÅÔY“kD#„gßàTd¾& å†{D;Ï¢ýsÛÜiùÞlÃjâ5œ§™×¸Ü·M nø±zHû9Ü2˜iN¦ÐOœ þâ (R´{½Éxx®¼sê•°\5Ú%C à,zÇW.3}ÄžéuÈOX?l‡Jï± HÎhLhŶHþÞÄ—°À lâ£ÙF:‰ÈQwõ4ÓôÈLÐ#}]ãõ|„¯kø‡@·BEjrö,™(øµv $4<䯄³‹vò7èÉ/øÄࣩ/4¥~ù~&cxW@àC÷|Õ4¦©¿Nê^ „E €1 '¥/Ûà‹ RnÅ„„b´1OÄ/Ã"²MIÈ©iÈ©Fµ²uNü€¶Èìªá¦£-âF±sÔÉâ”Ñ«buÖÊÑ.¨t6‹1R Yuf¨6a}G°xœßóÆßízãÀmÓv |¿**àà%Ï@~˜ÜÕŠôW­LrE—>/‰)Ðgr •Þ͘Ïã#ÈñÂõ˜°fn8wY4—·‰ZØÚ¬zqùâò™­’Ý&™UwnÚ̓… À »$Žl“ ²EÉ›ö$§A8eí5š$o{á´„«˜I®Öïw›Ñ}?N{¤^Áë//ðúx=9È5Û çî¼=½T*õcKä_½$ÇÃW/óò·žºîÆ—áïùúï©^ÿ¡‡¿w_.Þ*—h{PF ²Ò¹«_4ûÊ-/W~U™¯¿zÙlßÝ÷S¤ÿøýâ:¾¸‰:£ßó¯¼ r±ƒ9÷™àÐv濯{>`yæ³öQ*ÚÈÃßVÑŒkwÆŠ±©(vüÄ.¢| ÿ›hºž®Ü¹cIÌGÃÜÑ,yP@GžZ #CñéºÙ{°(qà,GfœÔ6ˆt¿è}´‡*/ÌmÞë‹Ý}ûŽãn³ÞB›ä…ùßá^šÏhßÊyØ·¼\ßîàwtP ˜j€›ý®Ó½¥åéšXÁ#×<ìE 6>ÿgöÞ4O æä­\ôzd©‚cV/UY@Àñ¾ mçõÖ=iGpå¡õþ1móJ=ù6ÔÇÖ¨éÒðf}/ˆá˜¡ÌÂÂôβ¹…Õ‘*´ªË›hà_ž®Û®Ã!có4Çgë¸\z¥£ƒ½½,C%81ôÇC=ém³¿qÁùé•IÙÉ:§èl¯ÙVelÁ׈Q!´=º«·®×îÐÈH1Ä%Í6ìn¼Tî]7zõŽ´Ð»îÂÖêÖï¨BO›¶šxžßVn¶ÐiŽ›lçhýㆈé¯sÒå¦cÄôå +Ý5_Þm©²C˜d‹ÁÄ[G¥vÚ$6Ê™<+ 'Okð€8Ú6zFCtoєŅåð‡ëËÙk+bLNW·lZò'€¦¡E°AEC2€">¸¸¡ÐpPE+¿ÎÑÏô…}f},kß«_4f—ûW‰¶Ìð”OŽöw!MŠópMuAQ4 j›V'„ªSûŸxÖßÈx­Û7P¤Þm©ÖhÃI(O,”àäovna‘ãÆ1bÔOÌ#`·Õ ›þuè‹2žà.dñ}Jîê€`È0ÒZÔ14R‰¦˜ ·AtJ>Œ'Aô.ˆÞƒXDÇAt„.‡èvYŸGé˜@jžàƒ1Î=‹•èdüN¯I¡õ¸5˜m˜BøCûMüÌuL›‚?ySà-ÀÀQè tµòu³ÑˆÛ•¨ÓmÄ]ª‡ž0F°àÇO^-ßRÐ_³‘úg¡P¨ÜƾøÚ<ª0šò2qÆ{…?~XÿóÅoSq«%_‡¿~§gd-ä*wá dÙ蟮fÞ £·óÇ[C‡OÈiê(ãñbÔRÀ°Õâ¡B£y!KÇ˓ŘóAÆ£Ãòl/îö7( PwõƒÅúà‘~n4Ï#Å—òd+jVUoˆ„Ð(S¸Yø_æò<Îgìú 9 Ñ#@š‡Ã‰Ù£uÁó 靖×P:E<ÅÅ©bŒgãŽ=£÷ÔhÎú=Ìë'˜J?ÊZX‡^‘v$,÷[@Ó­º6¿ÒË'j Köm½jî±Ó¹Eî½æ/á ß­ArbÌŒXƒÂÏðà½ÎÍæSÂôt÷~eºa/¹ÿx\d×J—àœþ.†Ö6Éû$»ZÀ®&º+ ÷Ç™èÈí-:¬ /½Í¸Óè©Sð 0–×q3j¡ ´ÅæÛõÞ£Ú0î½ëôkÆÃ)Þ¥òÐN:w0°e?À:ºÂN§{‚pRƒ罌¦¶úƒ?Þí£Úz9¥èd7‚2oàˆ-+4¼ÏÑÛCUÙîì¸EÅeF/nëÐò©â÷q¤Âaè1š´^™!¨£ñ,èX¿[¿€“§¦ý^Ú€åúÈÑy¦šÅQ½ÏÉ¢JЦÆûí |®à»Î"G>b)‡L½%´x’I“vú¹ü=^„+9þµ¹ì<æh ßžr|›Œ¿ÁŸsÿ·|P¯…ùôY-ûõÜÏ_Yjmr$.?M‚{´%*±ð÷ûôx™t„6ìš!;».V¸E‹e³˜ÿ¶•¿B³E¶êýzù)¾@,"‘€oôË ä÷ ‡­ÒêæÖÆÊv¶¶½²•-/.³ë+kÙ¥¥¥ååÅå% Òâ¨ïŒE ÀkjTæUl±–V«»CãUlNÆ~^¶Ÿ*Zá¾?ÇÐÂ$h8m¢~ƒïZÕ½Ùý€¼ÕÒt-!´[ݼ²*¤oÕ êÖ4¢²,®ÔŒôpQQ·£ÆŒú|¼!€‚ÑY´}^æ? 3l“~“ÚÁ¸’ýq™È!Ç 1ßÃÓú<À?T”ÃI¡»ÝT>†dŒ$ãVìÝ´±.j¹£0“‰r¸û¢Î…Ñl³Â‰š„µÆ?x‡ÎæaRç ­Ýaúh¨=±Ýú¡íhᔺwȸÖܺHz„­í—™U¢ •Q=Ô¦G¥8º±Ñeó­;j³µçsú)1·‡@_¤lð|†ˆ´ZÈ ÝZ¾ß™Øl^Á«"‘,€å·­B-"êÈýeW Ø'¦ó项X¬Â½PàšbÏØ‡ŽÌ–éÑèe4€É–gˆ(o=Ârнƒ6®Ä>³¤ -°É‘}â†VĽe߯ԗõðhIÆU>7tÀ5@:ë¨ k¿7Æñ“µšˆë&Ø7âuîs(ël€àÒ¿U ¥€¿Ê¢y©1ƒáðì=»Ǧ…¶r?~òQÆ[ð‚3øY8\"“/^<¿É82ÉìÅÂDæÖNšá1Rc|t°'¿¬Vè¹… =ôÍ1„yó8lÏñŠ*9±ÞôĉTÜõ H14ý1ëff|?aÿêijÿlÍGÜyLmY·…°xDuI# Á59çFÛç gd«Y¯^ö·"E² ‘¡)hÅABZ€ÔFðäá ßP)³WÅË\À^qUú#Eˆ'¼*þKDD|`‘…©Úή~¹~,7 ð*ÊigHz=(½ò£ÿ4QØU­‰ è‡ðÀœ¬såyLHVa‡Xôf¸¤Å¶<¾‚´H\m‘fÙñ ø"‚8s8ÅñÔF¨æ¶µIèsd0( •QÆkà±Gf,ðBÂ=ZƒÒÃm½{ã•DB·…räP¥€ÇV>Á 2«ÖYX©@͸ïcôдlA] µDKæO]@å+LÂfp¼I›Ž¬ gb¤¤¿p.•ÔÎJ ò.Gž/“®è‘l¦í'R¡bô ¼÷íD«¼ÀBG[½Ý >T”…"1 #~7àÞ+Bmzé‡È´Êi3‚ èg•‰®†y‡û#0謾’%j SÊ}P0ÚÂ$ 1R`R™µL¼ë¢LÖâTdV,ªñ7L%²»‰êAd‡M© s@l:²èÓ­Ma¬89Ú+®îÈZGâR©ªÔ Õ(cOq–‡ 4DE“2òx”ºâDVYYÒüQUußæηtáåº÷m6®Š¡ÈCàÎØã1®ÜJiB–vuLÑÄ^wa6—`Pöw7ÁQ%V/Và*H6^°q,².¨†9³ aË£)µ¾ŠœÆŽâlâ8 í¯ê¾¢ðtƒ¾ÐÖÂÔžè•R„iâφŸR¸d+ÔHËñl$Ô@às9ªâ?ÀÆ †…dgËÀÁÅ¡ÛrM&Žø7”™?„¶ñ;¡‰ŠX3Û¶ü­¸ÞÕÕxžTøáÙ©Jß<ªàì|¦áÖV  ¬Hê–»Ý(Mâ½Êy9l¹hÉ1'„ÂÕE"[†¬ÔèIÈ ²F[¹,#¤mÁüh<„ò\ì¿`¼•²´âJùÍJ¸˜Q¨œ³èáåç> .Æ}U3¯o6ÕT¼$Û{Æø“¿Aé:“©°Ý&^8á )Ј-cº‰(ùѧ¤ý­ÿ­{ž¿ ê—5ÔOáGJ®X \P¿ÓÓ½¯ÿ[¾lM—™E³ùÂ# Ô»qª· zêãs ên ~ßïЕÞ¡N|LáÆr‹:F^£ÛiõÆ´‘cuÍ>fÍë¸ÕéÜoï[ýæ]+cŒï1úo`’øñãMLǽ xÑ+» ÑNhÄã„EÅAýKPßqŠUI|¥xöi\°÷Éb¾b‚kn ¿ÆãG6–€=¼ûÛÃÀô0Ý ræ¼ñ8®<70äw ÓÆçáAEt R XRá º†©s ¾ˆQyD°xÚõÁnHa&YRtŽeÉXa3à iÊjÆÇ%$žÈ8ûºÜ<" %/Ö/mÇÆ4¶ïÎ@ùîŒXöµá” Âæòfh2iܺ‹¤fÑ/¡{á>CH«y—Ñ›iÖôp6ЦpCl þ'0 Z„ÇFjx¿Ÿ“Ï}&4€#œÞ%XÊ£?åä`%h°öó1¹ŸÌ{ÎÜÏÇ_ÞO;„Šðü–’( öôÑÞSÀ²¢¿†Í…jèûéÿÝ-~p·ø!¡žA°Ó#"í‘à‚WÿÁÝBsÝQ? ðù§{JL¥þÊÝQjab÷¡7q¤å@ë¥çMí,g±Hî,KÂ-©•Þ½šPÑú¦w{ôün?˜Ý¶úÇÓcíöCb·²oàž?‡£4?íºª£Z÷ùÁhFðf„ø‘LÝQlDkñG òAšë¸m”`5¯ë=-ªD`+ªžBA^Ù³ ×;Ç:–]íÐÕ pÝ ‡JKhÁ“­@ ¼¿þÒ¯þúËK‡‰ûºâ³C’y¦eʄ𸚯C6D±è‰‰‰S‡ˆ-ž­“¤4œ¨wÏÁµ~÷ü‰ÑØ  ìU¶˜p™r=¦Ü(?"NÆ W •Þ”óIKo%¦‘ÐÐ^§sƒã›§~FŽÎ®†G…uÒ/^ úbŸÅ¨’@e, û©G–p€š©f0AæÈvrš$ϸ¬F³>§x{ZÆ÷:XÌ`¢Œ…ðGôR¯4ÖqQj½w DÁ¬Kž¾äqŽ1<œGÚ7>ŠÑˆ¯Åô%×¢¦¤òwà |ØÐ®dIõ|B# ¹ ÔÇ¡*jE7­EÙÌ@C°ÙÞY=µŸí-ë‡Õî. ë*©QyƒáèÐLCoqhâ;³ùc´1aÕ¦Q©>ÊOl›]~r‚)§ãØRõ»P²€ªºïŠ/š—͸Q¹B&…ñ¢ULè9m×Ôöˆ|=´Iò>žº@;£é3~×#·ZKª%c ‚ˆ—ɨl×Õè¡Ìž¸ø3S,kØŠr“À‹¸¢›ú^Ô˜HãAÒl¼e’[µMrËIu®§ÞÐ~ôACø‰ H®¿&…¡‚ˆ´S'@ãù«nçþŽ"½!¹À#Å€®´b öjíÎ\“°ßCÔ(*¯PÇX}”ÆY?œK“¶[Oω¯=Ðâ}:º¬!²ã’“KûO3õ&Ä4Z±æ$ÎRZQhê$WaaÂö•±Q \ø³E5Rt_ HwгxO¬ÃÑ$!Pò/ºi£_lÿÄcm˰©‹Xt¸BÂ-ñžš+¢ô@ZåšFY|·_Âþ òwMþ–löˆw ¤Ïñ<ìÍ©ùxo†ÈÇ6Z¨9Ж¼Ô²J\zÄ>áæ"S¸f#ìu.ˆÁPX•˜@÷²·Ç%g„¦õŽÜŒüjýK9bU^´ÁÔEp®Bº¶”IƒÑ¡’9z§¢\(:¥é¸#~ÃO6ð«í š¯% pG@20ÝŠå‰ÓÓÕ¬ž®¤'î†Gžìi&Þ¦nÄcê?(£ïl‰œDQ¥%  ÆÄÕT4($D;<óîžX|¤ÍÍ+F(ÖHyb@"†ÃEÅWáÝUšrr険‘ß©¢.ð〨½Çë 6¢f¥4¢QøOÔ¡*C$OBÑÚØ+n.6Wñ/^ÄNÞ†HÅ`ÄfRw’b%Å)8£8Å·ƒ ÏÄ€X0(Û8 o…Š#oÔ~iœ‹NÙá@K#BÍ*ñL—e ‚l›"³C+¤Ο©¡KýÌeLì —ž5]VpÕHÀr`©›å" ù1nŸ¨Ý \ý÷úéq?ôÙDµ2 ÀÀ.Ö#â‰Ëü"<ìJV¦ˆÏïáH‹ˆ ¢ êÝ_›AxeÛuî¶>’¼ü< Ÿ^`YdCmx8æ~£l”éÍ!?À:CÌ àÜ”P·ÓâøÁ%÷½ùyð÷mýÎ (P²:{ôÀV“ø-ª‰M2mÆ6¨`[ ¼¤zLX˜Ú45xLPƒÇŸRƒyúÑAÐæ#.¦P0\¦14!ãšFÆ ôj¡VŽÖ2µJØ-4²¡÷±?Z8ôñYªíh˜\ IPMÍv¸æ5ä6ã) ôŒñ‡aKµ?‰Tô )o)f°ÎxÜš.$(ôԫʹbÒˆ-§:·7 §æQ© g~j9ÖShºN´é›)j?\°¤w\ìÑÌ¥`•>“Bx J Oˆam aŒôÐøTËðI NØHÄ„V—p¢ºëÇ{…¡DJúÉÄAbP¾ÅÐÑyÙñŸê;áZ ‰»^CyÚÙòTŽÑYr¥‡Z³„·z âN-W4°!&]ßAŠXå)Î%ß~;½ˆÃÀÒgÍï“8[”öµ‡k‚eÓ[+«“¶F@† xï9$±‘1{EÂEœ±W dfv1XDâ*ÐâôbËÐÕ-ž¦'nÝÓíZr·=¼|1gC™LüÄiJà^ÞR&‚ϸ¡îS™ÂL’Ml%5Oàúæêpgì“x½îüûïZ,0G–IŠËLÆAi.7)hk=qÚ³Ö:¦Äm}7çxk¸§oж€+骂xïËÙ§sÐà[Zu—+½¼_tÚÆ g~Ës¦Êo¹t“Aþ–^‡ùoÑ5úʤ¿å¾güê·(ÔßÃ7ñC>ˆ.¹ñÛ0~cÉ£u·ïý19烮 .Ÿ|MLÿvîûQ뾋Þ(§XçÛðLI©|âx,æª~ gèÐN9V¨X 1],ž£O•D 2œ-ÂŽà¿/^`hK™ö(ç·o=¼Í` <ó=ß’>‚ïv¿À c,i}e9’}CSzÌ\µ3Ö -VL±L‘OÂ@·O_ûY㩲ˆüüË<NVÄ€s댥DýpàGì·ÀÔ·ÞÊÑ6WQ»¨ôЯ6IF÷·bŠ€GÄhr‰T‘ZHħC½I¡k¾)Þ"Þp™ø]¥ ò¶=}éŠ\¼S°†Lû&þó5µhU¢­ÕL–bÍ_ç®Ù²•eô×ðùL.dÔòšÂ“w=G–pŒ˴%N,X¼¡èb\Âë'¶IÞ’¹ÒUâ’^›1Œ¿b8]oER\b<~Ù1Î)â©dÑv”_¢Û!^ÐëÐW9Ø’[+ðM)Eý§ÙÛ~‡c±{[ÆàZø× mWœðwÕ¹QÆ-e='úæh¨ã/&Ö#“ ØnÂ4s—¨*í3'õ õd©fÄÎ)’í]“(Ól*Ù t¼Æ}ñ„ d‰%¨âµO1ŒØbå€PUpÑÔ oÐ/6Q{ýöåì$C ©OÕ6‚铵ƒ'kç%,¬:Y;r¢NÖ6‹ä“õ‡=¤à›ºÌ>+ ˜=J<dFVº¼Z¼´nK‚2´‘7é%'éQNÒ#äjô8ŒÎa|¤ Cþ ‹¶xzV0ÚͪCG‘ŠæŠnN£9TPRPcÅ*š§áZR¹é¶tËŠ®k¹–ŒF6`€Hs ð]ߟŒâK‚^zD} D+ªŽ»Ï/÷àå} „xüá‘æCŠ}BøÓ¡F­RÓ>Ù,ŸÙ: úÆ?åܽÖ┞3úí ¹Rƒ-ûN­úq½Ûè Û0Fó Û|?­e`<@@ôXβ?Qe´ÉâÌ–ð PloBým$Žo˜ÜðÅ ccü:8S« èÑWÀ(«Ä}Àö;·1èIe ¨}ŽCñ•eÌ´ÉF¤«E'J!€ ¬'^Öh°r=>ÌÃ9^t2éÝ·ú*X/¬$py1âŸè5LÖÕœ5¤êÜoùeÄÔ[Ú»€8˜iJ°Ë” IqÙe”©B~+V}Ü-|¢Æ¹žá»M10çܹ¯×œ^³Ýá<y&PƒäC›úà÷”\®}Ø CY³õÊ_SÂKSó=÷bkCE†ó»N>{’»ôQ\â¡I'¼ýÑ#Œê²[ð±£Ê£4Σ‡‚ˆZ7äM¤U›/-k€y´Õ­ÃÔO÷;wwhô…ÇFÇäÍs Ê§Ž — °o½@!RŸ¼3©n17{Dz,¼Í\oßùó!çòŸìám"WÂlgò=ä—ÜÏ,*2 Æ0-^´D·N¹Ùtœ»Ô9ä/pælk ñ—,.¥rQÖÜ]qÆ@ 0v)1E8s/àj†^ô““ª‰:ν†0OIvQ#}¶BO¨• ƒSuÈY þ,~¤›`YÑG"ðp®(b‚46¤A¤ýÊôÛƒD#Ñ£L¡Šû}ç&fCpnð²9BŽHžEì^Úµt¡ŠM€ˆËó¾w8à•u@ìYÁgÂ…Ø`u Ea05F%«#¥ )zÊä{Ÿ¨-æ'€ó€ÞB+0º£œ+BÞ¡aÙeæƒpËu2jÊ–Iâà1MK.—‘›Þ6ÎËÍxþM¨ú©Do$ëËÌzd ×dz†Ž`è©‹¹ p*ƒÂ 5uðç=â1¯°|¡8F>t«ÃÖÎüP`ŽDÔê÷4iQø ³¡ c6Ñ_×i’.ج$b~õ„§ mÝ"Žr´5QŒç£ ‘K±cbô'* | ÕçÎD÷ Œ‚¨QÀ¥xºïâšÊn#{jËj´¦†2éÞí`ÿö6n4Rf÷´¡]ަ×|é‹‘S, ÅÓ½oIhhóYö³¢Q¶ ñK”’}Ž F:Ä$;tdx_‹/¢Áãoàïku–B¼2JFvøz9VC´ÃÅmÇSX /`¬õâd-úšPãTÒ÷Ê*67‰OáOĶ)Š7ð¤zÝ N–ª·úoâ‡TÄa÷Ðä*b ¸‹~·…¯œNÑÈA`G¨~+HËR,棘ê7oãã~ýö.5Òœ^7/®ÝtBÍ‘ÜzO‚›øA~ËL@žè¢QKwÇ ¯ñø;ÑD«Ÿ1”ŸoŽ:ÔXê•óܨðc¦ ç¤Ûˆ% •ª;8Æ_)þk×jÂÚ|–¿_R—]`äe™™0}–¿_R°‘ñgú÷KªwÑãögùû%ÕïÈWÏÏÑv2D‘'X«ÍÃ!‚0ÌYc½-õÌëAyUdÔ:™ùã+rê¢Úú€¸²‡©ÀÐèFCYØ+ºÓrF8¸\Òa(98¨$ž[?«êñwV=» à«>¾˜>¾$ú8éÜ9]ÐóT¦–õ\+04ü²ÀY Ðb•†äê®×«Š&èjó€V-È¡ù„D-’¼öxQ¬1šó‹Ru‘þ.UKå‚oLðvˆ}Ç,—½–ˆg—ðýADH÷Ñ6›ášÊ#ò xÇ ¤9üýÔ9ÿä•_6ïØÿ›%ÇXh¥ùT˜Ïz8ËfÑŒ˜5÷äñ\âY IýD5ŽÆKllµ«`щqm}ej*/_ ‚úlžn¹™UÎñùªê_|[„7Îàýò%«"ã½û»rDB¥ÆÂ´+õFùI‰N¢û nµüähë<¹_ÃÀ¾Î|Û¹ÇéE¼¼osÓܧkÔ¡œáp‰¹ûâNÛn!ŒŽ”Öi¦œõ ê™Ù–ŽBÔkÞÞ·œ¤$¢œµ¼™þßV9øXI.†A³w,M©ès@`›mÌM§ÉÄ\&eôG ƒkÅáHÞ¿(|t³c®i¶¸C°ž˜ô噾0J4_q´uáìÌoUgÅ•?v4³.‘©YÙãHÅ%w“ò¼­¤oÔR" œ—áp8/ R= NÞB®k %íÑ@þz!¦{§«hO¥Âã’é y.n!Éz<‚rÏJë¡âM:ÛGƒ™*…®6ËÑ ‹=ž ›ShpU~À\Gñ1¡š¥*@å]Ÿ_aw*•YEhù»ß˜œ=l¬_5Ó®S•,­•îñÉM;÷μlªÓ[!z*7^\úgk$¾›³ bé$¸Ôcœæùÿþ(½°KÄLI¨‘™e”Ì{A#œ%€Ìê3r Œ™]8¦z ¦·@-˜5q.¦„Qe¯öd®÷Ë|Õ6^`.úU1ÑŽ)ó¬„38]Â8A4‚ð“Ý ¯ã ÿ@º‡".âÑÈNÄF ËöA¹°9.h$ɾx†RéÔ|ÎQÎÇñA YCG_eÎNª¤¾‹'Ž]]%a*fçQ˜Zy&©­Y­¹bm g|HœhÕ"Æ„àj¤ÓÈýÅM£ør‡ÁMTg‡ ±íáú²®ƒÐV™ µu>c«\Ù²#ŠC+³rjÀ >éî/¾`K?=R´…ç 3Æe1†Åa^. ¬•2žöT;‰UH¢ §EHŽ+”€€³˜•aäÞ•kê¹M›ë9É4¦á‚_Ï‹ëgF߬™Öm)ë3ÖAérÉØð4 9ʽƒ{Ïý¥²¶&v&v‘fN}Fɪcò†¢~ÿú~ßëK[z¹+sávN§ÓM%!bFgœ¤sTTICÁÇä''‹yÒ: kÍ̪FL¨X[æš·Ó1á6ž9&?ÙŒÙÇD3·??6öZ/y[ú}´Wâ¬$É1æ2ž‰Y™ ‡‘pZ¢ªûù9ØåoÝÄ,™Âi…­f­(<6cÄþ<|µ>0žË#;VãÐ Úœ_ì‘â‹°z¤leDÒ”ˆvhmˆž1ÂŽŸÑäП¢ÀzâŠî±]m`¥ßZCqÐ Û‚ŸèŽüÌK)ëN ÞßX¾u†mDZépiâ¬Èÿô ¢áaÚÇ[ª´í•Y›s@àc±ÛªÑ_â\ÈçsL¡L‘Î%ºf§JÆÿ³£ˎرt¥ ˆ \^&D"„I¹x—”dž;بY¢ÿô0q—$ fۈ옡²Ö‹²¼´—4òžÚœÔÍ8:nM_4qms *-iÔ†5+t:Á(ÂÕL¨ú•´±"o&ï$rïŽeúÐU¥NV,šz9 îÛSŸ%¿)«ð‹VsÏè&’*|MçsW–“;nÕLfCž I8Õ ÀijL†*#^µ–‡$*RV Ê9mÿ4½ÈóöZ)¸8´jö&¦A‰<+¤#X™²Ÿjƒ7jòA1føæ ¬tádéÈHá‰Bc#9¢*LÜ^cB¯ê‡l~ÈÈîÿöD?« Òa¦HRÞÔí˜æ<¬ò T:3©1j,Q‡(VŽ[á ÝÅÏ¥Žs"‰¦ÐŒÙß?·£FXG#£§ÑÐ1VHpÛÓdÄ"Æ#%ÜHJ±!)T¶¦@Zl>Æ)¾ÉH±6E£I5¢ÿ .üó¯û;þ‹¸"¥µ)¥ H™ñYžâ;žâs–2ò*µ«äVüÍ“zÊr#ñ|ç²*©¸l#—“¼¼Ÿ5!àC —KÚå9ÇîU¡šDfÔ= â>ÛHé êBÙíÕß‹]©oŽœ¾!a'6*Sw’„´/ísYˆ{ýü ÿHý‘:n>>¶âÔæñqêXYj» ’[ŒoS›»‡.ú×¥J…b1H\Ç©­Î÷Nj§Š4CTï÷ ¶;…x« §Þ㭠h!µ{x:h^Äí^ÜËÑ'oANJ¡SO÷–Õ]©ë~ÿ®œÏ÷hHßãÞæ¡jþS±[÷Â|}køŸ³?Óþyæ›?æ>þüv†¯ÎÎþüvöíüüoçã³ß½ó³?áŸ?ðטßÀ/¬ŽfP”z•ùŸA^|Ãâñ<žûéo½?øŸ_ÅîrãoÝñ·¶ÿ‡Ÿ¿Â8 — û¼LÚIiƒÎŸ&`[Σœ6è.D!ÛÄUj®ß9&þCëp*K@V»ñM˜ÿö ;{!9¿µñçøù)_9+˜š í6md]©V¶ œ¹l”ø©Á— ú õ¿„Ñ2̦`²õ×.†ìÌçz"ûó¼®Ì™\¢}4~Ñ[aÄ/|xD‹A´‚©ï¢R-ÑR}¢S™ô j×ÈÅžrN"ËŸB}¬4:hUBðã8TQ/dŽaJPõølñ¼}c–ctâ×èõ© ®ßLt@×c®ôI'zqKÚÿ(V`ŸŒmu‰ŒÝTª§³èåxŠÃèmšž2ðo‘l¿*Mõb8ýMÎj9zÀÆu`h‡Nw  M ¶÷±Zúˆ]ÌXU&2’´Þ_}+ØÊBôoO4¶o4×QûpBÓ#£—ܾòÊÇñ’nbÆÝ^¶H!óJ¸zÈžì/ÅF)á½D·JUø‚“K&ÐÕÓ–ù'üRW!Ðä×êV+ãîvî Et‚ŒvÒ8Á²Õ!¿´÷ £ÌÑ þŸ|O=d¼Dd“ªýPæ1ãjþlÐ2bŒÐ{%Ä!.*(8•;Šé=^ÕØ+ÑR-+? ³ÑËçTMEBÃZò‘„%MÀ–€eH|™Æc·„ÓQùƒ``xÀDQ±ÂC]4Oá%ZÆÄiÜÅ\a®PŽä3T8Kü¹'§ˆ[èü)Ë#@8+¾¦"N„Ó!ñû3Zk­œEŸÏ$]Ùg•+Jqé‡IíB3Br*]>lU!uþÁ ‹T¢ŽÄ/v=£«YMªµÝ¡åþ‹v„‹™FœWä‹Üß}»ùã>>F,Ž ¦t_ZÈûˆGôÚ§ˆwµJtÄDJì6¬Ôa±¿„ b«é!s†øÏê¶ÁÞ(19£ØV£G4±} m.óÈ`öÅþ0täÛ)æbþǰ*ækL3¡µƒGÚZÏD¾„øDITO)­* º#>/Ÿ-ÚD{{Œ´÷q/E“Ѧ!Ç/£Sø—Œü>ê×gѱx„äƒuÙ‹sA,+ôà3A’²·>Q X_\RJ“ÖëŸ-bðïÛ7½OØÑøD;+v!záž>aÏ8sì*ò¤³hë¨ÏaôÙ|)8?à6„¼ñiþõ?)ÿŒxfFP×»´:»%°/ÃÂò “:l#åÏÙ1ÄŽÖžÌóœê}CªHlÀ"q¼ÀQ‡ÚËDõ;Ï`–èÇTlM'›yzÖdÏ|A£QÚó¯¤.Ù–ÁH¨öO‰ ýª6´ˆ¡qD‹÷I³ êk¬XAhøÄ.¬ruðijÛOô¶Ÿ˜mÕ¶ÛÉS`rp— ™3 ½P³£;¤ K¦ä¿ÐZ.à–KÅOd½Â…V9~ UþÝ7«?É*}¬—FÚö…x…ú>*\±È$á(ûô‰6 À)ñéŸÑ Íy 1ã‚QmF%ÊH¥ÇÁM«ky=´N]áNä øÒ@Æ·¢ƒ$-DK̨.O€1Š3þ+|“¸è£¯¶WÄÕ>Vin”’VQ·¢¢ÌüaSMǾÝí Éôd›£ ?ɱ4€<Ô/:WmŒd’Âãò* ;^%Bu·ú€§Œbw˜ã¢NÉ1ž‹˜r°ªä{˜«Ù“H¢å+‚CnéO)Öç&n g±ãN©Ø«§œ+–6ûkýÞlÈ{Ü‹¤ž&óÉžV¸ÌJ)‹ ØÖ!Îzbñ¨âz‡–ìnu”‡xÃ=Eäí Nçi -k¦7äl*G ¾m› ôÂ'Dvæío÷®övþœÔv½s¶e/?ío•óÿDá£MÜ …ì·ûøï[–$K?ãçƒÍƒÚñq9ÿ-÷³ŠØÔ;C rˆ²êÏAU¾çƒÚÉÉ~²êó_`…j9ýí¸ªß؈ŸÎýQõ¿-ŽÓÿ¬>óýþþ¾Ã>aÊù?gv÷‡3û½ýX¥rš3´û×cT¨ ,üìå¨EY‡ƒúŠq§Ñc«h¥ú­‘±@o󸩇ÒÈøUŸåûÕ|pøþ;Ã~âã«þ¸%}q·ªŸ•Øâ7 žý‰£þ F|x¼}ºõ[yv-¹\¾ª¯Ôß”:æãŸÿ+^¢qMMuд@oëwå§Y!øaú$`#ߤ>a$¤_‰GC“PC‹V4¿PŸÂ'rÒ6`lÏÒÁ~"®ŽÉ‰öóåPà’E¥¸ö^ÍY±¤ß˜¹h‰)Ó2º«8sÑÄ}Ѭ)ïŠ+-{}tœe NžŸúIY ÕHöÙ¾T³§U§»²ód-âéÜE„U´ñ„ØC5›Sb÷3\²wöe¯½¨¿²z4G2´è7cô¨?¢¼Øȼ÷?ÿ äBóô¨Ð¿Ý dI‡\ÇáŽ-6~ãa¿‘Œ!³€õÅ&#YeETžÙ-5 *®(!.3ŒcZk ]QbZØÕ<"¶ÿ4œõRäi\qÂçTKs'ž'Šð'prž@rHX)F·…’/3 TÙÊôvdÅPt¸Dób¬½ã¿ UVfví4sâœÂö—Ÿ˜H‚à1ÊPŸÂG'œ/åÉ„(Iycm©®O Â=EÉøcØëèÔˆ§j!?ŠêóOLRo%²á\$çekÈŸ}ëksr)7mà …%æþ˜|Ìh>Ú¹2P•K2‘‹ÝÔ6à[dmzÛKg³:š®Ÿ MÂÀ$ÍÜP€ÇôýkÑyÅ,5*™"Fñt‚…|Ë,ËŸß2càV8Õ}EÀ>ŸÎÜ0í´aw€u(eØ’¤q‡Së•ÚÆñâB`h¸,SÄ,—ùo[y¹â¸_^¡±ƒÂ.QQ…¾äãÁ?ødàl¡SŒ³#ø7[0Üø¬ÉMbrUä§Ä„YQK”1  4ð“!J§”Š÷tzùEœeWrf“èp>É'Né —p"ø‰úÙòl… c^­ÿzÔ|H Œ¿(’–2&Šœ=…`:b^”Ö×§°z>CéØÇcØù¡l W Aàb?pAB‡Fk¯–ËÐJªÉcAŠù' §âž$Q¹’ÞÚ=4æx)>°ËzH³~C`o¿›h…ëý±s>b:‚SBš²â8Ø+?ÅmNÐ0“5UžÙÊ(Å6óãìo¹±ÿZll/†§³k«àˆª² K9uì5’¥‰í©"lª¦ù“YÃXXˆ-iyÄCgfE·Þu½ç_Ã-, z–`æXA#|×ñ¬„téüõ·F¾éOÅ~Ÿpž«—k˜%ºgc¯+Çó™N±$\…ýxÄ*až‘õ¤µ-?goã/´Îv£§ ‡&puFÿr‹ÚîÔjÀ|ŽÔõ âÇvcw@_‡îÐý…Uv£lQa“E½ŸGsÚT1)cÓ8oŒ¶öÇxælÔNÛ&]5oëWÿújÐ×öÈ»±søß4pjÖ7¿üWzJÅΤӶÛ;¬Öœyí¨«:¯æ˜?œ}LÙ˜xÖjs¨3Û‹:Gæê±p¡”¨¿£04¡˜9|¶U˜¨R™B=$€hþ 'mtá€Ô€™×蔸َtº 4Óšî×êôeÌìKpõlµWªpqóëq%–]ƒøÇ¯UT”®ü4ÅI“¹Ã'}‰àôíì ´ß©È½¡.}ú‰¾þâ;ŠROÝvjù"¨×èw®-†“M“…yÍ™F¶óü83ƒ£8¬c„°r³v¢¥°t§¦/NHùÏÊw—±¹ •ªPØKÒ'oºéSã  ¥Ox‡ÄœåÒ4ªu<®ô†MJG bÏMµ^™~`{e¥="Y<©=’›ÒÄe¯;’ªÈ¨–LøLÒ(¨?<%‰îlø¯teµÌm¢ÜQf>ºt^A£ä ùJîÀ ljï êSH¼\%úŠ´ÙÝF!ð†TA—¸O1— 6±4>i} ì`“øêhö*Ó›9/)àlQ'îzœà5Õe6*è™™ÐÍYÁÍ„ñå?¸LûK>:‘XÖAB9bŸý¤ÅÀQ‚‰ir†°øé‘OwLΖnÁ¢ºÂìðÍ“ )àÛ ˆ‚ËhçqL–•ȾŸqíÓ#NId¥ðAÍÕ Y(¡|RUUþR­c¿,ÂëžaT§JPl/Gñ§ &GeÖáX)ŽÉš+Îxc Ü€¯Ð—Î-ºÉm ÂÕ[½ò)jex…õ±^èUé‚3:’‚?¨Ä ³#Äeò„¾*k,>¹«$µPë R§NÎQÖc¨â•»éåÏ©^òäåoüRÝk›(­QòíÍÐI}¨MUÏùƒŒ—õD%ëŠ[Z0U*IäNhiÉxÁtEQ,â|B_‹Bq.ë#¶B[>Ä 3A/µ3é8[€AN Ix”‹wj€ÉÉ5íãyh…\´Ës½Î}÷"ΤóéêÚgâµ–Ï¿Óçx³“—*>Fˆ¶oðÝFóé?mKͪþ.3£;£“ùö-÷Hh_ xŽíw’“X%#'ËvÓŠfuØ1žÃ,غrÄlÚÏ´X$CÛäè¶ ñ5ÆL<®±ŽJ¾}ô~jö7²÷´ ¹Ngr%‡f[s!)žqi¬µ¦&o§1G²TµÖM‚¥‚=>÷û*šWÏZIްׇœµn[¤uŠí=ìôšâ¬ÿ:¹ËD³8Øz˜wï-cZR³Ík ~<¿'CxæT©f‹åâä§Õ¾^,q]ášì)|!u°6/ù©¾O&/ÍÛ ‚ÃéãŠF$«ì¼=½—õDü´û8ãýžåUb¨Ð‹»ý rº¦%°ØQ_Ð@ò2ëØ'r„g¹ý-M²vzÎÕì{³Oök²¯Sûâ,:©ÂzRÛ÷q÷A™ ×ÐRo(ÐqøäYÄó×_ìNô×_èÚËu—")üýdûø—쎗 ª%û¦ó—,L{9üR-žN_›%B,_²£Bò‘œlˆ|-" ÑÖ¬U‚Ó'5Êüæÿ4YŒðéŸæAî£%» îîùCs}ǧCÔ %º÷V›²“ž ÔK¾q[áKçt'GÇ„V…Ì×›JF}® ]‰õÅ9…®šÝ!?‰G&Yl<0Â_vëgRvž.T.¡6‹WõË,Mïi¿ ÞÀ¹Úa‰16·cwù…{sSg )ž gï,À©õ¾ÀǺœ›B¥çhlGq6¬à>‡Ié›p51fhû2ÝŠk„&×ù?¿õþ8ËüÏsuK¹äk{z¨ÜK¶gd¶ÀÒâÔïx¹ýíÛo/,_l–è“íÄ2ùÛŒM¬ L‘+œZ*F‚…¯’oT9§žˆç ]¥9èØ‹gS4xêŠÐZÈjÏ`¯æµV4ôQ9áh߉Bà=ñüŠC_\FìYÃ6»ç™næz-:bëŠÅŽ˜X‰±Q,A70OŽ%*S¿Z¦hѱˆÂ¯|EÞ\ôCrbùÆŒWD$³2ƒ(ènýzçà V^«MÛ=—©Äމ¿Œ>VÔÈ7êʳÍ=?Q'±´+¹~jÎNf.á<ÅßÛ‘m•z˜­mr„ŠdõŽtÕªõ–¬,6´jÄKöÓ,,¤Ÿ×KW´c鬯’—Z…ä§“s…iôÂM„üŽËJY W§j]²àÎ"þT:sÖk¿ íËÄØØ£ËÄŠ+¼ø"#W #Í^‚ýaNü˜O3nt¿vŒd'é©$ŸQ"Ö°½sñnå8’cŒ{ Ž|ZJ)˜ìVü¢C0C‘Œ½iÓ*r…rð‰Šíç¢ ê( »[b¬(rmvb¤ìÌ+{œ˜ö®«î«áû«†Žç*S® ãæT‰xÏaWµ£Å„Þ -È!ŒËPÂüi»ßlý–ê?83,³‘½1^ÜÒ;ú…Ò"ÔYóA>ˆî jîìÏò?¿}ËçÀ燳uøÁžš¹ö¨?„O¤p‡Ž$Ÿ_¦÷ø Õcü {V)Ðí€e—n@#P“&aä2Ë`<ž4C¶ÈNZçˆî`6(`•‚‡—Ðbô 4 V<Ó!&„ $ ·cÆ7‘ëŽG¼EµÃq¿~q“öÐ&à†¡F©W+vÏôÁŒ¾1ÖØH¿`—|›D£ˆFÌ„= Þ”èɼñÒúŠopöBTšmDyÑlÆ õžêÔ"^hÛéª".xPË€gf:Deèñ(@3KÚða«/^È[¤ÒOQI+-g‹ é†oT{ª¬«¸fˆÅ iÖ¯ãÜwRrTÑŽ¾,Gd8Y±cÞrÎ:W)Û)üœèÌÀø;ww¯8`ÒcJ{àÏYÍÍ4¥¢pÜDú¿ªÑ°lvsGõv@ÄrHt‘ õHËÈ‘(Þ˜–'6«fºAµÓc9Ö¬LTìÔ¤9µaÖHÛ…É‘î«q™S G1 F¹F‘˜í'æë/ˆý˜‘ÁùÓñ2Ãx|mǤÚî¯Ý¿†þJ€ïÍ%u‰¬Æó_$]Ǥ€âg§6££Ÿ}2§§_^»K^ÍÍýÒrNùÈa=~š³òÖ1ä·®:ˆ&j¦ï'-XŽÃÎÞ%V­yÙ%74ÌòÄYŽ*â*ZØq·eBŽ€‰¨•SñíLr&Ì¿s[¿ÓñSM®®GV,9 KÀYkôÅ%5‘j±“š°ÈDq&¨ÔBýÆa!ï&ž£È*NÍñ¸¾.Ôoˆ ë?¬±ŒBÊs4½±æ`~ „z˜H+¨Fž¯‚j¾<‘½ŠŠ„9¦ðÊÀh¥½ PÏ÷Œ;‡QhUçPʘ0þм‹Ñ½Êgç šÊ¹|ÐÅï† /dsF”9{ i6iŒœl¨  ŒB@L7E¤¼¸àÌ·ø¾JïjJ”çorÓƒs=פYôƒd5ax@ÎE•*£ ®È_X˜$Ñ—¸ªL†ÂÇšÐkiUÛÄŠ˜å>†”îi8mg:LÞ™ ‘»˜9™EìÐ à9†pÌ ? ЧÜ1£±¢Šç®@²Ç¬8£z[À”R¬sæÕVxe²ø´nªÌÀ¡eïJ,ÔÐO´5û¬ªÀÆ3µnÒܽ’GwæXš±YÇ~3%àÐÅ'ŒÔO'¤™" µM¢29³O–]?R>Çx¥1Àz¤JW¨t§[¿"ºdjr5í*t€–‰±u•ñ0êYÖ9̬×B¯EÝq½Ûo^´âq½×f¥~ßhvÆõö ÞcøØV³×c¾£f«7¾l^]ÔïÈL ~Þwãñe§k5fO¬ñõU·s7¾­woÆ·1¾h×ãÎ}Ý?îº+ 3îÅ´ãÞý-Ô|cÖŸñzïxAý*̧¾@†ò[#z‘¢‘“Ó”—¿ ê]ºàË䃣0ÿ2]]`O’îø¢ÓÇ·QÜ_wÇÍÛ«1ûœÀÑ¢¡ÔÇ@)ë·~¯ŸËçÿìÏWxm“•o^ lK^äƒ!<õñ66ß >Áïñ‹V¿ 3•|P©Ó2›{ý‡VìC­÷N1ßeÊh:¼\ºjýÚ¶ôôð3/S?Bü DÀ æÅOB„üžñ²I¹÷å°™è6Ì˧¿×õq|q[÷¹oìà_¾\ ¢›[µ“Ú·³ñ·ì·,*•Fá©|V ¼—™öö¾ÕoÞµâðwõë÷W0ž—y~ÿÊ;ið ÈuÙŒ[^Üç:æ •3 \©ž‹\C~bläòYI¿ãU–*ôÓ® Í,&«¾ìw¥z÷ÕŒof´¯+ÂkPnB?Y 4ñè½àjôã5AÄfí›-A£0kT†Ðüç ¡Ñ¹}[o7לּçtyØxBÆÀ«R,[GYaÿ;tލzm‰—=ÐÛD–—ç”j? Àv@;‘z(aøkrè;ÏDv­t×Û–|XIøipÔöó¡þ<½X¬R=yNú ØþKG¨ü¯Z G4ú…uILOÍÅž`r­¦WÓó€NÚhtåè1GÖ- '/ª¤ߢܩÏ DïŽú@ëÄJ=v:·#ÂÉ DÌÛÂü ðr®í/êLMj\õ:äÃ~t-—‡– #óD¼ÛõïË*i¹3CÓ™¬ŽÉ;xnƒg¦¡öá49[e°÷è:Ã&*šLÂK xqÆw¸Zh(ÿ¼A9vÎG‚–j^BH´ÊÖC¨927¹é&Â$cã{yªªPÛIé«ö:…ÕanR,Yb1j§b‘nG>êQ4ÃëÞ€*Ÿ®›}Îã3ƒ¬¤ë¢¡Y}t–nÈÍÿÈϘ¯õ1šc^sn4X<¾#`3+ãü[é•ç“ ž>ÃתCºVUWQêç`ÑUž|]ÇØ™Q~J1m{D“à+QKdÔŽrd¤Ò<'ø£¹beÖ7&vQ  ¤˜9_“ wÖ\ص(s’ƒzõþMËÊ…©$ÎE£†ýqX‡A)îkÞM?.NìKbäô/piŒ2m4¯¡Æ¾eÔ¼ åhyø7 YWÌR—³M›-ˆ¬&5¯Éu¬B_xÝäY+‚WÍtã;ÁÄH8Ϲ×Ö2\•_0PtÑÂA´DÛJ¡M ¶ZmaNŽhƒ´¯xMœI°‰ØèÅ‹éôIá¢Ñto:h¢#óY1¼¢&äjœ2¦.Ωy¾ÉhOf¸kÇ ¸µiÃ×ôRvËPkwzI ]|7zn&cèõ²³FF[” ù€£Ã›•´€…ßÓ¥¨âÊÑ–²ÃÛƒè¾Õj:¨U&l?¢>£aÕfv…¨ï!Äê5[ôÒ¹óœRRH“{l´ƒ·ÒÕ>^¿ëY‘§.ÓÑÚ Î;õmÑðÂꬋ:Ͳy@4€‡:L^I)E£?úUEr‰)' )G5_²ö™d°ÀËN‚rÛJlƒ“ùɽr"-çWç:CõYäØÀ;(GÖHDŒIX,ˇ>œy£©¥íÔ÷)S÷¹ëz› }Ø  J€£RpA\|ý8ÀÄÌ$žÖ8»QO!6ÌšÖS:ï3fçâhׯvK*ƒ§zäø‘deYóÄbÌ“Hµ=dÄŒ -z¬ì^Î+cœÅY/ShýÌáT”ËË#?=ÉÐÜRxõ¨ª%xS4ÔJ3™¦G/(½A¾ «]zx’(â¼!1[¸5Ei:›Ãpž)1oDh»¤ðÀ—Âa ̃uûaJJKÂÄÐMPl•JzbY¢×ÅŽD§·)ÜLH7S':@gDºâŸø1ýÐ%“ÄðX)IÓÑÑÜ ®ôx,E3ç„‘vðIEnò¬¡~TÚÏ}Êe…l1»fDu§êN˜'9J|[‡†{aô¨ì¤è‘IbÙÚA*dW÷ÚœKú¸>øµ3ì(ºáÐÐhC*½\.¢cÞÕT~qÀ˜¦Ûï%²åÊ£cÃåÊ ýÒÑuÜJH—U¥úµ©¥2TøšJæÑCëÁŠ\tÓ…¡P”¡$Íx3ÿrIÉÁ¸ú5ÉF«Ò¹ý@«ÕèA»ø[dñ!ÐT°(ÙªÙ$—-]+ŸtÊÿò”‹ä§Ø*²ÖTpi4J¸ µ»³ö J§ýH÷Ô›!1•hÍ€˜b¾i½7hó“ ÅÆl*O|ŠCô7Qa ¹[5á#ä.¶@÷è›Á×^b^¿šrH€í¬ùY å2³sd%…y`71Ÿ£Oý¢Í¼]tÚ 3QÆ9† x 7µ 5b}›j_)aå×ó²¸Üg‹xIÑ7žò¦›Ûæ´Ûnë s¹Eud̘;žÊ+?Q[n[êbËs…ƒ•MÓœÁ·þ ÈàâÉZƒÀò‚þ•e–KëyË,õGßY–5øy^õ ‡ÇBócº¨PÒ¸E7µá€­Â™.!©½aaH¨Î9‹Ô³HpoFlÈ#AQÓt=Ä'¦&æB¶`ÕîP[”È›¸»Ä ÙhBÔ®‘К‡„(z1iÿ¶åEއM(€X^ñáЯGfÙ‘‘«u%“QÚ¤Ù]ãDZäíæ,ÉÌtÕü§¾jUØÇ_m¼?Õ ÒpÖæ©­zD¥Pט儵šÇË(pmòëL˜„IüfŠb?Hj¤™w}ÌYï¦Þ02Î6bÆÇ š’ gºmô¯ÛJÙ$CztÂùDL>Çö½nJ#çÛ¯já“PâGŸŒ‘õ,õý#¼± ‰çhËhàoB­z{|Nõ†x¿>:‹Þ€Hc]ú(úŽDK\nu>IV$&@hê¬òHë-S¯œc ýÏ3°bð£¤Í¸¶²Yѯ¿Ê‰«¬è³—;ëΆzñˆÔ¾!~’:8-”}ܹ¤´-zZ¦Á—%wöêk«Ž˜Y!Ǩ(&J½¯àd³˜\ŽtFtÞDÎ&PR ž^*™¦ãL´7ÎçªÓé­¯²•ÍWÆ¢öƆ¦Äýî4hAu-È, ]8œ½Òh7¡>Rû,òq¾¬]$ O£–F±ÂþTü+XÐ9¸ìŠgË6~Î&`Ú¦ µ±‹öµµ½}mÄíú›½DØ/£G_ˆ$âlt+ËÆâçŽx í#0'?ª¹ z(2Š˜|ËTÓæa:/Š>y´¶QŸ£ô Óâ﬌S%.Ð[¿, •ç¯\¥8ÇÓfo\e6)W# ¢ÀÿûâK¤bíði¦ˆùv¿÷ÚÀÙs¿ŒÉX‹í @UÇ´}:åt-‰Ì?Ii¢qèÝÅÍz‹Õ Y½±Íb lÜ Ò)¤Hg);%üÆñœY¥S7§Sì3-|žkò:¸ùùÂ3²¦ÅºáÛ$]‹yA\?:äÍŠèz‘?ÙTð-…ÄM𠜢Ñ`×OúgoØo[Ñw¥²Çof”±É‡ì±{"íѼ' .¾“¶Ì‡s½îαþ½>J?Ýw[e. 꽇öû£¨ÖAP-+Ø›è¸ju¢zk{ÜVZL‚XâDóµÈŒ›ï þ.ðòüVø#—ƒ<¢„A̼Ӆ&›dàxæë­»ë:f´ò1ü"Ç݇ù àf$&*öóÁc˜OŸÕ²_ÏÇÞö(|âE˜ÿ3‹Y»ÐEsäWC‹»¶æƒ}tÞ<û–Íœû!ýÍ}kÄd:X_ ŸîÄ—DÔ¨×iÁxÁ ÙkFÍt[V¡ÿ1ò?L ¢VçâdµÃ3ï ¾ì/p„IËÑ ­e';(Úèôû[(ûÔ÷ƒúgöÒ¼è¹ MygÜ  Êb0u;iì¥êqOùû!ÇíšY°q±ck‹6\U8ÛhÚhÞ—#“¤£ŸøËbÊ){ùIö ütåAÚöëÌ7|ÅROê{旤ܫzE¯»¡l†<´œ|BјaadðV뽌ƒç pù)Æ…çç°«{ÖsÇ®ÜéhµÅ‰vØlt†òû‘b ÊïNç¶,‰z½Ãnçæî]¶:õ¾W¶´B½Þ–U=õ˃#…cç‡I@åäflÑ~°c;RÖA·` Åš/‰«¯Þ üôHHü6n%MÈ T˜T0§ö14ë Ô¬°]á—n±q°yŠ—Þ¢r÷J Ù‰}aj¶Èï|+Lg½·YôÿÈÀ¯Ò¹ŸsÞãuHÛ$nSó'„!¶øV†±i±./^4{ïêï¨K©œ¨³@M3dýÑ€„p7a(lÜ÷8,,°ìi0 e4¢-L½ŠÓ¦€4D°a´¥.£kgÅÊ[òâ…w¥ãµ€¶®¸-F®(6:V’ц1áfü@•ð05ªS ˺¢²6uDâ§µ r½#ÜÇQEÙ2ˆ¤k0]Ò Zs x¨S§<0êÀcwC½_uáWñŒÅÃÙÚ¶oã0&x²b ÔHŒº, ¦ägb?ˆï Æhà{®‘ĺ§6ý;a7›‹ûîæñ1¯Ò^žyׄÁ‘ï_2NZœ˜ÅÏÃzã ÒjG^dådÒ¹¼Xú„Í.ØÂï”ÏŠ¦­¸LXX_ ì«ÛÇЪj a9!‚‹e¥× c‚»k5qo½²c–2t$\4;bF•4WÚ ¢Ê’«2°‚sÔïyD](ÐÜw‘ÈãUÏbSE|‰õÌɪik.lkŸû­èç‹…‚Ÿñ€R½ð¼äÒ2Eû˜=(äÇ2¶Õ9±¼MDq·IRYÕ#f#­&éÄüt‡†ýe Ƕ¨"Øâ8 =«Ÿž‡P‹Ô",Ò²?¾"…qåmÚf¤ë7hD‰7“ÙSnñ¢SD̦zÔèo¢{ë7Ú7¦êvƒ÷¸CŒ1ž¡'ÓÖ¦j§»q«‰¢ø[à9šmâ[œ]¿5åÉ·|£* ¬‡Á“fŒšm$ÁYŹC ¯(a¸lWΦեÒúâ©À‰õáÖ²÷›¨Øê.«ARwžÅmvnï`±ÇLKëû³½Ii‹«—ZÚÇÀËþVœ¥N3ȹÕVÏ>%‚½KŽ;%Ò$0Flwût‡ÛktÌBîtT©.“‘ߨc>ÔœMÑö'šÈ:0°JŸÝ[>µJ5ÄXtÆO(Ú] ÖXF¢§$ÏGìHˆÂ’8Ðè˜Pµ­L”Ë>RÆÇ\÷¾îHfvד{±¯’3 Â‰´ò*2™ÇÍÇ9ÖøÖ+Ã0Æã+lG¹»æ(n¡@ˆ¶¢?­=׫•Æl Ìpý¾ß¶ækXßAZЂÞï áj24&iU—•õ#³ÂÄ(ÚÕëír½(;¥=b{Œ¢ï/" ˜&º$ÛFvoèjÙpšÛ{@óªÏ¥r X±‰†g>ψk™™ßGçC¦¢óú’QÊÁã/Í:טÂÒ}U«)G¬ö²¨½¦³³×4A¨ÄV Èî¹æ+OÍÁôÒÌ›ÒÌ%©è¥VoŸià¹yþËK;µ@¤hňDHÌìHK¤?±žs,ϸ%E ÉÚÅÉŠr¿Ä1^¼ ´NȡϠR{ÔÍ{úºø"­Èa3úƒiyžCt°¢2¡½íNC'Ts )¿;À´sÖtÉJgyæÿ£T@ÿÆ»3 Ÿÿ–¢üìV¿µQ#ñ#Ìÿ3‡¡Ÿê[¨|ÀDçå³Ô·þ9Æ üÖýÖFgÆnõ·ü-´ñ•ƒK]tZ.:qÆô¹YªY ©uô˜¬7[cÌø¶ƒùÆY&«lkãn½}{q½{q=îÇ-ÊßÅ>›÷ÝÖxÇ7>êGêo¹×zÔ¹ïëwwø¿oÙ^¿Ó­C¹Ì·,ézì=ÚŠÇݸ7$ÔÊ/ãÌ>p»Û'ã½íÚ´ "æ[þ[>@ëߪPi%Ì¿dmÓ·èìÏ—ç”ý½ºðò[žK_ù/©ØÿÃ寚ÜJä CÐ5´Œ¥Qõ@Õçþ_áÙŸ/ÎÿÈoXÑ3ü–ù–ØÅeJ—ŽŽ—°èùê?Ëç”ê´Ly7ü*fnGmçe;ǤÔë ´]ü§¾ô‚úÇðÌû#ïgàwNvÓu¬[qZdÅ:>N_ºÖñÊu›ƒSÈuøiÒ ß° [áS– ù/-€tïZ«²Dz—0^óÁ§­?k¾Í.;‹oó5ºˆnŒ´%â€"qm*ø— ‰Eâ@8Ê÷˜f6¯©5+Ô­“d™Á4E82 -ŽæMšÚª'y€ Gu½wž&ûDû²û™Æm£ 7êT6H>B‘|ƒ2‰*5'…i"Cøñ-Z(lä(:: ›$1½ä¸Dq4EÕë¾=užP;³é«EØ„qÒjT¾}½º9u5‰ßãxH1½Šiš=v“b“T'ÉIoŠNŒ¨ŒÅ*µšøÊé…ò7­½UR¦0ÂÈâ…¬M>Žû}Œl’»lÕûïÉ(­GëiÉåÊ™·’U¶jpŽÁ{Òd… ‡ ø]‘þYlWK¢nd%E©p}añlºRÈcò lUUMŸšš\§–ÔrœÒù<»aÇÌUìt€Ê¨œK˜ÀIbÈ¡->CŽåÇl…jJ„~S °Prê<@—öýqÚ!€/.ÑÔç`Ê—äѱs$ ¹ÉƒîîVm_°ÑzËÇCà¾?>ñ&2/¶Ü¯8÷û)ƒ dî Ðjãg 0†A8ñ>ÂÚŒM:~[bÛ d»wðA÷ |üazGq¯ÓÄ4NnÄŽvlœoó·Û²F!ƒò¸¥=ö6n[FÚ]!¡ZBüÜ»å«ûh —kÁ™ †Ís6r<8zÊ5{†£ZS ]QùçYßRÑÙƒ@:臠Çsų­Ï|4š$Áh‰1Kˆ3qV`ÉãàÙ}­=  ôõñûwîWnP-þJï{í÷b'Å›”Ÿ$J%7„;ËñOiËÿ–8\iäë°ìD¦JPÖ墲£úM[¦"<ÒÔÚ°š*ŸaNƒ29VŒ(G z0ñáÐÚ £cô ØB¾òX_b `®zýzû‚úÅà§”“ (Bsn+¾Œ»]¤­Aôž7ë­VT¿¸é¥½|—ºo;Ý̤¡ch­ßÛ¤0‡8" ß{(îDïéß„kˆgÜØŽðÏ› z¡­7ý/ þ(þq‡d/‘Ô³äž —[Ó\ÒIBŠé«Þã• ý s=©D{*n¹Cª1¡H«u$àĽõf‘m´ï/U£Xñ GhdQi±‰mÀï[Nf&°ƒy;ë[rçùÔµgñ´»-È0¥s2ɦ71SÙ ïò™PÆ“ §¡ÛlÄoA.' ’ð#¥µƒ »•÷aì® Hí]7@ EGó¨œùK¼Ò=ÈQê-¢`DÝÈ“‰eN²“ÆÐú§œâX ²xeäKÔ0plä΃ÉÔ:÷},˜DáA%ú@ |ñväu΀K}}U¨.• •Ey)ˆ9u2†= Õè{ÂkèÝ/Pœîëë«°TÀ»__.PS÷ïÊ K<À­\óòm§Ñ¼lŠy…J›Úû´wPïõ³ª®G{I†ªH¢ö³Ïýy-+.Ï“¦¸æB:›$½olÜ/‘Q¤”=”¨»sÛÄù×>-¡¥,¢EÇ‚Ëz³…JX aÀõF£â,Hèà"Yr %½,±n9&ñ·c‘åýÕ€Ï'šç99ÓŸc?ýkTU’ mŸö œ ‡!ø#’|ÀÛUcÆýìÇ‹ Œ—Ïc’”-£œÕM§)#­Ž?G£Äf&¹‹nøŸÎ-°)Zß¾¯ta<ž„>¬’ø “Aì#܇-„=Êj%z(£™ÇþÙ¢üeËãë~ÿ®ìU× å¥¥E4q¶ŽjôfW6ž9[œ›q6ã÷®êmKySŠTÎÏuŽ8>©ÞƒÀz DMáZÉUb×–˜æáJ[‹ü……:ÉXÓÓ-ôoK½p¡þA´p\Ù×îfó™ çÚ™ø +q­§]…tÅw”6,¦ßê¾ ªÞ 8¿UôMåšeÉT–QUh‰Jþk+`S»3D®æPj íÞoÅ¿ðÆ~à+˜Ž3Ö‡ R†1wXŠî³“äN›¹²§¹añU‚n²°Êa^ç’ÜPÚ“V²XŠܦ|Ù´ eSJö‰OR§9=í_j²–=nÏÝM+7;B´æ7õÐY–R~a3º>S©j$¶Ðül¥+­ˆ4g‰wçÕgÞeÒ‰’JkYõ‚”—©Ìx•Ô°+-*~tK¤ôd•ä™°—Ì*Ξ+ò´º ºk¨MaßEüÍØÏb‘tLlÊ–€à³K1»¥¹,>ÇfXOJâ.D0à¯Vª'ØŽúå!W¸¢ë¢ŠâìvÒÙbà½ë¤´ô¢L'\Þ«80’nCE™=‰¤´}}fî8KiØãÔ¹ÈíÙ&Lj¾žÔFéÝ|ëSª=XbÑiñ0p„NèöVØL¤v©)‹H:BôðÈþNCt>G÷{ø«s”SÉmäørÉ8°›Ÿ‘8Ñ.w– $£Îâú* ú G< eŽÝ£þÕyF¨s}·U39sØU£p®g2â¸:¶Í,i·7(n¯£è–ÎÐŽstâ;‰‚U3)ÛHLŽj¥ª!B}{…J˜ ŽR` Ѻ1#Ë ë"r—ð™ÀúmàŽ˜î¡*Ö.!|´§÷X®ƒ¶B«¬‡ª ÔÂÔHÿB0 ®_7È o‹9öÐE6P@ [£Œ@5íLÅþHìmEë¶g-”£ÐÚvƒìïžEÛI‡ó1ºMx 7+<.Øac2N¶‰Á½Œç r4úÂUÞd`ñfA#;!vû€û¹ ´œJ%–ÒîÙ}۸˗½K1_QУ’¼ØÐSãd§î™–%ÜÜ.Ù + r9F¯¶X=¶‹ÑBK§‹!92Ú0bDˆ=$™—ªGWø 8¦ÈÉYaYBà¥ú”ò”ÙYÐÐìTQóè—1º]ÚÍÙUfS³Ç÷a>ý-ô¿UÓ/Æ¿ùãoÕoÕ|³â(Q‰ òÍ…hYA|§…3/ÀÄ XeÀÍõM€)¾p4¨iRØ“ŽöγÐÿAð¦±3p˜_Ü”Ÿ+ËM(%SY Z1L»âñ5„0ýT;´uïˆÈ¿xaÊHœÑù›ää9‹”à!oýj²$M¼©SDöçk%`„Ë"â ¡†3?üVòdŠÎP,Q‚Áfì¯íÔ´<"€°cÜÐDG§Ö²å6ê˜xŒJ2‘>b¥ k&šŒÅpmÓ±$äX!Wo ë=‡]ä/ăqLß}GlEAh˜`ÎAïr¹Ä÷çvŽG¦æ’-ô°ÞKµ;ý‚>*ýô1"ºRIÂ_@ ë®]ä4àËqÒW5\¡œt5 RÎÕËœrŒ?«|”5o<ûjFz³›šùÄ ]’H#Ž’Øqô‹cêç[]%tÓ±Ù(´=°¤ÃoÂߓւÍbé^jë>µ 3£OÅâ ÝvU  4¼B1ƒÌq´Å×elÚêY–à©çÄ4&"‹nÚ¬KÝoÂdHZt†øÈsüzóu¶}Zþ&ßMbôÏÄb”øã\§v.„£Mâêóbø¸}ek oýHy«Œ¤7籸1V¥:ÚV%Ÿ¢c=ÓyñŠ+Bœtá´ý61Ü ës)"È&¥B!Ъl¤Z•¤›|œtƒO^c¨+^5Æt!(rÒtÃT?ÊÕˆóþÌÒRuVà[äÞùO—ÄSH¾³r°¤ÙÿKŽ&z€>¿=Øë÷ïDaÖâêÂÌÇßg~ìŒ.í½m"Ôv.ûÔêÉÉ¡ç6—G×Ýg§¨¬S9V6ßV¿xó؆MÊõ+ç·m^¥mkƒ'ºá\XÀÔ¢€.8í¢7lö¯7»q6¼ ‹Å~b([úééA¢j–„A©*(ÿcsš“—Zn@ùN{Tv'eÑhΉܰ\vi$>7—»@Cɘý;w¨'ÔÄDkå´¦b€ðÍF³Jsò̇°ºeyL¥C¥e²‹Ñðá<´Êðy"ñîD¸Âpd¹ä H¡î“ ú£…2#þH‘ë «íåc7üì¢Nð°@Èæ—”y*„½ôúsueo‹*§Y¡ïutɘ²æŠÉn³—öÊÅÄW!Ú–WùT—ÎÓn|Jxp 'C­w ’.žtÜÔÊkÑ>%[ê|˜€!?‡£JK~= ‚SªÇÒ2Æ`¡×®½íÞcÅ´.W;³‘þ…S'õÃT\ôX›qg$Bœsì.'\²­éˆ ƒ-ï­[m€c̲'Ù˜$žÝ æJ~N¥Å 0öÖ›Y{H u¶œÚ#Vj—ì÷j•h[-]C|‹›±‰I½¥µìnĉ-_‡!Vð‘ƒÈŸ­s}‘OOd,u,[sU³ƒÇvVïÜÔÎYñ¼¢¿Åg¥ãæ£mžj»ÞÚë‘(ÁjäüÓ# ÊÞ•…Åæ0ÇûP øùìÍç¶Þoížugo8ê6Ä4•ÌÆ­–çŒÌûe«3 ÏØy€ÃÙHa0£ìó¬Â/²¢*¼KºØË^“6®Áq>lÒÖt¼þù£ ôÌg¡wP@·¿ñ(á`u &3]ƒ.¸‡D帵 bî3c¶¡ °4I@ækJ¼hx$I¶É¯J@g‹©¾!ZÜqœrÁ‹"h+Ÿ¡Aíº”U£}ý• b‡chN²‘€.Uø«ª|ÅOh†w šÅ…§s#Jì…õ±rÚ!o.´»ïÊõÆÑÛuÜu÷0’N%:ù@Œ™ìp7[çU½ãFBJÈ…xDì »üózmÀÅÇE?P¯iyΫîý?ðò%ñQ´‰õ9ÂÚ¿ãàÒü§Ÿ ½j¶X.·»Ðòæ„ë;›VøÇ"X/v2¸ÑTííø¿[V þÅóôDZeÔ-ß%I²רñ óseó=˜ˆ¬IµK[]aB^ïrägç¿eD¶¡- º=;‡çÒKH(¼o3= §Â2†ˆláùUqX;D“ò*R'2ÀÁ9PáŽë‘㢡²¯ãh²Ö½)_bb¨J €Q‚gíä† ‘hïÏ,Šo:mûj–Û QÝNº-O'ÑmµŸe%e³Êé; ªÇ =8J‘Šů¤=\ãѬ9<„ú &N"ì‡b¯I Eä•‹¾Üâ¡B†Í1ï?šüvÜ»ükØs˦ޖEy´×—ÔÅœA¸_À›«¨àäS°â­×÷$Ü£p‚g Óíi?BEƒ!Ñ’‘-Ÿ¬‰ŠÝŸ5â­Î°]6"\Ѩøô®løUxÂ|®ÍòÁ+díöÛ&·Ä,ßûû¾õ‚ZS¼ 5eÞIƒ¿’9^óo³¤vRA¨l?%âòq“¬lÞSyåÅ(¤êpsCHÄ$ XجdÄÖ( ^~4î»tqƒ^UÌz”uý‘÷˜0ç勤òzŸ0:BµPÖqÂõKò¬jJËæ'kl€¦Ž…ú÷™©E©àU¹I\±ÙT*ôéâûhõŒxp»EÓeq*æ§NgF–+ü/Z[%=Lµè§Ch–Âð…¶Dø˜¶¬£œn@¨/î0õRb‰¦¦‰{÷XŒèÅæx8>.ˆ&#¢™˜·BlÍž­ļ2¢XF©š¢«Ñù’(ÎJ‰¸¤uÍS÷Ûý¸‹·ÚÑ꡽:îs™!õM¨Q î,1 xœÂ3iC(å 5ôä¹çïwù\8 @IîÚÌ(Ëo¼ÚŠmeŒýš°„<,T¡§Õb¹˜Æ`·Íà”‚%©;L Šä<i©þÎZ`ï¼sV @L~l3ù:åú¢hûrÊn ynÓ·J[(}²æIó+TÐ*™q®,„>¤prgžÏ¢œOBÄœq†þÂZBš¬m¼9£¾2v˜¥ ©kS1ep!A4øWÚ&îCÉÿ½k‚n>uëw¤èiË]Êdðþ÷Š޹ÉA$rÛ™§šF9ø<´úB÷€‰JbK·(˜×ñѧßiûf¥"ÐsŒEg¯Ž]Ç Ž† ˜ '!=(”¤v3jh^jL&¥J³2êÒhh±4¸¼ˆöØêÿÑè;yáJÖb×öÛ—Í6…ÑÔ¤¬ QÑ6ʺ€V±€)ÚÈ[Mx‹D£uö3è:O›Öðt‚b`µèÏ¢<™tZA¸54ÿÕ»?q ܑݭ@ÑHü‚'ĺI KR¹‘‡‘¦ÑåAüR[Þs6b · Rßþ ßã3KzObì BPœÍj±ÍIXHì HÀˆìâ/jq]ÕÔH» 3‡\¹ hÅJ¡‚L¯_F»Åó”— AJZ²q­-nYÓjmÌ'¤ihʦÊð?xkqC±Í?!=ý޲ã x"w nÌ&9&' …ºyš1‰B3‚S!.ôù žÄßÖGîfH³Í m È—@¿YNAù¬°l*¯‚('Áåh- ÌD¥î¶ìvFÊà{ágëaN >Èa:WÎK4Êx&þÌI'sÈ_X˜Û,me'#$%¬ÊÃ'ÚØú0+k3LÊš—ÝúmŒáÂÖrôsƒ‚ý…ðH{„?x“ÂÂÄM” mÒ‘¹Å¬JknÃþÓm˜ÆB6ËøÔl7:ÃñØ”¨¢¾¶O¨Üæ†Ý&œuŒЏ°Ž¾ d´»y|\ܤ¯ê½\€/P¡˜ ¯8¥÷’^â:bâœ[ÌåÔ#åË ¼ML¯aniɧ“R Õ­áÀ¾5tóÀÄ'´˜7OvžžIøæÿìSp;/ãk¾µoð½?v:Æ¡b)®ÆcÙèÜ·ñZ}³Õ„á¡béÓ´Á +,$ ¡u*öõå]7(ñ‘˜KÌ×Îà¶Ð膊òi?P|8ÂW"ò«n—°—º_žŠËY}ô’ΰTzûT²6ÙÀg®…1‚ÛñŸøújoª':S¶.ŒÑ7(I— b;ä0µÚ ·ú„h:ÚÈÁŸ£¤–)}ãeR¦7.,HüªMìˆÏëVXƒ:tR¼§1ŸtîÈÅz*PL|Um)¬üH‰ÐÑß·~áűԢÎC‹CO^t;­–êG?‘Ê—[øüK-è˜G B+‘‰Yrú e52Ñc6ÚVr´d»²\#`&xîè䉞›;Ïæ‚Þ}8wÈH mQWü t¢sW²Ö/@ç£Ü—n|=J•C2Må0Ä´³I`áµáTpä–2äP +`3æoTa¥§6?rÀær"`0¥õR#¢Ý0ϸ•*Ž'³ÌiQMŽw¬5õCy×)P¹lŽ€Ñ“Ô$d‹+¿)(1¾ÄûrE¡ äkÜ•h+Ka™ØV¢«à@Â&óŽ!¹ßÊ8ó„ê™ÄDÁ7:qï]§_k4˜’(’x«_ítº'ˆ¥k@âV«÷âÅG•hË2Àá!ØZ›ÍGÄ…ÑP˜Y ¨‹ÃšU G¨kMôP˜&Îz÷Q¿[¿è÷ô8ß‹È3ûÈ‘c)G¨‘ºBO"ÊzÿÖñXn²²Ô†nܪ£•0%¼´_ м! éœ»k5k×&ÿÈA£šÕÃd óÕ̃O}M×côV³ž”PÁÈlKÙùZ {2ØÀa›åò$¶Ïß@?Î…ÊýöEë¾!ñï÷Ûºq”Bf„MŽmë>Ü ž«Gvz`ÙžÛPæ6àÉ á]Å®ÉÔ¸êì)žÚåçæî²$Ä0»e@c"(?JSì©xÒ—˜(Ô‰NCE-š úPzÔÙ‘”僀Ù4µÙøƒµ§Á& 9÷_¡Õèù4nÒ¿Úâp‡=õ ÓÌöm"Õ£•›Lý™¢ íÕŽåè8;°­a;.»>]_G»*©Äj;Sbº­wîB)Íbê+ctâª8«.rWåYD–3¿Þ»G‰ÝÓΊ»9*0cØÒ¦°¼Ü[ì.a[nê¬T ''¡Þ.u•“ Ïh½,䯩)­b‚€zCEëÅ,ž&«ËsaäEõƸÇš^|8ã p@ügk›ãR‰‰é™Q‡§b + ª¿!Æè'iŒ*_Ù“'[¬§ŒZL{!1à§¹p¶\Ÿ g€® jLÒa_Y÷Äöé·Ï={:äK_‚¹Á&Ål7e*ýŽÇøØËÄié8ö=ZFš-8 ïj‹—\°.l (á„"g>27ÓÕ´gqÆžøàW)VpÕ³Øn¼Æ°*ž—gòК½Kòy»ß®€kŽ¥eŽVý¬I\[lpT8MÜPïTË¥b5” OØÔ‹ÔHYš|ñ€LZ@w¶’£ÙcaÝ2ãrl[®Wc›g%âOÛÏ_”%rÚü=e þivþ#MCáù q_ó'Œç~b^[‚Ô”z¡ˆ’š ^cÓ`4;§!²2°êv¶-¾Îbz7+S5á‹GJ¾¡£(÷ýƆAOÀߨb,Ú8%7ñ^D°\˜«ß6ìßÒú@aQÚãx3hÏLS°ˆðQzH0åWò,ü#õGŠ›Hî§Š¹µ\q ʰx³s÷@©›R¥B±¤j§'{ïŽsýQ?•¦`jù<÷vßD ÊSŠ ?ݺ¯·R¨Ço÷âF sŒwa‰âÔÛý“T§›Ú=ÚX/<ãÅõàxoFZ\ xKÁIm£¼àkÁ§ýwÐÎ1¬ž’ºÃ,w;w˜S­L¥ø|þ¬Cað×% €¿£ŸX×—O‹–m{5×îóŠÃèÏŽŽUO_ùÜ_ @—ŒÖ¯ðŽ u»lÛÊã›ãú0~›æ=u´HϨÛöânî¶×D†2Ÿf.q¬A?ï[ÑÞéþÂp•ȧóJº{¾æ“°´ÌrÀÄæF¨‡A¨ÞǪí1IŒz0uÉÙ(†ÖºŸ èû4 &Ç<ÿyé{iø(3ç]öáÙ·#êpâçâé‚$þëÓü/¥êVôÙ=£0| V­§-ôѸIRßêI]“ˆ‰é,þó¸¶\ Båêöañ2dÛJwW"à\J¥/.9žŸÚ0$GKf1 eCœÔvÙê¨+¦Ìû à^:Ãôƒ"[ô/°Í×€Ô•“¨ój2¹„܉x¬ï÷ “@’)Sò¡„n¯K„(`³µÎ> Kôªg=÷yÛ¹’×¶ñ¢ èI6Ù‡fïm)4çóúäœÄí_Ö}›6»Ÿ±§ÈŸäxoêøJ‰—!­8׬&3^—§Ò]_'¥‰à&|"Q‚Ô6ϧç¼Íæd¯#‰ÀúÎ<ó+û;«À lý=}´‚fÐF²ÏHÜf€ZŽnBŸ¾[+eD2QYÛšÏ}§2µág*O›ùÏNû¹ÏE^Iôje0iMêó¤³&àfh૦m}ûœ,î t ®ƒïŒ‹š¾°©þ¤RŸ'®5ƒ–í‚Ñ\0dÔ‘þÒ’sšÿʘ8uqË Í–ª/ ¯´re:•§‡¹ÅƒÖ1À:r鈞lAá EF(±þðŠ•C߉ՒN¨O·Ã'‰L©Æv*×/¿+¸kñ\×¶ÔgßÏ®Ï9ˆ%ý*ž‹| ;.Ia(› {y Ļʜn¬®ÇÕ5_õrÞ€èÅ•ò%`2).íFŒ–ÃõÞ1q¼óˆ+ƒ¢4°‘âÓ­¸^$"…4`¼K¬Ä—NUÏhUÑÅRiR½àJì2‘M…-zeE6@›D, ‹•«P½­P‰R÷Ë4{x[5Ý ®4Gù ±dúòe:Î\!JàOLõšÁµýQЦm¨Ó °™dù%|wENe~Z44ÓÚ–O”dóÿÌJ—hjI|ÛU&ù®b¤ý_hUð(K7ëJíÔðÔ;Bovç1QµS÷Í,9°XßO^ç)»d’à„2¤©J%'0–ínƒ!ë:u^&Ó8_…SšRž_žO0åq%Fd|Ån4¡Õ—€q"[`½+Û<éÑ”öê ð@²ù–J’¹nÍëć3`Tâhí«Yý'Î.«°+´m^Ù³vÖ;ÿWö–êÄ—¾Zеžóößš½gµA®âZ“û÷>f'±@agÙP!ƒ&–$+Î È,ì!Hê„‹9’¼Y$ Wãòì™8‘R @R‘À@š/ÉK®ÙÆðÎbxßd®ù;J¬\à‡KÞ {Ö„@Œtð…Â|8Y­•rM®}d\Or-‘IŽs _‰û5Ú”oºç @oQYþjù‡f µ¶bTëôÊðû¿K-£pqß{SBÒ…/‰ø šK›Ý"Ü[†fx™-® †mL{Ð>Uõ‚'MØ/0‘h«ì•I(èÒÃB)FËE #­úC¹Oï' ª1—êê Žç¯¥˜Èq'žU ¾4s+|ó“&%w9 LN¼ÈùP 듌§îP6±M:RТyãËJL†û··q£ x ½0ëWu±^Mð“V,ôdVŠgü¯SkÝÆt±É’7­câÉ5y/^Xe§?¾âft{4K V\ƒ«0}™^7/®1—HÐ%´Ñ^ŽáÊFTñ¢jÝx5J«2ŸÂÔm¥Ûˆ™÷äë;@¨ñxÁífýæã$í›aò ¿$¹àtBð]QV´nUÅX›B¼ÒïÎÉ|'ú¡þƒéÎÌU©4,‡ ¾á;»¢Ú¢iMï`8µ«PQÇD1“r>B‹ƒä=bÅ^²ÉÔQRû”déé4ý½'Ö€ßbp®œø×Và SŠ'žåK€züÎÆ¦âš#1Ì¡óéýÝóšá!õžÚŽ:‡°w%0=–mLOª3×Öc!=eñ‡{¯Âu ÑÈñ%Q‚éQëÑH‚§.»õ+¨YÑx{êbz>ˆ7æ€xãWA|Ž ÜÏ}uzðåä¼5‡9ãШå?½sß…¢ÿ%Ðq>þ;Àóó½:¶é Öo(n1œµ’ %+9¾ñwޝpÉNï‚)‡SPᬪèܵQ(ý¨G½™;Ïn•ÙÿõƒŸWþ"•¿øþ+7Ðb{ Màœ1¼Ô4¹P_ÑŠ;Ÿèöôf¾8vX/„®Í!kûÒÀP£ Ôª_ج_7î5Q–ñ‚‹œbƒ§zª[ÚسÎJÊ `×~ÚR¡È¼Y5I1‡b-KèÕ ŽZûGXS}~ßïìQÐz”+¥[²l£’«ëNOÿî6E \“λWöâ  W{·îP0£·7rÑI Hxä«L~Ò· Å>ð+ø-ÆOÅFt˜¡iaÓâƒnÜ 2·¦Äa\ø¬Yx¿r¡µ[ØÄÓ_öj,,¤orVﬕó*Ð2wX¶{þB[ÇNÇ¢ØïœJƒÈþ’•ºÉññø&G‹Œ?dÛªæ¥3‰,—zl$oðuéné"lÜ Þ36 Žå‚,4o¯òM?Áô»õ»ôEú÷—æ u âX°‡¢ÛâP_)–S|Xñ^½ÌÃ'¯~ç;Gã6å´ž°2 (ª‚[Å¥}uQ>]A jàžî‚Ýèȇhú%ßmNü„^Ô©¨ŒÑ{ÖAvª%ß&ÚÜï}âu³Â+ÙCy2ŽW<ÎŒñxmï¬@;výôrþ ¬?ý‚-ÉÔ7lGöÓÄÜLkogUµçY°¦Pp†Wp;.$[äCE~ÓáüQ &}f4ÙJ„faaŸ;Ál0~Ú•[X€˜Q’g³Š²'qšýŸ¯ÒOWܬõÌ1§…\Þ¨_ãqzá‚-ÔBï\°VÒ_U¡ùòÌÌý®íq² šé%Ëz^0L–¡êM}ŒÔ¤7UµuÛSuaׂöTÝöг£Lo¿@¾¿èwºaxL’± ¨Ö(ô`ý”’Uzíç?„ÁÂÈ`ö€ä¨:]ȵl @I5 AÞ媼rõ²¥ÌLè’œ­W.PËw›náz‡.â÷2ß+l¥2’“{˜ú=g~7xW"ßÒ·áÿ‡Ú2 qÞ„òf279þÉNMlYà]»Dµ K™’¿Y` îz·°jÙF³~…ð‡;肪5{„rÉ6™Z¡D(,àÝÛh!ò‡ÿô#üaŧD­ªZZ ¾jw;µ½gíóÙ`¨‹œ(I ‰×— ¿Ë‹Œ•8º³Èóst™h2N¬ó³ñwUw!n2í0mõ¸'Ýö«—X–;u%Ⱥ Ï´mçfÚ¦²).ç¡a„$«\Ð~9ÿgü›UÌ$¤Ì¶Éç’ÛÎÅ‚¸Ûàî'˜ Õ'S³6æȨ6ÛÈ‚+ŃgOT7ê(þ"ÞKi§í0ÌÏ”µ 3ûv¡³JúB1fuK08ãJóRËFŒáa<ô$&—¹:ž‰æ‹ͳâyÿ)ãI•˜^ÀD O¯Q5dŽÿW¹p×g¿œÅV(z´Ÿ»ž1ÏmÓªµœbc_/Îk³riÆ¥‚_þ´ƒäòª:»7‰‚8qå}¹Ažwoëè‰ÓêºÛ6H½@ߢ¹3O9³/àL©š—ç\Û<¥QDÛ…—Ú³` ¨}m’”4®òŸâÄ1r–A±¹ú%ÚMýã3åA"¼ýåL†þr9ź_&øu3­Ÿóvó8G¿ÏœNò®v¶"àRÛg‘bÇ1p"A <Ÿû” Y+àŸ®X]íªÀ,½AË‹WstêÔŠƒË„ £ãz¨ÜQjséAAŸ% (íÛ•†šáÂÒ¹Yþô¼MÓ/Ù ‘Í1S9ÀtëWW ¼³üÜâYNnIîZ{# ÄèH—!Âw˜ˆÃng¤Ží¸v‹„mC@嬗ˆ„[¿ç,‰ÿt“râ–9óFß”ë¹uháБ„w#ëØëT¨ƒÉ<Ñæ³Ê)¦F4ØÈ(ˆé÷Å}·×é¢,í¡{ƒç–Mh]™ñ²‚DËMJ®<›Ìºeqtx §=ö7°ŒìÛW+÷ëW.J»Å˜E?Xø=œ¿SA;Ô³ %ꆫ‹tÕß90ƼS¥_ ´OÁ² ‹Aû‹óZãÉn‹3,å[aÓv>‹ƒnpwŽv‰{!ó,në/WŠVà+ëÇÁ}?6»ýûz‹"?ֻ͸cí]7/ûoâëæÁ"Œ<¢k<‰h*­Q…t }œÕ Ìm Ÿ"HÑ‹éÝS$Þ‰ ¨•l Qx ôô²tlú…¢—–z¯§A›_Ùš½žoz9±¯Q$ÔõÕ³J×2ó9݈,Ï&fLO·¦ õ 0qßÄ4˳nSÜ+Õµ&ªÌ%X e Ívò$m_öç§ ´üJûóqä&¦WN)ôiBH¼oæ´¿UQÁŪ…ò­GÙ €åØ-§Ý£Ù´ÆMß*ª%¨6{£±­y§°löxíïaZ{ ßÎRÌ¢¿p^9ð”½" | %·qКß,s”ÉV1ÔÔŒFH›|ú•r>¡'Ç–õÍB; #ÒâÓðXÕIrò·6”cÄ]gÝn­óá'ÁâÅ‹©QÌîÉ4Ï8ÞUN?#°=ÛÑÿgz”J›ÂÓÒœzâÔÌAr?cjÑËç2¸ âJ>éË£:pXê)«~Q0wOTG¨Žz¡BÄ[SÒ?Iƒòª`]nI“V5ýJ5:™ƒ©Q9ƦÝ?’ Då’_2L€ý]ºuoÓßðë9£â+Ó:ÏÈï°‰Röå+khòZyâûë—¦yz-¿Ãk|{óÒ›¼–¯o”ro`¶<4à@hxŠ%¸œqÙ÷»L.o±`…§i’J9©G=Q ÒUIŽ«Ê—hNp¨~¨š|tíŠ1\þNôdåÖxë]9Ú!ñrÔÐlžA rÄæ°£Ÿèµô«Ë¦ Ä„ZÂÕ¸UõP•MÁÇúѾlèá´¨ÌWeÒB²ªE`p5UÌaü¬ÍŸa1ñ]øwšÕ¨ü¤Y…O®a=-NƬg+p1ˆp”е³0膳N¨æ¥„ã¤eúa=Ý’1 ûŒ} ¾æá¥ªô«Ëœ¤>Ÿõ?½Ô•@Mô G“?‡Wº‡ÞTꬪøé•®D¾šÀ €˜FqzøB ÀúšTÝÎ72U|që~£æ4±ï,š™#óc>Íd&žó¤óŽÕ¥ÆÔnäÛ¬7Õe4ã/npœU—YwÖý©—Öôz/^Äøáõ.›X”ÛäKgöípA– h·Z#M›ž±»/ècÕu.¹%„äÊzŒTMÖd¶ÙAÒx"a5aXë_b¦E kq¦ÊFaæmÌ%fyùËíW.ÕMØõ/°½g—çføì,œ©rÎ8cie*:ià”Ó ÅÌ7|¥1ó•µôP³êI.Nø¦Ý-Swén©º,OóÝþyÅÈ’ËÔ2¹nað¾µÑÌn 9[k;¦ì;^q±[n3¾ÝK ¨ é…4i±ŒÖã1•©V–p ߺŒ)QñýW†áw'G²¤tNciâJ‹‰jÅ©éCô¤ lmßlÃ!m¦ÓœÁSÈ»÷¨ßa(æ2¸îIP—³Iã˜)Û¹Aø%ÁU˜Ž1{RøU*g‹êz™­—qÉ[ñ»šÌõÏ-k Î,½ë”M ¯ iW,Û'mr¤ J\RCß<7õͳ;7•ëEI3Ós–£¨½%Ê MÉHS~²CˆØAKìUš¦F™Khch3j—&†Ãª]…SMh@KÐ?î˜V±ÉÔðR _€?‹ý¶ÿ“úÅi]¨ÓšÅÄ™½yKeƒË ­$eÝìÍ[è”c‚§ôk¹9‘ö§RìèÙ¨ÙsŒÑþ't6œÓYûoάý¿2³ößœÙ/u6gfÂAhŸˆ[Bê"¬bņºD]§VŠ£ùëB¨ôeJIgÜÖlLMâ´”Ÿ&Á}sÚði¦‰e¢0ˆgÙ_Šu¥Íò»ˆZ"ÉÈR60OƒwöÈ™pøC-Hès–†G4ƒ„Ò Alj+ËÅvù‡f^›3,²´‰ãtö½òT§åeùyE6¾cv»ÜóÐûaº{vóõ3éùUaI³±Èžî 0쳂±FÝ%ûû\À¶ßè¸Þ¾Æï3‘–;¦?*ÀFìvÔÛ¹Ê ¿tײgë™-˜ü§±úššÝOSI4wÏBý]ŸÝýôzäú¹ë‘ëŸ_\»×#wS×#-º¹›u=r¥¯GîìÃÔ2W#wÎ1Äk‘ëþânþµÈ]â€ÝýäZäv~³ÖµÈ{ªg4j_‹˜vdWÍEÈUpûâÅ g-¹eœp3rïO*ÿiù{.á¼¢RÅëì¾’H9¬l"“Ô'1«¡ˆï³HQ¢ªœîtgÞJ%¨×Ü}šˆæéZ“— (G:ëˆÖKFÙQ erçÞOvüÊÝÌ Ú¦/é+ž=z– Ê,~¢«0×s篯©N ~+úcå‚p|•|º:—© ¿zEaV ~9g”, º+߯¶Œ§…Tº" ŽQ5髿ã®oé [7+»#Ýàx|e6¶¾ñž%/&f…IŪ0÷°ªð) Ú“b>-›§À®/TÔ6‰J¡Ø¯g4;1(-†EŒ†D·h‚¤µi€Ó;z”V¡„\Id` 8Ifï‚0Û¨Î"f5iÖÔiPÝÉ=É€ U ÕK, Žù© Bf´—< d»ÿâÅwŠD>µþ[­Œ½Ý¯ÜJ¼ I€HVȶ~õ}pè,ãTOô,+7ÕäT•lïçP›è<)\*)áÇ3Xñ*üaq)? š»…‡iòñcšŠbý1âÄM+ýC>Š¥ßMî>¼ÌvÌN$ÀX¢ï ÃÓIÄúaÙû\)VÑ©‚.…P›3ªZâ/é4uíS”½eb$¼³"A7|%4·g‘ÿ{ûý)ßJÞÑÓ+ÅZû0 èË]‰Ùá_%=Z6úÈH ž °ÛÍþC¹+-'ý8­«Ãø6'¢  Ĺ³à°‹“¹^,<{ëµ *“0‰«¤3¿ë èû“Xí4«ñKªÄkK•HÖüÔ>Z÷X+õÌbÄö1”™¶Á“iÕÃÿ¸0W®º¬S¿M;QÏÕèùÕ¯Àb·ÙPL.aÜþ\{qm´€ Xò½s•wßÃi©¸µ;6?i…×sm~+×9žŠ++O&iÒ—üç¼ÌEx#:ÚE›˜´Òãf›BUòi® üû¸Ïp°Ü¯Ý7iÐßßó3Ip’¿Û8ö¡ÿdkMBMæªâ(MBÕMæRÛM@kíÿ¥–*®"„Í”²N½á¿«ËÎ){Å]ü{†;¿ÎkG™õ¬·ú~I+6b1`ñ«>«®dop?ñçIêšï¢RÀ&•M йEø³š/ó¥B±`ò‹b8·õ6Eñ»ëvPûÙ“ðYÓT–Ïk¿tc¦/|ŒOXHy›aÔyðRq;UÃ6‰°ÞnP(ÂYqQ`Cˆ0Ÿˆø[‘ ªî™!c¬g%+a„Æð·­Gw³ÞÌpíD ˜ÇÁË\ Re ÇÍW«vÞR¼qø~>‘VRȽ¯÷O/ó0 °‹ øìÏžÿñÏj:÷sàýVôüÉo°úâܹ*R‘‘Ù9„œ/‚ïÅIÝò]€”.s¬µp¹P¹Â¦~ÓjAxB­9 =Œ‹”p®øÒfÁÇ q½Ûpì=ó 0ö”r&LÞ&|ÇË;²ÈCÿ Û§\šù1ÁÖA'¼©|çÎí4«wã1ZÐ+8cö›/0>~W…¥ñì.Œ¬ŒGj]êûGØIß²·†h<—¾ » ïW~Ãl/Ör*tóCêÙ;:OfOÿ™ûvÒó3?&“;;X^;p67:aÔÀ$ ‰+˜ ;k-P3‡ëª&{Ý‹J7¾±›)V~„¿¥Ù¼ìÖoã”ÊÍzÙ¢—ê7ûhßÞõ¼<†‰aÜr^^«SoxN:LätÝ.pñU|ZèÎ 0:Î÷ú Þ»è6&© °Û¯‘¯ªXŒ †YùX%ä2Ùi£j>ðY´§†þ‘‘àˆUR ¯0 / ÞóŸ~˜œ¬<Ÿkþ;‘Ðÿ= ý?ѰrSéØ]¨„Ào;›ÀÕ2õA÷à>4Ý}½äÎ-ˆ'F¨{rÜFLj¸/îsÃn³æðj½²‚Ôa3¡÷{¦ŸùÝ{ù-/~÷¡Š ‰ûi 0X8 h±Úæ;>hŒ/±Æ­xX*|ê…v}t‚äS¸,•êÔduæ7˜ÚJÒ+÷Â'd‚ÊÞèÁ ô5‚•µësD0qð_…@Uª…rà¶M§u˜~ÿ⎑YÃcNmYe36°ßÜ,〯Lþðñø “‚û[YÅiÙÎ<>2ÀhþSmÞ>öo[^ÀðŒé5²ER›IÄbj‹¾³6¨wèkÐAVhÜÝ2mP¢PA¯~Yï61J°lØÛ¨_ÜH®áê%é¦AžI¤ñ¨U›»É&rwlî2ý§Fˆî+°wÃN¨‹ž:m:Õåi$.)™×^]†ëõߤ^XQà Ü@ßÐìA©kÜÀ ~*Ì}Êß/ÄjËÍ«"Gí£w LäÃÒ¤¡Ü¢´úéC3híÇEðÃq#wakæ]wKy5^¤[Dž‚&ð0‹[àÚÐ" `”Vé ›ˆed±nàôü(>¿L"–™Y=ËdÏC¿ú­‘IËÁ¿~5}7ÿ‡_U,ì °°è}ãW¢n\¿™  ÈœdjPv«L¡š=ŒVFVŽèÈ’¦Ú¾¯•!€y–²–³si²«.œzavsäU=É.DW÷a/q8îBYº4ºuvwrQ‚¶ 1‰®}…×ͳûóLúŽ'kT4Pèón² Ε³aÒÌD%üëqzÁÙ•TRAQ³båL¨À‚/þ¹O„ ÁW¹9SÓæ›Ê²¶;HûèÚÖMO?D; *ÍÝ|ñB~¤³E´øÏλ‚W±Pø£]&íaþOØwµÝ؈/k…ÿ¼ °Vó±Ù¦×h#@d„@?Ïb³k awÄ^§F¿ø»‹Z“¨hA²†ã]Û¼„nƒFˆÈêÍÀœJPv…—`z#;¥Á™rH«2ÝÙ4XÇÔ˜Ží~ˆ3:iÞ±ôUÊàˆI‹ÙÂR¶°ø%æôúȰÓFýI³}‘Ä#ضÒoÞÌ3%q-¦Žéc”·àkÞiÛòA®:Щ ¥/§r<–|Ù­í1Ø M 趯»ùƒýÍíwÇÛ“þnÒq›ý$‰»ÎØ~¦R¶ŸuaÎëjY'Óø Ãb-¼±.‡{ð$¬F0„ßžŠ­'zÅM ߤ€YbÙª] mñ‡"àe§{7Þg‡Hk¼Umq9ˆíûöIç°swO Ú<¥N:!î5x=µN Rýðý‡ò~äà$^°× yÇÃý ˱OÍB"~6{;˜ÿ7Y¸ ü#ZtðsŸßîßXÇ:ÂhÝL„^Üwñæàs¹ ~~Ÿï¶ sûlýÆòFÜ{h_ˆ#Fq NºÀ²@ß¼~ÒI>ûíÃnçª÷zRÊÛ¢¼±Ø$gd†eÚñƒ]Ê×5J¿Gd®|†mÞ%õV¸—#h¶Ôû±êóÁÕ¨ßÀÝ#þ•GÔÝØÝsˆ¥#r _°´'Raí §žÀÿ_¼8öŸT_Á±_9R©è·ÿF¾Ÿ¨.)õS?}¼vÉÊ~¸}_o©,,íôŸ%€?ÀTúÄh%DêuúÐ;ű¢u>ô' hmÏúø í|K20­ |ÉÙçg|ô&=»Cü(jÝÏåÞœŽTNï&~ $3¾ÝÇÂâæ Ò&IaiõÙö¬]ÖÀNá¹-— …ßß“²#—pÐ:CBmrJïŸí7ÊžjÌ š$ëhÂ!Ç;šU);„Ï÷qãõµG’,ÅŠ¦GR–‘†x´_ÿPqÌÁQb¥êÇ-’“+1K·½ƒf'Ü.Ÿa_^›ŽáŸ’JcUŠ¡/½¡~M¿¨^u΃Ôí©jòö<¢ªóÛžjauÛX™*NuГa£“Ã?ÕAcÁ–zCg¼R±-Ã;GG3nÀ IUrÛçø3[oã¦~©fä¡§Jy˜ò0”EQõhÌöçú«Øþ\•Ʋ"ª„f3«ŸÙcÒ½÷tï³û™=&éáFÓ„'<Îæì=mØ¥Ó‡ÿÂ? [kîr4«ì‹”}©Ü¥PÈU×#f…^\"³žNT |o|€åðîà=¡ ê¦FÕ…&f·ô46©jµø í\S|qÕÂVzh‹Ìëþ™j‰PÊŽÑ~^ä,-œ­G÷#AAÒõît<¿Ô¦îŽwÚ3H/!•§v„²íkʶžˆ‚ò ùžî ¹úµïЩÀ¼©ìq¼``÷mãé=+%ØîĆÚ„†D‘]…PY¢Nß–xð;]f‡.…8ô<ÐU~"Å<2cž{vÄ=HT¼¾¶Û¼€¥ôŸvÎöÎí;À]¤z4ýô›àî9é5'‡µèàaðÁzËn– o$}Ï\Ñ!nw‚mäu¯gåI½‡‰KûÏñ]nšÀ‚~¥¿†ÿŽZÿôg »HqŒÓ£Ñ™¬¡ëV­\04•ÿù‹SÙ¡íåQU¦‘*ïr†ÆÉííéì ||0æSrÉ^ä îïgUùbª|A6ïCæ=Îñð¥Zo‹$tØ‹*3“™Îdf:¨ >Éa9_‡Î}Ëëù«â°A; $õF‚@áðÂñ;… wù·äQz«#$šoÃ=ÓôwhÚ‚”·ÁAðXËC^ã7áRe9…ï;b«áŒûdî“~‹8$܃/Õí‡;ü$š¾¥âóÊïðHŠ9 ºÐM¿Î—ÛÈ+>˜iÂe²ûd™w( >VêÅ3ÛÃJRLþ.ôe6ýž:±¾îýÊhL ‰¾‡úëéNäE—U7j"$¡eÍ­ÆÚ¦µŸMÿçmgK…DãLãgLö_YôöìU§^ÿ•ÖœÁý¯ÏÞÝâY»ô¯­bïVq.°ô~¾fÏ|ëtüwç¡4âB¯ßM,áMðšOùûð±|‡vÌ}U  ÿ@J‹ÿÚœí·á{îwùRåÐxÖ=®¦ŠªÙ‡ÊÕNf?qøT¥yí´gÔI‚ñôh’À3ÝKr[gÍÈYrRe°FåíÄFéïEÒòÇ*‹×\)Dûÿ| sœMæøãîa§‰6»ÁAø­¾66:#xúÈOÇP-nož¼Å¼Í±¥àüfí<<†gç°£"GiGËJZNBñâ4ø'Kià?2Wø ã~w›£“n½Ý»ìtoÓ}ò)7‚ÞF•O¹øûPà÷(dhêçC&ü0ýs”5uÍχ¬T@B—â axxV„ã1Œ¨`~øOŸ…ì÷ëíRúc. >æêþÛ•#.¿ˆ›­t:ýù?W ~¶TÊ-ûù¥ejûèeÑ:Ê„k“áu³§²YäiÆûl«FÙF1NÌIX¨œ¼†Ç ±Ë‰=( ?áx>†f3išEqÍYÝã‡Ö#LY{Cœø6?~œ(€+}8SG”ýÈ«_P§`¥Ñy:N@kåSZ+ÃCÅW`§ÔWò¨ÁV3 ”ɽ —áà ºMÇŸL™^'­ü8qGž™Ö8YçðÅ ›ˆÑSB!2M”i4©áÝ×NeŸ@Ûˆ#‹ j$(%u;ÕÝfyÓ/™ú3Øhø½éŽûSH¿fé‰Qå jtßhsðñÍ,ŽÅþ@µ¶¬9×È b¼ñâŰǶ/»ygš¸ÖørÆõ3R¬ÅL»nÒŽ–Êæ`Þ“P¢b!ýŠòHT,ö”³yÅE?aÏd:ð+S|fSøÌ¤ Nhú÷zûò²u@•RÝWð:1à\ØKÐX>ÜÏÚï*Κí#Œ¼¶>?Áðš _g­W΢¾&^ÔìjÃtîè{Õš}1ß Ò¢ëÞƒwZ)ð:D("™uä›d?t_ôIEðš©Oö5{ÊíBÓ(AÁZ›jªÁ¼ ÷$‚¨){)e™}«ô Ö¤(¢¦è%e¬C°‘Þçqï†ûúGýîøÁõ»å{ÁëŠÜMñ}ÀŽ¢ x!°î²íÁ>»˜¼†³¦°ÆÎô;x…ke}•f¾;â›gÝTé&APÜéí ÁΞóé^-¼HÌPJœ×fÖ·¤°}£fn •¯„-ÚMPsX×ç\{BØpoÉ|w<Ö*ô·jKÝvüì›—°’{ãðN¦o3o^íÿÂׯöå[~ÍŸ“CýkøšÁ*sðjGj)b®ƒ/t­—¯¥=©Õ²tÝuÜq¾Z*T˜ºAÁî‹p7[¬ìd2æú3\þ·ÿÔÿpWó}X¤¶ÿI} YñÊÒþ-®.é¹ÈÏø_©T\üoÅ¥ÕÕBayeueõ¿Š‹…å¥ÿ–*ü'Çùïý2R©ÿÝ7[ >S/îþg-Ðá9Üû EJòw1õôü™½¢ËÈlóÐs9ußm¥‡*E¹»öÕï~…ê±#j Dûÿà‚Ç,ùª`Q‘K.;í~–Èaª¸x7² /ë·ÍÖC9õûÁýE³QOívëðíïÁnÜŽõ`/n â~ó¢ÔºèÐÕ«·{YØŠæeå“üƒÇ-ãµ;)`'“8ó±Þ¯ókzßF]jˆ[qªÀ”8.úYù-£7N+vh5U/h7\N‘¾vÆWÙ‹ä꿵¾-³âœZ\QˇÝfÉ|¼œ"l錧.Ãѽ“¯ur^©RÁÙ¡ôuZ9ƒÔcìÙc´ªuã»V Ý‘_S´E!H~}ÑiuºåÔ?KkK›Ë[\†‘Ʋ½ëz3cÃ8SEù_÷*ª§KËËAÊüSÈ­ûÖgø¢#¾-²8ø $\ÌÄz€L-›µD –¬µ-S6ÇŸ“ëç—ˆÿdGî\^^þÊü 0gúÿb®ðüÌ]0UÜ‹žê3ã¯ÿïÿäÿÕ¨ðÿ/ÿ#ú/>Áµ:W\opõoîãyú_\YZ)%èÿÒÊââÿEÿÿwü÷²:ºm¥$¨nèÁYôRqû¢ƒÈ/ôîû—Ù5¯úêüãåB6›Bš ¨Oy­Ñ‰âÔ~«ëGE©âR®ƒã r}j{„Ñ$S‡­û«ì~;•£Â¹7µ’+R¸Þ©¥ÅÅ•E?•Êf©­÷›'_·Sƒ©ÃÓƒýÍ”—Íç?-næó['[ÔL1WÌç·ßy)Oœ!†Ãan¸˜ët¯òÀ<Ü]7/zy¨˜ÇŠðQ+s~ÃÃ>°ikºE/Õl„ÞvSû `5Ú½pFÓ%UlJª”G@HnfU,®¯¯çé-T =À{^êÿþüwf–B¯´¾–[[^Ç—‰À[_Ì--•°dÐŒ‡ü)4×LñkÜb# 6=TÏͨŠÝÁ`˽»úEzw¨¹ébZ†+øç¿¿¼©(uÙlµBÂÒæÊ¶—Bc¿›xª +/ä–½ôùvi9·VZ –‹¹¥•‹BPÊ­.³ð¶°,çJëëÙbn¹¸¬æV Eèë¿_@pöPq©°˜…‹+ÁT_Ì.åJÅb°­a¥Õõ•€þÍ.æÖ—‚Ex½˜]JðAi *Á׫ëP©°¸š]Î×ðƒåå•ìZ®X\çßÜe‰Z(@¥•%]q*­e©’´„#[\†q¬W±d¹ÄÝe¥; þ» c*ÁÿÖÖ—yØY¶™_ ¿/”xòPe}U~Ò:\àõêZ1ÀuZ†Q-®.úýêê6Qä&p¡ŠØËr¡˜¾V©/ ýà*-˜ð=ìbñ§¶Fƒ*¸HK²#zþŵ \ŸÅ àú¼yz ‹<-j& ¹¸BËïÞèŠÂ[‡Y p‰V³³«›/‹%˜ œ~Ø/ž¥µÜ ì¤ KØkêíR`XA¬Hqu öoqyIÖ´‚ÛT,À`qq×h¹Wq‡–—qMx[×Wqs‹¸‡0thmm Ap~/Á§KPsÑ@éZ Aeu ‹×–p™‹«+ÐUa•"Ô”J+Vë°n‹ë%zÈ{j#À6`×p=×Ö–¹³Àé Fà¨ða `Ì«2ò€GN“ Ôä`Ö´ãKò›WÏ_±´ŒCYÁe/.âvàÒKÔ´;M­àF-!Ü,/a[ÒÓb ¶±„Ál 9˜9îô:íúÊ úBÍl †„«ƒà Ç3ÙÃOZ :¯ë0ƒ%˜¶, T¹PkÌ­,®!8®Ãok3.pip’‹ëÅ—fEEo*Ol¥°¶,/ç–l`nkKC^þãAC++kØxi 2ÎOMaq !bm ~‹8þRiY½¢Éâ ¾[Áù¬.¯ÂïÒÊ2ónÀ7+YuÊJ‹ë%0çeD{+„ŠEÄ)뫈?g.ÂÅ)°,=¥³Úƒi¯ú€Sºœ^ ÑÂÒú…:>«‹øÍr BP30\øk 0¨tÙ €Å5ÆM˸£‹0 Úc…•V XZ×XÁ‘ñ;¬œ~¢öxös‘øSp$Ò’µBÍúb€8 ¼_eü—5í,áÁYYÖ´Äô…‹½Z Þ^ä´žÕãÔeh MKà8<(]¶Âü ˆs–pSWV‹Piµ„›÷U-ø\_ƒ–Ö×—àßÒêâ „@¼rÍûô‘Áç1õv Â}2(®´Œ(Íxi)kŽ0ö xKa‚•ìl翾¼Î'ç\ZçSƒhn‘(í:¶¸RZ““%ô ­-–”›òoE>K€’Ï-®ž[äñD‡›­] wr³Œ»ç€F´‚Ø06¸ŒÇy}}•‡ »°¶¾¤¦7Ñ-¯D·¶d#ºåEèø=Œ Ñ\aÍ ¹Âª 9ê2ÐX#êKt¬–Z&DI‹kBÔ`•é Õ†–K‘ëË+üñÜ*ã¹Å"B,"+µŠ°@­Æ5Zä–qפ/ìh×–ˆºB“EÞzc7×à<³hnÆ£`Ь IÿDȺ‡ÑY^¼`8"&ªˆÌáÀ×K¼òŠ’áYcB ã^S;ΈŠP×…pŒX’ÿU€Ó¼$ûŒ•J«D3–F‘2ÂkõÓð%dç– ¯.2‡¿¹p¿ØÌª襈M®.ÓI/ ñ¼`6ŒëÀ¶¨€à«· & ¶¾‡Ú°m:þجÂÿ¼ðtQŠÐ×:arhr 9T`µ°Íõ€± aä VWä7H(ëkkƒR 7T­èÒ ’\¬ED-„™×{-"\®"sPRôd9a"A¸ë€áŠüû"‹#ÆS¼Š|˜ìÁzްªÞ>Bèt‘k¡  ·nè*³P+D/±¡”YTfý ‘\о- ŸÅøŠÎ—ü6´¢ ™¤Ò*žÿù¬1¿F{‹Í¬ã±[&,¿º²Î|‰ôUÄÕ˜è £FXÑ¥Ž ¾RÌQa€4d„'@Â-Q\/2} g"t0¤u&èšÐ¯â™\$Y<¶ˆ¢Π´&`RX[Õõ «Toe™Ï1}$÷xö¡¼€§b™x ®%⊩©Ã>‘d{í2'Ŭ(’ö3×–EÄ`®ª„Іt¿ˆ{²RXš@ó*Òº¢˜°´(_mþt´ŽG~Yùâ"“0@ààáÏ‹¥Ï9¿ÄOçm‰ä¶BŸ8mÐ*¬*Âü ï‚vÆ®®«Ã¢ œÓî KŒ„þKDþ t Vš×KÄq¬`µDຌ$aVˆø«ÅÕ5ù Í- 'Ç.Ö\EÔ½J¬3Ð7¡;%âw`¡×ðt¯qYGÚ„L× ?\,2“ˆpIàK³(¨M ˆ‘gì°°"\|¹‚`»²´ü‘Wüß‚çW–°]Ü×¥e˜" €20Ĺ´%$Ÿ,x+"Z¢ŠËK„ˆ s¬#误‘IJ¶Rd´J[¾ªÅ©±ÀÅÅ5}”H;H³¼ÈœŠüV¨‰Núªlù2 ™Œy³LÆyð(Ô­2qFÒJ±´¸&c¢®f-‘^±ÒQ5AP@5xˆZe@Œ¬K/®-*†„Wâãñ<B'®Â`K ?Y€RaYPÑÊ¢ˆ÷ˆý—ùx ö_^”³r€F@‚tÎ Ô]+áïõbñXo2?°7öþ[€b¥hxÈ(r㤶ÁuYY1¶ˆ§Öo¥¨ …K†á‚ b¢Ú‹¢RýølS[´UÄ&)ñđ뱡OYÓOA´ 4ØV1Pu–ט÷Ë*pyEq‘Ò|ù>( ƽVÃZ¸‰ €@^\èåXl¸‹L|qe=·Œ‹_Z_'–d•1=‹®«„~H…lŠz„ˆ—p|Ìí¯–Š„ûWù·H@B<Žkt¦ +K„Òðw‘ZYd´ˆ+¾DTc‰@{‰àe©8XÆd¹¸Gƒûȃûw€F©°k2à:ñâLFQà^/’nΚèóˆFk• éô–×µ¨“…$–ð˜ãf¢P€]”ˆ\‹¬€ êQ¢£¹Dg›+œ<äWJˬ8¹.­ã©,¡þ;¿ÎÂZ,.-}\ÁM½Pˆ þº\5ò­%„‘UÚ±1Ë«D1@ìGEòR%ä "ñ™´¬W]/¬ó§Y!¸8:|d.ašÄ3 S@âÿVhQdÏE‘÷–`DN€–VEà€½§3…€Ñ".£áÖé3®Ò°—Jk.Cì®èÖ5¶Dãuú Á$©ã2ã§áuè 9“ˆNü%¾ÐRÍš‘p` •Ï©š`y °Ô(¼,/2£ÄTŽ)h =ÂÌR¾²L¢.i€ôˆ‘$.-êJµ’ö×Eüä©)å›Ea×aD”¥ß‹´®H—ÖˆÚ"Í]Ë•Dç)Ôm‘¸x`I"æåXb&æáoIKÞ(U+µÞ2i.×Yˆ_3ºJh )•àïhGx2âêX‰‚ >%­ q¤$³C¤îB‘ºH˜µXK&<$¢Î…ä<„ë‹LrO" ¥"¬Ù*e8ˆ…õ>­á™ \¬Èxöe/Xf"[B¤«ëHH‘X[… ¸8"ëH%a€ó—§ªú³2(¢Ì±~]‚R€è Éò¤ÈX_‘ßø/nÿ€j._ãw+ ¤.£ÀÂáqBŽ–ÓŸÒG sp¢7KëxPðÝê:Ìw šA–†8ƒçÙÚó\ÛÚ\YÜ‘y.®Ðæ¢>vu-As+׈‚pñ—PA ³æ¿„;¼¬ÿÆ×qä%¼YZ"Áo‘ó5<^®µˆS¼¦ŠÅ ¬‡Œ–“8 «Æ¿©æ€û½æQ7á Àz _"^R¦êŒ\¶´7ÀMý¯¾±ý÷þ7}ÿ׸ü7÷ñìý?`2@¥S÷ÿ…ÕÿëþÿÇÿq¸µƒãüÇÿûÿóÿüýS…T'úþ?^¾Ì¿ûu´TN• ì(ÿ~ó97ã¼Ý‚ÿ½w¶‚ïÎóï1Žgj•*mìv;÷w½³óW¯à«ÝžT‚§ÃúUÜK-R5Lµ™ß„öê^½úq»ý–Lÿd~œZ\../æï#Œß–ÿüö€¿T£{õ ˜Õ¸~ ´:º«_ÜÄýT_a4æÿïÿýÿÁ·ûŸ–ßÞÞmÆ×ͽÇn|üøîäâñæb½áU_ýãå¨<º½»…ÖÔÅ~èÕѸ¡ ¿±8泌Jÿ&ôØêáóÛÃÔf§§€kÌ•²…•Åà À›+@ˆR%Ûò…Õü" òµra¹¼TLÉÞ+4ŒzÙm\–¶v¤CxškGP(å÷‚ÙÞC»_eÛ½r#ª­˜cMS`!x¦8ú¡çý#eýÇ5.t?w÷ÝõÒ¸ÈK*¦LèÆ±ýÆE]ªëýW˜ïºÉÁ«ó€ ^æÍ+·>…ïyåtNìµún©zÑj’B«Žö&£¬Ä6ó^½¿«w›¥¿Ú¿zõVþùkóí—7/óüQ¢‹üt4Fg8\ËZ°u!ôJ¶{9 §9ªßÁ*òs>ÚÝ¿½zþë|óöÊÝø®¬€}«Þ_• EÔ)d‹K'Å¥ò2€X)S(• …—ù©ºÉv:æåÃ/µbj&ÚØ¤(¿Ò†UsVîI§Óz5mI´y¼d5 Õ-œ\ßßFíz³Õû›À†(¾/b‘Ð;Š{ûîEìM} =áž•9YXiy…Æe=÷‘$úZ-™¤è¹¯äT½>ÜÞ5ßMµéïÈtóU~ý{~©Vûp|óõõÑUm£vµ];®mì×j[ùÕµÞéîõ ±»þXß]îo½½[«-}¸i½«e 5úo£õñ¿íÚ‹Žj•ÚüþûPÛÈg–j[7;7Qéu«¶{Â\æ£Ú>¼¼ú°½Q;ÝÞ¸:ÝÙ¸ºÙÝøðåõæðjwãêê`«Öy³9켡·6jo·jCü߇­ÚÒávmíýÖÆÛ“'Û£a´;ê]ìÖ.õÿ†Û{Ëw[µÂèáËîõéÑÎQ‡ÞQƒNå¿ù¿üLôÃLy»Vnñ”kûGµo`jÛµ:Í~¯†³û°]3ÿ}Ø© ÷waYö6k70=xwµ¿•¬'kXÛ„Ùº\ìo~èÀëMè`«võaÊ`E ¡ö[ج·G°þ;ûGû£·w·KÛÍ‹/Û§oïv¯7FŸFš‡Ôàiïúíèksmóèáj°ÝúðxtróãÍ×ÅÃÍw§Ú7+ïß]7N¿îlî÷÷_wÞ¾Þ¼¾úzý–îÇqácÿÝÇ7݇¥üá65X|RøúùÓN«þ©8j|n­úZº¾«ßö{ѧåÁ—Å£b£ÝXŠ?ß­^î3—‹ï·¯¿Ô÷šû·ošKï¾w2›7ËÇ[wñ—Û¯Ôà¨ýº·—ß|¿{óéön¥y÷ãÇ}¯[_tŽ`}aúû[\>|ÙÞ€ˆpÍ®··66·ßžn»Þ¿ú:ºúºý@ v¢½áÎÛ½£¥ãw›;_7/Û¯·Ž¶®®ëǧŸš_V67ßů·¯FÓ›áMùõ÷¯;»ÍÆMcçtqíÇûÇáÃÕ5XÈ>^¿>¾é¿=9]>±ÿ¡eÏþs·øîq£^*ô/Þï/ío×?Ý7;WËoG™»Û›<åíBæäðq;8xŒº™»Ç+¯ãÇúQç&Ú‰¾|ý¾s¸ß)-?|½XYŒw3—™‹Ö»Ïƒw¢ãü~ñfwëpåôÝúÁîׯwŸ^×N‡ÃÆÆéúû¯¯Þ>®ÅÍÚÎ#þÕ£×ï¾ ¯¶{‡jðâîÝçÍÏK7ƒýÚÉÇ/··ýîûö‡üÎæ§f)_l=|\‰ß—÷®‹§ý|qÿ"ßÞÈüÿØû²¦7‘%í¿Ò17D¬ÅòÎLG°Š$Ý!‰UˆMÀ¯ÿê}ÕžÓí¶Ïâs:f<á Ûa(ªòÉÌ'“,‘ÎÕÄ‹}¨LñCc2°EwN&ë«;ŸnL”¯ˆq¦Ê’íÒâ7¦G”± (,!‰öt›¢Ì ÇRÛŸµ0º\JÆknÔHråØͳ} ŒÍÑÚÝËZ¹ÕÁqdw R 5/›vŒ~ÇRºÐ «,çžä›£‹f9îè2ÀîÁ6êÓ‡À?בÕiÑ¶xè¾t’l<^&v42³N11Y*g½k[Q§M棽˜yâÞ¹¨]¾íQóa$O÷5åCq~oˆT\Ÿªõp¦@lÉ5pÇE™Ã˜ÓhàŽ¼Ñ—l¼+¯öðî•T¦dt ܆RS«—C TŒrÚ1³ém#9]V¨†‘Z/>ãåáÀ ¿“ù¶ºVR³ÐsWúÖZrÛ¸þòî;ÍhÍ×óeÅ"[âò‘Dh!ftú +Ïœ=k&Á«ÅùŸô£À:\çã½JžÄ¡’VûÞókZ<—…*„Ûa*»À'¤ís3sûY:eâvmb™Zz¼_c‹:Š3–4”kÄzE½{BúÏ[…ëC‹Íž™£­’¯ÑØ>'ûˆ‹{·{a=…4ÇRV m¸Î•j©çÊõUmP¶›]D/²d‚ŠâNOKê‰â£.—ÑVNul—#®¹‰d•êC;ç¾æ˜56°î£HÛ¡NÞô\‰ÕºÔã¯@/pÉ-<ŸegÝ4—oÏ7ÂÝvQÐaè­½TŒêÅ÷óõ$ÝuÛÖõg¬4>qê#«fL âh;x&G:}zÅåc;ðþ\æû2ÚDnY‰¯ÍÍæ¥;Ô*Y:½4³91œêõ™W®S ô—Ûˆú×B@tDCOë%·;ãhñ¯@ÿ cËjºúìvYI(/#8«:}ˆTV±QQ–*êZ€R¹Ñȉ½‚+cÝBk!©O€F äüJ+¬¶&À,žWóØ«PVåã0ºÒ í†`Ê¥ á¶·š³®ÔzÀR?–Út¯%dî¦ÔÅ+¦( ?=«##žJfä´d—Fz$ê§„Å®+¹]"zÎY¾nŒ{`Zº{ÔËÅ;é´»C}w ôCà¹Ç€”¤I·Tâ^Ρ,OØ2# `Ü¢öæQ,F:%§z4e“Õ]o`¯qÇæW¤µèlF›Þ¸Ãóez ¶¹= –mÖ½’º¸‡Ž‚U ÄzU<eíJèAºß­á¹rnææÐ*¸åUîE ×iBÜïæîE8' ×Ï‡Õ nhŽCÊÞ“]fÞÚŶÍá8 ÓÆÌYðf¹Ô1‰Û¡¸ëÁÑwðîåéˆPÛñCàvªëÄ,›|¿–$Í· jZÄ™M0ºw2 15=o'Wvž5áô8"ŠêÊ&ö0r­D+ÕÒ|دÐÖN~[üy"É‘‰ˆäBƒ>)È‹xâV†×ò›N?Î#Z•ˆÑ<²+g]‡Cë>d¼Ëuׯxÿš Í—fw^ÌRŸ4B²°d8wì Ü ‡Ôµr¶l··ÎVŒ‚õQ×èrëäÜžýЮݑÝ/mõÊõ4Õë¨ÒLN矸çG7AªTÓ:8¸!¦AÏ\ð[àƒš”³ý!;œåÄÃYÀĤ)ɦ™Â´²i^>¾ ÷;²¢—ƒ@Cö5lgrÉ §y‰C² YJèO³ c€l¥w‡n¿ö8Wõîr9ɇgÕZÛe—1éŒÝèÚîˆ"T6i´x¹¼ôûi?æ÷¾µiÔImUm²*÷Ù™65¶™!¿µÂ´Èöëtnÿ!0õà{UkË-’¸s|زç™`*8/êbb2˜îЫƒÚðž«­":CGh޼«äpŸ@±Ã^Ajû¬"m4=¦†þÏ[ŸN= sœ-ºÝqï±ËC­U ;¡.=HGW¤Zè“‘Æ4R‡ñâå¾B+Ã7<œ¹Ûq0+¾úä´1^›,ê”ïçj^ÉK ÑÐ&_tÜñz8jDÅÐã.Ë[@ß Oe_}^¨!ºÉ1=„‘n—€Ã//»Ÿò°ãA;Ži<Ý#¤ÿ¯‰Â|Nó=ÄÏ7Ò÷úQ8þ¢Ä¡S#µ• Padujö—Ý%7iÖFNSñÌ'î°gè3±‚xKÆGs£µñpYž^XuÄ!gÇå+Œ²Za»m\ËÁ#Ó‡o&1³jÖ3HÙš>t‰•w£z¹s5ÂD2;V˜’—Æ ÏCŒ³9°;kåW÷C ÑàP›1 ÿøáõ°ØˆõÛ)8,ËÙsù+µIˆè ب €«·€î;ÈF±z°÷ Ö¡D~,ªdy™^À³;j„^•ܲYÉëË}P™Ù}–sÇ…ÖÚ·n¬í<¾%blùÙˆ³Óõa8 pçÁÂå¨j® q¼ çÌÿH3èV1`yC­ÄÄR r—S¤j±«\—Á6ëv?·í@É6D 8V(½{b0þõzé¬>Ú ]_¶Ì=rÒÐ-0ò Y—Ž×ÁÌý¾Áp‡˜ª¶Ì¢Ãpõ¯ëj¨§)Q>0ØÊøt8'rÀâ>دϻô²øˆ¼E±¡<ÌàDÇúˆFÊ’¾zsðÜèg>‹Œ´ß±ûÌG<Æô9çù`ÝÓhôqç´OѲ|Qâe2ÊCµ6-~æ¼#ܺBØù¡Ú3ÆÜHhk´hmÛ:Êœ(Û‚„˜®Èá°2§’t;ßsÇÿ5Œ²‘6#šdŸÝ&L (@©†É,DòZÁQ¤Õ溮–r8O¦µÜyÞAdñ½V¢[ŒZèÒ]¼Q×òC €o°¿¢%»™øÙäù´Ï¹óô c:ç­ˆêtJÍÇè%¥%óœáh­#>‚í©=ŸÇpþ(SŠœ©ÏEG«n»rÕ;éa‘…Ƕç8ôKe7Í'Çua\^ËEf®»¿ƒí‚Pîá¦vÍ2úèÑ…´QŽø×­Iu4ߣ½Ä×f”6qö¹&¢»Û;Ó›,BŸRcW[Fç´À´ ô=ÙÊ1rò!pJÎpéÏ0KlF­\—ë«Avñ-^&ÝPKzœýÙý}úr‡ó™ÆG˜t…RÍæn"ˆ Gç•I5äÙWò½n¤Užˆm †{ò™Ò>W·çª¥[ÙèA=Yìu‹Sì°K ñ~×ÏEÌó—ªj•p=€ãU^¶ à”‘ödÏæ‘Ò2òI ­Ñ§äÇL‚)iïO,ØÎÄéb!‰†D##g¹mi¶h[¥†Òž>ô˜Š©ä‡À±ów0ÝÛ5ì‡`ÎŽœŽgÎÞËC3°ÁNÉÌ\ê0G‚½eáD JÚ@Œ\‘ÕÙo béš“bÂ<ìñ*; ÁóÌë¹ý(‹g$¹j êÓè©KƒÔèèÞ÷v×a~û8çÒê´e«S*\vRn˜Þc5»¼bÊ}¶UvÖoãôžŽxÆs¶Fçh%ì:´?îšXê3ã¯jìZ”w‚ØÙÑ–Ø9¨8´cw]<§ÏÎL·ä1ÞŒ®:Út»ëQÈZó‘׃•»³W±TÓ¹·¿ÉiÚ.«fGˆÅÇBçèSÐO6¿V‹•Y{{Õ±™+{GŸbRæÆ\—ÐÍ‹ªšÇyg·gò:GŽ”Fµ”ÕãÇ¡è¹hm¶ZUgÌÇi”T9bx…XU´}z]Ou‰.íÝ­s€’å…ÈQ^Ý#æ&­ Jcøã=lªôˆ<.VoÂs<÷LL-uä~w¤?œrë•Þ¢ÎÉE8öQb;¡À]Á‰ŽÀ1ƒ»=Œ£^SÁiªú0#–¢²Ð ífN{½åÙ´ûÙtj/îúW\Æê>^s%SÒ=h=,¬À"Íng­¶°óõ?r›lÊ €ÚL×MÊë ÆMN1“òÂcB¹/9.ó^62ÃÄÄú½TábÚ–ËþYõ†ª:Fø®{ô¨õçBôl“Ø2¦Çâk‡6ÆQ 9Gɉãk É‘døÈɪ–ëDÐ`C²g®m"¦¶àTÿàaÈOææV,…­ä6éîð"KÛauýçéé#½>}9©ÞË"V6\]VžgŸ!Õ(Éx’‚@ »tESªúá=ïe=ˆP`m› 3×åe)Í…ôѽ›°ø‡«B µi芲M|pÚJÛ)Ýn)R<ãÙäÕ5£L¿[¢]ϯ '"¸f–ë÷°Ã%õ 7ˆh‹/©eÜÎÆÑ°öN(,îF Ö5w ¹éÔÔ;Ò­õhU Ö—1k˜Ç:âWO‹Ú·ú¹¬Å3%OQzpyÈ»‰lZà:;^þªÎEî¥8ṳ¯b)G4‰~2õ#œþبˆ·:™ƒYaÆ’(ÔÂù,ñÁ…½é"ÄäÌ4ñ±ÉÄàîC .—f¢DÍíîªÆ“Þï¹c+á»Éñ±§jÓ&rÈÁ;uÝO83GY´eé°vvøn9|€¼´¬–ýKs[¥&6=dgº¸Z¨5à™+‹ÆÇÙ¯»jß³Ls±Ú=ºÏ3*ŒsŽr“jäm¾Ý¿Iõ•0a¯ô¥§ë’ÅlŒ#*ÎÄ{TÜãö3‹ªŸ­còÔtÝ¿Rg CËŠKFè9 tš¡LÜÜ'Ø_ß§ ÷jœµ³?”@Á¨vcŸå­§÷•;…—-„ZÛ¸y¶Ó!7óŠ^'ínÂqÉæ=TvåvŽc‹t¹¾ž°ìq¤A z¢ú¨¨ìŽ/-I Ç£ZË>ôÙØµ~<>h!…lœo»SÏ…×ÇŽ³0 OáøÌ‰W_Ùh¬jNxM*Ð㱀κ˜]s„œGë–f¥ú&íÄÍ„‰IáÝöNQkOxĦ!$žÞ)éU÷´‘ƒe–AÁÊ0,¶lA âCwiò¸aºÂ«ÒžÍà¨d{qÚYH®h 量bZu¨l›Är±Õ{)±ˆÍ{Jp Aƒ{]ÅçXF1ˆÆ*ì^U6¼5a—ºtÅ·˜<í[éV\ÎJhUoªhé&~è(ia“~@Z]²(ÛÏhÐŒ J.@_ÖnN5: Ì• $tç3+ÒZÆ·ÍDŸòÀM¸•Å‘¸Ë\ ³{Ó.}ê¿¿yk0Am%^]ðþÁã<õî4¸î6óÚøœÌBIM€-aμáîvéiºݬƒH$a²tûèiwhq>¾"ý‘–]‚E]+©ú&ìçÚd‘yÅØŽ>609éi{:K¨ëHb’ž½­V ^¥ªF­° 4kEcZ\RîH³CpDéG9Ö…7:Õ9€\‹È×NšŒ(ƒÌ$¼+›b¦CÊg|Ê?~=¡«^«Mƨ=Êî}u¦µE°Ù&sGÑ¢&ÙIïg=7ëí©j÷czuÁ)9¹Øù>áZEé'gà×W™þº9n’Z£Ë.1Þ±aÔØzH+í„««t{䇿tçpg”æ…MÍÓ!bÏÔüJ¼“PÆjýþª2ÈÉ> òÌþR“ãPóRuŸ‘ØÊÁWY†.ƒÎ­J Bsçœľ÷V;…Ô¶z•LÏ-)PÆþ+ö­b5P—‹š5 X6W>LÁòI´ŽDñ"&×´L6xCÕnB$]5´B2·|}Møì”½Ed·8W¢½µ? ;1HÊ{˜Ût@k”ÛêU=iÕ¢äOò±!öyÄÉ¿ïf¢Åý EôúJ÷MÛìÔæQK§G¥êÏÖÐåæª»ýc?Þªu\v椇´ð¬„½8.I²£¹}¨3\Y“`ÓÉÉI_Ì¡˜«µ\I °÷,¸æ˜Ú•Š9I¾!²Ðw§«í©5œ=Cí‘êØN§±Wèn0ÜJ‹^^¥ª¥‹ó@L·_“­ºö©9•&A†¹á†µ!°lôÂ`^Ê£ru|tÝ’;$^­M&D¦H´U‘ƒçãUÄ€¼Žaá¤4»@üP_æN_¡I2CP7þœ$´ªäz…Öóª‡ONû"¹õAz2·£{Ìz-øXuL2<Ú¦6›€Qo7‰>xù9 Ñ(š)¯}$̦P˜R3ˆj’޳)ï®çbyx໕“Q$<à2žÊΈNĽ‡²“×Û;¶Ó”‚½/H‹”s£—ÁIÖ”ñR¡`ª¸2Z;·‡Í—ƒ½Ošy_;Ô~µ%8\c+Ú OìrHu,ô)ÎÁx9ô†Ñy¢–œ„ב³s\›ón²&jwñzíÃõüÑŽó€¹x}lž^8„t9CN¼ _~ŒFj\í¤J†¦k…eñ™&¥ÎÐ_ÔèQMSæÍF0‡VºõNEàhrÐéc2Ðq2êéStæ³d®6&¬¥_VåÎÓÖG+÷/§Ô©Ä×kc´ÊÚy⊻s(µ+á\Œ#8 rrçô*bä5d¦¶GFÐÝku2 ÖÙá¨A¡àž¢ëãÂŽ9Ò]9ÀcÕ ª¨-AšWICçp …¿n;Ù¾D›[0ÌëÆ^aF&eAv Ž ~™†A^¼U>âÇÚ.ÂSu­¢8.bí٪ϧ³×óV/–Fúza½Ï–µ*P*$NÅæ5ž.‰=E˜f” ¹BŠ·:aÕEÐ"u§¨h œ‘ óÞÒQ_ËW½D_¯ƒ=dè#aÂÓç>„AýxO¿d´+Q­ÿoá€\õ!×vÑ›gëIíÃ…!SOxq‚†°°Gé<½r½ÙÓ„jºœš?¶^l3ºU'°gñ$F0Xé™:ÞS·ð¼˜¼e% åMñNyßÇ/£Z•;aÀ'º ©óÚˆB¶ÑÚLÄWû ¾ö×ÚP”Øÿ×ý¥}ìÕö‡Ž¸ •òË-wÿʆJËúë‘MóÅ®Êaúˆ¿xþSÏúbÎR¥¿7gç~ã­øËz¾¯Yñ¾fÌßZ³?\ú%Éé´ñwJN¿´R‘|ÿf…|õú/ݦÿªN¾xþ3oð{¥üQcj1Œ÷~ýBs®—=þ5͹ûü¦ö/ɽ³~ÌÒ÷ÇÿÍñ¯_ï7Ã/ù;¦>koÿi¼ÿôïõøS[µ÷gûï×ñ?>‰ýõª¿Ï—þKf6Äó?0«/^¢~KÇ8N$ÃE Pì'Ù_üïä?oYûËû‡Ÿß÷ö3ï}ß8÷FàÞH쓨Q_2Üóñ÷…ðüZø—†~]dr‹Ûk–~iÄ'-ñõ+§ÿ¢§_Яjò×qè_õé¡¿ö0"JþïâÿÿîÌþiËV¤Ï,›qAÁ) g'³ä·Z6ø§}œyÃð7ûc>vtü°ìÿËþçQò-DœåEžaÿ9”p>ξáØ~ ä§ÿ#þnÓ_sŸâ7*~óoúž=©ð™Ð+“‚B0"+R¸ðí6Bß(ê‡üôÃF¾_ÁX˜4HÀ1B’$gqpÐb0QXVâþ a}œ~øÛû+þ°‘6òÝÚÈç\‹#LR‘#óí6Bb>¿Ç‘÷ßúa#?läûµöO¶æ‡üôÃ@¾cá>3Œc ”x’då[ ’+˜ŒïAÿQÖyüŽË:ŠLQMS<ùAlj$%Rq‰äqˆ›oG ÎúñFo8‹ü@É÷š¥y™àCò;JxZÁ^Pð ð%œO`o8õF‘?|ÉOß9J¸?%÷~°²×Éï%8G3N’ Gá Beçe° MoG A½€Hì #?ý€Ø”|§(a(È]‡ºepœf9EfE“yˆ€ß\&„(¡ý÷_SäÞð¥ô×Éï% ÅQ€æš§Øw_ÂQÏR4)0Aø7³Wæ#Ç!Þpü üx)ù:ù£DüìµÎSœ R G(´¨ðߎu sŠøÑºôÓ÷€³‚¤p„(ñƒ—`@Qh‚c$–$h曘SøöѼN~Ç!þlˆ¼½ÁæJ¾k”|^xe%A` I² ËœD+J¸Ÿ îýÍÆþ/êA¿kMñ²¦`’ÿÐÔ¿@S •„3$Æ}¢p‚ÌQ¼Bc²ˆ Ì7—–ÞÐ}{ôàþ·”©¿oM1²¦˜}?4õÏwb1,ö»´H–D `2h™–ùoêV|wwçrl†yÃÁÿ–BÜÿ¤¦¾ñEv6fý—ö܇ñµ%òƒýù=”¤H“²ÄS¿¾Åæ(Qp,û¾Qö›@J|„hÚÇÁGÛ9ó¤BÓÚ—ö-þÚúí‡A Ëç~hêOhú4Øï\S¯£¿ßeúiËêg»Rÿeû×㵿¼…ü7^úíÃýæä›7Æý8unÏ‹:û%È.ÿ‰þ•óÿê‰ÀeòÝ¿ñ¢í®_Ù‹/Íß³…ËÚ>Îð•­øJûwmÅWîï;ð¿<ÝßúÐÒç;÷á¼ßÔx8Cq©3Æý®/ P•¸²}mÄ_“ã÷q;@o‘µÉúUQ¿ôGiöÇgÓ~ÁÿûÊ_üq¤/ï§¼bËþþ}òPoÏ_Ž}ÿ2&Ë~æ×±/¼ý‘ï_à%_Ç^‡¾4pj‹ñ·X²zø4ðãÐgVùÙcaRïZþÒWž¾T€úF ñö–ÃÛØhý"ÞÕ,Në¢Í~6ß?×ôÿÙ»¨¦’¯/J³€¨( ÅÐ$=Ô¤#mP¥†$bžG‘¢׊À"Òé Ò”¦ éMTˆðK@wÕ]åÓÝsþÍœ““—ûn™;ó»óîÌ$3ôÒÆðmš8’³M 裚O|¸»’ <ó'ÛKÔo Ò½ÅüâNtѯ>^ºóua–éñˆh€vĘ-Áè§/Ôò9Ë×UÑ¢Œ–è’âG¸I^ÁwZ·öE3Øa‚€}ŸÕÇGÎïy.|šßø%Æ>bÏÐ,ù+~c'ŒšÎu¥L££? q+òYÝ|VdSuÆá|çCñ«N~¬¬Àï_>ÑñûêàûZSp¤›YjSõåsAËæAKö—7´ù„éÛz– ýTè«A°Ä¢ææìF눿ìkVö÷o9þE!ÈKþ.ygN$Õ$}(þ'ä•u¸¸há³tXâßW£Ÿ¯‰14þEM‹ý |¥Â¾ÄÓÀŽ‚—ÎsýXáK´ÿGY—CàKé䕸-ÅÆ—ò¨+‹;ÐcæKéeâ×›ùÛË# Xü~ZÞìÿŸ9Y0Š^r?†Yú¹Ú¨¿$‰BÀ ðCƒ< ““EýCpø«®÷“›+t=ÿìhô‹þSËçÔ¹¤g…ýçö¬ÆJPí­ªýT+jøTßTØÇÿÅ”š Ò§•¥ éþXhýxŒô‘8ÍòçOr€ô×SM_ÿ`D/… ê_›øüÉåÿªÔGm LúJp:®P4TÉü¯ÀêO6¿Wð¿ ,Ôß‚•ÌóÈÛîþ›Câ¿õþc“¬î„¯ìXJ»ŸOMÒˆ †žn/<Ñóû¡º&È™äà‰óôɃéMôÓ7Ë»L5V×Ĭ£yKŸ)u!®‹ìõÓÈO#?ü4òÓÈO#?ü[Y‡Vöu§¥hDDt%( ù)cØhWdÀ“ˆs¡_¹98±!@Pý†¨¹y¹ D—D [ÉÑèÆ6¥EÙåµIÌG¹?DT<U7_+8G  0ýß(\–EääÀPˆª3‘H sÑòGý½¼.)Z^uDÚÐ »´L– ’§…èáÈ€¾´D$H¨+ÐσÂ0$J —‚ÂÅ¡Pñ}"„û¦ZCúò+B,)5$ñÄ=®ûÜh¥þô× 0(ý6óû&ðdƒ†/ …p‘v­……‚`°LôE%ÍÄ B} Ñr4<–XAh)Ä„è ØÐIîDO€´¤K_ ’Yæ¥q/í¸‚Á—ÊdâIrù¦¿×þ•/ÿGåk’œ¢'D“¾Ö£NÄÓF"=¢«#°„@ÊÈa0zvD”ySÿžM=I¹ODw\—œ,絸°IÊbðÛ°>0)¼>û9¦ú`À/Þ>¦£Âp¡É7ŒÀŽŠ÷ç(STªïüËÓæ½Ï®¢ZºP7¼ËPFúÌ?£öfhaZI3ʨù¶˜›ÌüÄ1`~Ü.fc&MxGÒâ ÷³„”láÁ› ÝÍÎiüf—ýø’ú”ß½kQ^¥6åzÏ¿N|6óÖ(fjp³÷ˆÌ¬Ää.|{J¹IiqÛXá{Ý&¿}wÌ:ôp‹gQ–òÚc˜ÉÒHþ¤3F{1¿-ì2‹÷n|éK¹Öº]|! ¹m¾Û«ˆ2ÓRí‰éÞ…dF« Í ¢usêa-˜Ï€hÒ=ç.îU.%C‰’l¿È¦Øú«Q^–›b+0YØÃÚœí5âýÆ´ÇrD4!¼c~{•ý‘ <fXo¶…#-˜µ¢ugÄ ŒòÈô¹fsó=®ö_ƼÂ5õ¨KêzËë,·³|[ŠëVß¡ÔåqV¥K­ @û„½ˆó™J4/Fæ©jgµÄl„ß¼©<Æsìu›§fhAÏ8¡Á9782’œD’@H5í»:u˜¤_¦Ž±LÞ3›~‹óVÓïâ\»sª.ì^sf<¥;86çm¥Ûõm/Ñ«†ûxoJò=_ÃsåA“ôPýq[®y‡,¥tG•ÁÆ­S×@CE'«rƒ§(O ‰Ô]—Tvh¿¼3š^uŒM‹RÎ!/UT¬qÛÿ­Ë‚I(‚»Gi•΃Y£|9f·"~u™¦O@¯¯FVx:x}“-1*¢p_]³ø3Ø }N9Ø|d®zÒËå‚SÅө¾1Eöjy–†Ñ²5«Éû5î±_—ÝOÙ+d“؇8>—×&Uƒ˜Ú¡eÔ7x6hqjåTý>cQaú­Òë÷—ާ¿íj.p·Ü<þx}¹¢@²V‰]èbÝ{µz½CTl4É›B¼Ø•µ¹X¾z0N2ˆ‚*¦h•Ï9uº¸õ*ú…ÅkÐ'âûnœsa¬z(é²Só\•Ñì­¬Ìø+õ=‰ýy¬‚¦±ULÁd=G:Vér^ÿÁÌ’Î×ç ú›Å‰ï0:¬P˜Gm|©În ÐSk¤q‘™ø¤Ž³mRþ\à¾|E ‹ƒæ|O¦WSü.3Vø' {:ÐMÚ/âŒÈÝ+z6™ê¡@î2ª¦q»óÕîeî·N²6Æ¡Ž‹œ9’/UÜ(t 0·ˆÜüÄû°J¯×ºFuiêXêcn5R„™';”(¥]'—Ý¡¡P””40¸'Wö¥bóO²·þVëw+ˆ+[x|„ØJô´82!ÚÄüôÉK"§SD]hlçY4 ÍblNwãºÏ,œ Œ‰¿gÛ‘v’ÄðâÖÀoa†¾#éR–×ûS€U±Âî†uhK¿ùmQž§²¹žy1Ħ]mÏ5±äMÑñ28 Žp{…Ù÷ÎÂD²ÉB“3xA„iˆ_lõ¥ ìkpLæºÖÅ{ÅXôE™¤¹(/K¦gð#jï‹ôÖ©µTl5êµ6ªQsžz2 é—ÜX‚+8Ó¨xhfÁ|.vÒz hF@‚Y5ìsØ5‡ßša·Þ!Q*““™É<,É&žq›¤ ·²Z^ãh3©ˆ0š]u´ê¶…¥kü•Y¦"¢[BX¦[øf"`_S ùyX×Ac¼ìrlUCõ¸u]Á„~Q³v¨0ñJ3ËN XsÖõl–uÜõ®ÒÚ ‰;GáTXkìsÑÁÒ®÷ª‘¯}äÆ/>¬åâsô ²^kØìU¦ÉÆ|K˜k•Ør!Góvg|²LÃxdÓÜ*ŸÜ·g¯rÕˆÎfPÖt™ÏliUóM ]Ÿ²¿qüèS0ܹ/ îöòгÌpÝÕsïÆù¶(Û–^-³¶ŽËsWo¼ÈŠF "X™.ÏmèN—ÃHËúñÄ»“ï½è_Á%ÀŒËì Ž—Xx:{]¹;"urÜ¥¤ž½êôX¬{Cjp—7ðmtõ÷T~£#je<™î—ØÛ“ézt aJè\‹{¨iµ}¢ïC©`kYÕœî aqýG¨Òy«¡ÓŽ0ÝS„>I <ÚyR•àdÇžÒúpܧV%…²¯1tˆ-"SÒ:'áô#ÿBã.aVd8³—Ý, s×a3õœñ²üîSÆ’‚žþ†äçž%*Ý ¨±ÕškoÜ•¾Œ~áôfR× T ¨N„´¨H ÇPâ5¾3«_ldt¾OqÛh+šþJPМ5V‡ñx”M×ÌL/£áĥ›ÖçyÇÞt ‡´¹`}»+îlÔçM’õQ…žü¾¶Â"G ÒÆ»íî& ‚ÍGCÎZ¥™¯Ú\Õ`ݯ!½[Ç5n=,Ô‚²ãËy¢¶•gæÔF–¼c§ƒN¦ \Ø pePCK ¾¹Ý¦CŸ:¿/‡^ýÃÃ%`²H)Ž;ò1FÃÎÞZ¤dO^Srî`í¡÷‡ºò…Ùî G2ǰ԰rì³~^š2ñë¥ì¾ ”¢qëÂ…Õsêï¯ÞÉÄßjŸ%?!`-owDêó9¦È àëSO©’Ë{§Æ×EnÐÝoV“ÒLë;x¢NŒ½È×1çÌn÷1=)'Pˆ©MÅÝZÂÓÅ…ÛZ¡f¹®ÇïíÙU>[ÜéµFŸÄéÒä› <+{Þß°]¤L7 Y†WŽÀ&'¦YV2wlÛûHD—ÍS·hbØÂÒ¼[}Ûæ‰ÈÊU%&Æ“sÇãœn«‡‹ëøæõ§Œ²msž–®âcOÃEEŸæ5¥: ކÇN©Ž÷p­®íe5µ¬NaØÔuÁ÷-¿Etøˆî­D}>/»í*S›¯46êí@ž²w?V¡ÈÚÞ–‹¥ËümIja9µãÿhùë¸8–nmÅ] ·àîîÜÝÝÝ]“$¸»»w îîînÁ/Ľ÷{Þ}Îýþ¸·ùuõtéZÏzÖªê¢g—¿Â†«×mÆÎÉä®ò Ü^ïuÇ7ƒ!€0?êŽý÷øó³àŸ':As'G9c!À‹•6€gWvºçÿ(>=Ç0Ÿd}štŠBââì,žüþñ¨M'f xÓôé±õå•™NÕÜðhÈö÷ƒ!;—Š®2•„žæ;5+:Z S6«÷$úN&”Šú6,tf„<ÔlÔŽD4š6ZR¤„\ïiµdÈ%ä$”Å8 uÍàl%M9˜‰¸åùmÞq ‘êQKŠÉ‘²¨Ó‰kÛӉГJÈSj 0 ssR‘:›ȪsØ sÛqqñÐÑë’ªóÐðÚS˜ӛгY‹êrñòØiX*‹ÊøüËŽÃË–…&¸‘±›±°±‹¹¡±Â{AFæç½‹¿ê3ÿÏGæÿ»?ˆ13²ÿ(5mY^{~22Y]~c~> .*vrc^5iVE>suS&mZ1a5QZb+q)~"; *9rz8mV} k JB2Yy cyuJjm>!ZA*-e+S#3aJ"s!M.J&=[9MBE > q f#g;=8B:jJzMJZ}QqFR¡wŽÜjV,¢büšÜ<„ïXU(œ…ÕlÄhEym4Ø„­H¤¥ÔµhùŒx¥màXIämÕMdD‰‰©de¸©´”%¬…èŹ-¬¤hmÕÌ5¸Õ•5éØÞq“2±9ZÉKÚK¿£VeS05`€S‘Q•4áµÖ`–Ur¤W$tÔÏûþ½¤²•<¥<3 §8)³™.£·±“„¸›1›œ´,«"›²¬7œœ,›ƒ–8­˜3©1½©7-…‰ˆ‚¥*5…½Ž0¥¾9 ·³³”-›)/±š¤ƒ¡º½ •š•®2¥,9œ•&1«Œ •†®Œ=½¶#›™£¶žšƒ;)³¾Ö¿†õoû‹?o40·ù™èÊH:Ÿrßž%ž-55.=ÞÝ>‚‚bÈ|ÎMRcã4Ý˜ÉÆÂ»ŽLù”]Ýu ü,F.ÙVc˜P ›é3F¾èm?k”mEÈ­KuŸã`:&y ÑÏãóœ"š¯ouuîÈSu:.Uð>O§­g{à7úYíL]¨uD³ñ{Yæ2ØÝUxÞOâW û*¼š…Öê­P²Ø/#OsC;ÊZ¨Ë$zP¹DÛ¶æwã_qZÔ^%Û6—d5b‹mñú‚C §L Â~´“;>ûµû/sÆö¸3!!Ob'oy9!X Þ©Íš†€3ÅòÑŽ42œÛžkP¬%ûGûRлá>±oêÞOT%ÁJ«þq¶ðeξ¯%cˆJøaß½úB.,ôc1O ¡“Þì4MÆîëpb"Øú–Ïh±ßzËâôýß´ë a‰ê‹¶º÷ð“–ÓcÍ`´cÚ¼u·kûè…–úÊPþÜ\(ŠŽ;f¯<(¥üG‹q=› è5PW=" Øù ŠØ`.û· Ç+6óøË:RBÞ*h¥þëÍ ðƒß¯7 ðÂÆlî`‘Gµ¤ºq¨3yÎQ4ʤÍZ­¬Ze¬º§Ã¶Ê°éôÞêƶzžÀ7«’CUØñÝ‹åÁîå}ŒÏÃ;¯Ž˜Qr¸|ùÕ)àDà²-ÞëET™쎅U²îqã:â,£bõLf MÊÈy…úJ1 ŠËtÇxŽ>î"5¥è´höÅV ê£4,ÑP’!Û1mÆQ‘–Árb›2™¡$úT†$½jGŒ“y…2c"âT$¢â?ÊàŒ ‘òθԜÁÕ°º$°:,L¨ë ë,õ¨á´µ‘¼Ñ9¡Ïq‘£>ŽÞTÛïÁút]m\e]¨ùø\¶&TÒÐ@ N{ 5Ny6#5ÍΡ'ŽÖ—þD‚áÅœÇÐj¿È_ÖSµ“?^ÔS.] xUAdÁ÷ *‰È†-èõxfýÚ©A#ƒ ÇzGE¶jWsóCMëuP,›þ"O[¿GäÌÏH÷©Î;õ°7ý|,“Ëö&«›œ…ÝPVF.<þd'Ž& ¤›½è&ê±Cå`ÕP.Œž.ˆ¥["*:q *]}ì~ªFxŸl¹}«NI÷ÖiTzç £Ú £KUÂJ5Ú4®i 60ö6„&{ß³JñõÄÃRm¢=ü¢~ø {4ö›)`»3±“ÃëSó²ãÝßö¥ä;Ô­HÚeÝß(]"Zmª5¡%'ˆÅË”)!Sv¸lÃA¯ü?C ˆ H(ÈCˆ( ‰DÄG¥•Ã1—=‰äÿ)ÜcDð.ëÛq"&õ_í=¢ï̈¿qe)B+ EÚ /7GØøè@ž¸žîE™*ˆ‚¿ J™>—+‘Ù››HùK:JIdBIhmÛåtØ-žßuX8?K¼p¶Gé½¢傸ë÷·¹Mº_ÆCoóD&݃ OIÕh¼Ê+OãP&¯Q4$¨ÌH®Íße³T†Öm3h æô0d½m#=Èqòª0r«{­¼· {^S’ ¨½`—Ó0X‡¾—cìÈHœçÍÅ8ÿšÑ­Åf3:–PRXs¨d‚ìšä±Æ¤Y‰¤Š•µvó z³m%’+zsŽÛ€¿BŠ~éÌêÙ›r|‘épÁ˵«² p<“>¼éVDV·L¿X•½¤uD§:D…ŸCz¬’Qþɶ©ÝÖô·^VYX¡‘{A¦$H8­ ûóŸ÷¯¶#±Àޝïïy 8†w®°ïÂü}Ø<šØø?ðï´€˜íËW*»(šqO˜³`·«TLôÛß̇âF­ä©8dšè’êFzÕŽ®€é~z}·Æƒ‘ÄÓ•Æ`)z!déx#÷Ö¦cæ~Ý0àÑk˜$-¨„]®C2á,XDµ,6&D¦LP}cÃaé»!Êyšt‡ûn—e^ÅPa αñJåΛõ´fŽ|¦œ¨L éwb%4tŸ)(CpéY)Z¿ë2ÎoW’a¡Ga°Qó D%J:»3ŽIœ–·Å4Ð8}oJÝó度û*BbȥݹþëË”¥AEÊ©CÈG;jØÔrrœ ·G¿ìëšzK°PÒTÞ‹ÖÃã«Eª¨Ïm‡† ÕÏá¦$Ù|•qŽ´ý¿\ö&‹LÊš’JyŒ« Ã8QƒGêM^ÂâäU™‚u?¾¥,šd^yp¡ ,Èø¥RŽÍå#¬ý±g ](ü`<ëT>‰Y¡FR¯…x_Dý,ëHQy^ ‘&,ç:4ß\ŠsXM'ŠÓØýn¼:òÈSΪ…i(”¢©87ý΀ˆ»…£Ê†6Ò¢¢ÒÅ #ºªá…É:jìë7 N²>Md ‡öâ?ú ]'Uñ”µœ&‚¾î¶Çr¤y¥ wI5¿C<]F?³5+têlና¿×½, e ¦„K©­¨D—¶,»;‡æœžŒ¶y¤VKµ ZÈ^àÉü|'lÆ5—d ]]?°/˜'F|#èVŠHþ V¸ƒ¥•ì ±(¤—^i0)L&2³ðº€”r©ÏÖ ¼eëi ¶çÙ@íÕ¼ãÇU¢çáà8:µ³j5í`³vIphp¶sÕÅCôè(ºï½dk@¶ï´‰þB>ÜðÇ}*›ýT=^.Î w™×[ó?KN9,[ Ã+e%LUf‡h{£í/¹yßyФgÉš²^@í6ôÖÆÉºQ3åT6­_Bf{oqßÒI‹7Ë«ÞÊ›šNÂû*ßpålX9®8gŸ„©¯}iN³æ¡ÕÅ>ã‰&ÏôšbéçÝÀ÷Pꊴ/ÆêöS±1þÀú"*dÊ,­.…ÙÞŸ[Ë™¢À –þ½‘\Ù´ÈP jn¥ü“Á¤z) {œh1 scÿ¨­naù Óʘém°Ïd4R—ßž`ù³âú²pªéfØþ ¦»Í&ä¸Ð ”Õ/Ú0ôW<»A±àºVßO«¨sö;ÝXÏ/¼øxÏ-¡jC$Ê=è×H ÓF×D°âÓáÆ§üËíP²Pà.a\ýóþq­_ð²jó–Q)YÖ7 -ûüO…ØfÔ[°ö¶[<ǵ ¹>˜£Ð¿ ¦V°/y¾ë.Î!í¢èhÀùÐÞúË&¡î)Z¦Þ¾ÚHÓ pSvô!±M¬‹º¢PݼG œ_ÆIÆ&SîM$òYöŒ²5-Q TÊsyÿëëÝlmXñ§鸣$™&\‚)¸oï3¾„´äÖ@ÞÊ+‚6 þph:‚ØÂÞÜüäÈ9ÞÎÞ®º¯µ»Îáï6‰ IÛ‡Cæ˜ÇÛÝs­TjÝ ['Qæjþ¨ã$•üèPëË„ƒyòH>…з’žœ©ó[‹ÔG$Ô·‹wqñ¤Ã}˜*UUÀÖÿá£óiÜ–\ˆ½ òˆA±ˆ:²Vx.ìkW3P^ܵ\ûqòm¢l ô]ÿ„§êă9ç„ó…*À‰»5;Ø¢Šú<*Ìg:b÷|«µ™\åçaËi)RÞTóI÷^ÁNUrëöw'µ9'Il,|7HXûx#W[l¬ýUá7Òô dCâxŠDÄ%9Í÷ O¨\ü¤xj(  ÓA.ù‚«Ø9ªPùrÐò9d¯¦Øøe#4yà‘(ï1|ÁŽÃÆÀªðÖxb±¡pÓˆ(ny~S?Ò<Щ=€«_*ƒ ÛK|ô×ò†\ºîwÖ§ëÌ…‡>D’¬”š§Ù[çÑ&Ù£ø¢?¯˜B¶´9퇌x\æÿèêØBªÇrLT eéÅÏ3Ì}+ÅçÒçwåwÑ¢¯‡± ¦y×B‘:¶‚ ºŒc7“Æç eDýGèΟÓv¶h-­zHqV6ßÙÚlåý¼çx¶ÍgQ¨<_“°aäfƒûÐúÐk’`:%<>hÒÅ_A?è–cB¾/¸¦=–É =Zæ¤Èxîp[ÚëÍ€eµïPÕpèºÞ0Ú[Îz¿¹‹Yúø œ“"ªl6&«ê0N*›é;Ìèéa¨a--­M‚×Weƒò%¥øÊ̺Œ?ªšm4SN©"4Wßš­EkÎR´Jgìæ\€狹P»D;#X<æäùq*«_(Ó$ö úØ “ùý§ SÑ Òó÷U•i {æKÛ—Â Ÿð`âô3Ê¿ðbÌ¡úŸ´h÷:÷ùíñ˜Œ»Ð™ì€fÈþ¬¥Â‘O)ÖçºYïG;—_,|¤5ž¶ü©ßé4L3GÍ„E_o8­[)aÙáë Afðš1/ÈÞ‘ÙËw"uB>kLI‡i­ÍêCÆ5ý(a‰<¶h¾ -ä¦PjD|ºƒ‘VêÜI%É”Ádd…@^¸õ¥ÀÞ-a+b‰_EÑž[ù¾_… Ȇ“¨Y‚Ö÷çåo²’a=wNÏYþƒu‘ÐYówµÆ… Ã9†¬ÄÞ ¯2ª¿Ü·Ö@ó~ ÐçYž ¢8s»š©¢Í°2-|ßµ7ø«{ØðþS¤ˆ&ƒî÷ô(gs“ Š))ºÓˆœ6_ü¡}¦†_sk4¿IŒÁÝ\ »½•6«^³…Þ‘È,‡Êžp‰¯?¨ú‚Ø>‚›ýË."Ã?ö Ä Lßl§”~y |WžNVîO‰¬œ4¢“ƒ³1¢´¾£åSU›?»#½0Dg¨ÿÜÎÖØîäôøÿö†“œƒ¹ËS— ÿc'ŠãŸ¢K;é ë;é0>¿Éô”#',ú§) Ÿ€‘á_  ÿµ€‰€‘é_ ˜ ™ÿµ€…€‘å_ X Yÿµ€€‘í_ Ø Ùÿµ€ƒ€øzàm1}sc‡¿~Ó€áeí¯f:gkA+[CK:[g#'s»¿‹ÿ“ñŸfù³YNÏÆò÷N ¡œ"ÍóÞ -=" ÉŸÁ8 þkG\âySï©’€8»îJÅù\ô\( hM.­ï`H#`cä ÅÊÀJ füÄ;G rЧ*JæNVÆO•díôÌu_9¡µ32¡xÿ©Ã'TŒŸ;e §el{s²°Šõm\ôÍ=…¬LìLOy‚ÌmLmÝ8 hžŒÅôd}Ö§6 ,O¥bæ ÆŽÿR…–‘`AfZÖ'32<ÄÂÂÆúÔ@ØÖÐÙÚØÆ ðî›±£ãóÿ(9 ¿@ð瀿p@ðü ˆOp°è6ÉDÞåô1qF]Ags+£'k?aÂÄÊÈfÒ}îòy#ö©[Àg@6›®8à;/ŠÆNNO‚> À€Ì?åxRš€ž–ðBÝ'iY ÈÿåG©žJ¬xù× X…áϹ¦Ü¦9XÛhSü‘ÒÁÖã@Œíù%È'¸žQzâ7-à¥HFz`m%ck;À&Ü3 l,O£³p<%üSï §?V`R€ƒ™éé=+-##= =#-= Ë“}ØØÙmþ¶ˆ±‹¹±+' 6appR’™ùIµçX¢àleì lcîô$?+ ‹ˆûSh2¶â$`ü«ýó6)çŸÝW†¿S`%}Sc'Àû“VÎNÏDgáÉ®RúîÆr0ü”‰’­Ê³Œ4 OÊ02±±?ñ”ž–‰™‘€™–é鎰óÊØPŒÃüD¾ç¨˜á%ŽèÐßË@O "¼3)ë`njnÃùGL6Ý÷æFSçi,v`ò¬ -û?NŽ—(2`çÔÉØæ güéi¥ŸF±1²µ˜Àñ¿gF†ÿŠ2¬ôÌŒÿˆ2ÿ?vQ€ÂÏïšÚè›?™+ <?¡¨œO”{⃘± »“±#" àÛ]LL€”•rpR!¡—\&&À•‰ PÊÄ(eb–ŠŠZ[±²j±²îXYµXYµXYEE_úäàÔáàÔáx:­98µ88µŸ) – – ¥ DHPGTP**ÊÊ h-* (¶J ”(pD`) åK9ÓSx¤€Z) @§Me) @#@ Ðû `[€N€pÐzâì  è ¸r:Æ¢ P   Ô佨 9c Š@”)°%Ps ô@Ù²GHþb£—ÀP   ô´ Pk`Ðb€+ @¿ Q¶èHwí€ö¤@É9€P   ZÈ ®Àñ#¾p ù ^l”ˆ: ·\€š¥H” 8.°ç{k¼€:í^˜ ÐШ5°  Ôò `[@ ¨Ð‘ä…Ù/¾D8Ý/~áÊ Û’™ä‹_¼Øˆ;P: êÀq¸$±È‹n@Ùµ^Föl,@Éž d3Ðæ@l€=ˆ>@þþííÀ6ˆ$/Þú·g½àô7÷ì~áýßü´þ›C/žþ·•_PþÛ‰^´þY_ä}Ø/°%ð{²€+0*2ü9ž¦àçãï+ðÌ©Ïßýë <IXX€9_ðþï+ð`gÞ³³¿ŒÍþç–ü}‚‚Àû¿¯À‘DX˜ó÷xˆˆïÿ¾ú¿`<Øí ¼¹^Ÿôcdbffà`ü1±p0Šþû•…‰ù©îöOs n³>ý =§ÿë•QT€ý© ° ½ðŸáçÖBÿÌùÏëS;ާvlOr±ÿwÏÿçØ,,O-™9-YŸéŸ>³3þž>õæøk¬ÿÇØ#£(= `ìç^Y:=åü56£P[zÁ?Ú ý÷ùÔú_rçŸ1Dwl"@ $Öb}Ö[8â³ Ï2½ôð¿`ùr}jýçÓ >ì# ÀçÅ^/#³3³‰ñd`ðD–§Åëÿ7‹ÿçõi$Q€N@½Ÿ-Àþ"óÓHÿ¸û¿Ðÿ#ùÚChç^8ž‘z“ñOŸÿÄÿÿÂü?ñg¡èýÇ‚L@>é-LÏö<ëÿÑú_0}–€3;3À{žýˆã™!Bårü#÷In€ÍÙÙD€~÷ÄT&&6‘™žòŸYÇ"ðCØž#ŸÀJÂ4gxÏ“ÞO`{jñÄÍÿ>ÿwÛ½´fyÖûš²pÿOžïŸ¤Þjþa À‚éuŒyn#ü¬Õs € þ²ƒÐŸø,ôWdú‡¤jÇÂô‡ÝìŒÏ¸°3u{Ž0,Œ@{³ÿ‘î7‘—ØÏø‡éúâxaàÀŧ±EþÄ&@é¯`ÌÎø„ó9Ùþ¶<È…g ^˜õÒ`TàlDÏñ²g»²¼Øû/m„Ÿeçø …_˜ò<€7 ¬ Ÿõ^PäøvÿŒs"óóˆ‚/³Ãs”Î@lÿ*ùÛožmüj@Ížó…žý÷yU'äÞ_lxBñ_Qû¯óÏlðÂ$Á—¾Q Øæï˜õ?¹°÷Ÿ$úÇóXŸmþ—Ç¥zäKÿ/ýá9ë3ñ©‹ÃÏ~üÜëóZȺ?’¾°íER–—¸ú2ûýá ðxɳTìÿ‚-Ëlþ^µ<ëÍú‚ìSTd`aû¶ÿ{Ÿmù<“½hõŒëŸu‹ÐÿÌÁø‰ €¹âåüƒ¬0PV Þ/ØþaçV}øY«g?üoÿË¿ÿ‹Ÿ¿û{ÝÔ ÕS¼}áš €-—ˆŠþçhdù7DŸyñX^Øú2W²?KùXúDÿÁT ‡Ùô×ìþ"ÝŸüg;ý•ÿw Ìcyþ_Xþ ’¢ìü‡ÍÏÖ{ÖûKvÆÆËÿÉT.@odü# p•Ëø·}YÙ_Jþ#_èç^Œÿ@¨;ˉYþh øÏXù—þÌ®ÏlùÇj€žùï8dÕ˺ 8ÿ#úŸ9VÀT`)0FKÿ“sÿ;žÀõšÀŸùhŸçu)0’þ‰€ë³´/Þöa.˜+Ãç뉟®žž>=åWæBúÿË&Ϩ g~`MàJò?$a~‘ú¹ÆŸ§ÀspåñÄ`Ñ—µÂsÔøÏgC€½Ÿ^æõ¿8ÿ¿žf*À*ñyåñ̰Ʊ¼¬hœzŽ//Þÿ—g³×›ÏóØ_¶úS‹()ð|‰âÿažãù3?ÿðä¯Hÿßç_+nVà îÙb‚ûÎ?¯f20õ{–AøyÊô²à °Ø¶ü£Îßk çg†?6~Ñ€3ÀÀ'‹?<^µ,ñÂà3 ýÏ+Çóú|‰¾xÓ¿Ÿ;18"ú2³ì˜¿_üXÐõ/æ>•0ûf ðÓ^Ÿ¼p÷„#ã ÃD…Ù„ÿÏØ„þD¡ÿYð’¿­Èöì[€Õ9`TàNpC°Kþo›ùŒÿóåjÍý Ûó;Ù¿Rݯjm;ÇŽòyƒ\‡ ‰‚cüCL¼Õ´'zÎê§t©øåð.BW:®¶qÏ„äÏ]_ä ê}֙ꟷÆ-åÌ^ìBH¦ŸÆ+šµµS²Ds†¾lq%KkÝdó¸Šïê(M _½NºóÚ=µ[õÔéÁ=y»àb¬˜¢ˆÊ2(}1•¯œå<ò é°Ó4~ :á캛œà xµãP0;ª+¥ÛìÍ2ƒ^0ÖèMž˜§¡p(]ÓÒ^ûYº"Ÿ/¿˜Ê—é+ãgð_å&¹!å:¦9ŽWýom–뛄ñi‡oÊïÔ]eåH¿Ó‘¸­ß ÌÛ èOR}-¾-¨Vß-N`UsÙ:<˜8´¬ qXÚÍ·ðq® YÂwŽcs¶Í, Î/¼˜‘ݸiâ3h©î<:…/‹‰ú„Ì–ïÊáÎܸü@„Ý›ïÆduÈÜ€ýë×ç@HÄÃêöÜPVnlûÊši~‡¢[<ÅO¸”]ÝÝL·Z¶«k[°ó™žŒÞƒÞîÖž÷ÜáéaÔ­À1 ù\x½_áJl¨oÛí´YÚ»áË©—¯˜ã\»5k»ço9Y· ÿM '¼í°T±Ý8£¢æ­A…«öÖ&¨Ùg¶È4–XßLVÆk)Dkå:¢õ;6L¡Zwõ¾õE·Â£Ça“¹…õBrõ}b}Çø¶¦åÂâd–:£¹ð—‹Û½ìá‰Ú½ðû­("WÔß+6°lùÚ{x­ÓJB²¨G4zÚ¾ ȳ0BÑþ¬k2÷IcH¶—êBNÇx}$@º`‡²L#jk~»ÿÆoàì~a–ëkS#¡ðpÕ‡cÍâ¾/¶~³“tš¡í+[æq¯sÉK>.£þ¦#çÆ06so´€Åõ êMgkVXΈZ¬ì×QÊÕÖkLU©·¥Î‹m¼Ò%\Ûù• bÕ6ï­MúFÓÇi48£«ÍLƲh{ó¨UûÒ¦ö¥ÃFöd§¦…Ôƒ‰¬¥húÐGÊòÏɲ‘pæt¿ŸnèÔf'#Uðîæwg)ëjȸwP¼—‘ÞÅT³1¬xý³ö+n¯^^`t~û§ïš¹? [@ªL$'87ÚP1…ÈÐIߕէå; É~…®¾²’V®«)XÎB‡×óØ I8²ÜEm•3‹èéÓgfËKh¦ŠÞÜ//Pr= M§aý&­Ž =úð(0eÅäEá‚wrù(­YȬ”¦¿õu7:"ù€@SŃþpRœÑÈÓ½¹z"Q]oVþ°þ~• eÌÅš~¡¼=U£y©rÑM{ÂÄ®o- ÓQµEžºÅÛw s‡t¦_¿|¯kù»8Œɨ%%qE§BÖˆ»®¢‰/‰J1&šÒŒ›¢RTNl-ô.K ³[Ú6sP¿uñ#4uÍ>óGØW{BÉ y2áà™oånoM¶_!I† 2óyÈX­¯-;ìÅÃS5³#M…|wÒ‰vrÏ´å;’ì«© 3dùYGOõ1”k×ú­AFtÑW4ïô<’Òæ #Hõø»UAÒYŸðÜ?{¯ðhRž;Ú8ä§®vwJ-¬•šCÀS*º7Zõ¯¬Îk{Õfð-®.•½'¾Ì¡Ya{,•{{E:Ÿà2̆¬yаöãh›Ë°e™ô^_î1ÕÞ›ÑL_v Þ5,¢T—ÕÍ o¡=?÷Œû5))Ë« 8οµžËƈÎ}EÂ|™=)àXÚ÷U‡jjå‹9 iŠV²°”õÈʘ šx¿I]›|ÏÖ íçï^Í;EÚ|終jtÅø¬®ÒUz—qð{‹óÞ«¹¾œ™ì ïœåc Ÿ§[:i´HDõÔj Å`Ó^¼+‚”3´|ìÄÙ˜œëày£,2ݯq0+ê”=uÿøÓsèºFÈ•j`/¼Î¢ú½Å{X…Þû‹ŸK*ÞÊyU´=ïø¢¦Kмœ†½¿y)L,­Ñ‡HL|å<ØÛº)ÜŸ»)ŽÙ$®Sçrº:”SʘJ=àbG|,Ñ_ æ©r6”äj‹‰¶C¿ëS½½¢I=))ôÎ/]ÅÌÒâ5^þr9òÃúÖ,„R~Æéĉ¸–1ÊA}g:1ŒUw̤ÁŸQ‹àUÞ6ŽèœUõ¦çxc“ª¦4çí-CÉûm‘÷k£®.—QñŸm« y-|õw/k¯Ö«‹'DßzµåÐò9'£¯};ªW÷wÅ—ÈÁø9€],€ùW€9=ü©ž!ò==L»ÜÆÐ6v©6æþ6svø3;ZîÖtÇd¾¡”‰ S228wH­ÐòôdÑcJf…Q£ÆõJÉlHm:๿¿#ÿÜ“ôšw!X"ƒ:^´‚<|³ìíÙtx »“Áë>Œ{”{tÙ5õÄî³I·U2R¢ïâ‘â?2Å£¥"ÔKºïæ`eE™Gv™ÿÈ6–IrŠÞÜá>c<¼AvÛ\õC†€ZB…èooWkŒÉБ෵…ë‡á g£·À±¡MyBúЦBë.ܲî&ØBî%ËD@Ö=ÚMnoǤ ò¢f1â÷pPÊÝ?Ø[L}¸~¿Dú«-nÿ#þˆFÁ=ÿcYÂß(ƒ†#)íSh7¾ƒ#kÈHÑýÞÕ¿4ˆ?°”Í‚²mE|éþx‰ÇA ­?H½¼îz"­3)#qw€åЂh¸ê.oE Myéc m6dbx?ãT„àsgdì÷»†Q®òè5ß—mñ_d„‰ÚÞaGy9è·¥ŸïÄq´o…·"W I\„a“ˆÐX{ú(L…z'>;0gÍ3«säXSÀJ߈ mhK̘0ZË\+PÝ*OÌDM¼¹°—΂•îTB!“Xc&Ìä-BøëN©¡di¢Dl‚±ˆ dg˜G, ¡4§.(‹ÉcrÙë_+ £ü-8¦ˆ3¶,"B€áÿÖ¸bÝb…ì—ë°1È-Ú£¸¡ž_'~ûÖGYO júÀNît¶ºƒ5L—¯Ð *ß®ßüþ¨£{Í»¦ÔT0î2aR﹇3gUbèøéýÏ«ê¾ÑFNÉX‰·óò¼°—n¯|Ž3®|Úzø½1,kù—ía¡ Ì‡²ñNþ!ç‹Â'7»©l:k|ÒÞ³=öé”le-*£îžÐ`ÕDzù¼aùu½¯Wr‡8—[ÀÓOZÌßâüæGz£³ÜåPSñ«uÔ¡¦ÇŠ&È3‡šÖõ7A áµ5ÔØn÷hóî|”ÍÎè§IfÍ0æŒx»TÚ vÙZ¥ ­-ê=)sX… x >® .Un∞±ã¾©q'ùgÙ¨%Çcþ;'ã Ù©Éðj¼oMÍê:g¬bo§ QËÕÏB g‘ØÞqØÂT o®$‹=©o«íÊë•ßšQÑ¢ÄÅÕ¶å²n¾ží«î*N¨UÈØšV^K®ût_‰0û¾ÄUðzภtýs5ÛšæÛB3o½¤W¨©?ˆ! ¸2¿ÿü "ˆ_×vCÔ!X§™¡g©æ¸~ ˆBDT)¶HŒþf’du挨Rb‘z’–½Pÿ4VúìQ„bSVpžÄÑBªÇëš2Yáš5r£;ï7^°y#ª{bƒ€Øë\Ò+§Ì¤ï‘Lƒ”+~TMâ`ˆA¾¤#ßеu#ol5·¬Ê™U§Æoß-y,qå±gÿ LCY°Z\úáþ¾÷V“ñHÌÝWr×\´YÛ&L5Mí}ߘÎï€÷õÛµIç=´³KGl,¼4)“ˆk'ÁMŸ°øÆë ØMîT§ Ñm± Á²i [QÑ}í7nëš8Lìï°Ž½KC‡øþ3ÁÿÐÉ××°Ú‹éê6ÏA?ÂÅ]ÐÊDÅ]»P¹ÚhÒÓí‰ü—7”Õçk¸Êê;ÎæÕµÁßÓ‹áGÃkõ•¿eX¶¤¿Øî¼â€oºø`Ë·Šæ‘(¢˜gÏI"[ôQTËÎÉ®Cà’}Z^¦¦Cœëü¢ )%µ†ÆÃlT0 +j¸·•¾2!5 ËÌ/7ÓšÀ2/d°Õ=„ÿÖ›>ߣË%)o„‚„³‹…ªÎ´ëêl;T{"­þüãWÐ{æb?&¬‘  º·N¦!´E#EX4"ùox¸3bx<<øm]·O uÒ¶BzwúàMjZÛ߀ϴ’"Ú”ô*,ã‘k-“ã!›"Ú©Aç°ØiAn½Y®z#ó×nCìSlKÁo¿c¼eœ"©ÆY¥)³h1“t‘…Ö™uÖ½æ~F½$³i 'ÑR Ò¼ú¹Yp¢ˆÐ]úù+ÙDdûà˜¨â,gH56- x(¶hÉ×#±E¥ñ â÷$ŒK ¬¥g´æ””–xÇØ”Ý"Þ½í þâÂ(ï .;¯úê=«sz£*y¡œøB9܃0÷öeTí9ð~Å Òj§NoJEJÈBõδ­v8j^9´ñ´Zßêö|M›½l1™ƒ¬/E¾Lüô®Ï1!¶Í"W³“Hjv‚/Eõ“ôˆ‹ˆ6k¼µá~ ËåÜ&»ÍÜë/u½ƒ†\Å?DÔÈÊâ§ãÆŠ)izo8[NµzÆø”µâUHê´ðëÓÍ'f‚}íqQ³„*ªÀ‹É¡Œ–qFÓ%èD´‘y<ÛoO3m‘Ï š»n­Ü·"Ï%…b΂rÈбÒôn§¬n’­gæá¹êôð§öigË`‹`3îÓ/Òw¢ÑiSsöÏ‹è.ð–#¥T"úà„ç,/ÏuÇ©äš(4uÅ©ÚgŸª.A+( âVÎÒ6üÁ¥ŠXì=ŒaÛpd†^¤xœt¯„笘×8Þ¥ƒ’9¯C|Ër|¯ã¨ ¨ÀÝ:£³S KY¹€¥NŸïŸ…\å)çK«„ 'Mµ??Gú%ÊÕßIõçT9Þøˆ%onÄ*2µ¯ª!uÓ-6ùpµß[r[Ó–!Aù©­¨êN,D¥_¾œ£kjKï=qŽn?/u{á\ÜÖ¼ï™dˆŒŽÖú¦Zò®ìçhŽIc™F=Î'Ë+J/ïäõVÖ§ât¬öý1ßd—Cˆ‘·u6pËe.è_‘KbIcÉbÉS*b)c©P“´d­f’¾Žøf«î°PnEiƒeGé@éÆ%Ô›D0dò¦-g5,—0W0× 7 7=·5w5,ˆ"5RmWLŸdEéÍÒH)KiC‰DÙX9KyC™DÅXEŽªvâ»6<ŠjDˆ…:9•·l²rºröźÉ\œSAÕ{\ŽŸ{”*Ä‹ñãsß¼ª8GÂ+7b z;‡Ø×­ÿ˜ºfp±øðQàò|ˆL~Ÿ:ú~ªåD:õ–WÅæP2Ìçz2½Ž¬º6Áû°‡¹'ðë¡YN_uÝâ­Fw§LõíÂÁèÍÒÑ%¢íÒÉjtO¸å"Ñ\¶i½Îüe[SЩàF@îëÍ:‹¨xmEž•Ûw„ãë<L2:vÌäI™TŠÍË(K…\ÌQÌ3Í(ÏÏ1y…níÑT49Ážõ2ø+¡k72“¼5+£ï`þŠŽ‡YѲo~Æ1¸ÇÞÓ®Äqz>s˜Ç´8]#n_'Áhf[à)//~¹´"ÜÅqZbé¡uº~6Ó›+vzhÉE©‘Eài`”ªíôA ‡b7È?#;cÎ j"Qœ„,ruŠrŸÉzê ¸õºÛÇ„ýv^œå `ÒÈ4ôÜ|ëâ³1Ãè°þ@ÛWa³PòòŽwÑ8]ÁîT š¸é]§‰‹œ2NI£7ùλ{Å»Ê ່àn(x*}{?§fòßÕ‘ÈnKîR]ñfõFÝ¥M&þª”¨Ê° »ü Ù9 ¢ˆê@`#ÞÀÀ}¸|—0ƒ}É^Œ¾”Ñ(ù{ªµ^‹§uåÝü⹦W7–­æ|e[cû;^(ñ ¡1Ô\È”<áYvâ¡€±ßDÞ)ä!Ñ8äwmÑ|×¶ÑÒ¿Çü¾ùÚ†sÜóƒvÈZÁ‰µ„vX Ü@›µ)žÔÛøÌr(Ø×š†0Öú4ò].ztRiÈ„g•i.×o%ŽPg¤Or¯Š«vp”mŒ#Ü"ØÌ¸^?vIOL*mŒØÈæ*²”²T²Ô°4(·°t°üRîgVg™VžŸhùä%9 _MÚ/šÈÆÏõ>•dýJŒê»…m*«5ÄÜ*’•b¥ô² û¦&cM¿[ûnÏþ7uld œÛõ]»pÝ\×µ™ù‰®Ð±¯°®ËKFl§®°D!dÝ~´´ÂÂ’1ã¸Ocèç¬&…ºr"…RƒFÌ º¾¹»×c‰·É0šÂÒ¤N#ì†+²f-ƒ ˜ä±™VÀ%ƒ%®™° ï(ro/­‰G¬!rhÒi/‹^qÜfÜ·-ík)€]žxÝà§#x ·/r^T}<áH%wÚQ§UáÀH CšYê’QšŒÆJY.=ú9‹¼º]­ƒäé šiFÆxQ ‚I¨Æô“éëaNuÁ“¾ñU,}¾zV¡ –·®öSiá]áù‘OžÞˆ6¸3˜ÀÈJ.›×j­?¢•Ø¥ç_ %ÐøT»/L×ôÉiKB<>ÐòÙ•4šª³ë§åÁ5–Ü!ß*×S¾·NI]Ô€˜ä›+²©B“Òãj3q…¥føP[µÆÞÊÖzrXn›’¯ ®=jvØÁ‚4ã·V‹U¥¡ä¸‹†þ¡…*Ždú‚ƒ ©µxñúØô:‰•}‘è` ‡Ì8;¼§¥KZÈN¥q÷òýoÄ·G^§íVEÝ\øwŒ_ÙŒò¼¦ØÜºi¨Þ¦ü¬@83Áé2/³×¾ïº®¹<iž}°y8t»:ýy¤Óàu¶{è5Ýèq¿I‹|ïqÖùÓÕ•n±É£ÖF(a„Çÿ¼ þç=JÚ-Bä·ï§Ô+õU_$ãµ+=¨gû-úWQÔ´ˆÐ¼{à±Ú) Cz uTâÇ×7XÃ;>­o ;€²U­ ¨o&æÉŒ$•UúŒÞù&rO9娀 ¡à«±ÏîÖ«èh»fä^çÿ´ÌÛ ‚ÏïZŒA–ø"LçïWN$>“D"’cLyZ2†2WÉ?*!™k›ÏÂÀºR"5háè5À±îÙ´í¸Þ´²ßkÈÀ¹×9¥j‹ôƒàWÎ^&ÑO(ê7ÑŽ–Í?(ªla1X«¡˜YØzåÚœˆý}ò9j:.Œ”QþŒ—ÑÞ÷¯AÓH­.8b`ÉHÎï_û[15¨…Òî,¶Áõ™úËŸ¢ÞB$u˜ê1íãÿpfðDu¤qt1h¢mÇÕ x§ Úå×Ü}«È­‡*DÉ·¼¢¸rþlt›«0vL£>ßâ¡eK¥¼¿¬A‘6œ¶— K«˜;û](ÙCkf¡÷uòòM–†!uµé ”ÚÏF‚óŸfÈW¹)ïË»4¬p.•˜\ÝóÚçÄ]]We®k,†©<}lg¨8[z¡³álc«¥²­ÇºÌ÷*¯?~$8}½ýjú2ŒŒ7Iø}º4? ¾³õhk×hë&žJÝt~8Ï‘‘$¼”ƒ)ŸU»j5B"\ãFÃÎ\µWµ¹Þ÷5é-Ä­pknø©Žq¼7¿,“FWÀHwpòÃg<’Š9o5Ó&µƒkͲ$NaWKÑZÕÓb^Ô– æ½"ZCê<Ôá4Euââf¬œ°ÖGØÕ¶›l«üœÛÕüÙæ?ͤ½bSd¿@ ׯ¬|8É9UäTÍ™çôs².{¶ëÇÅ»­‹¤ Ρ(©ÀL aMoŽ9Î%ç.‘f…b’†KæÙ‰q÷©8ºÚ ™Ó¨VóÓ™¯~ ¯Ž~j$aAÍ*‰åâ„·‰•TèÖã{Yð›e0 ºåtÄ&mQ“õ8™œ+ 7, äçÚ$%^ÄZ¾©W(QÜTWí·~uNl·ÛÛnÖ«GLÇWêW]í<Ñ–“–¢ô¹D¸%"Þ0Ñ Œx3ºzàÉ; m²Bvgnßß^_u—eؤÌEáÆÆ× WgÊÐ;0£O{/µçØÐéE{ɰLߎ>ä$è…óŠ‚«CªÃRûxÖ´?„éêªñÇÊ.tT ó¬ š’U)ËMewmé(cß=¤¹ íżYËÆjÓǫ̃‰dìñ¤Ÿ‘–•9a§ú¹Sf>é¤ͯ¢0xH…|»÷vå^é•õåÞú™RÇ9_ùx¢í’. ᆱÆÏßλæ\™Cš;¤Ï¤Cauš6qG[|Ýítp,xg}ÿ™­}ºw ¥~,3ŸådÆîaqËÞ—'¼õ[ ‡>­Ì´¶>j¥\Ãl2x*¼?<Áv{‹À /Œ7ùy‹´7¹09ÿ9á´ˆ?¤RÜ/¹–m¡ d$pm/òä~ç„£~$<‰Jbü;BY~Ì* f¨n´Û[^¤Ù4!ãþ“åLi[öÔö½ò½ð¾üR¿ÉÑÙ»• ¢I¢Qˆ¢§Á¸¢Ö÷%q$pHd8”húê¿#o;J‘l¢èP¼–þb + Z*-KÓ®ãô kƒ=KÎÙ±1¡!át]+LlFž‹ˆéz\¯ËO÷ìˆ+kËÈGx¼;ÿ!ïÑA§`í·hQðŒuøØðËX´Y>¶Ê¦.¿>Ó°ã“¿& G¡ü i„P–%ïlé( ñ òð~È7<’=ޱ0–/ÑÊ(“ÄEÄÅÄ%Ä¥äe ö4ôb¸T4æÖ š”ÍJ~ë¤#$3"+Æ;,RUß #!b‰1D0„ƒÄ¿ˆ‡ˆ Á« ÂÞÜ$¯“ꕚ•ÚmØe¢`޲¡^ωPÀ&uT°ݘΜɜ͜˜/p‰ðÈð©HÝŠ±q¢o¥À„²Â±xe>j¦žx3ëì½I¦Lµt0c‡6¥jA"~ç‡vɃŸÜæµÒÞ¸k¡W¨sa¿¾÷n*h²ÛE.é®z¬»„6µ¬BîgêáÊÔö‚\ºÀ’Œ@Ý´‰ޛÔ˜R®wëôr/¦œ•¶¨¸ð¶ËÑÀËôÝcȯMÊY\œˆ¦Þ¿ä©Çh$F,¶Ï ξZ,LXnŸãÿ¤t‰9Ö¿+Ê_xâAÙÞ¢j¥íg]Uý¤µ:”=ê¥1ûl©@Ëb:SÍ­ú9×€L­·Ûugã,uƒõƒ^=®’m$K‚ǰÈ%Áw;‡¬nõû%³úTǹp{Ÿž(>;»‡Vw_‚.NÅX)FEîO_Ù!l.=eXóXR¬ äî\²©-êbsï¸íUœÙ/|£=kÁk™:2Ÿ|>Oº7öí.® {æn…¶:³]¤»qØ» @­ÿh¶u Ö;w«¹Qb¼ÚÚüm\ÜDwûnügü•Ü‚ïâzúå±êoôÕͲ„-ß6ÛPM³–z›#ˆH¶]pl†œ\È„ì?a×B?šË”ꬲ¯tÅä~j. :9å±`DÜ¡E( á™oð»Rc´_ …×ÙÑÄ»4ïFwlËÖËaþL2i½Ë³Òÿ ]PËe¢23Îø°.€Ú¯Æ9ÂÊ¥#=þGX{ÍœÈJ©[oSôHϲïtq|¬ Ztoˆ^/ßtì™™ÿßw2„tϦ…¹ÈÞ=„±L3Å\kœÜêôýfɸÆJæ  ]3…Õ¥d-£Ë,§ÔÕ•= A©íaëW{kMÜ᳟3@RˆR‹P÷5cù-3Àú[)á&Û C¯ª ݘj /ß‹ö!r®’Òe[žøÝïžüøÅ ^£(õêás*CÙ–ÁMÙ®Wà\íûoS|i[9GVhvŠ&hÎS°ß:éŸdH³_{³¾ý1›Ó”Rjj53x¤ßiò0A%pÖýùõÈ‚¶(”ŸP=²µNïÔ<”›‘åäM¨6èðw/0+ÁF°Õ‰8_²wBzèRd¶ØPŸE¨*’èív‡Ì»à.;rŒÑ ÂA¬Ë#'A¶ o1Á·eÔˆ&0]WÓ\‡“ }nÿ ¦ˆ:ïèÐÛ]Xz{µDD=µM¡áWA~<ê äIúÊê-ýoÞ1ëû}©V,üš’}¬ÖÎä´EWÜ߯–?±‡TÇ[u5ÐdC*uÏÙð~j1 Aœà.P{U¾*s‹·z  "gˆ2÷$yvƒŒ>eÄø;W?û-ÒUt…-Y}/ùü] Èô,YÛ°y4C'™á­÷c3Зßzú8d«lAZÜDxÕ‚?¶ðT0€,a“€¼Söã´#¨rG·Œ*/…\uf¯§öϰ_îfQ/ÌÔ;T¤ÕàÑàI×pzÝDFGUsP:M+ŠPúíí¨#›jë;78²7£QÎI·.]¯qˆ›YÕÑ!–uÅe Y–ªW–ÕKF‚ÈÎ%®c¢'»‹jbºïG)B€ÌGµÏܮϴº›cóœ/q {QJwuþBÌûÄóÅÿ‡í ó‰î+ÉÒwí“W}!'¼{E©uõ* –Lá+µ¦úß»Èß¡FCàx?L$ZŠm 5ëÅYÝѬt&_§·Á”ò9bCw}ámÙë]«]„•¸¡ƒ:aëßJ8."$uC`ðFš *Ž6ÜaÁù<7S>~›e‰ï Qšákž_ ·˜6¢DÍå®’€Ægd¾Òü†-ùä|lôÏŸë3e曩ºA PIÔnùÐzQ ,)G¶mË4mž 徿«7úÅ’ü᫃-)9B«È3¶~UwCM B`ãíîêYkW95¢ÀË}ÌR¿Ö[žv!×Õ–õ'41v:»}?[`òñ!óf|n“úW­ÀÉ£ø«ÙA¯ËìË:o–ÍOLâ_—šMu‡Aºˆ¦”AÕ@§hibºT5ù¤t Q&«£ ýBPâ{£çzÚ!a :l"kgH@7M(¡”¿`nrµø4` Ç›©hÍï`øT „(š$uÒô ñn <¾!ìvÄm«fÿk,¶ß€Ø…%”4;;ô£…ƒ È;µ6‚íš6/sH–’õJ,]P(i Ö=ðÛ­µÂùÔÀ¤;Î{®eK¥Õºjš¡€ÊÓ!t‹H³8L?=*êW—7#4Æùöè’v-™eåÌd~[+Ë £dì„\ˆÉïYd~¡cÙµüN=4ÆÑ¢+oò”ô ßð$¾fOÜlËaÙEÔÿÆ%å6Ë ŸÈ ƒ¤¢× qÆîë‹-¾YÈž ó ^ÂÉêÌ÷J-cqtPå/ 23ä%VCpó’–ûaˆy»8ãKkÓúúIûÐ*·1Gʰ¢õïòKßTp–ÕœF»cÔLÂÁ1—Å•æìÈ$Á•*¢XÀ¸ð³<äšpù=†O·Ð£A  æéV܃ÚéFÚέcX¼U [ÐQeË+ù“,“9àìô3zº~á‚L„ýuø†¿wY‡÷žÔ˘Wo€–÷$·yÈN‡Ú;‘ãj’#‡×r L£è $"Ub!Zaƒž”„ÖvJฆ{`†¹5‘ÝE¢töKCm ZYÇ¯ïµæ ‘ñìÊÌÖ%¸£³ú~ï›zÀó¨D½{²,ºXË¥êW´¯5˜h˜”ä£ö¸HN1WKÚ"ýu Vư;QHÐÕW0<ײ©–‹ßíB&mu™’)?=Ü%@ûw0“ÇdkOÄ´Z&X¿v9VÒ~?ÞC¹g'b6 Ë€2QSJ*®¬PH].ùÕ0æ©û»¥ÀÌZ‹õd9¨Ö &ªÜþ™HgÙ(ÐjeGŽ>/Ô.(‰ ˜ÆÃ;[¿* (º`Ú×õL‹c÷¶àf§+Jî*Þ‰|îáò̲ÔN“$ Ú´0Ï3ûšŸ¿€2/Äqá2¿Âj¹žšÛÚÝvcÀ,e*= rn—ßúfé‰×–q=!H÷k‡Ϥ˜¤¦Ñž…. û Tä$$–D~ë&Z°–|>³1ì¤ÑÉÜKž¿"¨bàœ»¥±4¿Ø?&Þ£Û û®€ä|çÒ ­ŸÕY:À¸²OFƒÒwÌ«‰Oð%‰L êA ' 1<Œd ¥ê›Ø7‘§º*ÿXM—TÀi:b:vV©0¯ÿË>/Ùë3ªèB+‰õÉ&R²øZE.ëÛl¨éÏo`R©WffLP]Nm™ðL×Î’ÇB-BHÄÞ-ëÕJ¦¾Ie»=Æ^ŽSËb›œÍSõ{Kýú½)ý ý:/+‰€õƽWÁÊU½0Ä@/„KÞñD×]ޏÎ$ööë&Í+º‘r÷S8æŸ?x6ÎtI¸×RX×SÐ|aÎùË$ƒŽ,Þ¦†šœ;:Ï…Áþ0úr/æG© EAÖjh]Q»#Ž»(ë™°ÑùéçÅÍØ5ÚF™Ú¨Â#µ)3ËÁÕ%?1\œm@Ñ‹WB¾ïk„!èwCÏ^_­0kP“£‘™M§×r 4¯–wyEßí¸ëîŽ?‡®WLÀ`Ò$ÀM3_9#J ²<9««Ç›=ˆz9Ì€¸_¤]S\]šÍUMÝ›˜h,el6ŸézÒù\‡rÿøD»âòm&$õšQsÆ´ý”×=|ÀÒ Ÿ/7ê2o”½7~…!1û©ö)kSË}çÑ{ó¬6;sºz(eCÔFò›õ%7¤7»ª·~„­{'Pè.ÿ9 ·½•EXxQ¸5:`E,;³y*gvl£ôýª¾Ú+*‚’F¹±Ú€X–´ –U‚ ™ÖFiÑÐ`_˜¾êK`â#Žo—•Ñ~$³ò°m¢}39“„d€ŽŠ“P½zSãgÜmVB¼4Rjcì}¡fÚd³ Ò­âˆÚþfÕ$Àdíìuýk… Žÿ«Í§"~Î5N‘‡ PÖ˜>ŽváØ8AÁSó_ Žc„ÕòK}ů¥…àíhôK:&ØJ¶ GµÙ¢×é©£¤õ@û‚¬¶†¯»+Æj= nÇZ ëÔ¡EFø{•Û”°èÛëxTŹ £ý•f—Ȇ->x"«¥Ð ·ò†^ml%o,!ƒ`ôö®føOÕò–ú @I>Œd^NW1jÄK,yEEÏO¼­í.®ÇÂÿóÕ­pqH‚b¢‰ áÚæÖâqaöÐ\3_PI cðhMšŸgîUÖ!o?Ìç §l ÀëX|¥ \¢2Íg#·ˆ2‰Â¦ÝÍ¢‘s~Äýš!2ïpÂÅã-4‚;]5u?§¾¯¦žP« ê¥E/Ù¦¥)“g›4fl"g/󡈃ýõÑã/T ¶£¥¯d|˜-u3â£h S›SßÃK@]Ò4=¥Dõ2êkÕe´Ï—‰P¾ t#x ’ùí÷å±—×—ª·ªl·øK¿†P3Uôy¬ãúIèg)çt¿çwEÐêÎù¹Œzœäš#µÝ`¯Ê,Z=rÌB"e¬zÇa8|&¬O~¸VT »‡š` t±ÐB5žýÜÔÇ;…ãñ •šÛð"S+¯:b2‹N¨}ô;âÙ­U›Hìá1Л_{·× °b㆓:aR8 Ü›¥¦qÈÆ°qïˆo”ê(9t× œ& *ÛYú »Lv£æz[ŒÔÄxªûäŠ+l½}±®"#ÆN+M$áU9™Â>GäÊT3*ohÕ¤%Ü9í%åëO×|îËOºú°ïâ ˆ5SN’&|F½I±T°1Õß.î¿z|HCwÖHÉÅv¬bó½àu†öR‰Èä÷¾5)-–ÛÔï¬SœŽEåå,ÝÓïæÞ[êV‰AâleCïPó–ŽêOµëWž–üËf_(C‘D]º Ö¶©êܱvcˆ^X“Ô£©-ë§JtÁR¶¥ä ‚s1 MˆNmµÖâ¨u‹Ú £c—L:D¼ ST„ÿàß'æ<È}®Òz‚bz…£„èq¶ÿJzfeÿÍ2N$.õI)¼ï³ª±–×½ö].v}œt_Oîý* g{§‹%ïéû,]«ö | Zצž0 0¤p.f!@lˆà‰Š¡q©%£k™«©:dºéægPŽ ¹®[ܵÏ=ÍžamRnÁl«}w¡e#š<ädéû}æÂ=µªFú¤'ºu!ïW>=ÿ$[Oþo:þ O<ƒïÂÍyù vT¬Nš„(z¢Ï™‡'õ‚~j/6®]¹.r#­]i(^da[õ¤ûË;ÚŸ·V:|Ž _0‹»Ñùx©Goâ«_&ÇÈr9 ­«I!oâî")òZHž-úcß~MϹﻄñÜVv~ƒ¸ÏmXë¬Ó=ÓKÆÞ؈ð½ÛûÜè†[»;Ǥ-…,E™äÎ!,…¢E'ËŽ«Æ<ÝSŸ‘jíêŠ/¹´-Çz4à:ÕòSë¿ß î¹BÊ– tð"šqß])}’jî÷“½qfʵè‚RZ\W? W-ÂÀÃâé½»PêA²åðuh00N½LfÄl·‚‡o­ÍA¨äÂ,Ž(l´*3†Ù×¼0îÿúeÐïVýMñwfÑ΋yîßú„¿™ßû_™y¼ù¡WH‰´Y¦¿E'Fh†j R3{ªbo‡Pz×#ˆõÞys™6áZüw8¸ä%f?¯¢A ÷å ]k¥ L®:äY!¥þ¿² '@uëU…¦è .¥+Î0Çš@!Ý6SÁ¹L{®¥’&ƒƒdÆÅ[\¸ç²Dç_c« x§™.—"­èmͤëìÖIYD ƒûºcìÔú*p,VuÇTös}ç‚o^Š9ƒÜ¡–…òÔ1ÆL»YœŸup¯–Ö¾lÄÈì÷&u—Z×)™îQ'4 …êºQ ¼¦KC‚h¤ YøMK^P\%H(§±õz+Ë4äiÓ¢ãÖÅ× 4r(uŸyâ¹&Õê)²mQsÇkJ12òúQ¾x ±W8ün¦Ö!—P¹?uóéxáÞ_ ÎÉ}U0qì;}?¼æQ•'u´‹!mìr¤³d›Ì3£eGE—”XíF[…¼\¿¦M®ÐOÌÇE—a¬¯—éÿú”–?#D|ßèê’LáRj†ß½67fð!º %¡‚Ø©,­UnÄû!{æ:O¨ìD‘^ÿíìå8¦”OÖædŸ÷OÍ+‚ÑëLè§*©úrp—'„¦Aµî‰cC-ƒ7¯d’Œ«#¸çŠ”¤¦•³ÒáqeÁ¥“ý,<Û×Âé“cOvvqÔÆä¡ä¬Øt¿…šáåV$6¦×,·ÂYÃÃY¬m\!q²fƂÌì66(ä^5}tžb1 PúÒ ’#PPT9kI>©¹_®<(ƒ×5sT ·°ÓJéltLtW[’ ¡gµ0{m6ÚÞ7|²¼MƒXù]ÅZY:áÞ›Fz+§LjŒŒ…S,ìÛ`n¢¸Ë¥™Î—u@oÓB£—à"«l¯[âç©ucÿ¯[›½JE¢‘ èøXjj¼y÷â5›ž!¨ÍzÊlÄ^º*æ¤æ8mèôƒ”sѿˑ·ß1¶¹[Ù•½ º¸G6]þlºÿÓgVï m]g÷Ū™b ÊMG«u–Ò/_5çD;í®êŸ'Ä÷uŒ¼._„zAÈ#Cv'…t‘?8¿».¡úq£X@Y_¶–-†ÜYqP—Àc墻Eh¬e©ë䑨v\°ªÊÕºx&ëGÔ$0Óž[šÉÜ´€E¿ ú:qÌÖn‰¦$ZÏzN†=~[Ã|Á¡r¹nÿPé蕜µìeÍ@5¢=¤h² (8Ò^%:8ôÈúûnÏ×õŸ™ýÂPñÙù—îqæ¿]ÁV7aÐìµÒ§’p»ìÇA¬$Hbv`«0ø]nc /¬ÛY¨rYJÜwë#lzй냠LJ ÃOó;í`^C̹´QgjR¾mh½!íg-N¿„«tx•Œ •6F-c²Ån>¥¢Üe¯±Î}¥ÈœvŽÓaœ@fRÝî ªS¸ rÛK~Óeb”‹I7Z×ÎCwÇ(‚FàŒ×RÕˆ„T|À³4> R?ŸwÕ*â°&S[¦zªwE‹ADÞn¼³0:JÞu ¾2>”‰“I,Oˆ©kxzYîì)¤õOy¨ÌOº„iå “ÒßB@ ãÑ`Á3\P[šÎ9¦oµ}±Í*ò©Üè™M&„ð*|Õ;{Z©áXã™ xtZ/‘šZ&@__&ñ 7/eOÅ~†qK M{Ûª“*ué_篳·O?;6;Ý™ Îíèin•)ù+âW—„Œ48Eî€òdÁOB27·ÇïZÓw‡C¯ŽsWB3º®Ú1ŒFIøûûåY„“Y~—sm”Ö}K·ª#3{*.ª1˜LU¯¨™ ®™íã4´³rU¦¢ó Xƽì§ïB|uCÜ:3Fs}>ÂØ›í_mæ:Gi²ì›©:¦ýþõ}ÀuÐJOôpæÑ[·r\<°À(I‘hkÃA=LÍï¼u*ÎW3¦ß>Ë­÷'³TYªªNÓ„¶[oW ™mšÔ毰DuNÎæ(b4qãS{Ýmà˜Ã/?1û³Œ0õÔ2óÛè±F/Þļ2‰­õPÔØ(öÙl  Æ*2«åÙÙ}}år$B«Ì°s œX2mE154‰SÅÆ)Hlé»A5Q)ÜÐOŒÐ o±í‹bÁSPê Ž‘ Ù¾*@— 5â hBÅÂB¦1pÖ€†qn©÷y-d™eë\-çV$q5äÑ¿‘#™Â×£¥1™2µª³XX1ÀpN´ÿÒh‚xJJ`¤¬,/gdì nZÒ˜m75úJ%–ɺ¢Ôô¬F 3»]@‚jàÒ´ Ò)º@’_€îÃ&Þõ‚ŽUÁ,s5ãØ€F|­2XéÍB›h¨ÕÑC)½Æ IÿÂYòþj(© ãp2 þ~è#ëØ÷Öµ¢34À0 k@±Û!µ*ƒ!¬¢ñÅ#ÙÍc 1ŒMüå#É•è‰èÕo¡ M¯ü„H<\fV‹ÙÑÎy^3 j{FBå~øÚ%¬¾ßsé0ÊËÀi©gÁ ÂŽ˜#nÍFª Ìš¬ô•f £%©ÏiÙ:!Ô,‘* qŽh=¡öÜlö!“ ®ÕÓ¼I6¦9\“Ÿ/þy™Ží#ÿõ;}‰ØÖåÁÐÊòžï£Bz¥“˜Œûñ5º$^ ù¥Ë.¯RX;ØÇU§A l¹e§ ȸ(, [ѳ¼ïÖ³OÀ³ÂŒ÷“˜d’ €ˆ`“n¤@àôMïUf·Ó¢ne4IU«ž Œ6ßË䃹Ԡpñ8†p©´`4þÀ…­%É á¶òi’§ïS†6ƒ€ÇÆU~¿&%\Ãq œ0á°«1©ßÎ%Ô¤W8„üI'ÿUIÄ•±fÑ(Ev¸;ı•¨¨Miï.<¹Öªi*¤·ù‚C_©^n†²>WK¡8A¶4Ïo÷¾™òá äzr8È© zF²Ë7F¹fu¿¡´BÞ¨ãQ%VÏÐôÿü°½SU)—È“/ïØŸZ_¼Ê… eûõÃG»yL)ØÏƒè”ÎW¥¨t:ÆŸÆãJ¿ºÔœäÇ€ áå$ „AH9%Œnõ[‹Ôé\%°Ó°êiHœë 1—‡~ýŽÔJ°iX;Ì–›Á(àé–S”ô«6eÉëb}î²ÝöH—ïþ÷5ŸíãïÓ±6ü£7^7›Ý®Wo3¶®®è†luR <ˆ¼(Ãmçw`ïl2ùüŽÀ~lü ëä v³)ãË~ptx®Aý˜i˜4†ÿˆoÚ6……ØTÿ¡ÌãÇç’úë–rFü/×w,ºŒŒÁX…H¿„!lÝ>{Ëe^±õ.ÐlM—ÏxJ² åàƒS ÊQ ƒŒuç£åö{F±àwǸ|ãpþæ‹°d¾4ê­þ1È7ÅI~fîhS»Nò*¯qlüÞ Ðî|ÁR{G„Ÿ,Ê£„²ÎÓgÕ$ËÐßjÐXjŽ}[G¬w/T–«˜d¢ @ûšBî‰YoÊþ ƒŠãkïa…›Fè>ˆkòuCõé:1Ÿ1‡Í>#_qšU%Mïaê%Œª)¸5öå@í½©Ÿ×AdŸh À™û– µ„»œ/ø‘áÖÞ’¡à“2Òüil;T˜ðrÌ.Ô»Y«Öåz÷~Q=aDê\ð9½Èh¡Fé)zLŽîˆŠÛV©·Ñš&Ñ}{Nö—¿~ NV~é:ػƭ¢wvð)¬ œ”WPŒ“O·,ƒ_à}܆ÙG‡Þ ›õý½é%)eŠŽ¹ã†ãœÝZ”#=¿ÙÞcؾ—ðØïyf]/ŽCY6ñ1b‰ŒÇæÃŽ=ôÒ+9â%÷@c×djRKJŠÅ‰)ûBòqwÔ€,=r• ÃZì­÷Žåˆ]™Hom>Óé/¡ƒM»›íãžN©’òœ\w¥${-/Ôª©û &Ñé¿–­ƒKlõï»ðŽ}µ|g ÎâÃö)ƒJE²Â=)U$ Zꇆ‹GgM .ýð&fÆ‚ÕÏ5Ú’)Žo8ÞíS²¼>7› ²GÞ§k1c% <7÷kcSK¾7¿ºÇ2Ž–šîŽ7wšç›»N=o·èð¹yï%B“T3l›å#––Sö{Ë¿z q¬š1ô0Âaì®B½M£X:mùQ0N(9SúK¦ˆdœå=Xò'Öaê^~.²a³ÖT•6Ô12d&K?-Ù©<›í(/RÖAÀ'Z\*êtLù‹Åø£©aCk-ÁX2ä(ʉ©};U›x0–¯A®4kAH‡«ÌÔö¿žxò¹4øGóÇt‰ÍY—M GC—ÀAìêµN,ΤfªîìFîC@i@a˜Ô'Yº7‚2™í“Á#ÔáA¶RJ¿¢,}×Ä{yy âºBDPåD“Ï©*H'4úzìx̺gí.ä“1Ìõ²ƒÿ]ÃÆ÷úz»àÄÈÜ>Cï%þ>|¡'|…hJ¦`õ ¾¢¶B‡7ë­ Hžò@£Ô ñ%èÍ gˆWBã ÿV‹ó§ñM«q+B‰7¸ªãGÔ“1^Ûô¨{ê÷œþ¬¡òŽazÁ×òÌ£d,¨Š‹r2-&xÿô:n÷Ü0µ—¦ÛTj+bä;VRú¨²Œ‰‘‘™hÚh,nsÁG•o>¢­¶îaú/øµN/ˆþˆQµƒÇ¿% ˆq©ÐÞšmÐÙð£8ÿ!¤ŽI6²%`u÷‹ÀHî S £öŠ ¢Mìf"?6gÎÚhùwÎ(ð'¿>èQQ¶mNA2¨·è³QåÐö€´vrü¤Aˆþô`•{c¯¿É+×B.C“á× B&>¶spUy¶†¶ö!Z-¢;t²EãÐ4‹BùÐ3.Á+Æ«‡™:‰ÛÏëß9êÑöªBaÎ!àò&#0ƒ­Ôc›s.Ü8§ïו€GrrêçýÞQ¤ÑÑ…‚QQÛakN:¼Li5x¦Èâ6ÇðJ¬§ñNÀp7k«ô+Š0—›6Á»X6úbÃíÑ‚á+/~†¾”Î:ê« ™UØowîYêX™ö1ý•QF¶‡¦“oâö hH-L•·zä…‚5I®û w§.>n2JlQÆ]8wR¢oéhíÅŽmœì?’qùž6—m-oÅæ®-…Ðý†äÓYŠËèÎyëû1àa›+í(í—ŸóÏ"#÷SÑœuÖîK:ž1’…I v¬Oœœºmâ¢ør\ò=älÊzáuBÊl–™;KèÑZQár¸i?{{è‰Nº×E•¶¨Þ²]iú‚õ”}ÌÔN¨À©$³|Tö†‘…K¶} ¼7¨›8©E¾ƒ]ÀºÁ?(å¾UE¤Ý’– Ls‘­,û—³§…àżCí¶áâoi6Õ{ S{c(<~z»„ò­Ïš"ˆXºØaFºIâß] VžGEß·²f¼µ “x`´@ ÀOŒhUý=œ#*°'ß}òíÁª­å·;„ZʃQ’š“xŠ5zÂÚYô½•~“j°¿Ñ\‡>‡ðÍÐ%#ë¼ýCý*pä‡]‰ ?¿Ý;úa…_flsZ}{C™ªš„0 ½Éz’^i͵B‡¾QËbðÊyIë?CvüUüyYÜ ¾¬óB;ñ_»§ŸÍÏADZ¿Û @‡@@Ë'Lí'˜50¦UÝ ™h‰i‚žÝБ:3ÍœÂN¬èA¹gVÇ·4æ˜Ôö-Ö$#5ýŠª›„@ã¼&,¼á½©·ê©ºd?“oÜý,¸vaèN²™!‹“_€_çëo‹*†¶´œØÔàdþÆ{E´ÝfÇ(_íï9ì £ ‘a…Ø^·`p¡­£T€§˜c;•9ϋΪ!Ž#¤èa†—K4:|tÈ¢‡L#(w.S‰1äa~ÒKÞ\9E11&À/kR¥<{µx¸Š[FnVÝ™M mpZ.IÅ/¾µ®NÒ5±r’õ2œRÀÏJ»pbC /ŽèZ~‡!Ov%Øy¸]Èa Ê¨‹ÖroÚŸœ€,Ñ?$ʘ¯J³IÍÎ’S,Ô™ü•[¿À+‚9M@lˆ¼'"WÅm! zʃí$²l\x²ˆ³äŸ&ÆÀ¨pˆ‚LÔ-3N¿ãr“#6ø„!fkÙŸñ{Ô×ýn(ð4˧|[¥† úÉjéñä½nÊuÆÒÂÈüÚ£Õ·šÞÀÞmŸ>LjGè ¶tÖÜWx[mƒ†"µ]p-’Ó¢k6#<ÕY®0¥Úz,Ç&ßp¨-c¥"§¾*w‘¼Îò„Ùòi.¿(S).s¸­B]G|ð/?OÂôÿöó$Œ,Lÿüu’JÕúbêZÄ»€3dÔÙVVaù¡aÝå_Ç›–ìêËþ‹‘(y‡à·¡ Ðõ®6ÚùJÔy§éÑÛD?©©J–šÞKmÆÜ©Såóe±úÚ!HÝÝÜïÅÌZÖ* ÚÉø__ð® Kz#–ê|uÀ'ÐÎ;‡tùB½Þ²%¢[F£#î1ÁO®SðéSŒC·?+ dð‚t²[£:á|§å´äœ[ëþWG](Ú÷½Ö·ªŽ+UœÕh?}ýn•¹ò¼y~̾´ÍOv<[îÕ,šrê’¸iìðùÆ)utï'"Á¤PF+ ¢Ÿ|QUÆ‹+÷hAWôE»mñìÓ øœu‰\ÿ 8ñí-Jé{&¥0Wj|½ú·æbY™¹–X'©Ú &-qX¨€ IâhŽf$†,VžIeF»§®£Ëxqä³÷ˆ’Ï¡%ÒBñ÷ÛxÃN†:xð—}¾G‚\„CL •X?’oîóÿ~?¾ŠI¥~Œ\ˆ¤I¢µ® å_‡A¥Ê‘ká]¸a\(‹<. °õ–º¶˜è«äL7²½‚ÔÇG )vÔY=––]ª$2Ñ{uçRíø!áV@TÁN¿Ov™î×ê:¾E‚fæº3ÿîI漇–J€óAí­¥9æN;(‹È×·ïN ½2nFÏé†o®èÆ T©°¹‡TûúmhSRøžbˆ4 d9C& aC·5wð,ÜN`ÝÍB僽ÂÀ±XŸê¡üØ题J€ðAãíÞØB!2rt`-ÝÚª =9ЦîÙQÍîšy\%Œ›0BtD?®‚â® $»šå.ÒP4°ƒ¬å·ì5êˆO ÐÇŽº`ŠèôÄÚÀ¡}”óìШK¸XñçTSÔR¥­æíÓÍÕçéÏhÊ®¤‘bÙ}3x‹ä™e±+£.‘o3„YU¶® s_áÓQÝq§ÇBÏÖ·4Üuâì Q»Šhà Y†§®Ö—ïh\ïKüEµÆû}µ®2íVpŠêí½ß;š•Ïx[QŠÇA5ÈÜŸÎ?oü:iµX¾°®É3,âá…@@è“.ÑP;5i±Û§Ó]!´}¸Úk^§;í^jêÝCöõº¿™*ñ…;ÞÑèfÌ×Å€äîŸü6¼Ð¼Õ^ÎÞ¶ŠÙ©Um’¸n5¶D–ØÕž¬š2R¼h"I²âË«VŽš{åV¶ïblº€¬†X)°ò¡ˆŒaräò0Ìo/nÖB»PrêB™SÙȹ@䂌ÜÿR’3ó"õR>nŽÑ )*EѺ­å•bsçé›wÞÞS"SVMµrÄ7§ö]=€Äxk„8«[¾Hé§p.MÎZR¸BˆÆáS•'ŽˆXìÁ2T¾ ÈÚl‰âÑŽš*r*³çƒêÚåW¹=XÙ¶n|ÕE™|Î ÒÆ§¼g ­Óus¾œ!.]á„sc×kxÓ”vª¦¢n(aצô£wKxÿ‰Ø÷ŸÃ£†è&¾qZY7óùŠtc”ui­EîS® \BÃÜ*= %޹÷îQvM=‘«!çÛÁ(ž6䛪ð¸cñ O§d’3þ¥á MÝ?˜}ÒRþ8O‰ú€ì¤ƒýpø,9 xÚä‹4"ÑÈBUoù#ÜR¿Â^ÐÉ+«:øù¶”êSy»w0zØ ‡íElgr·,p*"d´¨ß­ù„ørKåuÖ%†^| cê¥.g?‰*p‡ 7'J½ûòê>]hˆÜ÷Eº­‰Úôæs”ÁY¸2( BòÔžÍÔ¶‹í}ýå,ËÞ×éy{÷„2s¬HY ysÁÔLÚ˜ý@D'Ķ:(nó#ÇÃäJéý&«à }¹”_.qüý©y¤üÙw“£ ºíá&‘eòƒ³CúÛ÷„¤ë”ó × lu7âr‘„Á´“û˜\´bÂzÀ Éjr*Áñ¤§÷gGëfƒ`ýóœË¢c Ýu¡Þ¨Ó'M¶fÏ42±Ÿø°¯tw§) íªWKÂMsàÏ«#&±¶~²œÝcËc¶ ¿‡þ4A:!r˜zýðè*µ£@¬!Y,⻤W‹¸ƒÞöû— R†£L™”œ[|ªž¶Fc'©;§bS–™a/èÔµ{#’ÊνFLº39H Lõ,®ç:ää÷o#©ï§ÊÖc¹žKz x¸;ãe.CƒÒ÷$? cÈA– Õ½àwº,R)[^ƒD«:;í&+Y,¹8ÃÀ€+ï‡ñŒ*Œáü6Rø>‘·* Ýv×ÔzZ°æ@7Ë%‰ËÁüd%¼2ê%´x×oXÙ·í<-?ÌÆàÄ;QÌ3vÐ@ìæ¦†¦ßQ•úlµ¼w ¦¦ËÊšãõsàü˜#!Õ1Ã%{AñÑc^rü“"®“+ËßÑÑ úÕÁç4>qc.h˜#¥í0‡¢1škY4õ98Ë9AHÜêÀ,úŽP:¶î⧯ˆQALßÁõñ&¦mËägg&mŸ£(H´×>xó`Ò¬´_@)²ÁkÏ̬Ì%ŽãÖŒW°µ¢oVïý Ћ—¡ø?jovûQ\tŒIáš“éÂèѯL¸‘$‹Ë–8ÊÜwPc]²Ì*U§&ÙSÆ;úxý¹|1Gê¦åý”¹”[4îd%ºíCª¾²Ò_• t쬵wO¦Ê…[Nm5w2'+`˜?z¿{Þ€ðÛ:ô>R™%̃uõ›z#’ӥ탊„òIÚkL¨+¦…wT\iþu“؉ÓÊa#¨ K—ª¯6õ¹ç¿ó \‹=Î%½fc¾$¬käSG¶#ñoeMô+‹ž_j…øé¯YRÕÀº×øÈžÐùõ(HmÄs ãWvfªŸ‡Ã0 þ߸ù"Þ[í\<Åj¥RXÖy®:ªèƒ¥¢å¸Q\SLŽ&ÍK>Léí‹ß»¡3qxânûò!Ëä-É è_Sjv´,«†´8ª,IZEÞÕÓžóXa¹˳†°‘é¢î_¬ŠVEóùZÄ•\mšagè2s>ÌRŒ«*à´‡Õ°v1¸*õ\ÌU…x3»˜'÷Öœ‚cÐó’/Ep“µÃl€¨Œ—zÞ‘?®`¤i{TÙ‹ræÊæ½ïÖÞ©/Ž_9¯&E—̲VÞ®?×ù:#8D}†Ö†ë—6ðˆ‹Øñã±pÁ?+AGüãi¤ld蜆ÝÍlèŠÛNö ƒ‘œlT!š?f7j¨\r†-£®ã6I·|:ö<Œ12^“þEºl„Jd àÓ ã¾òSv ®x'™£¬hˆÞ_i·$»nPJW8íË„ ͞é$òçǶ‹<»ûi½1& ˜† ºûä…S°§¶Å¹×ØöWg=­’ ï Ãõ;µ´¹Ð`Ä ó&;,t>]l¶2íuoK³ôOÌíÖÁý¬¢D’Îz«N¥`Ѓ”QH.íøˆ_V´åUJI'–jwb)HH•ï#¶"G°ìP:o`]òÔ…¢æ/eBnßC 5t›Y–{É+gŽWî^6­~N ÚKòNí­ù©äöüj“üBœ”ª¹A  ;ñj 4â¶Hà[Ãwc!¿.ýé#éæÐòN*.~¸u+µnRT\6NhRçËñªÑ°C_«¨ÝM‹ÿœ£ƒ‹Ñpìf.êôà¤wý¾ô¸BÇçuw³~ôpö0‡ÌÇû³]Ñìõð{5!±ñqj­Â¶éöòö§îýíÁ­ïÃÅ\øÒýA÷Ñ’ÏÃïv˜›S²À‡» „kÔ‡»ý곫ۛ³ö’Eo ä»<÷ ̆C;þ;–(˲VßðSèáp.SoÐ%°pyNí7“]Ù1ñ êo˜±G {¯¦ÕÞ=ÌMUS¸½ÎÕ@µUž¬‡–µy?ü­Œ-¬º(ä+T—5få¶È›ìPJÌHtÐ8$OâLNÝBæÏ‰w›®Ø‰]裫í¯Hµ¬Øzëyâ øR~U–Qa·»ݹ¦ïMñØåÀcâï\øuK¬l‰´²îím(øÀf¤Jß(Ûòk¼Íâ1·Âhw9ç*i%–«iÖúênø‘J¿ÿsXÀXkÖd—…N¯ÇÕò—ªí%ˆõŒ7ÁáÞ2ðÇ„HæW]þ‘N@ƒàþBä~МŸ# ¥ËbØÑCf>eV´ïgj¦wúx—…L¯ûÐã[ÆN¨ëþפ+YùBc †’Ÿð¦ã³Ü{†:{P™î¼' èÑì¡IO"å€Ô½Gë@º/û®s4´¡ "pCf`]˜UȬR¬«:5)‰ØÇß–K¬ïmáeÎ5%qß4eÂÅÎÆÿ²q"pÌÏáòák Ö•ÿ}H½ÅÀ(×¹hŽgþxljÞfºjÌÒ¯‰ÚË®øÓ”L®f‘~ÞÑA¨Â°Û=²äœš–o&wUP惕ìP»ŸV¯-³s*[Wè+]äþ}i®¢» ¤%Ý'À’ú³¬0<ÉÍøÖ ½”·Ð9¼¡X–‘|kïÂX.íÄP9Α’5yÍ Ô3*~Úd²¢Ó½ïñˆYòRMy¶ûO5·i GêàxYEFTò/ Ó£Íe”njð6ÒåHÐZQ\¾È ¹zEàÄË–b-¤À@ )Zag¶ŠË–†—Üs]™Bbí0NA]+±FêGp€ZF:i”Uè <÷É•ÿõõ{'´ÛÈþ t†Y™¾tMFÄŽ:Å05îµ§¨´ŒVJé—«íØþÕ‰Vº©…ÿT°Ú“»*L&€ Ù„Öëè4·Ÿ¥<`bà£,+S°¿QgÐÒ|¸H ÝÑ¥ãÅ-ƒŒITçkK…‹ƒhƒNã8€ƒ‘ xv0@˜UÄ~íFKqfžG ûs$¢Amz4Ñ›aV˜B’ýÍĤ“ݦj•’ûzA@ºÞÂJ/×4WA’ ÖoÖ•W¸™j¨æ;þ¦.éò””Лš¯EuÛ0È%,û ÞrÞŸƒ6ÿhà3`;w§BxêÇ®kÚ¶'X:-Ò…üÕ7(…¢/U;´“ ÐCûÂkBÛ¢œæDPxø5Çšk´=ç8suþ#züXà |†öJNô”åоñ¯`¨P«ïiÅ»@‚ ø¸Ðéq¶œ×h†³>9Þx˜*â‰äÕŽ©*¥²¹Cñ!câýÒæ—¹a›H¸MçGj,¯Måw¦˜c·ö7¿w+¿ÇK›w|»åcŠ…°ö 4íÈÆ^Z/0;ûÁK£c½ÓoÏpKǶŒå Sòêªz™¨ ¯‹sqšBOï®ÖbBLºWªßz;Æ%J·6»2ì†Ò±@]!QTqH›“†Ôi&öUdúžÓrBAãò}rÙkZ»SõBøJËàSÜjÝÛ[Ko^%BH}pBÜ$›Œ<±¼“<'+B9p#ìãwÕ&Še þô«›Y‘}ôž§ìuº&ŸÚ›D°m|y^ùv(>2>Ý-T­Ké"V• …Q¦G2—H{ ºïÖ-kÁMxô›×Zšïåáe6›°ß\èœ Ô½Eª}“ ò޾°ç’Œn¡µísø×7ÉçeáÖÿÁ&ÍÞßî¸ßeüDoë5±søSdqålÊ0WÄþ=t_¨X³zãf¼GP¬íßEhKìßõûô?L³Ò"ú)¡$|!&óúLåË!šÜŒwûíž w ÙP¼GÁ÷!Øn.PT"ÓH!T$7^yÁAb8m‰útëXîG"W¤³TäèNewŽ…ãÂ&kzïy¨uNÆä¾7«ùìʬàS¨v `}•(P‚Ó›Hú„Tl=†i&&Dûþ±üñy+s ¥"QFœÃÂ~¢”¹åòÝh>eõü¸ ±"¨E¶{nî:ª¥=?(®mhAI9ª0…1œà*Qû $¥UÖc«c=™¡áŠ×R’£áíÞ„?)X?A[\? ¾sƒÄAw„ TÅõX™GtXä– (ö™]"Œ··–ò­5ò‚A¦ô³šHÂGɵ` Þyæ†É4˜"CàµW0¸ñ;EU{h)^* Oð_·ë=q«ïlv¨…TÎK”> [-Á}Ì_D°ô¶ó‹çDýJ+Áf¸iÀ…•¡í/MJq[Õ~ù2îz@Zw‹óÏBÄ›ñhv÷Õýüz‰Æ>ëB@Ñe ‡kŇÑöƘ‚õDIOžB.h¨Á]ßÚÐ 1×ËJ'³)lGC´^†'Å¡vX3þÊ|öç\ü²¿­ÜFX™<¶:O sIN]n|tîX=(¿†5Yœï*%pù.i}yØï°Ómê[”8Y§±!Í·±ñ,Þ£ö³?¥~§?ÂÄÂjôÍú• 9*J,ÿë/õÕ¡06UÑ'»þ¤ï±\4Z·´c_7Ð÷ ÈJÜ ïá1!¡‡ÌoYÿ†Š1«°='ß_¯ƒ; kÅb¸%Ë禮´Ã÷#–¿»¹Sj›æk6½_Ú;J¢/‘Ÿ%úA 7s (•áhSÏ,_9}‘‘Ù f•V¥wÃñ°õÿl&ü‘Fj,jÿà DaÜkeÌOWm5â¾ÑѶRÊ^¼ÉQ á|¹ Ù«ë´ò•¡7f÷+íH‘Z y›)“·0•u¤(–òn»Ø˜ÒDDâ§/=ÂH¤»« J‘Œô0 Y︈ÑýÁÎõ~¢â0{3}ù ΟÿƒN 7åDÌ”ô{ý§|ç™j7¦‹É,ò¡s¿)µ9A^©&Õ£;á·àv”roj£ç~`w$›³¡`áag‡Œçd˜ ˆüͺs •MÀ`E*5"·Ço0^^+~½¯ð)äu¯HÜ'jG(Z’€¸«»{Ÿu“lÎâÂÎ&›¤˜R×BX(xq’›û½q™RÙl„Ù¯PóÏQÇ¥„s)‰s)r}Ç”1d"ДøœÉùÒÆ…רãÉ%ßSLh‚ºýЙ&ŽBySŒþ°“ù€FG@€-'ü»Iéu¢×uù ²ãÛê^^N:]¥ˆ5“ÚXÁ›ìzD­}lÎH7nðEwËüíÝÒê×|ÜL1ÍÂÂN'S3}P6x¸³mûìw[{gl™ß¢J޽Î×]TZe¡_©(êÐÌvC÷g‘©‡ælX¢EÝ%…!é*ÝJ?˜8y€YbÈúªl`è%*4ít{UW¥7ÄU/UŸj#”¥^yožç%VŽéItyì…"™±gÔ뱺z®óÆöÜ#Åâ4Öq×ÕQ›^»Í¢û®+k6ÐÎ…œ(±~Ýe„3V—ávÿýÆgtÓ$Ü{‡RµÂµ·™½OÝMUà¬héJ¤Ñª«sÄŠw °¤.[Y…+µCð õlùIY¿1kd]`ïNº­ÝïÓ1ûïºoM¯ÊÈÏvÕ¦Ö>t½Ùß[jÃ~0z‹Ë—(æÖœ²Ÿ¾255’Îó«9Gzà±–\aú¨²0 îqÌ”½aÀPlê|v›c>ƒ¾ríSÝU3u1ÙgÅ@×ec¹Ø~ìá’óc9X“u꺦c+MgkøòªMÏA.·O}1q|"R_ÆncùRü‡´zSM”ò‰o©4þ¨Ã·W(‰vÖUðæÎ¯¾#Ö|è+ÐÎ-¯ƒjÕâ=’ l(èËç‰qäáºûCÛ¯Èöº º“â1’1ã$«Z×ê–1ûºÈ[U`oÕQj×}dݺQôÑÝkÞ?É9+âÆE‡îÜåD.^àXïwK@‰`¼MceÛ—BùÞïf)çAì‰b SÂmA}AÐôš—¾jƒ½—Ú:ÅšRx‹•ã½›…=[cwýý s;Ö#Ÿ˜nŒM·n¦¯Œ÷'ŸaK¦™ÒuÜ £=u™GcŒ@ƒ°žEöíªÿmº¿½¶QH_µÄËMSü~WçÎùR!i:ƒôõëSöJâw&Dü³&oùÐÙÌ$(EÆÉ9]î€ëyHÇÚ9K¼«VîC×–µí‰ €Íé¯ÂÊ«¥ÉŠóJ”CçÖ<Ô¥ ª×<¤A/ðc«C–ëwa1ÕoGI猫ßLÔÀH‡óbž½DR»·ºÅtý!'£zî6ƒö¨ÓÖù‰-q1¯ˆ©p7¤ÚªÛ2;Ú°Vnò¨Oýõƒ—iõà·O Ñ?m»­ìÁM¾'}Ù¼òár'Çî']H/œœ×7õNãÊ-{¶FiŠlß ²foµ”…¶W˜8]|CQ‚ïaˠ΀¸7WÉ[c.+Ïöj6@òóÂ:qn‘®ì@›C¬c&¡N ávqñÈs¤ôgß™®¦io1™5D{²Qa®ÞùÞ9CQð.ãÃmÔ^ûwÇÖõ/ÚvSøxäý# SwlêŸøBžÚlgæ<¶‡Aa— ¸4÷Q\ô×iˆ¸ÖÛfž‹#:Ì™ÔñÙˆÒÖ  œç•i9W•¹ˆ<ÖÛæB²ž¿y¨u®øBN*Íä#×vL¯s(ã%/©\kôNC\nø.ûŒ9¬1àÚKF¥cœüX¤êàΫI¡sû3ÎþíæDñ-§„®¦Kåi´Õ1£°é¦×$ÇãcÈýb[˜F®t½Ûˆ…†Ébxó¹·y‚-Ä—>ìŸðÙ¶»ØÌ\Øî?ã¢v|Â>Uên4¥{›ôáý;\YO²øþcaOæ¦-bhæBñM_þ&›/&½¤ W?±‡¸K}LÆ©[Hå'çÀ46·‹àLÞ#>”Íäbþ¨(–¬ðÆè¬Œrk, ólv›màeÏ-í©"©ù=>øS›)þw?,|á-ûbº¿¦Û~yÓ®Àeo8ýþWÝñq^¡h!xF½=U°.ân4?ŒøŠ%pÅú“󱱂C;Qâå¾¥NýŽ9ÂïM! QŠm¿?„Ç%v,MY­¼*£R+‘ÆLLMüH8Ìxß mÏ_ïT úÅè0õÿÃØ?ÇŠÓŸè±mÛ¶mÛ¶mÛ¶mÛ¶ù=¶mûœûüÞݛݻy“»óG¥3“IOzª>ÕÕ©JÙ?-êp,çˆ4h»uIôª…æñ‡m~VK˜Fe°="çud¬Òf¡…ÁJÜ™Ù!5â±XõÀoÅ¥«% ˾þAíÉAì¥y†‹ìé“®_Úˆ!ÛJ­=6sÝEŒÃÕÍVã4~Þ*çöð6oêK«†0±«Ú nWÑ›=¸Fý0ȘùßôOI†ú#þÄô9>Rµ­:°¬þ=íBY[y&ÁÜñ~£°=g ©‰ó¢Lýx<ÿ–öfGˆp™.KåÙHCaè™aȾ*%ßXÓÔ‡­p¦ç£†‹ŒVmä¡ ¹šêrœ–2Ò»¦§u<ÿòÖÄqó ô´USx'P’{lÙNnÃîåÆP0hí+iû³B–È %,_|¶„ØBuù¤Àˆ¢,”ý>‚ú¢~(®-~’è²þo’Xþß%1s01üß“®Óí¶¸Âò îö³Aå—ÆÜ\;£ŒG(ÜrQ\Û8ÜAecÚP*…ízæÛÜ¿Œ¨§ÝhÈ»WèÑÉHÉ!²*dF♟æg¶æîìåèb £çövu\ü¼%Jþ!ö1 _Úþzö;?*nܘOÛ»%þ{lÞó²ç&ÿS :ëÏÖ ^þ©ÛÉ‘lgúÖ3¬ÔPÂ8 ×È:ÿ4þŽÏþþ6 ¬]ˆÊ$7aû“V6§ôþª&ÐÅ8Fç´e‘À¿ˆÁéŽQÀ)tÈZåN@yEFž* c"§®‘VÀv¾ÓA¾)O4¼qàÑa-BˆÂ44‡ÔÌ‘(7ÉX;Ýäúîã¹#GÈMÎÏç(£Î-áBvÓ4åç¿‘ZÐä½­Y”ڹ߄„½Ëåö6OCrOÊÔwÏ^ûŬò_=ñ²Í_⪞ßM©«>â æN˜Ãˆ¢3å2—^ÄMî,?‰m³@ãêpi!@ çˆF"d‹Ñ&³o™€ Ke΀Ëf÷<ír6»$¡„Sn-½’oaΫ.ÉKÜuŸWL¡œ>ß\ȧƒ¿*ó:<ÁU¸ˆDM›W˜ªièCvú°Kpÿ¡/"mï<ž±.HÕ jMõŒî!§ùS†'¹î•sÿyéÏÃó&B—÷ ³›é5ŽwZ‹aöt¹©ñ+¶›¦ñ*-e;’le|ÝXÞL²çàÊ= e)é4˜^É œ’¤²ÑIƒ,KëÜ(Rò'¯²X,M ‘í5ßàöà‹¿/äbŒÜs{͵ÃokkYV}Ö"ü*ÏVøÁb¼—hùo]¥›N@ÜmDU¼·í>s\ûh#å&ªagš]!8¬È+çBJÑ$…;}¨¤z}_šãÙXzC¼î(Ï]×á”äüGLêBE»iW\ÞíT|oËF6š(ýà©éïÉØêïa–ï\ sH¿ÒOü™sª®‘eTêróµKÈÄÓMïø]ºrÓÍ‹×x 3Ì{Ó‰Ì fáÚ¯)”^çROˆå£}‹rRæ™ÿSŸ¬Êõx·±L¿WóP·˜£3¾b×¥ôΪ'[I©0M[ƒ¼Za_*"ä4-Xc¦7Ê“ÁêrÞî9¿&§€“;I-ÏìB,KÇzô@±_&Žg‡³“ÇÓç]÷ N¯s]þ‚ÊNb‡~ak—cÛÞêç/eøDMÌ–¶7¹ç;œ0ÏÃ,¾^×û¿)¦.öçRâ¡Ç¸ÏÿC‡“îoÌÆÇ¹8£Êtœ²¥OzÀ47H5¤ÿÇLòø—‹Úž1c§†Wb(E„’‚kÈ|XdV²rÔ]ÿœáD™°Ê4³À¶$1&©Ú×j‰Á5ÁÇfL3 .  n¦…žïèhîw5C$ÌáØAØjÞ8Õ»o]IÈÊ´;æ$Ú*掇9NÇ¢aòÀÖå(žè÷OºÇ>Ç×ý÷OËÔ}aª´_ûÄ7ßt=´²šbê`.${Lùå*žG ¦Í)LÕ4ö %Q“#ÿN}ë¢)ÒvÎ9kÔÝ ÖRîs2¹3ȘAÙÿ2øŠ=;²K%ä$Ú7=oÏyßè'Fûæq{…‡²EÆ2GÀ£[]“¿ªv,õhÊÅÙIEè=¤ –ÃȤIRšŒÓÚ*0IÿðZð]¹³ë_âwÿ¼E*£É}˜63¾ê«›‹—x2*²Â«Ý¥Ymǰ?,¢w=ªmecDbë{6¯V#Ì‘<&mþò| Æ)3b0¦›Uºœª£|¾ß Ç·E¼gÌðÒÚ7ˆ"ñùÆ  è9!À¹ÿ/ƒWjȇ¡¼ÕéáÌôÁÔEǃýwúdw†³{®Ö“oMãJ ·4r2^Ÿ?˜L8œÍNžL_t=X,Øæ¹s›;¨´ýòüÐb`•ÆÛm}þØò‡&iPIúÔZ®•÷EShl»žÏÏØŽÜ r¢`Ÿ…zëNÊÚìÖø":YI aH¼åXêÄWÛ‘0î…DQ¡Z­ÒAÒ‘…ÃáAIáî|¥¨2cî‘É5—tRÿ'KP ×ÿ9’}x¬H1¶Õ»35 §µ{¾É:ú±xuëí2> %Ä}`ŠEQýP>ñryˆ_¹¬‹²–@qL§ÜZϬZ[ÿE|¢1$Î0[Oülîr«3Úë=wçú½­^kòÁ Ô½VÅ TÊ;Z†I²·Ãí„CÀóÓ5)­¬ŸxE®k»Õ"ìó)æ,§Ó’`ÉÎ Ô¼µ^xÝBØ “}›5¤Ë§ò wC²›9Þ3I4“œaš¨?nnxù?”¯’b•õê˜bã[ÞHBÉ’ [OQ4bC§ò8‘Nd5‰X’A¿O²æã°¯ê‡Â »¼½â =jRÞå?åÔ­_jA"½Jûât`äÆÜÝÁ€Óû¨eRò-«?$fÑ”#¶Ãëd9Ö. ÔÛ^ÀÌ‚qêu…¶öà YX¿{Ê…ç¢õ|Ms–®b^mMba)CÒÇZkªÊV†#GÃÉ+$5ýëd­BîFß¿uf¦äÁå T¿ñª4a^wòGúÒ>1ìçO-W¨CF<¹˜ïÈ¥\›ZFD£ña´u¸OÒ–—æLßPq›'1ÃóV#'æÈoÑË.g©5kãÔu_|‘ÏMÙ· ’6jXŸÌÔÛê°¹ 0éP¿X¶w È¢=0SsPûâ QeÃ`šî8¨#\>ñ–( ³uMõœI¦™"á м­¼w°ž>ßç‘áiüg¼M†›ÓÊíŒ(±èT”,‰2h$!^R5‹eljԂdÔÊE,É ßÇYòqÙ—õCˆÆÍ¡®i’|Ö¤6Ò×”6u’ëô/ŽûF.LCñýÌ1½÷š¦eï ú£ã‰f–³÷¥¬Ñ¯FNXf'Xô:ðæÔæ4ìÅÿ¾`ÎåUJ•¹ÐŸ(ƒ¹…ýFµ‹ã`wÏ«e_Ú‚¶v¢ôH{Xš ñ²Â #Ítδ“+8-Ít´EÃÍslùt«6tR}ªà¬÷†u¢¸Xzb† â&è& c`ÁÀ8‡ã¼`ƒ¢g„ab'=òÔI{"žõY@Ùù1Ó¹Ë3j‡;ÿÙð\ÔY-m˘›8Éß\o\uºð®Émƒ<ëp;&äYŸ…§ež“ë”BTÔ3¾/Ïå.ʽm|uïÖÏwK¯SÎñàhµç™¶ÂϾ5^Y¦ÊÜ ß•Ð sßÙGã,RÌ25-_ùNTŸ,Uwk{w­iן0|d¤°O‚"ÄãŸå^Aféøòˆ«-”ºg‰©jFfñ~lˆ5²ŠõvÒ”™¦ôÐo)bÕº?åsЗÄÑÉ7SQ²ïîpˆínÉÝ=^}1S7Ò¶çd§$¯¥à^ÌV8ÉM‡ùÊö%Èí”á[êÄæÈf9ÚïѥΡý¸´žåi;ÙLîÀÑp~0tĈ9$Ág0Wc/=Úìd~j#©þeh÷¯'ˆVc@Ô¬ŒpêH3ÑåZë/Nø6k&nvz:j–¦z³ghÜÎ[¦uŸ%ͬҖŒ¬´ùpý‚h|ô†ZFÕWR§Lv¼ßnÃ|˜Úr™¶3”{æÀ(ŸÏÏ©¥NÚ"©•/5‰Zw¤¯ žÎ¥…*²àÊ7;$Ó£Éh£ltÙjf‘„1ÌÔFÑ|jŒÜ¶Í‚¶ÙiF—5 ôþB[[ƒ¤—¶ÙQ¡ˆ£‰Ýrb[¦Ú ˆ~Ý‚¾zBa¤®ãRÑ>­Î&bnmgu€rŒqŽ2|!îrn7û¢¦ÕºfùƒS¢sØ[‡~Õ©uÄRÊ[ȬY\¿°-{çÅ]…µèëë>>zjéÉ3 ¢Ã¾šJuÿâ嘴/øn6ˆÒÙªØô¯móêñ_°·—tÈN5PmºÐ5;á’ÝE=Ø2Jº«5Yª‘žŒu{—O.xo]èúùú›‘¾ZL…àtšMPHÚ‹ÝÆVîy͵7^ˆÿ·•2O6ÛÞºk™{ývi;9ÓÛj4DÔl8²wËñÁð‘·ôÌ5Yú6ÈÝíA¤¥™_¥¥ªë'U\¡/ó„éz‰†õl‰ вÍp@wÅL?m¤·Ð¤•³° ®GuÅõ5»¨BÛšd±nÍÑxŽ&éÚtÁ•Kjfú0† tÏE­¬ÕÎ@OWÕÅÎZÛžŠ<ùÍ1‹ô.¤›´Ùº±ÒâÃõªº÷†žFucëÃCëóÕ|ߨ7<á®ñ O½kx¼™®rÑøpk|ä”Oÿï†j½Ï0S'c7Å¿IË­¯Ry·¾µÞ'Nðû†'[FªðÜ»†'\7¾öÜ»óc`Òàþ³‡ŸÛp’È”AÑÄ?上ý»v²·älýï…ÎŽVóˆÏ¥“÷® ƒß8ÿù$ëu’î]{Q×íÌ!þCß ¿eâ׽ܞo`¼>À‹pòžøÝþ?ጠõþA|9_\ ûí‹é,°¥Ü_¶³ÜErO>ôK¾+<¢¹+öÕCÐàóx™ó1b]F!^CêË €}ÊX òa³=î¸PòQr³©sC•ûCJ"¼‡Ô–ËßQÃÝ'g¹¿®á3=+ø‚J=IÆÆwe0G,0…)xÞº@Z‚¬|D¥G¼ “¦f¿v¿¯ö\REd.Ùéud:ï€÷ÖhúÒt½¿Ì  Ÿ¾;ô| Ž„®V®¯©Q…ýîVí›…oÿ` ·l+^¨…¯Èï+„ö³I`t¨Bÿ¥Å*ÄÑÁ°Žu©\(^ùÔ–ºRªN­3€æ)IÞÕWøï¹ªÝæ]´‘Y-ë.¶~”oåx‚p´ª5kFUXYýÑ#]gš[.ÏðoÚã<úTc‚í1(ËäR’†ó·¬î:Ô]^CQÞRÞg¼p×îûýYéÎvdÐП­~$$d ‰9E½1åƒo*Ø—=¡¾¦gf²îh™~yÃQ>N§Ï¡gW¨;Š{ÚÇõVûó’àÀBpÀü­ÒqcÙ8i…ð\m‡ÁÜำXÜt ŸñJj_)©¸÷*'sñOFoë`^uqÂGœDHi oS8ð•U`F °¦L…P´Ø§œ²°ÑCD Pr=M”€GHph€&õ!"8ù,Ä,çlÕð bÁ/¼û‡Ð—á FŽ™‹`Ó2ܘ‘ð$aï¢9NžR2OД˜ÚA(ŠU³=æùŒÎtáÀ…}Lo·«.›nž@ùLV,¤Ã!·²Uñ ÏI„`xƒõ‰µátˆ’Iô-öÚù”ÁÔ©zоÅîsßJã „Â÷ðY@O ´ PDñ E| ¸€àý{Ž"Õ…¨Š'´4Tq¸gKÖô"È`_n“Æ ”v(EøEŠIƒ€èÔ ¦l®ˆ‚ÂZPu†"ä|«Ãõ±$¾ãƒÂC]™:CÀƒ-€~0Ôã÷zÍõmç.Žl_Iy~€épYîHën™­Qy!¶ä$o“š)dVz²X`ã´Þw”ßLkƒ„Rš—XL=,—v^T‚ÉR‹V§VcåI–ä`‘ŽTú ±pà6 !˜b#ò`‘ pf e…*¨žÞ׌0ˆ ÑÙ·¾R"ì+G3_‰0˜æŒÁ¹§†/¦äaÊ€êÚ§ ãŒÂ‡ÞG 䥄yU½a†\Z膳¢Q•MÚfC!À¤¼ˆ‰Æ& Ä"@ Ƥ¬˜ -Q[xH-˜ý²1Ç ¦X*ãޗª(Ђ½ø¦Œ@b¸>`“"˜¼f«&dÙœ3>f ‚Qn+ bBZSB]ÿN€ú ¥gØ@Mã™ÑIP ÀbPE/ ë}sTD~¡+[AvxØÖþªkÛ'2­Å 'Ò¡¤!é+;e ~Ùë²BÃ[†Uûž4úÚ <æ\qfñ(ñ£ql 8×~¡Y*‹ª‘´mMºþnÕ‘–Ъ%“Ö®$/áT[æÙ<«Î˜ÊZ^ ´³¡²#x]Ö›á@ä­ð[{·çɘb½e.G$¾® Nïû+û@Ò TPëª HÃrNˆz‚ˆY!H HÐ@ Úw<·@iV0Ö 2ÚY_Aä*‡,pÔ7”6â±`-Íà®6 NÁ|‚aò›³õMßÂ!NàØdè¢Þ„bÃ+•µNÅHèºQ>UO-ÍÚ¿±2ú ‰€‚)YÅ„¢Eæ–wÖ±ãH§Oy’7y÷ߨoÛas"ùý ÷Ã$€,ÛšÕnö~›tj †ID† #¦n$o2™`rúÈû–ô³‘G¥Ÿí[O3¾›®Ò°D‹®¡JRuKúŠ­©äØWð°Rá—N¹8ÀWæW‘7#­“îG¹T sÕHYd´âÎ+qSƒ-r©E­:pŠº5Kg¨*-SÓ,DÛ¬:TÓ,Ø=|t¦²ƒÃŽÓ¬ÕI=(ˆöúTë U½lrVk­¾Íeï!¾ëÏúÚ{)æ=œ ^¹~ÓŽxƒ_Í>;kžý°òlúMú †1û¢@ËÃéA¹|Kž5ëÓÛåÏÑ·]%/y=>ù¶|e~‹ø™´j=·èÓÈëÑžñïäãÏÕç¤åܾ=›^ñZ²{–ÿ¾a=`)ÔÀë×Èëûuz°kÝoäË.Mçáìðû{ùjo}y^Yûø¸¶é›iâùz³ú¹øj9½¤tzðÂyû‹Šï'üL¹¸V}=Ó7uƒºÀ¯Îú€p;÷™8Êñžˆgy`§e)ö}Ãméº,9êKè9@ÎÜS¼¼EXÜ÷Ž^ê#ÇÝÿ6Ä'÷¼0Îω=å.˜T΢o¡Ý„€‹vÐ% Œ³#±ÔHdE *ÁÝ¥xœ&Ÿ|ÙeÎáœGÀ)…±Ž)Ò[x\et|'jŠÿq¸­xµ#A5¦Á~»‘#ÊF;ÂbÝsr¡œ4É«™ÌeÚ3ðö¯íåqÙÓíá¤øƒ6ÿ؆eåGc= 7~ÏþÛLl/c¶—1·‹óï Zž»C! *ÓŽB^Ø=èðg9ìåØŽ¾íÙó~uÓ¨›JŸ€£ãÌÏWî{TCÿ¥Îr0úžÃø{: â†a¤*ŸòÚÝý¶†sîÜ[òO²Ê‰—î¹¥ùl?Om‘ú»ÆÃI?¦ÀÀ=Gô§Ü -¬•ÄëT/öÈ>@Ñ”ˆ%…ÚFíJìㇸï™}?0tŠ/÷®Ù£zn³–=ØÔ&/óöEf;öG:#,?t®èþ*ù³Ô+ÙùÛ‡¶“‚JgY¾´?DýPIh–E^kä†g‡Dl×%i2 4÷‚t„ØMÏžã*ó½¾í° IC€nTz «Ê¬ŒŠÁrB!ù—¨×ÈÒ†bW)ôc:Nð±À!°ÛNð¬. Ší1¶ †ÒäZ¿/V#k¯ª*jŠ•˜ò…xñÅi"¬ S`E Ï¼¯ã)’^a\Å:‚ŸB—A„>­¥D‹›'Ç„m—aæªfYü÷°Sy*]ÝìiÞêQÆþsm«å‘›E›ØH‡¢žé Ú0¸à y?+ 3À°cJxßtèW¥x$Ïï7ûúé܃aÀG#÷&F›XF–W‚ç9o_ËVJk©MÇ6 }ÎKìA)©K uŠÞukJË´Š¤¢ÎEËx, šf2®^ÐPÂbiºñoÌÄ;J¢@êj‚B™BÛB߬yeôäÒË3K77Wg®9zÅ2êvOÌÇ'ô¸CWÓ:PG8¿µR@€c•cy¨“Õ¶•ÁÔjûÉÅä –Wˆª¯­Š®6B¶( ·]'ÇaaxSR“"òpKnåš@‘eÄ2hgüõ®f_ÏyÍh+ ?0Ì {”—VÞo¤©ÈYø’d6ˆÀ»6•uYD½¢¼(»«†š&pà[œëSé£}CÐL”‡~{¥Ãs;maµ¤¨ƒdßbƒ=˜VŠ5ùÜÞQÊžh§¿ÝDçðþ|Ë7ÉXX{³Ì+릷f>¿‰Z¯ËR&6 R* ˆ ëŽd‹?+ŸF/×ào~a6¯ç{´|!û­ú%4û1<¨†_·7¿Ç&îàáj6}ô»£5G÷µU<¿X1Š-«b¾ ÛÓË£ÅïÁ·Uó)ÀžOç3(¨©y“-W}ùÚ“~ݼü™ºœ4\»÷ÇSën vãÁȈêõûèãóKz´{5hüËMïñäàËWý^.m]:~]ßܼ¹ù“išyîÌ\ÓèÇãÑŠò)~œ³ Àjýû;v‘|朞©ÿ¯ªYy¯ãq'Äh²x¥ÕÉçX"¾çÜÊT³š|yŽšú³ºè­†8-ré-œ#®Vi;ÇΕǿE˜9ü6GX:ßëäæE'…8Å:•ZEÃsé,%el¡At zÖª4¦$POŒ‚,J\kšB3M j˜T!ýYd‘ Æ!…¦"F;•쪲)0c$ËÏE|xÕF¬Å®D•D»ívî4 Í hëm¿aGod²'ÙÛ”®­i››“Jâ_¢#Ö±“¸€èwB¹Áýõ¸žÖ\깜¿/PJÜØ=ÊYv”rà0¨¯ñb=èáÞ‹¹oì ‚œ¨ƒ¦Ñ®"Ë»‡€~æpÒKÿÿ·´£Æ®íI#Qæ"±Zll|q¯äŸ(‚‡µ¤ŽŽ•\:ÖóúÈ(ˆ@jUMĶšö¹c»®ˆP°  £ª˜~žÈk Zé8Œêa\=ö¼ð ¦F¦­-H.ÜÈø‰øàˆ L}ŽZ;’,Ø¢¶ø¼µ s\áa¥úo‹€l\TÆL:¹[j³yËÐJ¸&ƒS€6…NÜÊÝ»Idw˜TÃÅ€Üf•CÛŒ©-¼¬´ðâ2®Ôã`u /­/}qò'¶èÁÂv~à< ¯ôß­‘t5ÉžkÂ…•{l­ *ÛÔŒÙ9ÝJEÉAßÏŠÊ.½WÑ~7eiHŠ!K¡lkŸ~TÓ….Tj¥¼!b+š_¥°äYÍÌÄÇËMü´])tü ZØ£6†Ø"Ô–AòIñÜeÄäE™›ricqWfð¤°!B*Šªâªkð®§Æÿ4Ê4îÃ:büÿ%À‘â`cj8Æ‹+X‹Îl£UDú¢Ä¨Çü»RXK™*#Uh’#Ù9p?ï×Y@¤Î2[‚¬¼ƒ®L…9Åz¥…]U|Ç¥ ¡'ºHŽùÈÈߨ4­Xù¿k1Ý­Kà†Þs?A@nã€lHb$eôƒ:l:4ÇÆDu‰ ²ÏɈÜÉ“"ÂCâVrÒÎ%"P˜^8YP…ܸòÆÒv/Ø„áív§„TZ|ùBÂa‚zÎ!ŒøqáeMY\jõÖíh˜Æe¼ÄùçmEL¶€;‚# ”!èà›„ÌRU¦R(a$ãâyâkΚ›gWâ¯1&ÿ/Œ )(Š2.E‡ñ ™-Èb+êY€¼Ôá 32²6‰"šÞ‘É”igþ5†Ÿ‰p8Ž\WÍ×va}i µÓ¨¢"jª@Ú­sÌ'ö¥c]lÁ¯…ýBlR ûyEi{L$5íÀ˃k¦-9_K¢‘–Ñb—º7/þïÝuÔT¶ š|¸¡’› ÌN´Z :]é˜I®Ä,[ZÈ·£vµ Go݃âbí6ðe[‹ì Áí"|Fç¸ÄDd l£.?™õ°Àš”|M±¹?óM‡úõºÀŸWg&½;‡øÓÿ%𣞠]“EƒŒPáç@ÏñL—TÄ~´•áî}TPÔ›i•C#±2¡+jĵtÙñ°Ÿ„!8’ÛF|`·†ìU³ ÏÑ—Aíô©¬½þôؾ2ü¡³-D£0ýö᥃@k!Ò/ìSõP ˆŒzlM¨ѯ%‚›†ö"idWˆ@dL÷˜…3á ¹b¨žëW­‡Êq쌶¦»~E¸Ct»‹X¸¬©o ALÅ©9+ )²pw¤À†)ÿ†ýZoƱé3üÏÓØìü<[ÌpÇ5=‘%àH @´ C,¨È7ûØüĜƠ‚L[CL,ª)6ûTÄ!a¢ Z_ã•Ó‚¦ùíè‘útNX|L0k´†®ÖáÓµÂÔJžŸ¨}svîÙöPr¦"-4a±ºïWuù ‚!ŠÂ@á7¯¦L š.‹/‚Àd{%Xfáø×¢-Ùû¬?8x³7ˆ ÂØÒXÒN…Ñ÷G° Aw¥ ‚ù@öžè[I­M•ì†H®ñžŠÖÊB3šDb³L½ïC@KHÙ$ž$rÅá×ûÈiìN 2 ªèÑw­œžŸÞ¾6}½·GÃ_Ýš9o(}ñÇÿÚå'-y»€„› Ã:U%Vð¹øá¿+¢ ²m°äÏÌïl¦œ–tôàh‹¨ôèKdËŒ +…¤`µ=¯Ê B°{X™ì•c²ƒJñ;°Z3ß éW¾¿ï)ÔP¶Pd—)"è‹yKâdü ä²¨nï3¢Lô‹“…ÌM&ŽiM~H™ˆ`Ùsr²ŒíHÏí‹.ày¿»ASò‡ÛÀ—Ý!ÝȲæÍÈã ˜îzßOò]@ãï,ÝžÛ´÷vù®ñròùµiíì䨹ñì²Í»­b#ã7äì÷4öÞV®âs¨+¼škz-ç]Çù­_Ë­UϾ"‰Þ[³i>B· )LNˆ—_E_©£w|#³¹É§ÍëõM˜>}Þ˜y'óxÌѳۯžÍë9gx·}ùôòÕWeW°îšŒ9.ˆj>ÿµkÛÛ˯ÝÕñݶ]ï\Íã3…Xıg_õæÎÛÓïêÔëoëêÖñ—éZùí<Éã³méöFÌRKµ§›çÛïÚÔyÚÎÅÚ¦ñ|ÌŽò³mUï,qi|çM…D€Wž×3—Å´%õõìs,þÀñÿÂ-òs/õ^þ>ª/ê }–+³Ì Іc*+Ç7‰-ôã\¶D•#beƒœ· ,4ðB·´m¯>#ä²)´^±P)6ð|¶Î¸–¾8)’$-J—ï ÂIqfJÿ„‚õ¦d K>÷Q·)Þ‘ÑfÉú@¿¦h{ÕV!á˜6 ¦y©ÒÞl`¦™˜{½®ßyn;kDŒ§4<ãpÚZ{ÁÙ«¨9û€(ÂÆt¬‰KPð[H'âý ¸*YC¡»ynê¹-Šª ²*.™Ð1ÏÄâïkN2 +ª¢€-¼hW@HÀ\‘ÆY6i"ô9 °m¨R`³L„¼n'2¬OW•€•H¤EÚ‚"néÚ%L‘vF€h!X /µ`„”šflõ“ŠÊ+¾sä¥1ßa1Xb"Îíwô³ê§*ÞK9ƒñm:Xš~í ¬$wöŒÓµ¬”¤ ·#Œð_•@ŽŽ•ß•œ7V:± V³ßy ãaotÍ(2²R¡°ßewÌþëÉ1÷»–m޼fàÓbâuáyÝàM‚kdš@Ðe½û:ÜxY±òmëê»òhìíúöËüìÇw÷÷výqûi1¸uïg¸UÒ¤žÃý+ÁÔ4 ­¨B¢ü«¯¨jÈÏ;/O? h»˜]°^Q1Öd¨›Îô*ÑѶ£åÚ€c+N”a›·Ë®ÈÎbn¿*%¨XŸÖ[OF!ä©BRÑ9‡gÀ܉ø¼xõó"~¥®’»†_ÞÄ`n*À'íɬãV;Úuœ{¶D!“µð*Ú^Õá^âmµ»@wÄhEâÁ‚ÕÑp@PhÀÒ0f Þd±âR¢WZ² q˜NálŸØGX¢ìçM d†šŸƒëDC.&Çi‘{€¯­¨%ž›~ž”¾„<×Ò‚°"Y8c)ÎŽ~ òGX”öJ$—ÍxhN„`’™ÐE]v JÃ-c“L9¢3«Ç¢£¾´©’RƒžŒ•TKÄ’I¡‚Ly"`>a`m<¦ÃyûÉÔ °±x“¡S,Ø ¨A+†È,T{3㬙òà`$5È “h‚ë‰ÆÀ奿 @QL.Éäß>H2"º¤ÄâaS,Ž÷ Ë]Ã…0ˆ5ä%ƒ0²-&çq#rB µ)^Öè¸@èíÀ‡œ‚jµ›L?)B 5àqf?Fá ¬@’@$ƒXæû. úàY¤ ÇŽ°.5·pœåÐ…@@&½ì¹5½“E9ÎZ\ŪbB´§X ~˜âÄð…ùöZh“ jrÀ0b( ß­@».}B“Oί8"—\QEpZøP@J_ NM±pÉÎG%F¥L `‰¤q2SÂöÄ)í‰å)·ŒÎª’Š Õ ¡XpÆ¢ÔÍQ‰*£¬Û×¼ÜLT‚<ã;©0M1ƒŽ*evŸ˜üªVÂ9Ç÷û† ¹cßbÏ$›ÐÏ!{†b%€Üÿ¶è|ö"ôÁÎ AÈÄ–¢Y–ܯ­ –D¤A§qTA9Q‚¨ˆv¢^òÐ_¦æA•P,#úþ°ØÓ!Ê&šÅW ¼•R…‘`WšÐ{#}PrÜ $Búæ­W‰€ï»½OÆþîƒsØ£Qd½.‘ÚÏU¯ ½ éì)¶ ½Z)Zg½eHÆžé‹;™Qle²Š_ùSLª'´ÔyA?Éë‹ÿ%Œ;%rLÆÞÿwÿë1½;Ú]Ôê¥cµÄó1ïbc·Ôï›ò‘–b[?¹qNÝÛƳIœmž$¬1¿j¿Î³2¶<–¢›qOÇûƼ0#ÇmfXs¾˜ç[Îðà=–¨Òö~úE¶ÁýÒv´¨WVᆙ{/-™t–ŠäC×gÆ ›!EÙ ­ŸSøÞRSÎG¶¹BQ`\yÀ –1Ë(a€)–UÑ~¡b,@§S$!D´$ *Á +»à0L¡Ô.n¦p,÷ºE¥w,;§ƒ¥Ïø%‡AùªYy^g{a¼¸MùÑk:D'BÓ”ž°úŠàIè´þùå¡ÐOÖ<ÒS“˜Wï^.rÞc6~à}IöÒ¾Pà”¤ì3ÞàN$saJ·¦Dz_샀Ãi‚ýo£(Ô{ °-i¢2›×<:ò°P|Ö9N%› (ʺƒñŽÓ¢üçx_§â¿÷còÛjÛñØ£?À?C= ‰›/RO­„ÁÇ~Ú5-D:`Ѩ?¾s•}±œÖÑÿ.G#od»þ».—95X¤W¯Vxâg…ã]üðjâthè[„¢Z¤êhŽˆâ ñW—@†²C!ÌÌ ÿU¸&‡>—QlµY f&&3™Õ²ÀBaÇ$¥àŒH:k¸kZi¤}'ük†p¤ª¦¡În™á¨L•ÂÁäÈIwf³p1žµsSk0ÎnB¢‘×CP}঩@§,4sse#¦Uÿ‡Ê¦y!4›ç^˜€q‚:›5¬—hL"gDR¤•HÂçÅ«¯Uó]b»NC¤s¤S? *åuZ©m†í¦_ímÕ˜Ÿo¯¿p¯IdŸŠp}ýÇîÿóü{ï¨%¿ßž?aüâòƒoØø)gEØJp@–ÅÀå=Õa‘¦2 „L9eÁË\{âÌÏwvšø²(£P²©ìnàR¨]ÅØ’û³J\=O¼[ßv§V…çöeŸó=Ú{gÞ}ñ3|³¬dw3ýHÆUp9E-BØgÌèÉý±0Ç¢/¿õFŠ^¦‚µP Ù•*•ŸÄH£Ss£ÈåÔíÛÅPz·´"_>Îþsq'(U¨‹¶ä‰xW§ÿ£ÿþT_nüQ©†ty}û|ëàüCµGPПÏg'†Ñìe¬æ×É-]ü¡„uµ÷HïDßêÂÀ¯jõÀîj‘Å)C ‘`FdG6GaÈX“dFaQÜš¢Ô˜å’×•Ý לtŒ’¤6ò`”jXƒs·ãÍÜ ‘ŽváÏÎ=} ¥þ¬¤ n)ã¦ÓÛa0¾íh5Ú2Sªpè_úº m ŸCÇ=¼9mßœ·’¡ ¡á–}}Xc¡ j– ¬¢ØºÜ ÑÙhÞò‚Ky/ÙÄ.y’YX)ÜŸ‘@v⛓>‚l$̃úš!,³Ó’¶âWs¶Ǭ [üEiØvï^í½ï]¡jZäü¸é®^7-r“¶¡·@³´ê«±Pæ”÷ÚB}~!âˆø0¿ED%ET+«Ð„ŠSáæAvÌ&àK¯ªðfDtåxáew´Ò›1» nSnV!‰z1ÆÞªgxz#3/_³HŽiK/Csö^cÅ×Oo#CŽš¸Ã¸!~x¨ŒuQ R%'ê‚Ü&Á yà},ù“…\Æÿ{FÆ•YQcglèÄÆôå¢rÜm¶Aÿ%!˧؋“í)ùªP°uš´ó&ô8ÁeCœ¥i‡ÂL—·¨Y䌃Æ3ø¨ ºb>m6MÐS ÓÑŽ˜yÖdÝpèÆÎÃã"¬+q[®ÝyP> Y¶)tÿKìf1Ȳôxpò+º ¡È;ÇB[C?Å@Å”µÙwÅ=ƒ)Œc&Ã@ê0.™¡Äb· ]I‰[0…Ñ·ì¶d5+¨[²{E;Eê4x[¦µågónü§™|ÌTEþbùé7äÊ[õ«ßã­•sçMÀ`na¡£Çñœ3Áò53{}Ï+¿PtRÛtžn&¤IìоߌX50 h±°·»16X…Ò%Z “mw¾u­>¶BŸVaãÐóÀ¨ó¹UT>; å° j8¡Lé„)Ú Å¹tÞFìÓЂ3>ºÙD>!ì·²oíŠwL& £†jÿ´ýx»FI@x(ñÉtË.>H—Ó‘'9žÂ6O#3EJ&tX ûÞS0lšÌË\Eø4„ÅØ q-éozvåeøÿ5_î­>¿¼ð¨21Ü…¾¼º=ÿvOž¾mëêçwéaöâ!m¯/çwjô)õÿ†xõ™üþ[ ú];þß'´¯tërôî+uþU®µ¥áÆo¶_n—õ‹ƒÓOÕ¾AÈ]>¿_ÌÅåúû?Ô!TP‹¾6ô "Në¤ô„k05¹ša1ÆÅ_ÙPlFÌS¦>É0 e:–¸F]„œ8e_pqAkmÙ @ÁDœa'¶FˆµÇ:\müØ:Q‚!û‘QDÚ*MOQ4K¤óÀk †žcøã¡DEÜDü‘ָ²”’p¨v$± l7ŸŠçq”w‰Ð!º2A`u7jAð&¡Œ&°R‹ˆ†š“ÌNûaèšvBéœãúsš¥0—b@²ýN*Õu¬"„ˆØxÆô ö{Sñt…ÙšP+²ðúÓ‘X7YÂt 7å‘<,s­º5ƒhŠ •Mïø†n[CúEG.C`Ð%QodÀ`⬇#ƒÉÒ̾ ê÷©N ¼ô0Ù²®É´š‰ýãéûÂR¶"O2Ÿ%ß_LE8Ã[cª–òùzF°~0æîà&é±N³|+ºÇ„uëŽ6¡äE—S(ˆñΤ^ŸÔàÁ34áu0œÀmdÉ?+7Žºn#B%%äV\LFX2"_~ÊDÉCÈÑHbcZqX`ï1¥švŒ ÿÆlè1Ù>âMè»F…t€˜w1y«yl°ÈÇwPf„† C£eí€x àgç=¢Ýj%¶©ŽZf̸88òYºXb$‚ˆ¾zF:=ļš8{&Þ‚÷o ‹¨â“5îÏ9ÈÕ„ö„}!–. ¢ÔZÀ#ð²­Fz-Œø©(èm:åüçŸ"¸$ÓtÑè*ØLìfIhá‚`rÏ¤Û )„RÕgÃcê{ûùð¬Ïö Äš0ú]“‚àeS¡ c&¢å Ï -0çäÄ2¨/Q`õ´e¢Îï±æwÃûɯ¢' pèÂrû´E72rLb—0ƒL(ìï¢ÊqGU4ÆPùÑH'ËÅßS6è °Ô‰d%C†¡eH 0“0ª„–ÑÈyœ$Š Ô@F ®ø¹K¦¹|iSe÷TH¡»¡¯¾n¡Ä–ÿÎEñúUÛ`¯æ¼ÁôÿÔ¨§æmk@aÔ§qÊê+)ÿÄ};¯G\A ß!=›MÐ&|ûidMDåP8‚P(£pÅâˆy`¤¾_?~/™™Ù` &ƒ`g.–|ÿg?ÝOÄZðÊ`‰|j ÉëŠZ‚ÑQ‹Öˆ\+a À®(`ÇTDi§™Ë;‹éˆ¬lmxàG‰¹HI},°•f·õîà€œ7‚R‰1œVJÁÏd{Ÿ¼³@׺£¢8?D€Àæyç¾ˆßØ¡3¥¾•þµ{dŒXÁD”«džF·@ß ­È‡»íEq¸®Ö¯½LffÜ·Qì<m#3+Çs–uÓI((¼„ ?OiæŠb«g*[+Â-è…FUÜC‘Dá5®Q>ö7 ašØ<ÉžôÒÒÆ½¬²`µAXC)kŽ4öŒ ±ª(Œu±¯™bËÀSçÍhD}\–Toçª|Ý’‚€ô/ÛŽävЈ´#;H5ãÞ{U_‘Ö@ZÔPå³p¤Å‰:ÑZ`@@,Bª®/œEÊœ“S è÷­ -ùš,Àü¡¥FãÒoÕj ]0U™‰rMbz…ÅJ}=T уŽó¶­ÚÄÐÌÞ e M „©×Êi›ní‰"ð­`tuF˜U2aÅØ­Õ7|ÉØÏí]#`Èý»µ†³ç+qé*—ŽùÜ.Dõ `èØ²‘Þ¶qýª‚˜ªv墩—­Ì2¼á´Þ&À¿ú¨óÜY<å)(Ú>5f¶3[mý¡¸Jl,ÅCVÕCo4 A8âZÊ!T–Œ)…ØÀÃOô”b`Myƒ•¹ÂÀª`EÎÂC>V„.ä¡­Ì)€ ­€ÊS´YØåμð+¨rl`Sâ":¾*]‰-A¤²Ô½µíp]Šõ\/ÇâLZ{?­Ø’w šˆŒ*6BÌ –'2Š ˜I®sF#~ÝNSÖ¡¢._ÚË=YMmK=%9»"ŸöÞ ¿ÝµKU3$ð­ôGCšz°ÆG?Ü£ÕGIÈÆÍ…FwCðvdÞ¦“«ÑQ^ú§FCñK6ºÒy,½_aÚ_Á€ýùcª HýFU \’ c‡‹8²S‚¡V"á•kày¸›)ÿÉAwØ™=h(„w¼›àA35æÐ*2·Ïyº A2C2?)‘&©~•Kà9aTT=…H=p0z>5JÔXb2|€"Èªä œg]Ðq]JÁoŽ0Ì4d ˧ À‰@çý^ ÃgšØX/Y9Œ!ýRÙ´ðw`'0]ù‚>vW:Xž[&nÍÐegv·°¿²ÙI¡r‰bÌÅ. IÙÖ­‚ïìhÏËæéÃ[™ÂFÁ‚dõ„K»­ª3KŒA. íFvmt.(Â|eÌîPëßrJy @*w¢Ð5´†Åµè˜/ýcàhj©¯]« B0\ÅÂå(pšdc^’í9*$’ÊNÀˆÙ­´'ùÖÞfn=xÜõ˽^O=[žaµpK]ÿ0?[Påc6~ÿ=mѬú~Çí¯ŽÛ­Aø.äšý* Ò ˆÛˆ!«fPabÑcÓ0r…Í\f`’àPNn ‹ ´)–þGµQ®ƒ,ÆZQ}æÄ©¡£íuuÊi²9’¿Úø»îÖÚ¹+?}>«~âÞO]þäWÿ¼œzJø°· S,†ÂQ’Óvês ®A_Ž=:qƒn— º—×þ@H[žN6žéo/,êçÙÝZ~Xü¼^“øŸÊŸFßû²ópórsýŸFg·–FÛÕïäÑðÇkžœéùø»;¶}&€tE_B"oßGËåñwór7¹øH‚NxŸ¿ªÝ£—. ¼\Ì>ìá«:­ê9nÑQ?qùMÎë)eùeúOËÅü={щ·ƒãVU«ªY$R ?@Z!‡&/⬙] –žÌ>½ ^DOëÃÿ- ]Á+(kÂ^¯ötXß­"ÎE׋ۜãý6¢^mç“{P–…¨à«b4aRÀ¶§Q Àd!€š2˜{Cb.³I4ç rÃAs¶Â0‡Ñþ‰Í¹»Œé2þXäÅ!ÿo sØþ_æp°31þß s–Õ·ìpÆÿWCTOD¬]Eõ=n¿C¥Â9€I¡g1i)B¢$ÀF šþyΕæd]²2:z6Â;YuwUוJeÏ(¾Ð‡ê«éø~½[|;?ü<Ýò3sz¿Žž®Î¾­¿×ß߃6?.\ÿ‘µü±äæê/÷5tsúéÑáß—ß§ñ«htöîŸÙŸ“á³6¨?0æ©÷W«õ¾a埭_熣Éìîîé­«êanc—ÛZ„Ͽðs»vay¹ñö? ¾ƒzÖ£­yFSªÕ“·u‰¼‘žh¶9¹P&©Œ’Ž67*#ѱ†¤I~ßìXhä"ãÏa»úE×@«1QgÏ|÷»";Á½ÂìŽuÿ¾Ç“ôà‚IbAälùñØÌÄ» ²t‘óu2zΓ#.~È_åÁ²~›¦DŽÌÛ Zˆ:ƒ‡›û>±ß¥{`!>Lt‘¤pZ‹HL8tóæ˜?,« ;¡!ñu½Ä`„Ö3)͔ԂÑK ¢É€ŽVÜ^9Ï8o3ñ”óE±Vá¢Þh5r“Y˜O|+3v¿÷ê ß¡]ÈÚZ!O®GÛ&NÓh“„5¤ÕÍY0`„­ßwõ—òþ\øÏÚ}•N:)__\:Íš‹o±+÷O§ô“ø»0ö,ù q½)q ót&<_ì~09þnŽ.—7Rë²Ü,¾ŽÖá+âzøã'Uî8Ç/¸*ý7/Šq8c¸Ö×·¿v-tZ/[1þàT™”tAMMjDuFS£àã4çD‚¥¢‚vá“âù¼¾‘ðëÊŽHæƒrÊãØÍZƸkc¦étçä‚•Ñ»›Ž»fÉe4‹ÓN«4zìš+¶zn\.6o(%ðù†’HÆÔÏèQ¢ŽœÔ¨ùž~ T0îz¡ØVœa rsï%ªìÓ< i‚ 4åð}ß(Æ 0!Ádµè¥“å=»æh-ÃnÃRaë+A¹ìTm—-d›6ÿz,Ú¼vÏÚíá9½ ÚC{ú Ž)˜503Ð 9o&å(Ãε"TAŽ” à†ð·³±oB!"sœÎ]t„Sƒ#«YMmëÝ,ƒüR³&Нƒåz¢MºW$uŠ«Wi¬³z§éÀù|½-Y­è—^ÑÃÐdWLÃV¿&»æÌžeê%á爚šCB­I“„”d’c‚¡ÙPÛ{‚µe\üÑ ”¤ÅÌá§É¨¹-ÙkLY`-°78BfnÈ_Þv°—D£m£…ãûxë ›}*oèKð`¬%x“VŠW =+N‰¡a Óœ»%¦BVÁÊ”h>´3m2RgòAaœVS²DïçÒu͹%èÍÒP²d?É„Ê@΂» ØgÆ\7wNŠïF&rH ½ cåcT5ö]»X©¶zh)HÝ2,$wÑ0‘HQÝ@~ÕjßIR©‹¬Fg‘JŒÿy¢ê†m Öê Ä¿.íiŽ-fâ˜G ‚Q#=Óš úÌØi˜Ì@]õAk2n¦äÃgJœšMÓdÝØgã|<á&aþ`ÁµŸÉRú’p”9d­2ØLèÁ át€T2OÙUR&/ á¬t¨U \— 3kWUžqæÀ«™'ÖPZ‡xkƒ&ª -á `‡aAiSueÄi‹¾!‰E‘Þ§hQ¦#NªD"î"*lGl5p ¯ãêÆY‚¸h³iS6KBê£ìÒø `³eLôóc’óС-i_ÆN¢ ’"Àà !„”5„–ù?jgè¯)6Ó£ ‘ˆ1—‹Ð™ì%ž\БkÕqnŽV/‚³’ C&| $ßí¶í•¢úþ@Ó:™S49@ñ=J`Pî‰$º™“*’LàJô˜’¤ü'ü³i«ö¨­èù÷”,@× å€?ROÔ¡Äua¨.@Ô#)¡¢ñd qñôæ©Vv.ó©x i ¨•Îeî>axv¶uMúä»[v&|÷°\ŒÈe& Ȳ–™}Ì&ÍJX-ªÌßœu+Å»¸½*\ffއ«Ø+±¬ÒsFާü_¾3 ¦ÊoZúFU½^£âmbÖ+RÛ3ݽ('ØKÇ­8G¤Hçr$L¢‡$‘¨œñEò¯pv•Z£¢¦ri”%58P7ŸA éšy(M=0v–¾Ñ@dYBy”þëdÎàÝE-Ì,yä—Å,¢oÚ1TTZ>Ëš'Òµs誑F¨×a]©dõ:I³—.c JREfGe%ÙMËÚ1˜öJ)3¦=’ì‹¥›Šض2U u0aï.zƒÄ¤ËøP÷+‹Á„ˆ=¢<Í?÷rèο˜õPcR º[tšã€ÕY“ꢄ†”瀷$`iÈ?ÐØ‡ÿøYéœ+o(ÛØÚUr Á”Vò5—’ãJ…ÙXÐjѪ³œ¿ ºF¥:ýº©ÁœðÜ;b!!Š›gW¢f¯ì”aS+VËUC†JñïºË,bÖ )yG@&$· š¥[E»•ݑգCÒwì<&°§…Žà](B 5 à^}õƒUÁ…!áÈtœe?û©É›Ñ°tÅ0èk†ÈµSîP:Jt£í4¹œµ•h³!Å{Ö¢Px=²B•¤KÁªžé ³%-Ã{7§ÙMLNUDM˜%Wo1JÂý‰Ì"P¤;_Âu{Q·šW|6G{²jA-†1‚V¶ÌÎêÛÏ[ùë[oŠÈ #§×™’~ìyJÚ¯¹;Ù{¬öÄïAëÖ½áîÎŽœ@sén ß#3ËÝ#׬™<Ö Ú‰4ä^*¤áXægJNbíKícÑ…„¡Æ]ÚAe’ŽQl&™Ae„ÐK¯œOW¨âîþù„ŽJ`#«Ð|ùx¶¬¦8ʰ¹»$ÔìP|^<D¤#Dß6È †9P¤Ú„«ÀÝj4H mÁh hÆ( Gä¤@RÅ›$\ÃÙ#dŒh7€ºxuÈŒˆÖ–ŽT ÷œCŸ–ëƒñ Ýâ/•Í÷ð…÷«CMµÅ¡z[œ˜ÑÑe¨ˆz\áRá„Dp–o‚çt³sË`L†xÕ<Ÿ¦,Ÿ½“Z*>ûŒÎšM¥à_…e„÷MUT¹NO[ˆ%å!w­Ž_J_2Ýùa_aÖ…!ó¢2Rûè£^’ÃfØó×ËhøÞnùòÀ :n-r ÅnRòg}0yñº;É”D©Z@Þ©Íôƒ*ªÿó•Mõ‘ÝËkÝBìÆÑ©rôÒ-kŠÕ,F¡é——§Û÷Ú“†ŸSÄÍÁã_»hÌ¡a(¨¢¸ƒÈµ0?v5'ŒxJà…œ€å™<›X”0›ø±ò‹'?§0#\Š™ì*Qn¦œÄŠÔ@ÑÁžŽnA)‰3Çç׸½ïC¡öÖeÉ?õ›Û©»Ì½ñX_›‚—'î€vx Å|`2Ú/ÄUq€Ëæ³vwåï“qßûþ"$©ýè­µv87ùù¹ÍŽFs÷ü1Ù|Ù\ž÷Ckôß×Û­+övùºþþlâ¥þ¿Ç%Wÿ?&_¿‡Ï—éàLýݾ÷Û“õ;»º:ÿÛæï‹«¾ïyùú½ž=“À:Eß±‘“ôvuyÏ—«ôWœ|}„Á Ïûã‹¥p…•×õkZ$W]Ä;çPY<ê×¹~ ÷ió>èÂy‡Ï³ÏñþtK¨Å{|é¤()T¤Y ÚáXÀ„R¡a„§b!ãv»a}ײ”áwë¼ñ¶-&0/¢s¶=Â[ø6Íp.{¦…×§5·zN>x¨O;¿¯Ùãó}¿È゙O§Hgðåü›½´Cü·;i*#‡áêżTò,OAjáxÖYUeÕ ê£#›ó™ÚÑŠZ=¦ºˆù Ò!~ÆtŽp»s¹hø¥¯Zl¼Ã`ÑÍiéÌØ|\[°|:;Ù³ŽYtBöÍ9ÖÂÄ6¸„ÌyB+Gˆx¹8—Œ“MÖ“†w†áº›Ù¡^•ÿÄT˜èÏÇX‰üdÖ–­Â6^ÕʵÄ|mB'˜wÔΉŸÝ¶ZtíUú¸Î_‡=] ‚~k§Ôä†Qeþ=}ªÜÚfȪàÓ´¨·Þ\LgO_•§Óë5öy9;¿¤_ ²üýÅ<xÞÓø<É6Þhu#‡Òž\ç2”oÏi âOQnR<ÚîѺó ¡f²‹o¼†7¸Mr¼kî <ÏCu“§y¥Á|>ÛòÞŽÝü«ÀÔ¦ö1¾5Tq¦ã•Lœhô⇧*¿8Ô%©…ê—¼ªšãB5ÎÎxR´o9m¢£&-:› ÞIu§L7‹R°žÉÑcÜvì=Ç?röX®¥¾’]M[RvÔ?µ×íLÇb Ô‘u8]Nׄ oåââB_£îæÓ çèü9ƒÍ[[èõuõew{=]cÔëxX·`à#æÀg€âh!Ú=¿ýï¿4d3G÷ÚïÃÜ£h¾Áxht«´:ãDØUuÃé h5ëñG ¥Ö´ž NzÀ·9~åbâBAž` 7>öTyö&„9g¤­‚ÛšYö-ñ#;OH]Vw¨¥¦±&ˆŠè°££U~@Ú?R^+·«ŽØ‹äw þ 뢕4üîí?¦”v‰B¡Ñ%b°(¡ÒQ7C]L(˜•{}g3 :zu@*íIçNœÇ§3™Ì›´H'ý,(ý¿|âÂŽy UÒO•àøÖé¡ßÄ>YÎä`uè€þ»’À£Ìdǘ/Æ ¯gÌ6~?¾t?#å ·”VÜД8€c s’6ß–.›[ ïÉ«¾ÿÞ:%+i‰~5bQTÏjô©ÀA£ÙJKù›ì ‹Ä»âµÂï$?#Eóî¦È‹³‡ Æ6ùhªÕé$ª°‘Ÿår "Û‹b”ËûÅ)ïÑ'Ûˆj$à[5“9JílÉ''1KòŒ–‹Ÿ¼æ…™š%4‰ fWÓ2(TyeyD2U!5 @B C!AD_‘ ¨ N€M™Šä*t:)ˆ²7Å÷GEêrË5ÐÄngýWå¬AW!R6‚˜ªN.Ø Í]lÂ/ <,v܉Àg™Ñ€† šë ad H2†â 'Ó4ÂKÍ„“Ðc•U]Ôˆ´ H!i+´œw¤  ¡˜ú¢tBÓ|4âøË•C>TiÜC+*ÐS¢Ùá:¡ªš]öB )‘Ó’Ð;6H%I=ëû¥i¥ÚkJ'Œp¯€¢7È.P‡ðH ¬;“‘þÑp‡ N`Ú!ÂVþ“ßnh’Jšœ_K…nÃÐSC“PøVȈ²$¿ª1k¢ÖQ`x2\™J •…¡Þ€ZS£KÓ?ëõnEû‰‚ÆAª£8=¥DOCëí %¬¢gð1Yn£Š?Þ>ún #«ŒÌIÜcÍ(‹ïS>ÎÉä /›nÜp¡`äšA³( .º(´j³`ãÝ—ÕGœžc5þìbò=È´µÍêó‘Õß; ÊÁÂM ±!d†ŽÑîÊ{”A"KÞ°Îü§€±¡ú‘Z56Ób+O½“™¼½­P†Ôd©ÉZ•BQÃ=çiDc£Õ5§ßÜYùúµ´›øÃPM¼¡ÚüY5Ïxãý˜,ûe¥9œ$l¾¹~òžÅ:`+OC©±U¦ïôžµkuThõU›`áå2«˜\hªfcú‰‘뢻—î#ÅŒb<³~)œ ùºÐ»n‘¡¥VV[­ã]FËW)·„Þ`IűöÞNÃJ3ñ.„ëVí£ªWŠÓ|P*FAå)@Ý=aO([½‹`b)ZY`‡}R%Q]•fð-]û¨:…EW$b@›È[à’Ìù#ŸÕg¯êt:¶ˆ†E4)¯Ã­)o9ÁitVò™è C.Nh #ÇWߨvo'ƒ ‰à¾8I-´e^·1j3"ºÇùB™CI –Í›ì,o9°´ÈE™õ B8>ÅÑh8—(L:ˆC|¥ô+A© ’4½ež á5pÝïF‡~v F,L8ÿ ÕEÞ¡›躘!g7% Àë“L"]å™9Ü¥ã_¿×ôa•{gQ?Wãg¢^]þÁycý˜}•,­a¥"u½¹ð€Í2¥¯%nÆ Úgõ™Už#+Y¶t˜îó–`¨¨ì†¢c;°f Àõá*?èè0è ì Æ:çT· 4ÜWЧcõœt~ÿ"l?âl.âEg—Wbæ…¦~V­PÓ7ý”´‚š`õö-ëÓ€²~Jƒ\ ¯œ?n[åÍòì°AT5œcàT—°]¤6.Žnà>`oUTŸn¤I-'ï¬íöñ©•>Ê z»œ/Œ´~"">§1œ\¹r´£@¤+)9÷ŸÓ$ý˜’ÕGóñÒ‡L€Œ·³âHаÛ‘i$Ô²z Å„¾,i>. šºm‡½C·X;U0°ß bPBç§wã¿ó{s{sc'2¾³s³ôxpòx‹¿š,ÅÕóüc©JžÎ:é~Ï? ¦aGè*“ o‚ Æ•-v‚îC±h¦LïËé BÆîb¨wF‚'?Œƒ“Çž+§îÝÞ|\Nñ*BŽž\úh'´cÜü÷UȃXgK½Á’]ÎÔ|£•Ýö ”g‘à N‹±t“}Ú}3ï‹®>lÛ¾¤ÇŠÎíÚ¨J€«4´w•Y{z‘š¨eå&+k/ÙOù±WÁ׸U5¬Æƒ—Òƒ¢, }»~M{.ž[¶ŽÛº1ŸÒf“9]´ {õ:Ccæ›ÂyžÀSiâK|á-K–ZGüB[=ºGõ3Zýó£‡ñ@MÃgoBçÍÅ{šBYP¼)‡Í›Ë‹aÎYA›b$ГœÏén0ˆŒŒÈb¯<€ÊM‹€pá2¤Â=—1“±á³<Õd1ìÔ3¸Dm×¢¹xunö“Ô‘ŽNã%D}’4.üœ<ñÕK9ÀˆÍ‘&“£A['ÏÅö¨ù4M“T²y8Bl,àVÒ* ¬«æG例>ý1À e¦©š¦í“!zËš"P9/ç˜å©hàî$oB øÀÄ ¥ñÀ4u»X˜Ëôá‘@ØЉPûž[=[Sµ«˜ãì˜çêŠJœˆ\7¡‡æ+] ”¨Œ/"èÐe¬™s_Ë©`‹iþ’J¹=ƒ±°¼ÄŠ7V´ÿQ‘]º=œ†î›EÎØ½tÁê!†/5¯7žÃ,¨xÆÜ‡+/Bóï…¥ˆ ýb@mŒ´ èT»ƒñ¹iÀI„öEÂM·£LJÏ'æ Éj-•w.^·,…ð6ƒ¨È/Ë µ¡á~•9͸Ԙɸ÷i"ÒBa>;uˆ‡##lóû‚é¢cØ— R;Õ—‡:†._Ô§ýSbp¡º¡‚Ǹ£‹–‘Ú¹#Lç‹­Àã!l‚Q\A¹Å˜OÇެֻvV´ŠpÕ+²„骷ŒKƒét;žïÈç!³nR‚kÞÒ>•rêÙ-¼i^ .Áî ëÆ­i2ùº­€¯"Z¤›Eâ6Íޏ²ý¼Õ„*k0•´; Í×¢¹nÝS‘kX!­\¾Å»ÏFWX ={c¼$AH8wk.Ü®bÄ®£ü¾Þ¡ÅR’ ¹³RF¯cW¥‰v0%ΡWù¸´@ƒÃ,œL‡Ùy˜ AQ/µŸ=ÿ ’‡@’¡«Ï¹—Û{žìÅ­¿¿«»“Ggǧk‡nIZÏX®<›%—‹;ln_[á.ý/Ïw? %Éel ”²Aå}0‰Â¼KÀÃL:W e¯›[® Ïňëvf™ß4ÒE$º(˜‚_œ£›ïõ_óßÍ?Èš âEÒòæíf®÷ L°¼äé;=^¿¿‹Ï‡¥Ÿß˃­{ðL·¾/Àï‡KphXÿ·“ß«_³÷“£•ô­ƒÛßÓד{ïëOâßN¾Ù½¶¥%d$AÒÓfQ ÕCgÓ ©ý3(PÕ¦ù4(&a^mšKŒN€fb`˜‚ù4˜ËÌ"@<>}¶sŒ³ù4¸¤†³èðäéâãáÉE ÃãG ÈÀr\J"€_cSê BÀᣘx䚇âcØx+·’‚Å¢ 0ñI(ÒYãP½ËB·ñh[†ùDô1ƒÛ¿;5ÈÐG+ÿ~|„Z’Ÿö®zÝøgÿn/Ÿßõ?¯ƒ%úxxõí×7{ýÇÊŽ¯ëßß§Á¹µ¯ê·|û¿ï—¥Ùú®iÛxïŸ|ú7øø+ÁÃ]¥.¶|§/ÿ§¥öî··ü÷ž`ð¯žÇÃò«ø|¾=ÿžQc0æÏŽMÿßί(ÿ±ƒY;žeÿAü¿±õ¿\ßOúGÁ+îü· àŠæ0Ç— à ±Ð Fä®™pÒ;À׎–fp7 ¿ó¥ß­×cI9!«'3Ћ3tã/fœÓ¤.}"Ëw)­N0ªjÎr³,k¨æ2Wª¿6ZgOŒ+ýÑHµÔŽ÷@„Uuº×QÜ+ƒÑ;ŒÄº=±àÕÔ£¤t6¸þ‡¾ò!…°ÊÛ>³æ5â&è«ÖMÐ'=›nWqûè9þëè@e œY_¤žÿ Q†AÚ@1€‚ˆ,#% YBEþÒÚ¿5ªºÍÝÌÝ_ 3ͽÍݺª««½ßå)rÛ•ðÿÉ ›Šn¦¹eè®· ´#\$Ùt%Ý?¾9ØðåWÔ· ÞÜ.j‘SùE7‡mKú©<"sê„¡qìÁáR-¨è™_ч£S€s É´Bb@²iØK‹d‹Õ€­0ÿh)×2’‚2:/ŠCh,‹zÁ´‹K á’QöóD4¿F~H¶bv}3àë@5ÒÄŸbþÈËD†ãYQOŠK¢’1_|—QžÌESŠgIo‰s^`¨™ä'gb^ÇZý2ú–ü,4Ä6ñ0H”ôD«Ã——t¯Mo½Æ®¿ç|dœNF —êÇMVBWþkù&‡ûäl)f°LÓ{Ø\],-G‰väÙQïiÿ@w¼ < Úà¥K î?^™öÑ•:ÐäZY 澂‘„u”GÙ¬ ÞÚPåk,¨ÉzKS‰@\"Ý·œ Ìzª{¬Àë¾ ×¾ º"¡Ò*lÞ:ìÕªŒcU¶,WYé*ªö¦Ê]¼—ê~‰\‰¦T©H¥r¤JNa%îÎ¥ÛÅóIõ™%‰Å*¦";$6-LÙèÆ–ùåÀeç8;9ÁH^Ñ;j5ØðƒóáªM¯€>lóScŸO®Õ}hÉíiÓÔ¼—C|Î]©IºF‡ÕÐ8 f8õø–>ÝŽáéIÓÃ;Âe –å¯ï{zñÊ*[2üƒ!j ÒÝ^1È"½…æŸF’«2ΧC*61ê4ŒÂ7~s£íõ/ÖÔ Qç¥KýÊçÏDà­Ì ~×p)\+œ ÍN똜꽛þƒµœªøi)õÝëáz¬zf÷ømSrÒ-+©®Ýù¯E´±Ú£ïZV@âb¶Š³„K¤Ëø~l›êQe© à0å©!¼œ‡qM&=CX¶.ÍdÙ&CÒè¼1óü~pYlZEN¼–/%Ê,(U|?Õö”SšlÇÊ¡Rè»%ãéñÆA ç¿bØç£Ã…oåã‚5×6ã¿åÃHq\_×ã-,™A la¼Ç‘8 Ÿ‘Úéå“èeŸJ‹Nº—×õÄœ|RÀJ4,Ió :xYÜ@DýªPVa™a%û¶’K90øL*ଦD2)Ò©‹AêÐ HÁÔ\¯{Š´‘;ŽVãÕ˜¥s˜etb­À£0*áëßZlf[‡ôã‹û‹©³d¥Vï®Ûª¼žÔ8UGï:@>ó›Ý:¥Oè¬Ù¹Â¼@ç !ÐdÙ½˜wjŒØéïfªTªx£™çLÓÅ0‘B«XÏíÄ[0rK¡÷åàV6lp>;7ö®¯8ª8:B/Æ\;ß·Êò[••&* -+ÆÖrµè#íàÚˆÀß\¯ƒz–" ìZÄÿz±™à¼„ñ±QÄÛìYÂc‚/Þ½]ÂM?ÿTñ *xkn´_ù±Û¡@Ž*âJÇi-ª…ÍÕ¹¥\ÜZ•_þXý7(‡pV!¹ˆo&S\S rO7ØQ$“ÛŽK÷¾$‰õ©–7Ù ¶”/žàªJÑ繡T_’«æ’r·ZiÔ¯½à§RÓ—ަwEàíöú¸¼øxù™}ú)¿*¯_Â÷ÄðýÀ}¾ÎVßÃ|k¿:;ë.¿»ÛÝû{ýv‘öûþü¸õù6¿=¹X*¯NµÇ«ßóíùzþ¹Ù±ošŠË÷~ªŸÏÏËK‡ÿüƒ+­@»¬foç÷ñõx» æÿªFæñ¨I³÷ëøpø{x=Þ9 yÌèóýœïÇŸglô9p­'=¥€Ïøåü¸¨_š÷_[¢­á÷õ0b! 3ó\²nŅP6'BZ¦ÓáÖ! ¬–,Ø6œ$–¥ X«‰ ñTÌìÎáôf}Ò®¥·ºcµ¡¯ðƒ¹ßÊA”W5º‚‹ÌsÆ^ó™‰Ú: T¨Ìë†ªß  Ã\Ѕ⦒_–%ÉZÞtª5;i¢€KŒe½,”-EÓʽ±æG€t@Sµ»v²» _¢i½b)–Œ½FH]Ö%ο®Ïî è ¹eVK]Ç;hDÇ—Rn<ݦª?¢s^­ZH‹¬:ÜfaÔPÅñ e"jBÞ\ºFÊ ­Œ\×VD™U»~ Uå CâQ"!¡bÊÀp—ƒJ‡e„ÞÌ %}/™LÙÀL¬V¯ŒüücM@˜?kS(Ï¡öú Ë5Þ¹ž?œd7uÓ9¥ºc:”®DsÂŽ {Çs< C¨n…ÉèbËPŠ ñ¥av MÞ%D"e”•Ìá˜Õ[o)‰€.!h><y4e%KÓÇ"ljȻ¥’I>ªÂUHòÛU©®DÞ:‰Sþ.:÷$•¨¼Ï*Û\7UUP£µ8j©œ.úúæû_;™¡Ó-gÃzRžª =X–š1y61éÄì.[ 5ËpQ’;¡vª––ùAcC)ÍßÚÝœÍ)¥*A·`©*ü´LA&4½ZXXoðê•[.7Íɾ\¬9Ѭ€%«jÂ]ìšÖÀ‹Jœ¿Ä“Ô<'“À9ÕÅYFD­SÉN`‚"$:%nVnæˆLQÊh%Ö–0À°@)gl¿ã²g뎇ýÞ6nP¶Œ[ÏV<â¶Š1žx3Ò„k9VYé¼tJ6+ë<~`Åío ÎB˜_mS¡‘ œ5Îó/&+•ŠrcÔSÂdtÑÖÂD0©2ù%‚•:ÝRñ ÌJu9ë’uÑz¨ãÜhiŽ,WV›ýPŸ¾íèåäàù¶àÊÀïS =±=>~ Þ½}é«üjë‹{QŠ/Åááœù™8Àƒ¼á(ÃY sÒ`ï×ßËÿ^`I“±âµ ©í£¢¸ "À;ì9®ÿ{ ²=½ƒbaü¢ Œ]ñB"W,.ø{€ìú§5LÁœ¦@®kˆ ˜a‘OZÞáøª[× i õâˆb&âS˜-˜EŠt¼S%;PÐWWAøŠx‘vQAÒ*¿)&uôcSiûÑG—ô eE† a[†r¯‹^:[ Ž\ßARlÊDôSJÂõP¨d[-'7Ÿ>â‹n °¸®¢fÞ…†UŸX,TWAYRPz¦R³›˜NN´ ªV¶-ä&`SZž±‰¨Ë¢´¼À¼ðP·L1ÅÄ1vÄ~°¿MýaÍJ²) lú–bYÅ›¤Êã|=G=äH3c¸ÈÀ@’tùa¬ò ÁZXP‹lÝY:0àžlÿ²RQPFš€pA#ùý=9­‰MÌ l•·ò~—WA?ê èæ4oˆEY„gP¶Â¢³¼àÃ9P 'ªS:ë^®ºLt)mppc(Ög¨ÛÂíèGàBY<墯UékîÎàÏvÔGÄ®èEÅòšÜF®jW¥«–5Ízæ#¹˜\nw7;U«õ~¿J¿f_ò®HÕaê/`ÛÂÑAð–À2—¤V0Ä®~`f‹„ÐWNÊrÓèÐYASˆtcßÍ·BräãÕ°šNG;©nÓ]Ùf—˜’U@];°‚lÄK3ˆnÌ#»*@÷:$vô¤l¨ÙÙÐóS)×q!·3)wp¦ŠÍ`·6‹êV6â,äØ NhÎrNÖ)Ê1ÉÛ­Íì+9;3>ö$b¬²_äþ®@¯™i;'övêmññÇÛˆÎK7ý^;Ÿ„Þ Øx3•m<4è\lcóWïøy' éåuѧÝÓ4›àáÝÈåš;ì’í8Êá\ìÀq|ÛU˜GJø˜•Ûu‚Œ* ø¼•e°ØC.ÕîÆ¬šÃm §Ë%6» íêkßø•ß²n¶ Œ‘1¢ì ­ˆ±Üu … lÓ›n®jÛ §â>AW$AéTJA´ï¦hõТ»w{($@› V*ò Þž¤Î+›_xL€_>¨k¢K-8-¥Ðî@€ziU`¢#]=i†k#0Å.4\k¦ùýV0ßôž;BmBÃêßuwZ QÚF­ a¬Æ‚Évóo+ˆª8iásQ0uTw.[ÂKS¦)Ê£O-t¡ecàQ#Õ/…(Ôø§m»!ÞÔð X7Ù+tqÚ> ñb€n9¾†UÐòaШàVªLóœÈ‰ò² mΞ£¯¾H˜ü·½Ÿö6î1ê™Äxg×§å<æ¾±ÝÞÎpÓh©ø ®o2œ®qôÕÌ %%ƒH¬'“ &ÀÁ¼;L$`"Vßñëø}ìñ(G;o®0îî9ð âŠÎJ=3Z‚kjI̥šM¿ŒX‡ºX·ºm]’·ìÍÝÜ=—ƒSî|pÇT‰•£'ù‡L ˆ{#M¾c¹¥œqç*s–Nb«!Æ 6‰<ÅéûÉbîò}xVÆ5éömª¨ði–”\ÝþÔÓF«}ÁΤHr ܼÆðI Êäá^q/bÒ¼|¸™QŸRÓröSæ±X€Äû˜ÓNsÅ¡>àˆJOý€¨^#`TEõ;eÅ ÎÞ#·ý¸›ZN—õîFêÃû—üv};ÿ//§¤Fy}»“ß·7ù?.z_½[þoñ_KùüvÿþK>Ï€j²YŒ©hÈ æ…3¥€ÙJS§,¨86èQD^$ô}CÐÛ}^G03½0të es¤ìÈ8´d`»Ç;‘m®¥¯JÀä:gjNÖì7&ç[­ò¶W8 ]ËgðŒ¥›òSïÛygtõaçv~È MVprWG5òÜÃüW™Í§™ÿëàx'm7ÏoíÉ_É·…»zX‘O*o”ea8’[îú½Ñ‰N™ÿÜÈ/ÍÉLšº?RY¾†›™yö”"‰‘ÏÒÅ™8Ó;6qj9ñ4Õè^VåÓ¿çç—l%ËòþãL0æ÷—˜µ`¦áÝ´2Z†^ÿ5|*µlR—3>Bº©ì§È±2gCOÕWJÃS ã] Èw4Ž1X7éèÉòÖóŸ¨T4¸i¦bJºQr€x/ &‹º5¿Ô0=k¢ô€+Òü:ŒÖa_œHöfhÀÔæ%ôØÜK§çô,GNÛ ƒñ¤”L¦Û„㡎)µß jÍéfú|'b(ÈTòïÛ«|¦¶þ8±òiëtØæÁ¡Ò…š£åÜF ùär#«¶KF©:Ô~©Eýܬ5ŪFÊ‚”ˆ’Ié1Â[ªzÔþÊõVþZ‚usÔPøkÏ*+¥z[ª*dcÈÑüP ûè9ëRÒ\ÉfG§¾çèÌ8œ7 ›(¥pµÆÍ>)9)$˜OÛô¿$jJìzùÉLEhÕÍ SY6jv‰}âGÚ{(¯€˜îZÉThª5)…çÔµl EŽM%„íóKpQƒªçé}c"A8¸È‹ª3>iG´ÒºCQ–ä¢m<ý‚ðZm1ÅBKý) åè¡:À&¢tÖK¸$²†äÞSi;!ãÈcvo]Àߪ¤¤}z’WG.Ö2jKƒÒ¸á B‡ž×E™óŽëûØõƒQÕpä%Ø'µk Mˆ:… ê%hKU¼»9®б¶>‰Ü¼Ø8øi˯!wÔÿ¤ r­\ÒKë;o-‚’ÄŒˆæRÇŒ x³±ãÓìlùZWû© ŰÃm‚›¸G‰ºŠâ|p½DIêc‹Ë*P©ûit4£×Ô†.WõT¢€XÚ*b‰<ÝP!a:e7Eî7øì¾·â€.y>NXi7F [çº8••µf àÎL¼UÛÌÅX·J¤vCeQü ±ºpS(óH`‡d¸&g‚L\WTTX'“ÄŠíV €Ò­æ‰CðJ­ÖÀÖM£`…y(ýUÙ`ú8¨GC:?a¶ ªžï½¶Òîì‘Ì%$æÉn[‘0qLvà[)‡mn„Ì–dgÞš“¼z{¿±¯Ž¶¶äõýþ^úù}?nÎÚÿv®ÞÜçý…ò^Õÿü?^ÐHãe‘¢@јƒ¯²ä¡ì Ù(ÿ{þ”¯ùC[”l nëãñ=Þçã41ÉË3)¢õgB_„§¯g›o·áe)]»Ó_ܶRxž†"|eœ¤4V'>Z*·°nBª÷1ªAešúß¿±õðÑÒX[ôcRzH ½¤ †2¦ÑÇ¢”ij!å™:IÙž‡¢õÄÇ mŸOI>ß>Î|>}¤ÜÇê&å<ô<#A¯ª•âÃd8> þÑSEÀÏç$Ñ8ú‚KGL¨g> ‘R5:IÅÆn21I°ôc Èó$ÕÞ IT£|TR©‹õJ7Dê!”4õ’Ê7óè#”0õ“Êÿ}£ÀʘŸ`ÑÐ}”„jïs‡Œj7µÐËÅvÊ%¼}ÿN(‹ZT'¿Èΰ}ÙÃ…~£ ¶NüuRZÏMgc½4…DQv²ºd+Ü”UjWÈUÉ ¢•¨Oè}¢[ff6<{Oh¯l„j¼a)–Ô#n@¸´ðL œ[¡ç©SE÷qf嘛“×B85—.ÖÑM¨’æq¤š¬îÉ”x—]rÍ…«:ޛԖΛmQåße$ý—â«”T±Ã¢Çu{é'wæÉ¡q'j²ôj7õj35æ/r€²}pﲚ´ær{BV”ÃÒYQæ°Ê†PÅ4C¾~1¾BÛDöà)ß¹ .Àa!r=Hp¨Ä?”XudRcŸmà4RÆæ‰%’ã-Ÿ}í$'<‰Ìž\°]²ê3àÞir(1:B\ ":ýß)‰$—B•oôúŸ  Ì`H-Fp Ã)åýúeýTSlÕhË£ª–p%‹BW‰)ù!AòxmMßô”I}ž»“Ÿ§’g’w¦.ø·›^`.ÍîÊpêcL^(Þ¦á£ýäpÝ@üàgËW¿‚…t¡±•´ãœzö‰˜•5Ž))ú!Á–Î$$4ø]FKÑÝ#bápö='ôdh4¥_þ¯•¶-1'‘þ€?z0bâÛÏ$žZ“ñušXØÔ–ÑÖÔRŠà4„«;g¹—æÌEœ1À<“äÑ>õÜ*.rkéýX˜Œy€¡N¢è±dŸ“§¤‰tãø]šÐö§ÚjËd,B>ÅŠ2ÛwÄ Dúò,VœªSMnh›Bc£E½´-çFœˆîÁÅLÕÔ|ºFÈȱ¬Z;WM$+ƒîsЯŠÛéªLBÖªYl´–X Š@Ð-D‚8•¨¶öu`Ò¾^4Tß÷Asy|B&¢Ž¹Iù·(ÀoS&n´@Ï5 ˜S[cÅŽN8æAüè¯5šÓ‰8Ñ£>1B_¬ßMM5™Á¥·ˆ[-÷‹‘fP"ÐNpO Èç¨Q¬ÀQ‰¯7 àÍÓ6Ë”4Ï„·åÙVEÇ¢íÄæ<ó{Š&›¦( a–¡ô¤úc2šýÄ2=0åÀuÄ߉'ç•´D’uãL ÷6—6 †¹ë^ÒÔ©ê,Ö¥hð\/דʲ3€œ®ò¸¯KÙ±ÆÈ3ºâ%Î$g¶ÅK<OÓ¨5Ì?WÆìéënŸÃŸ¿+³ß¿§v¬Úühþ§"trþ "y÷Åmþù;{ô«ÕîÑðìùwkÌt_'K‡¢ä4*£;;Næ'W+×?N§§^œõL?Gzþ.í}öpŸÐ¿d–É\4*êõêkèñíwwi;º¹ƒÁª¶ž~ŽüÚ{ý¸ý>Õú’œgyåýΨ‘EôýòlõÂì>ïè2t:mïãüªŽ°Wõwd«¹ ”’ÚF%ÿÚT“DìXleX²/BRn)“YXì ‚j€TQy40jO,KuªNäŠ;šY â-t›o6!b:\ l³sŽÏÑ`-Üœ#§NwƒË•Ôë+’LêœÖoH"¯,3ì` “M§èx 6í’=%ú¿Ð&¤äå³Ïkrw×èZÓ\{JžèéóAØÁêÀj8¶–„C3'¼ÖXU9|Û3h÷ænרõŒÁ;/Œ<™õuf̧³WÂÙ¯²¯òÑâ1‡ýCª E5{4çñ4xV±ÈÔ`ÙêJQ#}éÇóã~@±WЖ<ÁBv–ÁE±¦‰È†´b©À!{ÍŽì† †_Çá¬hžGILðÉÄm,$€Kao[™H™Ò­&JAÃ(aÊ©£!':¼žlÃ0*˜¤­}û·Á]|­¯òÚCùE— O ¾«\nF½¹4¡!ô.ë3Õ”óš=lF E%MõÃ$F?fÅ7%'åOoÐK¶½²ƒïþz›Ëíà<Õ2›Öy÷Rê‡ÝÐö´·Š§ «ÂÖ|Û©³¥ê}ÃRÆF?³\ÑUx£äFùÛµD·i«—§(«GŠhŒú^TÒê¸`*ñŒtžšœø¡(îoé¾Ï ³áž™ˆœš¾‚E#Ù`1'©T¨ÒRUXÚo4òØó8‚²ù³‹!’*É&HPãDIÇ@ÕŒžÌC6¼ÌUzlàTÞQ’7®Í÷0 WFH8(Uö#!û6Ê·A"¥æÉ“BPJVëX~¡ç'Ašb}1¿Kt¨ÂeÁæ6&ÍèÈÚU¢¤Ù/Ú܃ L+¥((‡­°TǰÊß‚¿„·?HhÑ­<¶ëå¶^c@`’®c¡8µ‰eïPn_eäëþuqkèªëýËñÕLawW»Õ´}{X›q”Ù²,ìÆæV{äx.óö0c¶ üÞTÅ7úßyæëHu pê` pUûTK[ŸäÀßñ†½Pœê=î•Ö^ˆêý-´¨šEð×™WÁGÙ"/-‰,°‰,Øcèm#ˆ¦}(V[®øì§ÿšúÄ2ŠÚN ¨.уŽKF €§Y1›”jø*‹ÜÉt)kWžkË(zÅKgS=¦Ä$ÊâY…‹¤ˆ8ú“c©^ÐɳT§êæZXɱä’oÖ=‰¼Ñzr‡“o{ýœ¤OXà"*=ˆtÅ‘o"ò8¾6ð8âÓnó~0hYôIAß06×_Mâi«¦¡Qeû ÐŠŒüÌYÈ{ñÓ7Ðîë/ í./…Ý„û{WÁ*J_^)…gr‡ã^†ââ9^l¦ù‚; ïMxDÇ‘†uÍ{âÀúÐK^ãqç’d&¶G}ÿ% ã&¾3üµk˜:µ“†WƒÄ'!´üñGi=¥íÁ—Æ—Œô›/`EYSÙ«ˆÉÁLÀÀ¬D`ÚÓHõ4·CâT#Äš 3¦=TÒð©åû±Q^ž›ÄÛee²Í‡ïSé›ù7)ÎKÎüöO™Ò†Ÿ$ h‚¿æÏHÞÓ` õ+ÙÜŸ/VVZ@Â͆œcáAªÄŸpz6î³¥Å?¹Û„–„ßáÒÏ|-hN<—~œ°åýüoÞß©#‡Ež—‘`‹““ÂÿÉiYð1.¢vV$رñq’àô<Ïsp /JöÜ)ÒmˆÛ Ö =°DŸ§YU}ñêcrÄöX.a4Ö(%¸leh¸‹q $¾ÍS®Bs‹óY~Ëz-^L©ñC7˜iÑ÷¹Ò÷×d£x:@u«'-»j#;A&cM’Âs:|¥«åd[N¤6Á,bPÀ²L¥o $êÿ¬Wäד  ¨¼C.cÏ˃, û¡ºÐ ¨Øõæ)'«ÅƒkC—R¥`õaOqöžãE†Áb°¬ªAf.¯†sßÏY3E#ÇL(C^È%}£è䛓ê·²™V@Ækî›°Ûµl¬7(®îÈù㔘9Q¥ÉŸ5tè ““3ª1¢( â߃$cmX’7­'²Þ'Ób™U?òEEºF‡,A&´”R)QÚé=Ü#<È„3e@Î F뉠"Þ ÛŠhÚ#7|À=ÂÈcCSm©JP= ä*ïW” ÂXT™låùh.ü‹”Q"Àë!éOÉwKGËŸ¤Þ0Q8‰A!"I¬«OÒû·¡GÓ4ÑIÌ2Gn”Ø+¨ŒæeÁÈõ¹­-A¶q‘Í*+Õ©É}wâXu †9â|ਖõ\ÈÑÓ®¿W͇277ë›>‡o··³]cÁ°KƒYJ)"*g³QàPl0Îx½ªÒÑ-¿Gk6ÕÆ¼ýÊíÆ!Ñ©±;Žþ´´Û­¹§ó×ì1Íçý÷}–¶ñ¥ªñÝ“WÛG£ì™Ê½ø+S¼>Q°~òëáf8I_ºB@K%ª•±€äÙ}nô f?¦«²]3¾¯¨³“,rp¶¶ÑÝn£ ‡Ü•'ÛM×W –ì Hµf‰ÁU%åË7 ý%Ø€ì‹)A`ÓÇÄ=„^«©d‚>·¦óŸ‹U¬s$ÉæUi¾¡ìzÚ- ±4®÷Íæ»g^ÈÂ!7Ç[À#§< ÆCMC&°Î¹­Å°C¸‹†w4oL¦ˆ#P¬hr³´»5ߨMv\Ï=‡Öú²[ØçïC${;*à¿uG‚?B;ì´œÉ@p/øùfÈDÒE?Ö‚ì€NËósÍí2¸p€ãÆßuºÄ¼ˆôiàã½EJo]§«ÌuX¢ù¥¡Û7äÔ\ØÌla}u„EFwºyÌu˃¡‘RÑkÝŒ"VÈ=Öpmo0O·Fëº{1‘*¶ ¶˜4%w$yƒä’ó.óêrÓM–‡2 JÇ&4›Å%û3çWا…¸ v¨ùÎN߬ü Ï€º­W”Lu’äm.…4°™VZòAÏ\L1jÄè¦oVÆtÎÖØîøÔå ÚÏkqààj˜[€æK“ü ‡å³IL áQZI .ñ.“XÀ,OĹ½yè²5cJ¨à&—>˜VÿwÍå)búéazÈÂÄviQ6æ{±¡‡4.J)säPö4¹ãüíJ­å²†~è0 °œ—ÅjÅ'ô¼Ï¹={ë»s {³®=3;iÙ¶ÌmôJ×èQ*¶5¨âL¹÷’8X6~lk( á£ù´÷´·LÒóòTÏr†gÂo_ª‚QµdÙ#‚°#Q½¤ØË±lùÝ?4²8?ê‘ÍëCéš&|µCFS2cŽ%—Ì@Öº63˜T£f÷‰ ˾§M‡w–7o"§3ðPʯ*½N{RYñ„nó[%$BëQtƒH¿ß”HŽ*Øi¬5r4¤Ä*ë’‘R®*Š*ÜI KPv"ñ-+ ã0’ðÃVSa“Ym`ÇWî¶Ü›¬+× ”•šFÕhtäȈÊ|8NÆéPVQØi@@ÊåÛŠü,eã…Œÿ¢º¾ïOúöCÅý@6‘FÙµHà @gùj€¨8Οú/´æÁ– qH•‚LðT´ëоCõç»®€Ó͵pïø¶~a+Œ~#ò–ö–§Åºç%nrŽ9j­½éŽ»7²sõ—œû88ÉßÇ™’ß’’‘‰÷åæÖ¥¤Œ%f,­B[R¤‹‚ 6ß¶_nz7>:%$nIÕ¶a#ú½[#thz“ìv´\½öÅ#"8 >¤8È„´Ð\Dð/¦®ä"ÉFa.W=Îäîk‡¦g®Çm&jjFèÁÔÓQÅ’W QN[J0‹…®Ž–P±VcHÚÉÕ[‹òk'‹`Ïãk£ë¿ ç›ïÇ]Ï;…OÃ&RüßZàà+ ÎÀž¥ágâ·. Ây:ù®)¶ô#ÿ¸ÅÆóÁ ‡æí#Ôpáâ"ŸhŸpá°PªVqôøw–7©üô‘¶qOòu­Wa3\]ì:6Õ·ïOºŠj5D1ì  Æõ<³kèq]UFUkÞœàÝ¥2tK_TÄåÇÕ2OY6•_I ­ŠýKâ4¿!qq?²žÂ¿O{þÕ‚?±YlýeÙó{#ä"U)$ÏrѳSëH@N™![6ÚšêÚ-VÖuM‹m6CJK¬L"ó‚k=眎õm‹‹3¨9ªóåvµËФZím›­!çóQ ê´òFP‘6_jÕÞfçjŠ0âó¢2.YÕH©N¬ >"/ÝgÚ¹ücL—ƒIŠD¡7© î“*ú)ïñ,©B–”Õ>—&ªB/ZÛ(LpW¬‰c—ÓPµŸÍ¤ËCÈ̬ÿÔT¤Ù6T¢ìÜV6aÂh›¸UNÜnÚ‰QìðK¶Ü*3´·€«u]¿‚½ŒNN¬U[³öÝi¬(ÁÔþ+6–‘¢‘—¹ÿÒ­´yw Jk3ÃùÆ{á¡ÍÏ—ÖÈ–è*ÍhlsΉ vãü±„²N,Ý7Äl ·á@¢0ÖvÓ—˜ÁWÆXžóÏöÄk.F¿`“w—)/ —Xž¾–y­ Æ%U+(•´äD¯ Ã/ãïÝ¢ úv€(g䌷_T^Y°•C•›TL*»+péaHÔù;=Pæ'/V’èñÉJ()sIŠEÍW¡ËÔÍ"—)¥Ä½v|VwÅÜC¹ÝVVò›aêˆFƒätÆôò!^Uú{“—ÁóóPòÐ~¾=ÅŒ¢·‘•—žFÉÆPžœõÒæ$⑼õ"ÁTQV”u™¼› ¼ß'»ö-#ðà‘¦ó`E%–ÙoÅyÖ<@VÜjÌ¿n.e»ªë­‹I>±'(œå¸I`º å5ªFžÛ•ý´ŸÔ6±¹ê1:ŠÃð·8OÛ¾ÎÐägHs)ž=ä'†9"t†!·˜a£ÏŠ!ku÷ý`ªÈµ‡yP†@ɵ‘Y»™TÂݨ¬hu„… «únrSZe£/_„Jtë,)<¢‚ÉnÄ‚t©o^»mCv |ÛXúˆ¸Ï ^iŒÂ•ã›I²©ªø …X@lµµtÌæ¤´ä^­‡îyÍ m)›±®µÆbXY³ÔÖq/ݵ‰(7t™išCÝsVæ'ÁbwT?g™™`ä°9Fx#¯(‰å“×)@ŠZb«C}ÄÙÚØqÖ`Á…€tçFH0÷7 cÙây¶b+B¦JÛ5ˆ¸“Åî÷‹BC:S‰›•´ø-UW\ÅM£}*G=ð®n)ý·Ø¬ª%)Ë•z AvA€t;žR™©è)"{‰pB—£¥^ò=:G>˜iSŽ"0†Áš2}ëÂ5H ¬¸ˆ"=ò?L:Eó¿$œ D¤U(‘ô€R¼@š·ÜÞ\h ô!Æ3ªÙ>½*$S*÷.ñ ®IWV\›ŸÍM_œš*ÙDsSãŽÕãÉè¸ba ä"üS²¾CeNŸ6¬^ê¹é+Uä& ~Cû„½çÊa.KÁ6w¯ËpÕ`é÷yµˆíJ7ï@®ÝI#þZËg›Tk_õ-Ž+ÅV:Ð ¹Xbâ!ÐÓÐâÿx¤Ûì•Îÿ`ô˜4§åôÖ@=u“¹›TÅÁ^ºèjO®I4D_ÚgRk^ä¾7•â “ßÉ)'®ƒCï+''¿yº6¶ÕKÜ^è²Vߟ ×_9âžž­²z|׫›þ Œ^Æò®P- ÐV3€Myû<´wQµZÑ.;}´Žï¾£Þu†ò€×vwt÷(s7lx¶ùôûÍÕò™UM2"?=ü¦vK>=“QO`&*Ëõu‹OŸíر[º·e©ÎxBÞù8½ªw’Òëž|ŸR:æLøB6èõ[U©WmÙ£qú¯Ài›Õ^!=B_¶D&€ÜrM%oå>îEmÙ–j4Gy§mœUR5ñìÙ=ʶꗩ‚þŽOÆù… ¾“'ñôU0iLV…-æ!Íeádíb¾˜_p8šéÙr bí€ó¯L!ýØÿ|!Í›oÜäŠÚ¦V苨gêÕðO9ìéWú¸ gü‚Lõ•ËbË["¤÷mÞå!ßÛUXú®ºœ½5ÁLÖßE„ú™Ð^S[î/¶Äý¡¸Á±Àì“N“¿–ņÉ?c¬FûÏÁnrü 9C¤uI,)a˜±Õ–ªÒ 4!^9Vt)újÃgöáÇj»vþý,]8ŸÓ¬ãOØ=;ǧãr{nsÿÞy>¸×¢§>^ÐÖ¾™§ÓÿN^×öQ¸¹ƒÆÞUÍ %¨}Gm¹$!”+ÇlÖiêD?ü­oÛ3hS„â«v~>ëbåFæîÚ«Õ´Kâ*‹ÍÖÖÝ5YUû ô¢qlØá?›¨&ëy¹‡åg PT ±_P’–ArööŠÝöûtT4s•ÞØÌMfbô±D+qwbº}’ô­—Š5FüØœî¤e}uÙ~Z¤Fް'º*œqîÒšK&ç³Iý5éÛIÛkbä¢ïãº0«¾NòáSˆ&=ÍKêÌ3'Õ’¤ »GËL8-Þ393Ï1¨û¤¡gµlaÄGÄahW•ƒ ­®òyï}úày‡€"23q¬cÖŒï‘~?Às¼+ËÝó* l홣e~À‡qwSüäñÄe ,˜¯o|§¬‡” þÆ ,áb´PÌH™™ö!“•å-^K€§yƒõ}!®õôùz Ý}Äšï7ïÍ–~„>¨¥öN:ÆÐZrˆ_äõ¼´qxúyeÖQ{¼ôÑëÓ“Ǽ XmðïbvÚ÷n¹‡7 ¦Cµ?²³?mØ×µ';tÁ¤¤(P£ÖaÿöùÝÜÜÅÍ•i÷‚µ%¹åv¿3ó]£?B4™ÎB«„«Ò:ÊF¡'"NX¸a¦`B8“A]åt60 9Y•·«'Â4ËG´`'TšDËIIÓ¹èÅÁ1%3l›·£ÄÊGË‘J'"wXHrLËfcÏ~3phfÏÍ[Ä}Ùªrrp.ª½4—àÚø€³¤JÆ£@ófÂÀ hå×A®Ne‹z!8z¦Ó³zD¥b‡ÉíÖ:«néäN«Ò:ËN¡7"nX¸a§Pޝ‚Å8$Ê–˜qN„š7nT˱iÌaãÙAc&IÅ»¬RâÆ :Ïl&Äis“Äd-úÓâA™¦«×»µ7ìzðÔok‚Ë8Ux ·Me«ì¢•:™[ âŠéiÐÃ6+ÒŸW¶hcÔn mdÄCHf…’€}ˆ]³¾i®ußrš § :-3MDI.J>‹Ä’¤#š¢$”|äCJe‘V&á!&…º"!H>]qIj•Â0Zò‘a-’1ZnÚª˜.£ð뛇À’—×GÊ šVº®Ò ÃÜ´MJcX‰Â^"å—.¬RŸ:¤…M{ ¾LgÇ;Åa+E½0´‰L Sî„ÞÔ›ÿ»¨òΊ¿Ka‚ nÑë$:i…FöÓF;xõ^”9}4©µÊ°ÖêkÚ*—l Uæ D‹é<(pÑ:­×¢Ó* î„5Y?bCø0Ž˜(31¤%|›–<—=¾š«ôÑDùÚæ‚OÔHèàQÂlc°j ëd&Œä·QLeBÈ~˜mDÙÕ²©µ“-Ï`Ò a&åEX¡KÅ,×Ó*Ÿ%WS²°§bW£ŽÆ<¹4Ц.apÑÐÈ®„ÀÝÞk­¼ù(ÎX&•Ô]QB!_\ #·)¼UäRÀt’k9J$:S™â„)I,‘4Œ¸n®¬Y.Á0•`¬t“X$©¶‚ŒB²­ÌíH_ÖÁFA|Ó2Ò{D¿â‚#¯¨2±Ll—ЩBH›î!ÍYÔ;L˜—¡L‹‚^-'tTÕÑyuŒŠjVFJã”¶K¤À¶6:'¤$äu0ÈLZË’Øb†°IPe–ÚÇ\D€[?´©¡HÚ¦ÊP‘J¶aöX•M⸡¢hÃÂU<ÞíÆE¬ÖÕÑûÙ-¦mwi„ g{yb.¼‡/ÝñT-YÊ>éF±\ÁPˆÝ¶+!¶œ(ñ¤RR„ª(Ì+ÕÏúrÜÀbG߈%ù%û]ËDóOŠe¤cÕ?›2ža™Šœ!;z¨Â#fƒIꨠ ЉC¨µ·Ï‚Ë/Ô˜ã/³&tsÀëéÕÆÑ±$å²âìp?’ Q¸¡ƒr·¬ÿ@î›'ʇ‡ýÛa¨‘\4%JšŸê# É>ÎÈ¾ŠžO‡q”*Óá»üÆûÓ{Ÿ·:SçéfH²v™UkHC‡Õb8Lc¦ý‚úM9…­ï® ƒÝ©ß•Ó{¶K]4BýÑ~1œÇ‹óqñ“µƒžÄëG˨•·twfµRª½q##O.õÅíÜFÕf.Ë‘zi$Šé ·ÄaÉü 1´ÚFýîjÒ»½«×»'Î1óPY­ÙKözߥ}Õ²¯_~ù.tñšóæ/ÞèÍ“h<{+.‘´”—9 ï IòÔ¹¿TÝÓwüËýö¤ã£9!îÈä¨ób¶\Æ8îî~Ô}_ë±Â\[†¹Vâ1™ @ˆA: ‹6TûfV\´ŠÐl±‹5ÇôœçE¢c3¹6ް7”"/Äg•±;+×¥ªGA¸5¼Â\±Aú2’±ý0?Z†ûmŒ^ø.2;¨Gµ¶ýoó"_ò/žÐã¢×Qóàã­­‡{tx¸Ò\a¾ô!0¢®2fK´Ó ™HÜin™Þ# ?ì—ÞÙî}ӽߟ4öß©¨ãç4–©®…!f¬9oÏ5Y,Êí¹ÙË—Ãg_˜­fD×Cš¨§Z¶Ø§Ôó7câÿYÇaÓÏö=y*hsþº–;2¹ÆvÿÃmóû.ãøH’ÿÉ¿C¼ïÆÝ}£Šù܈û#e,ud“…ûGãú÷ú¶^ŸR”TŽü"W¨HìUoäžw¨¸;¸Ówç8ìQŠaaQ~¬µ€È߇ŸÕ_eÿ² ±Ôbn×ìøF͏Ž?3àP^îç­æ¶«‹ò”¦9»_w£ÇÖûjOÓó¼áû|tfµÖuJ¢¹úç”ïUÇ@a`”ý/I7µo4§Ž &›8Ú:…ƒ[º`6‹Õ€å¹Õô[çYµpWÑÜÉ£kM´9©épuòðߺÕgô°"Ô{›¿¹v- Ëá¹,_[ãsEé?1}‚í rÃÅÅÖWýœ®ÄýµrýW»£¶=ÔæãuÙKýÉû´³À/ ;€³©ˆVBMÝ*¸?7—6bWEÊ‘øA’éD³»Ñlh¡•‡Ë{>ñ`Îñ˜…ÜláÄ)ÍFÖVp"7ñ7‰§±ÉÆá­vw÷eÄ_æìQÁÚ˜‚Ø 'Ý”âx  ñf{‡ÔJKøžŽ'&ìº@÷ˆ0.wBQ>p¡ÉF E1ƒyÌn¥qN-ž=ùl°â2MhïÒçÜ2LoÆìQ:1 oŒxeÛx›nL†¢oÉG}4Ö,·Í^|Ü»–AÞ&8Ì./r›zÒ`±úE"ô!ð‡ÈaôV2ë>$¦á·ÿTœãÂ×¾ ®Sž¢ý)^$v¢o’Óµ†‰§{&¬šA_婉¯ªV%ᣀ‹v«ÛaN:t q~]Ê¿¾ö¼¨Ð“üî¢9þ/§þ³r°1ÿ/£·Õ£”µÐ~€þÙçï¥üEðŒôD@A†Å8IÀ!‚INlïÂfà§ãf$ýšm3:WLçÖUÕ¦õÌïZ^¯Ša=¢Gàåe׿+m³"ÙFŒøS+K§~½+›*:›ýÁ`iÖÚ‰N‰×üìúÅÀÇbakR(G2ÉìþM}Ùk}¼½I ‡Õ bo~µÙçAŸÀ>þ1”¬×ÕÝð{âjWýÔÝNf›Õ«@½0—˘E§Æ}oÂÊäž&¡Hú]Ñ‹¶š•k÷©©Nû鿟ÉEÀ|d$¯ùwû¶ 4 rèþ…D7ØÍùse¯Ë*gPmòUîæ}×zÛ¯µ¸Ž%”qg~Ÿ¸óufôf"m ˆå ü%‹ÿâ?BLtÓ´®…Âù÷ ÁÃŽ´ªZE»’]öý™rnº„ãìXFÏÚ}7¨ö¿(Âøìp€‘U–#€É^£57XóÇócœë`e½ ì4¨Š¥›f}-õáÀ®U}1þ€f‚ÖÁ›¬AW}ÀB¦׫ŒøŽ\ÞƒVR›|"ã±}7Èä<åÜÈlÌËt L¬ÊÚÀ¨äKæ…'«Œô“ìüýd8D¶.dzD“-M¸äËA·RqUvNØ g¢WÍùµs¢ e<± »kºï!rgåîH¯¹êUjãL5ýÙX¿k$[¨…0Yܶã·Ù-ç=Xw¤ùùïÖ¶afùeè–sMZAcÅ^JékVèÐ%A«`¦¿j€—F/V2!¬s` רvb+Óࢂ,›$_ê¢gÒÑ*È(+»G»º:óù¤ k1WŸ°=²;$ŶD¬ó]àdÊó“ÉÝ!ÜF±t ™-ródÆÚö™ ñl‘ÍÓçÛ÷EFkNî9È£m±øi%ø·Ë7ôr•á±gÜå7 S55Æ>{]·5îÒqÍ—Â¥ ]‹±³‘zsãaË…‡~”âÓ·¼4ìõÏ6ìvkY7ð]ø9b ¤þlVY´lvê7¾ùdÁäRJ‹ƒn1ÝÎÆ}‰"`|…ñrÛ_‚Y õªt÷»7áKgù‰0Ýü@&Ê!™ŒÒ –²ÛKfJ,ÞN¿aD$¨0¥QîÖ6µñ»…Uÿå5˜uWàÂ7£´üd£è$ÚM*øê иÖlqŸ ¼5@ÛpTÖä—LÕ66TF¢¡on¸=9¿–úÁäÛÒÅ ”Ù5ÚöjñÎ@Î÷@ë¿vczöK÷4Y >µÈgìc<qRË´ ez`ĉz‚’Ô_Þ6 …@Mïˆv$ðÒ/÷‰cG_H4kb—eÁ–,¥2 —><#*{Ëä2”´2®¢fpA0|t®ØØyyj›Ki®Ÿ¦45’$-\t)¸~à2ê䃣·2à;mÍÒ½t†<ÏÝ3¡:‰þ[>:µjvG@#»Ø|/›=ÿ¾Ýåó6çönürœ'¨e0‘‚vG©>FB?4ÖO ªO£q|^v ž¨w¦*z…F¶3{bö¸.6FA$)üNž-êIÁÙ8Ä/‹ãòŠäVíð'•;·áF\TÃùpƒüð„I£Rºek”Ažq¸åâÄäó"œç¤t·.ÐTLìôQºŸ,æÓ%[¤Èš\(ÏçY5‘ƒÍG&ûÝ1¼ºošúK§\5ËbP½†ÃTK*”þ®V”Y˜º3‡’-«– e-¡  ‡ ¾SD²RC/‰‰êL“œ ‘TÑ/tD“&,[dŸJ üòJ?¨*Q¨Cš;£QI»F¥Zêþ Oë|À ÍÝjD œ\–§^)²ce—7µs”!]­ÙH¹²4°‚ Tˆ {ïw)R¨=Xx:„¼xh³Zý7:edù£r©Z«æÀ§‡Y“ðf‚ÚbÇ“6•ÂA™-?·êëe^RÈÓçûLu,ö›©c‡ О)oÐN*0<«EaÖãÞ!,çñ¨D+pÅ# [Þ1ìÌI'£¤>‡ P(ŽÃÚÛ5³üån“tf,©íi–r!˜>µëž«6£ð˜ÿ(²¯K·ežUÈpÇû0™-…J>u¯rLN"eà)²D«¹7ÊmËO_·nös,…{R¥jÇ¡÷ÂWÙkKbÿðDç¡I¥\æOévmoSfÆ}WÒ3aCŸ%ô<3SÅ–™MfL ÌÉC*^âLHëkΤ,Fª(°ãˆ4ÆÉû÷ÞªÖ•‹æ¦®z–=G36…´ˆ4­\ã;À·Qg,Õ®ˆÑ0¡š(›Æüø~ÞÐLÔ˜7iyR€…1ömEKåÁKiÇ Ûßsk—î&êÆ,(ÜM`Y`ìËU¥á¢ØiÝðìÝS30S²¹óðsS˜÷ÄO-é X÷İe9αÉpÒÝ¿r‡Îo|EÜõÏ+0´T¨t"ÊæÈçlýð!F %dÛx ½hXУ º"‘ÌHt|'Å­'$‰„®Ë‘¾< “|{;5-»ÒÕµ•ù Ÿ]½ý®¿|øÅZ)šä¼•5Ct¡Á0¸èþÓ¦…6.Dò9QÈæeà Z­ógjJ°64'z\fîó6òèºzl7„ÔÝP;üÅ¥–LjWlK„brµvm‘Ô‘¥ÁEp¨Ëgž p ;¿‹¤¾:ây½bx6÷ßVÖi ª«ÓtiY8žM_S^ì½ÑJf~ mˆÎA9¼Í?•£µUn#©4o$A1ÝfÐKÄX y›­ “65øèW ¯™ „ø›•ŽÒòV‘¼|üA6ãÁàÂV 0•éÖ ;TàÓûß¶u[óÛi÷Ù#ð[ÙUÕªeÍ+æå¹ãáo„ÞkÍÛc‡çÃó}!Á£“_ð ¾ ð]äÜÞgàINÚsìgûWH§Aj„ƒi­^Eý!ýäßJ Æ"ÚKóÉ€´jkþ[<]A­Öj_¸= 5gøA¦páPÍ« óÂò=çΤHV4Eh0KFŸú ¤Я!¦%»ÖãâÇKS­Í6`qUø:·Jq˜ŠE—"¯ã)vÆ"_Ô°fU¸ÄR^®ý&L´â^‡5(²³¨.>ÇÕ+3¶h‰òæþût;hæpË…â_ªþEÎzU—q^­r³?yÚ¥ê†Ñ/ñfÕ#ì”ö: OÆEÛÏǸÆ8‘uÞù¾¥G4+™; VYéaµùáxXážÁýþrô%¦`dát´“11 DCñ7ÍoQBÕ¡ª#ˆâ;SËÌ–?Z4Œ—?ùppmji·Ò2gÓÕÞ€)~º2÷oE/R ïÑý¦~FÛX‹‘Z€j€‡€Ž€³¿«œ³;v¼ÊŸ›Ù§5lxé‘û5n¤âäs¶PâΜ¼ñÓämPzQZpܲê…Ú9¦ õãlŸ+(#Ÿ¿ßÁÇæZ Œ/x´ÔaÓ£ô i-G¬~;…ý3¬ec¬ÙØ›nr½á‰ÎC‚usHÂñÔÖˆº²zË2xQ'wuË%#q€vaW¾¬Ç*]ÑóT†"¨éX ؼT¨ -ÝHA7º‚n¬þ­ŠœÜï¶Á‹Ÿ,Ÿ E›ô.ùјäÅÜ“ {õ3vsÝéÄJcâni’Íu¤@Ò±äQV꫎Z"à\ý8JO®•&~¸À.Á€„*¾u»K%™'QH3© v²hœú q°í‡e£¾¡–Z^‘j˜¼1Á¢i¤o“è Ï[‡<Ñìc¾ŠÃÉ;ؽì‰án%3,×J¼‡×7Ö™ù{’ìV5ts^蟂öØ+ý.¿ºcÔeûµ¨ii{־ν‹?s¬WþÇS¦;žÎ£J+zp”GÏ2šXOí"§Òh‡”L ÜAa?9U7„àC²¥!þŽó±9AØXrœü®žôèžÓWq=œº/¶ôp 9™<ü/›«‘uŠTO¼œ =¡s)Z_ZØ~ÇhÛ‹9#PdµV%fFþ´úõÈzË›àI¶:j=–ËwAõ‡çò•ìBót¶@|*ô2Çy/ئ¤Ýß:}u•kFáJ=õ†x%ß§„” ‹#9Ox.ÂD”ô!Ý%óP?Á zΈa`YâpA\¯ñ, ô¶zêjå—¦r·ìežÌ NÒvD¾òYÅ)¡Äžðø Œðþ`ëÒ•:Êø-Ê:c#©¯Y„Èw¾``jú 3­qôÐG Äaèè"*ùTª•…pÉqÚXj !6, ¤ç³«ÔGI¶iE#ò7µ|Ô‚Ý麋æSxuc$ìXqœ¦åi3)ÞòÒ±«›“q,%Œ…3ÔgC\»É:9¥ÓÁ—\vìÂΠJ݈mP{&‡7ý<î[÷‹õñ "OªŒœª;RJVGv*‹–¹7è êµ¼ÛQ_‹GG&z dC%t©å3K‡IÙÏN‡)OU¬î²+j°güpƒó˜G†¨gc!?°ÎÔo­VažÃFè¯ÔÓ‰—Z¦øœ‡Mñu']œAk–eår„ÿ`Øò²âM.m ðˆî ‚ÛÜ¥jàZ‰ƒVœ‚?Q ƒøÑ™¯k‘Ø%ëSG#vF¥j6û<݇×øL¤ÇÐ/`*â‘ãž5S„ ËÑG U2953ÚÌ4G…uŽu/&Pr0è­ªEf…¶ NÆ%G¤ï@õ$23)ìú“ëüÝÉQ¿4yŽ@—V`´P#‡¸y[°xSÖ­ñ®tFñ ŒhÀv»¸:° –»ÊZÏÉ'NÅÏáònUƒ;oÛÄEécYÑú‹¼û"!5Jô†dRm]œ“&ònÖ´—,¹h„Qß—ørÑEG€,‘ÿå hç±mÿzUÆó¬:Ü6/ÀL@þ›hý¶K¡ê !ø—Oq þÞ#z¢€É_|=¹wJåg¡pçŽÛÆo¹’øûð=#7uô–bî ½Âð pŒ¸“7°ëP‡ç’yÅáEµþ+>ª”x¹Õs®Oz×[¸î;ß$°³yPGLc“´\³”@6Ö>4¡Ûáuís”)]h™@ÒÚI¬õwÔ=™ˆ¥Þxµ.¬´0°ŽÁƒ 5ÑXߋǘÍRlk(IÉ‚÷y~NûŒçŽ» ÿóöû»'¦—Ò3~@¹ž‡‚ùnæßïÙ±^´ªêP‹ç¦ztŒ(6X#-ÚˆßñÛÂòæsy¿°c)ò:úú°Ûþ[þ’îŒbËÜñ§V?¥Êyl%§¶õë1<'³ŸÇžÅ“Îa'DË‘û®´¨±–\Wßù Ë ºTí ukÒ¶'tJºƒù4­ÞlÛ+cÕ7Ãͬqw'æªòLnvÆäñwâ~-6~¿þa®´Â]蹸bc×Ô]XމžŒ„¸Z5`£7“ÕNXØû”dé>4ÿúñÙ ït…ÎQ)œò†×Ctz³!š~5Øf5ÙGšA“Ðyã‡Y™º;,¥OO ¡Ó—p¡’"IÉø cn5x¯…ÈvÉîÑIÂÕ^Ý]:[Y±ŽOFÚÛ„¡Â*5&^6zØÛpÎÅÄ>–/š|ô.ÔÚȨÁw0/}h+ÐCÏþç‰õM¶mXú³a‡C•k?G)8 Y•|Áfˆåïƒ(]‚QøÊË£ST;ª†ÒÛ‰ ðyŸm}¥Ø¢ó<ì‹:…¯‡Ãèv°×ˆ“h»T J@$ãŒíÒI(άDz©3zÔÆƒ½M0ªxKVˆõ¬Wþäì)U×6òó@U”w…KÛ»e¼ú: Oëýþþ‹”\¡½ H¹¼Nªƒi‡aÐ ÜS†×~íËc”ÂdE?N‰xPÝVnáDµ²ÉbZêŒØb]—ÿ±™öüúy:/îÄ#9©WÌ)î¹ïÙK]û$h–}k¿U>,yHKø ›‘øOƒéï²ÿÞ²÷‹¯¼#Ô P$tß<Û= õÅUäšz?”–/Â.Ö¶~5`Îo·­_gŸ³\Ýÿ3ûpZ@¼X~kBš« î;Þ•/š§V_‹J|’8lµõúºV3»ç³+ç×ãE-¹1¨æÇ`>2äaʾªJεD¹Ôë¹~÷“ûAn¸‡¸~]Ç{&½]ß[?´{;÷€à ãÐóë=ò Ò³ÉÔç%×ß¶ÖÑ„ ëéòO í8×ÝrÎųæÖçœÎ >ÛKÙiú¡±6N‰ÃáóÐd…KϹ1̦Î[>ܾ5f m»2¸üe\ßI­Y§,ÿØýUXr«÷vˬqýW¶JÙqÄùe˜f™Åî†rÛsû}ãM}Ÿ-lXê#®."ÂZƒ°#”mýï¡WŒS´ðy>YtÁÚˆ½ADsêöìþï÷þ©ÏoOx!¶VBd”vKåJÛ7"6¦¦¼0NeН‘¤É¾×slT¡¹z :MrxÁÖ>%m“‘êŠXE•{Á„m’:¢P–¦ü ð\Ó5Ö¯÷âÖæ‰lcÉ—ü4œ´U–ånÿ4C–m5\®˜ðzÇsVYEGÑecË)Š66S=Ö–ƒÍ *5Fö$M€Y\Öq¥€,9ª’)B—€ŠÑܰÏF¯áe…J„YÆF³¾à¢Òȯz]Øõ7ÈÕ†èp½²ÐØdƒ ÓÐú¤—#F]R_ÑQ3M% ¬Y5aôÁ·ŽÑÖÈcKŽý2ò.±©5X=È9±y"ÐõŸw€µàÐU•vXøúwæI¡z¼MlJùj³éê|# qbv°KC}uQUoàÂYyßZn)Æf–¿ûoe^×6.‚®Úùn#LŽÒ'[Y…½N=&[_1X"ÄÌ7¼É! é8#•º^æ¡“gÉšþ&oðÛ¢ÿÝìuKzô×mÕ…/–@›b”fehÍVì'¯·Šãž^ÞuâÄyŽ¥_– ûø<ÍÆ°Ha>Tg°Ïô·võ/:¡úõÁ$tÞ¢*NBÿ’‘gÊl»h@c:+`ùýÐ:§N«¨ûV;f‚ì)pf[F) Ò@Û¶ PiYõÛ„Ç "ilj„MV¤XÔê_èf6ªùšfŠ2¼Œ5ï7Ò~Ëõ‘¡¨2ˌɇÏN ›^ ¼óâÈaMàÞÚ\)¼È¯§NÞ´J‡z`8\­ÁÑëü‚ˆ®Â²#íPv ­‰`F|µÁr#¨.Zÿ%Wt{%×'À•Äpd¨˜Z1!›+~Èä=ªw$  r*I9Z bl4,Æ)ÄŽÑîU>^9h˜0tQáß¹0È^™~‚{¬é÷‡<†hñù/„Ãío\èB8;é °ò<Ë3\—.á+Šæ|5(2ø¤ÐfÞ_jèsØ?°Ÿ j0¿_ñ–À\HH;Ý't ŽÎpñ@8UPyïfFl‰R#3 {v)^ìü‰£½VÊóTÂt7A“—ö†Áe2ÒUXyl–‚’ïAê¸ØIô¡qZkýËe Ô¬…'á*›ávì Ѧ¦°ƒRŠ˜MªgòÖÀ{‡ÚûTý‘ŒÊ¤4L¿l¿C»Íù¿eË—½éö×dl[ìÞ¢TxŸùÚæ¦üŸžJõ»—J’"ª ,ôi÷!ë¹OT2}ÿöžIôµL]DE\ŽàÒCNë'‘ YiÈk9vòòˆ²É ™™O(A¹½H‰à‚ªÉ/|#˜É¯“80‹‘EȈe&"2Õ/d&•‡-øÜ×¾pB(‰}¡@èËFº[@/ ã¶ŸÿW¸fѼÀ˜=¯>YVï•}t_˜°Êð;0\‡áÅÂ^’[Ÿfv}ȪFjQ4tUÀžÿ4Zú@Æ*6ìn6ƒýuO®)»&ž#ã’Œ–+":ì!»#oÏ!±†·‹€yø9Ÿ œ‚žŽ”b3´»í};Þ¥Ë9wVvÊ©fx#È5ØVµu£!40 p=oç¹3 ŸV<1Â¥©N-÷Õ6So'¾äöOåÏU[ÜZÑ€EÝOY‘”ÂD>þ•s&CXtJÌs‚WŠ3ŠF-Ãã5Ý/Þ½ÑsM³õÓH¡ëKuÈÄ âA {w!» •TD&R·3&î̼쌣J“d'TòR’Qnbrï »?!|ÅÙ\ûžL¯KÊ\¤JF4éãbUäLj[’µÓc 7tŒY.¥ô ˜—G(Æ]‚„œŠ¦›Bž7ÔR6Þ:¨†¯ÜTŒ?¬žÏ‘Ä[¸ŠMRUkßNƒ8À[RVýµâA€™²DüØ.BhàŠÊ¦¡þîߕҰY+Å·WPè¨ Ž6_{ë9‘Èê_ôÑ4 `)(,+dýiÎ<ŸdTQ狨½jEUœ¾»’)–Ú;ÐdþÎŽŽïcõSâ´ ðÞPƒîë'´TáÑ$ŸÍ !Ž ²;Œóv¿€îïiëûït½€žÿh‰üÎÕ%›îb¸à^zÀµNg”—;×Óqô£ÄaÎ#Ì|hZÌËp¤Jt®}ËÇÿ)I¼h$F‡Æ ÑÑ!Òû75Oé)6:f2Îï÷•ϪÜÔ&ÀŽûߨ!ÎÒ²Õ€}ŸÞm ‚ÙæWÓ»#ƒ0íç+g ÝÓŒZý¦––ÎeÑ’LP Ó‚~|Nj§èw‚UÖgn #Ô£BÜbæë'¼¢óè4ñ!°éT¡ÁUþ±d#€Ø²æ.¬3“Ž »ñs¸æXS]zbT]Ì£ •bCQa<“˜GKoœ¸©‹‘ãEÞ&fAVæs–'Y%×(@.[€;zÕŸ L[ÄJÑPwå°€¯ÁöÛX§\‰;—9J€~ºÑý¾ñoþ÷«ýàÙÒë(75Ãú$`™I$“ÁÔÑ¢9ÊÆù7¯Ü/)&ràY–-ºW¼ keu ö]dx²Áé,Š ò-(­‘=>€-þ0:4üÈIŽxX,7—ý;/õÀ“Ô»B"îyŒ±ëvý÷·—ПjŽ ÙÍ놋+ )7ŠŠXïRewVw©À_²h¦š,ÑWVö®ŸbÈ­æð,V÷[‹C÷©¬çR]ƒ´šwÝÕ³(Œld¦óÀhpô[zÕ" ˜%5êPÿHÂÈà ©U‘÷_–§,8Q«#²¹ººUoä®?B»à0Ö@ ÊÕï)ä± 8×ÿÿ£dUvL^øÑÑää—T;eÌ ž&f­hÚi¢ræÿ“XJ"Òà#ñð6ï‚ê»û%û)зbIlh8êÃëE œb‘ žȯ_&¾''˼)%î ½½“%D¦„y6òÌ­¬¹ºÕ‹¥ž«0ü]›qêyO¼áà?øjïêxDøæ’ɲ§A̞ƃŒP'P®AüóÉ‹®§ô/GlS¤uZb½E mî{Tù¹j°O‡9>r¿mÌGkKHò¡åg ÿÕÒK2¤Uë{,îkÑ9i¡x¾Ú$ÊÂsͬxü×Q?rN¢ùlo÷U¢(L£Î× „ãóo$2±×"Aÿt7ÙtV Žù0pâžq_ Þù Øs‰ÜÛ‰ÜG»æ9æF[÷ÞÕþv4ê”x… ¿M[WÇ3_‚ï¬Ï (œ˜Z-<š†µ«Ð¤½éPd»'ý³Œ&ÙŸ½­%hÚ|J'7¡uÌz”¤o}˜ž—ê^Û”YiÖìîš|Ñ\áÐ|·%,¨UÄ_d/ÍN‚KéŠRq ݈fÞ;,ESyä°*»Iõ¹39^(ÁúÆ¡Ç"q Í÷Ð’{GVŒÎb¹ü‡6~C©²ã[âãžKóà*¥A@«Z¥)ãt›eb–;Ç_q™¿.ê奫º˜ûZ¹ÁüètH­ê#`í^(„“e¢ßÚŠÏâu‹þÓ.xÌýnNü*yÖú\Žàb°Qümé›q” Æ#nÏžH4ÉÞBñÂш]'$‹åÖ²o"î£d–[\3-”+ÍòGc1>`åܯ­Òþ޲ɴZ($—E5–Æ¢/3ßû`BꀴoÁ(esÍ8oºì-“Äbš£ÜPbï{p„QR »›ÀV±žpQh3’G|%)ÉÅ?†ÑD=ÏÞ:pÄ£+ól,G}@Ë+ϹZ‚$ßl ’‚zp–¦ûÚûYËê!´E’UsÏ/Y»¶ùu<•›P´›–Ã~*,˺¤F‰Nk^7ùáÍ1ÉX<„¶gÞüG“[¼3ê¹Ä›Zx`´‹®—·áËÌílÚœÊ8‹1žçŠ)«â°‰¡±ÿ½2¿ªUˆ]‰d °™ô‡£?e’Ý2Í;e?ÅËP:‰ˆýbq©*@§ñPrè>·í±ýŒ‹½z ð‚ØQDŠaäu‘HÖ}‚X¾ïDÇÔ6-Ws•,Äsi¿ï®ÄÆE•AÄUê+Íèv ¸„r´³‡”¨)&°Uì'ßâ‘qàÚˆ¢ OØ9¤Ž[…t«6}5IsŸW¼á q´ëÑW%å4òµ°õgþS ¡©ŒcV«0sØÉ41ªW½œmïü@N¾ÜײƸ_°òïÌA-k›ÝGmáãEæ;ÞÂ:5™6¡¾ºìQ£L/7"Û2ÄÔ­Ú8nyŠH¥þ&L-Õ«G’w¿šö’U² Zl˜k¹‹›q0ç·TÌþÎãÊ<Ëg.ˆÃ:‹ßœ¨+>”v|‹l¾?½¶¢@ ø0æ0 þ¬Éǯ}¢¤ä&Ê;9ÿX…{ßYöWè=©ïâ}ý}5>-ýj×ïù›&ÛjPº ˜3;=ñ9å)V»pœáÚ@e±”úDŒRÅ›4¿ØJØg¹¾O¹.YÿÒ‹çC›%y–â·×¿D>ÌüSÍiŠs”åºb°n—Q¶WÒ­3})*M »»h@ž^­´ÊôouX\¨ÕÕ³ï0ÿ-U†.Ç‘ýásÆ)Z! šs¹¦"Â-Ëz>éÅl-u¤v†ä± KhºÊ©‹¤(eÚ\âçu™TQnõâ_Ú2ÌÁ OàÊ?襊WÁdvŒÑ3¿ÐxeA!»Ñr²zÉ2‰æìÜ…þÅ3q/ùš–LÐ_梗9¨•¿é”Û¨7¹©Œ’­Ûø+(3Ï‚Âôu¯é k÷²*#>³vq~Lçܳw¹³hº¨1´=÷„ØßœX´‹ÕŒ˜Ô›çÙËÕ6üŠ ¦ZŒ%þ›”„Ð¥‘êêžu+›üÑjóh¨`•€‚dÍ´w>^Ѿüˆ\TaôlëG Pð•÷9jœôü¯,eI!x›3z "Ÿ7Äaå6}\“Ï.JÌú2X®ý¼Fž%ÂÒô‚”Úžöý#GÕš=⊠FD0è¤hòU½ó•…8PäØ˜~µp CWzrý3UH¾ýF ê’å– «ä˜^ Z2~Ñ^•ú¡¨(èï·QŠÏ´â ÆÇkŠ(b¾9þÄüMF"¡çœ\ç×øó¶u¿²­ä.ñQž+˜›Â¦¬Š4½¿„ÍÝáŸ4hÿ0èŒX”‡o¹‡jcRq’LçP[Sf'¤zÊíOv®beSÂF¤¯è$vGˆ ÈÖrm$9êÙÿÞ»-Í3 «ƒ<‹˜°¤T×àŒ°Ý>؈Ç)rÓ([«ÿë†ç0Ør¦~Y IÔ’´mõP^bôtgs\àeýÉpGrrÄìÐY´®våSTKïWhL|©>ú-KͬÛós$!‘h¶Ûh2v¦Ã-w®e5 S#ßTÝá3$³I•›aÞIǵN|±ºö¼±‹¶”ºãëp¿t2¿Ë]ÚÃádnƒË2é½ë°NÓ“k…š÷ºI‘4Õ¹ºØÛrZ²#/MƒàëÊŸ0b3:©GDò`hŽf"–îQA2Kt×Í„"îêb‰ß³‘|ýWFzwFí{ä4" 7Ä•¾ž™À•‰¬JH‹¹Vµ÷;Ë⊥„Õ} Y…ûc‚F~O¥vÀ9ˆtîûAè. ?9¦º¨IA§cÉÄ#À»'\;(ô<ÿíÎK’÷[rº4àúG1º{ú&£x¼„!I‘í¨©#‰õO±7L\ ©²³Hõšß—Ck'ü´ÍhC»ù°ôý†CgéäŸ Bq¥—zgó‹d¡ R‹K€Ô«–#Ú¦R ²<®9%Æ‚RÇÚkÂçƒ]%xaâ+c^´ õpå€çË¥d¸r–dÀ±ø"30tÍçÀr)اe=B¯À#@À2¬u»Š¬Ö:q|‹áO¶¬\ÖñfЭyêž¹A™ÄØ?º/¢(?²Cì|&úì+¿¿yô.¿ˆöéßê=0~5¨gWéÜÕáô$Œ%ñ'@±aùàå§À½­egÂY%Ã2‰¾¨¸V€³)|B^ö¦R{§¢ü¤ý ñq›¯ìÖæ¢3aB4ÿÇžsÌf_áëû __C·z¶M2‰#é€Ñ‡Žc¡Æq ù5h[ÇãS¨ÎCtZ"Ì•Y2<®:›ú&5ÝPÙXùÎYÌTNÛ?‚;KŒ±ü Ù ë*ìa›ü1Ÿy«J"‰Øãï²TÊ·­ÛPŸ…çö ’dÈ“^eÍnÈŒx»ø´¯‘HNÎ-!éËzôÄkÆM—&RÄÆ€èFŒo hçIE ¨Ò±*8‡—îÓ l¨B JÝIw68ÊJØb€š÷|ú]£ÌóFI)ËÜML¨Ôpq×<»J¤ÒåZË%‚r S2o„ƒFÉÅ}ß/%,"ðÙFH³iA¿çj3ž=Øøî3‰ûtk·Æ0>ãÜÞ­*¹Â¦I ùD9WZè*a¤rx@ZëÿZ©ìo®б­¥©Ú7˜·ËÉÝ6{ˆNór /¼)ˆ¬¸Ì•Ƕu14äncÜ×vRúÖÛŸG98dmüÑÍ€IãE¡9P+:ÈB]ŠŽï&÷-^ä¾gHî•\mÔŠZ<öÚ‚|vÂ;õß0 Hb¥6­Ò“0~+É Rõ•Ûå¶‘=¡&Iâ6½Ãë‡0`Ûemßàh™„ 'ÍEÑ™æDV–Ôý¸´œŠ°”&—¶¼Ð÷ˆÃ$'ÎROO'eÄÁV¸C2ÑhŽeL”9’²zbñýÞZ”¬ôôòït\·‹ƒsðV˜›q×b?ºcý`áÎ)Ð…ûøTeÏ–zbM´™@C9¸ 0S'6*q(†O [CÙ‚kDý“#½ È>9,?¬ïÈ$4«eì+G¿ßO—Ûp¼Ž {—[íú×—¡ ûD3Ø,€±eƒ Ä,þŸ–¹äË÷Ÿ|€‘û Ô:®!ÏM»ô¿RÔ(jZîÞ9N+–¥øÅúœ­)8ÈKwI8êQ-a“èžPù#¡q£xØ2AÚK“!ËúÇ%Ž^S‰%®lXü¾…û¡Ðþô¶Þ2ÇWRÄQ¸…71ù•ý F ,ü\¼‡K\ÙG °ëâíˆn7w6—3!$Ãeoy¶bgC>a ¯‰0=D4l®Fð€höW±+¨ÕÝ‹ªeof ²¿ˆ /žf€ð(ŸØÍ–¶ÄTþ^á¤B©´a ›¾›ÒÓ»Vß>†hÏ*r…æX9¨é¨øëÞ·’ÉÞ÷P‰©&…ÜtˆÚøläy¦1/ÎØfOŽHn Èï۹̳Úc‚ÒlÚוu͹õ~·ß“kÿªd»©|œT©Á#¶MÆRP“ÏmU¤2:Ÿ ¾Ð†ØÂúèÆLô»È˜ÀFüDSy¦ó’ÕcÖQ×3VGß2 ÏóA^ æbñÒàBº4‚„­Ck@_)Ò+äKlÞôiê*Õ‡[Õ¯ö<¹ÊCíª3!u¿Ë£2·”mН¾gc‰ÿGöÊÿ ®Ï^I|â ±­5P˜¡ÞoO™tò؇mÀmòü(+L ÛQ‹W.™äL´èÓÔRDÓ­AtJ6?»³îöX5AC]„î®Y½Þjcf oŸŸ_D:ahâ•YŒÛ·V¨¸±sÀ®šH–,+wéÝ-å@!Ûy‘Kºün(iÕÏŸ'F*Ðæ åÌi6åÔ¯¼]b²3¿…Ð8¸½muÓåZà·/L¢¹g~a6äÔ·ÈY¡¨B¡¼=6šœHsr#ß6^nY¸±˜s}K!KDN3+é?}J•;Xýr²g-åzÏ‹\¶p™ ³+wbYC—žÄΩ 9oˆÊÒ;±óóžÅ@¹wÊüܾåâïé›âhÿC) ñ¿Y„¤æ+úEî(í= `A$ä¡ë  FÁÉ€r‘}z1Up‘ŒxÄŸ@0¯b¼«qèÒóÖu¢ë‰µ£J/%ߪ-ÄD½òÎÛ±D¸Ü,v]ò.VXJØOH(a{G½Ž×Ü®QÈ—‹R/L%[Ô£\†K³P‘J}ÁÇ ?n©~¿+4•R—={|ò¬Ó†Û2ÉBôˆ¤(^ èz¨¥Li‰}D3Ë 9ýC(43­Cè?ߨ…âkh÷rêÝx‚ÁvÐ:þc»×ª¥Äå ùP!ìíaŠÖçħ²ÒUß:VŸ·;‰Jìù.êTÁ{wluI*" PšQõ.ð–ÿIT&;Txùÿ=CÔÎH%æd$©Ù^Ë7ùÅâ°n/íPù8Í“eo.L³¿Õ*jG’h>A¼@RHi êØ˜#„fQ-K t¬ØrñQ3¿¿ŠÊàâJ%m~W—OíÛ¶,65Aé„+9¸=3HÝã•Åòv )¹4ÉáŒúúVR€ÓšÄOuÁL)S×\ýª5Ùè”&ÛldxiäH!€'^bw§ö¥·Õúf%„?Ÿ´AÁß-æþyt¸H™ÇFôt…Œ”x÷ÌG©~⪊(Îb鹨7Rt'Yø' 9ò %Le[a)ªÛˆ–ų¦o¨ p?QÅhÛ÷õ³à ñ$Yž~IOÍD¦ó†9ê®Í޾ @9¹«¨ ôZ›€¨ÿ6'¡ÀÏLûÊv(»H‡Ž„@œÄÒ*0U®¯·òM eø†=NM!nÛmÁÂ8ÓvÞ׊Õ\ôXüò;ï2K÷ÆœêâDÅs[ Ñù|ÌN~á]‘?F—»‡Û n¾L¼Ü‹:°‰yvéšl(%b¯h…îÐ*©“*ðpK5K`Ó“3!VÔrNNolR–&Å3‚”á[Ü7Ì–G°8Vÿ´2̶S@»Ð~ñdH˜îb½&u3›ýn—ñ„£ü¡ŽqMºà‰ÇfHD`Í}vËF™Óê îú¬§²)4 lÿ(œg‘—ƒ,ʺuÉ0Û@&–ºˆ(šk=+KG+?¦;if—g6ŒmË%,ÚQ;εpÛd׉Îë@ÞÎp~$Oçú’~’uï$‘³ž?Š;“ÝïÎŒZÚA\K¥cÔ_2K0Ù“åξagòÚâºåZíüTW|úÛCýV˜€RˆEË!¹Óy¹ŒiQ•ºœü1‚ÝÛ×8…é‹$_’ rbj>¢Üÿ¶DŽMLÈ»’ªh¨ÛŸ8³Ý¥ÁJ†˜SÕ!(J.Š(Y—.îO®v•…¨Y8 3BnL¬`îØMÖM®÷Q‡jŽ@'ü¤~© úhQƒo1åh—Ž÷—#)“éÊ¡ÑÉ™{ å¥ê“åž ÆHÑyžïGA’ö€ÆþUÇ ÙèÔäÅ6%<iìᮀ¯fq^Ý’ôuÛ衼 Uÿž„_(6º±Ò¯n¹~HB’“Pñp+óó@>/’¡êÓs£RS³®ëYéx@=w-±´£ ôn„rõ«zz‚ó©ZOR0yí@ŸSÍÈÎÈá±×yòhr¶”ë¤`H¤8œ””Š|ÿÃ&£þãˆ$>„Ǥ‘†¡"wI@w‡óòOS¤¶÷‰H»èzbQ …†¾’¥•—JÁêǰ(O¥lN:]e †Z &ƒ zgå?£@÷ÔК(eWœ(ÓV“›PëÆ#¼; ™ßP7€µŽÎÔ¢ÿádí Žþ_¶Hˆ²1/ÇŒm‹ÐGé˜Dã-ó*ÇfH\¹5|E$L•CQPùVUqdÎ:_4%k÷Íày<*ãÃǧ3IQÖ‹I𜦪 «Þ³øÚ¥3ñÉÅuŠK,›Æù„±fÉ`v`DAaµw$8QÁ«Øg°þâŒ%%?&®¤$´ ïÆ„_-gÇ>ãÏÕ‘´§iî Åd‡9’žÌ,*XÝ.=,Õ%<½ Çx—í“*j‹O¡??|çêà ÆºŠôø‘® qëÛ5ÕýÊÒkó÷Q›œé©Û5cqsx¾Vœ={ŸÇ%AÙ¢3jñ·.-WÝ\6àù¿Nè$bŠvh©§šJ.P¸T¯„¬—ÞlJr¼Î¹?ÉòÿÅ!ÝìY7}o©!“ä’&;}®ZŒÿœå€î?§E…#à I V¦T+Á9B¦ª";ntÄ£ ´¥ †^ƒ&XéŽW‚ÑxTYa~82Ëpâ­M¡Aå…4ciˆæÙ…šaá–Ôç£oÚ8²GZÄf‘Â4Òê…D?29ZåöGýOYåî_‘ouåkÒ盇½Ÿ=\`UeŒ3…¸9Ç¡4‹Ñ_q|UÈØ¾_Š$¡úÍî(ôŠ¿©ßÁ7\¦ÒòÌÛuѪþ˜ƒý?qÄÔ¶Q‹ù8åÝFoV±5Ɇ¨ßt@jlq¿!ž’£’‹Fœ™Y\e¹M´{éŠ7ER²M3 ¾¸VTƒ:õ“´H*岆Wg ÇþY5Š‘¡œzØaY· =¶ï 0K¥Ñ¦ŸÂŠz5, í¶@€kà¢ÈÈÎr¯À§]dpqM¹Û•´aÏ¥³œnÀœéaÆ ž¡"¯)q<ˆ^Gã¢Ð™9Pƒ“ã¢uRQ0>kOZƒèÑ¢ð‡JþTÇÓhqIFg¥¿ÐGÈ‘ð…z¬ùuœ8L¬ApAÝ«NpQ ´$,³ûé“›²4)CÝkðet¬˜#‘I2- jè•Y”ßbQ À¼žKà)7 ÃN˜PL6¦š² Ш”ì(ò„!wQT&¼x—Ä.¿š²—&³AY—`PÐÓtXµh Xý@ÈèǪ̘ª Ž½ ³Èœ®Rý l¬B $|ûæ’ÛNš˜!!Fã’‡úÏDŽÕ§Fªƒ˜ÂÏ}˜A¯›ýr””bC¬1Éd¢ò€ÙLJ}, @äšW%z/ÞׯÑ:=i(Ëõ,Û%ïÓÅx(E÷¢‚—Žø|BQ¡vý{·;oXX\Š´àEçhé!¸¨ÐèŸCá¡]w,¥°jÚ\ŽìP„‘"ºÿ¾›ÈR¬Nkv„##.”€0ÛÐSܬæ5¾²M–Ï• ÒDÚüÅÎ…ð»Âa2LÍ´Ÿ—ü*Vþ[åÆtÔ¼¶ä='´Ï˜%¨¬H= h€I—\(‹DÓµtè«´OÑýULt6ÐCËÅ‹Rþñ6r!cÚ3`Ç&gÿŠªÈ;cjÇè—Í×{8Óåd­v“ÜxAäÞXEåüßs†Eñ}r˜ÚûÒ‹¦‰F¬(Z‘Ä»SN$¯ešFÄÆ.;ø8°Ú"| `ötTy#¤a¹]& ðÞ¥ lXŠ ìú… §þ-Þ¯Š`Çö õ‹³y½ÄR-Ô„Imz¥ï´öš>z!/µ—š“˜_Ò‰½¦š!yÔ*zo¬b'äÀáRxê=™Ö)ôBéÍUuuá{a]‹b;FG®´ƒÛTMèß-LZ‰š!PÄ›â)I൛Žõ»•ÞAÃmò…ùw·ý1nžáä8bxµ™Úr/¥ðAñò5©Ñ€Ç÷5u`‘˜kÐS -Pó¢ ¯þd¿¡ÍaûÛdSµ]‹íB•@5 HüE‡>ÞoàŒá\ž„ª†Éû6)£Jg6GÌæ§®b0Æ…ßÚçŸ>¬kÀsòÂMç2bʼn%-¶Ì™³ž˜òÌ’üŽDŽëZÔH\>ØuÏÃMˆP‘Á%XÍÈ'©gð˜!Ë/ñÏ[húÄüõèy›B9ï×]‚-ËÖ¿},]0úQ2SEަё­:íZř귿LŸ‘3û¡ô…%ýíæ7ö#EhO±´‚·væà…%-C¼_âš_qŒ˜WŠ¢H)’wšV+ãh}œ¢=¡ƒUñOø1‹;MÅ0úTÍÞ«Ã’!ÖÊ8"ò»\Eè]©€âñó”YÖNVhÀZÅþ´§³"îÂÊ¢m2«/¿r„…Ç¡«°é»ßj~¾Š½N±ïGm‹ß±ËßWQ_qŸ°UÈáïç$¤œÛ`Ïo)dÙ³¨—À¾ÂmÑ1Þ<‰,Á§–{fa|êc»Ý^©7gÐ]-ô`¥Êžå(m© _°¨fô£è—1¨ Ï :ÊÊdeì)7H)Z›ä·X¢å]á$ü壉.Aœê —sÄ*Á“µ¼2 vùc³7J\…£mž&÷9ÛÆgÞSÊ’š§É3DuÊí~ŒqÜZéÈNe~Ì¢“cß·÷ð‰¾ˆûó¨CgWö8úGIyÉv÷’`å“㣵û“® W¨] ÚÝöH;ø*þTÞê|9¾ëäúü'Õ?íkÒÊ›‘ÕÕža©jƒ‘¥Œñô—eÈ÷½ê×%'¡¨­éùH³£H¨VÃáÜ’áÆN9«r«~D¡NÍZ=¿wñNņ.¤ålúqŒ"­ß–Ìíg%UìÌÿšVMù”åÛˆ 9i?ò‘ž‘×^-š¯ad|ÿì?ë@°7½‰•IfîçSÇn†n;ï~Ý_}_ðuZ¾2;þ+V9#_†p?hܽæj:.P6)ÐÉœÉçÕ3÷äìZ xB* ÏÉÕ->"‘÷é5È”&Öfbd†”™3' áMãUÈoGoü±øÓ#²ø’²í¦à¯ëÄóêËPU]q`N¿ªwr¦®÷|,i‰ÕÚ/ß’’[‡} lxÂ)-á(‘y Cî$0°ä´j2mwàgÐùr›67¸°zñÉW›òe­SôæÓô?Ï>½}q.#Õ©š†³ íyƒbþϰAÑ¥6múbÍͧq‚_6×@,Ñ¿ª˜Ääš™S}õÒ°lÐMC*„ÇÑuðÉZ_ö6ÆhÂAã+Å®„{‘ÌîÞ3ߟ]4. 't¡|êÁ›&JZÊ>WA$߆á½~•Ý~ÔD?û‡ÜI]X6°'R5>áÒdK6Šàš¡ŽI\EB*s*Ž­¹0µAKìòü¨&NšêMf`Õ)%Khñ=ãû~B3ʵÑÚüm%ñ'Kª®‘+ÆlÍÄE+ËŒŠóW–žï"UYþ`$û …@Ý"X"u%Mª¤÷&äaèfoÜ/b`ÔF³™¤¬J†ÇŠCÁÆ“XŽzxN×ßÕó%N#¸d¡ý£!UÙ›'¥hÈ)ÒPTUì[ƒPÛAª½ùméTS¥÷k·G(Â÷;ïC\¬†ëjrpí[ÇØ*ôã³Úœíäÿr4´ðˆ²¸JüÌùfô\rñ®vñ¹U¨çUj)«—ŒH³Á?l} v&-£b¬@ÕÞÇèž^wryÁšlñvMÓGÂ1DF"pcœI78è#¨„:ú°g‚Ù×É0AÔUet &v8”˜±Z>„l{osÜ«2ˆ}*)ÊïâS€Qñž¥Y¦QR:ºÂßTz­.’eÒúÇ’ ÔD‚áVQŒþ«ýç•4Èb““2pÛ­A½Í½îÕ®`£2ʧf¥€3œ6‘¤ZjŸúõû}âï¶ö„Z¶^AB56@ˈkùAÕòF/fz‰¨t†ÓFf9H`#¨×0j6)—… ðŽP®»Qz™ ò¼òFçØ¨ÕòuWÀ--xQX`kÊ9d°”H‚ü…p䆨}ì²tÿc%B€$#8I!ïØ¦·B“þ8µ£¸´P”ÈÂÏÃkaa(PÕ?œÈÐoÚÓ¸¡²‚3Xåõ%d°ÀŸ9¯”»²Iàò{BE„x€VÕ«Þ}­´V­žV;õ® +PŸ?zÈ.õå?¿à’é2³ÓÙœ–4•¢ÿÄ¡òŸ Hßb+¯Ï‹žæ›]Š "¸“¥/<+pdê(=ëtgåýHŸuyBf‘ѸЧpðM1¯b ëèæ°9—þus·ÆqåUˆ$¶éür÷qž¶‡>åMšvGT·o¬åû›cA¨Î¾ŒFÑà¾*:m<6'Ä®&®{€Áœ®[2¹4Þ§2ï]†ë¨ßu3áTµÃèvE«ºÔ}óO"äZµ¿2–ÓæõßÕîÞ3 þ‹’Lƒ¡pdK曞n¸Œ ¾ÅDVÏ-õN~nœZ“'…öÂ-´–7vÚoÝåÐMÁ³‹Yùs­ n¸Îñ“|ÙïïÝ1‡ýñ±ôÐÁ J“3 ŽãÆÚT˜|ÿÎe6&¾ig^à§…uüã!‚ÉQq¨÷zã~È)9\ÎVñÇBV8ý’~ Æ{ºÃ ú‚Äe 8"/0¼uìМZOåª)Ÿ]dfK:ßιÌ<Ò}'Ažc©OíZOÞ‰Å|²` w(>éÈ Šã£\·37 6wžßX´‚ºÉ»Œõd/¢Ÿ÷Ëâi ¬Û ¸–ãèŒ >©Îb¼öí ¾ix^Ù2O ó­opéFz†ëßo†vÛà>b2T—ƒã±uá¡ÉSè_b1µL(̯¼øŠ«®—]u2º¾„*™ ÒCAl®‚úZÏ­y™‹@p‰‡ˆ¡º!yÉ0¶_ÊâÈêîÁ¯ÃŸb¥HáUøØ/R` I²ƒÔƒxð`¤Dº¾“ˆ‚@1†ò¢F´ ›.jÃðÅ^íCÜ}?,ËJOXš„sl&Ú… ?ôÐ~O‡"êì£8r|m,çà’ìŒh ÃOø÷Oz¨mŒf3!ÕäüpOà<ÜŸ‘rqtëŒ毜Á†«E/pm>T4ær܃@ðÉŸ[qÄ$ÀöâÍ |Põ¸w –VÝÏË 0E³¥.:ÃP÷¸ßʨS¾I4v“Ò¥D µˆuÙ"­Šë,û2Òù*/ÜùöÅJ` ¿¼7 YöèCP®†Ñퟧ'ʇ­ìÃlDˆ€q`ÁVmæ}î7õZŒµ•zuö7As“áU»1 âAúàǼì,~(Õ¿„1›Àr°fÄ àåÀÛ6“°¡t_7Ñï0<œÞä®°˜?Ÿ`Æ{ò‹Ôl‘Þ‹{eüÖœô.ƒý:¿QÃL²]µ‚ÚDQþ™RX!Ú7îÙ¨«í²åð¬nΈ‚öo{3Yß‘^¦ r²2 ›A†~ŸäW˜úR _š .¾x[ݨ1 ¦Ê ΪJ++\·Vo DV%E  z0èG©uæù»6çNÀå7eüfáÓC%!ÈbñÎgï©©­ˆ¥ªñ´b}´{Œk°žp¾×ÂÄ~k3ؘ69Ð(iQ~C%¯«~Ww Ôž|)2؇§.×0¸20ºë|6øg¼Y¾²Ò_iÉÒç.¯7E˜ÌB®ðÔƒdŒ ä3·àšöðr6˜L£¨‹"È>ÊŸNÙ4™354#ÏR¸¶c}¢csôÃa*‡%ˆ8WØWpÏ'Sbøª&0Ñ›Àý È»õA„|]?‚z8„ÐJfAw,hÒ{k>&Bÿ]ÂvÅ7æ H!Ž}BåõêœÆ ºJ¯]̬K ‡@¦>P iÁ=•^KZX„â3<7£·ˆ…EB…§ ÂUc0ˆg‡¿ëp™õ¢²0¥‰%€Y“P^b츢!Ü7ÁºŸ£±}zN0&„Å4<`±!Í”±î}ºËXçú’­á ‡æXBsn–î,²ÒŒÔ­àsÇhç‚c’¥þ–=ñ…ùq§ž}-Êà›”€ï-¶UʽDnŽçÎQLã@ê±ß‰`ÏXÆ´Suæ±Y¶¼$‚qÿc?áv©Y:õðuþ „YJõ-€k#¿LŽŸ2Ÿõ0$¢×´„ÙŠw^|².,X@œ@$b·WÆÙŠa¾þX›ÌxºjXA¾2bõŠ. ª,…%õÆ©`Eø~\ÍC9bÇmðºOo«? $¥ãÁèølÏBdÏgBÈìƒ!ÇÖd‘·²®*‰FŸ¹ ÷áêÐ:W<,´W:¥ÑŸ’wiÌ·ÆA6Í)ùË={•fÍk‰Moh–?±?»ý-¿fõ ·ÃN¤ ßÜ~žq`Ãæ !—t BHHa뜲¯›6•Ô˜¤[½²¯ìúÝ4i4*-Öw;¡ ò«)&‘nzê …ðRŒ9TϤmˆÙŨcQŠ–DÑVZõüî]êåGAî…òQkó(¥ÚP«8—[@.LEî«Ä—/;…Á1ÔZu40Çwx¹‚N¤Ôq„ e¡Š+e:%pC»zº­(zªCPEÖJ疇ЧJ®·¸×¸#¿Ú¨@ªÄ¿C%ë²=úÕlv;›@\ÍWÙÏÏ‹@jßãôöŽ›:x;9¶ ñ’©_ìÉ’@äø„™ÆJhvBV7×±q`*¤Al‚aÑBƒÙîKèf½SelÉ›Ðùê³ëWÞÂ2ฌ˜+±Ÿõ¬Ù¾06Mv[.iN1æð^¤òqRÁƒ÷©Ô|Õo’ë¾ÅÜ9G¸Éj ¦ @ìç`ÃVºNºK „¬¿ üM¼UÅ}h9O úž(¼Ý^V)ÙˆÊ6ôG%Ø·1”Åi¥‰2,Ù~[«ð›;;(¯Úh–ŸNt:¤v‰N”~ƱÕZ)]! RêùñÅgjjÝ7÷F娉ζnò–€ÑF†ÿ.Jy|Þ²ðA±*-&ظ"Öïâÿô÷¯1~èî¬ggÜ]Ö¯ÔËÿšs¤'ìª1h˜LcùYû@Vý€øüéßííÝ?âîÅò]¯Ù Ì£õú\rº?€ ú¢ê Ûèu& E±p+Ùëlϵ—~·4§ëøô‚•û ¼ƒ0OC¨’/Ø";ëå×Ú´†q`-Iñr· ÞX¬ÑåJüîú½^N—×(·‡<­÷)Ëý ¬;&ÇÝbE‡¥A2vkåõ‹÷B7… Ì*Y¥Áœ–A š])Ëx)²í²j%+¼õÀš—^{@b¤ýhÿ,]R†éDœhSèì3Ãû]è¡bÍX,SÈÆ£Æ•óNI…Ö±xZÌFïÒè±aò)FEÑÁSŠÁ yx¨•|VþŽì3Hñ‹ûJãÏÔú*gܱʡ_¿†µ}“W2Ù¦07ôÊ®x%³ÊÄ ‰ Í ¹”vÆY¶¦ñ'êc¶\Uª†‰S³ô`§½Œ=ü\î©t^R¼Zìô/“<¡Ï_1–BBtß»´Rìð×&µ.€úßXßÃÉçN”ûþ(–-b0Qvý)whä@as™­ö·¯¥|`n`eá&Kíb–3}ý`Æ –Ã&/‹<Ã7”F’ZÁkha1ž‰öùö[Q±ÒR/€:ÛÌBýœs÷g—®‡A»ƒû\Ð6c¥°¨,Èųrº¢2"ÒCĽώ]H¯Woïêš=}tXÞ)èÑâæÏׯ,}Ñ*Ÿ±p8{ ;çwuÅÑ›Š^‘ƒˆ:˨‰+¦ŒéÎ_@uÁp£RQ¾)B¨W*Ù »}ÄyÁ0‡mZÔÎåI.ó¦­L®¿à"Šî)Z7°³[ž»pV¹DЊÚÞÊsþUJØXP©©£¼‰;u"K¼êxç"ÂFìV4³8ËPzfs¢¨ ¢ÇUÐñµ“mXcŒ¥ÕxÀr;Ÿ`±Ä’X«=gÑ÷º 9›¶çôFÒ鲨q®˜ÍDê⮳/}_è’žÔÊÙ#ºÜ_§›Ü }²\x äh©f˜nFªéP"ð-gªi¯ÜÁ;ÃâAs]oM “‘ƒ  œ:0•‘8¢+K7؂˞ˆ”Wœhx°äÍJÏ ZæÝ'ªFù5A“Ò‰U•œ öùZ®öüÚ§ÝTêã3ažûYñXwy“÷u¹ÒT ‹%4äL ÿm¬P‡fY(ÛÎ\%F…a*g<±EÊA®o#¥+êU“em KxZ¨Pl‚)€ÒW½›$Ú‹k¡ 3øtÝRÕ h:—Ðm~Ôÿ°A§[êÇç˜ó.íÍnH9Ô¯n~®ï(ÁÞ xÃt4ñ#qY?¼¤ã§Ÿ†=B(ƒ1éȸ@•û“Dêb6RH‚µGoF½ü«Œq6HÁ¡éRWضj"k°×•m@Ì‹x£:uÉÑ÷¸cVV_YïNý|彡Ø1­qɯõ›k²¡ÉJü±uSe£PG#–û3ñΟë#}Niæ×K»›y;[y:Í:–þè­´Ü™1ÒöÒ§ãžê‹]}=8²íàôízûOñ-™ášSa7FKQKíÚ“¢­œÂñÔžF¼dSW‘}9¹šq—G€xÖŠ\ÿ¨¦© GÀIÇ%“F“žiÑkqH¸pü•ä¢CÊÙž Y¡2Ã÷´zÑù"Š|ÃbÖÎB‹³Ý&ã÷GºsˆÃVH+ŽÃXçÏz¶p8+µ‹IÏ>mvnü{ûb·ÄÝ\òomÉ_ˆç ÓÖåÈ ð²mè©9$ÇOÎרåº9»Ju•…S“žF“°~ Ð7¾ö,Ë2 FÂ××DÁr•hd·KËZD!Œt ¤ªTG—(£ëm] LÞd)×·¦> \06£\(DÓ/×#£…“[‡ßÏ +;Qw¥‰2Ú˜èækA™LOc%¶ù‰ýuÝØs¸º áFi˜ºŽwÔÞN¢–´4ùÎ}¦?Ñ®PŠöƒ±ŸšçV‹ˆ~àÕ–…3˜§4Û¥¶IO”蚯5VD3)šë8QzÅÐõÈ}Sõ‚4—…ÃsŸ3Ùm¡LwIinÎ|P“mTýÛF!ÌøV™'*á2ç`ôç=õE!Ñ6]µ[%ô¯ ×ɯï^$\wG3Ãà„7¼F †B£9z ®ä±¿>íÂÐè6‰ –ß7ç6ÑÔúè™›µ„ VŽ{uÄWkY}×¾=3¯0½s¹ðÜÒ; oÙÒ‡¹Ê«˜êYÙrM2g©®ôn#™]ÒÐÐC(*ËþÛilûgÖy*Rƒªk¡9aÈ_¢^­åµÀ;úµŸ†B<(Œäë` ”SÊp$µvA¨ÜýY[žäëeK+Ï6YCF÷Ó¬ Ù¥÷;Ðòuµ†}ìH£]ëøè •˜TÛF65ïñvt+Ïš‡<£—^ÞÑ}¦oŽë¾#ÞáG ‡Ÿ´CãšFÅ@ãEFެ¤i®¬çÝ”ú.OƒQʼn¨ý³(öˆÚ‰¹ GI¼!ÝóÇ2{TjKÞçìP ¿×:L%ÄÌIÅßÿÓÞyG5‘íqÂÒ«A@AD:d&“*HI"Òé‹Ih „)Š"Ø‘&¨e¥H‘…¥\d¥ÈƒeQ”EÜi Ьø²»Ç}ï…wÞ_ïÏ|þ¸gæ;÷×n™sæœ{Î(ÙÖO§qeGgˆ)ÿ“´%Õo£ÈTI¯‘užUÌÖØÞ°¾¤üõèaQø¥ãq¥œ™â¨˜qDâqÎÒ éÇtRÓsÎzsaø˜LšÔÄÆÊ}Ö ¤ö$¥arèèƒÛ¬à˜êдè´Škß[PÙ,§© !^0;õ«WݰœUžè/¤1û% †¤•â¥;+“Ö3µ\õ€&[ò„GUL•Éu×_íºÜºUhµ†Rz é']ÍW“3Ç`߆4Î¥·9®›‰äLfErT+T’læS´T7žJ¬«cUßÈ0Õ½ÉX{µ Íìkν\‘õ §>ä23t ÷®=ê!Þjîðôt’æûJzKáÎh?¥º.I;“£ò4’Rò¤Raº$÷¸ìãâ“ÓS3E濟“N™YY°Õøe Aê—×Òƒ‰R_C¬ÔLØW9yÎÖ¢°åÎ[*W+Ð_y—ü*1Ul±~­µµ kºi…31#beoEM.AŠÝOeõÀ¼Dû}±íÒêÛx&mÝ­Þ í+µ° ¸N5pñZºgpÃjù2¼mpî‘ 7¬÷¢¨;9ÇQÙZ’^fñ‰º6z1!ª¶ö"`Õ¥ÛìÝI-ªwv„’NR›4ô¯)f.œ^°÷,g2y:jíæOñÜÚ—ÃÚ–%ý`ôý2ù‚Ç=Ú­EýµósgÝÂÅ3f¢æÄX~‰ŒÜÁ[e —§WBž¾Z{þͮխÊü”6ÌÞÖúÌUÊ ÿÔ¯59¸,^©ÝeíZ=ÿ~ÆœX\u¹ó]†Z¼)¢ôÔÚï¨Ñçœ.»àÛÆÆ$õÆø[¯4¦ÅþY;-¹éOÝE½Sii tmJ°s`ÃΪœ%ú05ÌŇs F§Ð°ývÁg“®Ü#lÛ3›köMqìŽ×A£çj–¥o+¾¾êóüÍ¢Œâ56áºúå$WõÐu‰ ×½O'ð'ǼïÃVl©XWD#ÀÞNÈè‡W…ð¼Mgá¥ÔÙ…ùi `5ÌðŸ/E:åÏá2™ZgJôÔ¾Ï Z%­;ß;BÕàãÅË„íy O!¶&;RƧg~æ”ÂK÷7ž­wGtœKýµÖ5ï¯&5ÆäÍOªíÿµ`m°{ðŽýªœ¹v|Ãéýu^g[|/,žÔ»£m>õ)ê7Ç/Z¨É™n_]¸2ˆ—+×Gâß«™]“²µ9;qãû ~{/ó2H¥î5=ûós%/ðdôTŠ4›ò•DÕÔ`Iñ”_Y³Æop™QÏjY•£$´´Ê*:µ]}§ŽV öÄe7…D|V»²(ÝÞ™8¿}w 8Z4>vsÏtšÖX“mi”FåŽÎG·[å•ÿšô]ïT!‹IvŽU'»•>tWËZ:˜ÚZŸérîÀ¹ßVß‹YÞkûþÌ/ÀòlýÌÎÛ$ÀªÒ¨êçrSË1JYõL\ÉÖ#Ô²Þ›n)Î7懤•”=ß5lù¶!“¾³/ k1Èqÿ¨Yg‘-ËÉß;;vúEÉõLìMÃÅæ®º¢Þ2²ò½k“Ó!l©åtÙga;ÎïŽjA#U©†+ë[Uk®Ô²6¸Ì£(yíªð¿ªï/aOúØW„OÙ&Ú×ÒrøÇq‰ûþ€ÎŽ[+\ø°ò™ÐÏ‹g‡·å"UT˨\p|¡dºíåˆj–þè-|EÉž:oÞÙ÷lÞ8ƒüI¹Þew·)œàÝð~•²PÌ¥Fê0;ÏëÞ¯“)þ/¶ü“$eb^¯Ê ƒ^.õ{· Kä‹ûb„n4Ìβ¯¬üp}AƼ#q€C^—xf÷ŽàÙå±ôQ"›Àtpž²ÌH5èѯ}«è¢–cô;¥Y¨«ÖÖ‹5¤é˜Öë°›e`-]PxÍ‚_“*4:ã~àm°êk#‚”­”KZÞIjH•´%;Õp8†ø.ÇdTÜÄ£â‡1õ¦/AÆ€eXN—àn%x!:ùà¡«¡{†çX#È¡ñÏ1Ÿ5RHö½ìÞjÃò«©Èꬫ9fã%ÇÎÝ4N3fê?57Í?éåsW‘gª›÷ípˆy…Z-{W{y!B„"Dˆ!B„"Dˆ!B„"Dˆ!Bþ/ü³’'opari2-2.0.9/doc/PaxHeaders/pdf0000644000000000000000000000013214770056773013255 xustar0030 mtime=1742757371.875339772 30 atime=1742757371.935339406 30 ctime=1742757371.875339772 opari2-2.0.9/doc/pdf/0000755000175100001440000000000014770056773013662 5ustar00builderusersopari2-2.0.9/doc/pdf/PaxHeaders/opari2.pdf0000644000000000000000000000013214770056773015221 xustar0030 mtime=1742757371.863339844 30 atime=1742757368.471360519 30 ctime=1742757371.875339772 opari2-2.0.9/doc/pdf/opari2.pdf0000644000175100001440000114506014770056773015560 0ustar00builderusers%PDF-1.5 %ÐÔÅØ 2 0 obj << /Type /ObjStm /N 100 /First 829 /Length 1440 /Filter /FlateDecode >> stream xÚÝY[OG~÷¯˜Çä!0÷‹E'­PC‹òP‰Çb…€eƒšö×÷;K˜õ0³c›RºT ³ëÝñw¾s¾sYoãÌ0å˜eÞ³À„ðLp¦¤fB1e,š%˜pÌXÅpÛ*ɤ`ÖÊ”ÌiˤaÎá ã™ €òLq¾Äµd ˆ‚[²%„†”tL[7Àa„dÚàˆÀX¤¬ ÌÏy"Â2¼ ÁxÁHF–9ŒX£µK,Á̱ɂ  ’ÙÀ$¹ç8“š æŽ é4ü0ä ŽÞ1<ç óÀóÜ<ðWpGØñpŽ1p„?\…€°© þ)ç‚Ã`!q² NŒŽ Kñ6Ls,-à‹àð[x’ƒ32œÐC[NADì¬ÖdÚì*ÚK?ÐE8HþÎéÖh‹ˆA±„>F9 ¾B,9©àR$2Œ³Ø ?Œ n Œ d2™€Øèd C@(+È(Ð-)+ •UzBGÂ’‚”F9º¹¬ v­!M Ñ¡'@(ædspBÈøsšéE_‡jÎCÈæl [ÒCsÞ‹€r¾„tž´ó’pb/ êyuE …5ö’˜‚P蘒 8‘¨V ^¿fûÙþÏW§Wlÿ-{1›Ÿß,§{ãÑâz~u¹'^²7o/Δ³øsgœó!-W´\ÒrMË4ý¸z™áŽ¿qº, Zθætü–Zhù@Ë-r}׫õG©ñeä7¡å†–q¼;OÙßaŒâ•Éúå‡ùºšŽoƒ×éí^æ÷§+â/×ïM"‹qôè[Êh“—ã莬¹“ô1út—VÐß»ó£`B–Å^¥~_Ä¥†n‹*·¨Ö-FÌUÄ—¥kv7Qí¶§s{:˹Óxö*†³Íîy Âùú7ßF=Çi ¬íï–W—²U—³µ©ÒEš>Æ'Ý~›ݬc¾O™~­8zÝKê÷îÃq$ÖÊvƒ7í*Ÿ$wÿLSìöKÝÎÙÜ9»Žy£v?nSú¥t_îÞº‰»œ¸['ðŽ–ïø[þ"ÚΛådC øÜ¨ÏRa”•éô!Þ»(žPû5^ùcC“ó¥*ðå*8.L𶵕ú׺´€Óê]Ux_E©î®¬âå¶w³ÊžEÌVþBy‹éådþ}ï wí`÷ç϶ØÚú:ˆ¥ø¾bÿ0·˜ÍðQÚÍ“Z.ŠY˜p àC»“ä°Ô'+O Ý1ýQ5m;?/=ÂþØÕ¦Ï,{¨Ç'³tæ¶w̯ÕÍç5ÿ·ˆ@‹ö­ú½ô”÷¯"³v²,¶-å-·ãdüOÑHÛa'O’gU¶r§ÑñÜRLÖSLö5Åä¢õ)ÅT­Ú)Å>Å,y3ṦŸª§Ÿêkú©zú©~¤_|$v¼cˉ]<Õtv¾øËõ¾Š2ÝûÙ“ÔÅòÁ¹ßXü²m@'÷‡åé>ìçt¤e²Üôó%Ñë"šýü߉ ë"ôtþ Ëóo¸iþÆ÷N‹”è4ûmôØeŸ’WÛ‘WY:ܤòÖ^Eÿk«J^íTÏ­g©z¹¨¾–‹ª—KǼ>ŽlÇé[‡œè,ÕiþÔÉ™:«¶sVe¯a/ d–[ýÇO©µ<³z;gu/{I•¼Þ©—Ü”^ò÷iÖêzóÐ}mºÞ> /Resources << /ExtGState << /GS0 216 0 R >>/Font << /TT0 217 0 R>> /ProcSet [ /PDF /Text ] /Properties << /MC0 218 0 R >>>> /Length 3468 /Filter /FlateDecode >> stream H‰ŒWË®IÜŸ¯è%,N»*뽃X Bc‰5²€|y ~ŸˆÈ¬îs1BÖh|OvwUå#2"ëÃo>¾ÿ˜Žï~ññxüó‘ŽUÎZí°5ÏÙÖñ û§?<~wüíñݧG>Òiø?5üÓ¿>>üê‡tüé_Ÿ>¥#Ÿþø휣¬#á¿ýÛÎl¥VN«yŸÞ?ûûÏ?ýåñ˯vüõ#íø÷Qïávä6ù(ë,cÔ£´sµ4ŽÏo¾x{<Ó9<Íç\ƒ†Ïr¶ª? ‡>빊ŸøQZ>žý,V'vÊóx޳Ò'ý|ÎÓüÛu¶ŽøÏÄr>Û,4kÅÓ\ÎÉ3ÝÄǹûIûýD4ó^½„×½ ^^3'­]^Y…ï¯NRȽ#&ëç¬ãŠ×r®ttÒâK˜p'u½+6ŽŒ*Ô¢ ;Ò’Q±ªo;Òt䊵ÜάuävöUÜYä%3#üÁ`k$ |V ¿Óˆ4X:kVÒ{­ïÚÙ+»Ïõªo—·Ç̎DZÁ¦+ |?«@;cºFw|ËxEªˆŒ< Ë^eŒ‰µfÇÎ'í1òMasWäúÂëum j¾ìïµÞç;Â9Éåº(shEл+%hŽZ"]Þ3‹ú±Ó+Ã3ïGQÞá—€þáñ[jÂÿ§þ:ð÷=õÿ#¨ÿ¦÷Ùδp^!éæ ½w2/:i\A 3ÙZ°Þñ»Õ%&åŸvŽe¢Ùª·9Þñ{™*tâNŒ0;£G½újÛdÙL¾ß#&ÊÃ<×Êê›Þ¼˜mÁ×*m)F˜ÁQùÅ‚S6éôDIß±!U>&sLgcd“lŒrƒý ^ß-‡2Ûm.Jaã_z+¿Zî4Xü.ê3ëây;¦sâ€IÖ4+Áó©U‘êtªhxÁ<°mðw òqUŒX¸Š¸Û óX!/0;%/²¦S=«±ß{©¸Øõš…|ázV™'Q:µ±ñÊóDNÜÄQE¢4èÇÓë9˜~f²;ŽbFüÜ©uË›,V›èÉIÕ<ËHò›jQs۾܀UL5| p6BUb™@²CЩ,.RÒëÊ™5‹$–„²+·Ê"kµ±¶sÎèvAÝu ÊD-ñç¤æCi‰Vre +HÇ8¡ÕE:¶œtº“NQ>|p¡ÀÞ¤S²“ÒžÄy €¬#éäïW·À<ð'4œT_˜G9ð“¨$•£%} ÊÔþQƒªÎ'oÑ#£~1~›Ð^Õ¥“iòÅàž3#Þ„¦+§Y»ß£tچ͆ÕH-öžþ9Àµ4 þ‚]ÔCI³&¡›§Ú§N„u†`Ýù1$¬s"ëøc!q3U‚y¨€S\].© Ò)·Z&M%-Ž3u6Yí2„Cÿ¶L CϾQÝ\QÃBúlïû‚ù/ß*¸a´–Ê;}øýWúI= a54tF‰/E`®FæˆÅøé.ÒÌiŽÀ¡¡s‰¡Tbr™-àPY³ÓT¾‰Uâù Œ…ÁÆXY_n›­ù¶eoœ†©oˆe!Þ˺tFî4KbE麫ÁÉÂé\Ç´êM¶|Hƒ#e­Î)qê1ªª»¬àE 3D‚ٹħ(Ìæå2ñ1Òîqåá¹ÙÿBŠõw8ég¢×Ä"gqñ³ÉuºF 1á÷dúÒ( ®FÆÉ›¡6Éé¾/úw¯÷—°Ã%ù§ñbÕ¶WøÔ›ôÃÖc0œi»ï`¼‹…à2lÞ‚tñ@uu™Y§n,ÜмšÓŒ^ÏÝGVÓÕ«ú°ÆNòª5eN‰«ú Û¦8>-7y´›ps‹Z¢zº‰Œa©Ù›(ýìà1õÀ@‰¤ëém¸ÈÁí0‡pÉ€BÙvStxÊnzr:&ãöJ%[Rë¦yÝÜ©n…dï"Ì2GâË`Ç;x×+\7B®Û§#'MÚ5¹ü[â•g1K”dÞ*t½lëBdj_£Ò×éwÄA£ŽcEâ} ‰©*\®œ•ÚzµRÙ#m4ˆu_ùt%}aÕ]ðªî‘4½Í츴ÜßÉ¡îr¸A(Ûý5çF ¼Í-«<Ö/$v t¤à¾3ñbjd¥´0$Ãâ³–ô{Êú!lÑŽo^%¦ô!!WJ‹Œ]ÙøøÝPê¨ÛœbAAË¿\štgݦXb¥úò.M_­p ñî‰Ë*ÈŒµrx^#$o½ØW_O~ÇÃEº[¡3¦_NÓÜF~bëàxLãvÃÇ'd w]cE#ÐvÍQFë ¤èJº*>ç”ÏEc;¢¾ø ¿ÅôKsUKc̆b•åsŽƒÜ43Dƒ²u©ïb×À69%¿"òJ€¶gË ƒÍÙónˆ˜,³š7cŠàòzK~"‚†F&iÙĸÄiWw ŽtØJrMªdboñîBÕ~;5J`锹öNE¨¤bw„N¥çd@_ÑPœ´5Wå‚—[¥T#ÁÉ\¬ßE"0ÍÇŒé\ã"ÏSŠâ_®èCø”±‡•€“¦  ­áCGÈÎÔ]ÕM0üf²LÈ׸.s$¹aŠæ>E_`\$¸I±Ë¡¯áÄ}ÿØÙ²# Ð#ŠÃáf\꒨¬Þ E޶¼™ ˆ#D®ÈÑ)Ò^‚2ùsèdSYÆÕŠMRg£9aáÈ£ïBsl½Ý椛NJ KhVãÎd&Þ&{‘Ç&¶xg®–3k&L+j ´$U]¾ÍÄ$dìþýÆGƒV¯n‹ÐI,½.…·ØuCimËm¯tíºûˆßÉ$ºKª4ºc?àS¡¥YÀÕZÚ$K rK¶êãXYWÛDêŠÀ¸TRëú‹™jÆDˆ'Jx±ß£å lð-Á¥aŒ•Uñg!åˆïBéÝ´.[»çZUåY£Ù x÷XˆäKÅMuq_Aï°{RQÞ 4”`m.æAŽ7^Æ8ë”PÎsð×Ý•LÓ 7³x–ص¥ ¡p»Ù}%P¯:UKZ=ëE&Òj½‚ ÿmJD!1†xÿã!jØSU*ʯV–ü¡ƒjs …$éY‘*á¼Õ?BoЧÍ2{ƹê ,_ M‹Ýq5ßÕL`ιç<«’ßx·F (Pf&P™¹P‚ñÑ'û<ºÏ©/ÔÅ5Õ!>xݪÞ&|5ŒœøðUà×Ð^tàm²‡%"¦'†ø’°Ë¹ þñ@Xæq(˦´*"ŽÙœ‰<”êSy?åñ73&Ž­m Œèɽ|ÌÜè$¹Ý÷qø8^¬d¨~#P(q…©¼þ<ƒ~*$Ä>Ã>wZ6¥dMÒÍm›P‰y¥)äÉ2'¨cB¡¬âéðóÖjÛÓ=ôz9Õ>}l›@àüŽí÷7VVÄq4f]=«ÓŸC{O” à Y¹­æ˜ÙdN¨â>AûùëÇ ¿ 4ÿ_Ó endstream endobj 223 0 obj << /Length 1075 >> stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 14.0 %%AI8_CreatorVersion: 14.0.0 %%For: (Marc-Andr\616 Hermanns) () %%Title: (Opari2_CMYK.pdf) %%CreationDate: 14.10.15 14:58 %%Canvassize: 16383 %%BoundingBox: -25 32 265 115 %%HiResBoundingBox: -25 32.7266 264.626 114.5576 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 10.0 %AI12_BuildNumber: 367 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 0.2 0.05 0.6 (C=100 M=20 Y=5 K=60) %%+ 0.5 0 1 0 (C=50 M=0 Y=100 K=0) %%+ 1 1 1 1 ([Passermarken]) %AI3_Cropmarks: -27.1235 26.5576 271.7354 120 %AI3_TemplateBox: 175.5 59.5 175.5 59.5 %AI3_TileBox: -280.6943 -206.2207 502.3057 352.7788 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -102.2378 160.3472 4.38 1815 943 18 1 0 46 128 0 0 0 1 1 0 1 1 0 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 224 0 obj << /Length 6042 >> stream %%BoundingBox: -25 32 265 115 %%HiResBoundingBox: -25 32.7266 264.626 114.5576 %AI7_Thumbnail: 128 36 8 %%BeginData: 5900 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD6AFFA9595953592F5953592F5953592F5953595384FD6CFF5906 %06060C0606060C0606060C0606060C0606062FA8FD69FF59060D060C060D %060C060D060C060D060C060D060C062FA9FD67FFA80606060C0606060C06 %06060C0606060C0606060C06060559FD49FFA85A59FD09FF848484FD0FFF %590C060D060D060D060D060D060D060D060D060D060D060D06FD49FF2F05 %0659FD05FF592F0606060C062E2FA8FD0BFF59060C060C060C060C060C06 %0C060C060C060C060C060C060CFD49FF2E0C067EFFFFFFA90C0C060C0C2F %060D06060659FD0AFF2F0C060C060D060C060D060C060D060C060D060C06 %0D060C06FD49FFA8062FA8FFFF840606062F7EFFFFFF847E0606052FFD09 %FF53050C0606060C0606060C0606060C0606060C0606060C0606FD4FFF2E %0C0684FD08FF2F0C067EFD08FF2F0C060D060D060D060D060D060D060D06 %0D060D060D060D06FD4FFF2F057EFD09FFA9060C2EFD08FF59060C060C06 %0C060C060C060C060C060C060C060C060C060CFD50FF84FD0BFF53062FA9 %FD07FF2F06060C060C060C060C060C060C060D060C060D060C060D06FD06 %FFA88459532F5959A8FD0CFFA88459592F5959A8FD08FFAFFFA87E53592F %53537E84FD0BFF7E5A2F592F5A7EFFFFFFA8A9FFFFAFFD0DFF590606A9FD %05FFAEA7592E2F2E2F2E2F2E2F2E2F2E0C0606060C0606060C0606060CFD %05FF7E2F060C060C060C065984FD09FF7E2F060C060C060C0659A8FD07FF %842F060C0606060C060C2EA9FD07FFA92E0C060C060C060C59FF840D06AF %FD0FFF7E062FA8FD04FFA78182A7FD0BFF840D060D060D060D060D060D06 %FD04FF2F06050C2F5A595A0C06050C59FD07FF2F06050C2E5959590C0605 %0C59FD06FF2F050C2F7E597E532F0606067EFD05FF84060C062F2F592F2F %062FFF7E050CA8FD0FFF2E0606FD04FFA77B817BADFD0CFF5906060C060C %060C060C060CFFFFFF2F0C062FA8FD05FF7E2F060C7EFD05FF2F0C062F84 %FD05FF7E2F060C7EFD05FF7E5AA9FD06FFA80C0C06A9FD04FF0C0C067EFD %05FFA9A8FF7E0C06AFFD0EFFA80D062FFD04FF81828182A7FD0CFFA8060C %060D060C060D060C06FFFF59060653FD08FFA82E050C84FFFFFF7E06052F %FD08FFA80C050CA8FD0EFFA806062EFFFFFF59060659FD09FF7E060684FD %0EFF53050659FFFFFFA8817B827BA7FD0CFF7E0C0606060C0606060C0606 %FFFF2F062FFD0AFF840D0659FFFFFF59062FA9FD09FF840D0659FD0FFF5A %062FFFFFFF7E060DA8FD09FF7E0C06AFFD0DFF84060C2FFD05FF81A68182 %A7FD0CFFA9060C060D060D060D060D06FF84060659FD0BFF2E0C06AFFFAF %060653FD0BFF2E0C06FD0FFF7E0606A9FFFF590606FD0AFF7E060C84FD0C %FFA9060606A9FD04FFA8827B827BA7FD0CFF7E0C060C060C060C060C060C %FF530C06A9FD0BFF7E060C7EFF7E0C0684FD0BFF7E060C7EFD05FF7E5A2F %2F2E2F2F595959060CA8FFFF7E062FFD0AFF590C06A9FD0BFFA9060C0684 %FD06FF81828182A7FD0CFF84060D060C060D060C060D06FF2F052FFD0CFF %7E06057EFF7E050CA8FD0BFF7E06057EFFFFFF7E06060506060605060506 %050C06A8FFFF590606FD0AFF7E050C84FD0AFFA80606067EFD06FFA8827B %8157A7FD0CFF7E06060C0606060C0606060CFF2E0C2EFD0CFF84060C7EFF %590C0CFD0CFF84060C7EFFFF7E060C065A7E847E847E845959060DA8FFFF %7E062FFD0AFF7E0C06A9FD09FFA8060C06A8FD08FF81828182A7FD0CFFA8 %060D060D060D060D060D06FF53052FA8FD0BFF7E06067EFF5A060C84FD0B %FF7E06067EFFFF060C06A8FD08FF7E0C06A8FFFF590606FD0AFF7E060CA8 %FD08FF59060606A8FD08FFA88281817BADFD0CFF7E06060C060C060C060C %062FFF590C0684FD0BFF5A060C84FF590C067EFD0BFF5A060CA8FF7E0C06 %84FD09FF84060DA8FFFF7E062FFD0AFF7E0C06AFFD06FFA959060C2EFD0B %FF8182818282FD0CFFA8060C060D060C060D060C7EFFA906062EFD0BFF06 %062EFFFF7E060628FD0BFF06062EFFFF7E060CA8FD09FF7E0606A9FFFF59 %0606FD0AFF7E060684FD05FF7E0C05062FFD0BFFA8817B827B81A7FD0BFF %7E0C0606060CFD04062FFFFFFF59060D7EFD09FF2F0C0684FFFF5A0C060C %59FD09FF530C0684FFFF7E0C06A9FD09FF84060DA8FFFF7E062FFD0AFF7E %0C06AFFD04FF590C062F7EFD0DFF81A6818281A6A7FD0AFFA8060D062F06 %0D062F7EFD04FFA80C060C59FD07FF2F06062FFFFFFF7E060C060C59FD07 %FF5306062FFFFFFFA906062FFD09FF7E0606A9FFFF59060CFD0AFF7E060C %84FFFFA92E0C062FA8FD0DFFA8817B8281817B8281827B8281827B828182 %7CA9A8A884A9A8A9FD07FF840C060C2F84A8AF847E0C0C062FAFFFFFFF59 %0C0C2F060C2F84A8FFA87E2E0C062FA8FD04FF59060C2F84A9FD05FFA85A %060CA8FFFF7E062FFD0AFF590C06A9FFFF0C0C062F2F5A2F5953592F5953 %592F5984FFFFFF8182818281828182818281828182818281A6FD0FFF842F %05FD04060C06060659FFFFAFFFFF5A052FA8590606060C060C06060659A8 %FFAFFFFFFFA9590606050C062F062F0606050606A8FFFF590606FD0AFF7E %050684FFA80C0606050605060506050605060506057EFFFFFFA67B817B82 %7B817B827B817B827B817B82A7FD11FF842F2F060D0C2F53A9FD06FF590C %0CFFFFA92F2F060D0C2F2FA9FD09FFA9532F0C2F060D062F062F2F59A9FF %FFA82F7EFD0AFF845953FFFFFF59592F5A53592F5A53592F5A53592F5984 %FFFFFFCFA68182818281828182818281828182A6FD15FFAF84FD0AFF5A05 %2FAFFD04FFAF84FD11FFA8A884A9AFFD2FFFCFA782A7A6A782A7A6A782A7 %82A7A7FD22FF590C06FD7DFF7E060CA8FD7CFF5A0C0CFD7DFF7E060CA8FD %7CFF590606FD7DFFA8597EAFFD66FFFF %%EndData endstream endobj 225 0 obj << /Filter [/FlateDecode] /Length 17494 >> stream H‰ÌWmoÛ8þúºbŠ’HIÁuÉ–Ûl·M°IöÐë Æ¢]eÉÕK·Ù_‡¶ì6Ù¶·ûeõÀ²4|8Cg†Ô³¿]]Ÿ¥Es§Ï‚‰ç:ÏžM[­ú¦=wIê^TÕÐõ­ü|êòpâ”^Ä‹ñÝveSŸS5ÎMï“ת]ž¥uÑþ[ré¾ÔíFÕuwêžœ‚rSö•ér«ÚÒ_L_¿}5Ù«Ó½}(œ©^“RîM¸ÀùˆM³ª?ª®+32ˆȲf¨‹²^gͧs÷Ìn໾D.Ðú²üYwOP&‘/%xáDúÜp"D$ÑaÖ,‡®û«¶Yê®›6UÓvçîôAÕîkµF‹rßêªj~u³J-ßu™7uo¨ÍK­Šª¬õÙOåú¾?b¼ÑºÐÅïòÒ ±˜—•†7ªw9y4½àþ"ʪx3lî4¼ÈȈƒ î¶Ã¨Œ6<q´¸Ø@r­ûS†³*ÆÇÇ3‚û\oâãç ܤ{2}Î=Ï}ýÜ÷Ü·Ï…ûê¹ôÌ‚ü­`ºáC1 C~õ|Gá;œ¼»Âê˜Ånßëú?§»Q¶ÍÖH:ãûhÂý@Àñäo×ø$ Dèrß³ì½ÙVX}Z+ X n‡Ç~Ú­gŒ $a€'ON|ß‹\áù“À‘¬tǶÏamõÇRÿzî¾ijmÝž¶ýµ «0ÄÔèn[~*ÝÞÖ¥Y2iD‰õûë¦ÐÕ¹ëýç•"wøán 7ª]ëÁØTCO)ï-`]RÚ„·.·º¾i~¡1žqLÆ¢ïM‚0òÝpà-Fb˜ió˜ì„c?ÍóýÝÚ0¾½!Dг+„Ée[®Ëú|7Ìhñ¢-‹CèÀVlo4“I|ôKö?;d̾ïu½›7i}‚Þäõ5,æu1m6f :“¹¦•U³¶mã3µ û°uÞ9AÂ> M¯;誴›H¶nÕGmfËÒ¢Ô-Z:–¶hfÓ¥.ʪR,WË¡×ìM¼ÑìrOsØíØCYŠ"mL-Ëѱªô'¦Û_‘òå^¹¦žÓ¶«>êªÇ®¥U_ZNyÄ)GNMêÖXnc¹Í·¹Ê`©ƒ¥ªÃ†‘[¨õZ·¬ÀµfKø›u½n+3‹N/Mü±»¡ªtÏPƒ¶÷lMUº¸«à¥ `zè‚-›íCkêÃFPh“ÉÌŽa47©›¾Ð+–æì²«Tw-6MYÒþÿA×l3|)vñöÿM[¬4T¡^šçê–ƒ)ž#AA¾³þaЙdÑüZ3ýiY© ="ºÊ¥ªÐaìµB*—õãa¬Qq+½i°U­úÛõê¹53ï¶j©Yj#ÝÛî/g‰‘ºÀ˜ÞÐ2\LJ÷/V'½äVX”K £ÓFŸ¿ŸV­²+šmC#¥LÇMo¤Îa«Þ…,³-ì4… ZëCžÝ©N¤Pûûfè"KB4?zNmdäãàrëš +¿8׋‘taI—–ty¤o?ïK˸µŒÛc5·¶©0+…£;êmb£–­‰w}¢©%%„Mi›Ñ»êµj‡M¥†yˆ}á=[*ôsnrª âÇÅM‡Ýã°i *Sy½lÌáâÜ]|¹£?Þâß±G$ö¨—-á7ÿ²FP÷&Ü›vÐ7[í¼ã’ïÒ;cÀà&ýaP^$+ëÒ¤8J>ã" vâ„¿›{ˆÉAÔ€¾TUQ®V sÜÐŒmÛ¦–¨%4ö¦ÖA}œ°Ë^+×á‰`(&Ÿ\žDLmÑáÓnIÌfºÂQÉçá.ˆ‘|¿éz­]?ô ¹BX/®6wMµ`öÿ³™ ëÞÜ}…µ2;‰ófëÐéóªÐô¢m†íE½jœ{\½A&7]ÞýE§Íàðt=”½ž¨r{úUEØÌZíÚFt¦×ýÿ·{Ïô ¸Cw+Íëºj¶GjG RÊý§j·ßV}U©Zµ.ÉGÍ?•Ø ¯|tÐ}}‡RÕßã0‹JÕ:íëçú¬ìÛú®—æ(кY;t÷îMÓT£ÚÏ›Fí;1I ÿ¯aãŠ:Ô—µuÐcK;—–püËYû÷- ñ¯¬}ª°ÝÒ¥\>eà‰öÑ’mû‹*QÙmñt$¹2•rYé뜎6_Óf¼2\ ©èFÛl¶æ{Ô½¾W[M:ûû91¯G…”ýãÒwvö•šˆo¶¬>jaê2ö¸s÷ä¶®ÕFîz'§.?užãï»Y#÷?œ@2ˆ‚8H‚4È‚i0 ò`z!ý0ÃP„2ŒÂ8LÂ4ÌÂi8 óp.<Á…/ðA'„"±HD*21uÄLäb.=É¥/J!¥Œd,™ÊLNåLæryü(ˆÂŸ‡>Ý¢$J£,šF³(æ±ó؃8tbËŸvq§qOãYœÇóÄKxâ'A&"‘I”ÄI’¤I–L“Y’'óÔKyê§A¦"•i”Æi’¦i–Nt–æé<ó2îüxæâ€LßÌÃÃX½˜£^J@oo Ì9070jn.Ÿ!þÂV.yDÀäxBÀ(yL 3 'ÌùÜŒÇ(qp3W„¸Þ—øÐ‡Ÿü„€ ûa Ì€œ0÷çvbf<ï@“½BëðO!øÎcÑŸÃ×úÎÑã–Ì}¶ÈZ$„7ñ±Ú7瓉Džô9 ]aÎ,àáwñM^ÖA—LüírÀ câyQl$*÷Ž”~ohÏfcýØ—ï­ ~üde€ø¸2P´ï?‰èIÈ'!œ]J}Žï ©§û°ˆüI]ûDç”â!%vD R"›6ÉË)gCÊÕˆr4¥Ü4Y9§lô) MúEå]JÙf2mNùeR+ücUÕÙ•ÕGEõqM¥ MÅT"Jã4!¤@F°× È s*ZTkfT$fÞ Cppƒ©™$DTÛYBH @úföʹANUŠ—­:˜±“‡A@Ýÿûe³ã8rá'ÈwÐeû"ÿIc`€ÅÃç…O{,0ƒÅ<¯ßŽŒ¬"«$JbOÃðhåazºIJªÈˆüréX= 1½Œ,¿ø[º GÑÒ^]‡íØðÅujCü c¢Q³^‡²è»æ‘ÿ^_ù>ãU‡¾«ÔvÕf»{ëÛl¯cs†’0·’âY–dtžœûÜÄ„©|íßúÎ÷~ð£÷~ÂÉ@Èc±Àø©¦zjRU?å#Qþ§‰R†xpצ/mv&Êóë8ØŸ¦NU\+dÇÉŒŠWÿ±’ª>ŽªºÊá¨ÿÏ:àÀB¢½ñÀiø@–—^àÆr¸³ÈÁÒr¸¶l-‡{‹,.gø ƒ!ùmÓÓ<Ò¿êÜ•~-éÒ†Ö4[Ž4£špÍ.Õ8O¹Tå\ç,ëLi R‡À Z?V;Õ;W<$ŸÉÓðË×ÔtQÍuO•ßsð@üteÍõO×Ö¼¶¾¿Y^ó6Hج²Yœô‚ŒcÚ7#9o¶D舴'˜ñ»Â¹Æ©ÊQçÙV\*]o;m¿ùÚ˶Ʈ›¹SÍ£êCØU㞺†ý´ ÚG¯wBùÍð±Òˆ¶7ã[Ä!h}` ’$b;¤ ‘·„‚EBºÂú"ÄB» [£`kXsäía ""´HÞ$Ö%èÙó"´JÞ,Ö.18¬aò– MóÿE)ÕN BÜ%sjLÉ|ù*—Rù6”åÇ©øŠi½yœ¥1AH¨&÷t¤‘”³3ÎÅ*á€+¾I ‡&Ñ ®]_”úo[çl±Ý24W×Ôû#ßzß;©d8¦’!¡ÝlÞß’yGÊû[2ïHyKæiF¿]nŽW¡XGËÓ^ø‚G»è¹ôÉ.Úßï£75>-ŸÖ ã£ñоj†? Ôºb8füW×o¬¼¦.!Áqåûº¾9fqüïS}°ø‹°ø‹°ø‹°ø„Å?˼âÊwxÜ90Ñ;<«Á3+<»˜Ý´â½f¼§Ç{ø >Œ6~Vâ#:¿âãÎøØÞ‚ïÐã»´øN5çM‰oé9 ¾õ„o?âzœF‹S©q:%N ­…F\pppÄAö8Ð[ N¸ÄI;ôõŸ Á-zhÒB›•ÐÊÁ( ´› ¡h€¢¤m q©‹ÎÁy‹@ÿ }0¢zÆv‹©Ñ)%:Æ5+ºgÆ÷óè¦]Õ¡»ô…ýV4®^Ñ€3Ñ£!‡ºtg‹.­Ñ­-Eíª=<£—=zz@owèñ½^¡ç‹ÊéÌ‚ f¸ÁÃÜÑÁ& n¯ÊRà‡(\à%eg pX§5p\çàµN„>påH†Â À«ø€ð-à­L½ÚT¯L1h–Hf¢EÉRÑ6Ù„ºmÊi€dÊ%Ú¡Rñ–L¼M>a¨¥ F Æaªá¦"'ì…A¼+™kÙ&Zæj=)ç.(ä”ESM«šëJeƒ°«mMÙ\ÛTÝTß>Ó7Ux“#Ä$‰v2QrYL˜ÜWG6u¢½L(š,µYÉd2³™P”J8ù<§àÀ‰hj™^f¼(X*Y-µ …Óô7åL»èESÏì˜2%4[šˆ”QHI¢àéš’¦¥y4ª™ê¹)JAMRŠ*䛎¬Ó{LWSÖœµMÕÍõ /¹=ÀAr¼Á·®ëžq›Þç²»–£è¾IîS¹½/·±}“Úç2;IlI#ûÆêgòú.­%³wbîY}˜Ô’:uó«œ>Jé0Žwí»æâ®]_”úo ü© ü0”…þ¥@µ—Æ]w-Ü0è}?ɧ/o¾Ïÿ.îbµý­u׺Úí™þ®÷ž}?÷æOèôùØI?o¾,ß¿þí_¿|ýíÛ÷Û/ü·_ûõ—ËŸþñýû/ÿüöõòkøÕ¥hû?Ëñ¯ñåÅÅ1–£ÎÇÐ)?F¡S~Œ:C§<£Îýq±+Ãr§ €®MXòt°E¯'rŒaÝó\ lé›9¸rÂ=Ámû_É¡ÚöÀfÛ»°öœ†#Ës›˜Âj¨[Å"LÚÕ>ŸW†MÑvE]6šmcì¸5öÛæ8nÛã6ÈY`í…c;®’EX'±šØ™Ôï®*-Éÿûþ:ÿÀò\ÉÓ?þU\šV%ºA] »¢iÕÙ‡Þq¥C³µ®(d‚þàÒ¢J/E\î={Ãûò¤oó¿ÆûlyBç”ôKC—ôt‡§'¡`û×lúžmîÙÜ ;º`×ìÞ.Ú±­‚ £ý¢õ¢é–ð.ø,:ÌÜE_Ý>²Ÿ´ ~‚§ààÛÇ™YͨfR¿‡Æ™Wq¦òYˆ¬E«®C‡–ÁÙ^é«O*´ÝV%@ªª•µ}¤P}¨.T M+ìÜÛ0Œ‰•wtW·×²ÔÑk>¨ÉJâ,Wc,¾û(ж€(ogÀÏBQ×ç•¶ÅA¥ TÈÍ)r:ÒãXßG{ïûˆßÇ|õû¸GÉÖ1”Ζ–\W¯#±·Ò§f½±Z»†k÷*^‰#Q`áä×™_Al즲H(ÂżVnîKŽ~ùÖ¢º'¶¹›}îÉ:Ƀîh§Ë¶ºÍ ûZÇÅN¶Í.ÝíÒínßïö oßñâ–‡=kÞ"Û¦g»^Üö¾‡ò~BÍ‚«_æºj•š]S=áû#!Ôä=Í3N^põ4Í(¤+S¿à…°Cvii¤h*ôô>ÈŒçë-³¾t ¬óÊ1T]½4%h±0Ä4³Àìió9Îë8ÉÃT9òîÙî©3ÞØ¸IqºJ2ho«{QýQIößáD½9ò¯kz\òäóÙʨHí îk8*Z¥ {bd ]t„L)ꇣ¦£ÛtÕœI%'”â×*ì3m׉mäxÓ9Õqè©™kÎB‰¡“ªm®óÓc–ŽÌƒ^oŽÚQQsü–ÆŠy+›[¢ÆòœÞ:ÅzNtÒúª9íuêë®åêUê xVËë·×Ùª#º%OèKéB)C÷>¥Ê•ü¡ÖœÈ´Jµ£pŽö„[ÅÛ–Sr+‚nI¼1@îàü‚Üö8®ߣƃKø×ÁË \=Áá#ÜÞã([|ÇoZ"ܴ§32Ã#>I‡CÓ¨Ÿ©DÚ8$Ï‚„˜E#R©‡-rªÆç-‘]n\aý‘æn:Ô{„]‹ã«ñmJ]ޏ ÍÂmg ëL𤲠Í[cma-QÆv`/L¡z!ó´¡vùJïÙMñ¨÷®µéUne“x“7h;ÿÆMÕÖTåÑoÍO¨U¬5°5´5¸5¼UÀ5Ä5ÈUÌ5ÐUÔ5ØUÜÕÀ†|B”Ía¶&ÌFœ5Ž@;G %Ò÷H+‘jo 6bmÛâlS´MàV8„3¾e^æ€ûqÇ{̺7'Ý„uÃðÞawÇÝxwä]4@"÷÷ùÞ²¯Ño×÷þFN!x’ÀÁ '4yØa§âŒw:Œ,“Ûwüý`5šo—£d×C[,¡!ÊÐ ­m6±΂Ö=jEØR' "FØŠ¸Õn‹IÄ­yí¸š ¸"rÍÂC^ñ–ásè2ìšo°ËÀ« àÕ¼€^Bò ìEôº‡¯–ðÕs+Qüòį™\³r2&&¤°v£°ž6*²MÓˆ¥(¶ÃXÄ1™$D–3ÙNeä2T3C³g†gÐ:YBŸfËÔ¸Wa?‹»6CÕ5wqסЌÆª½”åU%½ÎéÕ?ɧ/'¯ö¿ã¹m…¯p¡Ó®ªõ‚-~(ѶxŠÝظËP]Kÿþ.?p¯½gY8^© ½¯üûU»*GnDŸ ÞaþÖ?ÜH­nµL`>CÂfw ,1„°˜µã8Á7Áñî²oŸªRI]ÒhîÌõ5Ùx ã¹µZRsê„À+™%Øõ9?Á®Þùðgù68Þ"íͧ'e¦‹ÉÀÆMCpV½êöGø ï|òÃl­Ç;ü27d©}‚×7xÇ.ðt+Ÿ·³ ófÆi±q]ýÆù¸öî¿Úþnþîx÷ò·ï^¼|óêî}ؽzýæ.ýzóÅ·ww/Þ¾z¹y-C›Ñ=î(¾ ·ý¡û ”’x‘ò,ỵ‰Kš]´z,ÚÌjÌâX\"}É ƒÃ*c‹Ê¬ ^VšÔäå6ĆäæDr¬7µâdÍYŠæœ©Nѱ´~ÒüÒ¬<×t§nCîÐX8Úê»V^]w£¨ù®ª·k©å" ªÆÞ—IŠJ‰NŠ/z€²"IÙ%E§e*ò¯ÓÛ´@ÎŒJK›˜p–˜œš516ÝŸ¯LÎjsv•Í9ä{¾èsä¾áìÊc1:ëÅ×Wo—3é €²8±JÄšŠš!Fy™Õæ@ÎLŒUjjά ZS¤¹ƒÁ÷wÁŠœ‘Ö†(¢TdµÙ|d둇ØÁbv³HžuGl3¼XŒ-cë Þ ËgQòûÄg`2Ïì’wØ1{s-svb¾.ÂÔ[‚#[Ë€ ¿ÇûS5<`C*?àáSáôˆÒè!¬˜ÓZ»ªjþÀçR5²³±¸ S..Ê3\®<£}ÃCžz\åÝÊžàú¥rc,¶gÎLXÛ=’2 ô·h÷¨ŸGs²ÆZlÝöT3wy©ÃÛIwwâÎNùs¸jÐ+{~nÎÙ›+:Àʦ o˜¶L›¦mÓÆië´ù…… òèéöŽ'> ‡DG¢CM@-umÒÁÆÒÁæVºØª=ïdK/ Lrng?lÃW¶ œ ½å¼éÛ¶|¶i`‘ãMç çmb< ×ÄÔø¼kø&–³MÄ:@® £bÿ&E‡uç¿0ƒÃÁ¥k$Ÿ8XŸ\â`\4Þ]P‹>÷(wí_íþº¾•Åc£áñ5&»“p¹ÃfèV·Ûê[·ÂØ3]án­qÝ*©ÌUUîÖ:×­t°–:©t·Öº¦Ú­’õ#ç¸Vjå:Ï•^§Lƒ¤ZD[r}9Û:ßuÆE¿AR®%¼ö4ÚÕÔy×™/¹‡Nò•Áiò¯=N€‚ï·ZÚîTH¨ÂH¯³_»e|j@hó£1AÎx©«Äšcå­*e'ÉtfôTŠA(¼ÞA©§Bnóœõ˜kµIR¯SæSî3×àô'ÂghdÚ'â'äRžpÀ  ˆI²å ¥½ØgYð'(…pÔðØ–Ö!7 ¶‰/w°ê…@¥‹/@Ý–­ÐÔþï8­¢Ï½|œÞc%&|œÞc¥"|œÞcm=àq½¶Ÿ›¼íq×t!ì °‘`£ïñ¾Ù-Ä‘ÝÂ…äögÈ»<Ðë<ÂŒ]2^w ÆöÝjèTvR»¡ý= º4õr•~Ú¦fjýܧ^ÚEíÉêŠmŠ·Ï¶~)÷Ãû€ºt7ûèèxmâï3ð÷Y÷ƳÃ=–½kÖkF0¨í"¯E}–Ý2Ù_`Äžé1ÂOCpóx‘ù÷DZ£oÏÑŸÛ•˜šˆIZ0Y3¦Íaíh0¡GLìs¼Å|/˜ù1à0ÃÏtB|);ÄLÄk]ðÚgÌ‹3#`"âe…´Æ1=i¥¼VZ-¯—WLkæUy]cוeëÛÕ]Þ©Úk½¶g䤕՞Ô·”k´í§Žòa¨×h³~¢& ¿•= &CÇ ëêœP‡`±Ê­¨û€g+ô™s$÷~{ê&ßCŽ6šÜûÜw§÷ifðr¢ÜÍ¡$Åic¾9D–jêÅrs°–A#mýˆ7ÇØÊ߻ۤª5ñÙpþÒ çq<Ç—9a.NØ]a´P«rÚž  èÃÀAñ>}(ôÀp`<(D(@ô!ÑET¸PÈPÀèC£]|(„(€ô!Ò€%=œTH)@éC¥€4ZV¼hx.èçz|&¦J-‹ÔÖ²3¡Zõç q,qÊQÊ @Lø(8ÇTb–ð%–A"–Ø;•äœSìKJ%N9T-Ë»‘$èsL%æ^b)JD‰m D°MO-Ã^tå8¥Pus½›¼›òä\ŽYÙQ;"3ùÔ`Æ€_#~ Ñx66£5Ñ… üÏ}ÒÎtŠ]• 2º à³.¥~oUgvȈ-8 (Š ( E*·h‡ «¥QuksAJDì‹%ë9ÓŽ%5‰j–UÖ$­$®$¯$°(±Rq-0H+-imR[*¿T€³ä&Ñ%ÙEáeé5Lµ‘!”˜$ED‡I‰I‹I‹³"ææ(ºLÊLÚLê¼ê3)4•n,ÞI§“R&sRkÒë¤Ø¤Ù¤Ú¤Û¤Ü«v“z£~³‚›ÏFç—nt0ÃF) ÏljiÒhYœúÚu}æ'U+ßíÙp×Wj%Iü€ö3žÂ~áýêjU™¶ ^õqëë#ׇÖÇvPü²Óǯ. º¼P· îá’ë¨/ƒ¯£ƒ_‹Õ—>ú°;ÄyAm¢²|3§á•™ÂöÒƒö¢êð¾U¥;: g}ÈQ,Ó-JÝÑjèô ójÝÕkèô·*v—ðÐaü­ªÝ%=œ±þÞW´oˆ_Waãºë,ßÓq¦LƒrNk®/g[ç»Ûw‚¤\èºóÔ5ºÎ»Î|É=t’¹ÿÔ»F@Á42xl` •¿BÂ¥>¶[ ‡¦Ô€Ðu ®TΣôšcå­òÏ'Étfô$-\¶Íl™Aš²’òÊ-û’õÄñ]1ÉÙ"’ûÌõo,¾¸@ Ó~5ıµ}¶Âb„Ùƒ ‡mm$\1¾µéÝgYð'(v× 8jx¬67[\Û€DKÄ ¬z!P©ÁRW͘2šÏNúÿÀI¯>d`?<,ÁŽô¿Çûfw N¹ë"òÌ'õÖqì­HTº±tÃwc3wbꆻ£(_m7Ô独7P•$ņ,ÈÂ6„€‹ýÞ1öL"Â1™q&QÂ2-F¦‘c‚âÏ=ód)Þ%Š['ÖoöÌóDÁþ˜D\™OŽ\"ެüH-"× L2¢Ù–;žNÛŠŠQÑå²U¿2“¨5‡Wë‰Eò`‚BŸh׿=Žv¡K» ZÚgÐ¢ì± ƒe­Ж„ë“û êÊjŸô>)~Ò|Ý&å×]hÒéD¡¸0ÝŽ¦b ýù"ÄØ %U_j f±è3Ü Ðs“*å‘Ýàv`©'±C4þÈî›ÄhWb5mPX•˜«3ïC,|÷Õ?ï¾y÷æîý›»×OŸ* ëà«Ñ/!ý²{÷ÿÿöÍ‹÷ï_½»[ñ<š'HÛ-þ{þü€AûHeëùÏøÇïñËßqè§Í´ùÃæÏ1›—4÷ðñê†y3¹% j»y OZ†œ‚þ²ÆûCÐðºBo¬<~‡/üo93Ò Ÿ ´7Ñ¥J=c­v›è§'ºâ‘ö4YçÄôDÃË`F788z\ÇË›h³Ó°³¨·OÏ;`U i˜&‡Ǩ'þL§\,®i}™èâÚ‰?ÒÄÉãŠã¤^N†~ˆÖy½ËêÞäD{¨çŽƒÁu7õ¢x9qvÍä’¿ovŠ`ôx¸úT2÷çæøe®¾*™û#Ô·š÷PÝÞíY¢öðWøâæ‹'›çÂoŒ[z…Úk`æÑ oÆ Õ7c:;!8· ㌅iN°^â8áÆ—¨†¿¬‡ñò=j2 ëE. ¯‹<ܼ€÷X2qÝ0Œ ^é[öiÄMsÃÓ¦`§4ˆ%Ömê=áÌBRvé´¤™eî² Øñ %œt_N9£K˜‹‡L?L˜Y¹2?`)ä]ÄaÄò¶¡Á%á.Íua h¹¬ŒmG¤­-„}cbáy´y®›äe³7i¢År™Æ¼Áóó-†1!mÀ2qp,ÖÉ47ð…á b'ä»™‚,€¸u“lvÄ¢š’ŽÃ¸ÛEß"°xʾ–ÑÉàØ®š£ v–Ê‹`Ê?ؘó^'Í?‘' ¢{¾ÝÛ”ÊÍ` ’˜½3Ù®;ã:¸SLþˆ 1±çbú±ê|ƒÛ¹GÑ~}gMoPAs 68)¾:òø^¢†N&¥Þøù}6’Ú§¾Ÿ°glÙÎïaÅfþÕ+AóˆÏÝ]F€C»=P,^Æ>×ÜxdkÖúŒ]Б|lBñ2âÕ™'#C`L'oÕˆE+³í0îpêÏiÆ öÄݧeb1m²“ÎÖçûèÎNrX$ïÖ1¼w⢒ùŽe'Cˆ¿I„XSÜsrÊǬ°û÷ß",¦Ô•è)Z€³(ðÒr‚C{&l0ø>ÓmýìLÁ¸¯ìÁÅž—Þwøà†8‹¶—elƼ-¦TÇÛn>„ÏÀf‹ Õ<«X²âNî åŒíWPcÍ™‘žÚå'0Ÿìe‘;Ì8û÷–³o'»Æ>(ÜüŸØ„rOo«ÜctNП\GÓÙAöÉË9OµoÀxE>XŠˆƒÂÑ=³1ß%#U€9Kp µyk•²°âu8»,£mÔàăD5Y®Î¤`îY–Î.Z=Z=¢ZtÀ‡'/%¸í°Ø.F °ÏFs/7W¥6#x 'Ò•uûvÆr$¿6Yà_IÈ¥Ck°Y´°‡»K”OÛœäОyIî[îyì•SÜ•ÃÙûäÙÁyi=ôß<«Ð|*MÆÅÈ ©†=‰9oÎ4ñ_K°#ÃÖ÷Ë‹ñ£>ë­ º»Vk“3á¹ga‘Æ(#– }þÕœlHådCó¿`™lü-áÆcžù¢Â°?sƉ>ÀëÊã¹ÚÞ JûÑ/ðE6ÛÅIç›ð²•!&vÓ 1} I‡Õ+®–cé5ˆÛÙ²Ôû¥e”{°£hª´ Þ¡ÑT,;yV›?diá¿„-7žñ† ˜‡M··äÙ±iæ _‡,xª`•R5ŸïoÂà-Â{1½²“ø¶åÌH ¶Šk*9Œsµ(£çȶÇÕêê`m]µt½ P…¥Yù`àØv(_]O}!fetóûGÚ» f…þ¤úÔÛìæ,ȹAñÿIÚÎà8Zà^àiñfšÎ°h×ÇŽvFŸ¯"¸Ÿ\\¬vµ¾~ŸÆÏ*­žYÈÍT?`wòÄJoÐfOpc /Ø!JTªÝid÷Þ„‚Ó}3­Ð€íÐò\Ï"–% Íx&íœò ãšË ŽûÍxݸ였ÍHõkM88ÿjrn#X è¸Â|i-5À%ä´=_M)6ëûÙ\ã¬Ü ƒ“p:ý;àkT⺶-Ï‚´òÏj” h™€`+¶öAúÑ-eªqKpÀ¤±²4'€çáàÝÒ'89!; žG5NÈpÀøîe\/²¾{K€åB$ù8œæÂ§5ê a;LxÚ> œ:V`¿ó8–Iæ¸2  — Jtló{V¹2®–ÉC´ÈZ'hß6ciÙ%ÀýÐÜ^p™eömg»»ÖqŒµxÓs*Ž­ä‘Qß VàXtÒÇ—XfàHÞTÝÛp'JssT³•5¼;¥zP1¾›@zÐòçî–Î !«Ûî/áy‡Ã/ÑÂôm—5}W!ÀsO²´@kž9 pa£ÉÆÈ Ø… Èî@Êà^>ý&|e>`Í.>ñ¨¿Ïp^,}œ4÷Ö9§>kãZ­í¯“ JÝ–Rå0&%.q ×Að¸<ÍÙ4Áœ8vR°Ú‰¼¹ƒ ±ÄÈ‘¹i”š8UZ4m¯ÒÚa€£Gøgz ®=V–‡##àFÞ¹;W€­ì\Μcx—XÿÞ()Û¹&ÀQƒß NcÇœCBwx7>B¨k¾¹;@xõN¡âà)3ª¢v‚]øŠ3zÖÁÉ“ØX¤Ì]²ºìÌ+þ²{Å ¦+%5ÍU"¾Ÿ ~OC‹º¨(÷‰4×ýü§^߃¤¹jäžPÁ³3+¨ÌÙ”uO•¶Us9Ë|ÆJõ©U(Šûû¸—+J€Ý6‹åŸDX(J§¢XêÀÇÛ\7àŠe×€¯Í Œ&û7ЯŒlî¡a^oþG(¶º®)hy˜Ë"@¨{«S¦Ô©z2¯®›¶É&[U+úÓ%~eЫéçȳ«)ÝÆÃä`g®˜ëç ÚØ³°tü³#EˆÉ;~¥k]›ŽK!‡æjJf ©hªªÝÜC9õ“vÜá6kì ¥˜ÁÌùÂúb4LgMÖôm©ªÁß„%|çe©0!ÇrŸf{—¾ÒɸR‹ÆJqÕ5œ@=m¾z.À…?~Ú—8&–rõž<ß{È“+— uÇMt[‰qÿœý®ná§‘>×\Œ»Ú`ßí÷qžÏas©¸š›%”›+É 0&‹cî”2ƒÒ+ËÕìfP)Ï÷²…¶/«:gÑgÓú´RÜS Èq©ž|ˆFÝÁ)%mñæžI㳨6¦؈ ,áÙÙg‚vòo3gãóžÓŒj‹%H#à`¹ƒK  7ûíÐà”X¥5HÖÚ©W€,Gg0Ù0ä>"6%Amåý|«á÷»DÍÊv©ðÕÆü§IC^Öè¾[÷/Ѳy—g ~4·’=åó_%<îãŸ6äŸÝô@±K‡ïj ŒfôsuÛŽ ’d‰î H€*R\)'Ácm³¹éIÞO{›åņ·õúÓ‰X.½N¹•¬ÄdXúLhkÎâ…)¯·evun®áŒ·G˽ Ìx¦äâ¸Ah¼XP-NÚ¢0\rŒƒcÔ¶Qv0Çsé˜yrÛ`® 4Ïü&IÿÔ»Þ¡âOç’­q 'äpø/388ß}œ(Ê¢§wðôtÔ€¡F¬¶w˜ö ‚Öf‚x[ªU££L²ž¥ÆÉ}8‡,àŽb$ÉVÂ8[IX8_7wXY}$8"ÓŸáÚª3ùÖuô^*ìðñ]³ö¥,ãd¿£Øq×C;ý ‚ßú?<à>•q}̳c$8ò]Ïg6¾ÀýÅïGi¥åÂpi/á0Uc½(ú„»¯ÿú&úê Wû€!ÁëñõvÐøÞ9è}UFÝ5Ý>Œ÷åçžåß«ÊÊâ£×¹>°~KþѤöص2ZšJß|•–ÜչǮ»#5@·Ñ.D®‹›Sœfv%!ãæü\Ï ð¬¦ÏÛ¿?‡¯ƒ2ÌŠ„[-·óyµmÍ‹„Úð§Ÿå ð^j.ƒß+gª7(j•f•.ê¥-Q™uÿ„••£“EÜr÷8=}CÑصÜýÛYìXY›¹U|\0KÂ\[N©oÙd ŠfPqN„­98þïsÈ^Õ7ïß'?ÀºÙIÒÝ׿ב¯v¡[{LF`£»¹YN]ôàœ"‰ÍÇ |B(Ï€ìË©8²»°ƒîVDÂï!VèÀ«MXgS~ÿº;·!€kPt÷šë€÷ Áy9ˆ±,Ô%ù9 Ãbëµi–Y”Ór!JŸØ¶érÐÕŽËQйF\É, ×Þ¬j_š$ôg~}Ÿ9ÿ‰+XxÐÞ3Á>Y ž5^Œp0–#$Úçân”ÐÓúÈëûù¼ „˜™ÐÅŸ:«y¿LØ'Óü$úTºr*9_ä«tÕ«´îÂÎ5ˬÆfê•ÛÊÀdXH=¶ËQÍ®³o}÷”“Óò´fK sWœœs:3rˆ“¨P‚¶3ÑîUå\¸¡›ütëªaظˆËª C÷„Ýšvr‚SÙ²%¡Dó,æ)ß«åØÌÃIâðî-/ó½*@•7ðVb§‘«£]߯ZÖü<ìm&.x×ø¥òÄÞUà¥_ò‘i}çYlœ‡I7±Ïƒ#©ßï»ò]»áÖçàh‰Í*ŒFvÆãè+ºyïê—"bm%¸ŠXàa JÆ *À'Ÿ§Í&;4CÕF×çÁ¹XÇFoD¯Ör«“ŠÓSS „t ËHuÎ<ú `•ÇŒñg÷T zóìMÙáìà”,ñ° ’óµÓÀÊ)qÆvpË:/ñý€³¬ÚÊØøHœeëa€ ßùWÉ ‡ä].CÔEBÐÕf‚c)u®5 ¼”Í=•—-v¹'/ÀÛ¸µî3úÇ@1U“0ù»™Þêq¨ò¦Ù6¾XÐÀ¹#õ\mFžÏtkr ‘Ùõy µ¸Bñ¬–Á݃È™0 @Ö7ɪÛ>¢„¼Ì³{b‘D¿©ªp+õ6„ñ¾C)É–ô4ÐÖ`‡·]ßc½ã÷wÞ<Šã÷dZSõ¥lÉ¢QsqôÁ³crˆ™‚'FšÝh™ú^…ƒö`0fa±P25öÖ_[,“QfyvB”ECQ7–…Ëì¸Éô#›Ô¨ÁZÑ8@b¯ ‹—{è^ m¥òëgö2ʘÄëûý¨–¼ûpüAÿçR§SNžÅÏR­ÞtkÑ9÷½©_ò~Ѷ]¶³‰Õ¨.À½)Åð`-^¶Q×äøëw¬O¯ Ä> h<ü÷T†L¿Ì€Oûu3¨jÊ•TÞäYñ(W­=ÊüõTÉo9r¼be öž2Ãl Á¹§ ´;®“¬½l±eæ[õeÊÔˆŒ‰Î€ûY®‘=4FÅõÜ<øa!øu4G÷hz’`¬*æ”¶¡aê•/H!hbV¸ÚòVqp ‚¶ üÉB‘ x4æë4.›š‰y žß4€|­Î)y’²Æbåã°13wÕ^(¥‹°È¥cÖÍ^!»V!C×/öM³óÓ¾xæ ;gÉùLÖŠ‡NÔIÀwï<Û¥FÜðVÍ}¡­gà°á`çÙ¡e`Ñ긇Lj”DÐ~¬y éí¹R9޵Ǘ´Ë;‘; ¿ß—óé,PF{^e¡úÞÜÚry¶QÃàd5‚ƒ4€ ê0_mž/ÿ^Œ‚´+ù½X³ÆZ^"Ñ«¿DÀ©‡™­*Œ:emäÁ5Øò¾Þsçõ£(Y~Ün$Û¾W¶áL9b'«]Fisù*H'(Ÿ0Ò?šjH@xígm³‹ö¨·_ª/> G÷ÎÛPRfsËòGÐêŽzµ£™A•ïêMevï^ßož=Ù\p+%™œ­x.µà»ã](RÌ$?; ©£ea`¤ò.@£¢0Y(ìd÷ö'a öLÙ@yº ¨—Îþ–¾›³$t±¡ÁPÑyþ¦Ùù©C±ñS0F’à™3Ÿ†mi'ˆìòi³Šºf0dÞ×´+˧àÕCØ\ý$˜ŒjîŠæ÷Ne¶“<ÛŽ­TLØUÎ¥¢ OMždj{ÃÞã0ž˜ñéê XÓQPl7_Œh¨³œ½ e¸àÁ m jãå÷:6¥ò˜Ñê½¼R©ƒ÷¾ï…u×5f‚U‡‰Ç§J‚«­´Úk0ÖXì²UÎN™ÆÙï® ÝéÁ*udð"ü¹¬‹¦`lÝÛ˜îhÒÃËÖŠýàè- ´‘VmUM›ý}-Mç§´DÓ'5:HŽÎ‚œIvöh^ï;m‚ʾݽ|BÞ6OÊxœˆ×äe9çæÊ³T­F”«1XX>©ýI¸«æ{‹¿`U7$|_ Vi&iÂ0Î*Û–ø²è#2À'ylp±‡õýgàˆgì·~Ú`íÂä^ê)âhSŸúÄÁx,¥TÈXu‚ p]ƶ·ñ$ýº2>vÿíCÊ(”‹êÖC_u„u#ù¯+’úS«*»±ìލ–HÅ³íº›=j‚•v_ç!e\k_ts “œÂð«è aŒ4ŽÁÞóO€"¾AÙè°¤4ÇÝ0ÝOŒœÝ'k pß-¯›7,`mÛA8šêZiÝo Ã*àºìîTïPmOö¸Í¶ qFžt-ë´+ÑíYGÇ{ÄA廆î4€Ž½8@ßýÜ÷ ¶¾-ëÁ0 %«ºVu÷ÙgˆPäÌž5µkWW×e-ŒÃleè‘Y‚%ÚÂÏÖ]@³kuž¦9­2fx?XÇbs§@QÕÚ·±! ðk¤ÒðZÊÕÜU%omϵÓÒóÚƒnâ6bkóóý¡0´à¸X ÁNÐuƒ Hž.³®,%t³åò˜°#ÉBXF׌†21q­˜Ÿ»«ðœƒ7‰îR²C½A[˜ ¡1:¸Ž:çYË|Ý¥h¦^õ"ਲ਼;¼©‡0P%×`*F-f×glºjÝábuœq‰½q ò& dUUQPderYg¯½¦p×ÒV˜3m³°oó¬-L¦ÃAJ ÍögÌãt–à K@A/„„3>äé ¸9âB¥iXe˜‚½\± Mæ¬n‹–âÒîL`½ÝJK%‚!Ú(̶9LÕe='ZE@Ìïm˜Gm¹„–£Z¬¸Ã\´ŠlÝ–I”8hs˜ÎÝefQ”(œT0"0Yûg÷€C%zvÙâ­B8ô=4B]{”¨„ÆDYìÉörÒ91:k`j1E8 ¢—Im7&RU@ŒžT.çÀËtàm© Œhœ+‚ª Û"ä›É PÚ¦î3B`+‘; 'Ó]и¥šªIˆà/7ÿª#aJ˜Áà΄UQ{G•‹ÊM3eÌZÆJC€¢Oàâ)mrq™¶¡ Díè‡"x¦¡ANvRÝ®Côl05GÇ`qÒÓ lš€JÖ3J “7M½) :¢ÊU6p\,Á2f X¶Ú—ƒ–ië¤?öZ,‚vzðv´j2bD†‚;\K>Žá†Ö=Á†Â]1Azå÷ŽÌ[* ¼ðƒPD!Ðwe&€éöÖ|QñÅ@Ý +¯“÷E ð[­Ò)¦y=ðlFFQ&ÇC#ÍÈÈblŽ¡ ˆEáÔ ¢#™³$ e‘e7ºKl…¥ñ[­Ò(¶¿oa©´ng“8ì-°Êê (\Ïg©}iÝr˰`™£Ua;À¬l ¦M9=øy‹ËÙ²’1(`P9Ä« ›`dOàúd¨hºÈ!\‹Y+œ¶Ù‚-Ì·„èéµ´P¦ƒ=ªQvƒÌ¦ »®ëŒ;o„…pÜL ˆÎ*u÷°z/^eƒþA†Ô™°v¸ñª—§AŽLtžbÒèÏÌmIѺ^÷›8-6`ZKíô`Ï4²Œ‘‡Á ægƒ»Ð7¨£;ƒA{tާ»‡È¹Ÿß|õäÛöÃoï_?ýøù?oÿøòÓ§7ï|úæÇw÷ð£ç÷÷/Ïo^Ÿz"|*oÜé þ½øéæ3~ø“ÿ½ø‚_~‡‡úé”N8ýíïîôZ,ÿ¤cÓÿgÂÔ•• ¾»„±z’ˆ¯»ùþ5²^½ñ|w#5_22ЬƒÈD1oxˆ}P¤÷7ÊÝ0båCزÙ{K5§+BP)ÓǪ¨Ì{•5Ljörô‰DKªMûaðSÖ@n4<–gpÅ(µ|Ô«>ñJǪB°qs ·5UÒ!„¥ô¢ÚXKœ±Z-k\Óä »y¬UP³Ö3))ˆŒŸ({»g8È+9¼ÈÐRú‹½^Ëù(äcYØ…^—ˆσeh…Ð÷:hµóÖ®ë`›ÒXRAx½Ë§ïë»ÙI_E 8ÕÀ‹Û¨ßàªB…1ûqk1«†UÜò˜ÃŽDà—ê#ÚlÁÉbU»yÝ@F`D ,¸Û`”–C½M×-09Ǹ³ûÁvL–[f–ËëtqöÈ·BcÖ³¬Î‘G”w΃ÊãBH:?_±£@AG™ åh…rÊõn„»ÌzÊí¢¯Ÿ±Ss¨Ôc)Ô:Ç\*…”{oýoGJzìÉo–»I"”±Õ…“ã3'=nÈ1éqßP$ß yƒewž,&k*)ÞÕ×q¬(Ôy‚¥`(Våc¹çGÅs² ƤÍnˆ/aߨyhìcò×W&=ñùÆŸž|àݹXYCò/aO¸H ›ÎÁËõzM˜àüe5s7†£-VW³y E ,L’ZvzŸ«%"0Ðæ£Ýl·ã.¯×9}õÃ×O>~úæÝ«Oïþ}ÿòã—Ó¯=úýãÓ×ßúøîþÇÓ£ïß¾üðæé¿ÞÜ¿Æò{ûç/Þ<>ýJŒžþW£o¿Q“ßàŸìɲ|C9âg­1É2 êã!¡)ßóFÀ’«Î!KÏ—°ÈN­%Ô5Gž†6Ð,…b“|€vO)ŽJÚm+´n,—N'fß·k28+{¿p*õŸã!ÕÁ v³Ý»¼^g@®It@–, eŒ¹k5£P)²$,ÅW¾=àù÷[¹&ж1hXìñ{?v¼–@—ÆHÛm±×Ж¯ dê`ÁØ«ÞÙ ¤Wéê”êeZíf»ky½Î3hì' ‡Ô ºÁ*M.–B°#¾>ööùwá ) µt-¡š:WB/CÒÓðÓmÉãü›%†eùàrü¼åÏ`<‰0»pŠœ”¨Ëc}ß@ËCÝl·C-¯× `þÎÁ¿a­ãAKò=¸ï?›`ÙЦ‚EC‚®´$DøX™}-¡¸x°•šb÷º@ `MEeãæzºpŠœô0óÇ ´ü1ØÝvkózÌÓ‡µ58Ö¡—ŠìòÇÛÐ,|[xúL Á ”#6&0•±£…œ”j”¤]5þxÛŠÕï´…âÁëÝ€ÁØÝF’—Wp û!‚–A‹v³]çÚ¼^å€)ô’CY)ŽÑçAlüÈ dP‰3ƒX2|åf n˜æœ@:“ãÒ²‘:•ZSþ`+*Âçƒ×2‚YÄËmW9]zmts†X-ƒíf»Îµy½Êfw¬;cfÐC“f~oÛ µ©ocoq‹\ÀFé„^¦F™[­Œ?£ö´ RÓî¶Ð3Å$Ãôºƒ#s`0ˆ|µ4§ ;}&Ð h ´`7Ûu¬åô*Ì_MA ttÌ>‘¼£­]ÄÆ³¹Äoi&Ðà*lÎóS5yŽÛ1Hɽö Acê¥Õ|°D;x] #˜70á$cèÒ«Ð÷|@1˟ź,÷³N—W üy¥‚YZ)“¤q—Ì´•doÕîgÖ šïì«-&k1gUçÊŽMuCн[& ùƒËê×íõ…æ2MÍç*™õuÅ,cç^\ë˜Óåñìÿ';ò¿±óçà瘨ãß‹/ø?^ߔӣǧ…‚ú è;¡ï¡È€u·­bdyòF§ä6ÇöR/N=áH%ÝÖ8†::_ÂIFzõZP;QÉ(Z7„±Ê ^‹±nàÈiuJ`.l+c9x] E ŒÏz%^Ë+|õµ]F`àp°¢Ým×q—×ëŒAòK4Q•¦Ódjv¦qƒQE<xI&E)ªrp‚äbÛ@;*Ïl³”pß\n¿­oO8‰þhñtáRŠÞ©î]Ÿ7Ю¡n¶ëD›×ëÓÿ=„·}vŒ?äÚfî FÐÍk vp“(!xKüõ ´ô•–ýÁ6£lŽN¯ d–AƒA·9–Waëï+ÕÁŒv³Ýε¼^çàé!\UΕK[ÖS¸`D]‚¥0ÕÊ´€ÖX øwÐRˆ‹?Úb-‡ž^È,…ƒÑ’|/¯B@X/#0ÐRÈh7Ûí\ËëϤW[r!¼Êž`K|¡¿¹Cî•àH £U©ä·‹éV>5xb‰ä?Òt@÷®wСÒðóÜÛ”m#é‚  £! Ì Úbe.W옋ÕÀ™¾Úå^Lóg¤×œ³Éý4Yke9Ö]G–H¾NLØ+Ç% `9ô¸Žš¼Gg}WòYKÉ3™ýÚ]¬Œéžhc5P3€‚€ÅÞVcío.:,'eëb­.ÇzhðÄÿpSý9qR –c C7À;䳡 it±uÜFÚX Ô   `²J¿î¬r…r¥-¡ ²u±V—c=4xb‰F iUŸP œ—‚€¥ÖV²¦Ú®ÐµñE£)÷®Â‹›`UÎÃ%O7;O Ú(†ÕÓ+"‡fYk£ò‘c<( ¼~ï ¦\qó@z»ºø¿‚«{hª.ÖµX†lßÿñG_Ÿù£ßÝÑÜãÿl¸ÊƒÊè~Ë ,s5õ7¢6…<÷½çÂÎcE¹Æ ÀKØFãnÑ=¶¥w°]`5ðf,k˜L”×UÆ%¥{ç~¿²õ±V®±rý`,º$í endstream endobj 226 0 obj << /Filter [/FlateDecode] /Length 9253 >> stream H‰´W»®,¹ ü‚óÚÁ6DQÏÐ_àÈðæk8Y àÄÿޔĩîûŒ»wn]ªT,©)ò¢–èÕ"·+S+¯ß¾þþ®J­æ—üY+§$?"¥6p Lüúýë—Úk¹R q­Nùõ>á®ÐK} °^r ]©ôv‰,äÀßA£‹X–±-^I€“Õ@(X—«†þ:H9_Ì¥ŸÎõ&ÖÇZ¶›ôéÀò¯ô<\’s_.G£ÊmûWsáµ:¶·€ûU;©}=’ÚBoªžsóàÊ^έ×tÆJú½Ä~:L÷‡ý€EI“<R±$—˜OaŸŠõ±–•±>Pÿj/­‰]ÂÞô†Î‰äJ¨õ Ièçr*Mý3TŽw,`»‚x¿®ONÛÀ˜bt L¹å3V\I ‚ÕK Z®–9¿R1¥6=Ö-à2p‹õ±––±>Pÿ¦ë"žôuJ¡ŒëBÂ>ŽòÍÏÅA>ÿíà~‘”õÕϯmÿ(æì@øGÔâ+`ð¬T \äW² (•S@¨j}¬åe¬OÔAAç,¹®"KÙÇqRL………Ò¬*réY6zßàvµJ¤Ê_Ûr p@ áWò‘ÖÆgì¸Baee¬Tû8Ð;öi‘{'uë  „XkiéÃ5p#ñ¬|£úÒô/Ðøæá_—µV7y‹¶€å]*)«òE½A¥u›¿Ä=ßbûÕüÛ¬ªjä×É*…¿”vS  „ZëÓݬ–ƒ¹/ãâv0(J_óï¸êãi™«kxD –“ÌRSêz-+8Xkê„Ýb¥à8¸Y T 0˜Òv¬E^ɘn „ƒP{ÄZº›õá:XS\W.¶>Ë_¨a=Ì£¾¦´-L5êÎûz”¥jêNYJªnϵ±äZýµ~ĶÄü`507ËßÐÆñurJ¹â b±ZX˪}ƒe»,ž‰WÃ-}G¶_U.犟Wûý€#^-ÑVˆç•Sð‡¸<†ôˆåÈñÁjàùÍm¸¤c­=> ËM«EZRŽòfÀpì/_á%oþ÷ë¿ä/òÇß¾Êë|ýúׯ ðçÑZÇ2ª_<ÌÖÐì ¿çò8ÂâÅ\¶fœälÓß'œÆÃžWŸÑ®ÞfK%ÝŸt 3‹>Z´œ ÷x±ì~‹eqÝX ´Aá„­'1ÖÑþî§€ë™Új]¬K×õO>Udu«Eõ'2öK:¤õ öQ™Û2e•ŸScÂÀS¿Åò#Å“ÕKü**µ×Á9š¿ Ë÷þ—}[«‹uYmÒGþŸÌ)rHD°ž¥ßR÷ –E?WQ$““ÞÉcUõ)¥æÀ•=]•×­t±q?Æê@Uûíáèm½Æ*žô1“ Â?Uëb]^Æúôà£IE–³túpÊcú¾¡òXVVcJe™ÂT’ÊçDì@¨ýˆ•Ï/Ör:lm¿?EDZÆ\ã”ì)¬áÍöûT«‹uIë#ÿOæYœ;¼§íþ]µ™ðI‡†ò'KÙ°R¾Ç’4~¡Ÿ¬T \¯YÍOÖrqÐÚ(¡Öb]^Æúôà£9E–Cµ@“x  õ/QUWr€ÒÀ°a+}yÄ2zoDŽë“è¤<ÀÝ :Tò¬ £ÀYüãí‹€r:…ªú—JLË“Ù;Oõ)…nÜKÔû)ƒ/Å;¥ssx툧?Ie;vïTèŽ=Rr­Ó-ùOfYÛ kÛB¶ƒ¥0ÄŒ/7Ç®Ýt •‡3‘aÕØo±QÚÙÖo¬ª–L;ì©4ÎÚM€‚°b{¤¥¤ß9ðÁ„2÷ ¹bFâý€«®à?Þ…[®‘Öx’®­ð)w§¤v2zÌU-ƒåO5œÒ4Ëí¸m¯à6O•ºXKɱ>Òÿùˆ²Þ§LúÀõò6°ÏÍùHþƒÙd74ö!´íƒkÃVóã_§”±w´¹DþÒ@å[,]ó½?Yp(Á5Fœ€±–ÜãCÁ·[­‹µ¼6ëÃÿ8›Ì#F¹“Û4ƒs84+·îÐzÝâòÉô˜DPŸbkóá1ŽÑØ­ÇÈ6Sl­Üª\$´;Â[ŽóNÛ~4‚L‚2âV.Íî¶ p—V»;4µ¬=`Jëóù¥³—~¾Æÿn±Ib{¼±¨ `7`y6¥óz¬£¹ã}Zªàvp©õ±–—c}xðó!d®–ÆPjÜî£Ó*ê`aVWÆq@¿ôH„ƒ%`¶Û±2Úövg5PÀAÀ’k[mŸ±Žþ®åS€bðOµºHKÊQ> ø`™Ë{‹ÚÈŽ›þ¾¡ý¢ìkAïj‹¨‡Í‚yI«•‹”¯¯×xã4°¹ÏÏкæÒ“TÚ»ñQùíÚÞ©Pi)9Î{ö?ŸBæ6ÄhÍ"±>*Üs@™«Ñ¾èÒU|*Ü÷bñËûqt¬œ @`©¸Ÿ_'k¹Z w Â@¨u±–—c}xðÑ"Ëcmcäön ÞÕšÔ«˜ Š·´Ñšÿ-LnN/tÐyhn¼/®Âòt묇œƒtnW·iÿ¦½ZVö:Žàä¾MÀ†ð{î—deãMÈ&àdŒ"bA~Åyá·OÍ™®éž9±­Ï& TꯦºÎL_D¡‰ÕL á-ëgÖü:…Âõ©pýØ`Ó3Z¼‹)/ýžÝò§~tÂÞÛq÷óÉjÁKÍ#¬saÅ\\s;H©ÖÄj^†õæÁ3ëÇèM5ÊÐÕÛêº ·µ*M¥Y+RbÉ£¬(Hsÿ±­ç|°*( H pñkB!+ª~HáP àr°Übmº‹õæÁS[ÈU!<îZXnÚ5ýK÷u9y|nÁ€t]³ßbQtÃÁª (Ðo@XÖ@C:*W¨‡é ÅšX›-Io çÐüÓ‹Èö0”/Ûí©ñ³õ’xÇSdÁæî) ³ö½Õ[,ªP>X-8ð÷ŠVXüØI·ÛH.Û —ZsÇ4­Åz:0w‘ßÿã‹/?|üúÝ›ïþóþÛ?>þ賿|þøâ›Þ½ÿ×ã³o¾ûöû·_ýûíûþõÛßýíÇïß~þøÃúò'ƒþüõ ùþüì¶ó÷ûúóïÞ}j¸p©y³¼îprb@ü5•k±ÁòÐb;g}ß Q:]ÖÆ¦—šbÝY4уÊ÷þØX#þÛ×¶+ x¨ZkÒUÖ»OnGб$޶­‹Æh,´èE¦Œ*”Z¢™A{$¤:_¼!4ˆœüæwœÆÒâÃ&\l7Ê»=š ?ŸÈ´±+ÃyÏüÓw¢ë×=p§ éõ€ÇJáçEÁ6ëëåR~ £ MýÍUo@Z¥=ilÃvô;«EÁ$P¸¿\yc…+䛂ÓÁ¥ÖÆj^Êz÷à‰µèúT9éY£Š… 4‚@ ‹‹bKª‘Wà’¢ - u„)X%ýÎi@9ŸÆjÐs}NÜŸÚFË·§¤}¢ÔÆjNÊyÏÿÓ7£ëŒwì÷OQ¬e)1¯·9 gÔÚ<Íëc^ë¤y>ñþ1–8Œ;«§ºGËAý±‘^ïÏå]Aú'bm¬¦¥¬7žX‹®_Wר¤K Ë@¨$a}j|i1¥×Jý¾×f@87@½ÕƒÓ€rþ*þƒ\÷ý‹»jÍÒ;ôt§{ªÔÄjNÊyÏÿÓ¤yÎZÚ0ãFqOá‚-²ÑÖâ¥&†Ðé^ µpêïk:רQ½Ð(wVŠ‚U?FKÄXýØY¹±n t±ÝÔšXÍ˰Þ<øôiV_ÝC\MËA5 ·±ÌÎxÐð b¢° ¬u¼®O88 (çëõeQ ¡ñcU™s*6žãty:•šØfÖ³ÅyËÿ‰åhžß¸²¦Z8·XxØ-Zs ,ŠšÚS2 (‰þ›ØÒz¿±*x)X nMJ½²\=HªÝb5/ÃzxðËëÑüÂÍqM z½Á9¥.'àCñ‘9VÔƒ ØRθ˜k¿*xÎ_+ìÇðk)·‡À³äÏ)s¿à+!rÞ“ÿÍ«ÑW¿}5úAfö_½ yg^˜.C £—&7w¯çrˆùóÛu•\åU"xë2žfÊGl“¼ §e]à¶ ƒ:ÉccE“ôÞÇ]ÁI°ÔšX“®²Þ=˜å÷ t>7ŸmCR1.F®Ø&ª8J’}$•å Z•Šq°¥aMh\Rë©€FArý±‘Æk‰é»‚4PÄšX“í"½;ðÔ>4쌬Zcì}=`<ÝîÅ>ŒmuZâ\o¢¾ 8Õc háŒ7¡¤ŠÉù´Ÿ0mrÕ),¹Jã&€ í±&Öd¥¬wžÛ†p"/mùGtû”Ä@‡1¯ONËÀ[2 ĺSŽX<ÀXÃÁªà°*€ ˜]sÌt, M¾À@ŠXkÒRÖ›ϬCnŒ»^^¿ÃóŸþ%àRŠ)8Y1\[þõœŠé_/>±—¢ÔƒUAQ@  ™ С9í N‚¥ÖÆj^†õæÁS~Ž.)ól©, ·Ñ“¼XØÒœ}1ÚD)K8ÕÖ€3ºæd‹+TyÛ«‚¢`ÝáÊ;Ø;«nø6á ¤X«i)éÍgv¢Q**£æ[ZþF_Â(JkÌbî:ýó­eÒ¿’¼?b1Óôy+ «‚¢€ »ØoÉŠM¡”v(R­‰µé.Ö›ÏìDãCõè9F:i"¸ð[ã.ÉôÛºÑå`@Л?cq„¯ñ`UP@áV,Yë\švÒAªÝb5ÝÅzó੽häÖÔ½î E{|ÃWJVæé)„¤ÕGßÛ‰ÛÐn” æuÿ,|æU#gÓûqúÄøsê´‘š¡Üsç~j‚ãþTØs78°»AÚÚ„|Z¯äÅ€ëcç^o±5ó V÷÷¶à"«ËÆ:ÞØ)``ü¹jÕHMÊPÌmè—v•_¹¦´Žú*s«YS œFSÏC:-&c٘¢ü`t3à›‹ ½àýž±.pòY¬ ´kŠ…×QÃ9?'?_ç\öM­6V³RÒ3ÿ'v”qJ/‘mÀ㊾0æ“ù\[GQ Næ¾Bõ%^óAº×¹›V#0¬Éö'/ÝÁÂÈ4žô±m N‚¥ÖÆj^†õæÁ3[ÊøyÅ‘N€Fúz ý%Ö(â[ˆÑ—$òklÍ€4Pf‹ç—CÚI›Ç¯ç/(šk*ý±q"{ïBÞÏ'HûD«Õ¤ ë™ÿ;Êøqjl¸c¹G¸²ˆ}5qD¡fùÃ^ Hû0¬ú#›oïõ`UP€p}¹ªùÎZƬÝÒ@ª5±š—a½yðÌŽ2~R’÷ÏqG[ô^,%HQÌŽöı;;ú‡­ ÐkFæÙ%wJ :Ìí- p¿;g±ÍƒÇÛžiÆ¿|ÄbWí!¬ Š(ŒxV:²âÑ¢ ¤Tkbmº‹õæÁûÉuÍK ¬2ËŸ…‘H© +‚|ªÐY}öÝ€4‹D>b‹™íkÙ¾Üõ,xîg–ö”Ò@ŠÝb5-’Þxf;¹>T`I(=¤e n"ÎWVÀä8(…ƒ€!çd@ê÷®ô#vt½ÒVE T‡‡‘µj[Puo!T»Åjº†õðàç×”ëÄùqZÓ[§pŠ«m`¼â‰,Äø«Lgu/Ú±÷{lŠìz†UÁKÁÊyÁ¨ÿ“´­/©çl¿¤j¤æ¤ŒGúÿß%¥áµu_Í€þzÀh²ƒc€ã]9Œ¹9…+‰†Á­\‘à•o‹k¢4±i–r°*h—×ëy=6VL~ð*ï N‚¥ÖÆj^†õæÁ3KJ¥¡Ê#E?¯ËAÂcØœG¡©f—evnÝ‹þ”»§þ„¡ œ±ñÅû^VE?a<Ò9§+)zÇÊ HE¬Õ´”ôæÀ3{ ~]ÛAŒ½-ÿc‡ì¼€¥%™œñysêÑ€´/ùkw²±Ø|{¬;©br>Ý#ŒD›\àE K0›ø]AÚ'bm¬feXo<µ¥àç •[ÚA^öÄY|¥¾Öé‰LÎP_bŠÑ½R\Ù#±ö–ZJ¯ÃéAF”~$ßú~:ÁåÝjc5%Ãz$ÿ̆‚ß_djó…óµ1á…Ì—›³°ŽYwª¯¡gÒ<”Ûÿ²_mËmãHô òzIU¦*ŽA$É“/‰+5ΥʙÙ}sÑmq#“ZŠJìüÌ~ÌþØ6. €TA›‰$'|ˆ+uÔhöi4ºOg=[E@²žWšÐ‹Àô¡SEèùå`@LëÙ:ZÎéJ6ÚOà8¡•Œì·+pfWê­}±mÜ<âÜa:xXÏ’˜w-¡v¢$ëzô1¯k9F.Ø#Ð'45¨ŽÞç ˆÉÃH=[GÉóºB“EÎ'ÊQñr‚×Á0Œ’.‹R\:(Áô Â3Äü1BDϪ‡sÞóê@-_ 3©Òº^A<Æ¢m#2ÖÖ§k½®ä`“Ev‰8± Imœe?'Ĩ·4KðùÁÄ ¦,KVlã4â=¯>¨"@Ë ,Cè•[ÍìEÀ=}íEëÙ:^ž×•l´¢È«b¸!qB¸M!Âð)Ž•)L©(ƘŒb¸° m¡YÅvC1Nf¾çœ€buJ‘œE½ ˆ t2Ú³ud­×• ¬YP¤k–áR …iSæà$£Xß4ÊÌí°”‚.¥ˆ!G,ŠVm .žWª¬ s–açp^Eºò}ẞ‹ÔÚ9Fž¿ûý$Í¿cIÉRyþŠpÛƒaÎ&J¤dRŒE¨šUÝe JЃß,†ÁÓŽ…R"=wó—–åÅUy9—Rðé!å¾m0}ÜéY:2žËâª8U6×pË´BØæa!å+7Éc‚¡ff‚" ì˜@š©)áÛR°E•d½:ÐD€9DF*¨²QÇ«~±»@‚˜E­oëxy^Wr°É‚’)ùn.&9µDt ´Ì KMVäu˜øY3Ä ² ÷>kK!¼ëÕ&Ì Â™Ì%u¼JíÇ“n³ùÓ±z–Ž”çr%í'pœ}}\Uûm Î3é‹…0Ú[Dïž¹1}©icž-AEÏ«¹÷šé­µëÄŸ|VÝ ˆùÃ`=[GËóÚÏÀ&[ |F0ŽV›yÓEB°ûʼn{Õ©0á£"6 æg‚õlcoÈ[¯>¨"°ÀÎXÈ2êzmÇI?Úšh=[ÇËóº’ƒö8Î v )Æm l?“Äe)6ñT`Q)P‡Ï¼yamcx ¨|lJ¤¾ŽéCF»Y=Ÿr¹Ð[š÷}Úô™X=[ÇÉóºÂ“EN§ EÝ–â¢Ò½ Bn¾b ãÏR‘x æf‚÷l¡~8‹{^}PE`+ØÀNy^3Z¼{3ˆÑz¶Ž—çu%›,*rÞK1iÖ;ƒÌíR)cŠˆQÔ)cØÀ9K©bVm#žD=¯4 §‘Õ,èfe´mM´ž­O×z]ÉÁF‹Šê™y°tR›B„¹›¡ ´ŠóJÎqM@PÊ<3òˆ®Ø2žðžWšÜ œ¦8±Ð©ìa4ë`@Ì ëÙúlÑéJdµ²þú¶Ò¹ »´9:+^[dº4Ô8‹±u»UÈš[MçÙ‚þM{^}P€çšAŠG]§jÄ hÓf‚íÔ˜£e½ö3 –Ç—‡GM{ZŽÛ²®òæ~ô;@OþømtxÑ6eu3zr1ÍçÅñ¬¨&ïòvúþ~^ü6z*޾jôêT›<‡ß\‰þìÄmH_¾ËÞNóä-n&ªnn{°Ðë,€qò,#™RšÑ351dmn(+˜@‰»¶)Œnµ–ñê&‚“GvÍZÁç]˜¼0‘€‚¥œéÉ=f%0ªÀäÚRèÛQÌ»^Ø l5cçP 2 xYTé; ’˜@Ç¿ÅLè-¦0€¡#*"‰”ˆJ̬æ§)SU . ókt‰PENå,6MW0xzoˆhD…!-LÓ•ì„ά™U†÷¸I„/.Á*Oõ§R,E:èÊW–¨}â‹#@ Ê—ê.Ñ­XƒiÂT&3\L¾WïüDp£Z*P¹–Û’Äži8‰)59‹81QB˜I:1Û‚”ø6éð©– 1l&LÑPë@bÔ²¹IùìR†‹ÊE™†,Vs.-%‚™÷“pý~äf¦:®¬Å„fæ&ÍLùC™KƒæìÊ™¤L¦7!¦ªôÔLD¨*$¨)¨ÓUOÝ“T?u(?¡Ó Dã8eš(K2SG)Õ[x’[ÑØ$•E®þé¢þ/ !‚PDø¾Tœ|ù²ÎUs¶Í>>zÅ/_T“ãf¹˜B‹n‹¦’`"ÁË7uõúx ­üà@ÃÇÅMYù?˜Éý˜½º<ºº)®gùxÚäU[¼.Û‹ñT6ê2 eYN̓¯¶ ¦UV; ÄB‰,ÚÉiñ±Ìe@Á”º‡BÊ÷+¢opøòÓq‘_gùr±(óêX×ä·ƒþÆìëÝLÂþd?œHx¿Ÿì¢á××׋¢=þ [Û&ízãž¶£gÿVÝÖzð3©–åb1®guóû§iÙáýù~¶Æ¸Ó˜•õÖËl1/Æo—kÞÃðzv©’àŠ[6×ù¸¸ç›^çÐö÷Â`rP¨ËYÞœÔÕ¢aNpåàöI’MY¾¸›×Uñ°tÒnrœ£pmµ iu‘ ¸„Ë«]¨«º —ÏÁ\>ïPƒ¼«Ëª=—s=@‡ü.ÌS=7ââé¡‹zÙŒ‹£Ù|š‡OWºÁx¥ƒÚ­}WAëâsLêyÑäm½Fÿy|Üu¥“úv^/ôvñPšAð`øÀ‚¯Bšn½´Â‰¬Q«>‘hŸÅô‡8œH¼×D‡ˇ0[öXÎÊö]^®[LÞ´ÔÊæ¬ÉçÓrü³Ì̼)Ûémц3úegçúØ÷eìÖ×׋¢=ž-×\Òw”éŽ.òuÑÜ2“HmÚÆ»øqìèãå¬-šµß><-®GÏ^üuöRØ£&ò8´$§Ey3 Ñh¾}Q¸§Oå¤S2ÖÛ_<‚ùÜs¹Ûk÷Á<îwÀãèÕåÑl>Í/ƒ÷r²¶M(›­S©¯þUŒÛãzYM ¶ãzMõ›˜¶‹à»êœ YûÒ&ÛesµœÕ¸M>˜üÎXýlûyF’PNWù¢xÙÿ^Âņ7œÞ©­3¬ê‹¶lÇk¦–c¹PÖïËYþP;g¶Î†R«–·oÇmþqfþ‘‰æ÷~;y(Ì&Ý¢¬ÖÜag}¡;¨±‹zÙŒ‹³&ŸOËñ[ʶLj]|ŽI=/š¼­›`>îÀÎ^ÍI};¯e;l{ö7l{ö·õm ÛÞ/±í]79HÄÙ›º\ ûÞÞï{Ѱî=ìu/¸­ëÞž6‹aÝÖ½aÝÛ»u„ëi1­Šê2þû•ëÑsÁä›|R.Ãg šÍìï 5)gy,·bC{]7ói=«oöÝ-ý•;Z0ù¡£ mèh{ÞÑ^4õ¤,šA¦ Mmÿ›ZÅ:ô´¡§÷´A¨ =mèiCO{ø=í,_þ÷?‹ñ´hþQ”ãégù§*šKö+w¸`ò‹vrú?öËe9m ïÒM—t€6íLº ô¶ÈL> stream H‰ì—ÑnÛ:†Ÿ ïà›NÓÆvt±¹ŠcÄ(vu¶8wMb¶©C‘n¼Ï¶wûb+Ëv,'»Õ/&%'š¨ñLÄ3óÏÌÛÎïoN.a‹ÎßÞ\t~{H¤Ò½ã3!#Cêmþy¿sòQÙígËov‘Òò³ßzo;'ÿT‚ç¿›X#Ôý®ÝœI·2ü^a©XRæ‡XšæÇúcü›üƒü`'CÁ­ÐŠ™'Çd6ÿKSg){û« ]ä9m4Hé‰D»ŒP¡pžÂÖ;öÊ¢D†2'+¬KPsï\í §‘aéLp<\5¢Šag YœH§d˜ÕæÚ:ü¾?Dï'“ŸŸ8¦+¤:vYe??íOÐX;Ãî¬ÑJÝðÞ‰ ï8HÃ{g–w’™[w›×þªÖåzmGÓ:«ÏÞ”®«ã8#;Ί.e:cK×@“¹§å¶h:¸t´ ‡;@‹!6Œ[&o´ÈM†•3˜›7yæºsfê$)Sµ¥ëO´3œ«¤ž‘ÞwÏQ”)ËèÚП.í¦zâåP鉖ÏPʬ°¾rùnqÇÇÿ/¥Ê%·¹äÌk •]‚µ–Ei‹¼',ÿSÇ$ì½Nwýõ¿žƒ"Ox&n̽cr׌3ytí¬~£nË,z¥¥6ãM¶E1öÙÔÚ’kG8:á#E4¤¹`ËÕ˜)ÊNÁ*iÄ\– ¦–¹Ù¢Rz'ªhÑ¥,M½gÙ;x>ð¡< 1‰ßÆqFö˜En¶¶´ÔUôZ$û§›Pý1éH´+¤K²åwlET{ÜnúœPu¾-‰NÉ0« ̳u8j'©Î„¥IC¹|*J½}õ³64½„zïá)èuØRNÄd®…E»-ÕtønT}î¦ÄÙ²)~+/ð&6¯ð Ôïtaœ%û—å3œªìLT®âŸ[¤&G—eï?tº—‘g£×< ˜g½—"g Í·ì(RöÎ0•å#O‹ò}¢á”Ï3éLp|š©ØvÆ™~ ug…vŒãç>£uÓ—¹ªómItJ†Ym`ž­C0}*$"–Z$ c2÷t)åÁ«§=»Î~²r€åï IZ|y›¡iq€@/ÒûdHqçâÍÉäËèºðhPröκASrFâ~†×êÆÜ{Wèõp¦"²3imíèÝ9 ôÃ<„©‘n ˜d€äòã׿ÿçß3I#2\Õ£Jµ(l¼ãèé7âv Šò³ tE=ÕÀÜÔâëߎO›Zyï}ÅSlX$~%sïgǶçÀ@E-‚Vˆ’\ÍŒ—2áH ß×"!™…Ų;ÛX›t¦¥¾_´hi;BY››¬Á@M—µW1{³Ã®hH"|ÈB¬ÓÞщLÔtÃ帮ŠªõÛ8Îȶ¨ÎcøeòF‹ á•3ŽÍ›|g>‹µ¥êa¢ÆW=®_ ^ºøÈ?e]úÓ‘âxÇ|âåP鉖ÏPʬ°¾’ðífÇÇ;á9Ц\r›Kå¼YÙ%XKºsfêdž?Ô¢¶ôÊÃÕŒ)ErB’xÅ๣÷Ô»D!ûB>wôy Kg+ÖÖMîªÂt§yõC°À±iÍŒ½à)PŠ,•ŒSBÊŽYÚ¢f”°üO=ÓvÔíl¾:Ï{;(uñ„OFsÿuuvtš5^ópõn‰æ]i©Íx#mÑ»)¼µ¦F`¢Æ×^íukÄ3 <àd6Ò\°åðý`Ç €¦T_lˆþU1A”4FH _ÊÊØ{¤•V0ãÜ%N2‹ÏPeïlR(b¥Ë—V>γm¼“áeWŠÞæõ7À]/句ŠÅ†Œ"ażߣCsE66:Áu¤0ös^±_li"WQ’%˜ÂÖÿ³Lé¾F+_[{çaò[ÀLù h™©58®ìýçŠd5L³4 ´’0%’Uo­ZF²˜Ë2ÁÔ@Ú–…èÝ_aáYຳÎnmYíp¢Æ¯vÛì‚HML·qœ‘mQdžqËä< ®œQå_¿Éwô®êa¢¦W} ýª[ö¾GÚ÷]xZš²Œ® ýéHq¼e>ñòN¨ôÄ Ëg(eVXß I“q‰qÇÇÿ¾ØEÙ”Kns±œ×@+»kJwÎLÌ‚›Ò˜>£Qy¸š1¥HNH·ÚÀ±yîè=÷.QȞϽC›Dƙċµu“û°ª0Ýi_ý,§G7%ÁD/xJ Ô‡†"K%㔲c–¶¨%,ÿSÇ´u;›¯õÞÿ{D©‹'|2Ú˜û¯«³£Ó<˜¨ñš‡«wK4ïJKmÆùh‹Þqx«mMÀD¯¼ÚëÖˆgxÀÉl4¤¹`ËáûÁŽS01—e‚©tæW úøí¶ˆø˜Ì=-o°E>}B¢À^rw€@/ÒRµˆŸ )î\¼9™|] ÒæónçÞèV¼Ÿk,u%ïÓÄåǯŸÄÉ,$¿Â³E1î5qÎÓÓoÄí@;ågè‡zaËMmÝÀ­}qiJBJôœj\¬s'2@Ü…Š(y$`*C)1;,æKt {ôðΧ´‚Éç.q’UÝE ­ìâ-K¥Àé8“|¼j¥ÛÖÁ;Ø J¡Û¼û¦8?½]/ï˜yaHÆñüŒ"aE•þ”ù¼£õºpì¢RœeJ÷5fëµµw&°Ìd(³ÌØr¿¶÷ŸtÞE¿Ûéçß»üßEþœÿ¼È?è ¸Å>ËlÌíHL‰dÕ°Ú²¤NeU½ï¤ž“µ2¯0÷žxu˜Šã ² L´3œ.e:c0.yAôî ’ÙhHsÁ–‚‘vé@L#æ²L05Xåb[ä`•n#ÃÒ™àxÂõkd\?@Êq¤:Ëת[W¡_G®v —†ªómItJ†YϪ[‡`špµÉ B È÷38KSÿ[ ÒÃAz!Æjä9m4Þ^¾‡è.{Íhmj™p¤ÚÒ3÷™šÞ;™v–Åç¶ÛC«ÏÞ”ö»WÖÎÔ@±“¹§åe±<ܽ\HKÕ›áÉâÎÅ›“É—ÑuáÑ Ü<ïvÎá©jÅûyùZ05KÞµôòã×Oâd– ’_+Zu©ð¢Ê€6Þyôôq;ÐNEùÙú¡^ØrS[7pkD\š’І=§W#ë܉ w¡"Š…ZµKp‚K‰Ù¡Ã‡‚’‡w>¥LÆ8w‰“¬ê.JheïlR(baØÒq&ùxÕJ1¶­ƒw2°”B·y÷Mq~4z»^Þ1óÂŒãùEŠ*ý)ó=:xGëuáØE5¤$ ""8Ë”îkÌÖkkÿ‹ üÁ0“¡Ì2ckÈýÚÞ;W1o^ô»~÷¢ÖìY<áóËÆ<Ð^Ä”HØ¯í·ž3•U5¾“nNÖʶÂÜ{²Õa*Æ~Œ'Èô?ÑÎpº”éŒÁH¸ÌѸ(Hf£!Í[FÚu ¤1˜Ë2ÁÔ`•‹m‘ƒ^=-˜ä“(>ôìøxO»I© |RÜÏlþù;®¥Æ§ §nþ§;x¶qì2ºÒ*Ÿ ®êÏü¼#®Opl]«&VÓW­&ÜðŽuw,gâ|m¬'‹»NHÇjJ·0”誥·Ô…”𥬌½GZ¨ˆb¡„­!/)1;¬Jö…yôðΧ´‚Éç.q’UÝE ­ìâM E Öœ¼Úø8ÿ ̶u@†#¥ømð_öËn§qˆÂO°ïÀËrt­T`¥J{‹L2I½¸vå8@yúu’–¦»#ÕNºÜµh†úóŒçœ¹i Ðnfgµ¯CØiCf7Ü5„º|¯ á½ÙI »3y’E™$0Ë=¿ŒÎÃÄ[ÀLÖ%¦½\eiíI M$kÊ(±Ç •ÔWñ‘š,§·\šq­Ô@¯mé Í9^º…µ¼Bhkøx¡N‡ü¼ûË9¥ÖëÛÊ¡"S /iƒ£YUM©‡ˆbOP’²Ò¹5ª»àîs3)<k%l(Kì)l®IØ/õqàbt2¿3Œ½ðYe¦øP_ÅÇ‘fxiÍð¥5‹öbrñfå/Ù\g+g˜,7£ñÒû èOT¥S:ó)ƒ;C~Å[£Ž Þè«Mõ¶‚ÛÝŠ^%¼4² š‡¡‰âf\ç[“¨9if\[E‡gm>]ªÙ\•|PªkßÃ1\Š:4¼ŒÃ ŽÈ.ÈaŒ 9ÂAŽz ‚‹ÌC ÉxžW%¼ˆô_47?—;§˜­Ã¹Òl>åé®h&ÓÜLgdp¢OíìÛ€ë¹vâ =×NÜô\;qžk燖˜¡è'\¥¡¨¯1øÔÎÑN÷Ùû"»Þ¯Ï»K#ÕñštAõEuÜÞ"ý8†´ó·÷G”ï%_ö'¿®¾7=êËów“tjÿ!É;¼73's|tªûß”š UÉÌžíB=£Dm%m¨)ág·‘ƒ¼¿¾Ôü^T©ž ˜¨J§t.æS¶+>Àa(× ¥ÉFôÈY} i3)š|\±ª,9“mO~Ø ®Í1Z›Ì1‚:©Cƒ7²ÀA1Fž—dê6Ò”yÍ¡Œ8Ÿ±=÷xÛTíÿXÞèÐ? Ô:‚5 endstream endobj 228 0 obj << /Filter [/FlateDecode] /Length 13136 >> stream H‰ìWmoÛÈþúüb >œ¨}çnóÉŠë …ãç$5PMRs飨$þ÷YŠÖ‹miéÖ’|'±ÈáÌî¼>3“FEœ\Vešßxo~޳^»øç{˜M“cï×Λ4?öz_òô)Î<[Æ·žeµÍ÷°ëi•LðCï¤,Ã;ïo‹Ñ(Íâ2±‚Ôë}È«åÓ«»[{º×[¯å0ù˜”7Éçë š\}M¾§!*älÒ²Ðί÷át2Iü_çäk†µklb÷F¹âÞÇâ]4²b8œ$¦Q™Ä­pàµ@\Ø~-{×'µÿ¥ð_OÛ}~†¾–hÚ%=úмÞ—áí(þÊy9vt¹Ï7ÞÝ;M†ÞÛNïòëû3+±GˆËYÚ$V³¿Äj6,è ³‹"$®ª…=ÓÜ´e»"ög›ÆÜ-²%éØ,vQ™}±¶·eKˆ/]M¹'ÉY™ü1MòÈ}³Y‘ÚºyqY¥•{7˜XîÏi–¸cç’ÌÖ-¤ÄÕ¶|:þXù½…i‹"¯©+”ɸøîÜ ùem:e¶ƒ0§yœ SèÏÎV•ÉmV§Ó²Ek¸—ØA¡æÎ–…Q4O³p“/L[ÙºmYš'á†0Ì­‹Â,úXÄî¶Í¶nY‹¦°¾æþ kƒk—¥¶n*GFî9Çi•n Eûîöy –ÅØ*-óÖÍ‘úÛÜš¸8Æ;Å0ûÞ9Û³}–­vš)8ok…û®V¸)OhL×hìõ6Ô{žŽë†´^Ç__âòaòyZ^O3@a öeJ»,¦e”œd·£Ð}¡Ú°E.mTl¿×Ü=_7é7·¤¸Mʰ*ÜÁt.°£r&ïŠñm1IwV²iV%寻{§ÉÐ{Ûé]~}f%öhÉ¢„¹fÈ(IoFî©aßzη±éGW#g“fÜÛï´Îöüt¶åç^Û±aY°ãnvœ||MÊiydÓüfÀÛE¼-,ÏÖ-*®¿%QÕ/¦y ºõ‹ y´ŠÀZm˜pwŠE—æ±/hY-Nhnƒ¯u}g÷ìÀªÛÉ4kµœXöì&DºÚtN’³2ùc uÇ©­[˜—UZEš×Üʉåþœf‰{¡.ÉlÝBíjZ>Šªð{ ËEv6¾¾}YøÚ@àaå;¬|‡•ï°òí˪tXùv±ò9O—‡•ïU¯|Ã2„91»(ÒÉaéÛû¥Ov¾×½ó9ð°óm1*‡ï°óv>·ïèä%ƒ¿çñýî‡$‰”ÁE‘ÿލà”n·&÷“›4_üй¸µgˆúÓåÝøºÈ`þœÏ’kØ$»ÞoEuÜ™Â?â}‚ÿÔ#ößÕ¼ü¾é‡'¼Þ¿ÿC¼¨W¿ÁN}HoÜéÒÀ—4 ¥;ûmÈÍ;ñ¢Nó|/Ó}ÈÕ "¥€ã=ÐÉefþnþöo:JÀñ¢&t›—®&\øðk(_K.½þ¸3ú}ˆÝ/>Иq!@ujuö •Š¡ò¿wj·Úx¡÷ˆÒ ¡þÛm¨õ+Cë'ð¨BßÁ›$ \*…Ò–PŽ. 5ƺTë€Që|­¥u)UÊØ0œ BRIÁﯨßuVîžéµ¢&jÔ]ѵû€§Ûœyá8µV³YŠª€kûjÿ/꣙giÔÌ?Úoó|«%ß0SL)&`‡?´ÖÞp®êì )î)ð£™`õ;­ß~ÿj]͸ᘠ,€/çÖù˜ÂFrŠ÷2ŸÚPo¦ñ¢ö—™™5ÝZeû{)ò˗Λ¨WqGyo޽«=$ 8 ÿÖ.;lrZ„<ë܆ íw4híº£ÁCç=I[ëRTw½S‘#Ç:?É‹Üc\ëº9ˆè€ˆJY@äÜ(p<¢¦¨ˆÀ5”ʇ€(´o”æ5 6/ˆ )9 ¢óȤˆH8X’¾r|ЌԔ۬=@ãÐø‡Æ€,@#¦Á‰ÆgD-0íf$<’‚à‚qÉæ)3È,¤enQG«6òžb|Å̺†ùʣܷUÔeÚç€ b|ɨЖ µ6ª>ÃÎH„{¾F¶¸E&KÀ¿ÂÔ¼'#¡n|¦ ®Ux-÷¡à;îK ‡!¾€>h ÊÀ·@(Š<ˆú@tÒôŠ%_Eª!i`Tpð5Γ]É| À7Ô°GK ÁKp¥€þŒ– ¹]ƒ)³¨Š ÐUs I9÷®ÆÅ|i$Ãï> ÂÕÊç   ña^?zö}·;£ÏÁ·Ð”ôñ ¸tÖ¾À–»´Í¬Tõ#i9'¶JÌ£Á3RóhÐ69kàqMÏÚ–¶ RÏHÑ•â§KsÑR šV‹W+V7E<“I?@0„K‰RÂú„hp;f„ Ê6"x4L€s5…5  «ËàYˆ`‰„\àjëR Á»Æ§gÕŒ`Ë9Œð+ G£)<2˜ ºÜ‡,†9Š@G ÜÄ%A=) öUí3 Óлj,UM’Ü6 )錋$"@ƒ)¨Í…¤VÐñ• ÍûlbÃG+(Ó¦+àJ¨ €XA âv€^¯[#¡Ð,ì Að~ŽƒŽÆÑC ¨5œ3 Ž&8xpHºs;ŠÈ@Ô£HP"PußPØ‚q%µjLc*"„a¦“æéü)ˆ0ìá6J Éì6«!4ÚÎcä1„ S¶¥‚2ÓBAÆRØü ý%/0Ù–<Ì\’ˆP 0U¥†½÷qQøÄ(¢FÕpñÜ[û®·à%e­‡$À_),$½¦æ5ƒõߺjÔ VùƒÊAbûÚÁä9Õs4x¤~,qµ‚€è^Cõ,ӦЬÄJmµ’ìüµ\KHZ­&K[©'¤9VÔ<Ú竘ʞÂÔÕnl)Ân öÔ^Ë8ŒÁ=¨~×øjG<˜Ê5ìE3§#쪇‹’½Ï†ÿ¥ùÊZ!PV¸B¨ –sÀŠóŒØÄ (X‚àqèh³Pc_ƒ‚bÝØÕ:§  q_aKb8Kh5¥˜;«b„”ø 1ÄB~Îm}—Û„#8Ú0¸‚+Ú 6¦EMk•ºíSãEW•¥šàíjbù,ˆ ¤Ö ->Os\n8—/”óOdøÙ¯¶Ý6r$úþ‡~ ¦ÛÍ[³{÷Ér²ƒ ”ÁÀI †#+±'²dÈ2rùžüI~lO/;ؖcïË®Xi‹¬*’UuŽ’ü¬©:àVÀ~jT?K”éáUÃ?TO`F%«†K¿êP.uEX”Ñ1j;ž¦vV ¢t­ªárŠîaÆ—6ª¥¦VY¡ÚªâVY Þâòs*nŽY­\‘Åá ŠzúV¹…Uê²uCVµ«î7¿õ#ᅳûßõ£=â΃Õì÷[ˆ÷Ö›çç³Íùjy²þ’ýƒ fû/ñž¼ê÷“Íf¾^Í?œ_mÖ'¤öæËåüiö3÷ˆýÉjµèh¾Xž¼[̹>?_9-9ÜîÅçËÕzÓnôOüí5á4¡X¿Xž¾þrñnµà±>žÀƒ¥—<9¸~ÿõû·³ÅõòÃÕ×ùùìl¾Ì²<û÷jýéû·õæê)rñz÷ÿŠ¿!ú”éìUöç_ev éG¨ƒšùs‚ç|È㜃È4ñ7-4£}÷´ºê¤ã¾¼á™ßQêî×à{‹Ó½Ž'Íàüa'yécŸœæ; ÉSš/´.Ú‹p]%‡‰Žn'ŒiX‡5‚¢DÞ(òË'ÉõÞ3œ?òÏ¥ kŒ¢^ÑòÖ5Áqø"²þDpî¨ñÅn$c/Œ÷íN"œCæÂ7…ßpt)Édž¬É2ß`{­½w¨$Ù“ ·ÍŸèNÌ æ[æ*GšEÉð®<¢JCÕ1ÖãÊL æ­)ŽÏ' ·L3:«4ÑÒñÝ©æK«³ygº…x¦7‡ýìmZx” -›‘±#ŽW™u¾ˆÁÐu ðÍK À0Ýe!ð²é{¨ QéO?~Íöús¼`>,N÷F-‘¡†&ž¤yÇo­6¥-i[.6ÀKè=#x)I]- æºîe-2ÖTW:-1äI–dÇW ²¤4ieÙÒÆdkŠH JëÈ(S([h_f³ÕÅåêzyš]\γ‹ÕiŠîßF|Ý…ä¸]Yk\CŸ·5® @P8Ö8Ô¹5mµ0ejÜótdá=B*¾¶ª.­ˆM¢‘½·\œpÐÃÐIY(‰âÛNÕð Q4Äi›ÝÇöï°,à^s×bÛ€¿†vÅ=-O~IJ¢sCê$Í‚ {­•5ÔDQ¨§¢›º¬+,˜ÀüG:úRù£ÚAwEµ ~©CIç¬ÌÈùõíËn¥ Á†Î1[FÑ Û`“å£Â6êˆÉé¦vS¥±£º™‚<ÉCa•UQÖuƒáyXû?Ë&'÷6YQj5?@Aü­wk¥bÂøúîŽ@l%bŒIL_‚¸l¸YÇ0ÆDq]" ›çò&"v'’ˆ†Ñ„ŽÕb–èHˆ2õ914ÑBv:žÇP—ñÞé6CnÞÊCPTµÀ}>„‡ ‚¼ècP?Md14t­^°Øn,2ÇLzG>âÏmDdÛ¸ƒˆ S.²Bf•TË”) HÑŽ<€¬ç³³ÍÕŽ‘ìÉŽ‘ìÉŽ‘ìÉ AEÇ@ .ù ›A4mEy Ó¸pLÄÄ×ÉE—¸™2™ngûÆ›‰âÇ®¨‹>¶ç€˜k퀉`ZݱTTEeP%»\ä>Fû\d £h?Zõ#l ]úë)mä"JËp=<f[IÀ­$P–˜¾„n•ßÏ@”ÒÒ.ìŠÊ›DO‡aDvd Ý‹V”..¥ÆdHÍ v–„Ýùq[«t8½®ñQÑ­Üê¶´Mõ îј¹ÇHȉ´ ±]?&kÃ@×JBO¬¦*#g3í¸Wìÿ@ÿz¹™/w8‡ów8‡ów8‡óŠó u“E‚bÎèeÓTFý[Rð|TW²-R…‰™1 ¨¬GZ]7óC P8“¶ÀÄ} ÛÂáoU›!èÔn_*0kzÿ^6û˜ ›hEŠÁý1ÀàK‚­—én •^`"b¼md*òìHƒ²Âßp‰,MÕ"Leäß 3C™a:Œ*ô¯Ök§nbÛ˺þD;„]»¢4:k+îapeG+9©¡(šÝJÂ)ÿÃ~µíÆ‘Ñ/˜è—6nñ~y´fÇYyH$y4vKcö2žÃâ³ÝçëõyÕþ4§üùnûã¿VïÓòmLyxLQá)} `¹š!ºðº¦¡¡ íÅ4ž”z‚tD0êH" ß&“o“Éd2q†}¹Ë¢$%x·Lë|20Õ=4£È´‘…ÄGAJaZå4æE9_~Ô#¬&/—ň¼>Yðþºar]U…´W#NSË5<ÂT?—\Šß-hÈ¡|Ò_ÌKè6é¯Gxùþ_æ˜VIÞÈQAÍÆ8ž×)iQЍ¬ÊÞzHvECÏúd"Ù–ž]îöTgßS¸ïÊÄ œÄ7y&#Öi55þûI9FGµÆÓx1™8o`¹ Öì‘rš´,¤ê£)œÙ§å_§õøëµbhs>ú––D€‚ï¹)NàD˜@`°W7\÷MåÐúñµCÐTO³|lýŒæŒÉ£kÈÑVQ³|¨Žkì§-–~Ý_b%|¹ÈhùÈ2£Xµ…Ö®.µ ­IçƒåVü9¹ßm¼)9•в5vÄ઺}AE $ã"±ƒÖ”ËAâeÓGÑ ›ziš­Óo|ØÇñp{7°D m,i-ʆ/¿ˆ6 º–Á| ½ç_jJ×ÈA¤ބIÕ¢b=æE­M 1d‰4Êøà HJl‘å‘:Ž­|NXÝâÈÁ1AT^/ºÕææÃæîö²ûø·‹ëîfsÙRû?ŽäþnŸ’Óx't@‡dà rª‚‘¨>t~øQ6Û€4ŸÌÏÝÛ!”椹 ¼[DT ¼_H›LÄÃR„”´ôÖOA7xibeã€Þã§4ƒJ?p6èÁk3í_©øøßP¬)´(›¦Q]F{K ˜@ý4UÜà1€È¿G&„ÎÉ‘ÆZÉùJ"dDo994Ç‚ÝKÎÝäDaÐ{øv )=#‡l¦ïíMâ5žÌOeÞ{ðÉ>é¡À ÝÓîèl·½º}×=9>~¶ZÝÝœnv<Þ6ÏvÖ䰜༱½î©Ö8WPögYzÔžìŽ~ØìN׫ÍöEðk6Yò ·Æ"Á"PÉË!àutG§ë‹ëW¸ü6vO–Ï^¾Èeóúíf{“>åx Î/7oÖçÏ^Æs˜{¶û|½>¯ª›¨5Ý!dÆqÐEYñCÿáb·[ooO×ï®>î¶ìÝëÏ2„hŽ7›ë½Ïo/Þ\¯_Ü]]®?¦]j~ÝóO6Û]½ˆÍ+Hô+­óç·—gŸoÞl®ymÎaÁm–<ùÍÅ?6Û«ÝÓ:XüžÊ„‹Ä©è¯3¦Œ¶’¾¼ß8Ñý?þÑ?;Ó½êþòWÑ]Bú§S4ÌÁE‡SS²D"пê´Š¤C›è¶Äа= ´¶ÜÖôœ¡!7¢Pµë4*Q²<&úµÌtA¥õrQ$‘`BÑK¤CÞáÁJ8™Kø…½”˜'CIô¾+¶QïÆ&-šM| ö”[z­ª e±@Á–zU-íÙ–dgzöØïyÜsXˆÇ”°ô9mkäzoTU‚s~Q Œ» ×GƒH(?hK‘ý$uRk vyÚ^vÑETÁ5QÓd.3ÌàYÉ2Á£QUÐö`Y#¨H ë%Ž"i²YâÁ¾p@6Ú U(4É„÷¡Ü‘0ØËª¤¤H–‰mÛ]nÊ'!»!ˆZhÓ´‡ ¥e™ÀÛã¾£%EOQø8ž–3íB0iÎà¸C`¿4_•QðJs=‚ÚÁpieûà@Õ“¹¼Åä-´Õ¤–÷Ç ?ë¤ ÅaƧ豩r4©ƒ7ð¢zÃÙºÌQ15*7ÍÒ¼œg~ìM³‰ì0>Z2=t<òEÝÀ=’±2È]2EðûâÙõÕj}¶º¸Fëx±½ºü~Aú¿w{uývý´`îw¿0îRY+Îÿ ‚ÆI`-¨ªMB/Áÿ¯¨Àª°Ÿžè§—‶éÍÐkÕTcY0®Ë™z¤\[n-:Ù6£‘L6Ïn›¨›š3·øí¥ ¨ØË_„ÐÇ“!<ªT\âGÇ0݈úéö~z#ö+ªNìÔÚ3² %¼›®+W÷ãÝEqÏÆôl É'Mhz¢ÜÖ\;Ó=µnîqµ< XNDXpP°Xc0+Ú4j:R/RÓh$pË”9·Èà@Ó)¾=”3 ÍÏÎƹK£#‡´Nñ­¨­ ÃÎËôÉKê èZZj$Ðç4£C‹ö‚{ÑKz‘!ÇM˜õ@³‘2IÄÈ]Ôp"–¦6NA”ã.f¯.+êlªJV ÉIV‘L”* ”ó 0å05±ä.ñNûD‰X lh÷L.RÂGA Þ€À¬£™¡Q÷f?¬Ê{À81'…`˜†H²½Ä‹=+<@DQ“¤˜Á?ÜÃáBb"ê)<6QÁ£x$×E @`a=&bm¤ƒ'ü¥À"ù<ÑÁ.‡ˆk¥ghrÂAÍ8]%ê¼ðeïMäšÑÖª4Âo(׃ñÊ9} üzжI€‚²pb0¤‡Þ¨ì¥óO“Ÿ¨ã'JÕUrÐùP‘Ö…‹••ÌhtD›Ÿ#)‘‚À4‰,uŠfUÊxED¥¼<§i‹š­JŒ)EY„(Ðs/A]šÄTЦ,®àYêàG‰A‘R ç;Æå¨e”dCÆ Š¥3wÈÉû¨Rè~üó„ï7Û7™&È_œ&ô 5'€ àüh¹ôz |š€™K,ÔI੨LƒI,,qUÂåRñ­@‹r+ÖŠx_Ö‹+<K@Q¦'Büù€hß\"›"ÍVîJU H7UË^ô%ñTBqÚ"ü=¯Wľîð“ü¾pß,Q6Eì¤JàW¬…¼£h-ëÕ¢Ø5î0“̾ŽåÌWе2jÕÿQ’­Ç!i\õåž¾þ#AŽæ"q“ÜDÇrQ$ÕÿQ’­/wïŠÖ걫Hôä=ѱœùJþ÷SãnQ¶¿'cœ¨.÷óôdŽmžI?c?U¿\ôSOQvc¼¸øÙÏC18³ŸF|9÷œÃÁïp/ERÜà—é›`ðÓÜ‹Ezš¡Ùb&w˜=-0&Kš@Iñ \:ú˜õ6a(¦Õ-~r‡ßÓ²œù›gP¢Ž§€Ác4Å!€ej¢à¡^¹r– !‹I, å57Aà ¡JÈ™C2;Øh©{79pZ)|Çê8V §ÖD&§ž¹·¡Nl§÷"ö—¹²ÊxCWÕAå…Ë_èý)â^ýšÏó²BFz½ù?“žò›®ð¤›ÓàBÊP Mô0Á݉3¡”»YH—„>ñ@^0æ|/þ 1E ø”m%‘S6zÏÃB¿šè©6LØpcÝrÑXúǾ¹QÒøÝä'î«mÇãˆ~ÿa^H@Èíû%yZÒˆ!@ñƒä~[¬¸´"@\‹ý}Ω¾9k‹ÒêʼníLqººººêÔ9X4KÖëÕ<ÍCt~¬Ž\, /´BŠ´J®,ã"Ž ÖÔá›…ggaÒ¨u“‡ô¦(Û¶jÇA™‘“2f­4 Œ’”ÄIsXvZ ¡jÇ¢X”üÒ³q*«,+›´Ì8©—J8œ—s4ÆhtcÍnvV°c›²EÂ,O^Sñ;,¨)¡eŽvu6#-TÒ6YéBÍžw¡›åÍšÃ^‘`$Nb$¢[š‘$>z7 _ZªŒü¤mØ,"[œãUŒ¯ÀEMŠzæ©[fv[«{j±ŸŸo_ÐçY+o•ðììÿ7ýôþðqZOÛ·ŸÈcõtýa±úBŽj!µ á&“Š0:v ʸh–TÉ)Êh=3­ås?>ï†æ‘õÑLP¤Ð™Sw`t¡[ª?´ýÖ#¬‹Ï#Þ¯¶ïVªvûoœüÅ¿îïo‡»éýÃí݇RníËú&: êÊ+D ºc1y;ùÐÆ4_OÛ÷%¦TšÐ J‰½Š•…JŸ’1,PŒ¬íQ:r»}º0¯æïÓÕO§Ç7‡ýéáAJ¡]Óyï®_ýXøó¯§‡cù©Vêìîôîpsý*ß  ·Ÿ?nF³zcV~¹;K£ùRëßò/r%‡µt?á?Ujñ7uhˆš6 L% f"n&Î(a1¬’f ˆh£µ”R·štžº›µ޳’ꃒVÄñb•a¬ïÝ{3µš‡âˆ7;Ëë P‡ôRPWiLv\²¸`ÇÜqjŴ̧Pâ¥öÚ kœ.;ÃÚËo³žÕžYXv›ìâ¬hYfHTQµÔ°L‹ˆ¹¸g´õ)ðI²7I噡¦‰C¿˜&å}œšÄbK“<ö˜CLÝ´–Õ~¬î†Ù3[ £û)a¶ðw«‹à{¨Ue¢sòÚq‡W®ËDí–Ù^Õ†€,ÓÖ}XЦržö´+èäÇo Úâö>OW7Õ(šµ@*ÿÝÕ¼nÓMæ®·ÓÂÀÙ„îâäùÿ.v=ÎŒ-´óÐDZöøzqêe^É“uË$Ïï œ‹ÎO½HÉâ\qÏVº¾?ÝOe,çæh3¨ã0@…\Ö˜àIVIÿ„ut¨¶0.˜N”.‹Xš¡Ì5 üìc¼fæ¥ÚVXÔLÝG' §ºÁÄH:8=öê¬k¯zÐÃÕâl—L;íþ§K¬¨R)`ºÙâ ´›çf˜Ât§Yº±(y!à dÊEéºnÃöL‰* +ªì£¸ ÃP´¨Ñ9Î?ÑÉÏütCÝl¿šÙ¹Ò°ÝQƶYÏv«.ë!õzÔÝÑùÙžŸnŒ½/ o/H9Ú,2ˆõª€ƒ#ã Cáþ§†ãƒ­bž0ˆã(â´IH”EZš¡d*9PíñMÆl€þ^ª¡íÄEÕäÐõÞÅ©{1›ªÚNÍP’+ÑŒoj¼ÃËÙ™žŸY¸N2Û^˜YÍðXË}~^˘N+#¸c¡æ5àQ©TœŠð'la³ÀøÆ ú4'Lv?üÌLu3QXÝÆØåluõé¡ ÇvͰ_õši£z9?×ó“ë¡AµË%¹í…ìaÙG4²Õ(fT=§¡Dç8,yƒñ¶ ¨Ï–Í–AyA(`°9qn43ÍdØaÂù nxx醺‘ÜN·dÁOšM²…àûFͰ_õ`ši~ñr~¢ï€Ä(žè׿EMlàuÎÅÅç ¡Ž3&¸aC¡ÄÌ)7hB…Ó”ŽÐe _i»nA5f ®ÓnöŽæ¹`÷Ô-m?6{³ÒY“ä2ª'üiú~Í‚u=ªþU¼{Zœï{ 0ghh\^8ôœÄˆ4ûÌÍìï=@ŠТè­²è—fBY(ƒr€·à³ªÀÉhÐßÞÙÆÁªºE¡‚ š‹nèÛìWÃÆªÀøj^ÈŒ½ºµºÅ\cé¦u²8Ïw(f ]Ç\}^Çœ1L¼å˜óS«9‹>< ƒpp$D­³¬11SæuaŽX0°­s!ž“ƤJ?™V*…ÝʈIbòZ“á³ÅH7aˆ "0'leÈ]X`g&ÊÒ¤MÐ-Å…¥p\•á,«¼-ct|›?¢6…8¸ ç-¡®sàÃd³P¨´ ^G9*¡|Àž È4¸J[»¨â$vPÈó¼Ém>y…žWš£ŽrS¸ÍwÃzÌÁÊ,S¤ªå¨U-PÙõyáb¹ôµEO›€´ñ!¦ æRå9‹r s¥ÏlFúh9‹³p$O†þ©µ×ë=ÆLЬ*àæ·äܼ R@C‘óeÛn‚]9q<“(mžX™”JL…ÃRðyA†Ë"zgTCæ„4~#c×’ÿËÍÕõÃãöN÷·Ÿ§¿Áô©Ž‡t/§«·îßO/¶ÛëýþÓñÍéñ–ß¾œþÊÅó•ÓÕO§Ç7‡ýéáWÌŸ¿î¯Þn?þóûýk§»ëW?Ö:ùù×ÓñüT6þ;tØÝéÝáæúU¾Á Þ>~þx¸ÑÔ¯ðÿáBh¾¶˜"9k’—ìVN¬ÃXÆ1ÑþlM 1áe2¾xɆHÀSl.4ޱ]œŽS}GAk[MœtA‘Ãr6±ˆ×ò®[®E ÂoÄÅ-Œ*\YyEitèì°œ<ääŒB‘Q‘¡ÄµŽ¦”¤À ·F˜L€v|¨ô„GøH…®¦AWv+A²B˜²¥h„°¬°d™¹oà ¬·!K¡åä¯è`,Ó†t£` @¦à¹*UØ@𢰠1—˜7ðxe G—Pͬ…j&‡¯ÐeÄvM!—HvSÄžgZ®×`‹(‚tTÚ{Œ°»ma/Ñq:XâÓE{Àƒ#¡šñã\áÉ¥€$¾˜+øÊ¹—†M¦ºÉ–¬ÄHàäËð¡¥6¢y&||Ó}þQ$aî\ä*´§Ï¤d/1 ?3»ƒ²KƹfŸjt.òØk¸¶B“Ñt´e ǹ’½|•ƒÁçCØÜI„ÿjv8®»b!RR,51 &"}?)‘Iâ ʼn#c-G ${ÆRá,¤7˜±°0 ÆM¾#Ú ï±P—ŒwFOjωòø3Ù°¬abÔ[€(ô,sß "Þ«Rl6ʸÒZf˜3hOš]±ÙF$A¨È} ^b€\¼#=YßÙd{Að˜÷ÑÙ€Gɬw€ôœò«!o!¾„˜it`˜ E+ZÄMµb ^´1 €¸•ˆ¶¸\§?èúD$Ë.‹T27f’‡ANô%ÜД!J«çÃÆWßàŸ5ôo0#Y _8€ºÉA˜¦pÊ…ÆdE§ô H0´ è'#LõН-¦EsøgïÃà“8öEåЀCNà-¢íLN2Fê Á¨27øESŽ@ãª,c Ÿh‹åÔ£üÊl° +‘&¤Âa…¦° É U!i‹Àž9$QpP+b°˜(uÓeò>–ʦð*p(…Þ…öȹ}v…#iÒèE¿U·À ëÎ{_ÿV+ÊÏm¬ W˱¦¯©)ÿG}¹ìÄuaø x‡³±dÈ}¿,MdEN9r‚)ŠFŽ#< Jüöùþê336 aÀÉ‚ ÌéÓ}ºººê¿$ ‘5 ö0iæe =u¤¸­ ±­D`@7Q@n2¢)nY=ÍqSkhè€~)‰Ñ(‰+ä@Û–nÛøppžÄ©Ö¥(?2mð“ÝÐ.»…ÜœTQÏ 6yïwѱ¸\ÊWÛ—ûÞãcƒ¨2"Xg–.à/² Q>Üz(âØ\¿[×&fc¾Ù£{ƒÁ lLÍN<çší¹$ACÓÏ)fum^eM¤ D;Az*£¼(’(zÇX§ÆñŽÃe‘³Ä‰7’õ´¶7 ÔTÐjÙ$¬)MgÆôÖQCéÙY”m08 ®x1l+䦒ªnu…Sðì›´”Ò›n$îÁb#¸›‚U˜ð{Ö\Hq( `KEaTú¡Ä´r+‘k@ÀMFˆJ®¾‡0Jg99Rþ÷ –“ê &€gñ´¬Xê~Öj×C•S2)×HËÕ4| WØ…Jx.9î¶«aafov/´ÛR2½jrÜ.Ø;î.Ò-A‹«˜†j¸!¨Æîjü¤ÆýîﱄðÝ7kF5ºTÂÛ™ÊÙZ´©æÍ Ô¹žÄë §le#¢.>ª]H”ZAå&•ß„×܇](ÝW$zq£™-o~PZ¤ ¤øH,ˆ˜ªx¶!é4ó&(‚ŒÉ:è1b?]¹e5€"º}-êÐ^MY[i^RN,n¢|·½é~Þ×ê$,UfÛ—òa,¯\±ò~x”ãÖò@É ±Úбwa·=²åëÅÅ=/ó±aGÐi6.¥Ï^þC-þA€à¬Oä*‚ _õ1U$é cpéŽ&íe ˆ5"CÕìÏíÊ d,IÁw „Lß øxíƒÁfV3…ª&vúÏ.ÙA&a&~TJD²J¿TêÎC^P‰^p/>V)á #&À"‰ª“¨ô]„G])Aü8áX™´4hióÈÈsàÝõ|=Xaô,zMNÂ_¥M–‡ør]O ¾7u. <î2;Y…  $\ÔDXôX·vŒÿ¦ÍÉB§H£Ld QºÙÉMµÛ ü›‹yê³Ëâ”m\Ì¡å1A “WÀênÛªçiÁ:X[±7[: !°@ŸxS»…kþ§)OH\ªw"…×°Ñ׋Œû_ác‹+JûùùÞj‚!\ѡԊ,“ c=$ÜÎ*$©¹ˆÍÛ–óOµ½³;^Øê´^½y^m0<ÃÜ¡”h‡“–ݯœëõäx¹‚îÔ »Ô×ÿ%´ÀóåÙô/Ñîéh¯Ï7v´ý4~zö’>yúü¥?¾¹¼\\,_/Þ½ÿxya`úó§óÅø¾›žž~1óÅòÍÛÓÅ·WïOǬpós/þ>?»¸Ü|È]Eõ„‰îøÅòä§OÞžÚs:>$‚å<òôû«w‹Óé`zuñfùn±ª¹j¯8îú?þdè¯)M?L¿þæ¦Fy½#܃ñAŽÖâUª«4H• Aùµ ÂÉé@k3t`Óófúz`õE毇ÒÐëPSY ìÖ¿€¸kïÖ΋¯GlçæÃþ±ëbÜŸ'x)¦„TU²(Å·–)C še0g{ Ô6H³äœ; 9!µ 0#†-ÿFÎwtÆ]1ý#ÀhžŽ endstream endobj 229 0 obj << /Filter [/FlateDecode] /Length 18721 >> stream H‰ÔWÛnÇý‚ù‡y@ÞQWß;~âRˆ!ÀNÉBôFPKJ!"’±¬¿Ï9ÕÝ3“]&¦./6!ïLMWwUuÕ©SyŠ>…ñù«ëË¿^în~ž]Œ'çg/~¸¼º¹¾Ûÿöþþá¶~:ÄןƓ³«ûw×g/ËÅÙÃþõþóÇë‹7»ýÍýÝåÃç¶ ÿ3ÊøöjؾÃSýÛþs°ãÉ›»»ËÛë«ñC;ctî´-üÕßúÿíèn·CONÇ·ÿ>á¯5ãÛÏx±e*ÖåñvØHžÄ„<‹6ÎNÙ…2J˜¤¸´6v*bEÆÝ°’Éd¿}› ¢cúÃnÐ/ÑujÆEsyŸwï¢nAß¡›¸Ø¾òå—ƒ É#A›OÇ™Œïýh&—DœgØ&/9åãP:? þSÁ¦¿l²‘8™âí˜- ®`ñíð¾FþÓðB>$Dœ¤‡-`h‰`g³Œÿj nBÒ„®½#!kXÌ”³)+A‹ÓùÐEˆ“ qj;À ˜zœôé÷Ì)Ï¢j‡E{¬NXÉšó>ÕÌnþùðWü…º[ZÙ„óuãÜdrËÉ!¬%«³š !µü8ïá¯êO:ô[X¾©r\”ûû:\³¨YÑ÷ ÕðóæÀ/¸ÉÞ o4ŸP޽”ŽÏ.d<û7~ œvqtêíJØM;4}qk‡ÕG^Çå(xªwäõT¿¸píõQHŽ Ækéìîþn´.ZõÛŒ*™).¨‚²²V"®bÊÅÇ,è"A¥EAn‡ÉGŸ=}‰(Ø(SqgÁNSdzZc ׯe—.è'A©‹`xHÞÚqÞf“¦,ÑËrÖ,^7hYÕm^v:tl÷¤ñÿŸaIc+¨ô€ŠEq9+Ÿˆy~* w^…j9X†0NÎø¤U7Ë<°–Ap,§¾hXücX x„ƒ&­¥É§¼Þg´ÃvÃJ†ØÕ‚7*8¶Èê´& ÚlÒ¼h¶zÞèзo9z 0·…¼¿ ä(3Xò˜p€p 9í0È1N)†èZˆUãS ÂÜ›ñí…‰œrèt]PC•ƒ‰«5eâm¯vi‚~•šÈ£ìƒO㼋eb»ÕI]P£«Ö,kš½Ë.>}{h±5j/ÔÐö†MÕe†Öûɺ°ÎfôL¯IäqÎ"²³„…kA%’BRM“Œƒ 6·¼ƒ[Lt RKFgË&+Q;i7¬e4 AhÙ8…Ìí'õ÷Ý0ÓE‹m‹C¾=®a²Q|©qí/¤ kH=’Õ£Ö ±ây¨æä# À –s»HÊ„ÖbÁ¦R,ù[™l™€À•ÌžÑ rÖ”šEðÏâr—]fA;H/f–›ÀMú&B¦ã烺`7ÌÆtÑÚÝåУï€ÄÈœ$±!q{aŒÑOŒUXàuº5* Û¼-(%v˜hIÞ%vÐþWP­ø$•+£ñjÅͤb!âÒçy\ó™É7ï4Kúy¬ó.S*¹ì„OQAf>¯K 7[5¯š-Ÿw:òï{ ¯O–޾õ… Å#^(<Ìýï†4 Q+ALÑ᥋Æ",» ò†ÙÁ®\öÓßYÆÑ™g‰A+ô-fÁ|ÌnXdÌ ëÆ¾ Y1Ú”ŸšHæfË,šío›ùó’ý@·çM*}$8¦r€™bÖ0lÈ^@ø«Å3Ê‚n©)“ÑBظVª@ì¦À&c3Xcª©ç8%œVg‘¬¢€)k„ {[‘T‚Ô!B‡Æ [*º˜Ž[E÷‚FŠ%ð– Z+—ÉT‰ÞP@ÜŠÛ°:ÃØ]Žit[6[(!³K! _Þ,|óð.IÅ<øÎªÐ @P("tÕÂö1×FO,C§úè-Þ"¦Ð’$éeáz„ï–)Y¢Ó^f8;Õ ‘®!9!"BCe½÷CYÛˆdãCÊ Ñ4Ñ‹òÛ’#g¹Zj®àÞ·|ÀÝ9& Ÿ0ÚÇtn8à ÆœÐXMÄåoIºyd€–t£ä§»½Uø*™í™lÄÈc‡fc2Cá¡ê"–WpxšÅð‚t(l’6LÚi`qËúgÏÏö/nvû›û»Ë‡Ïã_ :A¨S ÎúÓñùëýÃÍ݇ñd»=Ûí>ݾºß_ríéø#•ךãó¿Ýï_]ïî®pÅüüeøüÕõåÇ_/qÞïÐOÎÏ^þÜòä·÷÷·õS=ø'ŒaW÷ï®/Î^– xðzÿùãõÅbM[…s*Ð~iÁŠÆ¬O¼De¿ÀÅytf¸ êNÀ`%¦JÔ´ƒñ’-o ˜gX]¨ë²ÓQÖ³±Ÿc£ˆ© ‰Ø"ƒ!5†À%¾—LÈÖwñ¬}Tºè„ˆ}‘ž€Qç”A0¤u”#;¯ËæÐgÉ• #;tá"ÉÖŒTø@Þ6¾‘M€pˆ|бz¨ð‘+‰‰Ô¦@L \ÄÆU *‚Á²S"³Êqà¾. ïbÑ<+%êoö… 5Dù2Ç@­ÜPQJJÁ¢b4£31l ñÚ6²YDÉföX…¡‰°AŠxÏ-pg |:ÖðEä@8  ôj[ùKòìŽð|xÚÙ0áD¨¦ýð+>ª DŠAËßc•÷;žj6¹êTP¶@à6ùcôÍd¿=¾ê>ÿŒ ’Ùh9Q Õ IùKJp˜¹Ïf&9I NÉspÈk«DEG™öf϶R‚®*Ñb¹ËP¾@ï $Ê€…ŽëF=s´Iu’”ŠG˜êȉ)5Ñáè“3¹$ž„#ÒгÓÐ@ÒZ¨z±Êx·' ¤ÊoÀËwªÓÞS¥.¡ï´žäž7 ð…À†Òa‹éÄøHÚ?"÷Õ ‚©É†ÅnEçñê-JŽãIX¥ ‡M:Ô±I”n:qµ†”l‘ÄI+&OÊ—Hȼ)@ˆ fœ4¶ÁÓ‹Ž3Çêr1‚y’IAeŠ3–£³?û¨Ê©ðIgˆý:çU¼‹ñqMCàPUŸ9©æS­íÆÈ›T 7óG"œHŒ˜oÇ/¾Ê?|ÈGÖÚØ€òå• çR‰iÊNG–˜p—œÆP‹ °l)5q#Tk ó•ŠA´¦ºF ¼«‚’Á_t̳%k?iÍ=˲,SËŸPÖ€%âÀýØþP¿Ö°n@;œF¾@œSjÌ®ŒÓ¬ã@ƒ–Eú¢8…guÌ#7ƒ¢$–Fz8æ¥ê™ ÔìfÙT\T¶ÉÝ•þ¨ß¡øÊ•D?Æñkç—ì”ð†àÚ´ß&EúùÉ9ðp¶’àLnH² (€`ë‰%5˜-5ü ‹ ÝÑÿ²˜x² 1:!s&õ(Aq:ÖqÎà-^™9©6L‡ÊŸvî¶ö(«ðáHk“9P“€_ÑøŠ@ÁTó$‹³!9*‰,@ëEä)4§ý‡ú²Û­ã¶¢ðèæ&€]`”á?‰^En¤uЮEa8’¨±åÀ±Ñæíó­MΙó£À²Óµ.tÎðÃÍ͵×^+åü»ṀÞâ§F"tÌ€‚b ­37Ñl‘g CV„ ¦g5Û”{£·ª‡LÌÎ<:£z‘¦° mÌN<§ÒŸsTÄ=–—ç’*Š2/^±Qö¶ô.ðE9õ¸îG8‰D¹Ô‰ ‘xI"ENBn#é“þC›ªV±QBYSª%Ši+»&>`¤%×g…,¯š_bÀ˜ ¦§ŠBíuÉœÁïé­ ýM'‰ûhÍ}–ä Š’Ÿ4×yìs…ÖbV…zÈ!®¦%p ˆ+ØJ$³z]1T’¨™„8©©&íž4×äDÕ¥3oMítivThÜS*z+ƒ!¸=Þ°0HÉtÇ»ö4~ ÈDoO,Òw§ ¹ÿŒW…cx%.î,ä€ÖÍd«¢°”ô€÷’0lK ÿñaW÷©qƒ˜OaM±µº¤áH2–¤ûΔœu*‰± µhµ\ÔŸÖÕ&ƒŠR…ËöÚX3™Š€ô½ÄhHEžn¤VoSr—l­F­:¬&(ÒìºfˆÍx““Ý@C „² 4»T[µ }5x¸I}ÆèŒ¼´.+øBˆF’ðWÖù5Pt0ãeÇ4à›ä²{1y¥Õ`‚åÌ"u¾9NâG ŠEٶ擬5µ"Ú°”{Íh¡D‰¨U$ºPj¯,ç´–˜{Þœ³nTNUDVC4^ÑŠHwó&hD»Ÿ[uÜÑ]«=GÍ‹[ɪÐVŒ1ˆ-W' §njü~{Sûü^Ê"a ˜™½s)/ÆôÊ^+~³»“{Æ­å~ñZîk°ïãn' YÓï×x™Ÿwxf³'j r „ðJ„°äLýÊNH×÷:VùÑt$0¬wKpTÉ.#FÌ“0TÄ!z^ >E]¨ïðéå.*@Ù›¡gÔäͦ¢ £Šx°»¤…fâGÏGžD¸„Km‚{ 3D«d: wjÅ‚Rß0bÊÌb œDå IT{$‡Gsx„Æ"Þ€+£ÖÂf"-m.%Iè8_-.ù1áqÿ•6yâ÷(=û¸VU¹p¿ËÄG%1qt¢77+ÇPêPå$AÍ>È<æÎ¹É`Á&L#ØgŸ,¦Ÿ7¹+J›ç.k6M Ò¨x)ˆ{íªŠ§\¼¶„i)â;–-\~”¾ˆ.è⾡šéa3ÑS·Åò^’pÚ‚FôûõŇßÞ§Æï@õ?­Œ,(Þ’“ú¯ƒ'£Øb7$ÊN¥h€žælËñUôël«ãnõö¼nÐÂãæS‹Óî5”jÍ¡eûzyvüãóX~rˆß,áòÐ>·EŒâa¾QGBpDìC?¶+9 G”éN@içO6F¦ C6GäSõy?9C1.N”fMÖ"–°NfÕJÀ¢áß\] ¥$s8úûÇo}ñ¡[Ûê¤ÒWíîÊïÙ™ßÇ}\í õÙó;€´7x(Q„&-û08ÖGê³ç·wSÐ{åÇ}ðõ?¢Jà‹Û×·0vOÏÎÚ¸±gwŸÆMŸM<øâkþöâíÛë7·O®¿¿ùùí#Ó¿ÿòÓuÿ2}~ñúõ˃™_Þ¾øîåõWïn®®î³üéë¾üÏO¯ß¼Ý^d®Q}ÆÄåù—·WOyõÝë—öŸ_ÁíyðäéÓ‡PÙÒ©ì¯È×Z$ëºÃ!Ýè š—p%€”*%š[‡pˆ!Jáp…†!æF„Çn@Þ†¹¾ìM)‡ïØ=m´d éõEÎm¼CÛl³tße¡ì欱î^r|óÝþö›ÇϾþø}pyóæ8ùç§?Ú½-Â?îÝ–TÄâ‡W£=*O4ó‚VX‡kšª¦«ÐWÅÄ ÚÏ™[‹QZá¼e]Ÿ¸K„~c.ÿqÞÎ¥öZ6=˳–—3>:Û ñ>\Ý›Íqš.Bo³œkCÿ#l!3žBÕãáê1ɲkÉaï ¨a‡]Ú›…z©ÒFT2/èÆ5"~L×Ôj‡@ÙõV§ZFÐ}l…Éã3ÝVè#ôvÛµ0]oT¾:èöÃyt ‚þ­ÊVNÃQLÒóúTîm˜MTÇ,´WµíéË›Ëë§—/^¢±¾zssõ—ëA4ÿÿŒñôò‡›—W—?\ßRõóôäõÏ/Ä ï:}Ü“¬OârdmÒ@<2îáÛUJB;—rãw иÃyuâüÇ¢5âÏ+©”*ætޔř˜ÀŒV A\i@ÔAË*rTsL´&  üxö€¾®Ï—‚¾«©ùÝŒzîc…wxkˆ’hZBÇg „Z†ŒcR1_¦2Q ö‰ ~¢qÉ[Ù \7¢ÛóÁœudB2¹9—ÒOÜ(ð’;c!VðUŽîˆFa ÊVùΚú‰ŠNÄÊ1™ $¦s>j£¤PX¤ÏÖ=¢v˜cs•#`ÑÕ^5ÉÑjÇjÖ¢ð½**Ï=̨¯ÅëÖÒ“ÇPA­iq6Ç'Ù;ºVÔ^"Ò°Ä7;’î¼ÛÜ–rç÷¢åó\–Ò•Çâ`aÂ縮)p ÁÆ f@Š“pä^ k K؃ñG3\’ÈW ^c› ¾’}ãy±Éýû¼ý8VÏÛò±Å¼¿ÇˆcÞ¡Î[¬ã<rà>²m‡ž÷O­´Ì[^FêæýÜôλüŽ ˜÷oÀn©#ŒöôÙUÎÛ]ŽÛžw×½BbÞÃÄŠ›y΀ּaËðׯ—VjsˆnLë JPT2låÉ6λˆÇ\ë#àZV4¦µ°ò8(¶´—£Uß¼_~Áˆå¤Šçý2¶ROû³Ì;:°ìË@ìq†ñJŠ6Ö‰¥3OOì9Í;­üµ›³2ܼ£8£Áœf: G.`é‚742 [ ã’Dk‡ °5„Çvl¿X—6Ú^Y}<â5…üÖÖ­Jøúcu«ŒÝ&ÆêæÌF$Š5„´«…rp NM¡„íÔÊK±9=/J]ó~/uÊn [2ÉrãNÈ4z©–m»$•¦n2¹¼Þ$åFíØe‹19bòu`稖ìmNN® dÅÒÉodž¶‘ÑzÞ j(Ž[­´>JÌö1ZÌœCv[©šê²++Á®SXk/LGå™zãHn¿†{£Î{Ç%H¿Rë J5g'Ëj ‡¤’lŽOÕ Ú8F-Xu¤j‹Ä_y%07Õ´2\ïìºöÖ $­ ªädFâÁ…® V„'ÓÉŽnðrËÓ!s—iÕ÷ ? }2-ßb|{Ë(±<ˆ“l{®òÄâKy:èL)÷ô–GóŠvJX<[w‹]Ï…fMÑ÷=€aí²N=×±wÐ<ôÂ®Éæž¥ƒ>|ܨO{ùq»?Ö+eoŒ}¬*ŽeÇ©29/GâæTþ+¤•¡Wê=UYÇB¬ssJ-÷œ¶EÅd´\Ú{’®æ2íÑJ y“‹Æ;n7`¼äýNou¥}Iº²ÛJn+ý­ì·2äF+‰®ºrì!÷§GGBûñÙÅwgËPè?œ¹éÁ³ÛÛ¯®¯¦ïß¼¸º¹Æ+¸ØòîÄgçéG„[¼þ¿øþ,&Ìãð<óú0Wü¹WaWÈC^¯0Tl|[øÃ;Å}ƒ.Ö-\Ç"ª®Ã—ЬØã¥k-yré^îœ~§FGB‚y0í|o*žod!œç%µAÜYšo´ÄÝóºjï¥xedQ ÅŪ~[ýJzÕîÖqÑ'¸ï°ØE©,?w·ýe)n‘B…‹¤F … KŠíº2©ß¾çÌ\^®T·’èr9äpæÌ™3Ú-å¿4¿þ>GCqžPªKó©k—…ü#¸|šs'®ÞIÅ3&äõcÐöçÈ3l(~ý}.ýħÐîˆ)j;± ) ƹ0ÎIlüitÚÛÐø“Ö}Ò÷¹1I©-"þXUç¬_+r‹6¥¥?²o¡¢GºZ‡ïIú‰cEžïÊ'£›Ã ÆÚ>,«W.HªQôNœ ˆ·¢ŒR⦿G)ðq!É·ñ"¬HµY“8¥nm'ÉÉq¤žbÔ£ózÏB12³HYA# ÍÖ–˜°(U=MÁ§S„ùT!,w…¨¨”‹7Á¹ ª³tß…¡)–’¸Ù%I%y¯¿K-J·¬¥Èbë‹Ù&éÂ% k¹“Ò,;„Èn©ÒOܰ²J’ÉÏו ¶^VHUüP˜Ši'ë¬dF²+\Wˆ0ó`ÕÊ”…M „+Ù ×V.–_ç»DGÅ{µýŠ ®(ææÀ…)–½¸(Å'Aª/0|dÔ¶*äÜãü²†%ÏF©‰œ‘à†5˜¦¾RÃäš™>‡¦Ë±Ù€Àt(1=ŠÌh¦ƒ¢é¡j¶h6=àM_ÊÃÎ6Ecúº2}á™mmš¾|M_ßæ€œ’„l!3 ‰[ºžòL&“Ùk™ÒPÙUù•ªÌ†Ì´mO+Ý™–ƒÜÜP¦²iY5ª”(¬;Îyb-ŒlZºÎ_³¹©öù ÓÞ‘ý0«#ÙU³úªÏ1í{ò“Mûf‰ŠYÃ’CgÚØåøš5ÀmO,)XÛ¦_røšÞjãªjû­hztÅY“¡eVleü™€t]Ù—|@š3cÌ׌êC öнØh˜ZV¦­«\{¦->©NÓ°i*8×øº‡,0…,˘øBv«|R^¥³á¥F(*y‰@+»Èo!M«Þ€`iE© håªH«ª–`ô‹K­òUÄŠ.¢D`-‘= t“9ýO˜ ¾oUw‚æÆÑ"ÉO\;YOiÈ9iŽ‚ç¤ú‘s 'G!m N>¯±VðnLYwÑÉ+BÛl®ÙÅlÄEß9õ)œ* +›=“sJi΀ׂÑ:)œŠñD/ ‰ÇÊ8±fΑC%Á#ëRþH)W’ËÛg›ˆzÀ첂v.çê†#K›ƒ(Ïô º'¸]’‹uјNnÊE €8|˜ƒ$KªŠy™ÃºPŒ¯ß²ùjïh¯Èެ~dW«§ù9íkò›ë“KXjTJìÚÐñ4Ï_ZGi†9¾júš§œMI¦Óâ—|÷h‘QSv\mÀ×`O:ùuOÁppÁys5Îr®Öþ ¾\jô’èðõCoÄsgJ„z.nž­åfzWç«P¬¾Ëó’Õj÷üM|ºØæ,ä OSŸÇmª{4ôpÙ"ªÃœ`r®Ü¢V‡G`wÀoj¢¯—bY+JOs[vùúZš‡Å; ‡îÔŸCØð„DGÎXÔ©ÕãÝP"]IIÎÌ%ùÊM_Æ|z_ nj8’ˆHnÝAÄL±!_‚jñ- ꤳ䥂ÊÂé· ïh׿P`oÚ‚0R?/v?ï~÷v÷v7"cïnvixñrx÷íÂÉ¥^}ÁÿF4ª“Ëšå»õGŸæƒ,7º¦I‡²ƒHÅ¢rô¾h³)—¾œº‚º0«Gs'âŽOΠEÏ+¿ÁEÜÚòÔ–Äz¢‹ÎÓù·!n1ÚÒû¦<®m+Ù4›§2³íZ›¶öžh}-Óí›æ»íÏ}WÃm·ß‚^5;u±U RÂßë™­æé•‘ZjvMMoI¿)ùߨ>±ÛªÃV<”¼SCîØð -èG¦àµÙÏ”¶l™Ë¯ãÔ ëöÌ,f}”7‰è›€<©o}#é{M&•®#õ-«Åà*ýÅ«ýý^ñ+(Œ8od.t :=æ”) £ß‰N=?g9¨-˜b@¼“Ÿ9w`Á4oSÀ2‹-étÂT;˘̘Ù|ÔʲcˆÃrºŒÁÓ‚+n´\ Ñëèfý’¸,pŠB+â’ÇCô“Èñн)À18–LœX-®O:6òYóÌ‹,Ÿã¤ÚâÈ#c@v¤µO‹ \ V~/vZØËùÀ9 fYU–[|˜Eâ3…’„@©ÏNqšyQa 0WrOd M‰‚ñ25 Xñ2ÊáÑ¡2ùx’€!²¹­ü–«Í¬ªÖQœsqžuz……#‘®È^}K§‹‘SJApºcYœð¦ > Pm gù•)ÜÌÐÔÓ5Æ¢àñ¨‘ ¥ÜÄ–}š'1²‹Óé5xFJÃ^ˇœ3AQç3¾OD,Òä4¢:èÀSÆ%²æB¸(ÿ²ËrA$-õIv]¸¦J^|Œëjו=ÎQ=¦”!î˜"¢~šr°°ðÖ9–b¥c3t  óȉ{PÏ›•Â'8˜†Úüé2é¸Ã}6 [•}<+Œ.ŸE|µúQÁЫ°¨\w!Î&­{­ÍEª!×5z‰°2뽦:S 2æÜ>ã|ñ™®ÉH:Ïio? Êôv‡²Ï@Ÿhášæ v¯ ™ì¶ >¨‹D»4Hî–wÔ#©·èµd*šÁ•%»–}u³®ØyQ:ÃP–§O´{¾l]CR›ßǤŒBC·|¨Äb¸§ð¯p´iI:¹©L^¸ÞT²/ Á”Žp½S䥠X,f‡&\3yà Q^•¿7Ÿó < I0º¾s½;{Ï&õv¿¿º»½><\Ý|ºÝ?ÓK^cI §›4: †Á.àP;Pï—ÿž}à€”’tÆÀ‘/ °YøÁ’(g°:TxiKZß»;N žtc:îÌÔ?e‰tD‹¢ƒ??Hg8»>öÒ³ÿíÒ ¬‚|#ÑT%§¬3Üù3:øÙž“Ëï^=<~ÿéúñÓýþêáÛð™v¾ûá{ñê p÷åþëþføåãÕ—Ûáîþæöåð{ìú#þݹ>ŒMß¶ÓÓA%æ³EUâse‚Êàç U²Ï– 2C=[,Àê¹³#ƒ  Ï– ÙꙢ>_6Àèá fÏ–’°ç‹‡“Ë£äÃÉåQâäò §)"þce«í(!Ã㤠¬ñ£ä jv„¤ áQ¢‚†GÉ %Íc„…^ù|i¡vLj m0Ï‘´8F`œ\îÿïV …òj¿­$ýñ7º¯]ô»z|¼}ØÿxûáÓ/WÜö÷o_ò©¸ûìþþóÁÎ×û«÷ŸoÿüõÓÍí/ºËm{ýŸ/÷ëAâÞRº6ŸrùzóÓ·»÷÷Ÿåw¸<ƒû¼òâ§ëŸ>ß\¼Åc3¼y¸Ú¸}¹ûŠÆáÍn<ÔÁÿÆÒ¯Cþ:üó_ãpƒÕw?îÐQgÈ Àä@êP˜À¨   ùb'u™KÝìqifíPþÏ¥üµìÆ’œá„ÖåÌ ÑÌ.€Çõf9Ë%t¾DxÔï”`Ùµr UVsN¹Í4×gLëUþlZçó1Õ¿‹ ­+qð!ª®]ìŠ;ÕÁ‹Ýá1#]8¼«+Å%.lâ}O„¡ SùÜ|Íg¬GdÖk² ÿå¼Úvë8ŽàœØ¦9šû%yҡö0‚"i‰±H 4…Dÿ–·üXª»gvgwö!±™g{gvº«««{øO(·âRÒLÃeEÚ–v˜]Ø£´À·é’nº’ðôa÷r`l>Ÿ¨­c´Áíí%ÑX¢'*~‹³†ÛƒJ~Tòc9\†; ×*ÐT^gë/‡(8L µ  ¡6XoKD›F¬×3ýZS­1%¡ 2pƒÑD#XÔEz ·E#H&)¿<@ˆ³ö‰ù Iµaºü0\ b±,è!ýOL‰‡j+ÉGI&3é`ü¦(#‚âå΋)GšKÛG9éVdœä“™ìjþ1}¤ýÔ °â²<0H¤¼ˆ£W ¦ c¤»×ËÛöÕ'øœù˜æË⊦Å_ŽÊæ© ªâÒEΰLü'‡ÆÒtiI†`Ô%Œ½â³«£KN)ãy¸¯yoñ.äÐSÃ…°z]-©–ùº•À²r…©£wÕ’ãž)³PGµ· €ª}cAY5î,©&ƒ¤K¾ÔS5æ]äP=wÔ·ÔÕHTµCgµÃzµSj§†ÔN©©uEV÷V…;£ß•wê©R©Q*TãU'(jGw:]º<ü*úšM‰5FTMÂFËC)±v6™ûp:nqÍÉÈ1'¨½ÏjÁ°ý ùu[/PÏlý¬d„›'[š³ÊïúWÕî í åœæEï¼ì}®_hN].àܨC”bâ2ž_TdúÝ‚ËpÂÊ Q"zgËâi;{‰f ¹‚±ƒÓœ#è;©Y%Ж.µ€±ÃaÊò÷—Ë·yy,¼=Ä:mš_}æéö5M¯ÏýB…m»·¨Á4@ Û˜†$]©$Ç8\%FÈÅrÃ2ŽÇíðŽŒ[zÒe`±\ÒJR,4’ÏÐ\š;`"¿U j†™†¤àmIÓœ ¨2T˜5e"L”K¹•Ñ‚¨W Ѓ+:ößQ-‰ÝqjÇ«¥Îù¦.FµÅ T‡ØüZ6¸fÛâ/ÇÑàÑñh•͸&¥jøuÜU=y+ªãø\|ÏÚ»\¥ó 5›C=èh0„` &›`½ïVp1—øfUh*UÅ™è2Ë£ ‰BÖô·À#Û NÓ…ð§jlp6ò|ÝíouöXU\Bõc :ÝüîSOÿÛ©©dT°ñ´ÕckpN­Ä·[@ü:öÁ^iD7Z#Ò½Q2zCG¶o4‡ŒƒêÀø{t‡eúÿUñ¨=¬í[õqä?· ã¨A0Ž¥Ç-h«CgW;JtvµSõgW;jtvµ£GsT$é³&QÖFU‚uG—`ÝQ&NÜŽ—{ê$|«Od݃iO£È:ª”XÇ<í)UÇÓN«:JwjÕ±_­é?*V_LC‹/u=»zùêéùõýÍóý§Ç맯Óy}ùôì›Wß÷·ëçç»§ÇïïÞßÿöütMË~üúùî|úgîåéÓ§«•o¯ß}¼ûöËýíÝo²ÊŽŸ{ó¯ÏŸžž—ý ÿ¥©ê«7·?|}x÷é#?û«Î1æ)‚.[ÞdfD‰müfÒP© ìD´J$¾Bµ2ó,\¡=DFˆ%‘Ó¢§+f+üG|@µgÍ‹å·Z^ÖÝjÙ^PýÕµ8"žªÅÕ <è†5‡¬ú˜µÀR¡S=v_µ\3 ºp–TŸ¦šI5§²æZÍÉn„P#kÔB›J,µ0‹Ù×~ á,ªÞ×åÞÖ¤\‰hÕiFƒ×!+¦ºG?Ø_7upYÙf­+®=Áb.>”§c˺†U_Ä\è«U¬-ƒPölˆb°ª8ñJdEd'³¥×%5 S®¶¢)›š¥ØáJª| $qˆ¤HHU„e<€0ïœ.b³3 KðI“+…‰°8#V¬ŒSôöŒk !ŸÍl¡O8Vöú :ǹ؟ÒnÊâ ¹ËUÝe—V,é7]âŽ<äÅ !Wj1rm0¥ûXfì ‹'ºK‚(Jbš“8qš½¯iF‰HAgÃÍ ãÊjM,¾4N9=ÛT‰'ÅT:¡$þº©WR'µÉ§øEÎóJ‘Sà5M³©ŽÊª ¤ŒZÑÅiS—Eú…÷}ñŠ­É˜\»Nl5å§•PP‹Á¦•˜Ä‰å†ÈÉr3wM© Í;é¤ÈVæV–™ù,l)K7µ»³– 9JUH#ŽÐiUCóÔ(&BËס¡¯j 0Öz§NË;™7Ô£YȳPMUd< £u–°=#ŸÓ<’°ƒÎH 1‰Á º9¦"-‹Z ©7 dBEÊGf§fq(¥1jF¶À0Ð)NcoÝtßmwø¶Ço‡€¦Ô¯6£ÄvÖÇ‘íIJiÆ©§‰sÓæ&ÍMsÇáj;m4!Ÿ«l¤8XCšÇ<ÒŒš•*)ÙÅyHdÅÑmhdA’©“õˆ5+—iQá¦jUÔšê5Ñk¸èbÓÎ&M[7â[/¶ãõåáôî ë`~ú@·‘·×w·Óû§ëÛû;ÜJ>Ÿpñè3ô#€t'°ã˜s@™É`ßþzð@ÓY1¨ö ²¶ù¨£ ¨€{†ôž¿àüÓ ·„¸(ÐÇé¶7QéHFŽƒüÀ&ìýµ†Pg,¾"NºÂ60Ñ>KObÿ#ë¶;B=p²Æéã(̈úC6ƒ4_Ê!%ǹT›A}]PCá #Ñ-ÑPIjŸ²Œ•ÅùÚRÜò|A=%óÕL ÜL)DZ:/K›J'_p[ FÚ dEúJHuâB¤ÜVœŸ/ˆû.×£®¨½ Ït. 9_#F…]PSIAKÌ©P»#.NEº ­A ¶-â €ÚKO1²"ºh¥§ g¡â]¦Q”~$qßnÑ¿¶Wñ×jO ²€†Ï î(ÔH{$·*xèØ7’#dŒ&þt¿ºzÝLËn@r7·+ÜxGÇòêv_í=n|½Ù fTÜ cgñu{€ÝÏr0tHKÔØEóÞæÝ–lƒÃÞ‰ÝÔ¬ï¤ÜŽ)ÃÇmÖ ÙÌq)ŒÕîØ ˜¬*(xžÕÔâ:U»±š¬âÜXrêÓ\¶n¨[«ì}Õþ¦»6‚ÄÙÆ"›‚ÛˆÆØhP‚eí»:«m‚r£¾AuAKÙ•)Aü²‹W…¢ïøo l 5*'¨=Ý<’¹ëlþþ> ì"êZZR…»¯KlU"ã ]^K0ìbQºlk2Ïàí5}—¼ï![!a«þØw-E-±Z˜C± É·gí{jªŽKCèEWDw:m!êe2Ê)ãúZBÔc  EbUûPŠ„rÜnÂ=•¬ˆX vMëG-¾(G€#»Nx¾°Öâ¦Ã ƒµ*´gœ‰È§¦Ù[9í<ãû¾Ð Ÿ÷ßÌ|·¶;Æ+Ì‘ÝsuóÔž3¾ÆÞ¼=¹‡e‹JÝ:ü&ºÇÖ™‚ÓR`‰ódÙd2Ážï" 5}Ç kà°G„ qn{:†;„;Θ#¨¹©^f- ì+TI¤R¡¬Ú~˜p®8v®Ü,]$÷›áYÞßtáæ;Ÿq„HÕãóOñ™xðbY>ä`NÓœÇsªg4Ìp9#jÂ1Ù6HžQËðÉ£;°'à51×K·Ü*ЇË44”]¿•æ±xëýXàAý9’À‰'ž±‡É©ÕýGz#%žŸÌÅ|¥e§7æ3Æ‘ðŒæ¹g\Q¾ˆ©y _€Š½bQWÚ¾ÔQÙ9½ãvàýí­9tØ»± +âðõŸ·_nûxûxó’±O_nåþÝ÷÷Oÿ:/<}^î?üGþxiTOŸ·,Ý¿Ìi>dy€Ð+L&”Mœ@J‹ È3ÐçR€Í©\ærš Ž6 Å=àaîàp=q,f^ùaëÈSg›‰Ž“nòïDÜ4:Óû©¼®s+95›÷2sîZ§¶öÞisíÓí§æ{îÏsWÃs·? ‚Y5t'uqV 'ÒÃ?뙳晕‘ZjvÝ–Þž~×óR}´;«ÃQ<JžÅ4ÐÉ;Nü ø±r.S?àèb~–rfK+¿‰SO¬;33Íæ(Ÿ17>ins#™{‘ÊÔ‘æ–5bðMTúw?¼ýþ&Õ—iñùçAŒþþ#5 Ì®øe©‹L/_÷5‡Á*•¦É]9ˆK²¦ý¢q  œÙ^U}J^8a4VøR}Å‚/ƒ]’ãâiæ yÒEJ‹:e™hˆ—b“€G½4>4WX+?JÃ/5‘KÀuÏØ Z⾎x›Ú…„ÊÚê ÆÎõ¹yËÍ8œ¶ç0cÉJL™vÈqâJ.R%+~ÕŠ,æÚ—¹…Ê“ó.}ÂvöO™v_Ç#SæµËºÚáâRé\qiÎÙ´'ÉÔ±5[t˜¥W à¥h¯ÎÍk(ÖX”ÐJDRd¥ä÷•WŠàÕ×0ìZŸ×k³ŠÂ‡ö¼Ö5)W¶•U ±¼DãÏÄ”7Åè5ӒΤڸ¬y_yÅÌÇ{$6E)C«^ Xíà%'% |¶ËÒ’+)¯OÉ™$$Q UáY‚æM6+7Hà#ò-ð z€Œ»­I• *×JPô•×›`hQ8ÚRÜèÄiE`ªôËàc"A‰éª”f>Kq¥®íaE4“¢Ü_ža°Å§<ÖæŠçñ&[jà <ß»J©øUú“<‰s§I`AoBÞ=å`J%î ¯”ÑçÃžÕ F#aÈþCY ˜¸´P´Ä%é1ëØ°¨¤+BvŠMhýù D Þ‚ÅÆÙ#G­sÏ ÈJ.”™{!l‰(€\µmšéßÅBð&w¹C2¿XÂZ]‰ZÌ)i¯Í4ù}±†àAJUž¦or> ‡Õ-[@FQ¡i_ÊhS‹Â .²"—5ê’&°“½æKnBc‰ä7{]þª’’à/$öq:5¦+i`¥ŽÃÒÀ°Bây좙ÏqØà¯ÁŠÃ ©'8¤å­×²\¡(0W¤Óª=ÞœuxQm|‘;=–ÔöÈ8„ï+ÒJjt—¤Á¯¹îi‚’Fbá"ΕÆb=›Q–nm>µÖ¿+aF‡lƒ²;Å#€º0¢Ž|zE$¯£¦¨+¿,\Y‹×VÂêÖ^°TŠ4¶¨"yv ¹MÚDðqÙ?ÀnûqÛŽÀê<ùå5-ÙÅaµÎº9SSZÌá ç°d{U¶gF5Û¤J°Þ…M~ º”)ž$ ÂMý:ÉÌ‚duÕ TT5É’F£nÕ—jÏ#„p@¥j×PØeŠ C<À)U7° ¾@8+Ä„¸ú Û ª€ôðzÛ—bïogHHÏ&îµAÑdÝ´ò)ÃlíBfÓMÍÀ÷³’z½½üòëãÛÛO_þrÿõ¿?}ùíç·ÿÝë÷wÏBžöWÿùõ%MŠý3ƒëšO ýn¡6)ÛO_o¥>³ùLE&ÉÛùòú|ùæ‘’zy’ˆµýÈ_D<¾¼Ü>Þ°õÓ—[¹Gm©CÏ,(‡ÕÇ$¥\‹J¡®ÈJ½òаTË+ÒÒÆØ‡Å¥mä%,/ L^’˜0¼&2Åò¢ÌË+BSÌ®IM¼ñ¢Ø”ò‚Ü|ú|Ip>}¾$9Ÿ>_ò´+²SÌžbtAzªÕ£â“>(?ÅæQúôù’EŽ/ˆP êq ô>(D¥V.IQ±»&FI—ä( è’ UÒ{P’*Å>*J•ѯÈRí"W„),¯ISíÏÄ) ¯ÉS½òŠ@ÕÆ~A¢ÂðŠHU½ô¸LU»+Bõéó”êo¿¿Ý…4Vй?DÝýxo¦ñé_±T\쮊¼í¹±¯K(H¢›ŽWIµÊj•º„ï*‚$ÁQjE|Šð‘v™™›7¼…½Mˆza¥Jò€‡N CÌj6¡yï%r¨»ä™©ÆvrzЇ+:]ï"í…RYä‰VM]×$ÊGºn“¬áx(u`÷JÛ\÷m¢©ÿê‰/ß:QöJJ£pÑxì·¥ú;™åâc¹“KÙ»+ù³+þ€Sj/ƒ°þzVK~Ô·šŠpÓ碙ÃrñB¨Î K0ŸP£P¶È›Áæ>èt >⡯< ƒ…HÒW%xc|Ü–\Œ%1³HÓ@¤äÛ|à[’rH™¼Þ&«ç½Ë' F.!XX¢.Dd_þÊH’t¡T¼{¯ý‚‚™ƒ Z1aÊS¼_¯Ô_•8eU‹piã *´‡Rh¡4uHÊOÂA'[Y|}—”É_<ïåýó¤ô$ø2ºýví½:Y¼;©‡+Àc= =²Ããà“‡]ƒô8iö8ÿ„ ÐýDBÆÕ–䜯7È„ Õ× 8¼JJ/ÂA´¹’DÞ1iEÞ b#C‡7ßr“ Rþ?ûÕ¶ÛFrD¿€ÿ0/l##õmú’<­dÇØ, ¬°@4ŵ•¥(ƒ–ëïsNõ3œÑƼ@d“žTWª:'kKà ˜ÏL¹l"‹Æ“|åó’È—cÞ\,„…”7óÕ-«i“!>Q¨¦møé/⦚D5ªæY;4 l¬!cbÑ^–ÄZs±ˆ»¬AÑ™U•Õx.±L ‰Æš­nuYj`»èû¨î€Kª„!5ªùM´(íPZ á|Tж·Ø%¾½}øÁgOl!2"¸ÙÎÉO÷Šüe2;y×h æmcQ¸¹l$3Á‹Äz×8,æÈŽEã¾F!}í}ÚYõVLÁÓ÷ˆîZwé„ij"¹y( ô¤ŠÅÅHû÷Úæ¶i”–y÷Ô͵Qqù¢Ü‘³žgð(²!í²ŠC4—’¯ä&,à‘¦,^`pSØùÐ}Ò‘åèC¨©-"I®Ç2Pòðhl@êla8ØzK+•W4k¥:õìÉSMÌÙ9uOöÓ›cÌ]G¤xsÙÈ$çm£Ó<ˆóË h¬3ýëc7H—ØvúÃúþÕÍüþæn5[?æD.NDžÿ𣶟Ýß/Ö«w‹7Ÿï×3.ûåñÓâEñ',TÅéÙÝÝrgåëÕìýrñæáæzñ9¯2ýã^ùt·¾oú þ&i“:,TW¯W×·ïï–òÝ]ÁƒUmy~q?[ß¿@¿|À«_I9çž§˜ Ãÿ½s˜‰¢¸á/¿O6 ¯Cñ7|øLÿ.\ñ¶øÇ?Uq ë¯ï&Öˆ0)I[b¤Ò¶Us’Dn4mL€°4›é„”î)“44o`‚¬Uà KŸJ}/lŽè¾&ØŒÕÝwöîž;ps˵Ηºïõ¦|±·óßÖŸ] \…6´ã º\ÛU|í>…§6/ÍÔ©»¢ìRv/Š÷Ž»Ó.ß m^ŸQM^%`„ø£¥¶qÑmæHô爖”’ùQG€n wà; Õxš’–˜Õ,I±hÏIWƒ¢T´Âå¬dMˈū¢¦ÀbÅò½òÐß ÷ Û ™D–I6A ­r).0*´”<&ÄÔ:¦äer¨¹¬ŸÐ[>ñÁ^¡—!!ÂJ§ýHM÷È>Ù$JVx<• ¦&®q¨é^L%•kéÐÞ"âT:h3‡vÇK1q5»¥RYÀE´½-JQANPÓ¥…0Ö?±•ÓàÂ!h¼TÇÞzvØ­` d™˜P hTËÚdp¨f«b~wûéîau]|þ8û´(nï®Û³ÜìŽâ® éãšµÔCv6v° ãqèF÷ñÍfÑCø³«>ÆŸ]  \J¹Á9\@:¬}¬Kkè¡îã=‡¡ƒø(æ^òߦ®éE^ÿѵUf‰?¯g«‹oÂÓÓDÑ6DÑo^ÜE—ü Q¬j¢Øù}à˜þe}Æ1EmÉUÒ!‚ B/ÈKaŠÅ˜"j1äd¦X!SDïLº"SÄ[ªè[LQx"Kœ*ò•’MjˆD•Dq€'Ué.O4¬–]žhjN4ž'Ú¯óD÷-x¢;ˆ'Ú#ybçýå@˜ÊhÆ!SÇñD»'Ú#‰ƒZó—ߦ¥ÅÀgÑ‹j*oÅ„TFN É Õ‰o,J½´¸ ¬ŽeC1—ñª,>V 6¤b)ìÂèdn›œÂ6ІäÄà*_eƒ€²QÐIÎÁþÀËe-ˆå’CÁYö ÍIð,ÀRlîäèÒªªhÎ…è Wáå9x¢²à6–áb#äówl‡¥ˆï-¡ÍûÑY¢Éô¦ùå6ƒþ¡þcÚðïW‡Šè§$G'%ÿNZh<"1Òº©‘n6>9$½ôÐ8:AÑâI¿áïR‚.Ù@Gl¯Ãó` 4Œè—h£«û<â_8޽iÓÁ²­R‘tÛ™XwF8”‚÷Ð+!Ö ;G>iüMzÓÆéËV? ±fZ/¿u/Àä­œ yp ¼W“Ô#u[ra”Ä £Ê'¢9q`û˜T&ž`œiÉ–³ Ò( 4É£•¤Û@”]äýØ© °'@Tø ÓÈÐOÔCt-@Tn¾ŸS”V[ ¦*•¿Ë:¾èb‹‡ 4ÖV œÔÖˆ;ðÏk2ŒÉS ì¡N“ü\ g%^#µA4&e© „Z‚âàd7nçµ`ÙØ±QÖÝN€¥er*—Oç±¹\Ä''2!V1¢RÂð’#ƒÙi'³Ø’5ð”-ƒf¬ò>‹ŠuŒ…Ó ’ µ¦*R)n"^ñðñLˆ2› ÏA‰#Ä^D" ð@"o‚DYo±ùò !ÁO *ÛUH*ò@žSà©`¦B h«dÛŸ€YÑ{ŠIR ½$À“D v’G™ˆÊ+ÙdPçD"$’¯°“X‡{Ù^,³Éº#4Ï'b’¾ASzh1:úÜ[H&Ùéœ5MJºY;ïåq«êÅsáqV›ô¢8½¸_߬>ÏÏÎ~˜ÏnßÝÝ ­h1Þ,¦)DEDƒlÙ¡p¤`È1ìÖT¹¼Oß-fË·3Üø;v8HºXÞÌóÙÞ¼Yß\ÿ´xÌ>|ÿüç—Ù{4«²øy=[}X¼ô*w¾ûšG°’A°Ò ûñíÄ“_K©@ZT‰j¶1¡)ôwÏÆá­à»ª¸Y¿£ºº&ŠÂή²wnÙ»'u<œv]~R &óU­Ð0uT‘û~ˆ õ„`&û2‘@Ú}dw…/Z³¥É/ž¢,ºì:5FºÁlöRб§ìß v¢1¢¾÷lü½ÐBh`ž|@x¨ xVXL‚¯s·µa¹C»,=ÆŸÇL£8‚F£ÊÚ¦¼¶ cvMÈ^wŸ-kê£C}ÿùDœÜ‹ï¶ÝH?‰[‡æ¨2`Aß„ôíÃkIt_… h)á.Zyú×vê„¢Á8í€uÌ¥g£/óÁùøµA*YØ\»§uÄDÉ´õ±¼c…ægWx>ÑØÖÅ4L]ÌÀÔÇuÛx0²)QzØf(ŽBwŽa××>Ÿ]­Zì¼Ò’*ާ ¤%•žÄ”Ù$ê9ïšëêÚvM<)— Dl†œ4tžú…þC}µ#» ÃÀøn_f¨áŸ`+·¾E&UÊ$÷Ï’%‚´-KIñ^gA@‹Åbí¿ÎK qÏmcnäæt÷ zÒÁáã Ä;@,â Y'á4ú³FNòKRJ’ïš#@f—>Ds¸´Ãê¶™ËB¡íž/„-Tþ×tó‰ÌóñÌÚhdmÓÒMüÒ±½%‹RšÅâMæ”´è÷ëV±4ê­/Ãⓨ="} Õ}†è¿s¸œÛÿºÛÚ¯¸šœ“Ôa §vÆë]oïV*޶ƒ©çS©è #„MÇÛ×ùºù¾ê¾§A)yêæIiÍ<ÉàJ©1U¥Ôx‰!®’W¥¤zq§Þø€†Š¤ ‘ ö6zùRá ,ˆÖ¹LYI…Ï1$`Mk®š„%X­Þó6o½·\8Î=ŸÉ¶‚âJ«˜¯TÊSQå.ÚüT…‰PòEÙ"_Àe"N*„`Ç¶ŠÆ…¥j›ê1)N«‹*ˆrFAD É’÷›—âŠ!ùmYPÚ3VÁÝ~Hî¨|&»v5+,NbÆÅøb*gÄLröMQCrÁ@Jtüj'ç•Ùõ&?鬰¿ÿKîùTnáM†,Su£@ç\Ôô Á"¤€0 憭ñm ²ÃU(&A{ ŒuÃàp¬úø]@ríìC¾ÅÜ_¢¶ _²ÛzÛyhØyê”g0®X/eÝw|z3¬ûNwÈ$ÿùçRÓO“¹:™,¤LŒýb²k¯($Ùr.PºÊŠ‘Í"›EæŽ§Š²ô,D‡’·“ꀹl1zÀ×OôŠ $×NâXfÖCh^8‡ã¹ÏaDí‡CæžÁ4âº5¾lÆQ[ø“è.wØŸuD8g!§r©¾°”þõûú¯Ó j‘æfÄVlH ‡æº ¬]M›OZy¯CÒª°ä]XÄúºk„šeµÜ.ÙÓý’ýôf"·yûC-ÎÕ·†ßŸú”ñù,”¤1qÂ"”¤sôR'é8y•»6`+´˜„Ë;Jw¢ARÁ%:VII×é$Ðè²=ïðÿã:éhîùTnФŠÚ6Dø x›´õ2&åó ãGP\Šb(ègSnì¼h¨˜vÞl&”Ô,õ¶Žp®j(_ý]ßUïê¼|yn ¾˜îÛÚ¹Í$ú°0ü`|e endstream endobj 230 0 obj << /Filter [/FlateDecode] /Length 5700 >> stream H‰´WërÛ¶~¾þxFê„€A¶¿$ÅÉøÔ‰3¶Ó“™Ó3Z¢m%é¡é6~·þ;/v>¯R;IU·Äb/ßîb /dœ‘€,7ž^¸Òã"(> ‘—†ž`…z2‰:”…£I²C:u^9”¼ìlp³±s:òÜ2++1 –æÆQ$öÆ9m)h½P»08µ†F5c -ÊÖîPh¨µkrh„yäìbìÿ©síüòÞyïPúaíDd2%þí-„ëh9‚½ÓÄ¡s#÷»H!Ð.O»Ë6˜ã€Ò²èÂé8p´ÜãˆC#£}Œ}ˆC‡†s·èÀè¢Åï 1ÇÌò"',¡NÂ(+øä̉"/Š"âr/ x")Ÿ<}½k7OGì§ÎüJY{Ÿçé.[“›2]o²¼" ›7ð‚0]n^¡®…Æþw~$¥¤"’2õÉaß Ô?:£aâ…zb¬—ˆ˜|@µÕ È‹ =–$ñWdC¦ ^Æd¾zºÁù3 2.=dž)ƒ×09Ÿ;¿ ꊀeÈšˆª¸°$Šc|P²˜’ON$=ªz2ŒY¬òª¼D&/f×nžŽØm—B¾4]x\"§;K¨×袣µÏ¼‡PWøÑÒŸ•ÕËͪÚyZ>’_Aš¸Ô`K¢)ñ/ªr“ßÉ|>[­vçE•*Þ)yÎßðw¨KŒ£:†ÒHÄTÀwBô»’Ä[TçÙª(×8â/4VdZ_*p8`YtyL=2Füó,ݾI¡ÿ3xÉd1;y]×ÅåuQîÌV T꺸ʖ³“d ÄÕã6[¶Ö;ë5ß_Ô2C‰‚’œÌNhø.­ª¬Ìϳ›Í}Uj/ï²ií–?/Šmó8O¯¶Ùë‡Í:»7\l¬îøó]QV­"7±©c°<Î×»«b«×|9‚¼¦L.Óû*#h¨ä¬Ló›lªû“éP¶QÀÓG,þ… ýM8yCþó߀¬AýpŽ›6Àá§œÐHßʼn'D«•º$ôNŒÎËxزrš…Ûl[YW [µjk¯³Ò·lÃ8RÓ52DÐA×½è9q°·Ò8ÒÍUШn®Ô %Zò¸·Ú¶…èòЋW-Ob ŠXlûV¬|fèVQ GÐELt›¬– rñ5áP}ñDõ¼ç[ž?Ç2ê“Q"†í–ñ(PwÊT_•ø4–Bi )¬}êdUxBõZÜ2ë5’ÇêÌ ®ú´%ÔÃ3™5{VTK6ÙT‹nvÕÚ ‡-³;Tåví¸#n¥Ûwb1pª™[Û¬]uû„zbåæPkT²¶›àvâ,j)V½P»44Å£Åt{ž{˜j[=Þ¡¦®™ˆ>Ⱦ gèÓ×&Ó.ªf,mè" bÞ€B›åiwÙFlÒ!Ü‹×Þ˜ÒÓ2²ÒÕÇ4ô çß G­éƲû ”ÞÔ)ê!Ó4póûÔ=k¡ÇIU©)R ZNEìaˆêðv‹¢@¿Ý)ÍNcÜõTõ4S†S³Tdª¼©/ %‡pS?ºypÐÊéÕ”0/&¥))ž$¤EgÖ §WfŠÔ)cKrGzÝ}ÖÝFwä†;vÕÕá ´ ‡«"ƃN\Ç‘^ öTÀ¾”Ô ŸŸ‘ýüyFbŒÜSÓóÆ&ÇósÒc^—ÏH|^ŠUÕS]2|´¡zq÷ʼ@ài‰±ÌŸ EHÔ7îG<×xÕv­fûíêM¼b¬°k¤%±úÂÊ‘(sN;$ » OX«Åô¸S[óVÚÂ:°¹¤‡Û9æ·ûç OÍ%ž(ôxOÉÄ8‰\Ä Û3 1Œè@¤ ®]à€p «'[Ä=ýÃòä'[5¼2Tˆv*j,‚\CB`xµPÒ iú’«¿íž•¶ÂMŒêõB¥]°0i(x‹„&íFƒ]+íö»1m…Ý¡~·5P¿";ç¡ö,bˆS´$œ*«> C‘4m[Z\fÏJ[áNökÃð=f m(1³±1ìZÇ5A5›VØêw[#Òá)’Ù]3,´†wÕвQÊŽ1ÝUúÎ32 N8Å=Šë(ò#O”Ø(£ µŽ¬†}G6·7× B]ÏÅ$àÙaŽ61<ÛŽ©†Ë¦¸X";”Fðࣆ…º–#´RZ?iT‘qÕuGeŒ}ªÆxëî)€Û7j¬I(Q¨R½ Þ]¹ó–Q3*.‚(о"†ÔcŒJõ xºÅù3,â•ã‰ÄÁ³š~¯ˆX$¡j:"Šx ú‘dºE ûHs1!ÒDKT)^•z´Ûv÷t,`_È™¬7’0úz©I–rªÒßê ì%ÕÕu´ôgeõr³ª6Ež–äW&.:Ž p¡N‰Q•›ü†LæóÙjõ°;/ªTñNÉ pþ†¿Cs|Ϩ êQ¦ÚÞì§V /à=Z#n¦Úïìw%‰ÿ¶¨Î³UQ®qö_häªFÕ¹ :4—±‡Œÿf«Ê1#óòáþ–¼Ióô&+É’SN¿¼GÌæ"Ýn7haw·›UÍy ï}röWº%.aä]åù#æ)qÉ~ ±_bÀüj«U¤«Ûo9È×`[f­âëò 굊‘í!Âa:Ë‘äÛžòß‹Ûm¦X´ŠÃ|—Ùçª*³<ßnòM¶_§VaþÈʆAø'“<¿©2XÊ«‡ÒŸÏœ›ÞøÁgé@8qf^m;ùÂÝ?ÕËýoýûÐgÙížEm–©_D$W™¢Â^­?Ëpß_ª}u#ABc™þ˽ƒ¨MOi˜¿ÚïŸðn©iã!~Ötç÷³ ËÆ°Äd-ì+iàÒµÿã v4 à%Ì'ö§Ž‡OôÁ$ÖŒ€Ï Ü8ýs—º£HÔbSãf6®¦U/@³êƒq©»Q€[#š¿Ž[uºÿýÓéqè,ØÉoÃóäs˜;yÜ;þïyñw®˜!ôÄaé-°á‚÷g˜/þÊ쮿(vwŽï«Í‘Vü‹Ût“Ã`¨SÚ¯Y^`ŒñÿØÜo0[(…c Uºúô]žŠažÞoV­¸IÆÃâSFή¯ï³jªc@¾8ÙnôdU”^zw‡ ™ä@(«Ã7é)%§%9¾¾FîÀ}¹©´:¦ílÏÊš¿4ŒR;ºv£ú$¿ÇئF²‰ýlæÝ—›û»múh–ŠÅ7’uRáç9Þ.gI” 6bIƒÿ³_nKmcYžàt3UøÂÊ>*ÅE“óÐI\Ð3“®$• cwŒLÉrÒð2s3Ï0W}—›µ$Û‰[«¨¡ÃÖÖ>|ßú}|†á!328Ø­ÈàÃ%üñ8øSNð=PÁÛàãgœÂù‡;¼(ýŸ<›ÁÓ`gØÙü•Ø…§AþÁÓµ(ÍJfe¿&§ŸÔûÆìIÞØõ—|¿û×½¿~|BçïùŽgÝä´ßΦù†ñV–¾Êq-i8Gé៽øÅ·8yzš¯+|Åõ ¿/_/%÷ÁjÙ?Þºo¿ÛbwˆÈ³A˜ ¸ò5Ä7óÜáo¯¸”p» ••P+¯þ¿ííïÍ㨃[¾·ç“vž¼ø3>écò ù³eÎ „T†ÄU-qM‹’Éhv•s& é$&º±¡0rj¨¸W’ ´N‰µÈ’ªe ŒNJK.t^2”0Úäg¸ŽOŒN%K“‚¹jÁI8ÌMœÎü08YœÏÐhú"mU989ÒVõ´¥l}4`–I =š @Z ¯ Ö‚ËšÄEâzqy—.¡„5x‹–‡O„Ö¯!sUÛ\žÌU-sM˲Ùhv•)ÈÖp’M¥e£9ɆdC²!Ù¬N6XÐbn “JtÖ)ŽAsÍÚ‘[;$›Ò€- e˜W°v¸±Þx<°ÜY Lr¡ƒƒ©yÁ·ËœTÞ¦rgjAF^X/ ´Q/誵[®ÛÃÙ™¤I›†$ùEÃê5÷Z¢×¼ðÆ9d—ÂqbÒ2É‹IÒIôDŽ$˜e“¥ù ¤ J›%ª““†uIóë:IZ¦ 1i>&bÒ&1iÚmTeÔ?_g…¡â'¨°„ŠMBeªuÖ/C í·ÊKájE éa ¦ÑÖ+æp—‡ÌyAõÌœrR‹÷0·DÌÁ+݆í°e{é«|›ï•3„µ^ÀA Bá…¶ [áö|ÒLæòd®j™kZ¾ÈF³Û¨LA¶†QC8)Fºá¡t^Bæ°Z(NZ§Äº dØã6ùc‰É§da-!÷ÌIèMäëϪ}YûÜ: ’[Á‘¹$’ÏJåSg¡äŒ=°¥öÞ’|ª-÷¸åC긩Øè¡SÒj¬öXLBi3p`…0ÚåÔ€ï®,¾¸eæ¤ó¶°UH¬ì™qÌòQeï…RL, ×íáìLPòJT¯kF ©ìîr¼1®Àje"ÎÄjx¶a;‹ªæe îßo•Bžsž—ÐÂ+Å)¦µr8¥!÷Êx*¤+í,ËÈYÕs“ž‰õžÒ’ã¬8àÒXîI^$¯µË˘Ü]Rzãyî.ÇË_a’sM»8¹«Zîš0¤#ÒÑì:*sͤ$ÊšêZ„L0HM¡à^PzZ«ÄÚ $È@d 2huR‚XÈãÞ Œ ¹wÎyFZ¯€8&Ñ5+H’‚HA¤ RЪĸ±§NØPYÇ!1Í )¨ò R[A$5 dNðn 6¥È±©…s+weBƸ€sÖ2§ÔÂà܆΄ý¸qCï²-tÌi¯`ïH+ ßWÊ8‡P‹”ïZê»k“SqLÅñ”gƒû÷[¥ÀçÆÕ‚:CÊ+•¯U˹T8£¡âÎ:*•«m.C檞¹˜Ô\÷Zb^óÂê:Ç'©«di’¸H\«—̽%Ò^â‘ÐL)—‹ Ö¨!qU\\öq‹‹´S˜9ICn’(mŒbè!+„!=p`š“×›HÛ2Ä @l‘U5ÌJàÖØâl­(“Ü*™TJ”Cl3xÖM“8í-‹(·QäÞ¹ÄÆ¬]\^ýÞ¤-¸t²ˆ6õó3¢ðȦÝyU¥ÓœãCD¹KiÕPŽÚçPPÜ"¥j‚¯³zúÔN²ŸvB¯·i]­nÚ¾ê&æÓ®A# ?Õ6ª$NUS…€K£¤×ì¦ç˲õXƒÓ™š M}ÞýÿëK#Ëe=µ4nv =|¸y2JN»çí«¸ìÖßñ¤ ž¼}¼{ÑN]ØÑxÎÎ%ýógÝ‹vœ¿ÈŠñ÷¿{ÿ ~èfQ9„2> /q6ºØ;‰:Øç8=‰‹wŒ:“_úµÄ¥Í=ÏÒ¸¸Äo5ö2:ñ-{Ñëññ[—®u!NE#Ê`R“‰UP ö*ýñÔÁ빿Åi'ê7ïµÉ´ýiŠq«{l§<ÄL©Ãn/ ¢ã3XáÑI+‹ƒƒ(Éâ ×÷ú¡êûäûf³gìÌÖ²ÆñF“S§¤œˆ$ÙEÃá¨v›½l€Ñ;íó)ññàîÄ} ÅžR),ý¬ãÊ¿9Š¿©½úpÈ«@æÄï ²ðæð,}÷¯esÌ´ &¸LÖpk apÖ¤c2à¡°ÚNPÛü»©`ÞËþÕÕeð6ê}]!_ÆÀFòéèÈGå×á½’Ùìòi…‹T÷˜w3V¦*ßÈbby:WÒÜž½1U´8:iŰK(̃v’ÄI ƒF®²8_¼¬%ïßëýuïó9Çg†MZÎê7°~ÓàU§ûý~T?O»G­è´û=ŒÚåŒoj:D—•õùÏ…üÙI'­ÝÏñ–]æøêณäãÏB;Š”Ý‹è¤6ž1;ýt;å?à~kÇÍ8!žm0϶#Ç,Lƒù‚Â.(h·0o´5õ(†œFé×q˜ôÒT"äfxÏ·8Í÷£zµsxÕÇïjuÓ«òA…V¢žpFÂ/§$Çà‡-0ð½[¾»&Tn òV·àüg£~'û<†ä£öùEg„äÛÛåpð¦žC>˜Ãp"»§3@êæéL½ Ì;L¾ã¥t¾Î¼àxeñ^þý—7þË‹äô—4Ë»ÑÃ3Ï|y×M)ÜÝNÎêõâô~ Û´uâ,‹ó®6Žó–ñg÷c#êõâô6_œ|Æåó¡·sûìNãdìwÿ·ü§8ù“OýšˆïìG¼Þ÷*úÙÿ%1¦q6M ‡{,xÿö÷ذ•£“¨õN¢Q#z°bwŸíQÞÂÝ¿ïqÆ‚x¦hh¨äZÑ1¿›À«o÷ÞÓµgn´q÷"6ÒØÍÁp¨¯|VvÞ]ó—_Îà¯í^6¾öo,½µaÁùº›¶¯ºIu€„¨ß¬ §n/ ¢ã³¸Ù´–ÅÁA”dqmr†¤it´F­Ÿv­ÀkŸjµ;«,ïãOZÉ·rV\:º> stream H‰ÜW‹RâZýÿ!6òÐðJ€Db^DAÄF9$„$æámï‡ÍÌÍI€´m™ºÕeÏØUVÌ^gïµöë¤ xŒÅÂO1M×Ðcªm›Š6Åb?–ª¦Ë0áþzª³©º´€ò@ ,׸"æ#×npÀFÇŽ ­•)Åš&xÅ îc¿Q¿F˜Õ‚"ÙŠ®seÜÏE%ÍU6¡¶ÂXªªÙ»tíWcM÷sÝ/ÀTÀXuC~*=þ™–ß)”ü¥ÐXD³ž«¸G­Ý÷VáeŸbûÐOµÿ~y’cÙúro{ËûoZù÷õaÁKC…°AÚû¶ãoŸ Äå¢òÿ0¥Ö䯯íá?y[ª"ý¯ïb‚Êœf°T õc¡3¨LgûŒ–üÚ Lžæ“I}&ë/E¶gû¨Z¿VT‚Ì}&èÇ^#øåBN‰ ù™”×}¤¼~µ´A8]ÿ…Œ±n£Ï€:œØMS™*Ú>ªÞŸù®|o×µuÇ” §;šüåw>º™¾šÂÚ@FŸ@ÿ”Gþòɺä,¡¶×†€½Ã ŶUhBŒu&ê¿ÿe9ÚtˆÝiŠ„Înü±U‚À„õQ }Ý8&ª¨¡MìÆ„´±k??è\›ø@ݱUEƒ˜e›úbÓ¿ ׫ù1ýšâa¯d× c«ù —ä­TÅ~Åêðª+dú6ü±Nóî M`ÙÐL¼@ÉÖMl T IŸˆ”TÅÀ$ÝýBþ™pŠ¶ÑšxŒÈ&ÓÉt N ¶*:ªºÉlš‚#«Ïµ'9B™ó6Cw[úwß;›  ÕK`#×u]ª[˳ÿlkøX”hV… 2hnÔŸñk¹—€Þ®µ£›™]¨:Êj ŽêJ_Y©\.“ T˜öX¦ŒÒª¢2Ø8įmºS," Ôd”ê_‚š.-PO`SSwŒuus>}—AZ3¬å5ƒò7p“޵ ŠáØ>é™%O?&M"ïî‹5¡¼BfÒ;<šŽm ¢¿fB<Û&Ð, m#½"ŠŒYÊßpOÛ4Z‘€¸O±¾8b§7›ï ±Ä*²bƒ±âŽôzì·²Þ/£:Ц˜BìF76%|;Nˆ†ù¦,C·ùö`²¡$ßÀЂ±Þ¼Zk±>éq@–ýÙa«hµÚº_²÷}›Ç ` Åa)KGÛ2îÎûE âÃû‡=;oêkBÀ¢T¼Àw³Kc›D2íý` ’NdÆ-"A¦7oIšHÒîËc÷‰‘T2—£)‚Þ®³µb?äv‡¬ÿŸ±f¼©´`µýœ]Á’nÊP~_@,u­Û;æ@÷´Á l8ª­ ¥Ë®³a±ªŠÚÜvósö¦  m.§l"²m¾Z=Í Ð½ ]cö¼yÀK½³hôãµL¤™àób9+LµÃšxEy$­#êî²B… ÌÝE¹‘=/Ô¿GŒéH´X!§a"› ¥Ó–0¦ñôS|Lž0¥¸a1Ö™:3Åú¡¹Õlnzy[gJYØæ•³²$$“Ñé»PuùÅ£1\ ¶0rÙA"Î.õº…òcÏð2rD!{Ôãæj´w&éÚø§ÎŽèü„îÞ>|g;|²ûqÐ ®0dJ qȬäâaGŒ]È“ƒ°—,qôÔt„ɰGs*£ö nfó3z@ì¤c$¢þ̔Σ½•DÙâ§:zŠ< U¹zÈ%NçGl;ÒVú@vÂùy —*Rî6ÆÏ²OÅÎDpî:>Â>z'òÐ9)wk¡YQ’ÀÂ}Rðʤ>[E&Ò)@›ÊѨ <ÖdN ŸG&þÝaëíȳËÿ˜)Öf™ƒ0UìV“¢Kü¬QLÑËïg M§¬I†5¥*/ „ïQjV¥ŽBº—IË…OT_¢qKÄ!§Ò7Ë•‚ûz˜á«¥P¯Ïç,T—ê*Ó¼þˆ—ºòC‡†žÛ²F‚ÊÔIÈ-ÉÕ£n57OenqL%Ö­Ù•ëibj)PŠˆ‡øÀt£P®áÑóâAÂéñ·jÖ{ÆËbiýTêU®Vp>^­œ‘÷dµn?—Ë•8)œOÏÖ~zg¥¢<¿~ô*éFþš\n¸šO`¸%@ÄÎZ.f½w¹CNxòR-@몾m$oñó.x^ *S§€)vìol§f;諒Él ›BôÍë6šœ&o„+9<%G¥s!-~g2^ ”F%Q@ÝqÇ9=ÿø¶V»™ vSˆUçœÏ,ÇËÒÌS­~Á>Õ¯cJ¸Q‰±ÉU’M—:òøè±´"²›Êiå¡‹ÇüŒj-*x=)n; À½în˜vEv;”ACµŒ i¡c~:«XtQºk±ô€ì½­ÁÍ¥ÚÝñýí¢’ˆó?+I~¯øƒ0ÛiÈ8Ú0å¼ÀÕï?cë!¸‹{z‚†¦B¦É‹lã}çØ7âñZ…Ü€ÄË£ÄAx« ©’&bEÈÑ•hv½…“$.»q/¨'ÜÜ–—œªuu¶3ë!W¸ïÀ¨ÄõkRŒ$è¶5™Eѱa„£ðúlµ-…Iô’BlõÙj VºýËÍ G®†ŒÈLÏúî‚ ãì¬ÇÞ…%ka[õt®&JÞFÛ^(ÊÖ®×Ò%n3±tAÄ»}Ð:Áœ »$°¬‰ôØ©ÄΞ{Û›æur̦§ˆl¿³ŸŽðbÕš -…rá¨l{Tã×Ö<;bJ—|AF]´êŽ8OlÛéd·VŒöz±dL©ùíÕ¹¦¨¶DŸ Â6c„¢¶T̶Ùnæðþ·ØDmgîÌwÎùãîMÅUU«ÔlYë3ÔÏäÄü!‘¾ìxYîäpÁsâágÁàBxAãåþ©>©Þ\ž¾ôåI9-èôoùö rÂ+áùÌZ¾Q_Ã_”þªh1Å"-êgÊ—¬k?ám]AZ¶¬~ßhV sÂ2C†Yë©g¢¨ßsº“Š5Q i1}Õ/©åûÃ2ÓnÕ5ä¤òêeZÚ·GU¯vªG ©Òt£`!±zäË71£~X–‡´U’í%D=:೤¾qÖëf6ŒH¨±3Àð˜n @´ˆiÑù¤þ*¡?Ò9°UtÈ=Z¨fÿO-Ó¬±ÆûG´Uã•¡T7¯(y1Òmúò²D¡W=пÓò\j Lï5MKÄVе C C½ÂàÀ¨Ó2„C˜åÇPFHaG÷YüxxE!PlUëùb4¤ïeišµÿX®€Ÿ)V—–Y®HË«›Ö°>õÕOˆ[+Kv¦§seÖ¾Ë?.Ÿ'L£ˆ(¡´\F¾@ÍêH~eãÿC­©Åˆ"êf§Õ€©EY‡)ärôÈ(1ºÝ<å^¶a"Ö9DÒÁ« ?«öS¼ ®ñåw*©Sˆ€ãÍ „ˆ•©ž½³Êo&SŠ›Ëg—:!-,%~«ÿzK²²_ï×[ƮޜÊ(ë%ïÈKn§ºn™_ß›VÎŒÕ!fº¤›V¤Z“Ë7ìZûð³ZIR5|7ÍfüÑ›ò«]Eg– 0£ ÌŽX Ÿ– ƒÁZ ]ŠlAv.¡¼ÀÛ©Ýžü·Âéý›$}éXíQlå»OƔҭåƒoWç7gxÞ̉ªc#á<;K$ÚØ‚%Ç”Æ54+ë¹®"Ùž_l)0y:Õ³?‚»A‘«>ØnêRLóE fJÙ7&Œù°™GÜñÔb¿Ã•4•-=D¬ ŸáFA£ÌüdŒÙyîpŸEœä>©âÊï ßœÉļRfuªñö÷5ÍÐ{ßI7j­.ÏzúAoÕÀptá ùþ]Ç+§à®p——ßk~s¾ÒýÏ5ë€ä©ËeÝysÆRÕ^)Hã¹ôLYó¸DæKÙâ‰)2±;ƒ‡ý«í!à M¦…€qÐŽƒN9?uy/yÌë½9¡]õ`mò/0šT/LäŸõe%¼ü\¿¯ª×bˆR½°a¥üæº!X)0ÒÅóHtC")/…¼¥Ð ý„^s+A¼˜]Òág˯Ç$7X9e¨—Í•|OKŽÖÚÊ4¥1¢Í+çÃÉ:Þ”\¦Ì„ê:n7CsR¼²· ßdâí`À<@ÙwÛðÒ°ÑDóU19UÝJRjãnTÒùiží±W®=Ü‹ûÒããpd^Ñ&òÃ¥.–¨ÍÓⓜôrâ•ó«5wMÕVé ç?ÂÐãaºçÇ…ý s+÷¶j‡yÄbö+Ì’êZe9⳯å»9ƒ×i(²§¨N!{± 6Ÿ›dêla‡"ð „·wJ­¶ò#ƒÕr„úâƒ?3ì®7I°–Æ‰ÝÆJ­Ù1¿ywÄØ1‘>dKÇé ©óY•Ba¨1Å Tš9Y™·fYÆC]ä]éÉ/j¬DÎBÜ`ys=Å“Ü^Üm˜û“>}\‹ØT`î£a­ÿ12£r% €²Dô@H™æÚt‚l"Ú8e¥ÆUP…fkQ™byz¼âóÔªYt|„K4’é§KÚÛRÝvé‹Ï°7‹5ЉíïTª·\QÉÓeš_ǦéŸZ¸ˆCÙÕ×O¾þÒS•晆(R2…]uïË& EêÊsgƒ¹¯L1³KP´J@œà !vÁ!ì®ô‹f* e.†§@“Þœº#V‹ÿã¼Ê’W²è ØCRàÁØ< ɲ°± 1“ 4¤maI)4úèè-ôzÑ_ý÷þ{½¾)yÁS½"(3ïÍ{Ï=çä^ŒUUõyÚWŒE0²-ÅX>ä÷ÑãáYô¨À€„J1¦ØØÄ^6à÷ Óbà QµÏäúZÀ)Tß2'Žª6 9[köä:93xßhó\ý!ºµãwÞKEcZN»¿èå4ÕJ®õ+¶“Üy •˜N0gÌ-ηö1«ü80íÎc‡;ºÖSÍžœ™Êäü’×®—?_âžKPï†èGQ²»Ëï‡d^LH€ˆV¬²|2b*݇‡øËI¦à ?ñØcçÕ=É ©\ã¦SÙr:ñ¯}K˜´a_À¬Ú¬&ù—Z ³Bè²ùf¡&Ww )}½‚aríR:C¢RQ$¥ÈÂqž­k»=hDù¥Þãå‘ë߯ï˜6§¤\}™—÷ÉaPÖ+œ‹÷ÄéÉà~OŒÞ ×ÅÆ`ü„=/†¶ñ½Ýù9åkíƒ[m‡˜ôa¹p‘ëuÀ8¦.f«O¡Ú…iß=ñE.‘b“Õá4òr‹¸XbÛ6ålè¿m°ªFÒsÐ õW(R=xpÆÜ„zÅH2E¸J¥Š1ÍmÓå†ÎH·¦s£ Ùñol„xµ›…kÎz ÊÎæ*»ÜÇ3Á«‹|©p4·øi‡WØ4<©"5ñû0/_àõr N¢o€‚DƒgO\–pe¹aƒÕó™zà®Ã4ò· PÊ©À¥Gƒ¯Ûž¢É¬xdÒ—–ÍFÒ¯»€äf[ÐÁè˜=Éò'%J:æè~çДع“šEb›åž§Æ©˜•e©í­;±O€2^nY5r úryÿl¼À /3Së0áì)ËO Þ›ÀɃ,™|;Î\º,ǾŽô]¥Â]ݵ.|è>OÖ¶©öK1œ?tž”äùÛ~®(5öÎ|U¤‹`I)ÊsSù{m€^‡"À:ç·ãŸ¿Ý ÈÄþ7èÆC<Ýt 5øõV¬Íèc›7¢;|\åª÷æÉ{¥ËÖüÇ*? ¬ŠÙì¥ý&‹_¾šrcV»­T¯ÂÒÙ8ã'…ÒÔé{U†KrrñຌWy<šãbÝÅ6Óå‰ä·Ìèâµz‘ú¦u¿H,Ô}ò®üTùis<%¥> ´?æ„.yå¢ÅW ŒtÓŸÒ@g%æ¦R ¨ƒ{—)[¦9Ù¹¸…Š9H~^^ßIÞÎ&ÝÞÕ“KÎ.Êù#÷Ê?Ÿ3YYS/ÝWмe)nÆ*ÀYû…1ôÞ7þî7ÀGÕø°@(‘¼íônóB¿©že|ñ¦§¤Ò Òâ®¶û±ÐÜ·ØìœÈè4ëð{fùrÑéÔ÷³Ï©Á#ÀFäÞO£Ð+W׋’óMÉâ³mzûìV`Fð>n¨?^=¥ïÁ`¬?3ãa<7‹œë«—žiî^½ìøNýıðìõÆÎØô%îØàØânñÇèx<Ƈ8^¾ãzƒ^lš^È='_ÈÜk\Y ‡½»€’†¹è]ÛsžmC;_9ÌŸ„çߕݳû/kc“>xY5˜íaœ+ŸÔâÜîc6†·ëg‰íÂþ1ØÝ’E­Ø)¨ùÝÁEþPÖ‹v°|vš­u{§Ö)¹ã9ûa—i’‹7vî½ìžüí|+ðœCa¦|GWDD7†­ÝBœ` {è¾F9E¢ÿÌ”EÑkb7±DLËîçðÿþñ/ó¿ßCÑŽ®HDÆ-ÛTô G~‰Ž­¨¢TË>²$³o¾yÇÆP´¬Û —IÄÑmo•—Ú1*ë#TU,Ñd6Ê+‰¢M,¨óèYu޾é÷-ló&ÑÓ~'æˆ%¶M4ïàã™M6ÖˆN¤!ìÃy×-A3T\QtÙÛy‹-ŽšA7Žm86j –Må—@3GMlÕ¡?Ç‘‹ª2‰] *1ga¿l^±õÒ> D3LlY°¡áªb¬ÜC}þƒul"âØª¢cdÙ&akå¾8W7I_QqY—T‡¬U‘Æñ~¯1mbxÛN7êŠï’³¶„Wƒs’´×"‚u{|kAÃë«[‡ˆØü‰É$¢`W…lŽ‹'Ö´eÖв& 0#’Ÿ„t±°¬£«ƒ~‚Ñ稿מ¦2Ú›€wþªŸ±û[*]VèÞ² Rú 6§©o\°:6À¿¤*’ÍüdâeÈ1*W^šâry¥×_Ú=„÷Ò€ï.Î쵘Œûî«ÿ(~@·Q‹Yª†­áŽú=|Tqß^Ÿì’Éó'Zi›L7ñÈO,ÙÄD¢  º„}Ìü[¬þ!ZìáÊ ŸÒU‘ÀÓby¹θE²˜5¨ðÃØ9n.¶lEwÛ¸‘Mæ𷙦,Á¿6ËT¦§¬÷Éxå%¹åHl›ŠF‹ÖÅ>†Úœg×Y•Rh k=ý|àµìãnr!RS4Ídù}ݵ>6^•6sÒÅâ­‚ß×ϦDþy\ŸÌT¹W‚ˆ®`ãöÐÑD]PÔq-Ü‚-dA™¬`Ô²]ÀÛ):Œ¸ª:úëHÄŠ†ZV¤!6uÊð|Š‹$¨‚XŽŒ æÝbóë ¨‡C £¢ÿèCß§_‘wŽeüùOE¤èþ pîþ†×ˆ?¸%Ã$SÐ4ô»!ö,TRЬ2ÊBÚŸÿ–†ô‡{ýƒ¬þGµ•žd Y¿Þ±4rx©8ºˆG‚UO|´1H¦blfo@7 J= Éãß¶)è–!˜X÷Adõ¸±ÂÔ&%Ö O4¡¥üÂ+Ž{“/†Z×ÀÔ§P+5¢åˆTÚˆn7é0Œee ™ÂJQ™³UçOkw=™†ßâ[à*ÀŠù1S‚%Ù,2þ6þÃÞ´ þ§Ô꾺 ˜oì&6Û7|E*ú  ‚[geò8 ?úy`R°ÞêRIDU±4/—ð…Øžó*L¿{ßÒ±ô$_ZetEDt㘅æ°Ê¢Ò5-á'®90Ý 0 ±"œ& 321å)ä;z%"ñƒ¬'é~‰3'ì“8¤D&#LɉšWbéLÊSòâh>w×û…)#~ /§ÅѼµê‘ cÜô{ä©u›,õ fôÖói¬ß§ù¼éd5L?p0쇎 ê'kæš»ùMUŠZ(±»© èý²i} ŽQ±ÞÚ´ÿç¼Ê×Su’èä$ƨQpßwÜÍb5ˆ¸DxsçÁææÅ¦0¸t£ßüqï—¤NsºªºNU™`|N±m«¶£¼±2aÁ:ôÛ„Ÿwü0Äæ©ó1—WÆËçÔ¿®´+Ü’õžÀË #Ϭhîj,&‹ðËj&ÈᦠŠòÿ¨9”hºH΄9ªG1Gâ‹Ô³ðÒï÷/9£Ì6À,J_J¹LŽáx#»t¥©Š¢’+¸1’¢Ý¡Î õÝÈK$œ‘ª=)&)Ú;Ýt¤üóûlì~ç`Ë#ØILì˜ÂI‰³_ƒ©Ê[i'£¸/@c±¼ÇiÓ•¾ág¨‰Qê…æE•äe è±®)²îpUˆüÕí©ÈñÖèÏ$huFÊ*¬[îÌp¤i)«ÿ¶e4‰ýo!ÒYÁEN!—âþàï¦,6kR¸©(\VAƳ„ì|^r$M_é¿/³@PPÔP›ÿYÍô噫+ DVöZŠƒ©æøu&Q¦op,šþÎÆÈàÀ)·@=í)Äà_‘¸«,”çÐûBÇÂ7pÈ=¼õàß[_€Ý»õèý[£DþÐÇ­&”eÞtêx¶Ì™¨¨s°.8À„ƒÐÍùYh$ÐL8–Kº×üOÿRHõX’Œ†B../€³´Ë^Pa²qš1Ð࿨ÎTí°â‘ È€íVÍa-â7¤b­üæïÚAm ¬/w2à S™ãð.Æjþ–¦¦Ð‚›£-$É(ƒC-ûáúÊ[•_ºª°š‚Ù­¤î_‘ö<\³>6\«ªÿ4œ$m7âžÑ`Ø3%Çåv?8uk*êâ|ã«éÐ¥ñœ(ì¾uçÐÄL"òž©á%Í)¤£ƒEVZœéšþ×i”±5ë\¯QwºŠº²)c)Ab´ítçU-_¢ðGnº‚»…#D þqò *ô$gŒHCÙåvWF'Šî’› ª 9¨”bj”­P ÔhÄqz°æbÌhŽJ,+¼Ã a4× Àlk•ëGs¥ƒqHûâv.þ÷?ÚVZœÙÖÀœKØí­Ä_$ š“$ÙÊ„+ŒESc íö;õ•dN›iµ]ë=0 ×§¯Ño»h&M„˜4CQÑOÿ™µ¶Š½}µ€ \,Á?“qù4íêÀáÝõ°ºÊ+ÞBDwŸ1p`ŽØnÀðîê úVq±œ´Ø‚aÒÕ‘•íQQøJ§ïjï–ûMeY4Œë¡ájou8¹ºúF¶g4jðÛÒÃð–`5èJ»Â-Yï ¼¬Î@ñ™16&peÐ/Û^¬DÑ¥­W X{$‡&a*PUàõÔËh9¬‰œ:»¼UíNìù†»Ø¨Wð(O`9Ø{{)5Sq”Ñý\Y9?IVæ4A™+ÏC#5©H³Ý³*s:ÿHÓ“"X>$x|g» ÿïÿ&ý¡_j4’±²ã¿ÈǾÂË4L…Í@ °Ô#ð'&ší¦#¿†îïO†!) ôbyžª­ëî^Ž+Ï©aþ×Êr½ø’ð…8?áû¸»¹òü:K›o,œÌ @Wˆ S­Aÿ}ŸŒ°)€¨·Q-rÓ5î-´¿òTýë±o˜ äãwî² ·•@“}-?5ˆþÎZ^“a-V¿ò¤¾µ\åµ(ôîÃÚ"›uš©ò{¹°Ìè$Yôonû¥QC,W>¾}÷bDÉßµH/óïʳç¡WüÁåwð¤ºö½ê¾º„¿-×rŠÇv-¯ø³ ¸÷ãÆr’ëÜ-¯¯<Ð¥ðs_9M„’–¬JÆ—ÞP³[Úp£mßKýÔIÀœÜZAe´æ.NÉZä5㞃_k╜–w®³šªf´wu”é´©p´ïÛO„AZ£?£oK6ˆ$-Šu©áK²g¾Ã„A‹ ªãpàMÚ*úÝÏŠÈ¢H5÷8^4HáK>ñµžï&¤4iÔÿÈðí&ŠTÝ~¥}wž,ñuD X -U¥ YL€ãî›dfžÂ?©ê ØEzz]UÒžöªÙ3òrâ+UsË,–ÔûÈF›¸ð>«Ÿ<óIý6)`±²zýñÄt/8•O²š¾É[¤¯÷è)E‰šh‚jšVIGêèe }9¤Ý‘¦'±çÙ"Œ$‡-,i"<ï{H!‹A›%üª–hhÒNb¼{¿'¤š7?¤1¤±¥ß[j†Z"|úGlfÓC’^W¹˜û'¾m¢H©êS·xDj°XYõÄ’±†t8¡ªò`€&­ÝänYaùŒ$­u“/ *1®ß†ri’V>×Õ}Òìµ_óÞðÞÖ'›ØÏBÒ„bî«%Å6Z#‹tò½ßDŒ$ßѤÑ÷"Ånº 4iãÔ~’òI›v´- u,éù£1¤ªÏþlmRàËíSdÌV«I:h¬XÒ~3>øÂ‘–ÁK~¡Æ)´¯lÈ=˜Mî2HÒ—qNÃ’¾ø„‰b“‚7v@Û¤^C…"†´x½Oª%$é{p0Æ’^y¾¯lãëgœq_4iëyµN{ZA$éxü6±IA^ie¡à[àH›ÔW…-£I«Ïôõ›Þm H¯<ªÚ ¹-ÚiÄT4Ô]%b’r×zí hˆ´º”(H:Ô»;1Âþ¦Foïwëg‚}σ8kŠ?g"»ˆÚï©I|’ÂX'*MÞ=Å0VÎG§¾˜&6bS7]¼W1§§}ú©{ýˆ±ò2ÝZ3+lÄf~zøýt‹>KƒLVG[­Cxý-ÃÊxó¾ú¡õ ë÷y+b'ÚÇè"‘>þõ*ïKœç¢Ÿ J[µ€Ž €/[Q@ÄÄÇ dùþo’nIIÚø'?Ç©w¿çœû†ýo%~ÒÃ/°ð¬-/Ö·:þè÷Y6Öƒ˜Ts7/#è)æ¡7Ca×Áª¤JWÉR©÷K?FÕ‡ú¨_}¨]&ÀïRõJ9ñ·R)'›Qüz{’>`4ÝæYÌ(èÔ¯¤¼tÆ6ö%Ûç_J*YnánŒ<¾\Z—ª˜üWxŽ€ ÖÖçÝ|‡€ÛU0­:qDàCè1Ë-Btxé,èN³£!Ûi°>KÒœZW¸t0”Çi .)Ëé“‹S-ž#ôØL–E;W¤þ-§Âéyªÿ Ó©öA”7Æf†SABnÁE¨&°\I§Hý3œž‰Pý?ÒfGzO­­4ÝšþL3"õÏt ÕÿÌáî‹ávNËÕ¥Ûîíj fy¡¢˜ØzÌ™kw§«b>f¸G?sžçøNçý .‹ÙÇßw‘ŽþŽéÖ™–íôÎêÖ·©™2®Ó?í•‘†ÓÁŬ¬½ñWjl Æ¬gŒ „T¡”`Y—ø>=E¿ ‰žCœkò†ÕøÏ+˜ û›SIBlç/\£}ÁvÄS…·_}dú»)°§ :àŸ²d<Ó!¦˜¡•®½¸àãqU­ý^#©™1 ¹X“Œ'Ö^èÕÑŽí ÀVˆâu/'_çU >à²H+¥Ôµ{PÖ'zH±ZLŒzª_†øî‹Qô-GÑÑcä×QF~€#?³bD†èé9:èìÐÉm¯þM¶'(t‹yÕ`ÚCe5™Q,¾þ!´¼ˆú,{.b4S‚Ä1î;î–“e϶•ÎÉJ½¨ÁoåÝëŽMòA•‡ÅJ1ë.HÞÅ"¡'±ØžQlI8°²7{!ðv£ÓÐ0VÈôDd4•¬­Å6îñ lGQ;- SkW{¼8`Ûs+õÓ…’ZIm¶xSÓ1yw0FqÑ=5ý™wrq¹\Òk¬u>QV˜ºÈP²’õ¬èÃþ§–š¯ßq$$H´nÙ³cs„.¨s®5e‡V'ÚTÝ?Fa&l–NÍ7àŘk’õ …jìyínŒiJï>¹wêrgïžÓß93·›dÀöï¹k—^N¶ Ðz혅IaÆXLëéßÛrÓn'¦”ˆ†ÂÇ>» ÏÈÄ@b6bå°x0´Œ2#K½TcF’w]š #»»4ßlIö{§%ïç+wŽã€ƒÅ@^Ã5‹˜Øš‘2‹šU!-׫ßþÎ4uR¼ê ©‹ýd+ð*Vá9Ìè~ù!wCÊŠÇUÒY!‰.\i7ƒ<@=ßC®ÂBôÐüx=$þ¥æÓÉuÿ(ÆÞæ÷LS‚äÓI(œqY\I{Q¾‡GJªº£Uì%~8Zňæ·bÙX´â¦øí8\Óåá&QÕ±+à<Úÿ$Ñ» Z:A7%d®8† lªV ½´•h)\kzÉ}ô7T„ÑÉÿ™ÐE³ìÕá<ût¥ÄªÎ$Áq¤éš‚• ×}áiÓ„}µØ^¡x W i‡¶Ü«&®kÈÛ0ÿM§¨MqíÂv´Ëð9±S$c€Œ¿‰£ Š¹FèÍŒçí À´Æï £( ó{ýð¬y»¦Éëâã Ê i#ú¤a¨Âêúhðv-H)º‘ß&ª0ó$_EGZs}0%‘ŸœÚR¸ºQOÊoõ#ä·~MÛÚÒs!‘Œ?ùßsÚ¿¢öøí>Ÿ±¼WœV,”$q%Ábù\q¢Xä‚'ì·¹òó†\ñŒ—ƒQc;۫0N¢³ÊÐ’Nu - «C'-k©‹ªS€gQ¹ÜZYUÀïŸÞ9;·Îâ,õáOH„ÚAQÔ:Ÿ6ÛéÃÃwlc¿·å¦÷¾ÀŸ)ÂÃaŒcù¼0.z(YÁ®EÂ4+¦vNüG£wßa'z”¬b¶¤Çöµçå=à ‹ù±Ä$jVÌT½‘ÈîI9«ûž»vÙœÉVI+…vÌÚ0 ÂcŽ»koºqi“ïK:(º—r&§“¼òÓÔ–Ó˜ˆN—ÓˆÑÀïò2NG4°/.Jb88¢Ý/É¿‚gc"šÅ•Öã…h÷ ÿˆ¶£”Róõ{æàÝ]»89ÂîC;1ÞhàŒ¹ØáÁïh‚t;äæTßm+É×E´ XS„«š\‚ ‹’Â"7>VXSh'ÅTú8˜«ož‡ ‡¿ãi†›µÇ÷:_À];aȯ2Þ;@ìþ~0«ãYf1µÙ:fæ-3¥û~{ObwÍ Øa<í¸K{¦‹+-;¾Ï9j4ÓÒ°­@ÛË åiwI+ÆZCdŒ½† }OãBÈb §A-êdÃi°ÅqÓ8õ=eH‘R:œ ¿Ý¹PðÆÀ˜·¾§q¡u%ÆÑ÷FOÕàé1Xll…Å€ñêMò,ì¤Ü­¼vTw6tçBaÔ`|O6¤sa>C\Hzɇ}^:²Œ7öFë ÖÞé«Ô|3H&ÿ‰ùz<´ˆ‹}ŽÚ¥4·’–?¾C“Õ!J—Ädhl¿í¦Åeï¶~¿0Œy«'P±3ŽN Ì‹ìå=÷¥Ê¾ø†H˳Pž˜®œO2Çz9Ž´ty8Š;h üîÏšç®ä ¦‘-ÝuÕØ@YÏØÀdvþåák€«”nË…T–JÂã6Ú1¦dúÜU§.}Á@>†±Ž¢°Œñ 1š²‰eO2è¥Öùä5ÆXöç5A‚% K h+Ž­b´EZiލGÆfÿ©ª„¤ªR[€?uƒåªW¿Ò\ýÙ—ÂA‰8~Û3ÀÐtŠLòá1˜P™•w‘òJÀ#«©‹9Å#KÏ‹÷%rMóHN'ƒÓSmCJ*Ám‰µÒç•2ü éEQŒmøØç•xâƒG“M<ÀIy\Y’2è±Ï+»Ú¹¿ÙNNë‹Õ˜®Tl‹¥€·rB‚ú…Toª¸ d!ÁnŠpÅ8‘‚$’¦«U:û÷¨±YHS±õ^9YB;mÜA±!Õtxe¸=öÕ(ÖžŽ¨Ín|§ipw²¬¤’\QèmEÙРº?CÞDÿ1tïñî™;>šžé¯ÉÐ7K­œ R#zŒP¼†«xÙËå«aýiVieåçB5¨99|%t4³Qç •Äî÷µòl5€—§·æ,nõÀPG” ¼¤^³Wf,là¼tÈ‘ã Ã¹È$Y.„Éò´ tYà@‰,7i²Læ¬éT;°›¡r§Ë€H€‹ôDõá›)¯¥WIÑm‚24¯‰‹,ìt^jiqjT2ïK3tô6ÜiÓ-Æn9׈m”PLuɺì‚=ºÕ}?0Xús°ù¥À$Ø|“Dçí<ÿ(ïdÞüº™®-ÂiRäþ&iMåÔxº¿Äs'®¤¯Å@Sù®x[ –u/îâ_¶ ¦ÒiÃNæÐN™ÌÆT¯ Ç ÞÅm{좘Ò$ûIÑNFV}E;{ÛDãòdd'»“¬r,+¸âó9œwKñ¥Ã3–W)0¥é¤±)A5ÓéðåëÞSB+49a™…ídj ï7dx,Sš¢ìòÛÅ…òÕ(”ê‚9‰0Á™ÜOCÛ?/à·Ê„0W‹}›r&¾3‰NÝIe&~1ff­Ê$HSE5n‰Ø2Mž±Òfàý+¾ @*©û° :¬tdÕW´Ó›Fp˜%/BZ%Z£åCÁë"éF;¶ˆÂ_ŒƒÂ>&{'èºjª\ÞDü{†ÃÚÓ¹@wƒ+ÆÃÞ4úRÍ{3g֎ƘbNŽpñƳ·gãï§Ä¶Ö †ÐgJ›Úaa$õŠìl2†”tŶÃŽøjÁ!”S{dl¸ÀíÝ”T‚¦{ÆÊÙ6Ö0?øQ›˜ðÛ«9¨‰¨ôÍ[µ§ñ%æo¯A¼½ØÀßÍa¨×0ÑáS¤9šÑÆŠÍë ¥ ÂÓë1»Ú¹¿ÙfSYoÅxΘ¶¢é‘ì3gŸ—Ñ£WŒ²³íþu­ ’f]®Å¤vò0{–òÚgÍïPUfœÓäí<ÿˆoÝ?êºð·wÅìC1‹öD¯‡ æaCðÛfcH ¡¦ƒ¼—¼1$h@pňËCYI1•¨wÅ"à>Þ—\(ûsA]Ü$qS¨.Å¿|cÏ«³¦¬åàãÅUžp§²?·“ÇÍk™1×!;Ø•®•ì0E*Ó±ùñÅÕ^ÚhĆT øX((¢#”ˆaé¬ÛËQÄüö²Ðtj(%†Ã…`1U€æÅ]œùÅ¡ìÁ\꜀¯ø<P²ùHs,–E Êð×»à˜š%%ˆÜ£íF–ù1¬qŒ-ù¦¢q˜Þ^µrw#»šýU†ZP%…kiýEcœãpž/'ÏÝÉ’ó Úh $pnzâŽÐtùy˜ú¿Ý~5gøó¨ßIûà#–j'¿Å²Ÿ¿b€/]Çr‡¹¾¦Ç2Íãb,{ÑþËv^~Ųý×ûXæþÇü«¿<åšý}«ÐóŽÑÉdŒ‡\O~¢¿ 7‡M«pÒ]ÍçÿÄRyûúí_WîÝ$àªHƒŠ×‡­‚…£ÜŸÇv­ ta&'Sœƒ&l8h|å ‹ýÔ0Ùý8Õôù¼œ~ ÜÒNã—/9®Sëòìà–ãô ‘ük÷‘S¸ù©\˽S'¶Ïwê8óžïÔœj:p{XOÌVOë\ÿH€Ÿq§å_IÞ»Ó6æôÕ0Ó½ãÿ~bì¦ΜþÎLÙN˽ßiüòÝb9ˆ¹?×Û¬\Àú¸ÐòœN«BpK2×ù⽑à:=%xðfYNÁTz¹^TUá¸æ{ô—WˆŸ«W¥ïn£à;x÷y_ÆoOb ç«þXÇN'Ì™"¢`óû£ þw6ETJT‘KªÍ¸€)!ƒm_€­>ž{Z™•ªÚ½nSŠ]\ŒY”=»èåR¬UB:qCÒô(AÍÅ!Á~JùØeìàîáãÉKbþ+`¿-c„äí1N-ÓäàÔŠ)”.¨ '3¾!NJ°“Nô¡Ç%<ôðÆc“ßÇ{¬Bl\­ŸŽ³‘òÃXßÕÖ›9ëî$¿¼l^@÷Bª¤þ冤éQ‚²v5/ÖÛuùI '$*<;S<¤?ù ôÒ&_/;++5Ø^j\y¡á ô»Ó4¸¤¾Ûå†:ÀU|y„>UkÊ(2zÝ è*ÍMÍN7¯y>\Ê.§¾Š ô—UP]W½Òô†»\Éú:4‹æ#M—5Šó×i0fâb((jßãAÉ©=Q¿`ßõs‹JOÇGRRBÔv2¬Nn7Í€:¹“ßYgu 2nŘ”3EA¬¸KÄJ»CÌÞ1ïœz–Em(_ÐÄïups5Öòù˜PHî~»Ë¼ö4¾d {ò['2ó¼u™ÒÚÄЮG7à,t‘]hº‹Òé~¯—žWgMôô¯Bå‰Ë-ÃÓ½¬*KžC¦^¥&¾/|ËIȯsÀ“iL¬Ñ稳]…œÎDv_|JÃd”¥³n_:®P%…á(’f]&$•„S)V¥æ*«&ä²q)…Am/+ × &ÁÕ¼R \òTÒçU ׳ÏE^įT·…Ï.Z¦É„ÿy±LðØ…2áqÙÅ•ˆ]DR“ŸW ìB §jåîF©#Ö(ùóBãôÁ<àÑ[À-Æ¿ÑSŠ’äØjêA½ã½ CˆA)³,$BaÊ7Œ§õ ÃUDvòh\ QƒVD¾v„½\Š­+íd%® + WW²ûjø ¢ÿk“*) %¯›WM"Ä‚G¶a@jEsëÔ4Ý®vîo‚äØŒÄqãfžNP¿™%ÎJóòµòïŠ7¨+=!ÄǾÖ›9ë zÇÝ–imKN™+òÛ «̾B¹±u;ˆ/Œ)‘è rt~¯×¼œmcöª•Ö0ôÇs|ÃØÕ=&tP(˜Ð·)»Ê]‚Ê÷‚5¹¨š4é/F“ (·7ûá&Ÿ6IÒÍiq‚tóRƒ^æWœu:ý©I;´r#™÷ƒ gÿ…ªSî!;÷Èœ)‡W•¸²¨À½®$%ãòˆ: ‚ endstream endobj 232 0 obj << /Filter [/FlateDecode] /Length 10233 >> stream H‰¬WëZâ:}‚>—¶Ü„pf¨ ÈŒ¢ x„#ŽŽrÿ“´¡MB’ðOf>Àµ¯kïµU#oÞÄ‹ù›@Z/—F*{›Éþ¸ÉgâÅÎ0å|[(X*zÍiay½‹†™hv™ ƒ¿}_e²Åß/£6h•2Ŷz/ÅÊÆ«v{/WÿSTï{£~¬ªö“ú÷lxoo‚«ªs(Gg8âK4bÿ¤«…Çà•I!WíÞÆ Õ€eáüšRÔÍ÷ík£Ö_Çpo{G–·ÆhÐSÞ²|5F×I­0‹þ˜+GÃ<¥ã¥é² ÍÎSNÚPíoK©÷Q%d&Úf>¶`¯Wá@å—Š*Sݧå$0öshqÀÎV\(ÅÃѰ ÄMv™^6±|ƒiRùƳý¢©°VH[·‚ìl£ŠŠº¨zýóÝÞGYNî…Õ—ÄyÓçݼÌÄ1ƒ½Ã£zËG¾0q`c£†ÍÏ`å䣨%E>ky-`ŒÆ£ˆñª?–qæŒGI1sRÿ†ò ÅùѰÐØ4 ÂA]ëºEL“fðñKåí§—Ja]ìÔãDÊ&Z+ ÕÎþ¤EXŸ½êËvXaº †62­§É‹ñ`œ‹'‘ÃwE2t’»4P­§õ³fÂMt„æ˜ VŒX _‚` Œòý*š«ƒ¹ß™fŠ»¦_ƒT¢@“o´å$îº,ÃB1c¥ñ…°ú’8Öó²*á¢úà Âzíਕ¤aÇI”"¨Îš)_‚P­öR/z=öûÆÝ¯^K iØ›mÓ|æÒ \Qw£¡õt¹ !EB¸_ðvï| (—„ÒsŒKˆŒýâCÃÞlwR¬€-ž8œ†Å£!¯ú’8’4¤Pˆ-fãLCˆB‘ὤ½VzÈÕÙŒ& 6 –³%´û7:þÕ8dÄ/Œ9ƒà•”öF¨þ«v2ã´×Ó|ÏBà1›ASQ%„ŽŒÌ`.”¢J,»Óé‚zŒžTƒà(¼û¤"çÁ½-:=¨ù÷ÅéLe½Án1NoöQ=Íen1œ>± âÍ´‹rnŒV픲é"wµ ‚«*sµ ‚Í4QøÊÄ+|ê}? ´,F£ŒQ4|ºNP4ŸµÅ ,Dlnœ„ä„¡ hˆËÎæÆSÙ…±Ô¸[ —ðy§ÄA**ìõ*°÷« Ýmûû9´Ø¬` V†d2VÌß4¿æ®ì/ŒÑ ß–¾+9#5Ir7­¬0„Æu ŒÂǩ݅ápé CÏ ø”' w†éR÷uMÖÑüØ0ØZ(Ü\N¦¹;€VBñ?v‡KR+0‚D`(ó“[ö¼.5ü¶/|XvÊõ+þÞ¸ò Ð0åä‰ÄÖ´+iß•¢ñQêö“²`<~ö ÁÒ#:Âw9@—˜Yé»°åà±·pÜüdÚC¸Z.éU8N ÇGõ\/xßÁç<ÿ'Y$*­2|î“™«\Ø-Fe ý¯¿Ât?k}{_,Muó3”ÑíºÔ?’©åi-Lçs^FSÍÓOÝHu׋Šì½ýpí…`£`ê­Åú%y„÷a4þ#ý÷†˜ÉÐìÆè·P¨=ûï‘m4Û{à]/Æ&eTQ=³ÆÅÛ¯[®Qͬ÷ÿá}ÅfoØÑÓ_¥[´÷7ãQ yF—¡÷‘73„ÑÓZaþp#­þGö(£ŠJ$ø,Í5j\äŒ_£ßBáÖGúÇhïYQù±/–Y¾Ñjâ¥Ã5ª"'ïžQ ÞJ¤Èè•Î5ºX¶ ®QÀ—óç£;¢ª£Ü&jû¨ÑòÃë‡Ìïþ¬?>©ß¡9Füò[hþÇêþöE<~G}‡Öd Äüô“î„y‰|xËMç‹õ‚¿¢ÜEÇ=ŸH­A±rµðx3C+änÞ¾J¥vsÞZ„Rª½Ô‹[JÉ~Ý ´ãŒõÇ ©y™.)ª”SÁËv J-l”÷Ž"ÔÞC“ÔíbÉ»A­+©tÁg«A¹d×…Ÿ§(7Oäf÷)PãÜ<¹2wÏì”° óUÿ[ì%ªÙíÅÖÖ½ÄJ¬`ÅәȘõÔ øß¬öÓrB‹ýZÌЊf㊠5aÄ¡…$Ĺ1ºNj¨jÀBõ9Y®^øG¥9Q±»Ôœd/È£Zþµš‘[…sRUšÝ•€•,¶YO•Ôî‰ÙNKa§Å½Åö¾Z,ûÄ@Š*›áA¾˜³-2LÏýú\n .ÜŸðØkWàAöÌOªœûŽS™ L!àƒÈw­ëÌš‚M“‚rg2}öyžåçìFÉJ—ruv‰’=ùöƒe,Žg ÉÅÍ%39±÷Xö\Ý^Èê¤úxФê)·í¡ÿ»åyëúaUWQÁÏ_«¾Êͯ¾èÇ“Ó5k i);\7ÉÄÉr—‘ã’3ÇNå‚‚¥æ«Æ —ÞÁýÂsêÜ-ž„¢¬Òó~[)õ׺DíúeŠ»æîõs§%^Á…«Ìn†½÷3c¥ñJÙl¿ŽggÌ„õÚ×iû«2FN´3–~^—l0e…©CÈ\&¶õáßÚÁÇ,ˆªFëC¾fïøšøôtXé 1É] }°³É¥µ§úþÖI÷Ä|Pý²SvýVEúÀÃw%uñ 4ÙÊp•’QXú—M¥Ù£´ ãÂ$u²D…ª©äj!:[¥nŸ*Éå³°dÍ W)I¦ã-y¿ý†™¨[r·€²²mIÊ¥«ì©ÇpmÒfGEª§b¤² ÕÓóòïŠU5‡û IÀ!C1bv‰4Š]Id¬ãKßÉO .Îíwé VÆœ2Jjñ¥ÄÈP¤†È“4ã½<±æØøÒW Hæ‰:LA €Œ T!7´ÊJ,'(—UäTo¶ƒP¸¬|Q?m.U–Kà®ÜÅ)±ˆàºäð…tjÄ䯭o¶Ç6yåž­¨+Î1³¾–¸s}¯Ü:© 3„lÝVµ<{™p>ƃtÓÆ8ñ¨ÎX2°äÒ …MEÚ©4½Ð2áï+Û‡/¶’ð -†f÷•ŸÚ/,WŒÑ ßö*ªÙQ±»TÜf/¦“÷ (7ψ;Ç~€•ÑuRãɉ:°ò4—M 7-À µÊ™‰û¹œŸs³Cr–ÛÉÛºÀvì©mÁ>k‚N¾"#Ùav´`ߥ6J©˜¿Qý@(Ÿ°n5 1;¢Ø>Ñ©JÒûEuŸ–p7@!W²¡¹ê‚ªeþ&*Ñ¡Âþlx[ÓUã{t(¨ùh9¹—HQÔÍ߸cVš¸Å¶z¬øÔ\.1äšÜN‹»+}T/ÈÎ[9ù¸'{XZ"œ‘:¥ág>Í ^tžëÞÂ;T+ÐT®)¬’Ôýb%œùm~òÁÝÊi‹jVøÇ.óöÝž=³mÞce˜ÅˆE‘ʼnâs%Ù8ñ/‰*ÁB±¹¿Α„7Ø&WUL]P`ÉÝÁ8R3µùBm¾îw«±™#}©(¨ï•ôK4Ì•¹»ˆøñT¾jé”L—ÀÇ“`WrD„Öäqbÿò¬€ÏòS±X&Ž”“™¸kc|gzðVë ‹™¨ËÎJ‚™rÚKáµ®óÀÒ_À}ïÛàBµÛöä…âXÙ§#®>VŸÆé;"*\Äc—ÅÎ8$ ‰+×­Ú)ÔC`¡ãÒì»A¾2ñ ŸzŸÆÏ6+V ä]Õih=b4 ­§²8LR$„±€BNÃ7}np›]Qw£!“bIB|Ž‘`2÷¢xål?…VãÝ—†Š¢úâìCC Uÿ`Іü-æÃ§¡ç SØÓ‚ýÏz•ï§ÊÑ'ð!@Q¶Uë¾àZ—¶Z½¶nW»Ùj}ÿ/ »WÔ{ýþáI˜LÎÌœ9™iÿh,ªE¹{G  ó¡%÷Žªìè£óдt¤r`‰;”Kéy©L¯)y¯]ÎcO%sô]<…Î:Ëeë ¯.Ï9Ó{¼;„¶:Ÿ©D’·\þ;¾ƒ9æ¶#†óŸÊe¼‰¬¸Ù×ccgUÎõÆ‹-¡÷QrÚáò´‘@ŽÖ’Øx æØk!2t²î¤–1ßêˆ\Wäðã¼2«¸ ]»ŒUt¯ü?Êžj¸õâ1¨-BÀîb®Þí„2A{‹I— (q6”>Ê̱êŽËCîWž¦|”ô²Ë×O% zÆ¢kOcrà¶Þ8]•jÇØõÿu¯„±ìIõàÀ¾Ýgöý}ix\"—Nd„:CÚÂPÊ÷üž0„c#í¸0„Ñ?- qÿ<" Tp°z÷;ò¥âÑœT€ÃPæûKò„óïƒû ŠÆ6ã"È¡aîuϹYÉÃØ–:­¨ÎÒ06“èÜêšã]ø$Ï4°˜Ž»Ø”ÙÅŽóh2…ˆp¤å¹šƒ:Ç)Øngd„gsÐÙÒj‹íŸíŽy7£/Ðx‡›:¶†¯Ý„í N8º‰#嬛5Êì~¿„í±ôÕÝ g“ƒÇ~°±t¼øÄÀà´ vÙ;ã2aWNPúä@©wŠ@Y4 båNœjs ߯o õµxwrAW¢Ñßzj¢1ÇÑìîcáà£P4‚“lF ^õx1)ìïH‹c z+l‡Ì£·Á~EÖºÞøáI§›˜‘ÓÊq·Ä"Þ ˆá‚x[ø˜ "º¿(ãqö¶A¨88JIº‹Á·‡‘{{K÷Þ,Ú‘ –dÿ-âß[舀?)ÒÆÛç" ÿ¨0l:µ^‚×ІEŸ,êÈx Aóh€7>QÃdmé÷rÂUä¾× -Wzz•Yµ¯Œ™a]äÀjbºY³EŽÚ)t¥Z¹5Ãh—«:çœêŠs럈sâ-õjMǨ¾›Mýb¹AN­1t{yyùmMñΉŸ@c‚¡Û®šð³ü+×kX*W¬œé; ´³aë¸c,á˜ÂùÐMΆ*{‘Çl‚¨0Ù´ƒ„Ô‚¡m·d‡Ã~vEü‡¡=”…»‡¥ ÿ}„1ð'ýh–…D¾0hðxS…¶˜»L`à¯ñEaš &ÞV¡®’,E?­L¦ B-÷;΋ë¡[§Ôˆ›¼9‰¡¸üofM~ž2µX'++ÙÐ2L±:OFe ú¢™É’‰ùûDL£òS¸Ë6Ž+³Àâ ¼7+øÙŒ˜õg*߇¢®…ÙHJÇ«ŒÛl*›oó(6ayy-ò¸‘ÃϾ`ü»óm$ZÞ̶Ì4Ò†?˹lOI#BãŠ&w ŸÅÝs Î;¡¾œ„cñ"ØÅþ ^oÂá ¶¼ièä!ŸžE÷ ®7*|N® Ê 8H‹Et4Ä0©N0Ñr4NS³,~ŒóO7ˆ*„:JaKGàçxk±bÓÛô1 k0 ¬&7à Öd;$…²Ä †‰-¤¤Ú¼©%«ÂG‹),(|p  Lxï*Õì› ~è™^³®ÞzøðTîr+0}ÃØLe$K:Å:ƦdõŽpôiéE›-ó_äJ¹ÑÍÂÁ?é›^¥0YææpÓŸ¼2_N0(Œw(ño`îÄDÅr—Fa|k!^á ’z‹"Äšð‘ú¡œJ ©h»¿è³–êËËDª¼'ol&  íjIΩDÞÔ ‰©òãN“D‘Ù(Ví–.§tŒáƒ„™Ì\Ï  ^ä[l†‰E¥âw¾vX)êBÎÒ“ZÆé Ôh®Æª+…,Ì»ØF5k"xµVš‘…iŠ­—¿&Ý&lÂ0À}”ö °…@¦dh~,é$:>m]‹ÇH2)ƒ9µ*ªjjv¶|(5RQ(l/ òJØ3Ðï·sºÔ÷S´CæâRB ¤Gºô|ËËÁÛ¡Ó«È¡¤_ð콈>ö¢ý?kf ·N‹KE?aRzëÀXöwH½ J& ñó»u‡‰&.ì €6ôÎ>…§¦þKI¦ô»z÷Q ¢:ˆ–á”ÙÝf\v„­¸ˆ¨6 šb‹é£ ¿)ýºM—LçVby¦·­}c0_"ägâÄ*pÓu öyóe#ý*³EíÁ‚àÙ ÁnØÂ ]t °†ª<3A€w ¦ðk>2!€Þ8!¸Q÷ 03Ù B8à!Sج²™.ªzÞ›ê!ñ‚2¿ KAßT¾i- ¤xfvb÷‰µPÒ!Póƒ!Öcô,pÿì‘LØ"•$&‡RÉÓÎd†=#å"Ã÷A¯ýãÇà/92ñQ—xFÃY•Ǽà.ÍiŽs°¥ÛĹHp‘3Ž!g;4¼½&¦™–Û„èqŒs¡ä$ÓÀµßGÙÑÐÈr½àZ)„í••|Û6Ö)ß’;8ôå9Æ\šc‚+ÇþÉ„xyŽ1—æXØ3ÇÎ6ÁŸ“ È€•cC¸JÎ.WˆØ?™Î)WÛìbš8Á}§}؇"ö—ÑΩø=`&»L\ ‚#vö1ΩC>ÀŽlš.¬ A>§#W¢©»«›PÓW²Ë„tQÀYâN#qܯú4|0jÿRäÂŒœly¢yô! œáÃq¶”D÷§»«H²}σwĬ†¯u`ö.RÆý¥øK÷²Â6YËOêßoT´YìH¡4Y<| 4ÿFÿnàÛ´WÙvâºýþ¡À`<Èa´™B€0t˜! C k§ûí·T–“î^§ûœ{_¼,—,©TµkïºÝÙ†OxÖ•dŠv^©W±`¢J1‚*ô%·œ¤Ç‹Qi"ŒjZ¹°?w»W¨ãƒw¢O‹×Ц[ HÖêÛt2£wÖ#êõ(Ý¢„+Z¡¯, ÄâAr%+!ѧ†QÕ§\¥ÃÞ^]¶^Uà Á£kRèiâ æRuîìÅþ[ U#þÃ¥ØM½_¬6¡né²ÝÚ:´ëòœôôÒáVüÈñ/oqÚ\ÝmI–û7”Iá'!šcRnBjíìŽT%ƒ6A‡ŒBÂHœwÓf¾Ë§6¹”Ú  WÎØë|ÁCL1ÕŽú°5œ~º l³nÛt—rgÉz%OJ„<—žú¸Ÿ}éÂð–+>¬÷IØ~¤;ã”V©±eÑ07èÄj]r]Ó±!¡5ÙþP?@³`=«¤¿ñ‚ó_éy=¼z©j•œSÉl/ã¥Ù)¤—ò¦’L4œÛÖùÚÝÝö[`©i‚úr.\%n’‰r)cެZ•»…JW ¤çVV¼íXÙðb¨’ÙsmvhùOiŒ ba{0é¦<}øá›‚ªhÊ‘6:‰Øïÿ_à1ìý/ïkÎÍwt±ØëW¨ÿ´KÉn¬,2eŽ?5s¿Öä?€/øonâw@Qù ðG uì7!`gŒ^¿t¼ù 1㿌0¯¢·á/\É¢E1ª7¯mè[ÓþÛY̯>^„S¿ |ƒæ†p*”êr6‰‚º°O1×·ZÄ i%žÜ`÷4kN ¥ïÀzõæÔ×)ÜÃykà)¨€¡kºrÊÈvŽEÄKb™Þ®O^A¤ß†ÚC`fª5KrÔ ´u)§=(œn‡›®HQ©|^ñ³òÓö½K-ÿh²t•Ä.Dr-•.!±ošˆsÀt/ ‘Žf4i•&È‹ÈSŸæ%BØá<µfÆïÑ—/  (ÆÒ’sE•¤a<<+R}Õÿão1™%Ò¤¿¦çV¿ªÍw¨ õqüÄ[~”Õš6ËÙ^§AýëÁ=IœÁ§F #p¡Af :RÝÈ4ÛÌɯ±!ÛuT«Ä#–›^ Ìzcx€tðä*\õ•zµn_ê“Ñy èöÓ……\1ø»Z•n×ÊZéÀ÷‘5øˆQ'ÏåRA¿ÿ(ÔhÂÞ€)Ý,Nñ ž3jàÜìJ} í MʦnÔš~ ǡԇÊê£yˆÙRÅ“ ¶­- Áô"à>à¶—–é¹ò·f†sžàÎÓìļ„¿tÚŽJ*h'G›¼±‹™‰˜…G|çät%ìÖîï°‘´y}\4øb(/Ðè×Çi}òªÂô9½ ºÐÝ1]G³£öƒ#ýº§+Â#©Ëc.èõ]‹–ü(…+Õª6 ¼}G=ÄlµVèO$êŸÌjdìû‰£ð(¶Ùœµô»Ö:D£·÷¨Ñ{ªHlh*TƒW÷GrºHö]Á|ž ‰Þ©´5ÁsL)yœ9Ta©.>¸&ÙkÇ—®x ;så4$iÄV£ô›/ȾvÃsgúµä¾Š.\ƒ‚7¡U9ÕfÍŠ\¢Ø5äÓüé]%å®Notðì˜dîBú‚4é$xÄZU™eÛäÃ!ŠV]Á)¡>ÔšV[Õïs  :ìÛËB¡„&ã'Áæp2¨b$qSK±mMåD¨©åXx4ŸÎKÍÂkŸð’U‹³ %.F«¥çA¿}aiÖ½þo—íª_È2èj>Åk»|'¿¹£u,©F‘±ÉÂCÿÙÕ+†›hSo¢Íë’‹‡S™ó6ŠN ØÜ˜R‚^¬'ã›ÛÄHzahT(ÚP/«øf’oGXbCä0}»î*°@Ys¨Å/ÃÚù°ý6 ˜i_g=ÓÝóÌaƒnÖ1¬¢"†1æ‹Í/Íg)²óÎÙJp°ÖÚúØÝR î@| ¹³>:kñöᡘ˜æ‡òS2\Lt è€$Š]²+äùKƸ‹cÚ‹õ{ªs`•,»WPÜiå1 z† ûhSƒúYˆóŽVÃcfO)oŠ1ÅÊ_‹`]Ñ$3èB³&±o]M±Ÿ‰÷*æt_xï3SWÕØ¼–ý ö=í(Ýe°Åt ®ϳl,›’ýmvV6(WF#O‡ÿd| ˆÏ¿%ô˜ö´?^—ïÍ÷çÕóæ›äKùH¾ªiÝÍb[z_.;Ë¿ŽÖöáãm¹9~»øFò·fµšˆYˇíb Ó©‹Ó¸[ÊE¶9Cñ+y‰b©`=&Ë늿žYê ãkQ:{*Ì+ ÒÅ%ÈI“ň“ôÒ-®$:€ROrŒ…¨6ô’ ²5 šˆßZ¾>Šb£~‡×熣’œvÊàݲ#‡Õ%©ä‡5Ðç½Û9ª[¤%çúlÝ퀾¿ŽÛGvt îm'õ#Ï —×QN&¡œsm/+A8IÈåè×+N¼9»¦þ]SC–“óÆ‚“ý Ùûßi§™`ňÒׂ×EžS‘,Mܦ§µEb\@¡J«UÆÓ(!Œ°mu`d÷M(!ØÛËùQ`tÚ‹t(²áE˜êØŠŒC”Q¶Äc÷âè`²ªºâÞK"™¸p2x=ȤE–Ç`Ê9pÿ Ur2Ô*ïšÚI@°šSNGNß¼;Lл É³7…Ì‚—"P+¾‹ˆ% ²d嶆C¦ÐZ¹ÓÚV‡Z%D_êв`÷JÏé9Ä…2@0لжšÄ¦ËB€aW³ùÑ.Э‘A2eæŽHÛ1?ò#c€A]v7:»`²áÆ,2»äÝV÷å‹ÔrZY>è}Ìúë£à„ó´âÏÖ£"ýVÔC™3ËYQ¸JÜ$åR.´ìXÕEšs(´¯9ÒѽÒF^'~–^ƒYÔCˆžôš7mþc eÞ%,íç}”lU€·‘Æf>Ö3ɪ±šÏ _Ðy_Dq Úu[¶IrÁ_ìaØ'ìïõHuÞÆš‡CÙzơÅá1Œ9c¾ ëOû úÂn‡.Ú#¡ÔøÚÏÚãV¿/3´ZB¡¡Õä’¾]ÑGÖ®5Ò~×üy™qëâ|Áž:v˜¹±aî6—Ä;P¨«2°46ždšÎ*ë^îŠ3t—…)pª§@£àޏú›è–<±Uu¢O+ŒÔ r€ÄLÒ«Ùg¿\r¿?”ÁP"`è¶¾¤Ö'!…ÿ’^­miì@øìXP Iö‚( r«(ÅŠ"+[± —NÛ/ç·ŸIöêµ¶<}Ü&“0™¼óÎd&ê|øÔì¬X€°ŽÅ²n¶ÈÆí*FJ·Ùœ+=äñƒK¶<×xO1z^Ÿãã/¹~uà}qâý8¯AxN>Kp¿1×X©Á²é™MIežMyïËWÞ<±b©åEoôEÅVågd8¥anôùÔ7‹–µŸúÎÕ?zØ «)Íå©ÿF”³ã¯x™Ãf+|N¹‚\þœ+"¶ŠZ/‰ž«´ûñXÖZ/—mx ¿åžqu¹2}m¿ñÑ+ú…]·á¿û¸”kØ „ÛþõµŠõ3Õh5*P^ºï5«,“gÒããS5ÁFÈ“¥¸ k“çàéUÌ²Ó <ŽWä]ØFñH.t<—¬õÝ>å±ÁbÆv«yS©ÀvÁR$öĘÌ1Q¤»haÆ'r{O-ö€‡Ø¯f¶ì…½Iû,ŒÝ‰p¿¤~?îþÞûe8í vÍí‘bùë‰ïvɸ˜œnŒqj¿³fPvhØ9ô¾qÊB<ìZãã~÷!"ñkK6\²ÄA*^ o]€ÝA”…ÁmúðÕƒàʇîÂì ‚åõï@äÎ|äë Ñ}X3Š‚‡ŒcŽK>ò皥J6V¡{ý1œv@8\»±±ù „”åuÔ¡ó*—3ÅÞ "1Ž}FEw¾ Ç*½Å»V|Ά¾õ±Û/ª0–›…Te´ö¢ò/½ÑìÍ?ÁiÈ–/8Ý쿟…²i.ýlùî5âÛùâböLÅ,ô{l(Áûo[a…]Ý'_®žvïƒûº=¿Ý€ãqù¦ÚzÁ±æÓ†;ŸnÌ1sµ¡ “ÐÆ»œṉîìRïk†åqìŠ\}tѧ¡|—cãõfÞèöáj#öª0þ,ó±Wì¥ ÓÚÌÝÑò¥Ä>Oªîø/ˆ-Dž©˜®7¼†z+2 ùü5Öá¿´Á«“¯¶¶~ŸtÙóU„v.GçA ãý7 ð"„„a.6±eKc´!©ŒñrÓliLW¿Mu¾CÆb¨“ÿ*Äu(8½ß ?›F·x«ÀëdÖ®ò ¨ëšWáíð ›«C˜~OhûÛO=ÞÛB{ØUS#óxúÊ>ow>Uí-í¾ºŒƒ?oÇÁÉå5œ²³²º·Ûµo$œdÓ¤3-"VoV‘÷³T¢tÙ©2kzrþr^àÍ*C [ÏЛÝ­¿ð¢ÁõèN¾~à.”Q`áf}{èŸRÇþ’o´¸Y‰w[Á“+‡ »àÉ•ò®¿¶¸•z Q#vJ¥¡¬Vòvæ øTiS¦;Ž«ƒUÆQÑ,&Ø–$|Òð86k»n“ºŽ;]`³Žø8 Än¶0«þ |†Ì/©fÇV+ç/ lç”¶‘„Í&®vkÜ—pJ‘ì9‡vˆŸ"tYß3o¥oÅ‘Vn&ú–ΘCŽ1Çw®‹p WÆîåæRÎíT»­Ôi|KŸð\cûµö~¶xÔŽîÝGé“ùÑÅÑôFö -\ÇomþJ÷ÇýzÈz]Ƚî‚Þ5êI!â¹l€‡Q•™ÑB ¢$ô]Ç’=„/wù@?ۣ•\=˜Ç†] R®ÆGŽc•Ç |"œ·‘~Ówøè>ŠÙ£Ávqß±g< ž5Ðλ J¹DOYà^©Î]:x‹·fnÿ™ð s¾Ã}î%¹1ÖœÙØ¦:ã„Ø·@ q¥Ãͨm<Ž¡eé~¼Èà”Šv`Kw`Q ÊR‰ñN‚»”z‡LMêö÷;°½ø…ß\b;º ³å!¨]0<¥(©Ü¢+;Øa¡ÀlˆxŸ[Àl¡È¦QK£îÒ Ëh ’ÄÓ;׫'vr!ÉbÄðdIGÖ&,Ü@ŠJ_V‹wã£aOˆw¬'yž-OH V ÈùЀ…38 ;ãd`Wï9\¬“¶l®Á Y©±-¹ùÑò¿a(U#¤_š/ÌŸ«ãÙýúÉœBɹ¹ZÏÙµ_0§õÁ/ÓˆhÿÃð}Ó‘P]¤ª •Ië†+æÔ‰$Ö§B¤Ÿ:²VÇ÷«ÇÙt`ý³LÔ9­·kÇbV´÷öaïžkpvÃ’$áû`a_Àâüu~)f-³t`1U¶L³=Î`'Ÿ žÌÚthþ´çç«™õËï v¬M¿`òßAôCTÄSñú‹CvHKà;†‚&Æ$±óLpiŒ(üa¸$Òı@UŠÒI‹„ÈH%Š&> ”b”N«Š/›”(ˆRMóeë(C@Š JÒ]‹‚'ÓuDôŒ*Ö*S¤ËØvYC &Š'¢rÁ]ÔUD3r`NPšh:ÓìŠÔ4ÒÙÿuÿ2®4«°‹Èª'¢š‚4ª‰šŒÀ,ÙŸg¦)„)v$Þ-&‘{UW­Ç+ ‹BYÀHuè5ö¡Ðà²4“fH¿N#…`DS0DÖ<Éè(­+°GA2Õ¨/Hgªs‹‚'R5€ 3,|AªL™ÃÅJ.ظg;s2Ð$3®„¹JEŠøçW©'p~ÛU$T€;à)BmÖyžòð?h2_È&`4ÕUQ§*H½ù®Nd 'ÅÎ$1.Ô v€tÀÃwrCsð`^XƒÇ ¤ƒ‡åà_SL§³Õ`eÎaE|°Ì%„ž).G³L?q·Cbi”…ÿ_?ùõ endstream endobj 233 0 obj << /Filter /FlateDecode /Length 3791 /Length1 7261 >> stream H‰|V xSå~¿s’ô’RH“ô–4=IHôBiÚ¤-µ×ô‚)4ÑI[ÚBa:©:±à—鹈(H§uâ¬0e2Ñ ¸±)KçnȈ€f_NKuò<ûóœóß¾ó½ßÿýïûÿ‚Nˆ¨X7:gåÙ¦ù”Ÿ†¦¶Æö ¨PžoZÐ!AÇ3ˆÉ/aFûÌ6•o³‹ûv¶™?s΢'(Ž-"·ðô§­-Í_^ü( ^ÄöÎVˆØ¡ä¦z¿†·¶u,¬\ï-åþ ö±vμ¦Æ¬ôÌ%€¶ ¶5.lC‚HÈd{inc[Ë´¹ö0PœoŸ7¿#ÔÀXžo¿¯¥½Hç>D¡‚ÖB …pPðóÈêþšNó7ÿáÕJQ%pQlöÕBºÅ]6¡ ×5…p&”Ü\ÃõªàŠ`WpQðÞ`U°â“ ³"j?þWK 7B|ÿómt¼Z£ ÉméVa Ãê[愸Áù‡˜7aÞ=ÂÌz”Ù·”y×ÅüYŽÌA?³r5ÖàqfâZæå:¬Çldv='ñsfÝ&æÊfY˜ÿϲ¶³v2{v °çEVÄ^™AVÆË8€Wd½†n¼Î<ƒµò&ëä-VÊÛ¬•ì–°VްZÂZù-«åëåCÖÊG8ÎL?Éš +æþÈ,þ„OïÓø3‚èÅœÅ9|†¿àsüÃßñüçñ.à_øÿÆE\ÂW¸Œ¯ñ ®à*Ÿ‹×p7ЇˆIAJRQERE“šb(–†Ò0ÒPiIOñ”@‰”DÉd #¥‰RI"3YÈJÃÉF#h$";¥SeRë²i åƒr)œä¢|* B‹â*¢Û¨˜J¨”ʨœ*ÈM•TEÕTCãèvòÐxš@wÐDª¥I¬ÚÉTGSh*ÝIw‘³¨¾_‰ÔŒû©EÖy‡¬ò&Yï-|²´ò™ÖùZJ+h%ùi­¦5´Œºè1ZΧÉ3ô"í¥Â'í£t|³dxºUëÝOô¸¯›B]Ýp§¼Îºë§evƒ2$©r–;@ Ü2xÀnæ–˜!UD[Õd¯Õ'ù%ÿ¸f¿T%µ666¹æ‰¿o´@w¿§xÍRŸa°Ùâó²EØBöã÷±‡ÙfËØÁ 6Rfx¤€˜Vëä tº R·Ï`6K•žZo Çm0û|l¥Œ”ë‡g%ÄÁ1«ì܈ì÷Rç ”ðùýý=«9Ðé÷ü¼Ž~7z¾7@øþ@éÀg"ìQ´UvSg­<Õi5ÂV³ÕÌqúÜŒ•á©óVr¤f_&_”|¹Ó!á_†üã==Æ¡1kFð“CksúN nÄåþ äc‚ÿ|Ð%¡‡¯8P¬aÖ›óŠEW±˜—›%X-±BDåårß‘côºX–ÄyêÆk©³Ï¬¯ï1$eÛ´éÙYåézA“§49ª3‹§•¤jM#H¯-)/ˆ)*‹S06)Á‘_2Üè´'­•7,>A•œ¬Kuy2ÓJò²Â—¼-t‘¾ ë|;ù/E%c;]Åäȉ×kbÉjÉòr‹…p, á²(£^ïÈqº¾Ê¯¡VGF» X–ÒVYÛ茋ϻÛŸnNu”oˆšà±¥'Lm*+UÓ;ÆeœZ=L©›ÞÖ÷±RmÌÌ7kOE©²Š¬CN 1ÑIöT§C-öÿ qð{ƒpŒ/ Κ6×Éa%h¬ZÊjIË“»m”FQ>)E§3uºz¨V)ô% [t)ò˜ìǺ(”ò:µ¼RØ­×™xaÅ‚‹“üÝ…ÒUcnMFFM®1ÅÑ_W¬ž^X8½zäÍú›tO~jj¾'ÝîqI’ËcwÖWU]ïtÕ‡êØ9¡|¡DÆL¿ÓÎòàójFh¬tÅÀ;™Qý_ö«.6Š* Ÿ¹³´Mk±üô:ØÖ–nÿ,X j+ݦÝ@—¤ˆüDh;Ûm¶»ÍìB©H$úBx° ( DÅ5Á'‰$F|`‹1&Š&¤4DäALj °~çÎl kÁòÀ{ó͹÷ÜsÏ9÷œ{îÎÔ,nuW¶.ο]¯ŠŒŠ¦uµõþ–ÒÒýKÁ‚¦Øfaݪ Ð……ËVæÌ+É|vuÝü¤ùçÜ·¯ò9kÀc´OJgVÚÏ.Ê–qSö<>#{IÑ¢¥Og6õê¼Ê¹™OÎx,3§´¾äö¥e}ç<û/MI¿QWûQggÖ S®ú;§ålsáu¦ñŽY㉼D¡kD=._DòÕP=–(¤|×5Ì>åI}ÍTÆ”q®Ç€TEne„6‰•‹×h¡ºŸ4qÇÉùT°m¦¼_¶™J±wiÿ^tLžÿr¹>‡öñÿ(× Ëß‹¢ž¤_—ø\&~EŒÆ>ã2ÞñÄyÐ+ WAoþ…\4ò™çP‹qvÑb®EY\¨ wh>ã¨qÔ(è"¦Jêé›’òY$Χô!…ªC´R¼$Çœ[Ä7•r­Ëz³iÙĘë¶]3wQÜ ².S)Ÿ¶?MÊ÷ ×´<_ÌÇÂuJåÝ‘b›ã…úP¹®e]S øØÏ5¼œÔŸJ“ö(-‘‡Z{¨ªš,JZgÎ;Q«÷’§WĪPQ§'×7@O“[= Þ*Sýþ1ðŽÓµã=˜¡")û=ø,ÿ-þ/XþðYöSðÐqŠJ…\}ßùÌua/Ũ ÔŒÜîQÿ´LÜ-ëä=]%ë)‰aÜSŸ!ŽåæØ€ ð±ÿw€ƒÀ&`5ð"°h|@=Ð<í˜L?vË€÷€õÀa`è^üÀ) ÓáàpÙ¡?rLd,ø=Cü:oÚ­ã¡¶ÏSÚO“ umháGíQ{Ô¦nü:­ŒQ?¾Dc”æ¼yÏäÏ%Š/T?A&Þȇ’/à˜›‹‘Ýw¡ÿ±ÓOCÿk§ŸN{éÛñÀ]ÊuË€ë=fÔv/fé£O·¶F+QŸ®a;úäÌîIQÞ¬ÿ.eØk·aÅtÐ-Û,30»cØ_´JkÄ'b,2©‡zq24|Õ ÕQ¥Ó[^3éÂl„Âù0Ò!¯QxªBoæC “š¢rd€ Ûñ´%×bÖ”³A©möAß hû!­96 ©%€±)­ëx²ì€³fütFh›\Û/}ˆàÉ}^Ý'íE%—5D`y:{Ú@íäEŒÚi#¹e¬¼Ð§c6$}1£¶‰ý®Á¸>„ a=àÚ‡)ÍóvÔ÷Ùµ.£lg¬GÆëÎÈÇÐcý†Ì”E[1_‘¢•uiNfõ)×L/ò“Z“§ÂÏì3Ñ-91ÈÛã-ȃ%exvcÆÎ}Tæµ7Œü%NàŒOñ;IäþW€oÿh endstream endobj 235 0 obj << /Length 304 /Filter /FlateDecode >> stream xÚ…‘ËNÃ@ E÷ù /“ÅÛ“yuWDAE”gºˆ—º(Eôûq'ÚEŠd_y®Oì‚w 8«èŸ|ÜUG§ÎZŠÝˆ³˜lŸ9Yè^྾jŒ£ú:ÇqŽ·9Ns”æ±;ÏŽè’ç-Çp@ ŒXͱçÌwÎcðiëTi×y²å®1^ê‰FÖŸ[•,ƒ}vè±ýuŒ3ð2ç)•‹]'aPzžÚ%¥>¢×[ÈA¤!ÖähýÚXª7‹¯Å꣯n²CÏxËüó¶']Å*X:— uš%Àó²ú¬ÙF)–=Ý–ÎR8š.NVÕ~°˜nöðÃSG$ŸB~éVwõ‘0J*·ÿ]Vš=­{!¶d×+N#ö# wÕ†°…… endstream endobj 241 0 obj << /Length 1904 /Filter /FlateDecode >> stream xÚÝY[sâF~÷¯PåIl]JždASIÌÄçƒl« ¤YqÍþú=·Ájf’Ù©©J^¤ÖéÓçòït7¶©=k¦6¾ú÷•oS³4ß4ý¾æÆÀvµÕöê·ßMm so5Óp‚öJš[ÍõÃso´ìê—+Sl]¾oò«o=O³<à œ–?iV¦,Wó½Àpm_Ë×ÚozÒ»öL}ÞóM=¤aJϘžvïÚ±ú´÷{þ–­ÙŒ‡Æ|lyàŠ¬€zßÖ‡ôŒè9ƒ§¥g"9®?Eãy†éÊ@ØáÂ2~`)1™J.,qtwáÔÖó£­ôûÚº¶½aûví¸†?pÙæð¨é–ïX¨Ù7ÛVN28§çý1Kòå&Ÿtê:†=P¦lÏêA*@k¶ž=¯äG¹EÏ>=ß }HÃ6L̲Œ|‘å´ç˜úûâ°ý.W/EÅãEUþÑ—Ån_6{–‰vhf\ì(˜í²êYžþQ¬ Ëvέÿ-0r¾„ѸØ›Í~õ²|j§Çww< Lý°ELŒÔ žÈÊ-Mm–MY ¨ÛÇÉ? D»_1ïY¶©«—ªÑÇ×|G»b¿.ª?UÿŸÄ·‹Î# ê'~'»â¹VÀD‡ç¢*,²ðòÈ’ó{òÈû8·¸aÕ;àСzÞÿ“/ª†›ï°eÞb{nÊÕ‹ðç»tÝ÷EËús]×ΗHa/[î2Ùꥮ7²§1°ŸÞ»²UYT«bÿ5 öÿF :ßt+»C.Vx¬~ -ÇõáíÂ%N®5©Œœ,Ï/`»#z±ËµÑÃì>‚aBÐpÑ2-GNúb]î¥QÊÇdpÚž¾¬Ö8èë‡}Á’Rföõa·*xR´<ý±¬–ÀGž9‘Û«)ôײyaš…µ(© lëuù`šöŠxöMšúr'þ>(¨Ê¦)Äõ‡]æÿ(×JÒ¼,Öo^$xg³!Õײzfñª®Öå5Žè˜PÒ€ÁAï.{dzºh~Rº¶CwkÒý—ê¤N<÷çûõ>¯êµ2M͵oT9›e)MÖ(>-9O*°ZÿóúxâƒÜ@ê¦\µ€Ü‚›lJåGÅD0´3¦²¶wábHxµY–x×1>”ý3àáVpI£àœF¬Û‚ vÔ}`Bª€A~‰ˆ:Ñ .ÐrLŒT°D ‚A\@…~¸Zž;©´¡R)wÑN¾®Wp…¬šÖv ®~TÛq Š2Ü.uÕ\n¤€=i»vM» 4©ŒÏp|V”'ÏGKÕr[œhŽ«Óð‚óÔþâ‹p¾íµ›7;œ[*ÐÅaQ>w:ÿºëj‡¡¯ºÌuØùê{O'²ßáVP·hóÿÜ>DÉü ·ÄÞ€íUèÏñ=¦)„¦8DÀÁΕ¢}Ñ.Om—=Þ’ðãQ¬ÁÁ¸Ð55‹j «DCݸ­›âøÛU#–׊®rnsTO°@Å^Šæ¾~j^±Èt¡D›t]p,Ãñ­sD÷ЦjW`_ª¯ò g©Ôît¾î÷PÐÓN€—Kê4‰³Þµëšz–ÜæïqãÓ$N «™yŠ&8÷.E#–ÞÜó;Ÿˆú0™ß§ñx’³|’LGQ*&™¬&³‰£Yô E ¦`aW>#Ì!¼ 1÷1ÙôÓ3Ϩ²µàãD-øhQ˼ ÌJ× itGA!±ÞÙâ&Ëã|‘Gü=N’‘Ä@€*QÊ;Œ²ŸÅa’eG;íœä÷Û"‹Ð9\š8;BQ°¤ ‡­ƒ‚Dä$ã­Î7‹™´8Ïò(MÑâbžÇÉ P²XwÂÔÆ¥¬: 1fˆcÄ ¼ õ™ܳø˜H i‚9²ˆ›Š+ÛQº÷“V[ûÌ~x?©š-F<Ös_ڡϬI!5u"KÎØÀ¢Y4žÆãh6Œø[-fZ`PˆGœEŒN…iœ׫h†®Ìhã¡;×½ÜAy4¸å7õ1ÿ1)ºœÁ ŸýÖQ ®/°)ð(õöw1ÕªÓl@°Kd±`v¦”-†rg;o$:¤Žÿ©ˆòÿýGˆçãOè¿ðoúwGßoý!A,¹žÑï õ/ýþlà% endstream endobj 280 0 obj << /Length 1087 /Filter /FlateDecode >> stream xÚíZ]sâ6}çWè?X«oËI6ÙÉ6$ÈC'Ýa\[¡ž5˜Úf¶í¯¯ˆd‚ ¦@B›üÛXè*çÜst¯1€À—ά`à!(…ž”PÂiç鑾÷ H} ~¼ŒœÆ)äŒêó ;?wërÔùt#< ¡/£gÀ…„ùÀ"Á(OݾCQ7p0êNWÿUηÑ׎YD6±«|é—Q©¤À%JŸ›¯_¥³BÍŠÜ~Ë„ÖkÒøòy7ÏiVæÄŽK<Ù}è_ n‰9wÍávVdAÝ4Z„EœÎ̧Á,2'ÛóäR‚ÖÓn_ŧÎ×P ú ¸X@» h—ô˜«ÌœEi¸˜êXÁë2†èÉ.t\Î…9ðW{ 9öêL}iÐG:-A·Ü{½‹Á/uX1Òœžv§¦…4ª£â!®•Ǻ^I)μ’Ä(¢jLBÎei´ÙìÀÊôÔLäqXÊp‹amŋŬ‘Œ®Üa‘ų‰¹þ¬Â4Z^í åïç/ÚG)XV-†•ó0W³^¿žìÌ÷Ï6=Oùþñ™Ï gwñìû*WŠÔîJæÐSA¾ÈÔr¯°vöW^¨éæÅ„èâ]æ¸X˜¹ú:Uj;ÓR†ÙÚÞTKY],x´LY¼KŠfd%¬gB\ÿLç‰*7ÝHí "-¨A¡r‹Ù@%Fð^9˜w仃zûª‘H((­ªQ–jìéJ# 4²:bü÷@µ4‰ßªðm*dˆ5V¯ dYÜÝÞÿd%5ºÞpL¿æ˜-;§eg¥újMdƒÆÚmìÿ[£hÜw˜n³eA¥«7•ŒŸ—aj<ï{Aâ–= ‘{bëˆy:‹yT]RÒêå¿§gei¶Ú9˜h‘䯵žnùu±õ¢”EXlÐ&IK͉•c+Ò~¦æYª<_q“>›cž.²Ð–Ž¿"Dµñ„ÆóD ÿüoèˆ.6ŸÝÝÞGww;Ëu‚÷ì˜iûò °m–îÖµu£eoTÏíŒìÕ(ÐrÚ`ååx &:è8ž™tµ¾•MØ–æå¶ÊÔ,TÝ ÏÏ&Û „@ù[/!ÿ¬Š NTT^å¡íÕæÛZ5JýÖm  ¶–Ø[]ßÄ*‰þUnºè¬…{¸Ýæ„'ëû; äl§h/ƒ©$9i æ Ø÷'ŸûÖ`N·ÛœðëOmÆÃëÁGr™ƒ,=¼T¡­“¼#ì R…¶Nr¸ë õ d~íÍúäàžŒò·ôdWKC*U—ÎË_oÈ8«9ÓÃ~¯¯r§¡Ù;& ø!å“ÿ8Ó#>kMï¶6 †òúD™Œ“ø·#’IÙ²Ñ̆Áéz´ùÒ×nHyeoË«zC{z$zÆÊ[t«Àÿr!*¯ endstream endobj 301 0 obj << /Length 545 /Filter /FlateDecode >> stream xÚí™Mo›@†ïüŠ=ÂÍ~Ì~pmGÔCSnnd9°vlpˆ­¶ÿ¾kÀi $1‰ÔzO³«]fÑ3£w4‚–ˆ  ïΣÖD‘"XK‰”ÖX3@ÉÚ›^”Ú³KD04úQÝ\# àv½Bß¼¯i|Õ~ÊeãðêÂû{g!Æ‘”Å D‰ÆŠ ¤$ÅDR§hê 8ñ1Ã4™Òþ'³g+“v÷I„TøÙf›yp_><‰¦!‹ÀÇA(„¨|}'‡~ðO¹¦@Àç²áÔ ‰µ!•X‚h³g5í8 Œø¿6&5‹†‘ìÖ&ßÎûàS÷Q¸¡›×p'»<©¸¾Ž:¢Ú1îg2†#õ%vÃyS¬7lVš¥;ËòÅþ¬À^¸ma§^]™êÔ”&OL7Šë“îžÃÞ¢ÞÊoî¤ü=Ð+åü å_æIYÀ'„åÙ‘R£%œV=H²ùAJÎó€ßÂ+÷vþéCé<†pDOm'cÁUÃñ‡Ïë2<®†»{SÎVÙÍ_”AÐê´é9ª(¶Ò\Q|ôª7¸þæqwRÝõ7#2~AÑÅE¿ÉùÏ0³áÒ-œt>Hº…ëgFÂÚIi×ϼYƺ~f<Æg© B®°«ÒÌr'MJÎSXþÙÆ À±PûAEu Dëø<~:ýÖ92û¨&­l<ÀÒšêá,ë>üåa-Ÿ endstream endobj 313 0 obj << /Length 1417 /Filter /FlateDecode >> stream xÚ­ËŽÓHð>_aqr6vû}„À A°Œ œ`µêØ=‰5~ÉmϿߪ®êL™]!ÍÉÕÕõ~u9pvNà|¸ ì× ‚øùpõvsõú:O0÷“" Í“~ž¦Nš ?„³©œîz/‡I+OˆÜ Wo>^È1B„ð£ ($p¼,ò³„ù¿Ü¾ùz#ˆÝ£ÏM7«0qûj.§ºï+»Š€ußMª›ô‚.ë èÌÜ/Ò4²*?‹“3•Àþú:INè¢Ô¢È Y­W^”„®¤ÏÔ÷…øbžúVNu)›æ€¨À­; ¶{`üÜ‚D·^EûŠá—/™ÝAào{`ŠýàŠnt?¥"¸ì+†~hÛV3éã¾.÷dÂ@2v­Ô–! Ö¯A1!¡@xïxì°†~‘ptªzTö‡•H\£&%Kv²ÄàQé¬U导¤_çq„ ˜ØÀÍ—AuŸo™ÜxÈÛ/Œ#á.‚(©δèy¬-¬O¸×sW>ÑbVL`úƒ)9hÒWã^Q AèŒX9|ýpåüð¢¼p‡¾Ä?M½]ÏÄTa@’e…ñã÷2@ É@ßþGñ¬0¤ŽŽ­Œrìg¯‚`pšÎ£Y*.6¸¸³iÂÛó0ÁE~!ʾLx{8‹—CÝ_w;迸0qóD‚ºõð$Š.ßÜÞ™¯$q+5ɺAÕÈÐ*©çÑHÓD>ª«Ñ”~ÐÚ²à­ÚË•܇BšþŽn°]ÌwèE¬M¥½Úª%×Z =EþG˜´E Öc~µd\#Á)ŠÌ픪4]cY‘T!áï¸:™\jÝ—µ4iÁóc=퉃‚¨Ëì!nûö5`k¬[r ÆE~eIìnP^Œó£»õ®îdC(3 |ÄP`YÅ@Pb›~@íHƒ>âõ Æ³Ñ-Í+oê=;¹»ÜÍ(hŒàÁ`$ŸûÇõ¹à!x5*6ã•å8Z‰s!"(gMGS2†²fL—œ,8é©6é°©•ebY§é8•>Ò½óàÉà(ñó¾:vüÁù5ŸÉÌEƒ´u¥X>wJäT•,Ñ´{¹SÖ°²™+¥-!£;U*­%Æ#p„£ç×XÜ/NI®[VPò}·kt’ÕC­É´œ]Ïñ½cæ•Ì+鳕ÚJ;«³Gj¦š22tV]ÅNÔÐghG®eŒÓcgIúæ¼Tcòæ ¦8>Þ‘ÀQ®KV=ð++¨‡ñ–ë*6ëɨ':ðxAš%£>rîÍÈ­RŒæ-ZÛÔzOZc× Dø¹ß„Ua$θ8hÄ‹wJ×0@\>Óž!Ì\™úé0(“Ù1ÄzaA¸œn²+ÕSÄ8i°ƒ•´— Óàp}úH9H\3{O‡ô¯K¨ëSúŠ"²Ä×,ÿw«u(ü" ÞsÓØ¢‚ü}XΠÜïÚnèvÞɧź<Û§/þ .6ä0õ³> stream xÚ•U]o›0}çWøe<àÚÆ60M“²~­Óšt)}˜Ú*¥‰“zãkTuÚß%6YI³J}òÅ\Î=÷ÜcCÐ tê|Jœƒ¢ÇR(Y"qG…1Ã’¢d®ÝÃÏ£‹äxêù,Œ\ŠÍ:¹MϘ‰}³œ“©Çˆ;9º:LÎ&c³;™àp2NŽÇÉ¥w›|qŽç—CA…GR¢0ŠpÄ8šçÎõ-A x÷ÄzÜd戋 @œ¡Kç›Cl#3Ñ…ÝbÛŠ$¢ Ç”Š®¯¾„¤˜ô}Q ü)!Ľ¼:?M¿o˜õ'B<† ?Xi¾M”éªyªô<ÍÌC[§+»_._ê4/‹Z×M=Ìhz¨¥·Ì²Ò£Â}ÔÅÊlתê÷n]gœG@‰a³¾aε/„tÓlC.01¥ÖæA¥óé¢j[µl×sK솖©ú?•b‚B‡„v*‹(D>£˜[Zï<_‚Äe•®53ñRgŠâeL:ÈNÙs)L:Æøù.d܃üojþ–PV0Xl¿Ne^yÔPÓ³•-rór¡;ÔÂŽ­m¶"aêïà$à(†ÂLv…)‡Â4‚ ›š˜¬½î¬±>C%¼ŠÁ¬áT¼ŽbnsÚzkž­¹&•*Î/zæ4ºêàÓPn˜vÁ^µNhU%nÚ¨ZºÐN3ý;mtY¼ÕC·E¼ÏCwfþ>œ£¥^™=ß/ò;~(ïÔ³´XÌ2}_4›> stream xÚµZkoÛFý®_1ßšl‘Ἃ €¬Ø‰Q¿¹mº©aÐ2ãh#KE·É¿ßsG#EŽeIÛP ¬!9ÃËÃû¾—£„b‚)á˜ö<“Ñ0%qI9Œ’)§0âZ´-3ë¤cÖ`ôÌ:,ZÙQ22)°H)Á¤¶˜Q’I§" ÑÆÇe¥“Ai¦18,Õ§'‚²ŒCã>]GùHÏÄ£™²O&J.ÒžFT”q„1àÀ3-"] L§×0‘imAwjñ+™vÊv”UxqºËHHS†¡ =‡Iï`3*‚ 81FÑ•ÀŒ%Æ€¨qp‚™ ‰]’™è€ÓV tšYz9…°ÚáYÎ2¼nwàcb Þßú@t³QÑ]‘9Að‚9%°ÆKæ´à†×ÖxÍœS´Æ0çSyË\ ¶xǼ ¾ɼ(åóJXðFà·*HÒ[ÂóÎëŽ šù@ò †ùHƒeA[lÆ]Á³–á °`%­‰,8ZŒO‹ñ"-×¢ðà3äIm䵕IŸ¢!1}ÑiŒžEïi Ô)¦Å¤O‚¤FZ#$ôL :Ò`ˆÐtèL HðG>­ƒz‰@:@Z-"¡E`ÿ4)Ž’ª@×qÜÑÐr)-(xIi€GQw´¤;©¬¤"FÊMGÓ5ÑiMÄBÒ7À”0 vâo«Á©„NÊHGආÕI˜„ï¼|ÉŠ>+^OÎ'¬xÅžMﯦՠNƼÇ-7ÏÙO?užý©½ÃŸÿSÑ£N?vqdèçOaôsO?cúÐOC?Cú™,&æë_-.wÞÒOµXšn/Wzþø fðÿÅex þpAòzñ„Ïh¼'o!Ø[V › "òòe§èÕUI”_•MÅž½ú·‚ËrilêG¡~â‡çyݤfϺד«ŠŽF÷Ó¦N—z}ƒÇ“ëM4ÎêÉõý Z9{uÀF뺬¿°È…À’óa3Ó»²ªËñär:(G%~.{Çüü¼“Q•Ó~V×ëŸ8ü‹@‘3Å«ÏoïöÙ‡r4­:ÅÞ1+N&õm9Â;v™ì§gó¹Ó³cºÐﲦ¾Çyÿ¸œ~¢åcœœ¹«X±ÿ¹yÝoðˆN1(iñä.ßµWN«ƒÉ¸aÅ»_Þô~ùãÇÞäMU^†ãêÅÑðæcÓ)öÇ¼Êø†¿ÇÝñt8¿Ð¤êiÓûXÖÌ œÎ«j:¨‡wÄw ôR‰i‘”(ﯚ„í  å+ÝÞÁ3®›Sö^Ó0±Ãÿ>ÿá%–ÏÜ€CЃCŠæbίÃqS[ëÒ»”·Ð‡ý«j\1ù|þ*§½×â×iyS¥`ø@´ÇUSBKÌèî!4-«ÍÀa*³z þ_ÙÕS:…ñ•S(ʯž¢øVOÁ'«¸zŠ"¸X=…§åê)D(=cFу¬KèXý[UOaÞP… /.AYNîo÷F“Á';ÅÛÉýøºr--˜su: ©DCTÊ»7i.‚¢ï¤4÷ŒƒŠŽÊ›)2…™²îíM>CÓ^ÐËÐ<ܳ¢H%/fóåípô…=ëMØÜ(X2Šçy~8ª åH—’>7ìb=CŒ|Ìø Y ¼8 dÚ¨ïBÄ#¤>ü¤Ew<ž4ä»)w'H”ºÏF›G—GŸÇÇ8­È£Ì£Êc¦g3=›éÙLÏfz6Ó³™žËô\¦ç2=—é¹LÏez.Ós™žËô\¦ç3=ŸéùLÏgz>Ó󙞟ÑûF‰OKFv4B(žÔ×U8-.Š7ÅaÑ{/Ó Éªùžy¼Ö 0\¦àZê!/4VuÙ·yÙ‡áÍ}]ñAy—²K™’³6±Ç‘*“cç6Rùaxa%–ÁG ¨ê6Aé¹$ôe+ªZÏ4kAè¶AØ(8n8‹(3 {‰k1˜¶•Âz à Fx.,.‹õ:aÚ7SkPP†h8•¦Ö’kYa[¡$ìEr Ü Œ¶Zp¤¬kA¸¶A˜¨xDÀD- IYÏ ß:ç9õN$Æ(3Þq„ʵ BÛši,R)Ô7Ò‘•Ðy$ñ¬UÍо×4*IÝxM'3F“çØCµC’ƒ‚^ ¸Jd#ÞS½†n|TJðeÐS6 hÝié€hN7‰C5§a4ȼ7À°­Ãp–;x-II¿§®µãÂÅ 0\ë0L@ü ¦t*+4Ù‰WP´î3´Ò<"/—Î-µYÕjŸQÞÝUãëágÞm…Š×5}5àÚRƒÙr¯âz{mKõ 7‘ù0ZK}êÈÅz+ÙkÓsIá)“ ²þ›¸ B­td€ò);ùÚãÝk7û\ Aôñ@Z.‰KÖró”¹Â < ¯&´ÁföÚD±à‰Dm”¾fe )b6óDíBB2: q_%ëÑNnƒ¦u IØ}RNùiðnvƒ„ôxr!,$DÎ>Z·™'z'‚ ¹TJÎ$$aCê©Rò!šÖk()c 8Ò¡d@ª*aSVÊõ¾¶×ºž¸úÒj¸§¼ÜzKîíB2@ãÂÌé4B>•¤·›2ŸÇ¡§Q$ÚPã÷ªu+}Ü®³ùµé·Ôç{ÔºüM?-·'cüΦŸÏM³›b!7ÅBnŠ…Ü ¹Éæës“-ä&[ÌM¶˜›l1Ó‹™^Ìôb¦3½˜éÅÐfÓm®€Þ¢úI"fèrM«6ëàNB 5ý,}uWž¯í©ÆÂC4;³^Q>…n óšâšÞL딓¦ žÃw1/‘ŒË°ÁBwØ\„„RÝõE@BÞlfÊN›Cíähï ªýˆ`_ÊŠÛ Ù¾ Oh +K[ £§jþ‡`v!(².Ε6ÍåVbj½îvÊ"Ðv)à 2y;2ÑmÐ]³–ˆÚsÝu0¢`åf¦˜]è®…%y­¾ÎÁ’Ô6¾ÎìBw­w©y—ÕŬSÛ€iÝ×Y2#ÚM…„Ñ*Ë,ì(nôuv<¡OPK¾Î†”ß"Øè ¢QXòufä¶ñuv'ú"(m_ø: SŠÁlf¾ÎD m]ø: KÒ[a1»è ÄiJä µÀñŒ°Vu›ËvýE\KýmrLÛþ¾+9Öb‰62ÎF“G›G—GŸÇÇYRL[[LjS#B@ñ/iG£Ü;M»YéÓåJ)ÜMnïÔååhxu>¶¨™ž¾Ê©”YÞ¶”ûiU·(¢Ð¥Ð§fu„ïð©¡åžÈÞOúçÝ££Ö!H+í΢O#‚ÚFBs'Vcøµß}½ß>‚ä´èsr¢Ô2òzµí÷.ûçoO^·"}òiAÚ~kÁ†'úšG‡'?ïõbH Dœ}Ÿ¡^L\í®ÎNÏ.íï¿mE¤:5¥È‰ÃLöWƒØ×=>;j_#༽#…œ\5ŸÈ OöïÓ÷ÐË»´Ü¬»„äÑÇG;ºôÿ±ûkÕZk !µ~©Fî&Ó·0Rn‡A“À$¶Âàx4On@ &mŽZö¤ûöú;úQG«ø}ûñôlËçvÒ[^»Iz«Ö Ãióí6k©~sÒm·V)¤„KþÔ”¶> endstream endobj 342 0 obj << /Length 621 /Filter /FlateDecode >> stream xÚ•”Ínœ0€ïû>‚T¼þÃ6U[)­š(UÔVÍÞ’8»nXŒÀ4ÍÛׯ.Tm/ØŒg¾™ñÌ-@àb…¦’Ôoýr±ú¸Y­Ï%XÂ4ãl€@Pr¸  6%¸‰>íòƪ6N‘‰ï6_Ž8„H‘$‚@ ä" ö—ugóªÊ­6õ‚õ›£H aÆ9 ÌAp€|û~öãrp¾>OÓ=Ê!•©SÔžbœFy'4CQ©bŠ¢_1I#U™F•Aü¤í.ìÎüyo5¦ê¼%Œ.üaÈw`/ª+“—ºÞa^¨¾nò"&(ztgoâ„a»¼Þªp®kkÂîÙk™~¤Þû¿^W#¦Ô­*¬ñ‡^óŇË$c‚ Æ0s™i6ª}ð±{—ÝÞ}…ŒìN…M8«ªû¶wV5ÝÛP‚ñÒ&1é¼0($ t ç:7Išò®c¦¾EˆlûV Ñyó4›wsKoZå¿%£d®d„%su¥|*Ù» 1+¾€‚e“‚>ìŸ!‘£ûzíAdel|Xh›™‡»pÓ˜d¹o™¤0ûFWªMº^[µ”˜QyrbÛ¢!ì‚©sŽ'Ÿ ñ¢ï÷KæÊÊN‡ÔVUK~ FL Mnw]‘WjE%¤‚ŸŽÚê¥x\a8>ÒÙ¾Ôf¡PÄÝ1!ÿ×ç!!Ì%C]Ÿ8"û„,Í>ô£®ægh4XúoS×òb‚©Q_íµRG¯€Ÿ¿jÜ_~½Þœ]]>íøãß$†¼Ù(Ñõìmæná´~Þ¬þ"˜Ž* endstream endobj 351 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•»‚@EûýŠ[Bá8À>K4¨â‹í•D)¬ü}W„ŠÊêL²“3{0öbãÅz§ ,9­3ø;$K’ÆÀ¸”tߣ¶‡üì‹k¼JRú±<6>våuéËÓ1î|% /^" zFÃdµ†±–l*qDÛ1úðV)sïqs€T)™…ù‰F\O_œ¹p*”ÿ—±“I*Òc«棡åÖ>€ endstream endobj 357 0 obj << /Length 1434 /Filter /FlateDecode >> stream xÚÍWYoÛ8~ϯ°/vk«:,Û °é‘"EÓû°È-Q2Q^’ʱèßq(_Š7û°‘ôpæ›o’ž“;žóùij_7ˆpˆŸÏ'ï'ïÎçSÇŸ»Q<õEæÌ:ÓY蓉³HÛÁ‡[k.‡ã ˜ÂáÝâËžžVI¸¡7P‰çŒ§{±Ùÿž)‘˜Ý?Îùp<ðEæ»ó(ræn<†Vßô…FßbèÞ ŽÃ‰?H$gšãذʬ‰Ji€ëGƒ¦ä•æ©Y~Ñ€K%j’«³Ý}l½.DÂ4Œ`%š8KVæ·?=/(øö>´´p¥¡Ì*˜öQ§Ê†!ÀDÞ¢AiA,‡€ý™$WüêúìûE@‹u]¸ÃqƒÅª% ý÷}7NZÿ·`‚îIÐZÆ/裕BT?ÑZÅ9Ë’Ò‰á ö5‡ZnhÙPWiQr³£äL5’#™VÿÒx ²aëOk¥"sõÁ±¢ tMæVÁ _ ñ·q¨Ç_K}0›Ã8ò§‰â‰Ý©ã9¾#1pðýó‰sÛ }*D•›-ø2ó¹Üñ nž•æ%)4¹Hjз£vn~\^ž}ÿ£oï&pÒÀbQ •”k& ®ù®õª)ŠDÿÏŒX|îzaÓÇ+¦èDZc¬E=„h>v¨çJ³§Óœ›º‹=gæÆ3ϧº =7‚ânq@ñæüt8žz wͤÌøöêzqqõíÎÌ\×5QeÃÖŠÔÆÙ]çŸç†Õ󛃭T ­(Šß cjD9¯¸Ä¼10öÊLÚÌÃÀb%‡²T­2‡>A>m´¼yÁÞ8c×÷& ÄÓ–»ÿWBf³£lTµ’Ék©¸ ¤WDI:2sÛ\[Hµeªª ˜éEš0ÿ. “oM¢Õ¨‡ƒÇ•ÀE[\КÉ÷Ú¶®¸|à{ŒÔR䢲øÝ+ ®nTM¹„3æ°S@gnckî9¦&÷L"ת“êš¶‹£=¦ùŠZöåÀ¿uœ«5¯.¯-“åü“/Æ ©RhôºsÝDáÐßMH;ܽöfu˜l]*Ö¯ŽñÑBmûÀSR~Ã÷sÀ²ÛQ¾íÅ’C:šÇÀ!Õ>O_›˜à¼QO˜`³þ±vésúm4äý…¶ÔÿÕ@ÎØÜï:½Äâc.c½'×  à•Ò ³)i!Òö¤hÒÑVþŽvx#•BÉäO.G=Þr7·Mëþþþúêò:¸¿øöáëŸ`NªKx^ Û&Ë´m›Ýíc¯­ÆÀ/œÓGóáÁ<¢_{Â^Kà–ü}°ïoz!Ø樽/Öw½–O‹“‹Æ£ endstream endobj 363 0 obj << /Length 2284 /Filter /FlateDecode >> stream xÚ­YYoÜF~×¯à›¤…Øá1¼Œ8XY±ÉZkÍdC Èž™^óJ“”4 ýø­ê.žCÙ2võ2Íf±Ž¯¾ª>d[Ã2~9z³>úá!‹|ß5ÖceÌò r˜oëÔ¸9¹øõüjýöééá‰Ëôï›S×:9¿¾¼Ðÿº>?õ¬“_Þž~^ÿvôv}ôב ,Ã6‹…>h C:+#Én>[F ï~3,æF¡ñ $scå¹Ì[¹0ÎŒë£Yc/#ËXX6zZ äß_ÉË›÷WëË÷ÿ8ÿýó©é[ÖÉ•ESëq³4Úñ¬¢9þØ0ôÖ0#æù+ô'ÒÚD±W¯émÄV¾§_^UÛh-JJŠ8çÏë»)Ûe?ÏU®–½ß6ÏÚPÃË M•$UW<ÁÓ3ÒpuþáÒÑã¶æ=#UÊkšŽ›åeÊêv³ZZlfŸ‹%:“8ËxÚ *…ZÙ²ï¸Úîßÿ”¸mE, CîZï+^üq5‰;ÑOeÕˆ²¨õ‡öŠ~‰¾üŠÓq@Þ @>`žK€Ü˜f*êø.ã¯Ë¼ºy• É“FÜó§­,ÛêŒ1öÒœž' ¯š˜^KBñ8nÊ\$Ç”ÇãDŠF¤ýD× —ðx˜¾ãMÖÖ»^²Å6ãýc)S.yzLPIšÎÊäK}L¼ZïxÍ—=Ü”2h02Nñ*@:Ëû¢ ÙÅM§Q!ÙEœeäÉÀ®|pCÆJ›¸þBÎW’ßs¬ïC F­Ùæ #)f¶@×wVràÓnxL§ŠÄbÿIv"K%/æì>–ª?L×J¬Ò)°'á²§÷ÓÒè[%.¦5õ£ºwc’‚ót÷]××ùFÅ»ýœb =ÊÄŒåþÓ1ß»9܆BQ·UUÊ~É{Øñb¡ŽÈð»ößhKàƒª| !Í<†e¾ÞíìúxöT·ÅSµOâ.Jd¼i#ì¶U•,·2ÎóÞÍ l´ñö`µÎÅ#O‘ij¾ý—1òÛ>[\5 £ü„äaâúš°ÒÊ»‡«|:Ú×gz‚àňCKkÝrŠ»å7êÒ@Ÿ%°šógZ6$ê¬ó Òu¶È‚D Ó $uÎ’i©Ãã6k¦ýNÇá9ˆ¢3?_Ðú‚k¡Œwãßf3ìJ^Çwݧ‡XO’çå=®ã^cfbê ¶+\ûÍÚÌÛ…ÏBÊø«SÓv@ðº)«¯¬±Ã‚ÓQ‘KÙÙÍy]C½Ì+ŸIÙBÎ%âæÝ9¸éïžu˜C~#\èvâxÝvÔ»ëŽ)žÉ[r >/Øù4Üõ0kÄÏï¿‘^¢‡Seù çÕSQšèËs=êûÒ¬ÕÏŒ›F À‚µTîø.¾ rá`8«"9eÑvo±ï~mÝoÉúb›àÙ™±ØM9:JeÙ¾8§=³Ãÿ;³ÑØÊe–Müœp}ìåR)>·…[Ä”˜6¶IQ"¡ Hg…»úrvGðò¤--DSªŠå/ÍÊäøÿÕcù÷þu>ÏïWë~÷‹»‘®/lgŒþ‘v+¯“Rr³b¥Üþ¤\þáç®ÈÀ‚ã3;¤Ë ¾ÛŸ:¸~¦Ø «Ÿº«—4§àÇݤàð“e9úÒI]wE`ÑñÑ¢ ϳ"°¬yõçUÆY²àœç3'²;IAšÖŽÔ®–L7§6ø<6^¿RxÝÍb2Ëv!ä€ù+Šù“ãx¹™¿!³¹³x¥´äph1ß z‡!)®hx\Ç×å©ÑÄE¢âûûSǃš¬UÅâ„>PÏqslæGî‹psY…$´×Nã§`zæ*Rûlåœ6šüšx¨Ý ‹­(°YkÉ”^VYKòx9VÓ…$ËvBÙf‘çÓÉ´¢!ÆKT¹¥ÛÔ”% áZöüêrš¶Óó|àûoi9FÕ‚P¶?ä*#åŒÝÍš"±:,’¤H}$ÁàÌ~?f8›qGÑà&NÂJ8ú &Š¥¼Ù¶Ï†¼RR‹ÃAwÈDZŽÆA‹T}g¨^Ç îêâBµDœÐ-Y½ÂšéM€°bcŒÝgÕ©R%˜œÓùõ†ƒ™‚0 Ã.á M<7ph_Žï.ôŽÓ\‹œ›¬2ÿØhuê²¾À#‡…"2ÌiCÑN!.Q½;пK=뉮ô4y`~PoóøQäØAÚ¼ï¼#"W(·ÂÅîNd¢Ùƒ¤¥"‚Âz×ëñW'óžýæ×ͬ;N0哺Š;¯k±í0A_UôÓ–€1؈?t†sµ„.u#:üÕ7À8œ¡3*ô:ã`ÃgRÉUNõZÿ”Ÿ~­Ÿ*.õ@/¼š,> stream xÚ­UKoÛ0 ¾çWèè*?äÇn]±6¬kìÐö ØJ,ÔÌ’d¿~ÔÃŽæ2`'QE}$?RíAŸ¿>¬ù(!8c”¤)Nƒåõâù• ξ ‚Ã,EcY£ˆ†˜F!ÈzZüXçëãzq}G)JqÇ!ZoGŸ±Iì£už½µ\±ïɶæVÚ·¢1Jâ}·\ùÔÍΞ©ÒY}ß(1\k·öÎh"©œYÍÅ «fû}%r¦DÛ\iM4qÊw µrÉš¢âÒúløp[µvÝŒ%X%þ,ákD¼^ο®!ehåû8ƒt˜¨E³]†Äk_@½Ú 1I=©ÚÎøY8Âíúv°ƒ—«0мu)¤=Ë™»¶q·Š¶ás‡£Â$m²ªÃÒXvsÐ11ó(?è(ÆÒ"?ÆIš xÖÐÆôtnõ¼¢4žޝïÒt‰â8ŽÀÞøŠqUì÷ÖxF `Hê`<‚ÒSs&ûŽëj»4¥âõ•‹±›£[Åg…Âd°Æÿ/ˆ7/` ¶‡’»š0»ŒÙrЕÎU—å9—r`ȉEÓ<¼tÒåÀ <Øðp•F8Küyå~j/üB\Pæ,H¬¥Ø•ÕñBDA‚}èë!|ž·5Ô F~:4ƒ ÀÈONµ¶Ý[ök™I» e E“÷ÓÕšš}^Úô¦ÓÏGñ¨ãý½„Îâ]ÉYa}©’53À€:à4=¡…BIÓÚlE&Y8ïݪ͗ñÞ ,`V¬!Ÿ œ´oÀ[#ë‘Á ðåCƒRê{÷=P¦Qµ”3É­ÄªÊ ã8qAë¶}“ëLT×}®) ÷ æhåï7÷Á €{ÑÁÛðáݪ⅃õĹ㻞úÝÎÿG`þÙÌú*š7SÊ0µs0LÍZ½ý6í<­2wÞIÚt¤¬Ùô®ÝKÞÙ‹WLTÒ2Z4òî¦æÅÖÞ¥,uß„ÌÀÔV“iOL`Ýw–-¢0éÒ!¹`Ë…Éͺ]0ª=k½ŽCÃ^Ã>6˜Ý<Ü»~uµÄ³Ì|Z¿ÿxiÿî¿|»æ»“I[RlüÝ‘žNn¾%çÿ)£  endstream endobj 376 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•»‚@ EûýŠ[²…1°OJ`µRY+†JF)¬ü}wxTTV7™dNr/0Q±?XO¹µ á ÍŽØÂåÙa@—TÇâê›ÜeÎ'Šæ,¥â¤hOÕÜÞÛBNšZöá,ê >")“·‘è=ùLã1Š®g qv“Ê=¾Óæm­býF+®‚—/×Ü0‹Èˆ[ß…¤ Ù“¯ŸÖ£ÑåT>¦ endstream endobj 385 0 obj << /Length 1381 /Filter /FlateDecode >> stream xÚµXmo£8þÞ_îHc0fu=i¯·­ºº^«6_NÝUÅ‚“ %€xÙëþû¿@%MÓÞI«µc†ÇÏ Ç3ÅÖÊÂÖå îFD}9•ÃåÉï‹“ùgáȱK+Àˆ3f±ÀE^À¬Eb=Øçë¨lDåÌ(å¶ç|]|á(J‘‹9• Øš1ŠXš÷ç³û¦J󕆸CÄE"=GêxÎ/|ßâ(dÌí=$°Ø”i&f‹t#fçEÞÇÅöSãÌ\âÙ_°aKˆ^¨àN|¶¬õJT =)£º‰ž7…׿a’.—XT"7Øo¯ôdÙæq“yí0rfžOíÅZÔbüXýÌÅx“2ª:[¹DB:I Áqåäk›çÂDE•¨S‰&Dz*bQ×fQò—‘CœåÆúmåK!ßôíM$Ùo×uíOh…Nå2¶·6ðÊM)òëÛèÍíÇ»+j¶b‡bû{´=i" ™ˆr3-–zL óíÇ7ëT…Sr ¸] ¡vΤ0ääîòÄzP·7×·ôñN¬À•ÇÎ?óŠ–‘1Œòäe¤¸‰ï·á¦òÊ J=)1M Ã7y¸¥ÒÇjDÑÃ6Zà@D&$ÔCòɈ,TÔôl‚2P…dPë1Ú÷<×cÓAd ÉD¾j§ù…ëY!=ÊäÑ#ÜC4$@L1ú‚±«­ÔC!ïm¾KQùßϳle­˜€ö0°p™þÿÈ“Ð_§°}„I¸‹½_¾âvv§ãàõ¢M™‰ÁÙ„ÐCfÕŠ cg8ß÷8€ƒY0ñ÷£hÕ."cRŠ3HYÁ—LdøA€8áÇlP×qvöî£ø#ôC„½>„½ÍPŸyÛ0¿Fžbw[ÿ¦œ¡c~ ê:ª¯–gS iˆ#¯ÌŒrnßp®!yE” ˆå§ÎŽV»Ó_i m a(àˆˆ¢ ì´C©?°}ŽÝóõ§Ügˆ2¿³ßZ*B*Ù獵ç2£®Eežìêêyžùr¹7D”úÇ;"U6Áž(t{£‹´ªM*ÌÒüµ>´u ¬ÍGù'…ü©y›ekÝšº©Õk˜fbÂMÊöéÛÝ{ÜäÈÛfÂ?£×{¹§Ìƒóâ+½z.r=c€(1óT]cÜ•Cþã²Îõæμ)eQe/ˆü¿Õ8œÙ¿ÚÍb]‰(©'‚Ç8 Xo}/LìÒåàÊÍ¥z·0º È¢¶ÃºU•æäÜWZ0OÒJ@í¨î ‘¿³€!Îß!•¤&¥P…¹d¿£ùð÷^ï†l]¸…}ò.¶7²ÖÕÀãì"¾ö^Ê…8†·©Á÷ÞÅûN$­j¦nµ¹ä ªªáê̇ãÞ „½‰ú}¼†­³©Œ/S1 `^wG‡kÜcïŠùy‘eQYO'pŸú‡ˆÇÀAâê$2л©GUë. í¢Odn€í¾š¬õSÝ|ƒZò+ª)„ëõo*éé¥D¨’1j³JH7¤vŠ„é91)D¾TVÐ|æqÇ`©W›ŽÒN6í€ó¢Q”vÍ ÀÓr˜œÆ=œ‰š"ø¼ŸùÛ!Ðû­l;V‡&:Î01]fÐ÷Ï/tWàMm›ÇLß@d‡¬çºÅ‚ÉàÏ:ÒP‰ÛW͈õ·Ž«Ú®uˆ'z%5û»¿X¼Ð˜ŽâzD#yÚ]2u#k*“ûÚ\þÕ@W§d·~†DêòþPÿ:qzx}ÃSÈrM…gb‘åÌÓªµqÐgçßÎë5œŠù›ÎÕi¡ehàc7~Zœü ³®³ endstream endobj 394 0 obj << /Length 175 /Filter /FlateDecode >> stream xÚ•¹‚@DóýŠ1`ÜeOBD <`3ŠHJ Œü}WŽˆÈ¨§k¦ºçq<ÁQ²½gÛƒ±p”#á&!-4lšð=Ú(;¨7qb]¤hÒÌgqãëÓ¹œ|^d—üç:_±Â³7¡‚CÀrrÆÀ:G.Q¸¬í8ú°«ÀI¦Ÿñr€Ò’´’a~¡a7Æç7]ej"ÿI\ÏIJ“ 2ò >B,­æ “a?ß endstream endobj 402 0 obj << /Length 1491 /Filter /FlateDecode >> stream xÚWmoÛ6þž_¡/d bHê½( tëÒeX— ó€IáÊs“%Ï’šfØßT,Gº~Hx¤È{yx÷ͽ;{oθ™ŒQÄáÍÙ÷ó³ó‹,ñDÆâ<Þ|í¥œeIâ%iÄbžyóÒ»ñØ»Níg”™Ï>Î>Òc”HÉBžIT½ ,‰:ÿ‹®ÿÔõï Þª¢í÷j«êŽ~{h;µ0âB8¿ˆc/cy’„ÎVÈ’0'[³û úšæ~Û EÜïú­èZwº¨ôßE§›šÖŠª:ýqÝ×+œµ4í6EGÒª°;– ÆŒûkc¹¯K§ÌP$4Ë?Ôʾå\VÊê,Ü‘J/÷3Á}tZľvšõ‘ªb·«ôм !X¸ Š=ì e>V•*@¥þ|£[ZvcÙÔvãr&¹ÿ€rì¯ö 4ãuáŒÒŒe©Ñ^QYÕÍv§+ .ôõLøº£ ÁDûê®Ðuûè1Ð\AÓï·KL3œcÌ8:ümîz'¢¾Ú©úí5”!R­"Ñ€a×H ‹ªªf ßSbÂòõÕÛkiw¸KNyh3Ï K³Ô ‰X’Ù[)ãÑ.ÿ…·Ç ïàÜMÇ X\B’-öêNƒy¿noyÌáOŒ ÝøÏÆ kÎ’,þ6£oT·°ƒm0|‡Ñ¶MÈA^N:‘|»ÍÎ$wäk¹ø<ƒëWû\9å 3Œpd}n®3—þ^µ}E ‹Ó¡Ì@¦2#“Ç È³]•47|” ›°pP\ta–ø¯{[ÎÆ¯ ÕµÕæ´lG¼†gˆ×w ¿©«·4h'$Ëaš[Ô©hñ~LD©eT±¸,€÷0¤øAžL³û~£W›¡vêG#Ö®åÍcµ‹÷ïß/>|8ª$¬5æâ‘!ܧm.—È@±/Míƒh¨FÃDÊ®m¬0""Ü4""XèkÃB apk×pAáäK±ÝUÚó‹œ{9t™`'‘1t°ü3~í@¯\`KX¬u¥ØŠNŒzàÐåÄpÄ9öv‚k¬Ó[[^ÕqÄ8ÏÇlÖª¿zU¯”CÝ¿´ }«ÊçGÅçÚ#•²<å¶dz$±UóÝ,H8÷?aj;¯õ­A½ýDâ (¢v. %µ/iñŸYJoEÇs'‘ä,‚ÁhŸVK©Œ»«µdu صwH¾?)d³˜Øòü"‡×1™ w7/&4¦,2·aò„:¸$xÜØÍ/'“Éh°WªºéT{Ôz€ ´ëG­êH öž<²ÃBæÙ‰B6¼J fñ³r& ïv´µG"RVëö(_]¿zw)-Ïæ)Ã<<,Ï×½"¤¢Láª,õK]éî¾B¥¶XåO«Jð ª*v¸ÔÛ)è(ñíh?‘)j´ˆè=ÕqGÙâþÏ ½R€éÄíiW¶]7é‘gW¹G˜»^‚è‹pÇ$ÐK‹¾–pÅ«®²È°{»í³.ÍPkË$ƒN0.þÝÞðÅg]ªr"ôÚa ‰;ª¹§ d—|ÈË®i*×U¡­æa0ÉÜÞ÷«ƒ^2ê.'n!gácÒÿWH÷¦h¿îÖ>ÀkòËW_ $F$!¼ì1o‹;õœHg‚¬n®®ç—W¿~¤cÌò¡åë—Cܶ¤w¯» m3Þ£°FÏÉkœÚÓôšôD%xó,—öW r/äf˜Áîë½®»öH#~>P5tÒ±’I¦ä¢Sj¡$L5 Œ-Å~n¬1[îˆñP…ÄÑþ{Ûg8dn³Í»L6£Âú?ø)ï7M¥FXX€ÔJµm±0Ö¢qhåÆI[S/½:¿°¯dÖÈhC¼Ã­ &á< ÌÙÇ„¬¶àð&ÖkµV€PËgÜÿÙ mx5%ûxüI”ŸäË“Šùq~ö/$cCy endstream endobj 409 0 obj << /Length 940 /Filter /FlateDecode >> stream xÚµVI“ã4¾çWèØ©ÂBv/ÔÌÂîiÏ 9¨eÙí Ùî•ϳ%;±³TqàÉ–Þ·¼%&(F}œ|L¾þÑq‘‡}Ç™¡ B–ï`Ó4‘ë[Ø1Q¢íÃ÷?-žƒåzjX®÷0Çê÷—ÕÓÏ«§jLmòðY­êçq¹Ø|Y/—Oz°ùm,§»àÓdLþœ˜À€ @"Øsäzö,±t²Ý»Oˆà™ï¡C{2Eö|†çö Ö ÚL~s>A.ö]b6*¼9¶L ¹Ž‰I§Â0èáÕ(™E55|BÈÃö^HÎhÅ閭Oê’«…aH‹<3D&*Añ­`«^Ь¬8 ñ®QƒLËËdøØvæ ìYЬ*Õéj¯c¾Z(¸½mô×MÈ‚åwdy,y1…·ÿQûQÝ,Yž¦4 ïseQBãrûþw2'qV!$OŽe•€ D,DÂ¥ÚåEö#w´YR‡\‘D@:7·ˆÅQ¼¤G&éßǨþCTeÝ!5Ši’ðPEÚƒz.uxСa8&Ó@‘3,¡Y ŠÌTK›µ‚3 ¦n¶’‡´!Eo<«Ôæ@e&28ÒŠ >ö=w "ʵuÉÔÌÞ¨ô%á:òa/Ø^3¥:§9cõ5¾a &Ç£L6vÈ:VmUÜO#0ªdcP4%×W­FÑ+*c®6nÕ4îpõ%ßl”MžòJ¤üt~pQmBE\öÖê¤çáÒ*y—•üM„}ã3ÍK.F²-O¢¹§=OÚÁë\ðéªZhŸñ¿ú9nã™= ÖOœ^K”'I~èU¿oû+¶†ñR‹$4Øž³WENs-àIRv`dXFc»ˆ‡ó¨ÿh#tT{=“,€›Ù™…‰94WÔ³ûX­¿ôc«o[…tÙ'0E*ݯ¡GJ•ˆ÷ïÎÅ4¥õa§§ûÈ•Ã>¦§²q-Ïþü"™§#÷cú¦úªc8ó°ã ®yC©Ó9þïʺhÞ[²\r£À¹Œ?´Ñúï”kŸ=s¾zþËGÏå'›Ždϱ?-UÓÿ Ä\² endstream endobj 414 0 obj << /Length 1126 /Filter /FlateDecode >> stream xÚVMsÛ6½ûW°Ó¨Iá›do‰k{ÜilO¢œÒN– ‹ ÔTÜô×w%Y¦"µ'‹Ý‡ÅÛÅbiò”Ðäæ‚ö#áÊOýpsñnz1¹ÎuÂr¢ Í’é"É(ɵNt&ˆÌt2'ŸÓË¥Yw¶9ÏS=úsúÛN᜚sB“±æDgÚ?Ü¿@ãOmsëÚ®Ù¬¬ëLWÖn´wyr­T’“BkÑcKÀfˆ}=4­=h–§+ãFŒ¦SázƒÇÁ¬ôÇÆL¥{g†niq²HUU@ë¹tO(^7Ò<­L‹ÓØ~'¨~-çvNü¼ožï}9¹|óæ¼ÚA&×M2Rd4°Î$R'cA‰@Û×?s4Ö”¦ëzµÆ™¿G?+»þЂH­Î´{´O¥ûƒ*ÚÀ¤v9³²°dûXòL,SuÖÍO€ëØi¤ï»åêr›SÿíüÍA®_Çe›o’¦¦†ûŸ!þá'|ÞÛ»Ó~v;¸ô°ò»«›Û»óøxûûôêî×óxF8m>àÀݽøðéýÕÝ9—Ý) 'YK‚/2á­òtfNÚµ•‹o~!ÒY=·(F¯[ÿŒƽªü2⌸¿Ø¸Y4p¹+6T`ñ·Y­+»gÿ\vKt¢_€£\{G¹‚z¨8Ü3¸ˆôq©0‚7S9Ñy¯nÜ|“eDú5$DdPJÂsÑk¼ÐíGƒÎ#‘ºÊ$¼Žž±€ÿ€2„3R¨Ñ6PðuÄUjñ)@Ý…pDj >Á*ƒÇVº®Å½~ÕØnãÙT©›<6Ö|™ô–BÀE% À¬æÑn:´ UÛK+ÓF‘³v7ëhY,ýxtT:(ü%«‚ñøRˆÕŠù6 ûß/1w_Ÿ5†ðÊåKV㑜mKÁaj@$ÙÀ`¤²´]Ö›ÊßQi$dðÎq¶Í`¿í¿ÒTå?ñ;ô e‘à€ÿ… ß¡—× Wò"˜(ruTÛ²Ý²Žî”1½â•^ðàútÎŽÐ'5)Šž†ÃŠrÀY¦ìÄ{ʉT/ÞÓQ8-Ïc1¥XvDÁ0 ˆIÈMl—õbû!6^0=ÒÁ“’È©öÄKï×ÖùR*(ÈMÉXú6<°ƒmøV¡{ö"kÝ]øJ‰s ‰äúdAƒÏâ,þ9t§ÛpbјÙu‡Ù%¹ÿêM,M•÷ì‹~ØÝœ—ºº‹¥ŽSÒºØpòR*‘>Œ¤GØÇ>“ßOªgOºñ¾}kQó.ª† &±EmƒÒYÝ4vÖ¡¬[BÙŒfÐýš'Z™°O9èDÖ¶Ùý`ÊëÏlÿûîçLW×ñUR¦­ÝµÉØåЄ%oqüäÃÍEò9(\ů0,.ý»ßE¥ÖÎv÷b¿u7Q¸ÿ«A¯½ì©ÞÔÛÿœNŸ 6hWÓ‹[ça endstream endobj 418 0 obj << /Length 189 /Filter /FlateDecode >> stream xÚ•P»Â@ Ûï+<¶!½»ÞcT^¥´aBL X``â÷9 ˜XâHŽìØŒ+ 55ž;@Ñ9¹ÀhOÖDø¨É3Ùl9i¤jó‘ö!sôÁf»i>Û¾¸UÝI›kÎö›ª–Iþ£øÛÃWÉ–äô5¶1¸¦0/‡E% endstream endobj 422 0 obj << /Length 605 /Filter /FlateDecode >> stream xÚÍTMÓ0½÷Wø˜â8þJ‚¬¶+¸åÜÄÝZ›8!ìòï±;ñnÛ-ˆ §¸3óžß¼ñ” {DÐ݆„/¦Âýçnó¡Ú¤ÛB¢¬À¢”ªö('¸ÉœažKT5èKtsPìÇ8¡´ˆòø[õé‚çHB)f¤ ž„ DR,óð·OªZ ø›¾ÑW(‚Àt+*p)% LÜ1eÀT&N[vªm!<êï‹›jacÁÿêDÔ©Ùô2/qÚyöÅ´ XäÒs¸ÚÝ0ƒýK§í Ä"Rv½a±W+x´36ÌMOÞì^'ÑÇòîz›“2÷<Äê’§ËH¤f}9ϺïÓ†.\d¸CkìÃó|§Y+T­ßFOõªf§WŒÚßÅØY£A᪆r\ÐuYÞ7ñ*opF£“'8Aäñ`êMÛ./ò!êÝa™ÖC¿Œ+îÜÃСËÔj=ìV0 n96~D^Y6F¦û?÷vpCŒYp;aþ?ޱó'P]lps4êŸ.zÆ1ãò/ö\üaÏùë=uïmµùÅä G endstream endobj 427 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•=‚0†÷þŠw„Á³Ðr-#bÕ¨L“Dœüû6|LLNï]îòÜ=/HìÅÆ‹õŽ ,åÌ þ •3Y£aò”8ïÐD塨½»Æ«ÔØÈИî^œê£›ò¼uqë+á¼øˆ$°%I–ÆZ²©Æ£M+Ñ…YI*·ø›=t¦(Ó*ÔoÜÄEÈé¿9ÌÌä?Ä¥éDÒqˆA4áAb¾d~|9> endstream endobj 432 0 obj << /Length 1158 /Filter /FlateDecode >> stream xÚ¥VKo7 ¾ûWÌqÈÊÍ;@n§nãxáî-) yGÞ7«‹Û+EòÓ̵£É`J†O„iÇÑxƒôÅPÏm± xìhlô#¶i’iñj暺ªxaþO•©ÈÌíû¾õD† ð€:°)Â\D‘(!?>M7 7U†½‘`»m-;Ý’tÓ›özE²n+V7ë•¢ÙÞùA:•Vñ”9¦Þ±¿ €o {ÒSMçÆú™áLà ïﺮzb…®;u ¯©ò‚ãA‰RÔ¾ÓnXÅíº}]±.ÃK.)oE ÖM_ûü¼ÃÕ”óÛ/ºiØøîqxzì»!ëN{lÐ5=ûü2Ž ²<.ð©'*…, ”™HÖ’3­L¤Àb¬³$…ƾȄÊKë=Å(³½FRp(ãì Wb65]±åË=%LPN¶ôjòí>ƾzƒ‹^/(þ°íßâ)4ÿ›åJÐ|ÿLùÌÛ«öwzجµ,§÷”æBAqƒQÜ`>]}þšØë«ÿÐ`¦þD Ò#IÓÐR Icð¡[×ÐÙG ‰G’ðáÕ€@´“§Šº—·ÕØVšäûÉÞLT‹ôl|If—†«÷†Æ~0G-÷2P§Vƒ*ÌKumj6Æ,îm]9VmÞþLIK1i‹Ô;ÒЛ16Ù;똼â,ᆓ 5·U=ã…ɾ‰éD2³}exž/ßoOJÝʶ[Vå0nî&UØo¨gÉ•œL•s%¯n°MÿÀ‰ ùÿCŸ½™þOŽ¶ÚŽ?Ðëzh÷LÑ´ùdÇÿ]&TÌ VÙÖ¶º~u4}²æ~¨îÓ( /êúðoÆÎ»‡#ô—†»«+Z½‡Ûhg¸0Ø;îîë©ë#óMÓÿû¡»ñ¹7|½¾ÀQ¸g+ª”ýÔ÷íô?•A x(Üz¦óx8uWCæ lÅîˆ ÃÖ3Ögÿ{ˆ { endstream endobj 440 0 obj << /Length 3585 /Filter /FlateDecode >> stream xÚ­ÙrÛFò]_ÁòT1!ƒËo²,'JűÖÒ–]e§X0Q&Gdï×o_ƒƒxklÎôôôL÷ô 9«Ç•³úùìåýÙÅë0ZÅv†þêþóÊÛwãU”xvè®îóÕGëê—ËÛûëwçk/Š­Øæßß.ÏǺ¿¾»çù»ëß®/ï®yòûõû»ó?î=»¾?ûóÌ…³œ•»Š;ÃUÇvì©UVž}üÃYå°öë NMâÕa–+øv |ïVwgÿ:s侎í8Ĺ}®\ÏN\7Àë›#B×vÌõc[¯]Çq¬Û·on½Íí¹§¬´Iw;½Û|>w«n¾ÐmÍ1¯ƒ`"gµöbÛÓ»ßêóµïD9å¹sþ’¾$áÌÀúòÉ øçâŽØÊƒ÷nÓ–AiÅ€4Ï‹®¨«TÒæ±/uÕ1VW3tŸ¶²¯;w-¾Hl5úÏ^·Î©Â»ôåƒnx¹þÌðnÛè4oeR ‘”ÁÅkß_…vù1²®”²ƒ$ëŸå–3Á í ö Κf\«ÀF«µëÚ ,&HÔ%‰¬]ñÀò£ [ß`ìX gÊñ@ÚEËX »_ë‰æróÅíEñwßè}ÚhÞ“§]Êà¶ãê³®o´9¢Êdz²´“]¥.ëíá‰é sA¾¸çA ’±¼^Ä„ª5•Hàu_)V44§¿Î½®ÔË•ßÇÄed„ƒa”d¿¹îP+€\YT†F*‹|áAÊ/f6±rC;Šá=ßv|1…Oẕ̌>®ƒ ´nPãb°2Ö…ÄY%  ^ˆºà);I\£-U_nŒÜŽõ&LlÏQ7Û¥}‹ÚÄþÂë¶`%ÏAY\W”ÀYùŠ‹-Ø”l©Ú"—õnkŒDÕ@”v¡§lWD€ŒF)ÿ ŽìxÈØ¨R@&}À§Þéî×qh;Q0ö}]î7ß—DØ¡¤†¶ƶá{Þäø`r<,ùÌü¦àê,xý'|Ý´Él”‰P+¦Æb€ø+Õ ùAŸ;ɦFê>QGÝ_ O3QˆïÚŒ¶|š7"MîZ½£ãì¹æ­ÁE{¢žÁ?POßµ*dÊ÷ŽEà 0.6j›¯ lÀ«=ênS¦_ÍÖ ë“m=KØ1ÂïÜù6,uXœºsß›Z?N¨Q„ÌòT~ìߪØ:œ)xåñ±x½Ñ`èiüÐ8Y@œºš€•ÛYÎ(ðŽÇzíÆ ÷ 1 úO4:‚¨=Ø6{Þ`ÔG<‰œ[à¦Ô í[ˆ[®Û‘ûˆ[^h{a딲“¦Â…lÖnôsο¼!PÖkC阑 •Ê'/ÕÄØT(rþw4M¶¥¼á‰‰í÷ûaçç¾Ê:vhì „6>|Ø|`lã+PaÑÇÄ.«ÆB¨ {®ÄR­sz=WBÀRôF¤Wu!K%Ü®+öè¥)ןÇ«(j ™Ç¥ïš"¶E• ™'$¬œËùUÝ1àKÅ‘gO[ zÕ0NÑÍùë+ ¬£#ó ùeµŒWà¬ÎV NG#à ²<ÿ¯¢zä5ò®ˆ|È=¬Ñ!°$Ù…c0b·îw9/ ã(Ycg[^*k_Ò=Æ'Ñwë¶|ðþ! !¯+ñÈOE·åÑÛÛËw7Þsž˜WÁÄbÔÊAæÌ’ÙTüJ0Öi[ì$myyÑvp³¾h·&iùÜÔå4;:Š}ÇGÁºÄŒYqXC£>º€À””d=Ý>ÿZ#—(Ö¯„ +Aj2MXƒiR©Ì³‹ËãáRž+N2QRÐ!ÕH L*¢‡ÚH—[ElÈõLÉB¼åA¶-vy£ÑOM²oðM{¢”—Ø¡ïþU$wìbmž§’ŠPO¹%È•j-g²ÀK›"E._ã©Íhá‡ÎêÁ¦à`r{º$$?È DP!Â0Ò?‚Õ!¹fßù.ŸJI à’aÁn²' oq§D_Ëm&*Ms“†B¿º¸úé'’ñÃò’X)r.Ä5ÎÁ°†LY04NÛxâ Ü…@Ò ùü2¯CS)QabÊ^Ô¨h'ªU®üÍå"Ûc麜»p5-À$úýÞ0…Òè¯È)·@0Q¯‘./KR{ÄCq]]œ” m––Èéª èTi)H¹Þ늻*‰ —n˜V;¹‡'=™á,ÿ„þ#JV—ë¥çÚ;p@_ ’ȵJr¸£PìM" ,þüû¿1~γ»¾¤x°E\ëöç\ñ\…N•säAÝÓ!صÌ03ÖBÖ¸Æ Nñ¸Ù=o^¾ Ý"¥%‰—»öB1Ó0‚»S±H㛊×Nx›P2AÜÝòœüdˆ6Ø7ds!v‡¸ˆ&£leÝðëæô0ŽôqêÑÀëQ脽èÐø>È.B†(˜=.vÈ‘ „’À´ÔéI%Ì¥ÂD | ;8˜Ié(jÅ@'lá¤6ÆÀ¾Â„ATG[ó®Î\Fl_-vªšÕU—•ÜK¶Á©Y×§»¿áÇðATMVr èAÅ ‰²Lz`â¿(¬¡“+:ãÃ8¬Îÿ–C†’CÞŸ‡p÷ö ¿¾Gü¶]ÓgÝd•’noœÔӶЇúû-ø¤7·x‚² þ\ÊA\ê”;Ó¶§Lî@ãE•\ÔôLÆfÐòDÔÔyŸqÿÒ ­KÒ ƒÉYš`Ò`^–‰ôæFC¤Ç3Êý®ÈŠŽ ÏôùÈóg=uLh¯œƒ÷çâeº¶KñnÚI6…\lAÁÙÎÚ»¨0m[<»¢“&.± Ôµ•Â)’C…nÚ1í:‘8Šíç *™ž=FÏÊiû­Ê¶M]Õ½š³Éi6Ç_÷"Ø­é&ÕÍ × Éy©`¸¤%|+€=Èmyã=‹Ј XÍ´œ–²¸€Laö•¤Q-YÀ@¡Ñm_2¹`È.°ƒVñ:FåV› ne0(1`\ÞÞ0µ™£È`ùß¹†ËîL͸TaØ_L8L™á©ˆš2"ü&Ó2Ô”µ2åæç) ã 7ó7”w3†Èc•º³mPÈÝ«h–ê*£0htV7¹ˆtqÁ×IIáУKyDÊÊ !€¥–¡¢INkÇ›ôpNåù´‘ ð‰€pzȵH†Ê0nãh³pâ‹ÉÁËðKK÷$4a'’ÆŒÄFåŽÙ$" AšìS•%ËK)ƒÀCa#a'ÄHÆUI ¨’(‡VazìÝ"gIDI̶åÅgRVÝÐG@fªíR(˜Úáœ%Kgóö¥‡#ù|èrVó)qÔ»B¾:©Ð·î¸&Ctc€8æ* 7S† àŒûY¹àÏÆˆEn2ßÍ¥mº™›¡œ‡ßÙÒ¶o´|öÔö[Ûér‰MäMzÓ¦KÌöÆiÇÐN.ÁW‰¿‚[’LX­©ËyÓØ ÷ǶŒ„²ô½b¾ç!&·äÖ\!MóVÒö…ãXî'¡­‚¡C ®è8ˆûíCÇ!Ý!e wÊwíð°E@Çõ‡é¶áûÈ–âh¢ˆ^Ͼ´ãªèááo84CJÝq­k¢(e¬wù·\ð7Η"i À†FއÉ/ÅâÕA:¿ó£Â>J“†z º?𥕑…BZ¶-°ï‹ë”Fá@œ8¬JêÁ¥¨ë›ˆ-QÜ÷Ô@TùLŠHRí§Ú,iCÚ़ò,ïËÉ}{ÆðÅ"ÿ97·†«J6‚ø‹ž^*¡(sõJæyºš ܈ˆàÔµ¾áÙL«¨;MZEÑÀ*çå¯çÑ´&Ácéí"‹#ŒÅ»É'cs„yÚT2Æ(.÷/§µ4ALüÚ)Ñ)ßÎ…d|ÂhäãI8f£a,>q(qã¡ÄÝ[ ~aLÁ¯1±Æ†"ÏRcÙ%¦†¬¤!5gÿ;ìŠ)_G©K? “wÁk9ßqékÓØ˜‘ˆâÓO»Ó½ž’‘O"üW“%ΛaÝ /¥Ær¼håSä°/–®ÿì—!‡›ôÊÞ¬«¬0+®¹+Yuë—éð÷·Xq.L\½åú֚ˌb†@ÌždÒƒcßñlÉañ Ð^SÜ Š­ß@NÕä«ÎKÓû½©·TËòÕVBA 9…ùm«w‚óªO§<½Ë¶e‘›Å¡IO¥wÅWž¾ç¿MY4‹›êÿÁÌmSgò·3¦ÊHnªN–ÞO?ß¶ÛZ¬Ð쪣ӿy)©|i%qü~u‡’z>ùúTï„vèúæû×~îK¾©,×I\o±éúêíÍ Þà:68Æè"‰âµ¿•·bn´N6ɬ7°ô7uAdÇÞüEÝñ_þ %Øa(áÆ‡ÿV—- endstream endobj 447 0 obj << /Length 1021 /Filter /FlateDecode >> stream xÚ•VÛŽÛ6}÷Wè‹ Ä\Š’(1( ¤í¦Ø 麃>lC‘¸¶PYRuÉ"ßr([Z7AŸHçv†sFâÞÁãÞo«Ÿw«›×2ñR¦¤ ½Ý£—p–Jé%J0x»Â{ðS–¬7"Iým§Ûn-¸ßäºïËú`ÅÍ£]ûf4·¹¶çœ‹J÷ëO»7«ÛÝêŸU1¹L1Ò”¥"òòÓêá÷ ¸{ãqªÔ{2š'/ŠCG!ì+ïýê§¼91nq!©ôÁTÄ—0dÀø GÀ9' A| DA@àÖs .ƒ›×q|Q6îm˜I.m¨ûí«?ïÄzòÄϪªAoO=ž¥?4V^ÖýÐAB±?žt=ØË33Yéªa2˜î]"`ÃÖ›H(w,{{÷¸¹¯³aìH¹¤xc¯ÇÊÊžŽº¶Ò£Î ÝÍÝšCÞÔCV’Ö}«ëw[Žƒ€)@mæMaâ@Õ:»:ßéwWhŒQÛ©Ÿud;L5cM{ŠjöÎT¦|˜ ‡‘¿[ØŠ“#Ü(X>ÕDÍj†/@ Kßœ(|ßê¼Ì*: ºí¯A=fØÕ_Ö"ö©³ñ qýìÎÙߨ‚ø­Øn:w}¤Íâɳ¡lês—ºîÏÙZãlø¶,!Ší“…Þ® ËÄ·VåáHmÓ—˜s¸E”$¾ìŽº'‡¶6Ög§_Θ€´‹¢±$ ­mÀæ:›8–þ«^§X ±µr$™¦JUšv1!ûó@éúáÙ½@_ÍlîNãh>Šló\æuf³â^ÂTÂdsÀR…€JX@?”u^X` äÇ~(Êz`ÇŸ\á‹d|Uµi³®7msjž*?/Œ"k´ßï·÷ï¶b÷û/o?üz çoÍ›Kñ»5ßb7ùÄG¨†Œ¨ô2<—„T"#*‡ãR5;‘âœÝxwÁnT0Ïâ±³ ȆÊÿ€ûê«UÈ¡e¥;Òoø2_Ê‚beµÕkZìMS,ì±X/iÈšAp¿hˆú–÷ Ávµ²<æöÝfl(skuˆ¢ÎT[é!Ï­Äå²üËL«×iPòdO©œÇshëvéqÃ4±(seηӼ2™&Yßfž;²A¦º|¦o_o4‘*+ 3p&âùü²Ï¨™¸7QL ÊH\íÁ»Zpñµ›Í€ƒ®!]D=M³©aOý;÷a5ÉÖËQ6avÀ ¡!/)$ÒE*ãÿ‡Ér3ûÌõ»’„%\9í%nx9èð?ˆm ÿÐÄ÷ù%t7ûˆL—q®ýSÅ ÌïÿóGõü0"íšLJ¢Z –‘ÿ 8¤ endstream endobj 339 0 obj << /Type /ObjStm /N 100 /First 868 /Length 1853 /Filter /FlateDecode >> stream xÚÍZÛn7}×Wð±}¡8Ã^€ €sq4n$’¡Ë*5šJãéß÷ÌJ1dK±WÒ"éCL®vHž™9œrcqÁE®NÄE!GJh£cŽªãšñ–ÛWÑDŠ¢MN0"Jv’#Úà”ò jp‰!£ì2'ü^]Θ]“+Œq˜²ªµâ(”‚NqÄœc-ÎXÁ:‘LDÑÑ:ˆ‰‰Ø$Ø2¥à(`¥ì¨àHâ8¨½"Ç€s1{bÄÌÀÉ’ìU€n! bVt æÉlžŒyr„BÅ:ëq…סÚ+³†Æbaû… “u’M‘lsV“3{Eû“íæÃ˜jÖ,¯ ò˜R‚Ù°ª²y+ø°¼B çpDøB´Ú†7e*ä*V¬¯°Œ¢5²ulÒçp´ùŠÓí„ð‹D{•ÑÉu „ÑjÞ$rš`3´˜%+Zø;ŸZ ”;m—„ R ƒ]]"²Ñ d° D 40û¤H@k­†m’ã¸" Œ`â¤`–pq)µÔRtl)˜+eÑ–l©ÀÝø9kƒbPf2 ʒЬ !< Ö&ƒ\Ž-z´j“a’ÖÊ1 #˜ÚfÅŽ°='@£`PÙbL†¿å¥Á´\Lg¨§,Æç*¶¡@ûPxðàÁ`øÄE,ÜK7|óöO€öþ×LÞØ1ÿüáûÁÇ­ìñb~å||Fíƒa›@)Šâì®T¼ÂŸœÙ’¨rõDrG­U^¹á³Åë…ƒMzñü·_Ÿÿöìg3O/ ¸O1^ƒˆ1ûŠ,}ˆ‹ù´ùrþê““£—oס´NOÝwóºì}»y‹¬&õŠ„Òe'}+*îK³7h–èPšÕ%ÍRXµ¹WºQõ9XÍ„¸†”D ›ÂÒ¤ÑWN[=ýqñÏG>?ÿp1>/õG: Å ˜^Éç–ðê-ó£>óPú~$ç#™4S.!ŒeRe2f”E±‘Q×i…1÷‡µŠGZGÞöÅÊ^0a›ÕNß@扈™·òýÍ„J2]' ˆ¥ÃFÞ¬r8p¤Ú'áÍ|¨)#{”¨þÉJËè¹j×èj>É´«OnXþFï!Ãå´iy90Ugý©ºè†"%î¤HÙ P.ËØ™W±´¬bi¡U˽ÆÔ >áƒó”gN,>(ò€e϶G²OW—Ÿ'W§¿Ÿœ"L¼lÞ_,æççó٢ǤªWœq¿ÂŠ!V¼Ö*n]®jØtTf“¦–w§“¤µŒp´Ox<Ê¥öi#…¶¹F]“'Ö=P÷‡‰RiSSÉÞn X«Ç9ÛUIAÿ§v\ƽ¬¾½QäV¸¾¨¯º§ -@é^Ö­ËÞWÖm‘µ²®–n²Hiž¤”(€ÒîåâÚñêV4_;…í«lÁÊûÁ5åküþÑ\ÂFA`L‡Eóº´º]o-ÛUt¯½ «O Ž¢yÎÛ½@ÆILón×”få¸[ãlÝ"«šq¨?T–+û”K7Yä*ñnYõAIƒ‘<º y¥Þ"Fõ¥|²ûï÷BS¾~Ç\ßåÀëÜ«;poMVPÝ%Åñ–Jé4±ÆâµÆ»e©&¯dÿÕ!ù-ß6·Í›qñNY¦è­À¹Ûñ?p‹·Š×µSûÞüØÌ²oøky) endstream endobj 456 0 obj << /Length 182 /Filter /FlateDecode >> stream xÚ•½Â0 „÷<Åí@p“&qÇ‚¨ªÐH U'*XèÀÄëõgêÄt>ÙºóGxp» ¶ëÀ²°V#<¡-I1\¡¤Íz´ÉþT^‚¿¥å8a9i]¦%Á7aò7_û²ñ“9û{“v¡>ˆÈb!ƒ#ÉÖÂ1KV9ƒh;BwbkÁøŽ—r£¥ÉuœßhÄUÐüLãbä?‰kò9)7ÒFÁKk„ùÉ“A¬ endstream endobj 460 0 obj << /Length 1272 /Filter /FlateDecode >> stream xÚµXooÚ8~ßO‘'­½Íi„ÀtœÄØ`½õZÔÒÓ¤^µ3‰ ¾&vä8t=ñáÏŽí@B ­ÔöMìÄ~~ÏïßcSÇŠ,Çš9æi»žÊÇäèÓìètÜëZ­žíõ»-k¶°|Çîu»V×÷ì–ëZ³Ðº=¦)"!þy\·w<<¹›ýQ*P\×n;=W¢8è¶l§­.§Ã«3Wm?»¸ž ÏÏ@œ:Wý<÷Ë·û¾Ó2ØŽíµ; {LÙ‰xáGˆ †5Á$ã0Ž!Ç”lÞ°»Ò"x –µÂ7"ÁN"Ï%ОÜÈl@^ÏÓ;sÇQ„t8µÒ‚àF¡¬T·c·Ûµ>»¦I™’Eœ æØ4"+Ì(IJoV©º «q’¤…ù2×ø1¾¼úñéæìüs M¯+×T(H -ú ‰Ø‘]õó‘æ:*B[ZX]áL¨}×3*Åh¢›ÓTº>Rb´2'mmÉšÞ0še¦I‚±ºM> stream xÚ¥YÛrÛ6}÷WðÍvk2Ô…º´i¦¶¥Î8;3i;5DBj`R®þ¾K t“T//vÏž³»Boç…ÞÛ“«û“ëÙÜ[ËÙlâÝo½ÉrL–‘7_ŽƒÙÈ»O¼ßÎV?]ÞÞ¿ùxî狳ˠùþp{ùñzÜŒ¯¾»¿¼¹9ÿãþÝÉ›û“¿OF°zè¼y,f3o¾X‹ñÔ‹³“ßþ½ž½óBØgá=ÕofÞ4šÑtãÔ»;ùå$ìZ¸ ½y°œ‡£ÊÂÑd,F`ál„ÊÄ5ãGôÜŸ…áY̲œ¤˜7WÛí„2y¯Øcy‡3Z`š4W›’¤Iå…çGó`²ˆ<LgQ³ÇÍëõÍåÛ»?×>þyõéúæuýf÷ÅióbJèã×î~ÑŒq° š‘ó2%›fœþª‘mó}demEhXºG¹Låˆ,M !Ô|QFEh‚x¢7ÀqÁø±¹´vî#ý½¹¾z•H¡b˜R°æ;Gº£á1püRð:¨H3ýôecÃñÕ`ŒW«z‰ðlå¢\e—cíUMs2šÛ¡+É*˜Ú.W3¾‚õà3(0ÀÞÿKЍ%Ź?]ô-øìÈ÷}·"hÅàöVB9žÂË¿‡Qøaó˜N.FÍ««o¿•pœsc!Øó_¿$4NË;``»#{ŒÌ¿R‰}†Ô¸úõ×s?ªÐŽþ'‹#=µ‹àÀü“åÆëù\nldãêî—±îJé3V4GIù™ÚðŒ«®,ÿ³¼8Ù¨Âà`›ûzJ“Aœ­#¾ "ØÂAÉ/›©ŸÖúQÃmR[sì€9' ¶ôï‰Õ»RÏ7’}1£[²+9>•ËpsÙ=Ns¤0_Û•®­”€Ô}pvÇQ&o?‘b? Š2,^¤,Fg:ßwq¹M1RxŽCU+v,/E™WÏ1ãØÏÆw¯ôšã´*Ò¥ëÊŽ4­wmæVwx×fh+ ï‰¤ß }ôËó š(Ö°üÈÉn/-­rتÍ]£årz¡‡Q;œµÃ¥Ž·ípÔÇípÚa±>'áþ¬}eÞípÙŒÖK¤ïضxB\^­Y Q«À¹PpÅ °£i0™Î̈UH‘@˜lÊs¶U&ª¹E^جQ4­î°Rbš±„lI,mª5¥LéPW;cž‘¢À‰•·©ÔF†RfŽ}8;¢´8j^@v‰­;î>ø” I ŠÖaã±6–Càœ@åApÎî €¤ B¸Å\™„„OÄ…CÆOWHƒÊ)Å#èÛ©Ä+$HÜÊE ¨ïõ½Ï Y® lÓã……©€d”é]úû¼Ðyì{•ê»CâÚÂSµ+Õ¡ÀÁ½âE¿ÕQ“+Ú!ÌQüˆv¸•êlYš²§J}|²*?%¸@ÎÎê:™|ØaŠ9‰¥‹Ûyÿáã›Ë×ïßœÚÙš%J¥óÞF"Çq%&»ððŽeØx utf÷‡Ìž­E΄ieH`²<ŦòRG ÍÊ]Œ ¡PëÄe5 »ý †Ðô"–‚;¶&äu^Á…Rc#g ¸ƒ6•è˜r­Ürd \5PJÓ£±Ô8eå{Æu¬eB¶¥oþä N¬\Ùhr”Î3¡¦TëßšX?˜óÅØëÜä’ïA|mDWŒµ‰ßµuPÕQÕÃÁ Múñ›½Œt¡ƒÕëf:CÄœäŠ/õ³¼°Z…]‰Õ±z…ªIW WZbaÊÇHÒéª1c¥ÒÏQÀ ç‚¢‰jõn¥PJOJ®«cÓ…ÖT¾.ôWG y¼í[c•c1rbƒD æS“±Å{ç1¥§,úÌUÖfH17SÅf1Ï4‚}'è PHŽTãÔƒ¸L>R"éÓ@¹& Y][TÛØ% ŒÈ#Ik‹Rœ*XKÃú¬¨¥ÆKj"Þ¦ª²M *r‚`msQ=§ç»­˜®OÈJ«.åJÊv§nŒÍt yÙi`ŽÛ2UÁ&Teª­ó”`H];½tG¬•î‡[GE'aK§Ràg“²ö´²¶8æÐ¦ÊÈj¨ä§€ˆþ ‰!…kX1­TœØ]éƒï×+øÕÆ?˜kLUSG0uÚj"5ï Ã€ØuÎeZSŸDg5,ì5]Ù\æmÝh¢qQYÅ:LÎ’ }{u˜µ!°Èú-ˆãƒæ*´0­DqL* «Àé¸*·ª. ;À¨ÁídŠgXdÿŽF5ÊTÕf”´%j›:j*¥*ÜQJ0ïQ È¢CœjOÐ;-Ý•ïÙÓ@e‹ëÞUñ±êQžöÌán·àIfçPmêÊ›d»&eû-bï·=”$\—ÐNÓÓKufs*ÚuŽ­Òû¤Ûè£À}Àéÿ€Lñ?ꨆë0è:j“@÷ӥЌoÓlE®^FuÕѶ¿ŒÐ™TºùU8¬mJ=Õ§2jÉéãüâ¹tÑå8c«Â‰VuÐE-ýoŒëÏh@«õíôÿt’+M£`_ÍOc{ãþ A7 endstream endobj 470 0 obj << /Length 1839 /Filter /FlateDecode >> stream xÚ•Y]³Ó6}¿¿ÂoNbœï„€ Cé´7m§C™A±•X\Û2²œßu¤•mIp_âëi÷ìÙݳvƒ(x}÷ån ¿Q0 ÖQ¸Y­‚õfnf‹ Îï>|Œ‚®½ ¢p¾Ýçëy°XÎÃåbÇYp÷Ç]¤×z±»{òjëp»Ž¦Áîl–ál: ÖËi¸Ü®‚]|x´KéãÉ*ŠX¦>ż8°c-hHâ‘:÷_´Œ¸p®³bW¦ê<«Ôo]ÑDI®~cA‰¤?îÞ“é"œ/VÁd.V eC» ÞmQ¿Dý”‚ÉõZ$ËpýO¤–¼yx>žLgpæ_^«K57yÜa‡«1‘2c©Ì¸à³gRHË”G Ó×A´ ¢qÐÚo„x°âØs¨ gªŸ>QQ1^tÍѨðƒëds8Ý„ÛÙÖŠbÅò2£•DG.–a¢yQ9ñ„¾Ø“&.Æ“Nm=sñ€ºK©ÞgÚ!¯©_Í›.Ð/[Þšóúý_êòKž˜ªv/¡ª‘ÜÒÈ{#¤†Á–6WÔf˜I‘ç0à6!ŸXÒ‹ý@ñ¾—«`;caÔþb¿–À3m[³¬ [cMÈU¹pª¤WÊØÃ·ÄŸé^7ØÝðÁ¢Ã÷ë×é®F;²Ó&¬`’aLN$«©õD'(P* ÏȆLCQØ›CJ7c¼3*˜è熘qÚç€sŒÖ¯LqãÁ íqr# VïÌ<Ùâ„úåËgñv«_½{þúþÙD{õîÍ ø'+y3òm¸&³(œÏt~üt½¢^ÎMÃùVÃôžc;ÿFìvRù‘zútlÅ#çh“æým8m|IoV}…küVg’•¨4Ÿ‹8e Õõ…Ów‚oÕ…a6~§Êµœ…œÇ’€¼Ö·:زßI'¾I‚`*6Cî¸_[ËŒÄî¼;4¸ Í”`7#`}Ó±çõñ¹°f{@Ix;Ëê1Ó¤\Pïüp1ÿ›`7m¬‰êܾ×îßÈd¶zmÒ)FHsëΦÛUæëÈ/;÷cËrBNýÀ§–ë'–Õ:’®VóæËˆ±˜oáÎpµÒŸXfs{çÿGd  endstream endobj 474 0 obj << /Length 2120 /Filter /FlateDecode >> stream xÚ½YmsÛ6þî_ÁñtÆÉÔ¢õþr7ùà:NãNš¸¶î.™¶SC$$¡& –%knî¿wIbAåËùƒE‘°xv÷Ùg¡¾·ñúÞg?,Ï®ÞMgÞÜ_L§#o¹öF‹‘?ZL¼ÙbèOÞ2ô~}uóþú~yûðº7œÍ_]ûÕç§û뇻au}÷ñqyýáÃëß—?Ý.Ïþ:Àì}oàÍúþ|:õfó¹?޽ >ûõ÷¾³Ÿ¼>¬3÷öå›±7žŒüÉxב÷xöËY¿iá¢ïÍüŬ?(,Ä9§¿Ê-}Ý›öû¯žž¬Ù&ÏèEuCK%Ø<º“\ò˜H(:T·‚- žEu½æYuQ,»“z ) žÉ†Z󤂼‡f5€'Y°e@è”uÒ°R²¸Ën§i!º×k‰Öx^]lÉŽºO„„ø¡áÉûªLmlBA˜ Ú-2ˆ(ITŒ¬(LåŠFØ€ '–l¬EIÂÁ¬¬½p·ç?)à~&Á§Çêòsõ1èû+>#¢Ñ!i,.-ì¢æ 2 /«al•‘ŒQQO×r¹™¾Ð —dáËuíyöŒØVŸqI–b U©Q‡”Š^Ï‘çk"UNjmxÏó„íh&H„™Ã’Òö^o¥2[¤4`냆ß4ã©W¯¼ÈSÉx"Ìô°XFí\%M†ù*q¯ÈX*æ¬{d­öRUf4Íx@…àÆþöì 0 „óòþpä/f¸øWšÌª‰onÞœo‚ úRš£r4Ÿ¶n¾Ì§LÇ­Ûi¸îMÇÊ¿ FãÒ ÉÌÍ'l7Ÿ?ƒßÿÿ1ÀDêæþ¾¹ù[õ6˜T=ÑVÁ“2à§S1^˜ˆ–ün0*$qu±ÉIFI5åpt&s$·"-t(ò\¦9ººD榠̈́íÊÁ˜Dh¬\–‘#÷–ÖDÁyeWˆŒ H%á@:z‹µˆXÊ/Ð>®6ÉÖ.6GØ€WbáãM7ÜUìNêúHbꪼoZäúƒ2¤k;»l±¾ª)Æ7á.0Bcê[ž„4묠OW¹È®"Âç ×5< ¢kâši²­&«ŒlŒT¯ãh*¤/*Œ,*Ã" ˜oì²4Óš½¨°ª PÒ2Ë£štÃvEd´#¦%º4œMž|êõªÅßÜ?ܾ»ûŒ[܃êõê2½Xžõ¦Úû'+Á£\6ðU‰ Õ]‰¿´j¨Ÿ )°¤ÇA¤ I{ЬêUk°  :W×DHJá_"#0îÖ&»˜°¤Dˆã¾(ª¿å“^½<&Ã@a¹h¤éK"Ú%RG¡VT gÍ>À!›ŒÄ6FZáøŽ}¿åA` gép‰$-/ɾµjlðå&HÖ4¿;¼îpé0d…!—|©—Á(Ì“\ä$r69q²KBrv‹{CEìYKš,óæí݃å}#B¶†ÆCÇáŽD9µû9ÈhúJŒÚnª‰$Ê׎`~È;èT9ïmi”^ØÚw‚“¶DæŒÍ6|‚J+ZöZ w¯€ç­®(Ö9ŠÎ¡ ÍHtyL“ªºÕî’uè[Ô/ôbQj5µÐ:Ä–ÉOßý· Ûÿa: ÞýŽVÜ’ÞjBÖL®ü²×yC Nii¡–sš‰¨c¼Ò%iêúºEÑUCk8#b“¨â@v,¤Gzñ%šsÜ\ʳ²'R« >ühî°]вéð’“+wekÀ³L¯aÍè ç*íÅ÷š)å[P-ƒ«…‰%+¹+gWÏ)Z\ó(â{b ˜A+iE\±[ýÎ(»†µx²I ¢>Þ¯¡ÀèRqJŸ!$–„@Õlè‰ÎÚ3¹-¶ÈÚZs¬SaÆÊîò„¨[³ Ã.¦°ºÎâv¦Ë´ÈXœiWšðjú Z¬NmR†2RGë¸æžä…ÄÐrw*j—ü¨tʼn€‰PRWzúg[Îí:¨Ç™ž²Ë€¹¶Ú–U6ÑM ¬#œr¯:µ&Y}ê•Ú%©s]ÅyÚ)“'C9Òµ¦Ão*µÜ.cÆÞ*Ô@ˆš=§Ãÿx®¡ÛPã¼·š?‘,ëLJÝýjÝU:¿ q<£ÅXI!3´­¦;twýLë–ÀÌÌáJ—þ2‡#µgô¯Þ u«ä:äQcô!ï ¯óùQ‘,ÄÓ‚ú€:¤#tRÊlå`“iJô\bø½QGŸ¤0ö‹AQwí3¼ˆÅLÚôhŸûR _}Ç2Bl‰FÇ:›¬ãŸâžó´‰ªÆÈØ©îQ37Ï+œç÷·^Ú:±…„am¸6qUÎÚZ­Úµ??°Uq*rã‹¢l„ßHùõ1ÌÛÛÇe­Õ1"›ŒÝEö_%ñò‹šÿ4â.Î9©:_6:2^¶›±ÍEÿ.¾)ç‘‚MŒ¬4oûµò×Düä”uzNíÅÚÇêV*ÖAV'e˜1¼Œ¨X5,Ÿ’na Ê'¼tÀƒ?)ÕÖ­ÊI­ÓÄoÄŸ#ý˜9mQV±?¤ о rÜÔ \“ŸFÇãÐûV±<­Þ90éüñ°(ceRëO]¿ÅNfþ|ø-¿Ä¶#V3'þ>J£†c{á¿Msn endstream endobj 478 0 obj << /Length 1707 /Filter /FlateDecode >> stream xÚµXmsâ6þž_á¹/ÜÍ`Ç$@B¯t†rK;—Ð@ÚÜ\;‰°e¬‰-QK¡¿¾2ÒÊï—»ë•/FH»Ï>ûìJ®µ±\ëâè|ºVÏ:sóáÐ:;?wÎOú–}ú˵|ùÛ/–뜎έÝaflõ§Î *Ç‘µ<úíÈÕký¼::ž\ë̹=k˜5=g0Z+ßúôúz+£(zc]÷õ#‘&˜¿ùk%·±ì‘ÓöÕÄqõs˜Óë;§ý¡e÷ÎÑÉHͼ Ôb"Äj°EÞ#Úè/<ÝnY"¸úFDW ö,UQ¤HØ&A±þ`ê¹Ö¿ÊŠ"ì,²Á¤Ìö²hGD¨æÂâøY$ÇyVc–€‘AþŽwˆþ™¢kcÖ{õÜ'B7jüà1²“#QG” ×±mí¤­ì/nfóË»NÙ®Â4eâxy;Ϧ9­ÑX²¸ß´åHLsK]¹¦ha{>›¬nof`ÊÁê<m˜@Ð!Þ…8Ѧè%!~>ñà D¬ÄÌ-J„~ßB/§âUˆµ—±q7âì‹Ȉc/&Ó_'ÿë>éiE+4D{Æe(Dhh‘Gýׇ MmÄ«Á~Ö/þtnoÛwêñ‡„íÔx¹çÇrzÏyc÷Nä›U#ónf“wÀ#²4ò5LE ÝW¹Ð_ü2Fä‘h俆¥$ ö؆’0o§ò0(39ßÇÆË u[RÕÈOÊS)*û:¿5† ª›êE©+HEd DÈÐ=,FBf€ÜM[µNµC$™TOŸaN;R3ëhÖ´ŽFÍÛR¼d,Ÿmm<¿»¼)»CÙlå)M‡ôá[ì‘`_ψÉdÏvýzÍbA€«i€Ö$"b_ÞÛø©¾†û'œ¬Y–6õÂÏØKóLÍyˆÑ#`·#Q…Òm^ÈR^qAÇ6I)Í+…sœ›ZÇØ¤—|¡ÂNRIÈZ,x (DŠ˜PƒŠ²TlSa´‹xa…3ë¦De¶„ø>¦à9”Ójøû¸×ykŽð·xëþ_ÝÕþŸ\t;¦ÊùºÅ‰xi„ }8HÌuQímÔµ6åý¾½ë~Î÷)>ÞJà´ Pt(Ó³&WËËÚ|™‰p /tnW·­™1¶¬oÚ°nY³`b¦ð±¬/>öË!«ëTÀ¢ˆí oJ*EhS+•øFª«BÜýÏðúá°àÉ©3ê•#P¤«úãtüÊóÔØžè—ö»û»ëÅìê~y}{3®ûJ¡×°¤)$¨/­íš,yì–p5ͪ½N D~MèA~Ë*u12MÃC΋T»^Î{5çÑAޝ’tØïæ=ŒÉ4ž‡¥Ö•½ÌP™‘yÚˆ&;>!Üøqç…(qŸ´,„™ÈgEµØ÷¸Ž2_ZÒ÷Û¦6hÜúi Þ*?›36(j^,¸Xj=uð‹žË~µ5ZŸ=8eÔ®\ùX²Rvø|qcà$¥Z#/4ók·Yuôòl{áòøs«Î“]¨0<ë!*‰i…z_½ú*ì󹛦{Žb|"Rزp¼x .#¯Ìœ!ZOªÛ„d W ÁEçù Êé )±Iåì TåàÈØuÍE.¯ÔŒ‰<¿fÀúãÕÇEùnÇùCL²]Ž2·(pC•]V„ʘ­ŽMŠŸ»ÀS8´ HžÒ>®?c£YT7/~BÄkš”Ä­ 4]ÜÚÓë‹ÉÕG{ùq¹š}hU›Â˜žYF,DFq­Uäk” šëëÙª~>8sÎO¾æ.üp><³¤ÁÃáiv>JÒ?É™Îp¨ïÀOÕÿJ›]¥ endstream endobj 482 0 obj << /Length 1617 /Filter /FlateDecode >> stream xÚ¥XÛnÛ8}÷W}q ÄòýVÀY¯Óº šlâ»è -Ñ6šTIÊŽ÷ë—’HZ"i7Eóɇ3gΜª¬ƒVð¡öÇ¢Ö¼ ƒQ8 ºÁbtÇݰ;îÃq'´ƒE|{;ýxy»˜Ý½kt†£·—añÿæöònÞ)®ç_î—××ï¾/>Õf‹ÚZ[Zoí`Ø GƒA0ÂQ§DÛÚ·ï­ –Ï>-¹Ï(Øçonƒ^¿ö{]yƒûÚ_µVÙÃq+†ãa«y8î…á´Ùo‡ýñ ððæ>Û[.hŒÃÞ Wüøyv÷evÝPÏ䓾|ÒhËX;ãâ{ß5­Ö[±Q+„ÕÕSDÉ ­Cž.ëêeÖÛ å-õŠÀ)äÅ5]ÿ!ˆ6Ú2ıĮݑ7óUáS»v{ƒÂë~á“»/â¤.Ô%‰pÃXßiÚ6Ñ3Xà ãç©7Š›˜Âܶ‹zA‹ÿÏ„î­ð·28D4„‡†¹%Té¹Âã@Óâ0µîq™"#²~,î#ºMd4Ô”bnÁ1 {£xO®»°,ó Mq|ß”Û9§‰@TõÔhÀÖPLÿÜÎêU8Ä0Öê,îjÎù ¸5¯Š«=ÂØtÂhœFPÇCì/€¹DT]}”a*@A µ*Ć&@­^C{ÜÑÆNáš` äk*î­VAíÖŠÑ­…[žvÅIµôD&‹ëFhu8q¡|³¡\¼©š,îþmõ[(„¡°Nû~ƒt5ÚIF× l¹?› ¸“!§cåèRÙb)‘>´õZ±1lË|.¸j{…Ú&9^¼þ'\ î‰}býýw8T?ÄÅ~®º:(±JT¥Â#†Á-ƒ2©I§˜c\‰Ñ\…ø }9Ò?ð ”Ø—vÓ‹1Ö¹2*Õ’£ôAøóhw2@ʽú£gÝ+¦Óú…ÞZŠ"|Ìúˆþ íVÂà ½3íÊþILé³÷íÝìjþw3´é‰Tr‘о .x¹¸ak›PD¯¶¨ÛØ ³KÖ¤ÐȪUîôæËÕüÃãý|¡U’b”lhh¸«d2õ‰iŽÂ­Å×<.&gIè‰ýR—#²ÈÞw„ªý¦Ùy–g‰rTò¼ å‚”Eˆ)ñC1³ÉäÕUþPeª )Î6³Ç‡×W©ªšÉñqn•+¬ô&€s{È(!­9ö‘j¢qº…•A†ëQä`”Ö1«"^írœõµÚ›ìê5O£” ºEÿiç}sŸ|™ûz”%!Æí¥!5fHÔÔfñqRNí(ŠÑŽQiù|…ƒŽtvë&ÒO}9;l $rüÒ³fÊ ŒO—w““Ä+]ðl ßç^tºá¸]%nØ´R5Nš)gͬÚq§¹D¤¹Ž¢‚ežõƒ·¥ ŸéÒ€5ÙiøSÃH`™úÆÓl°H‰L'¯Ê$ò5*iÌPë¡ÜûLfÓƒW>¾©:"%²_âÃ…M £ A?ÒÒ¼o)ž2[½Œ6œ]_×u™eØ%†ËTÐ,ºŠÖ:ÿ_‰@Ø)²µK^4ún?)íúýÌuÀhJâ“t*G2Éɳ\ _Ö­Ë<ÿÚSÌs*eNvºCý|^û‰ž;ÆŒèšH ²iº¢Ó½©ÅâlcÍcÒ˜`Tåc£uHœœÐhR ¼ ̆Xˆ“º¯Ë76õrjJÜJÙÕþ“Jea‡ªŽšìôwod%œlù–“‹jÀÞìAL¤X2á¥xAŸ2.GÈß ÌGZ*ÖãÀcÝëüüüè¼(Ä…véqÒÒ^ãlÂóù–i£GÕˆ>ì8z&h¢LÊŽ/ÌQ Û'𧪯rÈ#A˜SÝeë%Ödˆr’@~<Ò©â,-¤hs¹gÝ7:7ô˜(•¥*ª’™:‘>…žéË®cEÏøå È.ìè2¹š_ÏNÅ6#¥©Ü EÙÚ÷–V›­9ØÙ d–ò³¬¿*¤Øèg:…™Kž`1Êhq{vöÆÿ“î endstream endobj 486 0 obj << /Length 708 /Filter /FlateDecode >> stream xÚ•UMoÛ0 ½çWè–vˆU;ñg¶u: Ö¥§®@YN„Ê’«fý÷“#Éhœ4ÀN¦Mùññ‘c°1ø6yž$öƒ1,óe Ëy p;¹ˆAm}ßA U ¶»“-H³ÌÒ…µø=ù5‰=Ö§åäâkƒVEœ€e3`f ̪,kpöEXð†®#Œð†LÏ–6ˆ*˜æi8òÙ}ž/`•8Wæ\Eê<Êãø¬Ò=b5”‘+8ÜÁD')a5¯φ}<~¤,ßwfÁù|@Îÿw-!.´3:I¹7[¢ZÏ]¡WÊ×ÎÞn(Þ8ÓRÆOþ’Ä+2mQMày”Ì­½GÈ)ÓuÒFòŒB²EÞFwFÏÜ‹$5•{ŽÔ?µÏãñ¢&/Ü06uþÄYŒø«{!RÚ ª·Ÿé–JæÊ§¦6bË-hr²NJbËòêúæö½®ø!ÄÓ¨)ôÆÇè~²t¦Aya$ö.,joQîžN !}Š6dûN+çë±nqg$ñ*aЈ&²¥œJH ƒŒ-Ò÷NJa‹Û理¸SdàîÑÕHÊ•¶‘l@ÁCŸö°.rRä°Z6´zŸâ‡'…E9o>Û>÷7?‘íƒËK—LR&°Hª=Ù†Jµ"tºÕ Q¦f&f¦z_XþþÑõqB“¿ØЊ‘Q4V÷HÞÊ 1˜À»7u²\DX¤ß¹Àø{õ¹5|TŽ¡}ÞÞ^ƒ•ÑaxDf§Û1&Óø^ýy*­q'#¦üU€0&f¨%oŠ2Ýz[Zæ©EÃf{u #ÕKqä~éEº騺M³ËjXE_–‡›-+ìbûŸ½¶Ûgy¬By¾è÷Y–¤0]Tö$Ìs¿ÏæÅ8ò?í&ö# endstream endobj 491 0 obj << /Length 173 /Filter /FlateDecode >> stream xÚ•»‚@EûýŠ[Báºì{ËÕ Bˆ"lG¨$ÚHaåï»áQQYÝ›Ìä̆ÎäÈþ¤ ,uZ „'„T8ã8Õ€.9^|ò&ÝqcOç¼Õ¾)øÜ‹k|U¥}(Iȇd‘ÎÁ0jµ†±–Z.ñI×3 qV‚Å;ßis„T‚*)b£%w–×Ü0•‰Èˆ[×…$Õ1&Un'‰õj”ù'ö>¨ endstream endobj 501 0 obj << /Length 694 /Filter /FlateDecode >> stream xÚÅUÉnÛ0½û+ô"Ä×¢( qТh Ç·¤T‰¶h1(èç—éM‘ôÐäDJœyóæÍpˆÀ p?CûÖm»å~v³œ]Í%XB¦8ËJÎ"ƒeƒëíVWYþ'Œ‘ÁMøkùuÔ£c$I‡‚@Ä)Ä;€Û¤MœóCkvi»3Ú}ÞÖé®ÔU›´y]àŽÓvœ T3­£+}´ˆÃ#„‚?¯_ÈóB¯-üs^­BÌ‚ú”‰Û/ô*6ºJµcáã^Í*Îc(+î-7yc„ šÖØ,pˆýÚh˜…ÛtbÔÖ–° tI÷'ûÕv{Ó³n:ʰ#u5W(Ë…pÏ…p«‡¯Ñ‡¼J‹]¦eŒO,Y …’Ö¡7ü4‚%  joPo““gs­†›TŒdŒì½>OuFP0Õ»DXbˆ”¥ˆaoÌs]dÍ™þuÀ )Îx"„ù‚Lj1¤›Äxúô„>‘Ù?!{g00B·Y¼- ñÞ­¼«²y^èïI©GyÛ~aY1"C"éeª»ªÉוÎ&˜X«®/º ßòJãñˆèÄ"—c±w,ÁCkÁ#Š‚öí+qŒâàÍjò"ê :¯ÜAwN® ˜‡‘y«ÛÄê˜ùù¬›ÔäÛãtžž‹1¤”¾Ç\|%aäRåê˜+ñ¹ögò!š–s2ñü ejß”ñΧâX ;€- ²ÖÞfü%ûøqr *dû bÎÎéV“ÓyåÖv㤵±uÚÖöÙ¯Ö¾tõΤþØR&…߯L]½‹º9ømMˆQ¬ËdªZgzRbûRœê¹/×ázô»¤ÈË«x¹a kïÈV×]ù[› aºÌMã»ùè÷¯" &ÄÝröDXé endstream endobj 545 0 obj << /Length 1317 /Filter /FlateDecode >> stream xÚÍXÛnã6}÷Wè‹4 I‰”'ÞÍb»¶ƒ>d"Ó¶P]\]ìßw(RŽïvRÇÛ‡D25äÌœ9s‘°11°ñ©u5lw¸kxÈçÜ6†cÃÆaê®O'Æpd<šíÏ—½áMß:£®g^!u½¶l^Z>6‡òߥZ ûÅæC{øÐ¿Ñ‚ÝöÃÝͽ–’ò·Ý{ëûðKëfØú»EÀlÃÅÈãÜp=yÔ1¤õø#xöÅÀÈö=㥖L ‡Ùˆ96ÜÇÆ õG kg0¢LÞÊ‹vÍã ®58A¸qí D‘mŒ±Y¥E4IÅ §žÙí]öoéS_L¢,}ŠÒ±E˜™]\$7éèk” Z;Ñh?ï0¶  g”’Lé‰A^Á‘Z%Ï"W¿³±º–S-E©ïæ›Æy–¬ˆ…qVDéDý˜åòÔ`’ʦ%$V`ËlŠÏYDÀÑ„–kNƒ\žrÞ±Çm”ËmއˆíÃîz×7Œm%´ 1xÌ™­ø JÐpF¸Yv¢X܉؅äcˆp¶Œg*7mÆ/Ìò\³,Íá)²*õc°œÆÛaÍf"=¬ìmÄzFò‹| ¿$ùA;.ü¿`ñssmR9q‘ïë‚2löŒ²°JDZ%8¦O¶llfysxThv–ÒQfV¡¶åEbè§‘ ¥±¬1Ûl¡::Ž3¹õen«"ûÅxáÈõ\ÀŒÖW•Ï”²%)U”ó‰®Î}Ø÷™È‹@™ѧü5jR½ìÈ"ætù¤u¦Š|BXÝ5¶¸ÍÂPM–^÷®·ÆÅœA™+Äà¾/ÆP¸D.ÒPìcЇ\—7Á’1°¹¿›Ë dPEÔà ŽÕb㨠!3Z)Ò\ƒTIv1w=µ¦Pú~øxö—lB=ªã'啌^ü1Ó«R‘\Y)iµÁº¤I1ÉÝB"­™CÆH6Ô$ÈgÕq•†µÅ   ñ­Ëg4 Œ*èoµãß0Ãð·\™š¦ù³ædU4„-³:Æûù•SDA¬r^/,Û‰T3òñBÇZÉÌ_¢4Œ«‘н,HÂ@အûÖoÎr‘ëÌ›ß,Kf‹äÏÐtá„À˜â:ͦ߷•M‚‘Ë|®’Á…^G dƒƒWçæµhÞ‰D<*Vòtùº2Î×Ö@¨ã>É‚…¯Qò1œ7Ï‘¾“\§’ëÉB Ê2žåzUŠbW¦ ©Š}ÄloK‘Ñ%%œP56 ¬À¶Õ¡cyW´»€ÞyÝJ 8mž7æÖœÙ 1 ”˜8øn£ë6fËN¶3¡Ô¯wõù¡Xke£•îÖÊ÷èã¢ÓôO ‹žâO/ ¯>B¡&žrm俽)/µÉºìÝF]×LÔŽ¡E £×w-@Aa{²ø9Ëâ=|Šv6“äÇmzBe=Ý'þ± mÃuÕ·ã(éD0ȯ8dÜ㟠Õ_ƒwh>ŠÓ÷ÙŸrÐ ¢òʪd8ÍE°¥ëWY7Á;:¦¾U‹³àGê@ó8‰Smxÿ fÅ)8ø–Ñ{}ÚSÄá‚‹'™OVrÙîõ¶k¹ÿ>ã®EýTq)à éïÈéûà–†®QðÇéA»ú¾AÅž*…È?åY5;dT9ÀØù‡Ýtƒ4*Y‰YüáiëX–QÄ[!ÚôÍ—¹È£oùâ»þÙZŸä0Ä› ÑÆK€âܯ‰ endstream endobj 582 0 obj << /Length 902 /Filter /FlateDecode >> stream xÚÅ—YsÛ Çßõ)x”fjH ©=Ücz¤‰ßÒN†ÈØÑTW‘ÜN¾}—CŽ•4iìIÚð²Àþ,‹DÐô&x±Žæ"EÎ…ˆÑb…R‚3!Pš3,(Z,ÑYø³hÆÒ,<þüñ˜Ÿ¨uÙ6çe³Š [×u:èM1¸ö‰ZE”„J«¦PÑ·Åûàõ"øPX‘ º]!ËpÆTÔÁÙ7‚–Ð÷çúe=k”ðó$†v…Nƒ/ñQ̸iš‡× D Ny.vEŠÉŽ L£%„„¯Ô ËJ-!^–Á¿¾Ðe7€*í¸ÌÑœó2ÍbX’øù—eÍb‘‡ý a^Z±ÈÀÐjå;eU9£á/ðe<¬¥]κŒOÙ8ÏÏj>;›¶°ŸÁŸœ†UùÝ W®k¸TÎßùxãUç­f!c)Z Átm³,›µ¸Ýè»Ue¡Bô8š *@–Ý2£–Rœ«vµiŠ@fõÚoèÉ›Ù/†âÔÀŘ˔w^øW üè„ñ8Ðh7 åž›Þî´Ÿa_ a†¥µYö¦5ao ¿ÊáÒµ–r®µÒmíZÞ0»ˆ&Iu3£G]4¿N&æ“i^ªj̤¶ØÔªä­\úÃìwf–|›«E”†—R›ÙŽæq‚rÆlLI†iœÃh; øÄÎi2wŠ x{Ÿ[´ÏŸ×/u9”…¬>ÉZÝwfœc*ø4ÜÆ ²XÛÕ„²éð›XxØvgòY{ú)œ 3#ùsJ'•+†Š•ÆS©¯ÔJnªáÂFŸÛÓq›e ’þÒt²E”d¡ŸïN^”CèÙ”×RÙó0N5f¡Ïl{~M«lÆ\÷†{Ç•„#s Íø¦Úëf9‡ÒûH™¶…s£ÊÙÒà«Ü¶x¨›ÕàztÕöÛq6·—\×òá8Ó]œ‰Ç¹iúrÝŒ·Ì=@>@ ¦{\=¦fû#fBÝÔJßÁÅ×½¯×ãž‚Á$¥ø! ØÓ0¨ä <€‹¶­îÿVö/Ûª’]¯öÐ?Þ{cµ˜–Þbœp·88Ç~¨z¸©Lñt?u]Dixõî!¯WS×™Jx5–ÈÇ×—¢ïX—?Y¹‘Njçëýψ¹Oø$mó}„ÏKm„÷ÃS(÷•ë@á>€?}xð¾;öùì¸ý‘Äi‚¸xož_Lo®ü˜d° endstream endobj 453 0 obj << /Type /ObjStm /N 100 /First 883 /Length 2647 /Filter /FlateDecode >> stream xÚÅZß· ~ß¿BíˬHŠòn4ˆáä¡­a3Mj4½3Îg ýïûqo’\²ÎyÇ·[>kfGâ|¤(ò£4)Yˆ¡hH ÿj0 Ic a´¨d´˜#kàŒnªAÔû•2~×4¦]Ò)SÈø+5”Á™Cä„!¥ î5§\BÍ~ŸÅè²*.JÁ‹©”]ʈ}‹à IªÿÂ’xçH#äà}”ý…ÀLÙßh®A²a¸‘ÿÕ,Ë.äT+£`¸%\@Xª10A×T]ïäÃ+.ðRx$ &¬6¨•]« ãX±]ª9Ht3ÕpaA’d ç ™9Žäì?à¢P !åÎŒ¸@¼L,Q€T1ÓB/© Gˆ¯P^Ýb‘4`D̃F(HÑßì®>©ìrÉí ôJø¥`Ε\A‰;%à ò>Àª„Çn…Å4cV³¯ær09 žC‹Ìþœ%äýQ YÍÑK‘r¹ªK-¡Pf† ÞŸ#XTà|&SÌE1LÂó,ÂG“bn?•̧ZÅ=‡ÆD_T‚U‡*n³Ã¨ª`ò5EX2ÔÍX\KL\5W¦©5áL_«¹¡Ì}Pxç Ü½»»#Ac%ö+—îK#2†‰ùS·m=\`ÎÔ×K¼N!Wð1uŒ>{š\Hæ²{òd·ÿ*¼H€Ãó°ÿû?þ ; ‡°HC…_½ûñÇ—»Ï>{oß}K¡!Âè§ôͪ4>©¯z˧aÀ¤'Êè kþ¦ïÓë«ÛðäIØ?E4`˜è0ê©ÁÉá w77Œy¾»Áâøƒß@ÄþÙÍuû®ß†aÿì«§aÿ}ÿé6ü"ýûÿ¾éx0þÐwû/ñ¦~uûqè€m·Þß^¿»iýí!‚~ú¦Ï¯Ç/® /"~Ъð«/ñ¶ñ"°¤îºßÓWõ´¹|¯¾«HŽÇŠØ&E~¯H=Ý)ï÷ýS¾§¯jþC‡øœaÚóñ´çôHkåÇLûY´*Ç>ë¹nÕêž"gñì’Ž´*üH­Š|ò¹²c­òcµ*Ÿz®Œ´²øH­5?ñ\Ùq´°mÑÂìH+ýÔsUéX«úH­jüÿ§>ÇŠÔRdÿùÕÕ5$¾8pz‡ä”þ®ÕµÍk[Öö0ò÷rvûïÞM·‡û¿½¾ú÷nÿÅõÍÜoHâËý_÷_ï¿|A‡ÇÞ 4ê›°†RŒ˜šúmPl¡Ûç£}ö¹þþ:Àäz{{ó®Ý~ûìóç_ó«WÏû¯¯¯^½z}µ\¿G‘ež²ºäÄ•#õz*½4YZþ³›ü<ÀE† âš;dd¥,^m3ðR—Qǹ˜€¹Å…£Um)•™JJÓ€%Ì/ÀÔ+›‘ç:ö:1Ķ¥%# kµ×ÄmY(ùê+’Á @±Éà$^obÝe*›‘/½¶¥YžtÌ‘–¦3ðó"9Íûlžt(^'Y1@4"ò1ÈgðßIP„ç¾DXÆ€¼¡‚/€\xð-‹_'bª›‘Ç8ÚÒ µel­LKu§b‰m¾áÕ·N%ä¿éûBþ¾¾šË`QÎÞ7%¢ÔU¨ INS¥…ói}½øÔ³uÆ  &¥”µr’\b4À HUˆE?9¥2ú£êxÿTÈ—ÛÏ7îÁùQ9÷NÖýœëûʹ¾/å|[ê®ÕµÍk[ÖÖÖö®4ñ ©»–Ö–×v•Ç«<^åñ*Wy¼ÊãUž¬òd•'«^uˆu~ ¨?ûö›gÇ Jm2sÕ©çZÊT±«Ú|Nî’`]8›ÀÚìÛ’XjîÜxÑPjÚ ¼.qæ‘gµž{×Î2ñD=Ž4§>5ºp®H›ùWàP$sÝ T{ÎE¥¹sX˜SGÕ4•|Oaðs?†¨e )EXËVàÖøµpqæ‘ s·XUæâ\æ6ò㎕<"zÄJ›]%ÁK–hÓ´X7Î¥ÏSiSÇ#•ó犄y7ô¨¼ymÂ;ÊÛ΄`]@ 9imÅ#ë“-çýFg. yÞœäRõ%ݳű$b°Ü¾R§RáPl™Ê$vÎu ”ÕQ®¨9ÁÍQÍ=„úk#J‘¼ÂQP õ´P7N6JÐxFà”ýD’‡Ã iq2„ª®ÚæuÉKYd¦¹U¡C½ˆå–gëbSÍÓ€+²¶zÝŒ,Ž ”Ç.[q§ À;¼cBÙŒÿÆÊµK,¦å¬ñäg܈ب–}•zÙ©rÙN–q1ãØ•º .¤)¾˜ä%]7£bOôÎ@XXPzÆÍñ$E+YK´ ÙrÎ}nb"f tºpÒ!û!¹WžÅüLKÓ6g¤øf¨êI²ØØàææÛ,Hn–¬´ 5ôójÊpýL¨š¶§úy‘°Î}iˆ†K›F±þYê|~ÜT %¾Z?w¦Šº[x³‹×ÞšŽK6§Q#|v₈v{O¡RŠ^ &Fß«€ËovN#)"Šæû¸ôD¡1‚òL­^ zì†ôþê_fCÚNùFÒŽœÓz‹sïq#Hî2öe¹pEίrðpg³”áñy3 '.–cŸ:2fìþ’çyšdJ<^ kÒ¼þBHû¾±M¨ƒÒö`h±¡n™,/ (´DPØ)%‚Ó€£Ö=|ò“á"®€x=±9ýX©qIÕÚb¹O [6ÖyQYÔ­¹”³³B¢<ä•…û˜rdýM¤°N U‘Z.ˆ†£;*Í(Ós/y<'Èê WЬvØ}ô¶FQÆK*-¡)u‚cË´L¢#GÄ9¿­£oÑVÿŠkàØháìÛŒ-“M(hiÕ“ÅË eñ¨^ÏÚQG¹¢ÆÊXý€±§™ê,Q¤ÌÔç’cÃåÔ¬So•ôü‡ðÿjÌ“dŠþµ{¼ÙI¬õ©¡^šS¢„:SË\sD€)v }‹ƒ÷G5‰k¨Ñ]}sÊ‘9+èöl*ÚËÜ@¨àÔ(}@­èüæö£ˇê‰"C8Ù\í¤Ž¤=ÏÜØ`óË8I’’ë’Kο?„HéôCˆû}?tq¿¯o}ûYk/’OLuðo÷ì+¬XI9€ç¾|ŠàŒª2Ê´c?84ó!‡Hvš`¬råÓ̦äÀOìuˆ§é–@Ë-é#?Ä»w ðÇç{ÔpüM‰nü¦äø¨aÕéåy·½‹Ïýºí]øàÅÙöþ–Y}‘ endstream endobj 597 0 obj << /Length 659 /Filter /FlateDecode >> stream xÚµ–ßoÚ0ÇßóWøÑ‘†ë8‰cúŒ®­V``´‡®ªÒÄ@4HX~¬Ú?'v¡lj¦ $.6çïùs±Ã` 0ød ¹quC=ÀPŸRð°1E˜xÀëD-ÀCðG·ƒÏÍñ"e?š†³!/¿jvÁç&Áp9âËùX;NGˇñD{•þwÓ‰ùÄï17~–Üð0b”1Ĉ‚ñø„A(»Ù}^+Ïp\¹Ž-Ÿ·`a|1°†Áˆ¸åci4£Ghuj!\£ ‘ ›= c _’d+wMœMfäy.ÖQ?GñÊ´\˜\_ïnýìnUí¾{uãºGQ0èÙÙŽ§ä©”va!T2¢•²~Ü[¿ÈjŸLÙ}*2ç*XƒíL†t0òêšÉjÃôÙÏòYý,§ü\t¨ÌVê'JüRĤ ñ$ùjÚúQÞlœ”ú¯U¥lw˜¬i·Â,v|“ ?̺Ã4- ÿÈ^êm:m0§i9E*Âî.g’*ÁKºmç",‚\ÎwöÓƒâ¥iÀÅÆïæí)“)¹K]B¯ Ú2Σ÷¡Ñ÷ Jî šªŠm]è¹iÉþ® ÒHÖá+¥Õ®»9×ò¹žìøÚ4|o»V­ä¸ˆR}…lrø7§×¼– endstream endobj 622 0 obj << /Length 1371 /Filter /FlateDecode >> stream xÚÕXYoÛF~ׯ Ð ¨6{ò0Š jÛµ”''0hj% ¡H•¤`äßg†³¤HIvâ¦iPó›SäÞÒãÞùèÍlôê,½ˆÅA ¼Ù 9‹‚À cÉáÍæÞ­ÿ†©ñD†‘}õîZÞ½ŸžÞÜÝØåªÈïVùb,¹_Ðù´.·iM÷7v1Ü·¥ÍS;þ8{;:þ PË=Ñ©‰"Ií¥ëÑíGîÍáì­Ç™Š#ﱡ\{Ú(f´‚ûÌ›Žþqg:gÒà-^œ#QpÄ‘@0¾óDâG{öüVRÜ’§Ó]x°ómfïêÏK|5‚ Ê {èã''k:I³±Ž|'¬óæÕ™1=©¡"¦ÂÀ,Á M«”$ÂAÍÝ*woÜ‹!aš%ÛÊ©€¶ç ÷&ʰ@éXb<œs¿q )  ‰OÈg€JF-8WGp ꯡTƒ‚‰üúl•ÙËdýIX¾ Øzü¯z¿!æ_V'_Rº“®„"€Ì™2Üï~Î,tW°©½»¦{êOß]£Oî0¢Áõ½)]þ\ö#X­¤»ø[çÕñZ0.‡„Ë×ÃVä– ¹Û¯v‹›C¢ûðÿh\» üduûPd`w•/ùLtøeËÀÔÐ*Jn¥€æ/iâ¾Ö endstream endobj 646 0 obj << /Length 993 /Filter /FlateDecode >> stream xÚÍWKsÛ6¾ëWàHÎÔ0 é›íH©3íJÔÉÎh’8áC¥¨ñôßwñ %*rSǮۃ Ø]ì~ûí"h…ú8ºŠGç GB0/#  ¢Xx(ÎЃsýëå}<žºg4+lÆ®OœK7"N¬þ]šÕYN‹˜‘9‰ùÜmec2ùH­´Ÿ°ÑÈèü¢ô‰SäßþÒlµkiTª¤´Kµ5’Ö 8³©«,¯VÖázפV¡È+p¼‡l3Æ ,»±ÜUé$*sÍʦpúq¤àð<qaàHÛtfq€s肘jolÜ„øó£Íœ4© …¾J3™™µµJµf ‡ÙzXxÊÛµ™eI›˜Ù²©K3³ C_±ñhÀ©cBA°>Å„³=—¨åÒ$—EG¤:Ý•²j“ï¨tÂú³ÄÒÆ{ª¦nଓFY;Ÿ0E FµO~ˆ=¶Ö|˜Ø ÆE's÷ùž.æ³ñtar³P¤ê‹‹r\e¨‰[E ¿©‚3α'¸u™Öum½ìRdŽé§’ÖѯK«<ÎÓ^»¨·½Þ¦q=â$«2y.cL}2,~Ú§lWmóUÕ•ÿPù *Ä{AcPe®”¿»ò«®çSà¨è›­¥î^ï_‚ý4ôŸÁ_ D‘¼ ‡ øï]a³6QMG8íOZW:ŒDNQ§öQ_Ýõ¢.khå> œ[)³­ÙU]”Ó_ÕwO<õÑßKZrmEÚ?72…´h¼µ˜Î‡š­d%mûLŸ»´äÝýåô†b¡}<ºöFΓJjm¬ÓÛ^Ô®"Nç%é/! ÏëšM½‘ÕÛÕyí ò¿è9o‹‡x-ÿmëy5‡XïÝzöϱ7ºß“þfq=|«Â§y«v5J}xêwÏfk)<– ìýù<VbwM3Réh»ÃO¤Ï˜.ŠZ©>õ‰4ábØ<ƒ0 Q‘åð#¥|ø¢;Õò8Φ.7t¡€Y®7ìÎë#Cf<õ‰ ·üBúþgžµäs,„å óÀÁoá• endstream endobj 665 0 obj << /Length 949 /Filter /FlateDecode >> stream xÚµVÛnÛ8}ÏWØ X1$%Þ€¢@Ú4A(¤~K A•h[¨#½»Ý¯ß¡HI¶|i¶O¤ÄáðÌ™™Câ`ààþ ÷#¢ÌNípõfvu}'y@$bŠ“`6F’ó€ ŽaÁ¬ žÂ›ÍF×eõoS*÷ÑçÙ_GJQ‚%µ^p3…ÒÔí¿«VÚí½]Û]›ÜTëúˆŸã0Fбˆ:ï\ ”8ïo‰b‚1×›¼©hÖèxϪz®ÑÒ=¢xÔóH„ºÑu¡ˆ3Çb$€l’¢„)wîmnrçï“i¶…Ù6ºÝ÷æÇë;Ɖç‰uC€Y)‚˜Ä,[Ö×3¥looð3ÆÃÖ4 Á½_Æ kc'!2üøpóøžfà†è ä(¢™”€ s%,2H UI“1.²Ù²j£îˆ],þÇÚ†ÜÍóÕÊMúsÁ–²ðÅ%º[éGÕÍ]ªZ›'tª¬v2' a ƒD)Ó?À­69d¹ôŦۢ©6c©í…î¬1KlÊMèlý#É SË šúîùdr #Å¡é€AÔ³ˆPnµûú`—íJÀ˜¤'É» ög¥ âDôdPOÅfý²¡ÙªúrAùOb±õ-}X ÏÓ•G_¬¡›«Ú¯˜¥ÿ]êbqvà—×óIµ<|üðàKa¾­ ³W ×w  àоýv[æª.VÛR;Ë„ìX² %aCgøêˆ/DªzƒÖ”¥žO‡žR$%½áë#ž€mAQ‚c¿\U›÷½þÀ2 úÉ}b£T†ß6H¸\ÀÈy3ίKñßHº*},é.+ øácKNèÝ \bØæEÐ+à2¯ËÕ%úKh.ż¼ø«k¨Ê_¬ì»\œ–õ®?²›¶­¨ûaLÞò3쬟PMA׸ S®'±¤HÉÁƉ‰÷íùçÐû­¿ Še¯b…)²þª¨êÅL$ ?>²;¦ AœQ¨JŠ˜`çùr±9åÌÛ¯ûÙ=ÅÖm»×&«u[ÿÉÌÁîûÜ`ó¢8rSPà…º?û…Ó¹]XYu­›|¸¾X@ß& R ¯ ûFÒÍ9q&VFœ õ+Õw^Õ6k:;ûˆžãŽ,«ÜÛ—¬¿Ÿ/%ÊŠ5t“ÉÏwAë}]™ßh(iáJúˆRÌ‹ä'•jdÚ¾Y]¯Ð¬C¯›vú`¹¤4ßÍ®þ˜_át endstream endobj 593 0 obj << /Type /ObjStm /N 100 /First 873 /Length 2102 /Filter /FlateDecode >> stream xÚÍYÛnÇ}߯èÇäe¶«ª«º Èv˜ˆa‚R€$„@ÌÕ¢pŠœ¿Ï©áȦ¤gL­ <3³[sºn}út¯ 1P”.9”4×@BA >ÊŠg LÏØRPµ 0Õ‚«2žsj;-(Ï%$¼«ŽÅެ »RƒÞ3 †?­1ähxæïU ¹b<ŒQ¤î´2ÜŽI¨ŽSb¨ŽS ®^¬%¾©ð˜ _™âþYDT1ìH’âÂM¬å@IŸ0n²;ex…<¿¡@£ˆOSO ãXÄÙò(#FC TDvšShÈUvðV5÷§ŽÔœp£x‘rD†™s­øJŠ»Q«{ˆØrÙÁ¦ /† %Â#  Ȕ‚$Á ¤A y2B] Ý';Åè7¨üÀX(´ ŽÆ µbdC½ôYð‰†¤0T8—¼&Æ’‡¢/™Â1 y‰$^2ÆKE2®(:{A7™w&1¤ _ ½”*2aŒø#2j¨‡{8›}¬„dÁÜÆó<ãA3%òñ0(Í=ˆÆ0ñæCçZòÚ³á7æoy…“¹TÈ: yÄâãyÆ<B³™x"üŸz´%Ù±Ü1¤Hþ‡'ý`ò¯ÐëáÍhÞpÙ«Œ™`•|ЂÖFãûàîÙ³Ýþûp©(o aÿ÷ü¦MÁ[%RSQÿë»7o^í¾ùæ¨m޳mÎÔDø·É¸(õS¬×þd¶TKãó×pÙæ/êÖ ?5e“fž² ¹C¶·àb&5õzÔVE@_¥BM’M¸ÉR#y%Áœ­A7£ƒš¸æÃ‚+U›šÊ:.&¦~B¢·UY87NsGT³Ñ ´­%Xkv[FykÆ57yÍ‹˜jlr^iFéH|Í‚u[툹pÁãÀ„Ú‘½çÛ³Ãõmxö,ìϰœ0ò5¿uæK"øêþ´Éh©û°€]üûó›Cÿb¼ —aþýYØ¿¹ ¿¢¿üïÛ_´?»ýwi¼¾}‚›±vû‹ñÝáî¦ßÍ‹ÈüÑãðºýöðK¸ŒÁWRmP¿P ¾Âhí ÐÜe6oµí|ôÐvÚRÑ –&SÚL„­Øz;7kc¼ +Eú»tªÆ|±M¸P é0+êQ+H†6§ÊM4ZK8ݕđ¼ Ô\-¯#P"Þåc¼xj«)YÖr B„°cÌpJÛš3ƒ Êã¶Iݘ]R5q­ ¿ÒLm\Ò<ÞÅXr"æ6´#ò¶  /y­‰h!ÖߢDF8 ;¥§¹Url&i¤:mí§¢R2µlc’¿€ûU¥üæ=¢aµ§yßšÕ¨E™¬ÍØ­‘l”ó4 iäz±ó uê§AÌ`sõªÜ${gŽÙ¦4€+ã$I:K½i¢ÎÊ8Y´øÚÞÀ9h¦ÔDè—ìšù‰]“x°8¶p<òÔµuè©S ÖïsmÛñ¡óF~¶uCòíʆä[&Ä…p1£·£šu óËO– ýhp °ùzTV¢c(êç©Ø’ð¶LøŽ$UZÇM~ ‡U%WÞìå8²Ï>f+PÖ)Ú6Ûž¶Ùºhö3º-¶h9Ýþ}V#ÒûoÈ·<Ÿ%À“}"ÀSú<îG«³p^bóƒÕ è{]ˆÝ|ã:u‘…LWÿ_ËBQjü×Á¢’•¡ü+Ä5Asƒú$}méOÐGÉ"€wØBæeäߟÑYuéÏM¬úÐvUÙBgciÝdk†ðäd¦ïq±É„Ôß6ªXÜVB[NqUüœ`[ÔO¥¬ãú)n‚kZ6ûGbYŽàh)r|!: ™Þ¨®/ ‘ ÅÇyŽ3RlGN¥>ö•ˆ‘ãªy0rœ™¿úɬ™~Âß&ŸÉߺ€èr¢e¹.¼nËŠ-*Ƨäw‚Dÿ°¢Þ" $(›eñWÒ¯F“¤Üø¡~0é?Šª€òÜ X*ãÉ7¯»y©)íhPÔ4–”úv %ZW¤v9šõ„¾’Ì4ä>G? ˆ¥opV·øšúqÀĈö‹©ï°VS[º:ä6v§Ü´€(êüymlžÝâ?}ƒkbÞæªö¥•,¬ÈÐEéËÐKÄv\Rô½«ÿõè± endstream endobj 679 0 obj << /Length 1264 /Filter /FlateDecode >> stream xÚ­WKs£8¾ûWp„ªEÑ„8f2yMmb¯—=eR.²M­Á“Éþúm!acg2™\,Z꯻¿~€­……­ëѧhtvÅK sfEs‹ñêYAH'V”ZöÅÍù$ºœ:. „}ôzuûç¥Þ}_üswy9!¶ÏÕOt;¾w£/£ËhômD@¶ˆ`$8·!I>zxÄV ï¾X±PXÏ­dny>C¾Ç`¿²þý5Â-FÔW[µì‚[£À¹ß©àá-xDq\‚1¶?Ë:ÎV2ÜpË*)³M­‹m§æìÊ÷÷<‚-—Q„…¹/Zf•¶û+Æt%õ>YpuaÞÔKó8•É*.‚íX©1¯×s½Æ«•ÞLÆwª·ó¦H´(ñm¤qõÌ>´ày±`g-5ÖFŽ'ì—LåܼNš\ÐÉGTœt@«bëÒz_Áw‡zö:KÕÝgW̳B¸„êÐø(àÜÕÞ®cZ¨G¾a62ãÉùô–Φrhg˸HÁÙ¯ÄÉaëM{ª‹ÊZ¯Y >Èæ/úßx#‹»‰Þ—­.ãz—yøPl›ƒ±{°Ñomlå*¶ÍªÎ6ŒCB}Ú˜·—‡;×3ãø+C”-Û†vÍVCËÑÙyUe‹­틯ØÇŽëù܈ l<`¥ q0¤Áì€ ~'´YçºÕ .ÿCéã DHw²ª5ÀÄ ì%dá%,DdÇʤNfU]fÅâ”ß~<¢Å" ¶Cï“WIɰVÐò¢”q­Ü' ÏnŠì[cåñf ôŸ'Y?+’IY4bï~ð0<°Ðû¶º¡=ÐäAiô¶^‡j-ºbŽ,&k&9Ć@º©T…®é1õT z"LCÝ~ˆØ.B*Ã8¶?mýÉõ¬R/. –z ´sU)¦“L¯GÖC{h26cGaÀDËjÂ]„Iå‹tøÝln‚és3+0~¨øò±ÖÖ endstream endobj 708 0 obj << /Length 1471 /Filter /FlateDecode >> stream xÚíX[oÛ6~÷¯Ú¨’"E©lI]¤Cš,ñ[ŠÌÄÂlÉ“åý÷;¼É’,;na Ð'Ó¼s¾ó …½{Ÿ¿OgãPxŠÃ0ð&ÏžÀ( COÄ…ě̼{ÿÑ¿*–+:-åKVäÓ,RìhnÇÙBšÑ­|ìËRæ©>N¾ >MHÄ©%DŠ(óÒåàþ{3XûâaÄ‘÷ªw.=ÆÄYã…w7øs€­ÖQ®†êÇÚ…=6„á­ÁmÃÁûÿ )ó‹l ÓÈ¿¹¾º¡ÓË<«¬qk3ÿ€9ŽûÈ©y¢ír 9oÈÇÞ(À(ÆV´ºØ “,fp}óÛí%¥¥L*93sN4á>R·«kA1\­¯™Ì¾Qägùº*Áîo–2¯ŠRMÇþ:M´â‘“s;rôñt±™I³ácºöØkVÍÍt¾´åöЋòh)Wk³^9],t_/'ÓÍ&›Msµo³¼5¶(X]sž7yZÁ&c| *[ÓGcÖXÑo,LƒöäL*rmƒYXÛ£N‚]yRtý¶—å/¯8#WÎ%ÛœS:ÜÓÄ#Å„pëy"ÂY#r4ávB.4¡CëС&tD3r0Œ¡SG Œd˜XšqZäU’åz…ú Ò¯!W3™.’R™œX”Ô!íq5¨aO+»ô:ÏÒ¹Îa›£¬ (Ïp¹½ŒúFñ¯W2¿º1ã.Í&+”/6=Ü~x÷#AË-µçl^ˆbDÊzÆâ1‡íÚṵ́݅»BÄ#êöŒÌ†ˆÙ!Ú¼¼ÝúHYÕò(¦9iµY;¢T…ù]AåûÚ’ý²r¬´œ~²µ7Nˆ OÅX»¿Jﬗj2[–ïv÷5_BèúFÏfØ6l7þ:ÇØ‹DZ&ÒÒmdÐ{_g—Xÿ®X%eÖä=pþ]_6¨Ï?’†(Š‚uä/=:$Xì6¬«ÙSQ, ¶Þºê×½‘à±>Jr0î8D9·ý"©°€#Ȧ„ôÓkOØ’‰HXÄ„e/¥¼K2%§‡½iÄdî®bQŠá0J1J°–¡B­•Tâ–*v¢Pë±ÎžjÐÇr³â~û»M±Mà£þ"ûKÑWš%]d¶{ìä·•U‚ÔoZ” Ìª€ÄELh‹M™Úꥋ7Hº¸8Bæq§"ýHðŒœþèÞM&Þ]þpi¦;(“ Uµ*‹åü€Ž¡{#AfXÔŒ‚å*IK]®NNñ÷®vFü|r>ŽO'×€¹Ÿ¾Þµõx#~­>M‹>åPd¡(m&>±YÒ6AÇ„í…ÔÄI6`Ù¢º›'µ»¦šé}ªiÞR±Ó©¡Y *äGH%§{—B$¶YÈÁßïØqݯإÐÿsÝÿWjÓZÙ¡/+¨ŒÚÚµš»—Ýà ýLJ4Moî)PY£"RxçÁDÝIá §Qb(ÞvRe7áu’݈Ɣǖã€}.¥Ô¦Ý*º4å_Éå“,×ûÝ{í =fâ¨ÈñPAŠitT8wIbº›¦†pô¾]{Ìïè,5ôCeæ²R;%M†D5—+I›mçBÑ/c7Ø;ßÒ©^#ÆÄqDü/á5¬;)š–ÈûÀ+ÛÿGX©¡êÃIÑr—îÅkÝ•ºEìpU!¢€D«*£ûàB“ܼèàõp!×i™­Mç1ß“Þ~í“Æ×•ŸOýŸOýîkEuzG<õµb]v†aý4–Çt_ðâdêÁ oPfÝqW%úIçןDÇCÆ}«½™¹ríÅæ—„ü‘q7‹ã–ô¾/Ï\ `Ëw|wÞýJÎá¡Ì‚v‚áÖò@t%ÿ CÉË3 endstream endobj 729 0 obj << /Length 1471 /Filter /FlateDecode >> stream xÚµX[oÛ6~÷¯° ¨YRÔuo›¬é–ËwÀ†,ÑŽVYt))Yöëwx‘,ù¬FõbÒy.ß¹|¤°µ¶°õëä—ùäíeZŠƒ€Zó•Eƒ×³ÂØE±æ™õhÏ>¼»›_Ü;S7ŒìÒãåÕïzöþvöéúâfîÄØ~'æW·7ΗùÇÉÅ|òmB@¶ˆbFŠ@Aº™<~ÁVï>ZÑ8²^ÔÊåùù…ya=Lþ˜`c-F®/§r0¶GE0 ý8Æ·*‚pg<¢Èu¦cl_'©pˆos0ÜÃÙgŒÝ2¯s^š'UL,Ö‚7Û±4HôóÕH‚S^ɶbcÕT Ñ­ŸK²j$š²ÎY¦7ú~r¦$@! ;bDü¸Û©‰~îÛü«¿¬¬4 òb…h„î#5´xQ:¡ d+’ýÎ/²_·ì‡qÐÓÙ‘1ÓZµë¶õ=ä´Eõ rïD³¨¥iC¢gd h»Öþ|5×cUsÑ>z2 4‡½ƒ6ýàÙq}Åöæ}R'f7Îø6Xt*0h€ñú`¸gqÏÖ‡ó@8!á»-§gYþ:ÛºÕDC'20úE·‹¯ôhb¨bÍ…þó"ã:¦_ÑU¯Sèñ5°àyÕæÀ.›2ã˜ëu• ëÙ<Ï´†´NjY4®úU¹ê¼?c;SÏ´wf „Tz¯bJ0í)&!A~´Qí„?‚îÈ·¿¼9’ž‡|ß;šÂ9#™i®žÃ.WAc„½¨ÝçvzÌža·³Ftîd`£1Šv–€ïdï/oGbm®I÷‡Iá>„ýhˆ¾¡Í•Ì2µ$ÀЬÇ)…T“—‘¢¨õGæ®^³o„Y}5NÄâØæË¿áD¢¥¾äõ“žé¾%g’Ïôl%øf§]M†ÎÀ Óó°}E#%ŸXep¦ˆH&'!(ä4-òº­ŸÍ¶x5¥¦ìÖì–¥¹„$MôAsøz+øZÖ§?ÉÆTñR–+XXWûr™Ä矼Ó9µFRè¿$ÒFÞ+IÑ]éŽÁó½3cM©Ë0ÃØT,Ó³¬é(—ÈûoRäÿ–Ïd»’£F&–T`²gèÕkU³ ʇ]™å‰Ù΄QêÚ~Ð4’ A`®4ÚWüTL endstream endobj 741 0 obj << /Length 1933 /Filter /FlateDecode >> stream xÚÍZYoÛF~ׯ`ó$Õfï#@ ¤i$@ÒÔÖ›´´²ÕêpHª…ÿ}g¹ËSÔ} )r93;Ç7߬ƒ£ûGo¿ŽÏßHid¤dÑx)Œ´”‘2I§ÑÍð5bñˆ*=|\/émjïçëÕí|5‹)®Ñƒùf¾°þîÊÎb‚‡6µ«‰¿Œß~¾hÄ©4h4åÑd9¸ù‚£)¼{aÄŒŽþ-V.#.œÁý"ºü9ÀÁjŒ¨p·îö eÏ$ìA¿‰O1åÃ$M–6·iLÈ0+,+EöZ(8"z¿QÆ+"ÂRDÒpD±Ø'G ¥dáw£»!ÄmTGŠ  õÛ™ä“ëpv?4 ŒJ¿[…wÛ(Ô|ƘùU-“82š–kþvyhÝ?O/ÿ‰AM²ØØÑ#\ëäJûM¯è/}²ÂôÑÏP<’R Ç¥Ÿ‚GŠ{@íbêÌ3ïÙÇ$ÍlxvçLÚg®Ö¹Ó¨ó3шdÊÄßø8õ=¹{á)ÄÂÓùòqa—v•'9”5X%˜€j´,›߸ÂvK+„O«Ð:‰ Wù·I>[̳ÜÛ@|zÀ3ÈßqL~øïV’ÇýÞ+°.k'9x¯µ¹¥šMæ%„ëÂ&å£É6V(%ûáem?!!aIk#™¢ÁÍ• q¨¨G†ã§GÛñPXaéÏ=ÒbB• ²l²è‘B%ª–$«iŸM®f*=v‡† ©òÍ9ï 4¸ á(ŸXF"mDÛ÷µ÷ Þc¬•Û†B™ÃŽò€·ª]ã“ ä»dŠÉ°È'øY„ôQEJ¼¬‘NX‡tb´Œ@Fù°Ç¯š"¢ÌáøhCêMeAõ¶< Eêqru}GoK¿¸™»®ÉÎûr“)Dxå³g3hÉ+èx/ó•ý¸&áJŸõh%B NT[-EPX}FCÙê«NÆò²Æª Ò‚ì7#dëÎÆŠ¡Ÿù‘¶Ît3'ß­|Rìi¬çÐÛX[ÔæÂ|8Uâ/! æSÿs}÷—ä;Cu²‰Û¡RÐ3CUË ‚"ãD¢'†2-y”ù:Ëø§s×ÑZ4¯¼v+˜‚ÿ¡Þ4Â< Û«€ÐKÜmqî&µ_7óÔ† $yÙ£BW.Kô38³6à<’Þ×\½D7Å¢O|øDo¯jN]¥]ikA( ÊÒ`CfsÔ×_-!7ÀÜÔß.íòΦÁªõÌW« i·§5k Ëd(ÂF¶°9Ø<µöW\ú«„DÀ6îñ6Yd¶÷­wÈÇõm6y°Ó ´$À6Jb˜´wünÖƒ„ q¥¶ûÌË êî³>$ ¥ú(HVg„îÅ‹åÇÍòº¡¦Èⳇ$ë«éв’fàûªj˜¿ô™ +j¾Œƒ§Ì.Xè <5I¡|&Éâ{zêu(œBÑGèT}þZ&nùSœçj¬p™ÝáÅâçO/CúFÖ’ŠŒÐ£xŒ¯ª¦^­ ĸÐȇëw©ÎRk‹=]U•ÛX(êÌ—Å:‡Þ­›H¸UM"[Þ¡UÕµf ó ×ÛCÁ¬‰‰0ˆÈíJ®e¶öÎ ´ˆÆL8Ó Á5Á)Cj Áa|sšl%u vXŧ‹£-œiaUYôûCà¢={Èç@Fø¡cˆd„M¤ê›pH¬KÎw,9O/ié·5oªÄø’¡¸š˜î¤'›¸(€ÕEL„;6£Nb3G2`oˆJÓDˆHA &±K{J[a®ç¢º´Ûº ²«]œÅMí,Ù,òk ò8æÚ ?ô:O‹ó˜}C ­é¾‡ ßZânój0k# ¡«¸ú¶k„,&°>ûa˜Òòh¬á|KukÀ›utáx˜‡v vÄ"ØRT3a˜›Veâ†ÆÑ9aøÞxÃ4†B»n˜H¼¾˜öwÂÒHró"Ô” Uûü²•Ez¤Rf‘Êz*þŒyÈ0†‹ÀÆúˆnÔÃ9GÀ"xç°ªÖN°;o÷½`×Ú~vÇåQþúsž¼‹íD l¿„ƒ€È`è7ä{ŽfŒºƒQæ]|eóMÚ!ÅÇOd­£fß•av(O.wpŒƒÑ f–VÄ‚ç™ô¢gË‚Uü¶`yºÕ[ás"”Ö¡¥“ÁÌwK"]lÍE`É/K¼ððtpÔMp?¯ ‰Å)ÑIä+Ä:ÜDdíf¾P|’TãrÖøf\ p‘QÇÃ¥›% <\’ƒpYž“ ˜{ÐJ\ÓSþ4¿ý  åâþh,Ã@ÉLWóI±ê endstream endobj 672 0 obj << /Type /ObjStm /N 100 /First 884 /Length 2360 /Filter /FlateDecode >> stream xÚÍZÛn¹}Ÿ¯àcòÂ!«X¬"`,°»†“YÄXû!‰a}›G2dØü}Nõ´ÉË-y, À¾T³‹U§.=µ¦B­9dõ‘kŒkÄADðOAZù†Z÷1š†Ì9(þ™RP•Mf –î[°êr-´T1rh‚yÕBN†ʘŒ2f)˜¥\ÁTXL„Ë8жÉxc6ò§pËæw[s€ 2Þ˜ V£@É1jƹ°r¤%ù ®Ô€—·MI~à@!Gœ2`êWLq•¤øôóù_ßœþ{³ýéì|œÎ_¹c¦×Û?oÿ²ýùUžO6Û_§á"¼‚ÍEÅZ­E·×’#™O+„~ Ož„í‹°ýÓÙ˳°}þðîì?ïèääí›þÄþuÒ ¬¦¼ÓÚÃäI›v4Ô 'Ýîá‡6ø;R*Ñ]-18d‹ g™¯A𧉗Îtœd×ó”KßO;ØÇnH»2©(´÷Ôˆ} ¤Í-Í먵À-û©¤)CO]MVð?Õ^²]¹õixUá))ü¶ÿÇ?áIѪ{DŽM[8ýðöíëÏÉjšeUsLð«5²¢s©Ç—¥í¬ÃP*E§Ð5²0‘È+çeK‘AÖkdIR—¬AG9Ü}vvz1›Á3sæ—ýSÏ@…¶ØŸx(È—'x™ü™Êrù ®2¨f‚"‡ŸàMÛççgË 6¶ÏŸ> Û—ÓïáõM3Þý6m¶?ÐtzñVÛüq7æ÷g·éýÁæK¿Lã›î§³ßÃlþpðH\Ö°Ã~ÞcŠP™öâ³½ÇËÝo’ÇèyÔýøú8'0vA ’L±^…$:· 1®Û—+Ã4"º¥¾ ­ÀçyYômÔ.õt&‘¯‘mˆûž>6Š)ÕUó­Øùux†myݼ ²ˆLw•,%àåu²È£'ñ«ìa?|†£¯±êm„}ƒ‰sòŒ—q9L®Wôíé}ýÆÖd3¶§Ò_ÉØ{|^¡ì». nËØöcK˸È5ZÆ…ñÛÂøM–q™§é2.óµý|^“ìǼŒ´Œ¼ŒeÁU—s9f$)HÒ²£Ò!¤#tI*3ÌN’Þû‹óÃÅó¿ýòÔ÷ëôÛ›³Ó““7§»³cÇ  ±xÐÈÈ•¼#ð¶ï %-Œ¨\Á*&±»Ö ίš#ÅØÙn˜š%6éÇ¡J³Î¬õõZ;bPså1JF Ž&ðk0Uä é97eföü| î&p!ÂzHCô3{¬ª$ð+¸´@u%)åu|ÉÕÊPVû²ÊJŸSi½šum7 šÇ :®T°ŠŒÊ— ùä%½xò˜ï„ºqo½îƼ|ˆ¥i—'ê4ù í ö:©yù‹º&y‹ ¤Ý uµÔiÉ4µ±º]7†°ízíÙò7@LÒÛJ”½2öU`¼›´–òP¸»œÒ8hKÜw©NZ;=&h¤†ˆ$ž" ê7‹â-@”(©39A¡{‰š½ÝV¾ õCðÚ¥2Ùbsxð:õögiQ¸ÞI™L6Ø8rx»©vmHZw­¥©ã:Ô#*³T°p¾BÍ VžûcŸGýʬì0@¼Pl@Å&ˆ¸ÝM™c2©ƒržª®àRÅ:0Á0&pLD€Ã£ÆÕ+Ô%¡*g¹ê$ÜK]ÀIyö+oë1ò¹ê’™JWóˆ¬Xe7ìÊØ’t4öL]î刺–ï§+Ô\xÏ÷@ý€aâR× ™$JBñHþõ%#“Ìw‹Ò!o7«Y )DªÃöã~áŽ6 刺®Œ fW¨‘úÄ‚ü÷>¨.º]V8™löÂË ÇМõûV8y‚ØU“‘&äJß»ÀYP]Ö7·¡:Fð4¼ò/…k;a7d¿Ð »![À ’›÷ "ɪy«)TPWÉ‚(b=Ð"?$ ·‰þAs,Ç\Öáõ¤¨è°’õnä¿¶ô™ÖÎm ü›½¡ÿ÷îÛ¢Oøþqò«ÚAþ!vn·ÐÒ†¡¥ CK›ˆê1Û0{6 X<7››äÊL¬íÑÃnjjW  <[ç¢ø³ $ýFIîì.0nì•w;`]¹Öhé±–2Ð$µÀ5nVþΡÍïcÝýŠ˜à?VT7ð턢˸âß¿YãDFë?™ÜýR 8$+È!]Vü»ÒÏ®‡d L¥OÖëÑâ=+õ–iÝÄžàU¹]vþ²ç¦Pýd^51#®²nuȱºu&ß,÷—]oÆ·ëaðF€¼ùY䯓kq𾡯äOB·»„>-úqè[ðé²ÿÏCqÙÿX„»:µÿL@é»åãÄâ=Üù% l\š„šÅÌr7X¨%yûN<šp—QÓŒÊÿÒ! êvXîñK㹯êŸãpM^ç»/S‘*SiÀ.å1%ízTÕZÛ®jý„KZÏÇ×e/¹ÐCÆ¡Dø¬z½)«d‹lß: EZ¬\WÉRSÄ•²`¬|¨ 8 ›ÙYóšìÿð€xD endstream endobj 762 0 obj << /Length 1403 /Filter /FlateDecode >> stream xÚÍXÛnÛ8}÷WبY’âMÀb4MÚMíuݧ40›vȲג»è~ýEÊÖ-Nœfy‰h…š93sf8Cì-=ì}è½›ôÞ^ é) x“…‰ež )ě̽ÿüãÙhr1î¨Tþ9²ÏË«Ïvõ~xþíúâˤbÿÌü™\ ¿ôo'Ÿz“Þ_=š°G<‰‘“J! f«ÞÍ-öæð¿OFA¨¼¿‹+ñqÀ:ñ¾öþìa‡#ÊÍÒ<v%*ØK  sn±ú”ùÑ6Zé\oû„øY¬Ù‰3DÔq€ Ñ€íVD„÷$£Ê#2`7A!À´"¬5ªbMˆ(ˆâj­Éf÷z¾Kô¤O(öntÛÍ„Ęz.øu€@¸D‚ò:†É½¶qoƒ)^çkû¼s¿gë´ÿÿѧ܇ ös=Gm䜂ægàn ˜xf2=‰§Ò”`$Eh:Öùn›Ö¹Y>A¡An ˆB˜9’g9ø•p?N—Öç[½ÙêL§y”ÇàþâÝzáâópü í5ôtBQH7ÊN; …±å1ÐŽ1ö7ëÕ†Nw™ÞN“ø݃ •"N´]õ¢/:éš© ±7€X”Œ‹3 ù;Æ49ð*â4kX5׳$‚LÇ~a{V7>J» ¯GÔ.»tf·‚ ^¾½ ± ‘…C ¢Ô•Ãßât–ìæÚî He'. Ávãï²$’,,7dù|®à§¶$&Â¤ÜøG‡$pyˆ¡`a³áåÁÅiþTp¼‚ó°–c„‰;é3eˆNxõ‰@RÉz4¾SÊkßz7Î…Ÿ[¹6ÄEñYÇsg «zE!Y$±•†qङb°]ºª0na‘ˆÉýgÃÑÙøŠNÇz <šÞGé<©üï(Ȱë!©é/÷¬ìrÌÁAµÓ›ÀÉ%ƒºƒ‚ W,M®ú:ÕÛʰ+Õ¦@ÿl$¤V¾Ý­ ˆ@Õ>’¬ÄÐ* ÁŽ%‹ÿ1I¦§ùN†}TJ›Óo_/ÆÓ:Ÿ¦&w«é¶ðoÖ”l+Çe”aMê{°! ôÇÑUYò$lWiœÿ:¨Gˆ u.Ëû…êÙ}´í¢0ä¿ ~‘ÂÖ,ãíõ&rÇ ºS;3§ÈÉx­ˆ|š™§8ÿ2N£ÄQé?óû)€ ^ábñ²c˜¾ o¼ƒÔ|I%[u»‘`ÔÔ6EšÖH'†ÂÃÛ 9‰ÀÓ7û¦Å&³²ÉlWùlZián`¡¸Û‘Pà(²ôå=u‘Î_ÂOæ,Àü ~¢]~ê2Ú\¡^®„ÀtZ±ç,Ëâeçy]ì%'Û¯RÏ·¿äIÈö< Ž'fŒö— ÆÆâÕªh“<Þ”LÈËá¢ê‡91¸ó{Ùb¿tdƒ}d÷Á,4TO·â…©SýƒxRµ–PSE› ðÎre‰7ö“š%0R‘}©)+ œÁð¿ï`ëJ‚‘#ÝX©9ZXUºÞÆÙÑ$¤¹ØT5œ Y_AQÞ¨wοÕ"a憣¬)¦ð¤¥ŒJí°ôEÞ6r3KŸrÚ¾³u’Ì%pì´G@Uñ¿ë&@‘ endstream endobj 781 0 obj << /Length 1023 /Filter /FlateDecode >> stream xÚÍXÛnÛ8}÷WØ X³¼“zÌn“"I]ïSŒ-;lÚ•Ôè×ïH¢eÉR_`Ÿt!5sfÎÌáØ-AŸn”FGJq4ž#M°Q éˆaEÑx†‚¿±‡L›`³^mØäG§“eò„Ÿ«·7É2®îFñ<¤$ˆÓØMãðqüyp=|PpE­Mƒ hº<<4ƒµÏˆ`ô«Ü¹BBr,‡û%ú:ø2 .ÁL·ÅŃ7ª¼ðRVèïC&›ÚUœÇiHi•ȶ&{J©9 Ð`ÆE °a‚b¢$Ò‚a(Ø€ÝG³2QEcÑ Ë˜’@«¢©(x¶n¶ìÉ0• aÎõO;ïTj¬˜l»?{ª=‚ò~=¯®ùv1Ëm òxV½IãE²v¸‹X2ðxÞ.g‚BU©ËHcVš]D% k4çP¤¦ÊÚ4ŸN²RBe¸ÅÞÎÐÏ[ÁÕ–˜ˆòÅtír›¸ú¹¦°"¬ºŸÙܾLÝÉ»Ô ¡ù™Ôíl-N±q¤˜(…%j%ÄUÈ!!$øY(Ë:)Jœ™àþîŸ{6¹vþñ‘z@*¿ðï×ëÑdTfµÑ¾nP.¡rÁ%ƒD‘"²ÒÛ7Bxµ‰ÞVö 鄽 $hˆV;‹’¶Ôo¯v€n(rZn£¶Ëå¶‘m¾W(O’k뀭.Å9á (†P˜ÛÚ(ÒÕ…6{qÀ&0c狺¢3#/E$¦œ¾…ª+b°¦æU?Ó{¯:´Ü¿“ªŸŽ·K8âì"i(lHÎßA$$“EQSøm¸Iœ]&¿Ã¡ â}‘ØíWF¼Ú§¤Ý [àìq¶ÇZ£ÙìÌnŠv‘$Àá ÜúnNüW‰+{¶Éq§áÿؤÅg+»› ëÏýîØÍŽkjA ±h3ƒÂgަÒ¤ij(Í´G0U„uÄ»‚Ùf«©—Ÿâ|²ÞØ4a“Ÿ^@ªãîR†Za-UQã…jç? ”Ûgæîþjtë©OÀ]šíİwâíæC!KÕðåÚJøVÆ0Œ×Cj0¾ˆºÃ«T½E |²Öi)tÄ­Kò7í„Â`ò?ë…ò„<·ÔìÝÍço“<_«“Ì>…ŒË£3wtP͘ô¡˜Ü›†tíÞ-¢Mæ@Håäw•eÉ¢žü.˜5‡Q3"ªÞpö ŠSm?yI|Û^x„©ª±ø_9 àÅÈà±Ç ü˜Ô†= VÌ£ªÝäEŽ2 ,k›©Ò¯ºzXÙWbÛÝí“â_(áð7ì”1º¶H*@5£"+JùtßóX° endstream endobj 806 0 obj << /Length 1503 /Filter /FlateDecode >> stream xÚÝX[oÛ6~÷¯Ö˜Y’"E d©“º[“ÌqžšÂPd&fKž$/è~ýÅ#Ùò-—öi/&Å˹}çFSïÁ£Þyï·IïýY¨¹ð„ ˆÌçÞuïÏEi)áÒN퀲ëpCö†C¢Kéd¿êsáÇE¼0•)úŒùe-YCr¯„R¦ ¨ D+à Fh(=%8¡ åpš‘Ät$œ6zC-a;R€àN›e¾XòécœÍæf×ÂL2"„~+wøZsgR‘Ë.û±©V€.ý¬tØWÆMP¦z~ߨŸ['2ÓçÔšsŸ…yHKÀÄÌÖßyFvµ’¤zƒN»¸ ž~°<"¡âß,£!QÊSAެe“*™–˜ŒI?ÍŽ`û6öc»)Á‰ƒaSˆz!ɳ*N³ö»ÅÓææ³¸ŠC÷j‘w¡Bo„nMƒ*ñ/L8¡é(&œS"H@"0"¥Ô/Óûí›i†âÚ¿ºü|ŧ7×ÃñôÜTÓ¬¯üÕbêLYº#·TÒþ@ÈÐÿÇæ®<… µ°ë¬“»¶P¥Þð ){6V³>£ÀöÎ`ˆæ÷nL³ýÕÂdU72Ë>¬×[NWÍiRÓÕ»÷-yùe×"À‰x>wk—W'ã$…‰Ÿúz2_ÍŒ;pK)Ÿ¼ö”Vn9[ ¡ /=X] ³,Ý~ÕÈâ =ºM¦«U:›¢Îc§‹µqcÏmuîWYRµž€È¨ú ÂÿËíKÌsN¦H ƒÆ?R«©T;—M%Å £Ã×Ì$ó>ƒFÕê7¦‚ ;LZÛ'Uéè==¦É£Ûl»/˜[mšþKú‹51йYåÝJ2)v“‘­ Å–ÒñyÏûñ4±j½? /$‘ ´µ…‚ÈHÂùÚ·TP> stream xÚ­XYsÛF ~ׯàL_¨™h³7ɾµ‰q:9j+'ã¡©•ÄV$UIÝ__ìÁS²"§~Dî‹À,±·ñ°÷föëröòR^ˆ")™·\{F¡”^Q$‰·\y·þ+$æ „þ¾Èöô®©TyWªMZäwi¾žSìhkW\¦;e¥kµžì«R剚Y¾],gϘÅéÌ„! )÷’lvû{+x÷ÖÈE¡÷ͬÌ<.œ¼ónf¿Ï°;:FThQÿ8GBéŒÉ¡'’ ܺrÙäI ¯Ì‰:Uî÷å¥(ˆDAx ÊáŒvÿgJÅh«w»Bú_çTøEºrï´‡åÆ¹zmViL’:¹©Ëù‚?Í7ô9'€”†ò d€äT»Þ÷ œÀ¡k m²Ëù…· „ÒÿòâÔ)ÿã‡wéݧ›‹ë»ë>ж_^2îE5h2N‘^Y 0fzù2Ž¢´kÊ‘cà;·`\"¡]Š"ñ,¯K¥ŒƒÜk@wt†w*»WeõƪþAÌh™#ÃgÅŒF yä0#§1›&1>:¢ ( Øô„G@˜:@<àí6à psúåœ'<ì$çs`^ƒÎczʱÙµELùaHDŒ§ Þq"pfŒ±ÿZÕ1ðÙ ¤!ü«’2Ýkö˜Ä| †´&(lõ-·iû¹ÔØRCŽ\踀êܽY;R²ÿV:i“D è3¶de^ÄùÊ •CµIêÊêû¶M“­}¹…eÖŒôÛÕl!ü¬W…ä¬i2·OVJŸ0WΈŴšƒôxÉ1ÆÚ8¹äbžÔšÌæ‰HôÙű[…«$aÇ+‹#²à¥$&&­ðʬü^-êÜ`€v˜GWVª û[ÕE©Ü£­ªŒà ¢à8Œý«ÚîJâÜ ÷N ñ®µó-­·VŠÝú[»­º}>œà´ƒ}ƒBÐ>¤ŠÛ.pǦ©†qÚR øÐ‚û:®Õ9-’Rdø;D˜»Œ¿©uwâØ¯ Pž¶07ü²w͋؊ ?§Z©i±RW¬ïâ¤ÔÉZ´Õj²9uu¥ŸI“)¨»ƒ þ.0ƒz6&;†ø©-kâÕò•ã«‹7WÞß-?üvñþfúÎælgêqÙÛ‡`é¼Qís9ì@c½Ìÿ"Ÿ> RÆ=NË95‹>7j¬CMY«¶ÒGçàˆÊ®ѦLጠ;¥æ©ÀqçÂeOÙÿ$1Ðßã7㎱`)à°úû„7½˜²oúzÝõ}‚Ùp¸ Ñnîè ˜!R¸!rMçB<žö6pdÎ dNG¡ñ©„©8œ…z¥#YdÐëtNð»CÌ‚Á0E£`œ¬?J·Z›kÐsôh+'Z',8s¬t«‹û?UR[Õ¶¹hi×±•J¯¬´.‹¬?‚Æ^A' pà_­GÕ9l± øgU¨ÊJyÑŽ–0þí¬ìšHƲª½JRKbêãÅäõ¾,6zÔ±óNfÆ÷…k"ÕT¯Òøü“v¶WNA­ îm´.\›ñNý|"`燃NedgŒ·3> stream xÚµXÛrÛ6}×W°~"g*w‚™ÉCšÚ©3µã:Ì““ÉÐì°Õ-$ÝNþ¾‹ )B¤Kn_L˜‹³»ç,ˆ£ûGo'¿ä“g2ʤdQ~1™"By”fIåóè&~óÛë«üô:™ÒTÅo{žÿ~êF¿¾óñâô2O2¿6òó÷—ÉçüÝä4Ÿ|›Ø G$J1RRF©RHÁ³åäæ3ŽæðÛ»#–©è;sqÁà Æ‹èÃä öÞbD…š‡÷]Éžïí\Âù~•PU±Ô®BâÚzÖšõPpDÔ~¢ŒwöL„¥ˆdÆÅbŸ ‰ ¥©ô&ÜiTï4„˜ƒª(å"AÝqfÍìCS%S"âru?™‚8WÇ:¨õ)’uàÀëdÊ”Œëžð ÜÍWíw ÃñfQ/‹Æ½Ž•¾Øòï=q_X~êÏ#Öb"m'Ôõl1b…JÔM)Vó1ŸLÍtûèGÌ0”‘.ÿhÎùX ‚P.±2‰T&Bì·è1êÑc,Hƒ¡£P&$cOÂÈ;ÝBã’ ì›dJHló þµ¡…ý½)›R`¯î¥V>!#°Ñ¾ÁUQDÒìÇñQÙªö[íQ©~'S' ;Ê£-Ýä~î±-Çr“f󳓻Hïå¢\éË5ñOz2²+q’nÓc )‚Âì#e «ÆÆòyªR‚ìwÃgë£ÂŠAÏ é‘ ŽÎT?'ÏW.)öëqŒ kàÀ–ÒL˜oµ{îá³ œ»×·êYóh¨vq*0!=2T[T°ClØèIÎQJHÛèA¯ë˜^I ú¼ö¹[§æÜ78>^LÌÐ’œTúÛCYi…¢iEÊËr[£Ÿ°ÀµÖÞIuï±¹~;‰n줫÷WôËǧ×_®mî})ûÉ×:lÛ AüŽ•w¤Ö tѳÅùÝ;¤ˆ§é{_A‡P¹­ÇxR Ó®µVÇžçåËåÇn«Kà¥Úå_‹z,ãüzåžØT˜ ;Ù15õ•Qè‡t~”ùK ‚bC†16æy¼¶õDU|Wimýßúi˜B»¾ÐËÛöâ`çšà:¼‚{Q`¼ƒq0¨î õ…ñXëK0ë'=œE†a<Œ ° 8 ×ôB õQhÐfÄ®³«Î.`'½SK½´òo;>KGwƒ: È´]@ÖÔ'ÄòD“Ryô-N`ŒcÏR® ‘ ø/Ô†g )S›#U›À< U„ªY‡"dÊcþhgp¸ƒX©z–ÚL‘ƒÔæi*Ãáþhº«‹0Ï" 5V#€fI V”·„¦hÛûn«;Ü Š»»[lÖËMŠò„+ÓÜR¸ùÛûö>"z,þ85]ײ )$tG%i»ê9ƒV•@/ ¬³^=Ã^–顪§ÇMÝÏÊ®­÷­ïªML¯;—ħ1Êñß…X*Èè³…™[$SÏd X`>Õa*ˆµˆ=J)Gz0J);”²¼]N þ’9ÜëaøÀeÙ³X†ÁíTñÿ±¥ep©¢vˆ^ëæ¡ZÕ‡6²>Á':— \RÛ/>{¥Û¿li¯Î¦HÑC¾æ¿9·Dk„Ò >ç»ÿ 5|P+ endstream endobj 748 0 obj << /Type /ObjStm /N 100 /First 891 /Length 2397 /Filter /FlateDecode >> stream xÚÍZko» ý¾¿BÛ/³¢HI$\à>š¶@/$)Ð6ó¼ šÚã·ÿ¾‡³³n?2¶×¹âhf‡#Ry(M•b¨lA8ÔB!Q UpKjŽ![EK¡VüžS°œÑr bÁ…b›ø•ÄÒ¦æ¨Tt™k ïDCŠÉ{±RD7…CbÍÆ“dª_TG !e‡P2.JÄ#\”(ªx½x‡¥àÂ.jH•1 ¢Ãª´`,MV ¬Å…cHFÆcŽ´j L <µÓ¦âuN§3doUKô·W`ZñH Ch œCàMÎêC ÃâšÂV\ª÷¬««SýXªZ`x½úÔQôμÕ"¬Ž™PÂE2¼eDÜøÐV » ©V6Ä|PËÃ[±†Ì>;°~fó_4dñy…y³@r†Á är†ºnˆ\0×J)%mÆÊÓ¤˜×ì.àp³¨˜¯l-®Pq„5†TStJ½s½b(ŠGñkô7atM@ɰŸFw!Œå¸ýÍj*UWÉ©¿àð'ðWM´°ãÁ_©º!JÑu XCÝA”ðÈ © 7ƒÜ"ê0¡€š$< ZdàeÆEõž5‘n4E\ÀãÃ~ÊL|šØW,¡pAsQ(`þŸrÅÌ«èÔÌU£˜a})† cÞ<{¶ÙþÞTÀ‰áeØþýÿ„zŒÜ`%œ|zÿþíæ»ïfÑç§'çáÙ³°}înøóKÏÝ a®å^†Áö7˜âćžz¹£1~Xž;örC˜‚å°<Âr(‡GЄ˾ Ú¾8;í_çáMؾøéyؾ=`_ÿ÷Èí/ãfû#€'ç±gЛíËñãé§³~ü8/Ïù§ŸÇá]ûÃé¯áÿ-7 ‹H…µ·­=CLu/þýÉÉ)z|3‡*‡ä~ºoiiÓÒòÒÊÒæ¥-K[—V—vßßšÌãm¶¯>uçóý_Þü{³ýáôlÏfÄñíöOÛ?o|CóëØÃ8”&ˇb±VRæ&bRrŠM©®Ù÷óœ¾ Û?ž¾> pˆß}8ýχ´Û}ú8žívïßu;ý×®Õv,#âóˆзÑȱtÊÖa©æÁ~ï“rÈLÍ>ÄðX©!, ‘ˆße=ä1ÓØ×A³™Õ®X×õC+¬Cß–í!'5Éš‚”Øš¤´WÁîyÊ%Ž£i'H(Cî°x[†¡‰9×þˆsD  ÖUÏc"èÎ*d^¹0w#PSßw©-Qcé2Õ¾•ã[™ Á >LÆ'‚YJwp ª©—ˆm_R‡¥WGêˆÚnš¦œí «ÎËd¢‰q¯B®´²UžjË@2 ÃÓ8TÇ‘Lû¤aåZ›ìdêÙU¸ƒ_D¬¸dÉSÄŒÆl¯‚D½ƒ'ËH6LmG] ž…¨Ü“öÁ­ÍíÀGŽÊ3Ýe$su:d^h¯B©ë!#@Ø”úÔ¶1w¹‡ÜSîm” N^#}Ù U¡ÿªb3¡m Œû£úRv!_E‘³A VÉVèH«DAÀxö*YÁb7”kdÁIY©ZYÝo¢Ô€¿]–`ëdA“R¬÷—}i¾™'_¢Ó7ÑäËtú¾¤Yé i®vÒü™ù4®_!zµ<© ²‘ÖÉÆÒ”²N6[E<^'ŠEŠBõVQ.Ú8¯Ï)7(£×õ±Jã:30Õuªy24þЬ %÷³Ä+;†}=ëÞ*‹ú¸1”´‚ŽWuœX` ýJÇjȘžŽ„Òª~QL7ÉÒ£·GXsNÄ¿Xs¾ò°BÕö¦ð=‰¹Ð´¥Pµ¥Pµ¥Pµ¥Pµ|ÌBTPÅòm)k@Z÷k"º_¢Þ¸¡ªûx~ö©?ñן_ %ÿíÕ^îv/Ç_ÞžìvïN¦Óã1AT¦îIºìó¯óÉ›jäoMٌӸœpO|+¸K$æì3X3›¦¢CÛ–®ï:±‘Qo«µ9öàè dýˆ µ$'_É ·ˆiÞúVVpF£ßÖ°„@ G¬mTÐhC0sä\øi›5!£¡d'Þ§—” ’|ÿ»Y³?rºñ4NC+†šÒR7¡VÓh£v¥+ãXëq=¢ ’ÁyÕ÷ÕÙ“o\7’ë=µL2ÀØ…&wEú’…º¢ãTb‰ñ fî[ÝkyÇ%Ù¯ðŽke#ªŒU’Ù—væu²áµévYn2Y8F”up…­ñã‡5² 1;É:YOж]ÍøÌÌ7R㛸õ}Svº²·ì[÷LÙ˱-{ĶìÛ~ØO8ö--íÞ:~¼±¿ç%å/÷T–¶.­.íq÷œ‰AÝ],RöÉ÷ap·TNO:¶2\PüTkÁ. ŸDÞ‚ýÛ¥¬ƒa½Ò„/¤BMõ,ÆúÑ{ØuJ]Û·eÁ2 ±Ž`-L­ÒN\e:ôTú±LÐY©‰ó)ÜпYAGÈOD#æZ<¼£.Ão-݇b-u©eÚF)$çÍÑD'|êŽh×ÊMMÐÙÒÞ]ïýõ8AÁRóãÌCEPDàô*‚’<ðEEPɬ”§QÀ*‚ÛÀ=•ðº7«Bšæ¹h×LþUHw}ÒÈÉ|¨pÀÎi_7Üý›æ…„¤•@9S(ß¾ño\”Ÿ¶G˜oƘăú‹üCùä!³©$O»SÐì™¶ú*‚/ׯÿ ®ºì‘ó±sè´þ á’ì¡D™ÊÖÉßkŒi•¬4tÍ.ßµ²ˆú×Ö(”ÿС–u²È–¤Ç—õƒ¦y,yÍVî/»¦NºyÓrÝÂ¥Jë¾…ç+…óà %ÿ$j.d8³™w ¡qA<-óGv±¡$¡ääÅÁoô“ Ú @ÁÛª€ p¼W²k% %Žà­èDÕ†~>©Eü쫵íøeø9”ÏkÂÏ粇‚XïŸE­‘ÍZáò¼JV4^{pp­,ò·Ÿ¼“/ÝÖŸ ü ¨5 endstream endobj 900 0 obj << /Length 733 /Filter /FlateDecode >> stream xÚí˜]sš@†ïý{ 3•,ËGà2±jmuL/2f#«îµMú뻈IŒ_Yº3\Á…¾ïËÃÙåì` è6àæUCVq[\ºk¿qÑql€f@.¡æØ6¿Xš©ÛÀÁ½Ò‹C¢êºò¨þð¿nI^t, 8škÛF!AÓ‚tQùß–ß ·ÃÀ|k÷G…Ð]ÍåöM]×\Ç)–&ó™Ò$hü˜2Iþ‹¹?Ës9þƒ,$ å˜{$\ŒW®Ó~ó 7p,ÇÔLk-NÑ'ÉBq3*Å›àˆ,_‚Œ ,5kjJ…ŒÆ3^…‘š :߆X=ý±«ïh ™Í+°Úäÿœú uV1SèfÉ"ݽÝêžk¿©+09¨’ÂúÜçm)ÌpFä™JDÄ&<öÁ·»6 U4¡×JŽ‚ï5Î;Y¾û«‘AgÊl•ÎÛ 6wíJÕБj;k$IŸe'/­­ÈësÁrÉ^å9Ö¼¦šûwŒkþ\±Èx´ÒÕWzï™IìPÛUóü½LÆ—L¥LtaçqDÿ¨‘¡KX•·¿¿†óŸkµ¹uzjû¿"ÛŒw endstream endobj 991 0 obj << /Length 1041 /Filter /FlateDecode >> stream xÚÅZ]“šH}çWô£TeHÓ4_ÉÄqÍ&:Q¦v«¦R‘V©t“J~}ZpfDDº›vò¤Uʹç~ô¹÷¶B°Œ”÷žòöβ£¹–eo °kkºÀv‘féÀ Áã`<ù0üWýê}T†žò¿¢ÓG!Ð 5Dz€í8šƒ0X$ÊãWBúÙG5ÃuÀò› À¦¡™Ø ïc0W¾(ðؼi™w¡f»ÚÒ5ød~»I¶È£o*†mý¦dRQÈV.³‘oí ëðyeÜè®æ"“¾"M§Ž•÷ÓÏ÷È‘ÂOUv‰Ÿ‘U´Ióý³ ö„ó $6Û Sots!ÿ»ŠÌÉrʦIÆ•Ažól—“ŒëÌîÓ¨èðC¢içÔt{^Ý+çuº\vÓµB>M_/à5ó2Ö~”.U6]±„uàsJn碈A< ÒªŸ¯õÏä)¹»¸˜¯Ÿ]ºòTÁÁÏm_øaÞE1éAÔyAú¥DïOhƒzÂüä·›8¶y_¿J¤í>?Ç© VÖý!•¥zé|ey! öÈùñ²?µO?3Ô‰:Ùü³„ *±Ž¼œìo‘ Ìûóšf!ÉHØhFÂÝ¢  Õß¿½vÈ ôQoì9)Ë{zV 8³vðš/Ö4â1‘†Wì›–hÁª±Æew_™¤Ö`¥Ç¤¸h´G²Ín+àgw‹.h6:¦“¬ÞÌÙÆ#‡™ÈSq´Pq¯K¥6'>̇3ÿ]žG«Ô_i“?4?•Dø—>:ˆÇ-‘G3?œ³¥qa¶Ö0Ó”¥ Â8œÃ–­“˜GÙúzÉ©“¸['«Úp´«øOÔòùÁgdêše;Àr¡¦»fã4ˆ(nUs]sMShm5[ŽÃâôþÝlüÜ *¸X8B¬YVA@«qkCT:Rüð‹ ÿO"×3Ú+ ¶åŠGü±D ß_4jK¨éÚÝuvëÝú”¶ïMÿNæœ]ü¤ Åb^½žû‰ß´5ñüÀßü_Á ›šeê×—jø7ç$Ë! endstream endobj 902 0 obj << /Type /ObjStm /N 100 /First 924 /Length 2724 /Filter /FlateDecode >> stream xÚ½[]¯· }ß_¡ÇöE+~ˆ#@Ãm0?´5ü:EÐàÞÀ@úï{8Ëux] »z¸Ðì^ ç IQ¤xvº—V¦xéc–©­ "Œñ§øãâc`”BDmû’Ÿ¦öB2 V¨·¸w2¥ÃÔYhŒ¸Û yÃœÞ 7ÁœN…i@xçÂÒ0§K¼˜£…»9.záÑVxJÇÅ(ì6³Ï"Ôâv/ÂÖŠˆáv£"Š—™ÆELp»I@ÜnZd:žŽÚo”pÇ´Q”]ÓfQe¼)h‡Ô9ZQs<pu21¸¨ãÉsHéÍñ¼dgÆ[Œ^ºæ„FºzÜ>J7æÃ„ZûÀ;ÍÏ ³kŒ9“Š0'ã‰9S Ts´X‡¶&¾5›1ÇŠMŠ9£˜ë8„¬ÑfÈñ28̆ »9•¡a Ö€o›³kw:þZÎ1`qÍòàÇ·Bq{\@¯¤“GqX“µ8‹^z)aiÇkàs†…@|ˆ:Pk<'‚¡E`j €NŒ+…àg­C‘Np´fx¬ã©MŽypµæÐ¥| _B<”EÄóð ’NÇ'"… ñ :0ã4àˆ@«P¹s8s£˜‡g0Á•††8ØÊá pu t¼qט‡g° ¼T@<ñ^.x|óàu$m„bð áЃà"XW.±b¾µáÊBo2bae8þHÂ×k‘´5=<{v8¾ú÷/åøò‡>Žß>=~xxüðêlX´ßŽß=¼úøîíÃûÍRÛWyøñ§¾yúµ¼Ž9Ý{åm•RþæIï ä4ýëÇÇ'H|½…|³…€ÓH9rŽ’£æØs´GŽ3Ç”×S^Oy=åõ”×S^Oy=åõ”×S^Oy–ò,åYʳ”g)ÏRž¥×ZC:<ëÙ¨*ÅÖª™îÙ£.¶ù¦ÝpÍ[£jÈwkЬLs‘9R¨,«uß5 ¾²òÚ˜Íæ˜r1`³Å ¤×Re¡ß[Œhw Œ$ëj*q4GJý ‚yεTâ. L꿤¡Èy¯í^|âH®.~IÈöeöÅ °O¾ø% ïªÍׂpÔÍýâ—„d_EÖbÀÕç¾Õ>Ö@Pj5RÎåŸb]**ý/—÷‘åßâKåß=@œË¿ÄË¿{€Èòï â‹åß]@ ÜS¥ $Yeª5(rs]F-5(²¬¦×³ÝAHlt|bdY­_3Ç «q¥w„ǧ×pÐÀ4PþÑš¤êl '»5IVó¾ÖjH+ù«tP¥6[CgCœ­¡Hôˆ|±5XQÿÑÅHôHe±5.1.ñ2ÀPï‹­Ñ¢ÒÐÝPÙXe“"dXµ6wE²MÔk!P@4ÇR‚d“©¯Q„ 줧r¯GOÛ÷°"Œ¥rõlÄnÂ8TãÍ¢Ò‚g8’Ê(Œ ëõJ5®í– ûƒm5gìâM¡&EýÁkNd¢¸¡¨ƒî¶BxDŒåÚØ "sôC¢ìÝú¶Ø.¢ÄËu,ÆÐg^ÏŽ)VŸ«Œ2âïÒ;Bqzh4£!^çšx«“Ù ‹Öh&fx$|&^ 12ŽÈÎ>ʺzâ)´S˜rÔÂt:Êríl¦ß>Vƨýα’0^ßÂï+©GóØ÷XIÆ×·O½qAÑDg˜…NY]óh›#~ù¢䮉™Ô¸h‚ôúþ©t{Ãá ´cp¸©øÿ áyy=ýÔY>þõo/çúLCÊ8¼<~üùç7Ÿ›»Ei+fX¤sü÷ÜO¶ç¿@ø:õ¢/"¦É©±‰Ç—ïžÞ~ÿ€w)Ç—Ï_”㫇_?ü¶Sý[®Ã©ïý)×ÁO­ñÿƒëà'HÁa9=GËñüÿ™ãI A^9”#ç(9¦¼|ÿ ¬œÆ”G)R§c½"ÿë(E–õªÍªY°á M|±£G _[YeµJe”HøŒúHWq(â4Y ¶©JA#vdÏð†ÚtùÁŽ -ï§øL½^Õ/×±íÙŠ½|ãóGÃ#ˆoÉyU¿é–§ Ø 3ŠZ@¢Úiƒ¢c«Fú¯A´ŠÕ /m(›”ñyy!!~D¡H%û¶>£#L°Ñ5ÆÙ­¢Å9"ªrÝŠ ¯-šQ-–é*k ª xBês vÓ†"P<âøXe^{œnªñë’ DréBÇ2k8Ö@8†ß̨Æ/Qakö…^©ÈnE£QÍ›W*LéAãXf ꪈ HnUb…(­Sçšn\<ºu¾â\»oÏÖ”®C|1BVGãE°É¢¾ä9d³Ç~9Î![Ú—Z‚wø9r}ì—¼ÿœ'2ª¶è‡;ˆX¨íò;6(h.:æ>ןÌ£/õg0DÍtmÌ-âã¼€@|õ”J÷0ñ—º0\ endstream endobj 1005 0 obj << /Length1 1416 /Length2 6052 /Length3 0 /Length 7019 /Filter /FlateDecode >> stream xÚwT“ÛÒ6Ò„ RE:QCHè½÷*¥† ”$$‘Š ½IïU©*½ƒH‘* H¥ƒ)*J/_PϽ÷Üÿ_ëûVÖJÞ™yföÌÞϳ×Λwøí‘v05$ËI•uu5Á $, 89áXWØß~§) #RÿPFà X¼O‚Åu‘ ÖW X“‹K@@!Hòo -TxÀíº@-$†p*#QÞh¸£¿Îß@n(,))~çW:PÑ ††C! .ësï…¸P8 ëýÜ2NX,JJPÐÓÓSâ†@¢åxî=áX' ! C{Àì#õ n°?£ 8ÆNpÌï€Òë AÀx‡+ C`ð)ö04¿:ÐHS¨‚!~ƒu~îÿl,þW¹?Ù…àˆ_É(醂 ¼áG ÜÔWÓÀzaï!û ăÄçC< pWˆð«uPMÑÁOøg>  Ga1¸ëÅŒ‚eðÛ¬Š°WFº¹ÁX à¢?8Åï»·àŸÃuA =>[p„½ÃÅöP‚&¸û˜¦Ê Þø·Ï†Š‚$Ä…%D0w Ì ê$x±€±7 ö+¾pãgðóA!Q@ü0?¸ ÿðÁ@<`@,úÌÏç?ÿ´`0ÐÅí`ŽpàßÕñn˜Ãoþh¸Ð„§ºøüëÉ Ï0{$ÂÕûßð_G,htOí®’)ߟ‘ÿTRBz}ø……€üB¢ $"Ç?øý³Î]üOÿ‘«‰p@/Š]ô‹ß¨¿{öøCî? áþ³˜O]ûßL·‰‚ ø/ðÿ™ï¿Rþ4¿¨ò¿2ý¿;R{àêú+ÎýðÿÄ!npWï??»Úš#»]ÜÄùþ¥ñDŸ–[”OÌR”ؤŠÑÝwY£¨ÚÉåí»8)}ÿªîü˜èÉEW¢&®Ò¢×Ú^Y’¥CÏ"iúå“!¶É®ÏxEt—á¯ÜOn±AKÑ–©z·´eZ žT ½ý}3Ô]¬QZV¾s„b©U¥ûXTD.W˜Î<½ö3·Øc3ƒÆÇNVaÓ¾ûÅ8‘³§;­­J\SîQˆšhÜBÍŒoFÁ“ã-°à›ZhzU´2ÎÓmqß·ÂkÑJ§× YèW†kqýºðúq4R Èžól£-28†A 9âVÙôRWø[)aœ=A‰^Þ‹ãÝ@ú·=Èa€GI`ôñ&ît“0¨@ÕâHžß½.m:Úæ(Öû´›‚PnòÎù¹æTý-7EÐà©¡pýD/]ŸO+ßSúæeIêÅøƒ•aݤe}J'?~ÚiîÇWÑô­'ÄF·(.ì6åFñŒU1½ÒR"H& ùìsÖæ®°#3ÓN–ì5v‹Vös»s¤ÍõïJ,¦óÇ=.×o›ÝbÿÊH¸\Ÿùz²½Ž¼¯†Ñç N*àܲÚnòŒÖ{Y6¦!·§â·÷l:;¾û^òµ–¯µU`çûåAŽ%×HÛÀv­MYZÏ!¾¶­N1Åvy:<ïmA-¸@ÎIß«Í Ä½´iNŒF !O¹HúÑ ÎøG7&¬“ @7³«Ît}g a¸³ÐÆjS¨¨á%Äù¦Ä'›Á$y÷¦g*…=žÇÇÆºäÝ±Ž¶KÈøŽh"ƒP „ˆØ(‘.mÐ’ÐÌœô ƒ·øF¦¨Ç.Q~1««êG!³TN²^DµzÉõ;|Ш9¶`·2VÝïpÎ0ì‹ôä;¡X^¦ßf¤QͺJ,ãÌgPÕ»¹™Ù7MfíëoÖHÛ‹<Í7.¤œ•º³tìAwªË;3!͇¾~Ù<º‚wÕx£À`lÞ³[âÞc'¶ŽÑïi™èyßç¨MùØ¿lq ýô5¯Ì'Bgt“+¼½Ðož-¹Ô_´p|ð­n^N>vj¹Ö8ïcò›¡gÆØ¢ Œ-Ö´Ü&h^ceé` ÷>ùÚxÍ/8/ »:eþ4¨ù–xÀ¶;6xÁáØ¯fu$‰§2T‚ØÈpÌ<ÙûL¦VÈ9Yߺe1¨™Š³ýJ¬IvsÈ‚ÜxŒ`^iÅ3e7äü hˆ³Ôï jú†ýg'z¹HšÈËÖž*Eß`»ö׺ˆ6 pû{#Ö muòd¨+pai–ê@¥î&EVØÉ [ïîÞ¢‘[eÚÐõU`Wî盟ÆÈÙ^ÚÆ7ÇÞ“·Q´¤é&C,¢€ê€lQ¡ûÂR Ù Ì}2÷ÔG|À‡çPSMÆJ"1n´î­Ãlˆ}@@Ðìs½ÍP!+(²¸/²s.»ÅúþÒÃ{ºÂÉš·CC{²Ê×r÷ã½OÚ:&ÝÍ|á;¼u]‘¢~Ï %‹nTæÞƒ´ÔR_ƒÝ[Ïð‹#{&ä§úfcZI?ô2úòô `±X»ÿ@hÛE)!¼çÌõ›œgœù†Ì'{1•=Ä^4¯hý–Õø92oeÚÑÝä®Ã¹¨Úa¥kz¯­;4ve»P,ë1î‹”‘Š¥ïÎ×Ìœ;+òfÚ:ކ<¯ª&ç.ú,=XipÕ„=Xe·öVAú°S™@¶Î¥fÁxú3ä(î¨H~ˆ!Mù5­¥Ùf·<ä2õ¨ƒ>™ÙÜ;Â¥’Ü’G ÙƒøÁ„r® ѽ+oFKŽêÞ$¬âŸ×¹gzÿ¹Ýó‹AЃAgz9Õq—ê€ê›æÝí:q­õ‡OzãMR+÷3—€ºa®ÇÆ,}ˆÑ3ïÌ.˜IOÏùOLˆ"ñLV$2D˜}È׊Xa•¾¼ÊŒk œÕ+çJfJRoV¨ ”$”îѼ´1¬†Kâ(j 0ù(¨MHäúÁAÌË}!•ÜPíéWõHCC°†—óxÚ.Ù%±âç½*o¤×»zçòo©^ùÕF¯Òˆ,½ëx7ä›sL×iÕ3²‘ò±÷1»@Bò,èq3ƒiU4©4yg-e uiè…Çx8[~<+§Jt^^¯ÏMÒfÉÿf4#[ΦV'@ƒ‡m°WÇj ºŸÿИÁNÇOPnHÔ…æ ìçSý3qzÑŸá·™¥’?ÜyjbC¯sW>¾®·ÿ†žrùª‘îþ{øÖû«SrÉר{†ÂW®¬üæýà|Û¬3[eCb-Šc{Ìw;çfƒZä|ÿ`dãÓú”N¢´ÍC€½AŠ–&G}sJç½>î ôn†îk´ùZ þTD’wR^ˆÕ|ºa>Îó÷R¼Ü|Æbt‡D+DF±3¡8Þ=ïíÊýhIçRÓ0öe;Ñ–IÍ·/käíŒ/ÜFyéOâŒé$ã¦U› Íôù§R&:¢)+5ÖQ« × ¤l·È,q§¯©GÇØ‚UMI|²Á;àÁ ãªdSÓQQo3m_\ÀèÎRêwß©zìåg%ûõSÙrܤðT»ñ„–˪EukÝÙ{aÛS¼3drE×Ôìyæ¾ÀgÚ{üصô´õʲj!\öûñÁ…a#1,¸ÎµkÖö¥]Æj$An3æ&ý« Oöýôq•ê5#ìÕB¨è—·Ê‹ QÝ¢T½^:*oÛÓ"ëžvë±¾3$êD}ÍrèñZRáNy4ˆÈ«žšÈš†ÏÄ<y¹Ú9ÙôéX=GVIĶ£jñŒŸ¨ô´áËÞµµ ’@Ü«”•Xt9 åÆÂ(G¡Òs BÁȸÏRJô{À‰¹\êÌ9£Càb +Œm a7Ù7£9‘»Š^$w¾˜{ý»Rõ)?µKË˦œž—ÂÅÝ“—ÚlånQ³ s6Š­~h¿ß<ÖNCv‡ÃFî6®bATÓƒòø^þ=‚‚Ô|&QñTÂM7¹÷9‹Ø¾UOúÖrº?éHBI+j¾e?õz#£²zѵ€D½w¹•»æ}¥Ú—¿‰Qµ+ÎŒ÷ÚÚ.·:K RÞ ¸_p~fRÄÉ{,Ælùq§^iu1q*^¦cån4ŠÈ¹, ½gݳÂ/™ƒ—h=Ïiø9|eRØ=ð³v¯9Û9Äï)Àò5VCyãòVÿ[º @eqø²ŸÜëZº’NT*󤂹ucøÔ÷µ€O*´2Ìõô8?œ»˜~ê¡2Yß··,,“÷ÏP@®TbÊZÕç j1n<ó7æ „IJ±ó†+ðLW§—ËÍSåt©ÉõÏ6Cü/ý\üuF>-}}u@]¶Ëú…ÓÇ —ŠÌ&8¹„ÝXü¡ÆúÆ¡—ú¹@|(å&ƒþAhÆý¨oÎKjtÆ3-ï®Þá€l1NWc’jó >Zº@]ÀÈ*¾Õ‡daƒ«óĪav[Qw”ËÝw:¹BOÍi75ó3{ÆÓˆÑ¯,§ë_?zsþéĆ´õHXlFÛß@É/¯Èrx¯*t|Ç…ôiÐPŸb;÷¤•î2ãjJr*ºý™8ëÀ²‘÷úÉU®³Ãï¼eYvK¬q¢ªÑŒ8޳GЯs £HTì+Åï„NÅh EÈ«p[­·‰g.Q-MƒêªNã\kò׃B€ù´ å̶ÉÙK ’Q7Ó– :‰ãT+C,ÅJ\[Å_L¼&Ò¡üª#L+!‰È—ÆvŸfÛD—+Ú~¾Jj•{ñEÛË]¸³pá ¶˜µ,s=îïˆÙÎpPþ ìªj¼BEs’À–õº¦P*—›UC®¶6uwp¶f\ºâàcï‡'Á~nfYëü?êt‡p[Œ_\Nôäi'¦QÎ&Ó"H˜š³¤ÞL©Ÿ úúEªë·¨9'Ku[»Kû6‰‚Œî¹í>kaÚ ÷ŒÚñ½­¥e’[/Î=Ú¢÷œÏ¨ bäÓrgYÇVEJ0R­V½ÌÒBå!¯ªå]Ûj«¡t4Ëgw voÂÈò§7ø±àÇ™{ãídB“gN]NW|æI×G’™Cy´Á±o{ˆ–¾J¨sRG †ZÞlö4èþK>Fœ¾æ€l2‹Þ|žÓ JŽü4¥r3¥ÞY…|ì¶„ô•‡O¶kÏw0Ĭ¹Ö•²ŽÊߟÆ×ÎÊ­m~À]–ޱ±JlAûãÿj$VDbRt)?Ww|Ü”vô†YŠòHIV’cïòÞMŽLÞ±ø½ã>'4åÞÍ rvX©ôÚÀµ€Q³n{ÿõ3jÚâ9AÁœx¹¾0Æ ^iúÜýJü`cÅ‹¤2ª ÔgǽKžÞVó–Y3!w·ogò9 µë÷¥}ööŒ›DQ…¶ç¾Ž-Ö{º5Nµ@Úê²¹Ðe¿àÕ¡é¤*ÛT^h•`…'´û]mþ¦ùèäk¦Ð,cùí«…aÄégÝä•©€÷ ЧÞM&†. Dqø7’ºþæoÛBƒ}[ÌïŽç™¾êæ^ÇÍl¸ùx¼zÜ©‡åÍü‘¥"PI¯dJ °‘ƺŒÏñgfoˆ°rד¨•m¥3^9œýZÍt‰HQ?—»<óÆ¡Š“{æ5¤2­qKˆ‹$I¡½å_a·´+|SöêŽÁzR*÷¦ŠŒtseWÃñü¤æÊ‘†Žõiýü‰b­c¨zâ[=£ÞHhÐøÏæhÐÙ%ñ÷Ê­••ò£Ö*édgÑq#¶)ÛtY®îeÜBV³méz0ælíµ$P ëùâQ8åà…uLÚö5ºëÔ¶wýÎÙeµgÏåUVµ™33¹jøv"òÑ–B䢽&P­›Ÿî™<)u"©ã%´ÍCŸ(R”%šHôôv#ãxQ˜+,GWU ÷]]Ší|;ƒÒ†ñшœ„!ïáÐ úàÉz?¶—kÚëµMƒn¿`ZŒÎIF©JµzögçŒÐ«Bi(s;K;e5÷Ö#еzm¿¿I2ç1ôÚšKX#êò"˜r*¹MÖ¬¢Á¸‘; ê#„Öùw4Ñk^Y mÜ ,”r'¦ïésòÖž­=S“–¹wžû.ä§§ïö‹†yòqjÚ]cAtÛi{Å–b—ÝFKo~íɲk)§+n”ñÇ|NT¹«¬'¢mY?»½*¯zû‡!bô ùÖÆ¢ËíÙÜÝ£¼c_- žó] KbfR:¿;I£&ò*2<)[V™§ß’_~O(ý4·®þ®—º#‘„ !ØcMSwÑ;Š C‚^DP—Õ·²¡ív®¬­S !I<ö*í„K?ü驌ÝQrVnÓ%ÀR.C8›´ìÕLbõé‡qTâFhWh5G„ËÞò[…%²º¢´(ˆn@øë”t·û«a¾'i»vŸØÒ)®`uÂ$Fª@©ýá¾Ãc­úl<óîïV¨Ô’±ä)ú¹„ù²^Õ…ÍÝ$QSW?Ù¬vËž'Rò¥VŒêK®„*ú 2<±¤Xô¶¦¼#ëeÝñ„äelûü1}²0g¥©% ùùàÏ+*$/câY,ïz«$M¶]v3+²¹`9Oñõä¡Ö´] ,ë„C ¾Ì+~­lcÔ-á>E®Uo…W_é?=$% !lOA îÇbG˜(¼(’wöøéyÅë·4†m dvÀý€¦ ãK5Ó.ïESíÍ1Ç)«‚ì]ÌPâ+îÞ†£2½l‹^²»üYáÄ?Õ‡éü*ï5}ÃAÓÇw+†ùyà„?ÜL'æ¹Ku2R–Ì£ž]:CÉ VQ¶qÕŒýT­~´?™/6âdáÒmôŽÉ¿§\Dnw´ÔXÃG®èy];pð ÈRŸEž¯*¶Ìêj†“!9;Ôí·a²2O÷ÿ+Í£‚õDÞÀà¼ò.§`1éaEš/%T‡Š8x·Ö˜˜:÷οšš0ëœYç˜)T|¼°Lï~û@®RtÕ|dÛ†l#/×` ±ø ÿ‡aq·ÓFzÚ\“_K°_¯g¯î~Õè¤uÒPÔ‘Çò”Û9æÜn…—^ÖÍ|:š¢é¹6lUÖ¾ÅȘ6{”ö‚G“ž°ó²Çª1m§ò—tN×Q?Ä!Eƒú g^ÔØ—Q©>L<éçê¤{ô‘´§¸àð¡N“€<¨v–ÿýÒ”‘­ò‚Gâî0ãŒúb»B  [Ý07Z‰56Ó· eý." ïÅá•àõ™úÇãCóFƼÒG mu:›o š›È]\‘YÐ÷Á¸T/©Y ß6qªvMKÛÏ cbÏÏÏ0îaÆ¥­NÄÐSÛ:‰\Rf÷"»ZÒãKŽÏ êtìå¢#µ/g^U8~oùÍHOJâI>ý_ŽÄëEód&òs<Ëã†vœ#'SÈ膀´5¹H±«K]½þ»v¦ÌXÎHIœò¤'ÀµŸj«gÄÒŸÑï:‡G'2E¥0}Ê1tžìÌ;ðh#o Â~峊½Æ»5¸_ŽË+w: š<´ä*êæ k?_ÿé.PÕÈÚ6û®0ìF×Páf¯k’©—ðžqöó+ûœ:v8&R;#ÜX­ R*î½Ñ+„𠸧ï]Ý÷'Qו™ e™\oáuF«Ã<.ëùølrNñ[D/åð§ñå6Ñ X¦Kœ”aªQ¹®_]ÞÈ’pëq@@äu£†U†¬¤²kˆØ#Œ$™Õ„`§X÷¼ø©cKptzy錔–åø AIBûζt36â ¸|²Eé[ý³ðîÏ>¡vî圱ý5GD-?\TÊu¶¼ Z$™É"ŸÝqr›Úç,ú8jLÄË­„ò®Å…K;J´2pœrÝ·»‡©¸\s~­¥ØË© a~ÅѲ$:©cNLJ”‘–à j³ux™L>¦µ Í‹³âŸyíÍÏ->”‘j©èÅynþ¤À¤c>áyR†ìX PHiød”{ëäG‹ %ŸÅºø¬ÍíQxz õqKʽø®ý¥w‡–ûÇŸÖ;V>|³F‘‘àúÙz`G¤®ÿaž¯…¸¸\³èx®¨æ•Âm‰è®ñËI6.ðrûÂø‘vèõ …kzÃ7ÙŒãÝ(IÉùþÚ(›^ endstream endobj 1007 0 obj << /Length1 1397 /Length2 5932 /Length3 0 /Length 6894 /Filter /FlateDecode >> stream xÚtT”ïö.)ˆ"]2ÄÐ1Cwƒt§ä0 0Ä 14ˆ Ý‚"HwJH‡4"­„„”¤Hóãœóÿ{׺wÍZß|{ïgïwïw?ÏdÔÑ瑳EÚÀ”‘˜$PÐÔT€@¼ ?hG9Ãþº €F0w8!þ¿ î0 íS„ Ð8M$ æé ÀÂâ`qÀ‰ý ˆt(B¼à¶M^€ó * ]}Ýáö(ô1ÿz°C9`11îßé9˜; A4!(˜ úD(Ä „Âa(ß”`—t@¡\Åùø¼½½y!.¼Hw{in€7åЃyÀܽ`¶€_´ .°?“ñp?~}¤Êâ Îp( áÎðDØÂÜèÃúªmWâXã€ð÷n`^ð¿ËýÍþUŽø B‘.®„/a°ƒ;ÃÚʼ(7‚°ý„8{ Ñù/ÜbƒüîP–Ó@ÐþÏêwEyðzÀÈ÷« ú–•¶ HåAð«?E¸; оv_¾?›uB ½þ ;8ÂÖî×¶ž®|†¸›'LUñ/í"øÏ†DEDù07ÌêÀ÷«¼¯+ìwüËž Ðßé °C „ÛÁÐþ/åî ôÿßZ`0ÀEl`öpÁª£Ý0»?6zùîp€Í=0ôë÷ï7 4½l‘gßÿÀï—ÏHWÁ@ߘëÏÄÿŽÉË#}þ<`¿‹€"è—ÀVÑÀÿvúOª* ƒþt‹¾¦uìõ—ìÅÁøg1-$šµ0ûHnAÑðÿ7Õ§üßþ«Êÿ‹äÿݲ§³óï0ûïøÿ†¸À}ÿФõD¡ ‰DËñßPcØÑjÂláž.ÿUEAÐBCØ£ÉÌä þñÃ=”á>0[8 êð‡2ü†¿¤æ GÀtð_ßtô_1´¾ Nè—B´ØP¿×øË†¡åôÏ>”P¤í/Ýñ  îî_ôêÑ–ÀŒ¨-Ìç7³|¼$ @ϰCºüZ³ €…ôv@"þ,'øÇPOwwt¿©nà_öo¡Ã`>0(Áì*êXÚrZ%Gëͳ6*‰»—vjÂÏ3šg‰êUš°ZNÒÏÊœS/Qží+[:¶kÉ»¾ú2}ä¿ZËPç+xÂàüÍžÁ&qêæs2Ùÿ'Óq#FŽqŠüñB÷^ ú˜{·elí{õÄl5Ý3ÉÞ¬dEÊ"ja-ZmUE™tbF;+z¨&›~ƒ5¡c*¶ì—„§_cÍ£Rµ^2©K¶$yWÞ[êì_ é¡ïŒ Vó YÛg G‘(IôÓ) âU-ä]fzm¿¼ïoóT^…Ãl‚#¹(q-£×x'(¢rÐe=nÝóD×Çí’ËL¹Ï¡uôÂÄ®™ÖºÃï×¾×V/¨3Ü RaßjI¨Ø—}õ`'ïP¥DWéÜSJ0\¡“Ò?G€Å_Þžfð3äg,›¬$Xn¢ïÃÌß!^ØcÝ5a´}nVò8¦Û>ùsÕÄY~tªýö£k[J™º@Nª(ùK§Eý@é'ã CаažH¹\MÍ™æ<Ñ[VqdM|bb:¸Yz wœìÞTóÛZ„Ý.»Z,W2쥽ê±§|l÷™!k›óÜñ'YùÙ3Â×Q­›ÙžyÈ~cÇ™hªòö[q}d›ÿf±t‡ÇäLQ^¶Xí—Ÿc©ºlÏ]y–±wÆŠë£ØÊï¯a»½2 ¿=©ñCþ0¬ /~`ìL¾×*Áý>OC²GÇ @1)Eý 2|äìH Ð[ü­ÓD„AG/Oœícé¹äbWT’TJ;‘²ÍÑr™`6~†VŸ¿ê`dF1ø]Ïü® ¥il…êB W5Yá"€,£«ÇŠ,k ²-+1OZ¿è¯ØèáÀ|“Køš{ûî-»V­ÜÃö¼7CbøëØ—6Æ~L—ŽÄ*ûEYêâ½%§aź^ó¢;½ä³JæÇò¿ ˜{R¼;ô¹!*œ„—­Û: )1Bøt·ýÆœCò`ù~t@‰À¡"ޏàŠÑEU·7˼[–N¶´¡ks3+¢0¨TTjO§ðÝßý3½îÔêGùnè¹}Ú„Ô«¤jÙ¯æ÷ãí-7£tJ‚GŨÖù_Îa.2Ê}œ;©ƒ©¦`ˆbz 9Ð qZk-Ò\$J>póŸY}öä°0>x—/%’î>9Nb(Ù õ‹«mÑßÁ­¦¹÷†9×·¹2ú^̉—·†åš‘É`\’d ¸HH.jòÍMÙCžíì"2 ÒŽ†ë˜nÊjˆ9Ór&t[6ã.‹'½ë_æ0š¢b$jñf”uÈ„Uj4ñâ\>2¹Óõ²u»ÞQ0+ìÏ|elÁ”k“ ŽÎ„j]F«^ñy¾¿¢[ĸ&ªmÊ`:yÛÒœi6’|­QxŠ]g:2ÐÁØN¬ÁÛF¤´ ³ÊUxÕï=Rešcrug!jYíŒ`6¾ì¦ˆØ¾:žî­È5â$¥É´äy¤â`‘xv©Ùm;ÆZåm‡|ºZÿ¨ÖÊ'ý­vnýÇÓ‡H£äe |ZÔÏú™d_xK8©þeß¾?»ã¯ºžiìöKrfÏðï/šº¾>/HEè~šzÙ£{ë³Ýþi#û?4çž1m+¿V×…FŠ€ÿÊSS~÷­aWeýŽJ»Â»X?s'Ù‰ +‹„lÃ$ø›Yè(©ºH°ÈÝ(È-?Zc|Â5ªó±âYÁYLu5ïË¿‰‹?û°o'ÜÿÉ©‡ø£RuœñòÜ6Va3xÔgçq†H?À6é{ãE"S•Ÿ/[~ö£y›j_PË;žªeY%Èãó\[=€—¦KM%8’.Ìëø3LŽSrµŸ#ílÿõzÖ»ª`/2l2 \HÁ˜–#765$?øü0rdZ8Ý+ð˜¬@_>Rš«·hbøÈ­ xðø«dy¹Ïˆ õ ²{4ǹ²ý…ތ֭é,JêoõÝ*W\@ž‚äðÔw'FYîD1Å9Æœ¶8ˆbTæ§òåu*EÇ0ð=vFë¶û5Õ|‘‚°º<ñ—¤X³¹ÿE%K¼š~zq¢–Cîòe%á{ÛÙ¾—X©'ý& ÜQ|,¤ ûNT­wÇÄ”…F{€´rkK!_"ÚƒD ›–&ª]‰Öds–K#P7w¸&ã ã£J·}µ$|ÇM™6ÊÊœ†`¬oý‘?dà¦Ú¦ÀÂY-J$rå~Ê0ÔDÓ@!Lf”'Û¨yé’ܦßÒ¨ÃÖØ áå1{4jô:Ú)Ú¯ääYï·ŒmÜn¸„ˆ|>cùRÌzHË‘-jóbÙ¼mŒ’g´Õ$ïnUWŸÆÎa¬Ó›:3ϽÇs"¶M‘!AVŒÙ§K@ìÝ©t¬”\¶ÃžpAÑp§MKÐíˇèH <ž”}!‰P}”nHŠýéTfçá‚-¥ö{ͤ{Ä“šó:Ë8Òh±ÓFXˆæG$óõRBùý®ÕÉÃ-®Ruñ’õP,ÐKCCJìÖ¾0:Þ¦¤è€y9ËfE¦¢öÙPG¨ dÑô}"hSgL=o"¬w‡UA:dÕ0xUU<¿ÚBBßÕ µÛã 5«_Ž'ÞhŒ+Ù=)M,ŽŽÚ0ØäOˆOî…Ï­e’‚kŸ ïUœŠ ëU}”ÉÜùäåæy‡,@®aºÉ¯¹Ok]±ŠLˆœÖ’¬èâdDµ)ëáë—s°*ü§Ö)•ÓicTYïá7Ñ!âùôÇ­ó~ÂØÑBíÏ×c‹ñGJ>4Ha9fOë÷ï‹ï¾KþQs”jÍšQ q§µÍVÑÁŸ|ë}Z`ôóJ÷ëAˆ³îÀÝã~•Ù2¿(i ʱ9’RŠYyâ!ýz4¹ó¤è1”.fuôhg†ùMz̹kµ;µ½@¨ã­ÔlÁd’í)Ys+=É´O_ñŒ› ®‚¦”cÃÚ0ædnåšñ3¼äâѹÃpñcsGc^LyýÁ{ì;£Ïñ?óÚß L‚Ú«8j?páÙóà ÍR ÍVsF¹,²'%Þj3íyfh91 MÀÕ‘¯ö@Ù6™j ØV]J?¼!.ÕÿÍ^I3f£ÚóF7ÉÕ(˜Â•UÄLÌmžD©úýê²Þ('A“ßÒ“pèdÇ`(¿\~rPm7Ë·¢œà^r†ÿœXÏÈëò™åñÎ~Åm̓သbžç®3>w¯ö°K‰ã²ð‚dØð6bìÛýf(œkŠ’#N÷·¸_¯ÑŽÖ27¼l’{« \žžbêò*ÌòÎŽl,/iÁŒÇTsâž4­£ÝÌ´Éë‰ ÷^UyR5o~Ò¥ˆŸðUHh©0ö˜¥øJØ]µÂU¬j@K¢<òDm· 6tDü-Ž•§ÆbôzÌ HYs»gb7ÅË™ù„Mø ãNL­èir ¡Êb›\ÈŒHÆ‹*øt$‰ÌÎghxu-’Ï—ÚÎbŸ`KúÓÍrÍ:é0ø¼¦ ƒdý1[mV ¶õ‘À5Nçæá$ûú*¸tjžáqצߤž£œ÷©gD”¥5Xå–³‡;NT’ÇróË‹§dÏôµ3?h“çnÉ>+o©G»êKBïÞUî-ÆKé~Êm©¬ü$P÷ôƒ,ý  ñâ¸íùWE,'jî`Ð~ygF½*dJ'§”:ú¬’ŽîY¸«Îg]÷z….xYzÿŒ“…›ücÖü§d‘W¯ž›7蛲5 ½ßºè›SÈöËJ€Iî±7}&ïÀ¥ópÊÍû†<À«c =‘!ó O]Qª^¯Ü¬³{%éÕI£š4ëS”|ÈÁm*}èËéècêƒABŠÁk.І)-“›êA`M§÷û3ø:'ø@>g’Ô6ncÚ5´õ‚2(yÙகCÇ¢C5æAœÓajD{ËÂ3ú· õÕ΀ã%‡Õ‰ Ôº—VŸºs7a¯ÊË4é$Æ:8#pRKV!Ä?cÒ'ê~9´i!¼æT¢ÄJÁ~aâz÷Ù|Ÿí-kã¯uϬ7qÌ'bØÞ_oí¶2®(×}O·«•oœ²› ëY(dçÀ¨­LgÒ[ÚŒËRõºq%Yê4Ë}Xõd(é \ ÕÈŽƒëøtN…S-Âd­77i•]"èm~ˆqL—Y€¿í¯¹(Ê ÈY£Ç}º ä)½® Ñ›ú2d5–«ã׫;ì´¶ˆãvkR“Ã% h³Ü ØúIXc‡U‚a¶XÝÎ-¹ï£õBÎHQÇ¡[/W•@b0+: Ù|9ŠOX"O¥4Õ¶f­ÀÕ‹¿—Áï¥uÿ½³ò— C¶ÆU߀õA%Œ7'¤³´—ôÕ¦ÊÈ×Ö]®Ñ„Q/€-Çk~óŠ„m˜yËÒv–ž?Âê0÷¯iÞVäqÕŒo û˜þAî¦_—ÕðnÞj?Å-¾»MŸ$|ó^¼¹ê‡Ñø)k¤ùŸoÄjìÙWhÍe½Ë§¼@àR‘ã´ªS0oµ•žOYµ‹“F=´¬æÀ]Ñ'¹/Úß2øˆ¹¸NΣzK’¦Â|Š2†zÝü kÒ\оWóÉ5V=Uw+z… °þ&¨ïŠFP,Ž¥õS¹ ¾âÈÔ׃}pCâÀL"¥(­©jür’d×[iéàlé“ÑEï‡~µ (¢‘Ÿ½Gxç«Ú< \pVç[¨pTËLÍèuØmZªŠIîÈÀõƒÉ¥s³±U_ú¾ì¹b®ö$\7úÕàÍž«…ñéVTyÔkTFrbA Ó=>T(ŸfprùÔý!ïws?Î`ô"\¶8tÆ sذ õEÊÌB­FsÏ ,æ[>9Hñ䆰_ZõY–Ä2ˆ[ûÈÜÈ·^àMã±æ4cÞZ[8>™¼¾=+¦ÒãfÈxƳ‰N…׫+;ŠkÈo)|?¤#¢:'j{ °ÎÛ¼åˆi$ð5筩˳'sS´†õBƒ6f¡\‰ô1Lœ€~DÎéFkPr÷m±ÖÅ>U³TÛí4–):D”¶•Cun+I6©ìul> »T‘™  [CÛ£žƒk +¾g³…Û2sLžÉM»ao[ó$dcë•£ŸfÖ³£S¢˜l„ÙµâomXá'´Ë4@N P)ÙnÞµ ˜¢!£$¤ÝI”W"¯óÃ÷Æè;t3¾˜JW`ÿFsÑë›ùÛœžLTšÃgÂiÜ«—´Qd½_òu¥íŽõH Ðt~רØí-œ#ª#ôÇ÷ bèÅ*tLÀ`ï\/.M¦|ËÜÜõ†ðR?³FÖúk…àpœPÃö=íIß~£HH–g[¡<·a åL `”íçœçÍr§óKâUú‡ú¹w¼Ø°¢ egíwÀ|â=Æ•\¶—[øÞW>0/úÎÊH$¹ŒbƹÅ||ðSgߵ܆G%Ù*6Øçp¨®íšL4$rŸ›9ÃüðaÅð Xˆ bmAŠ™‡h£"¤›ƒöaîf#¡9¬øôÍÏI«y?šHhƒÇJBÄ‹—×LYãÕäk'¤É×%:¡¼ŽOêÖ‚ý¿_ª¾œÄ»2Ó%C¥á:óÚ8¦)$–®5°Š¼²[ò>u²¾Ü‚£Ìœœ-:¦ü·KV²Ò+úŸŒžø®ØÏH—Ÿ²œš•§Ü7IöWo¢È÷eÔ+¼®ÕCþ×¹ÓÍŽ_2Ó¯7É#˜þ ÛþXGö½%:TMð)‰û9šLV’X¼*Z†Êi3Éc‘==‘/@Zé\|ÎM÷¿êí”»µ™MÔìexXo{÷\î—è*ZPet?–}ÌþœéúÑÄ•a¹PçKu&Ì !Eƒë#xjš';c¸³2·ã¾de •®Â×–&âwŽ2Ÿ¼xç6Ô8{=¾ƒÈ¹—L@»ÕÖØ9”´mï±ÛqcÁ£&nnt 6ëOKy€ŽAÑ4Íý6ûd9Û÷î‘öeß#R¬ÑÛ‰Rðî,¶…Xà›‹܃ ;áü'“¥‰r¤åoò[FÏî>ÈÆAøÉh¤àéJ‡ß}ô4²C_ss¥òýôL´—®—É)Ý^Ac2àãÌSÑXòë„cÎdÌ™[¹xbÉòO4[M‚;‚¶&ÊçªúO¶JÔÍAÖÛEfõoIGæ²?Ðá×hU.~J…9®ð*~ºïYHx‡_[7tB}ìÕO³e.ª;CšYì2uîo&Õw?ÃßÛãÜ¥ «÷n·~OÛÞ½u]¬hÁÎlùº”j©$¾«éb¢/BׇaÈZAGºö¤0{G¸Þaõ´ËîibÔY+¬Ko­'̬ª›( ÄkRi¿)»ÿzã[‘“®Ê„©QËŽîy{,Ä`ÐFsM³±\-ЕÞ5¨ïÞ»m..º|Jø¦þj»¾ã¹¬ØTºùg{²#‘ùTµÈó=é)Ê—Ò´Xá/† Љi{3Õõ“ñ²~38n“üfΪcSÚ'SÅü~:uò[óœ Öºö¡Œû¿˜B|N²R\ëÇXtØî4XeÙ1ÑŒNüØWhº5^N K®‘º¬»£ŽÎݺ”2§vã¦_X?©5èV§ÕáÓ §UJHs×ÍÉðeòi1åç“/†¯H§ºç·gáÄ`Ô¶M4·L [~ûžVMT­£ ÇÀ¾O·ÍéÒ;°êð#Qââü¸øDfÿçSÊŽŠ/ùävâ8ô @ ¸­ìÁÊ¢G”6Ôöƒév ‘\Ç3Ã[Ù•7ä°/Jf%}P2þOsHoÉ~NSÒp«µ³RoÖ4Ûåe& _)WðÒ’¶£¨²½ý×aà!£A£ó½<ã.Eî¤ôÅÅ“2ÉRbon}ÿ¹ÊX4£Wµ\ÆÓÑØdý™NˆÕuÿµ…¹vù#ýVoͳ΄v×í³ìí«‚aXÉD Ìt;1ÓoœdÊ5³¯9Ÿ-äXìŒüð}§ÖÅæo¹ü?¯—\- endstream endobj 1009 0 obj << /Length1 1403 /Length2 6103 /Length3 0 /Length 7066 /Filter /FlateDecode >> stream xÚxTTíÚ6Ò ÝÍ€t-ÝÝ]’Ãà 2Cƒ¤”tI#H‡€„4JJ—”(HI‡€€ ò¾¾çœ÷üÿZß·f­=û¹ïë®ç¹®=³6;‹1¿¢Ü¬‡!ù…€Re]cK! …ñÙÙM H(øo;>»Ø äþ¡ìv@¢l*HPhyCB"!q)! )  Jþ „{IT| N]€Fà³+Ã=ý½ .®HT¿o\ n€¤¤ßïp€¢Ø r€t®`TE` AÀHÿ¤à’qE"=¥}}}<p/9n>€/é 0#À^>`'À¯‘zà?£ à³L\!ˆ¿Æpg¤¯ƒ€2@! 0 ñ†9½¨êcM€¾'öXç/àÏæ„„þ•îOô¯DØï`îáéó‡À\Î( ¯¦#€ôCò`N¿€Pïàã:8¢¿[w¨)Pþ™ò‚x"ô׌‚¿Ò ¶Yæ¤ ÷ðÃü_ý©@¼À Ô¾û þ9\wÜø÷Êsrþ5†“·§ ) òЬ©òƒ2áÿÛæFÄ€’ââbBðCØä*ø«€‰¿'ø·ó·5Cp 'ÜàŒ q£¾ð>`ÒËøŸŽ®ð…„NàvÀðÿe;ÿµF¿Ä` DÑOüõù× ŠaNpÔÿßðßG,¨§¤d®lÎûgä9•”à~€@~aI¿¤8 $$$ÿ3äOÿ« s†$ÿjµO·ìó‡\ øg.=8й`׿‰þ(¡.Bÿgºÿùÿ±üW–ÿ•èÿÝ‘š7úÛÏõàÿñ;x@ þ(æz#Q*Ð…£´ûo¨9ø/éê‚ ÞÿíÕD: Ô sA1š_HT(ú—‚Pƒø Hë_¬ùËnúKoP lG@~=aPQ@àùP"¹£ž"5»À( ý³®* wú%6a1q€ƒ——ƒ?>ê¬Q+1@ J•N`¿ßd ÀàHT5c0Àî…ÿë`E‚ÔÌ„;ê\9Û…€âAG¯ß†Ty{y¡ä÷›¨vþ^ÿÖ:ìá/ÍÃAÒ‘n/#;¯êé}ù·Æ±W׺c“-bÄ Ï]uprÔg*Ù;ÕÒŒ>5X¬Œšž¢ç9ºšð{ð&/l%S£‰¦:°¡tÂ_4üíì ˜É Nç2)ñ4vƒô8Å‘ØÞÓš3Í|þú±D¯Èö‹Ï%7݈m+É}€ ì‚„%“™ XнþÄ’…m 9bù€$‘ÌË:ËÛDÓtòý $ñR©3žö›ÿ†uböÈÇo󞊜k÷Õ‰×F‘ÓRh±Œ¦ÑR¦äi½B q(‰](Wf$³Ò–zDq¬`ØK¬ü˜-ìHñnvÑS»«ÿh¬Å».6/[лrÊ`·™kòM¦55Ö•¯þ)›{ÚÅHÖq´°“Š €Ýؽ|«; /¯¸´ÔAßó(BÄöóÍ•}BNаM†,ôþЧçJâP&ÏQgó÷×2r:vrM =·5ïÑ{|_Ÿ@ª-˜Ó`ç;­o;Gz£OàlGŒ”3aÉ]9ûý{)¯4Å.Þ‘šñ¨Š#´à=vÜII³!F…˜ÝêÒV ’‹S¬If"ÄE&¤ &:ÛhYzx–RCgIˆÈÝ*_¼¯{&Þ*›q?øhyê䎊áAIÃÆ]ÃÞoX¶ÉŽ^'‚¸¶Ú…ÝV®öåzœZHÑdHË~òõŽ’åL؉ÄüJ¡ÒOÓ;òŠG ~$~Ý>o>.´PlŒ±‚Ʀ÷Ì„lØ=cì²LdÈz=uÐ×Å™±í§Ñüýó„ÜqD]jˆ5²ZÝ’$Ö®üq2ÖÔzÐA§ó¼׫w̹åüõ¥´èf˜§íN³Þ±çª‡J*2bÎÅÇ’"µº¡’˜1f!*„_ï“:L5‡ ÏÃÐ\[ð7¡òÚ琢÷­Ùž´Æ‘6~W÷<¹ècøHÞÞÀ ¨5ºÄ( W»ÿÃÇ@äÃ'A }ñ·þŠðž†£GûÛ6æéUÂuÛ°c,EWËÏ¢ZI‹-“æÆŠ- TOtn„7ì„ÛîÖ¶UÂ52ñ…¨ýfh)†÷8{:½iƒ:à„WßÍõ˜rTÓO˳ےfÑÏp¤odA™Õn©„袹 ½`R+püRV;Ì %T¾²”•.÷ráF2ø8ÏÁ#x'iòt÷™ƒ/¡ò ž•Ö£ZÛ£šÏ6UQ›$ï å‘ÚUúÃ3‰,šwã_ξü±MóÕˆô§rÖ\:»gìKÖ·×½*$ÏX9ùì]ÓgyA_¿;ˆl©U@12ºÏîûaÖÐã”Ì S5Ì+zk×¥YÞ›­Lý$Tn¡ˆ0ƒ7>]öi/8H•ïmLg–NÏký Ç9¸Q^Ýý€µú[KFõ´Ñ!–‘rÆb)fž¡Š+>-Ѭ‚_ÁÕhq—;U‚£3t[QóÊÀ½ª1Ûw)‡¼ÌIsX#À t)á÷#™)n8ìÀxÄÔ@³Ñ9P{¢rA÷˜àhܲ®³èPðÀçMÒ¤uQÛE¦Vvý"…ýlˆ¨42™ÎD­ç£Ë!>)s|ƒlM¬®¦åºòçûòkiž<ó‘>D Ô²ËBˆà uâ4…½T1Û‘ŒX“­ÆûÎíQ:òèˆ6}îÈ& Äìçv¢Çx‘ê%ßSž“Ÿ9ïFOÙ’ª¸~8—Ù,ÌÎ^WÊÝ›þþzp©!ìÌ©|濲^o7ôbö…‚ ˆé~ZŒNâ!gíç;Ú1×¢îú²Ô‡?«æM© | àªOV¨?»£¿Ëæ!’À}ˆaýžûàòû«‰ÅÙðŽpÛ¶Wñ[g§6¤÷¡I›¯m‘‘o“××m¹sXL¶úCÏÐ×jŽ–¦רºŒY‹¤“v2®½mÑŒcñÅN³Å•dI—‹}`ËÙ&¸µÙI “¬§/+Ém±ÇùC‚c¦‡ g3yŸ0ä@ˆîÜT‚&‹L’îþ¤‰TÍ©þžÒt*à €47ÚC¡¼)©£H›š¹ŽêÊò¬ìáAॾ,; ™ãâ £¥F;lŸ_µIÝv½ãîJT½·¸SêÄYÓ·ÕCÏßÖBðVM~Àþ%18z©‡>~ñ5Çèã:«kºþb¢û“¯Ï—@£gÍ“pŠ%ôš¸\ÒwíÚÎÏZ ¸³¾â<,à]XYúg Œw”æÞÁ'·Ó‹¿±çWhÄ’™aßÐsžçM6L]T"+†Kˆä?6XPb’sEXF<î¿t×3o¶|}¨¶(³£ܘ¹ë޸܇³jtÈõ~nÒVx‘ˆ®x}sàÙ?A¼ òˆ€Ï¾=¨¥5Üj§¬,òÏ'JKzïÃLvÌû(¹¤©?]µ”øîåFªîàþ‚`í#Õ>rñ1Ƶ8'jÉ@¹i×Gïh›U]<˜ ì€ð§°À¦Y¨H‘:ùu|:oÐv=×f›ÙÜ—Õ8õЍD¸¶3½9EÀŠW¡Ý¡ìuÖ@Î*ÑÑ( ]@WM_FCÔ1m€à‡Æ–¥€>«È ¶X•;Lƒ¢üÄßÖ€ª‡ž-qtVÆß[χ֢kpcß®Ñ.¶*n¦·½éBB»&4nЬÑLÂüºÅŒ byšžÁ•IeÎeÝh¾îï£i˜®4„¸%p+’ ¬ S}Çál@ÆÅŸaMÕ}fò2²Ø€³íûƒA=¥rN·nþ&9 a}ÍfCŸŸ®Ñ>,sQ¡M9K9^|ÝžsG2«cË$Fy%D°ù¨=e + «ÎÈsøT2~ÐkrNóIÜ­ÎôPû‚ÜÏ­¨]{üŠ×Q¨~þå‚>Í\¨ŠÎ±¡†HØe‹? ~ÞyÚÅ)3eÙµŠ æ?¼"Š/”‹çQ»÷Ô)úK <13ÐF¹JŽí'†^€ ËT Ïsx;Ú,–[Ü;~½a‡ã¥ãµðÓûIÚ¾†.<óx„lɉÂæãbò'z÷tÌb¿½½¾ò ¤€:LÚ°S°–Ù'wTÚ½0|a¡Ûô|}1È4‚ƒƒHEó°ˆHÂ`˜Áýå3C±IÑ!ZÙ…“va±{uõXœÛÇêb\z0€ºJýãóÃØWIû•憻쑳4Z/Û-JèŠ{EšþÀþî瘳÷b¬Óî•0F¨ÜS}žêéY§ÆS]ñµa%ËçØKÖi&»[B:ƒá,ÁSG`!õµ{[n¨3GŠg|E‡Ñ}<²O2•Ã!ÕMš—1²Ç=õ^1Õ¥¯^›g/ÌB»}Ù¬…3`ÉêlL‘ñ=7ìèbònãœIg:i_vò²ÎÄ*‘Öþñé®­ ¤âƺìD !“ÿ¡U¸—å ÅŠiô÷ \´Ì{ØßÄÌ"÷§Mãö„_^ÏÉÞÆç þÏôŠéôaï r$¿”3%on¥ñà3òºx*†òÕó½‘ r«#U—Èý:GzœY×üt‘$D`WP­‚ž~¸mXœ‰4Ê[kC`eð¸ÒÑö„>oÎ{xžiEÛêÖ3ÃníNögBDÊ× )w{”˜ÌαHª·S%»Éâ?±‘TïäúbÕÙ‹‰\–ª¹Ìö4Šæ+eïlæ(VT“­u=|9y2J̼úzeZ´'Ž)º$yêHè…3Í;¼š3¾yãBñóN,†g^%åÖ)ßøØ"èlnø‘@}Þâw©Îv[HYº7)\Ô6qw,ýUõ‡ÉnµñìtP}CNJ¸,Mígê;Ì<£]U؂۾Øý±F÷Û¹––žä‚Z»úô84=ž||.gÁòÖ#üeDaJEd~Ë:c¦¬±s•ÿ;õ\ –ŒÿUžž7¡C:Î^iE×€@Ùà1:R¯©´?*ü’¤Õ]QÓ&š›Z÷Š8¤Å¸øó­e欙.<;;iŽ£‚Ç6‘q(…ó¤€F¼NsÍñj8Hfub äée7Ó4Ýa=ÙíÞRo:ˆ¨6´E¦è‘?§ÇB&Ût7LÒ“Å®½Ü°óý×MÎ2½\õ¦ã5¬,9"ôŠñ×n6Md°3 9­¢ù%•ÃPY½«Çwºa„Œ ©-¹äX—îóì<éw¯ð¹‚¯Ç]¡}„žÅjlô&©ø®·]Ù”„tÑ'Sî;= TM¥)í{â¶D»–M*ÀFi¶¶íJ‡Ì»pgswg³ݯ£Ä<9·}¯#éPÆ4ÏT8=û!’ñÔ“jX÷,Íðsv,¦ãZ¥ çÙæ³g &i»Õ¦ïcÚýœS$Mí퓾ù-öÐN ä–™ë)Àó8ݰ†HŒMR5íç=ÿÂÉCuóÐ"Ôäì)C?ï~*ˆ+_)ìAË]0:é|ÞVw˜±¶^|åk£Îžý}`=I9K§!Sž ±ê×vî¼­TÍ[3çõäXuõØ9ýÞE_›!Áð9Ûw¶—²tŸÂòä÷œD@Ü$6"Ut™D{s shì<ºÁ }tÙ»¥ÒÊNÏײ°†½<»hë…(Ün ÕHéHzb@ŒÈŒCuÎËuå™ížÜ˜µÜØ?óì˜sH‹¹æ¸Ú¾ç–6ßÕÕmÇonŒ$|8èÃÑR7r©¼º%¢‡Ö¢c…hô51ðL¡Bt¶OÖ_<áåϯ­,2}ò´Aí«é•k‡öDTouçŒe7X‚\XÍ•q q¢§ÏÑi’vqÇ‘|CÆe©ÉŸµñõHÚ~Žrû³â®†TÓ‹gk–ŒŽBiÍëC­¾CF¶–Ó9´D|øÏØÔ*Þej¨,šÑÉ{žâøO?m£0XaW“íïTŠÆ¾Xº(R×^4pm|¤×dÝŠ©9b·ªŒ{bB°2㌷'3›™vÇ^õ«¬*4¯ÅÙy³ö‘Í>Ø›8ç}ȃŠPÒu=awçb‡3¸·–„H~É^Ó©ÏÚ^Ïyˆö²y`žî슈üBRB¥î©Í7)sZi RæäÇ$YXëÒX‘JÌ©x±åäIkšÒò…,&%1»¯T¦6›/"Re§-â~Þ½Ikzꪋ”ó—­‹âÙsTÆè~dKØ… Wôj(‚r¶\ ”e\ŸÝyp~¹X8Ì †¾QdÆ!D£_x«Hk»ˆ¾?›N`’~åÍͺÛ(ýýƒqFf¯O×èÉõWåGò=Z‚©j¬â¦õ@¹mlôsÞÚ†³‘@ZÖ‘ÙêiÙý°/ˆÝ•Ã?¸–ÍÚB˘ﵸþGà'¡ÈýÑ1Ò“b³õÑÊFÞÒÒW5µ¯¯%âMá9/æ+ý··FúÓpL ã•Ůս\ÖM±ûIÄÆØ’¢ŸÆsÕ'5÷Äá>Êø¨^µ¹x¿àéaQ¶®ÏÖ*—5²»©XU`‹öŠHìÔ(«íÖô7—‡?% Ϊƒ\Òž¬²?GœA ¹îêˆÃ9åÑý°8<ýo_öíÉFpË=S³[W+4Å©•3µo”1}ëó=(pª?Œ¿c{aøƒiZYç¼ø,¥•Ê/ËïSwãcµÖ•\,ÂG¬‘›ªirãQA-Òö˜Ä>?د˜ß×™X‚æ±mŽÃÁèq¬êOMéÜV«±#ýãN>~sRÞN†)TÞVþv/MœXÓªž;òn¿Ñ²Y„Öù}â÷=Ý·x©LÒ£¢Í¤Cû&Ú9—ËEÁׯ¹Ì,{´×z/äÑ~¼Ú·]&[bEŸ¼¡uý\Ÿ™:†á;>øß·LZW¾—>R8޻Ƚcà?™:dž ªYvŸ{êd¤x`Ï5ðX!0YËß\®ç$fSî{Jݶ¿ÂçÛ6ӵ︿_)ôiH3Odü•%*¡,~Ií'X •ÑïŽ3pùŠ0—»¼7÷ õŽ£fÍ ¹äô> ¢d‘[ùlJ îë|n;÷"†{.›?ð•~R[½þüwa£ŠÞ&b¿·;û¸Ì1†¸ç¾J.S)ë7Æ7¹¬ UÐ\Ç“‹é¶†,Mÿ¹ª XoF÷b=½*Üu ^)`+ô‚9^?ÉÈ‚öÄ"/?÷³3†rïz ]­,½®b¥nöÆÏR§Š]ñö/Õ#Ê­N9ép)ÚÊ¿f}ÚvŒ1|Iw~Ro %+t¸$ÓÒàøÐ¢‘¬„®?b ×x GQ¹}½qI¥º‡Ã·6ž!•Õ¥†“sSð‡i†Ì>•HÍЙ. O·Ê Å,¼Mc%î14o¡óu:E”G?àG»¨õÌ ”^mÉq½úaqq’<é`Ov_‚,Ý’&»éâêíÉŸ¢lDsU-.C0Oþz,.{ÐÆ!ФdzýÒ¤½0-™|;Þ"/kÂ4C÷‰uÇcÀTãrç™WÕ©ÓG=?dÿ&—+ŸÊJ~.E¯]EïŽþ¸ÿòµ,{ÞÝ%sy8¦“thõ †Ž´·ÕŠùš}öî¤ Wç0_¿\Ú£ˆN±žþ„²YþwÓPrŒzÿüŸYß ®ŒÉ°h­¾í¦.gˆUÒ0Ù—e©fnb¶æ^­‚ ø'[°Î”Íõ믋fÐ]ÝÄí·Ð² ÞttKN‡\çqÜìŒ{HÌzÝŠ –]€¸E£ß7MêÕ=šïÅa]»´N«_­ìuñ"ycRvãy"U<’ “VýÂêfY 7™&óý˜ù5úõêQ!«9Œ¢…ͪú¶] Î]º­A­—¶×[ªÌ ¹\RÚ[³:9^öÝëÍfܽí!É&rQÙ8¾çþ²kº/ýÓ~•òR@¾¡ß™©çŽV¼Þ"pŠ9'ò;sΡ˜^W‹ œSz&·›[Øà2¿A9Àcç¹>f;Å#:’÷c¹rr7ÚÄ%äŽU ^G—ÌÝÛV‚ë)ÂÁÞìù4ÙI^ÜWØ:‹ÓóGv³½U*(gÝÈ}U\â ßÍ*BZVWüè“·U3âгm¤­¹ßþ”ÙŒÕq@!ÇDEr5€WJ ÏTuZùrGú¼Ì•” ñšzؼÀ5 •,µZ!áBê»[ endstream endobj 1011 0 obj << /Length1 1399 /Length2 6072 /Length3 0 /Length 7039 /Filter /FlateDecode >> stream xÚtT”ïö.Ý(¤ƒÂ04Hw·t8  1ÃÐÝHIH—Hª4"Ý ¢Ò%Ý‚„ÿ1Î9ÿß¹w­{׬õÍ÷>ûÙûÝû}ŸçccÑÑ瑵AXC•pˆ—O ¯©o"àãàåãã'bc3€¡œ a"6C(Ò †€‹ÿ/‚< F¡10 ÍÓDÀjîN$,çãðóñ‰ý‹ˆ@ŠÀ0€&/@ ‡º±É#\¼‘0;{z›½8 œ˜˜ÈÃßéYg(Ú`”=Ô½#ìÐG@`P”÷?JpHØ£P.â@ §§'/ØÙ´“â|ð„¡ìzP7(Òjø50@ ì ý3/ÀÀæö×GØ¢<ÁH( 8Á P¸:ÃnEЛôU5Ú.Pø²ÆÂCÀß³€xAÿ.÷7ûW!üw2A8»€áÞ0¸Àæh+ið¢¼P`¸Í/"ØÉ Î{€aN`k4áwç`€’¬.Œðïxn$ÌåÆësú5"ðWô)+ÂmäÎÎP8ÊèW 0$‚>voàŸ›u„#<á¾¶0¸í¯!lÜ]€á0Ww¨ªÂ_ "úfE„øÄ„…EPWÔ büUÞÀÛú;ú£'ð÷uA¸lÑC@ýa¶Pô‘¯Ø @!Ý¡þ¾ÿ;ðϰAPk¨ NôŸêhjûg¾|$Ì `ƇÖÀ÷ë÷ï7 ´¼lp'ïÿÐß/ÐTÞXÝD™ûÏÄÿŽÉÉ!¼¾< !˜âG?DDùþÿ,£†ýmƒï?¹ªp[@ìO·ècúWÇÀñל€ÖÒB U püGäæ|B|ôôÿ-õß)ÿ7…ÿªòÿù7¤äîäô;Ìñ;þ„ÁÎ0'ï¿´hÝQhh"Ð6€ÿ7ÕúÇ´šP˜»óGUQ`´dávh1ó€yùÿà07%˜ÔF†‚Øÿ‘Ìüñ/«9ÁàP„ì×·ÅÇ÷_1´¿ Žèï‡Z—¿CP´}þ¹¯"‚°ùå3~!a‰{ñ¡åÄ/$ð¡ iõú­dŽ@¡Sèý¶$ѯkàÑYO'¨-êWè7 ñ€Ö`ˆ£›ØÍþ7ü]!îH$Ú}¿Åné_ëßV‡B½ ¢/ÓÈ£0‡š°æó*YOž¯#x‹Ë­OLz¢„PìŸ^øÚkàg*O¸Ê=±)¿3”¦óùUÄø´×þù¨—yGvðBªJ C±gUî'àâ[‡”ÙAo7&’öt•ü Q—éö3³ÉFÓ?ÃE:6*Ö ¯ZÝ6LÅv΀âïd,© ¨8ÙÜÖ¬ÖeÔ ‰9Y<Ò,ÝÝ@õñØV ,þL®9–îÂ{Õ,>cp~¾?»·'Màø¥zW¥py%•KîPRub¶Zƒ»œÐwùW) ÷芜#ذk¦@ŒŒ¬ñÝt|΀F‡!YXfRû¶ÚX]Sóø0?{¿ËOo¼l’#·š‘)Ú`,p¿¬œ²å]2˜ØºÞzôT¹îëâ§Ñ ° kN´~ß᡽Nù¼ã×C•[ZÚ—ÑK .M’°Q‹»ºB ã¦3ú³5$~ºÂóÐØÂößÖÍåéžQPÜ‘¿çtd¼þ)Sùhg3xZÎ @þŸqÇ( ·ò†â†Ù²¦Õ¥ŠæqÔP—ð+nå²õŒKu½âò¶À܃!KÄœàZÝÖèà ’Xå*ý%¾9ókKàÜ·ÇJ ô/5²@üˆGü ÷RQ"¼ë{rÖ­z±XÕ¾ __)bÖëSuóÖ‰ÑâR Îãð=ß3D)KÐ߯ßÊšMf~n*qðiñq]g~H£Š—RT?2S@ã³]éµ|MˆiÎóCKåm2Íà¸Dš\ž«(†l>ãçt) «n:åáõƒí*÷ôã¬éŽo ÊÄwµ‹“@V—Ýð·ž9äXÔ]}ù û;êÉÞ‘*9Ó!æÞx¼è%µæUâÓÛœ*µç§®à†tévìÎGŸïÆ';¼ÃªyYÎ"ú4ƒ¼³á‡RŠ@)ƒ%'2q•[WÞ,U5ˆÂ}sX1dì!9Ý”3ŒâJ‡4t3“õ­,ãÕµ^¿´¸Xž1æØËvÛúåE£çòùkH ‘,êH¨àëš«ó}mq5¼ù¤œÈnÈ©é‡ÑÀú™VA•fžCC3ºM°Hß‚-4Uc*n¶º‰ßÊËnaYªñÑoÁŠPD²Û Ê_ì~à|g*¤ç#a“Q~-d­®ÓöjÖvYV{.ñ‰¬¿ÏäIÇœð‹¹0/­¹ê¾Ü™áTˆ‡Ù†eÄQ8ïñ=¬‹kŽäëÂýŒ›¬éƒG™`rVË–Ó¿8 Á4¯¥ÓÅ’›!Œ×D%aä¯8ŠãÒŸƒe {zópaûÏ™¦t¶>>ÇÒÑêƒ ÄT_è.Y£L.êÕÀh×ãÁa²¶ç8±ë#Çû¼ß@¶GmgïÃHs’Ô¨äÈ'=¾{,}Eæ¯p Ì`$ ë7•4LKM)^y½*Ò (õõ3{‚v]úW‚´ÇuWŠßš¿ŽŠÀK.H¯UìžÜä¦ÄùVMIsiŠx™2NòÏÊ2õˆÕ!ÅU‡Ú‚y¤}[ß;ã&4~äº%Bàªì~÷ˆø'—œ#‘‡*BT@SXBÖÑir7÷âªE¼†§vG~ª„¿;Ñ#Ö˜ÃÞžG/7.>àIBdPÐm¿Gß‹ûê_QHDcÉa%Ózâ…¥ß*LÚv|‹í9K9hrí|ÑäÁ¡B!ÍÝD:é©•[õBo½"ðܸq8 èF®á{5ÛŠÀg–”CÆîޏP Ã@ YC²Ñ/ÑÎ9‹í¼ fþg«"W¤3Mq x\ "†…nyyMR€êUq±•þA ƒÙ´ß?+Ü~:°—÷}uÆp³Ü÷zg– |«»mx—eÚXLXñÄsÊv§3;ç~¼Z+Ùˆ¾' ‹ÀhÝî^ÙòÈ{Æ7K¹µ£8Ãcµái†Ûj©_]†Æ?.7í ›7ËRûØ¢«NG›Ë¥‘&Z¹^;Y@'ÃW•ÚOýãzfÖ߯¿J©ú‰ÁòWǃÊg©üé9YMŸâz#ËïGßfÎØò²îyj,Cøf ŽðÍš¤é]Ÿyü0†%T‡;²æôSTÁðq%ñÈ?_þ££¸çv;‡@êþz¦æ°±p¹â0 y¢Ê‰Á»„ûœ—Ñ tÀñ>‰¾:JOŒDÇ´TQ5v\6ЧI…ú€3Ò×ûáøZMæ¹[[õbéMIŒY“¥¯&6_„¤obLÆÌÓP–»åáˆÙ#\s’ Á÷W~€©`dŸúX®Sh±Ùˆ ®í÷¹˜¦Yø¯çß`èg|½WF饯y\¬Z±‰œ®ïaÒíb¿µV~ÚD\zº³Z,àÄ>(‡N?"ñx“#y çÏŒ2j“>4¦]NPÚc œ±¹»™U[¦Ä2&³x@ïï_íªHs{„!¥ÌÛº0l´Ä»ôqkUÿÞ+¬äÔ¡½nbì¢Éæ€ö©¿«¾JaJ5Fñø²n 4hxÎØœ4.¸Àn™¤œŸC*¯›Å̬~ 0:œ"¡Ç°‘è"«ˆT(€Ñ¢Ì­"ªŠnBÛ€¯ò¢‡‹ã÷oågòƒ9òð ùg𵄤N4Îmh‡Ü3µDÂqÄØúžù ^Kè?./p²bnª~L[á!FК&9ä°)’&Šÿ‘%£Á*^ccaßͯL O°Í›vºÜ² ý©©—ųõï•Ò‹‰:ãÉweÏñ÷ý.<+®¸ë5æZcÜ ÏrIYW©+óGr_z†ÉêH¹ÆtÜ6Ä϶ ;RZßx;&l¼0~R‚Ó›mÌÔ\SÈ雿jínsȺÁ·¦š Yî ç4•þÀ²cLºfág8èü׺ÌdÎ/y;a³ìM§Khâú72'ÓwÖå’ŠÍw] ï ͱÉWe¶u}¸uDfð U÷Ë•„_°Iƒ=É¿0CÈppÅŠêåËúªŒ‹ÉL}b¹c:•úp­®Ä;Áý¬9iûñ÷¢)y%…¢¯‘·š N˜~QZ>„¹Ó»Ì1Ì<µ]ÓžmRÚOî=艺çr!™GG¹ºÖèíÃòb2“Dª‹qáøÝÑ*;bγð˜"ž/p€úŽ;¹¼pºuJMãòݧáö;à3LÜH—÷t•¤mKiÄL,5ѧéÕÀŸ°FÇm×ÎÇi7ükEcù{ïÚº]ßõSDUÆ(—†d(· ‘áJÈ6žî|R}£å¼`T³òÒ<ôRï“l~Åõº)M™ùOø|?”œ…ý¸“"j§þ)Ûs˜BÓUз˜£¡ïY¾“HÖõ¸ãÛå³1ÙBÁQÒCÓ›ôj&ipÙBli‚gÜBÞìøu±Ë8* ÷¬xŒ>/c.>âŽ<ßïT“ÒKÙT×øõ…rÃ…[orI›ƒ×î ~™)IƒTI£:·?ñZià=½-˜ƒÉEÆ}ͤ)«»¿ÍÇÀí7›ßÄðºÞB•Æx9döÍÆÇ’…l.Âç=V8z‹O Lذ괄V"…w'­v[‹mS°Ë"‘ft.ú* ¹îÑáqBC·Ê7AÝ…ígå›4ºÀo¨KèT÷$Àt.A(ŽÏ´a)äDdÉͯ˜ÓT#45“Db•è‚Ñ[—çsLøŽÖ~ûˆ±´[‹¤<7™ryœ´ËqJ>}ž¹L톱z‹˜dSÃŽqIkDûJsÛœ¿¶9‡ŽpÅŽyˆ["É¿[zÕÁ¯˜àÑJ¶¶Ï]Æö:Ëçö=½+í1E‰#Ÿ›X…ÓE£•줭¨E¿_úžœºÛöb›L\ñ jÃg–›_<Á[–…u8¼›dÓ5빌¾©!©¶Û1ðŠu xæˆR¦šõœŠ¢<æ×~#@xLW´i{'ɘîí[ÍÓÅÅx‰ŠÚ…˜eAäñ¥µÄ‘ ±:³¸ÉoBbT0­=búxxZù~’roŠD¨SVóú~×â¬Êú˜úöËé5Ie˜&Wø£iÁ£¯µ3õA«çc¯5?â05¿0¶º"«Q¯)ÒvÉ,jÏ—’FÈí°õ~+ýQ`±mʲ@ýyæÀã*ðE.9NU°zŒ Ž3¾õÖ¶Ùâ_ÖWæ§9ðŽ•ªp-ãÀ_8£ÄÃ`âplÅ•ûvmـЛø¾·0l ¨f”äŸ'©9ÞÄÞcs$Ô¬]ò¯w ýŒq‡1¬ìcà† Ô³!–Qú‚©ù,ë‹¶ß»šGkÁ­©í}KÞJ³»Û Ãפ‡ZÀO ÇöÅÆ!;NöžÉôšõ+ –ÔL9ƒ–}ߎ¡X*/ÚÓ±61ÁáŸeœßc1ýÜïØ&ÅC#É€ÿBu€RmGO–KG¦Å½íéaýçàl×´Ž4¹àíÕ«Ï«ðô¶„ŠGF?‹eÙבµçÔCŠ$„=â’î4û „몋§|­)ÕÁ?·äïöf¯ùÌôµm¾™;ŒéâóXÕ£7{ÒXÇûól¦‡3Ž»IÜïòÙ+8cp*Š †Á-Þ{ TàNä§Ÿ›ÿÔ¤Ÿödë‹R©Ë×AYÑÒH%æµH0G¡‚æÄ—)CžšJ®ó WªÑj³íè.Ë1Ò¨OQdkÍÀ/Þ´´Ý‰¤³ ’ªaU&¥p å Ó‘zF…°W;Üýª^‘—ŸW““ž¶Ærh,²bÇËF« l˜d½¾ÇÎËÊdâûÝáÐR9.?sÉÞF¿r«$ü½bGµŒ¡YA3ûH§éiÎóŽsá¦ä“ Þ±d CNÎÁf®( íÐØ¸GT F‚íŒ Iq^2¦3vÍ8jª-ìé'xh©Ht\kÌOÞ³ÛÅÌœ4>VYáw~tH•¶ÔŠÿôNÒ ‡mCUßÒÏ+Ýx¹èž¦<¬‡ij•m\C^dR1ØÕ®Rª'I0_“µ¼¼Ù~Ü]®dÚüÊÍs~ðE” ée{l„­'-¢£KÚüUð*ã­n ¡æ…pHaËæ)Œð;¡µS–8Ò+oµèÔ`”ž?+ã'€oõ×O×lqsŽ?‘•Ví’¬'ž>È£ò[jHѺGy@Òà§£Nz{¬AÍõå"5þ+$xcÝ+Ù ,¦wIPá)Øs =½34lYôzèáFÂLÊ:’TœÈyy:ö6;ÅÛkþ“g£ZyäˆÄ±… [ȃló[.Õû/m”Z……:=¦5êŽ?-=±¿CpóËrû ,—_¨ Ùˆl¢O™ŽòbšåêÂ;AA>t¼—1ONå/ó®;5muÅèÈ­ý5Ø¥ Cpýc‚½B-1›kƒ­«ÀñŸ±Ç3øv µUÄc,cÔò;¢IÚDÇ=S# Cv¨$§/Jî’bžuª½öë ë&kø&×íwqùþGfÑs²dÒ®“âÊ4è¶ÚÜF#7mÎH\ˆS‚i¾æÄ·¢™ZYÁƒdl—ªì\ÍÑWõÚ«R»ñƒlw£ðg¹›R[cA_SÚú¸šÒaf=ßO=Œã‚µvKn5`…Î)‰îrÕäS-±Ij–38cE´›•Œä[`‰4¨„„·&ûñÞ0BŸ—S ‰ÉŠ«H,sA”¢Ô'jUþ&ÑùZRÛÏÓß"5ˆÏä“ïÛgyÊ}#¸ÝóÆ&9öÙï¼Î7£ßà«P¾.bž¿u¯u'GZ§dÃõ!,w–—gh¬ì«…SMoÛÀq¹hþ`&5յĨÖrÉx·ŒAÛQóèPÙá©e’+³‚!7=®««›ƒßóFnulÚB¿,t–YO²p–Pðç–é¶ˆÎæ0ëÑÇ|=øÖ¯`#o<‘ET§Ô³­â3òŠªp‰`¤`?2ðÔ6ªšMGM—¼l6”1ùKŸé,æÓ Rz>úŸ9Y+úc@*¡ç7ŒÛôDFä²÷óm¦6ªÍ×,¥ !â]͉ú'SezX[×G8{[±û¬ñ(ÿ# f"ÜK@Tñ(žwƒ‰”-oêaYÒÑ+½¾•ð2ª÷w^ú¿¦æ&KЩ8rPä-*®-™:7~G÷¢lÈNT]™ÊjŸ¯–%xqâSlú“KЫ“i·ûõfG-áÎç£á—gä¦C~ãHú†»Çk)' #Ï"F-ל¯Ê qîü'„×Ï÷o\Í'øt“¨ÖÚJ«Õ3ÍÓû™Ýž½nŒKË]Ï@ƒ‘SÁG®Ô=­:ñ)#Â#˜PèÇ¢]±«‰9ö­29ö¹¡ºÜ>˜ß !îUO;Ôµ?u")ùÜs“\ÌœcVÒÔA÷t3×ÒâOÍÈëVò¦ˆiÉr:[YêFú¬úzÈHmxõÔzB<ž:ëËu¼ïõ¢žðÙ/õhO¥­])Øï=û¥ \:¾ñz²ßæ(ølëK«ºÕJNû…ÏRù¬ã;ßõ ‚GA<;ÝØÅ¯lgÒ‰á£m*é c ¤à:BëÅ3éUf§H¸]ªøQ…±û=ŠG¶Súc†+%ScºØÜYŽ÷ÇÆ|=oÝØeÞÕnõ^Y /‹ß- _Qî: ‘ÝŠ‹&¥¯›Âè©à}yPqFk‰{˜j”yÕ3´wélâ(ã³hAU*6t»‡èÜýÜÌK¶-‘œê€a¨î¾y)N'—¬ÕÓ–—ïú{šŠÑÝݯ‚%VÊžLS"H™£Ö϶ciÆÊô~Lò^êòì¹êKªïT%‹bP|x1Ǭß~ŽA´û"F³Š$«eúLÓÈ!‚¹ý™ü{¬"þ«G¦õìád]{n0¦J7›HM²8Jò-C¬9üó!Am·Åik¸ß÷ÊÜy&.à$냻Íù¬*ßLjcSìdO·^Ò®ƒyLT<”0—IFåùü©×Š[%Ù}> stream xÚ¬¸eT\]—.Š;w)ÜÝÝÝÝ‚S@áÜÝ=¸kpwww‚Ü%8ÁnÞï;Ý}FßsÿœÛ?jŒ½¦s|?£;ëö¥îM^ú’Óö¢mQurÓ1–!gœkÇx_/)ì@éq±hîN©ª–¾ÁÍt²;Ã]?Ñ»`R<:¢ø™}oˆÇêBmC¯+:;§J>yz¤îý Ý@@ŸOÉo‚ã—zFšâêiì|ßhöýÇûÛ.¿j0j$ÓyJ[Œï˜+ɵî°h³7”èHDwa‹5.eƼªîk…z6ÛxIAÉŠT3íÌ@Ëïi€Ñõ|<%'í¯ÖFgLƒSh†l¸VKA®ÍÃ8!òhŽ}ûfñ¾•(®½`bò!‘ÁÃßd2f|n±¶¹þ}ëàµpßL¥2à‹ï*ØDoïœ7ØMŽÁû€<¥¬åSÒõÍ;>½¹ ´KÌÕò Ï„›ô  ðaÊ@N§î¯ˆæ ÖóÈO|ÈaL.°¹-ñŒôT›ô´Ï®ÎVÿþK#b±àLyZ.¿г\#ÕI!Žœy\1úõhë=œ|r@sºðÊr†¤ÈCZMj8W[÷å›Ñÿ®‚”ËT¨¾·Z$s=J³KééPžË%ÑÞ«äMQc1µë£I¶Uü8¢Ý!©sÃÒ1͉ﬗ‚ƒç]¯@õ¾§ø“è3û ÌâÊfç³³D+¿jé7f$}Ö_/åiP¨ËS–~e¾ˆ4VøÍGUh\ÑIJºJ9þÊÅC~¿ÌT'¥ñïûÓ¬«…TE ýêVQ[Â~ÈK[¨ÚZÅü"ƒvÖ5H>€ƒ§7ȇ|3O®Å}óûtì¶9ù`@VýÌ6‰ÊÒ·(;®=xz‹ i£+¡·…GVðÁd+‰°¬§{b¨i[Q¡Õš*}œ¢ïãE@bOù½ÅDñÓ?ôÎ †Zù¾ö&JêY+°î1QÂLÜÓ ‡Ñ›ó­_éöØ6O(ŠG9'¨c-¼þ}'pßOHC!S¶B{»3…ƒ¾ûGŽŒÚÎ4¨´KÞùëžU‡— 3&æ–M¬S»—:ÍûX~CÚ'}‘Ô}O­£†C’“ð¶±bfˆo~ûÆðoüpWÂK¨ÐÚƒ‘·„ û8µjIU„ˆR/‚4(TV?.åÀš0|€SZûØÑ4í!3iU‚‰:œ&çîÕL[Ñ~(ù{}¢á^N hNÉ,;Š#$eðÐ`*XÓ€ uH‹„¤“ íÛihâG>¾O³‹±y<ÏÞ‚nÕaýdu†Éµkô ³Š¯-'yÜbïØ¼±ßñ½SªÝ·c…Zß6`¹Eç9¿©$¡ÿú½ä`ݽ’̈F{Ig›$ˆ–!ߟW¦•êtqÓ¯ 7d(Ê ´VôZ“÷™ ²JZäén˜F\ñúCL^u-mO=J~A¼ÇÞÈzxèXô%&äæ|õUõáû‰gÁî—×UÕàÙ½³ëÂØÅÕ(ä{ùúV @&;’gå ¢j®£y;—k ƒ3s:Òˆy ²GÞJJÛ¬{ø‰^ ¡¤k‹$Å.Pv)–†¡<4ö!H¶±Ë£Ê»gëM9# _&¬ùCm¡Câ7ökQ÷:îàq5ñ°ŽÍEéàöüg0vã/'}¤ö(W-­þÉ´ôvC°X$Ôœ÷!£šÚ¹<ääT¬±& ¡1û?Íåyƒâr‹õ /Ùº‘Ó,Å"J·Ð|F¯ÖüÔô aösýH5º»¡UðIú±ßžŠËµLv£v´½¼î D‹Ø[3Ä’¶fÞCßf#»`=êï%*ë7s¦@C… ’FöÍáæbýg-C$xØý‚œµ\q¥ò0$Ó O·¶v¤ïCæ.é_?ýÔ+vÌ?\8(Îc_•ÓŒûÁRysîyî¥_Pœ¦ÿ0Ê‹ “¤Žèä2•¾b‹5Ðv>™^"[øgXu¯¿¡„GØ–ÜÕYÝÇ:¾¦^£Q» ÎRB!úúÑ?6c?ÒùڞɾÜþ#G ¾èò&ÍNÎ_E­Ýyy•«‚Ëòž9ëM¹rÎчø»:´A¨GõÆcJØQ«×|´Ž0{ô¥2÷KÍ\‘~`!¶ÌöÏc¶[aªß(k*ÇíGO-<õ"÷aK%â-m ®)<¾;Qì¼JL`I¥ÂA®Ò‚.žáÆâÄ?\~_×å-(ÈCu9mßãÎM’ñ-43~ôÕ°]+!ž™¶ya?®C»2 Òï6™¦’us$Z 9Ül»{²ˆY³I9šÌȞαcé÷& 5šçÒ¡½>xsò,ËŠy“‚ ‹ã=Óÿèó{â%‚`«ÚbqŸkòJ¯šh9äË]]’q5§uë¡]Bù$0‰ 2#Vh¯¯ãgö,ªÛ4UXbѽ Ä“©lì¹tã oú¸û1Qfô“˜xfP:FõY¯tnKôÚý›.·~ZeBí”DI¿ûÖõ3ŒRä̉OÔhŒò°AŽEÄ0K5T”1w¡q‘´DSõyèvèj¾v…³RO÷}!8çͨ€ìô˜" ÈkĄ݋ú FŸ‡ Ü8yI8˜xMD¨‘EÐÛ5B0`(#FÍZ?"I²3•_¼óÀí"¡¤³¤vÌÊ­Š?Ö÷ó·oEBmàŸ06V«8k¢mÚMú¢œ,MÛ&€!b£Ë–VœîOÜ—ýÔso—/ÓûÕ,ߤNfWç_ØÑƒ :#á¨Mêd:½ì‰"1Ã~¿ÈpðnÀó VgâÜZ55ÀWÃ7ê°}d³O|žµÎLgU¥‰YW¡OÑz˜þ¦,CI´/xQ³Q=•UÎ]9å¶ÄzÈ¢¬¨?)¯ÙÑ™‹qé¿™üHù‚›ZÇ`õ@£é°v ¥ ¿ºwüž§’¯gˆÄtµPÆe^ãŽï ~Q€ª«:½¢©Þ;Ï­ µÕMmšµ€ÿlݺ¿6KØ9–IäV£ÖEtùߘ`ácUq¢†ŒH_8‰Ôäú”¾g%­Ì¿PöéÍ]O‰dPÓF¦Wýr&Å£ØQUžŸInéñP{–éàç°ÉÊŒÐðÑ…Uε.ÖzÛ/´F ŠùË)<®°àŒ“4}¦ï‰uKž÷YA90 °y`Q¢×?©Z—è™gn€ØÔ+Ÿm¼²€æÿè½6¦sŒAœr·ýÊ'pì×#ž=÷`(¸6ûÍü€ ¶6È~íU´þ.:WãS³c÷<ûøiüÏÛ'q~éæÊÇ57¨xv²NðêÔéîØû^±~â‘Ê´;›^‹ºc_áìˆë5’iFC” ?>?MÐí¶Gœ(W+hù[ðµoý LR+gë<•Áαn…ß|Sëµ6ŸÌÉyó/ àò”ˆfõ¶ù¬Çô>¨¶í@¡{ÁjÁ² LEže¢«ÎÁÒ¹p–. QiV6ø(˜æŸ£Ìœ¨¸0SË–c3y©MØü çÏàÝ¥ßj’MÑÉÇòP ´~‰!8$±f r}¥žÄg¢Ü’Xv›)Ȭ¾±£±7=qÔCuX"ßNŽÄ¶„ÈkW6G+÷±?/üj|çȯ³¥kŸiZ­Æ^ßHxYZáNsó@oNÒ+Ï0ò¥ÆZÅ´òÜ´õ¾H"¢ÐnÂoŠ3<™ ŠÓWZgp–ߟ”Ãi Qñ¶D¿ç¶ò«ZÛ˜9ÍîPÆãëßrð§JG©Ø©pQCIZ#êåWIœ{@õZï'a'—Õ3Ì΄:.d}=W]Ð.KÕŽ)a,º v£F— BŠ¥·ØõÏ!Ф",ìyqë Gýžb"¸jÍ>´Ó]v_¶Ö^-ûK¹†Q2)€Û̸\þ.¯’t ÀöØÑi,bybCX/FóÚfe(©Ñsæ83÷Å?HÐ\G×û.!çº×ºªb«^ækEù}Ô[•ÏŠ¿a1ÈÁ%¡jÔ®^‰DˆÌ¢YÙþjƒwHH‰;[×qú¹N©ð»¥w³p©*ôž‘T~ÿ|­X@Ú·ó.…ŽêZÙŠÐfXùŽE#Ï£ÞR­ï®4w˜n“Íq{§™Å®“–˪]™Ð +㶪Úq)¶óÆ’w€˜œs\©¢uÇ–²˜¥e.7nÊÉ.{)ŒŒ/¯<¥ ,®Îi®üߨ'»ØxeÎ"îÑN(î… ¿ÿ2®®jþÂÐ=eÑ÷'…f8·`fP´=Mžªâ㬌t Öø îÏ“4½“Z-Ð`wZ÷\zýê>?ñ» ¨%%I9«$.B¶ªy£ÀiwIiÜÏœ¦ßHšìžãAµÖ ›Õ–GðrÃDEÊ‹@ ÃÇ©TÇÙü«P£xìñZ¡ÏO®Ež á%¦‚*]:Oúâ¼&å—­¢ ©F~Çöò`m³::‰¬¤¶›lbomá#ã·.µ…,9üg µ¿.U7ÈË¿‹Ûr–·3£$§Õœ³M«½gtö`“(td…Êdtwç=eQ"þ íj\jÇmôÏ"@ ÝE”# NâU*~Þe,$Æ3”N×1¼ð•¯Œic6DØ!ðPa?š¬K+ä>t\9Gïì8 û™ 9!Š$ˆ=/~¤>¢ìÙÞûp>y®‰aœ?¸ÔLšhë;°SpELýeHˆ_RY ‹«\#Æt,úÿ9¨ž¢ <2G]ËÕØU5zcè¹JÒhóD;ÕT.,¦ˆMáê¨1%d)Øviǹî×ý0lKùØQ·\¥H)z8õò3Z<»Ov~µkÈžZgÚÎ~®y;RÑ\µv§±`áµ TÇ…”‡•ð©Ð{ëÿ&7Þ Þ[øþ*-Fó‚õAX>wƾxoUÚ ôcªTÜñU´ˆŽaéLU4°kpÙè©.ÉüÅ’†hn'~Ü!ƒ“%!ÄÜ·ªa ÇVø”Bܬn‚ÑV°¶Y~åè¢=øêåx‰Ž\EË7'ÿ÷TLº#CÌ ¦×cvœË 9'⤹ØÇÙ|†Úú9%ð›UK É;RiMH˜ÜR·6AéGG²Ša'ú×ôIÍ ÚwdÃ( µ/eÝ £hûp¡4äA¯¸{¬^&k·A°–DÎvß-}-Z‚G¿‚‘·I:¨ðzÄì|$¨÷¡ë`dÙ6'a0f‡ ;¨D¬Ç·ó‘ÐEbß-v‹|m=bå6ü©{{RºiØÞ¢Ëƒ÷­‘ƒyÿ‚µ¾Û‰Ft Tß{©!ÚHCa_ôçW½¬ðítä=ð–òZc³ã´Ðr^\`ˆgP2Èÿ›dÍȦq2õ“¥ÿVòH –H9 Šôxù oF%£k¨µÀòªR"Í5²È¶ÄPl¿j¿JýâÊÅu1& ¦¼ ôø“ÙþP:ƒðÎE¥—»£ø”Km{‹Âž§¡Pl/ò3—Mçu¬–æjâ@dGÌþôÒMÞSGQj1UZaØÀ¹œÀÔ½„/›Ìò7Û,ìPóq’Êà(Ý_:y|噺—*I´oÝò°§O¤B§^¾ñg긥xÏ'r+D¦Ì€p±­êÜ™—i£’¦¦¬Û¼o:õi x½mDÒ¯îgŽR¼Fnj‰T,/+™x…îï‡É”;.7/ ¶Û©² \™FIk~„±«5ø’omtzªÝó¶^V@n5X:Ʊ#èa»pâÚ:Þ1Éð„$wA·jŽÆÈkΪÂ(-„˜ø¨‘(·†q†îekßøE0ðÌ")H͉Bã,“àž?èV y‚ácª_™‰''Ëè9`°Ø¸z…c¤ñVs Œëº™•¬6~æZÂi$cœjZòFLÜ誆`½*”…Q É¯t ¬n4R½…UöνM¸Ý¿E’Ä 08ö°[,B7•&õÅïàê*/UÚ{ bS|¼ö!PõJJiÂ$Ð73m§¾«X&—åÏy ö¶ˆˆ9·Ý…$ËÚiûu¿ŸHOôzóÄŽ–Àéxu¿˜¼a»‡bÌNæå¿,ñ½!Qºlb4ño\­Y¡F:³0>ç^5±-êé± —vHÆš;ŽDWCÏýy¹^´|CúZÇì«Ä“Wٯɹz·Û¤¶dã—‡8`aå—¡©ŠÞ~­ÐœI÷Ÿâ¶í&†ÐB?>D&¸H¡J‹i¯Sçüý»å/2Ç;Žº—Ï16Øñ{jûíŒ÷\À'·¦qÉEfÈ7)z,¸íØØ>=„ @Çbz‹«Ã Ûô]H)¯~³J¤IA‚*Ñ3u•Ïw ì'N¥Ð.Ê'ýðpN"&óRq@Ú ×1J´NõîL(Ñ!Ïë²?ñC‚x—èçÎÙêŠkKºnÁv ýøWôŽèlæoöõ:`g~æÓÆÉñðZõuYéPé7z¡Æ<#·üZ‘:ùW«EsV}/’¬‘…!×F°S– ße›r]K0/QVK9cQ½~0âàíéŸÁ'^ âí\wÈ.yZzÇRHž$†!±©|¶]»¢fÁ°+…oßÓ™ ¸1?0zµFö>÷ÙqýĹPb¡-ÜÇK] ‘%÷;‰‹ÈV ˜À”C_û¾UJÏeªnv=Áý’xÿs<õ§–*îö@k˜‘åø›¤EìéwIWB [ìÄ2kîë'˜ M"ùwí"®`9žß[ü¾8VIß;2k—‰ ö í¸}øôš x®[bŽñ-˜îrèÃdÇ¡”]ôdœaÇ‚þ¢?¤>®ÏDq‡©)¦çlCÞD™Ëûü羌)³¥-±<&T­í í>xÁÍS`ÎÆ¯?¨˜Þ‹x L—t§Ô BÍ0Ýߔݡ­®ÒÊ­;LÚeÖù¶øp.3—¾‰‡u_ÇÓ”ø/,ez-©ÈO–q ;½RÚf=êcîyN–<‡½C˜&¸=SáR@$ö„œvs `Bfd;.™*!RSq{×g•,7&y¢TÐÜ•0{t'•ä"/¯ÐŽ=üËiyôá¶ ŠAL ¦ß%`Œ·­VÍ·|½óÊ¿Zv´6&ýgôvrägû©¼¥›ñÇ*¡°Æ_Òo„µ¸ý2/U‚DQtŒlå¤üIœlIG×÷Á˧ª@—WªûÉnb F“Á Uàpcw?·Ï=ØJª':–özü4çÛ™ýÙ;bÓ?Þ} mío#¾1à²A°;r…üƒGƒV±”Yû¹oÎbrÑ©8ÿÓÜ([Cªe+«_ žuqV]$!ÁÅb*Ù½V¢ [Ó›UŠj»–ì Ró£ð‡rC -Ë <Òh=±bI´×òýÖ¶o–yzâv§‘Â$ô¢žðŽ"ÿ¬‚zb%g‡œôd© À¯‰½ Oã1ì‹ÃOÑaªÞvãV†çÆN4pXñº¹7«ò¥'‹*ª6\¾ â>\ˆq ù"‹d[#ITçSÛ›Cú¢i VpOOcæmÏÀÝ7ýV§ ª·ÃðÛçÖ]üTì£*á›(6:6ýkìú]UÓco¤ß½©)¾pNœ²GN ç¯z:Àlí@ˆZ¤:0šîeã‹…§òˆ6u®Lú¥'Ÿo ì#ãÉÑÞn=dD“z8såáÍ=ݧ)€‘7íÔK|£RÖ:YÁ”O·³@xÞe‰'àö'u×½9¢žbX¿µ!îY³·Rmðç‚ü^ú¤ó¤ÌÅ\À­—iLI¤…{Èj.½Ó·þÓ§äS“žüýVß'fÜŽÐÕ±.g<öif§CÔ=Ÿ eÉ2ÎHÑÂ>X_5z¶²/vïeËr7n?!¨7,ÖÛJ”24¸}w ¨À ²ÇRÀ/wOŠ>§·7†æÙ€ñ;ƒ`+ ˜wØž™; ÈÔbˆÜuÐG LÔ~õ†·qǤ¡Heç·Þ6|pu¨ÀA~&4OI‚wyq¿j5ü6npAh¼ÖÚ’"4¼+;ÏtmöT{m‹GȤ¹…'á°uA69¥ÓñØšÀŽÎ·™éù±D÷!ýË^¿dº¹F¨µS<78$¶¨ä¿}ÃÌ”ñ­i>2µß„¤€îkðˆ¡vÿÍv…¶MJ7ºMöÕïø©AE¾ÔœqÂÔh;0ކAãö瘂^'—?ŠcØ÷DÂH\uJ'—¸.˜aÐ3,f¹Ý‚¥¬ù”Ö2—;µmš×ø30¬)šŽdÎ’d4s“TIÚŠ6çèc(ƒ;^· Cù¡|‰;íEUiŽç]UFw?â1ð-YËl6a®(ð| ¼öÐ9CiFi`ã÷ø§%pqÿ’Ô÷¨_­ÆÉ—´ ™×åt‘38Ìkì›rìÝÒCbî˜A!DÈèp1Qíe6Ÿ!l½BT¶~.ƒÑ¦€z-D–•In±ûŽØŇü¡ ÖcÝÌÈ#—öÐ`eˆ¨6^š¨~§fF¡o2Ç]ˆBye=óòµ‡µ”¬}Ò¥%MYbÛÕ8øL~Ug-5Ü%x¼¼Öà!^3¤ÛÝ©þÑ [ ëìÕˆ š£÷µ¢Sw¨G ´Ñã-«l,&5˜äOP# Ùãx!$c5XôY´©Íï ÷ŸªŠgh~|ò†w¢»åÖéyŸ€½ÐáËPëF®‚îÍ j‡KqôÙ³äûTÛfL¬ŸÓÛÛaZl‘YðöÔ€ûýÊ9ç·ßN~É\ЧµŸï£È§6ðúŠ´hÊ[l†¶×t¿‚ÌR¿ìöýe[9´&ƒÿC†²81 ÚÓÐ~²2QÀêþ®ÀˆGážä³ö¥›V5õÐ|Ä Ø“ðkµ­M]`"’ýX*JN§šüW‚˜?j´#ÙÑ­uAŽÞô03´¢…׉6ÖLµ-ªs eÙm2r-B/×õÓç_}NÄ |Ovgv>*Ž}Ü=Á<Å=™]$Þ/è0(.=°WWK†Uf?LÌ䪡’ešVS[iÓ|!mKDXWœ&.§†s¨ÐÙ­á)D.á…/t ‰ÅÏŠÍñŸè!Á‘#½˜“Çq³.DìPå£vAG–È_lØ8d$ñh|«h°²›æRX¡üX\ŽÊ(©föÀRÏ঻cŒú×äïâ@Q(¤Ù_²ç>­¼cùÍ;—¿l¿^uLÒÀÆ™qå©íI9 øÂ‹$þ<_T;‘“¿’o£Ø¸Ñƒò•Ž_’™}‰Ûg™º×ë[i¼~¤pÕ‰Y œÒÞñ\f K\v¬'Û_›¨ŽÌ{Vd ôï½[ûN¥¨G¨rvQ¤Ž±B…iV> I,DÃñÜgù8“…ozÈ?1¡Žx‹¶ £¡oêH¼ìþ–öÖÉ#†cw¦„ŠR1éˆîƒÕ§{TžýƒB²#ÕrcCŽ ŽM†bH^g–Ê‚MªãmÙg³füqÚ·I9ïs G‚û†éáùºÚv©BÞ‹Å öûÎЈ‹Ô‹ÕØDµ…–öЮ pvo†þ«¬.Õ-[tó˜©o#TpÒµ— S>ü§zrIŸAò¢çÑ vé‡c»Èn‹âêxªÔ(/Ž4÷D1-w½uvÑdl‹¹‡4ÈLŒ‘/sïø™R×aÆw3|)öQ‡ v]nYWA6‡lÜ¿ÒCü–ÂþI?x`7K‰ž2ÇEj†¯1'Ñ SÜ{šžô«”Q&Xç¬Çk¥·e×Y0ž!{ ƒ#ïá—_!EŒ˦<çK÷s-c ä“-v!r´„†ƒåúsÄz;còðûLQÙOÇ»²Và±æñuæW¡Õ+s»7Ž'‚… –øú7¼[p êüp¸}cñ\–Gœü«EÝ(—äÚÈÏΊ ºÜÙ/7‹Q*&Íñ ;‹Z1Ö¾¬U,y¨TOAª6ß–d½Ôf£–†õ2o$#áÒ43¼½ÄÜ ç·#C‹¥›ã81™6Ðr†@˜#vóý'&b¨2“À„\9¸d9´· ®ÿ-„‡DN«y¹0ì™Ò6÷~P³l'‡ÀÓT’Ã-"ú³‚PÇAãâµS®øÛfŒQåeíÅs¾æ.ãa¶±ÌAœ#œëáI|¦ÛŠ´ìýÃ# wéѹ¾š†U!"Û(™åPÜîYÃbZQ^ãçàŒ—ü‰½œå/ % Œœ¯‘9B yÖÆ „§äÄž°ÎaqÓU%tï8º»M jº…Då ´±4'ý¿¬V*ìµÐîÕÒfSm.™ÁÒý)üD׃„¶ ' M³P bAª—p:ÙÇN-âꩾj«œ.-¢}5€•Ìò³µ°R•8SX¢JÔã åÛ•¨Ò;3K-œ,a>A1ÀÓT—&Çô²iÔf›º…=)”‹¹ö€-u\_A?X ¹t8-¯ýøçqØó’Fvd.KxÎÁUpDú1PŽ[9¶ øÊ: 4ªäÑ&d‚eYPN«ç&d¬ßkî4窣ù·›T#n9Æpµ¥VD—qáÂG° Çu*k¼ˆ¯3ß*“šÀ]þYIì0ô¾âvmÈú¶Í"@!!Yë]§ÁNøß\Я§ýoWß c«Ò²–ë,º™:k&a%€WY/b˜S*] M ]F†¦…Û/‹rº¾ Ôó‚R¯× .8aŠÙ£ç3Ç>%ÜÄ"f]cW UÆÏŠX6sÐßÚÛ¾½Òl÷YøŠãk–OúF¾Èßß%H§Wêêö²í’Å!„~¯…õÙÄöÆ4Ôö°$‰õ–{2Š+¨,˜=öXNd !K‡ry<“f_¼a¨`ÅG˜1–)—•WWó‚ÈÝmðUÞÏIIPbJA«–-U™#—’ò°8ÃSn=o#à‡\[?eilJX¡¬#ú±!]àJ£†dÞ‡ô2ÐFÇ>1ô(‘-à4Emà¦?[íèŸia¿Žž—æ,"þ#ì?N}OŒ ’ªÐù­B?ߊnO:|Y‚wb¢ôÆÊ(‘t6\䈬å3… Ró#A•&fݾÐöY9È{6씪,2˜ü%¤Ìè¬Ä+Öˆöé­tò)šÐuÊÜ5[ZnásÊs Piíè’oa{ê¹['¸‚‡»c¬ÂŸ29# îŠZÅR N<ÍeSiW^à2rw€ORÝ Cp€W¼žVóŒŸ(Û?!é•Á uxo–ñ‹]¡ÕùB:ÖÁëß×Ly{„Yø¥Ip™F½’¹âV¨(J¬æ|ƒop4À­Ñ¯Ÿ×ucEX«9 ‘?a¡ä뼋žJ ±.»á$¶^ü~„h3AÇ5Ñ$ž]Ð[7– RÔ/ÔPc&—(Kw/>=+ºÑ_ŒCc´#Ô“BÌŽëÜ•û~ÏbË4"\6“e B|p/‹i9@Áø³töë£ÍGK­‡y²_ذŽÖˆì*å¸;³tW¬)òùã(.:Ã8¤ú¡<³öåìö»òϱýõ¢Q†Éivu_Âö¾OÚ°J%üÑʾ@ÉÍ=äŸK«oÍ „z^&7/Û!²BxVްZ*oçúñx´…¼ºÆ„d ¦ñævD Emò†ÅøÕÈnKaÌŠxªÆœ\Ç|#u¸äVÄ!?×Z=$®óÚí‘ÇìÏ£Öߨ”ÜÂ1IÅènzéX£“mµ:­ak}‘¶å),Qw'è,šœèé¾\€"Wþ¢¡#àQ•ˆõYêúËA¿ÖM¿-ìŒå±~¶ˆ*"/»x&öÔ™ÕoâÎÈz£Ulö>Gœº½\î”›ù˜i‘²á)7ÒLÝ ìí=v`@½p9; öæg1M‘¨ aš³0`ÖýF;õK0uä SŒ':§ÐæñúôÈíµûRÇÑM¸Q¯«ÎÞìÛ1ßö*ìÆýjüoåÄ1Ìd:pùÒ*"a>ã&UZç¶ÖôÌë],ÇÉs¿éÍWu22€H;/\^U CpàÎu‡5ïlZˆ>M‡UM-…®HrùÌ>µµ«1hãPÀ—s\àªåÌ?Ôõõ'Öùš=¬ µÃeû}D­!Mà*a˜±»ù ¸VŒœÚIÄØãëêx¬]²ø «˜â¯rËf}êØ/±¢â.TñÈ‚Z zßHÏN^,SGõó[‘/8T_r´Üè`ú¯=>¦Àjª3e3T†¸ƒ•ž„^ÌxW.zX«–ÑLO >I7meÃ=*_ ›Œ®8°˜mPxÂSí|G(¥C‹Í[¼"|`¤°x‰fÀD4»ïMkYH`zMS{öô›™#®ª–b€Ú-)Ž ÏVˆÕoœ¿®«î¯è¡6zj?šzûƒ²'èpüœž³óÅO†X5œúÕw{M¬ÔãÅzàž#…XµÜ±ð×öuÖì°ØÎRSOŽÃ¼Æ »æHf·8Ðå¦I1è[dŽ»£Qß’Ûèןü^¥k¹ü XHÅèd¿ÿh„›õ•zdT½ƒÓ†í„A©zåi©‘UUÜ'Â#ßN5dt·ÂÉêrxo}Wº™´á]×l…/æ#u3Š¥‘r¥Š–ÔŒ<2¶ÌœaÔ~õŠâñï ”%Ó¹#aFñsÛ:Ì?¢û§h <½Ü syU"TD¿K¶üžAä;BKiã^Ÿ(ÔÙ!¦/7-y&'½³g^‰T›ÑñûÍÆ¹ÅžõÐÌÕˆjR¬Š@5ÚÑLÂÁÝ~õ»úÔHº,ؘ˜HCxÅ>‡^=è„¶Ñ´¿¬”ùÒžC4•W _xÍù=§1’‘<§‘Q1З ÁG6§]"Òÿ%n'jryŽÆuóg1ÙQïôåŒè §„ñGAÂÕXä’ x…e~ _#-W(GÕø$OîªÛŠlýE\¥dŒ»|X·nùfyŒØvß‚[éÈ}$ õ9Œ¸t#—®fóØaÂgS 쥎ú›F¦´ûMuͺïÕZïϱš©ül±L†;_[1[«T=éj#[:ýž¶CÒŠ´ÞàÇßY“‚_UQa³¡ dfâ/éh:܄ƂDfØýxtŽlSèk°“¿÷!¨Á²«v´1.9;¶ÉKA!ECsÛ¾¿^Æ’ÀC²œÍQWÚŸ@‡à¿?kÄ= pᮨÙ¿ SÕº÷¯âNã6”î¡ZøàëˆÃvÄÖÎpÞæb }³aêá·2ç±Ò4¯…‰†"î†ð·ÓBÚž&ˆX•ò}¼Ûì.ÇhÆÜtGsÝ"ÿ'@CÃl¶™Ã©®ËJÙÀ º° }Ð.%a¶µöfŒáq¡÷å3w»uä ÁrYOAk iÉëª;Ür:1$¦kœ­‘ß4дwç·±·<ŽKΙº kg©¤À 'Ög»ðØúÊÜø¿°óÍôÙ†FMl—ÓæÚ×W“bÌ“ˆ»Xjh«+&ÜÑÃpЋ§Ñž%ÍpþJ ߵʓgÌÚ–­ fì l§…³ÖÉݾí|]¿}ƒ6ƒ“pE&- '› õb±Æ÷×ûcx wÉÖŽÀ©q›Ù°ýT4E+I«•»m(³"HƒNôõ Î) /¯¸¨Aî€}íÝ‘š5ßñ¯ñüpÊ¥½e„ýVŒc„‘ÀŸ¥,3­7­„A%Ìõ™óqýaA-ûé&fTD½Aªª!F¦à¦™zÉk‹)|ùùìX­•Â},7 µ'Ô€9Ö ÉqWÍ<} "%±¾ë=;U‡§ %(~Ü~3»÷í÷kkõ×™þ›—Nj”ÊYŒ«×ÝOpê9º<¥†ÝU!¡‰uqÄV—n+Ž/vG;ö'CÐrEÄIž`õfÕ?AñºÁ3{˜ø,ÞÑQΙ?×JÒ OJÕ^"ab%y“ÖV÷ëæÏì› wù>dµlò”§ééâÝqBÇ `ÔWzÈ%;Š×‡X»óbùF¢«)7fz ¾Óäé{¯û( Ýž×çœÇ>A¯™´FÉv‰ø¸Aºjì[—á(f«[e _-p<ýùþ°tw û­‰ kž jçdŠ´;ázŘi;@å sá»ß#wFUnÜà@ï ꫜnkç,¯G#öÐJ’~ÉóºdÈâ^FéH ó{1óS¿’G©>«bØœúÇsýø »+:ªR±'±Fá^EXOp?"2ÄŽÓzèRjæñ`4å¬OÐR_L0¨àÅ‚7qû@¬__ÀNÁ}©È.ÎB`}¡bšÂ“vòïÓ® -²SÈx:ž9… ÞÝ# ~³úG’¯²&s›‹™áâï¢qýBz-17õžr\½™l=€z„‚ЂšÏ'µ/D„/º®­<¢¦"«]ÎÚ¢Ó¾0–¤¤»Î,³æ¦µUR¯µi}ø£‡†u$Š‘öÏ_#ðM¼}Ò*oDžñlP~}¨¼Ñ`Õ»õ‚ý¶°<Œá2ÞãsT¹$TWN–•Ð7<Åߤyß$k§xràL`ÕwÉøè°¿Mþ`ÛñËbDKI„`^q@Å#»€ÌüÄp{¾àP¦8ÅHÈÈΛn5Ïó9Gä)Ÿú³g½½§ú…1¬‚g{ßíÐk³õ}Ñ[}¡¦§l/˜e247û‡#µV‡ïÉ…UgúÒùíæ­p-¾³Œ‰®Ú߯t2¶²á”>¼cX)TÝÅ|Ø7Ðú%ÓhEÇÑè;s3H¡ßº°Å2ê·êâ§7ž¼tó¨ Š:µ›¾Š9goÙ"£œìÌ8‰üA©¨®)"—墑ÍaM)¥H˜Ã_|ýPî8 "k«ÙX×m¼f‘µYÊä.àzäEà€æl¦‚…Ößûnº4c¬¾Ódr†Š÷`½%“&ޝæ .·ntÂFÃñŽ*δ¯³S“I”QAo< Ðmfž-Ëåß &Ÿ€²”J * lþä»Îðe_bíB+ÅRBP‹´ŽÕYV=j"¶²›òä¢ûh‰ÈÃî]!p¦‘ÔT} „b]Óˆ€Ä¹0jÞ¤Ëì}’L…`FÓö>O¸žë«Hùúä SOÌ:pÞ3¾A¨¯º8·PzÜc£ýÞ°""ôÁ˳É%#c8ÈŠQƒ;…+éNü–(¶fz¨ »ÎR–Ç ßÍšÛLáx(IC>ë&ôõ¶GïF)`If/¹Ç óàxÍÞäP¾¦seÍ`¦ž„TÞ¿{€«8£%ÜÑ'W¶Þ¿X$5UÔ¨$ü8Ÿ#=c%ÈÎlýÍ߯¾^Œdí}] ý élÝÅ ëwˆ²ˆؑڽ…{=¤òŠ:mçöëŠKT[}Ž)ó5”·å†-YñT…òèÚaq™Hª&Dýj#pGâfL>hf>k˜“uéTXQ’µâ…ö`­¶¨.!¼iNF ¨|1• Ÿ§ç¢x´À<Ø’Ú¿7{í ÆõÉ%zå*¬RŒ1©\㬤¥jpu·„àãuK0$ló}|%÷fæE«û7Ý¦ã˜Ø¼‚)k4º±D§Þ)+k._u–gž°Ò3¬Æ¬â®L|KHEÇk- ¸Tÿª¼’Õ›únPù¬¾®ÎÄEñGÜìp84 ÁÔ˜+e@ ¤8JµåÞLfî,%uœ#Ó[¬ÂÇ¢ëlÜ[¢¿(kѹ?‘dùOF¤A.âX.m©»önú!1?ø8Ñ ƒ7»Ùê={)çN'I}­t§þ¤îì^oš³ L‚^•²«Íü” ¤E » H$¾®&ÈÛðuJ݆ ™†qéi§ýœ«%h¸#‹" ±é? lãùà|Ià®@"†9öØ“jl¥¸aJÜ)%K,—{¢ÚvÊ+áÐsb-iØ™´Y¦ÒŠÇ“;ì–Û¨ž?ŸµÐÇ%ß0¬ø±/­[8H¼}2˜¦JšPCFsvCpÛj=ÕŸh£x,g½_8A‹ð7´H°¥ \ç?ÅXe”$ÊÊPéHkµ/5úb&È÷^$[×,sÇtG_÷\×Msš‡Åêýi$¢R­á ½†ôJŠÎ½9Âz‡è•š°û{qϳɲØÁÀ/U=\VûÏ7ì;—#_]ˆT×Mbh çÈP¯œ,ºc…¦(>x¿EмãâÁý?È 7öÎwÏ…M%ˆÎmíQžH¾‘ÕQŠÄ^EW'LCKÓW˜¹¤­A(ú-õtW’·x™¡˜(r߆f˜ÔŠg½ýu`ÝV<§ýäè>b¨Ò‰ƒðÎ:²€ãÉN~êëAûYÄ-÷=8ŽÄ]‚טÀáLyhˆË‡Å⥟ãLXb½ Z‰š=ªîÓZ™áŽrZ™-]›x ˆÊ”½t ™2×…Ë®³`{©)±|b‡þWfn7¤Èåë7|ËΟ´2×§$ÊfýŒCc,´Ùä×çϰø]B¢};Ç÷ù+§¤øu Ó”úË^Ž•æÃ£žzcÊ3`xà´´­Ld©º¬»µ¸,†æ}¸Ðên_m˜Œsúõÿ>Ñ8“‚³H×%’¾!Õs#¼Öm•TQ[Íðq54Ë…|–]í’›Ìסo!;¤2w²L4;視‘‡^Z”ðíÞ„>ôí¬Q hÒu«ÅbÏÇg3™ÍAxÚú§t_¿X‚riEF7¿"½×ð:j² %ÉÛJº­³gY°J¦€lV¦= `L\Û¹ÞÕúsÔ ÿ2¥×}|'}ôñhU,”1ªÌì´ZTØÉF‚u;ôWºäD“µ!ƒé`E¹ä@Kóë?{ ÖjŠ›ó/-0¯è”0ÚCçu^ð‡PHôÜ|ù‡ð<'ŽšêOû'|ýþo ©€+‹"Ú•öfÆü.G-uÅ£\hÓlðä—ux—ÚŠ5ÜÊ.¬3˜ó·!»ëÄ$œT©‚~Þ¡l¯ôÚÇ hÜÊZ+†øMkEäI¸{q¸8‡BÀ½áM˜ô»e65BIR•8¤Géï–s(Êædõœë˜±~B ’0‡³3¡Õø2³“«^ñP-môUkÔÜ „€yÌÑr…%¸Na™ÞµíÖæ>Ъqm7êÁŒòÇ_{›ä]ÓV¿f.º(ö&ÇRã’à 8íät¯&±8ÇçúW“·•ß­¬BÎáâך¯»\MU€Ä8—’NŸbY ÉùôäA°¹î]¶ã&© ç´MµóSÒU÷tÃgù¹k¢!¨Ç·1x³9wJFOÒ»,Vy•Ôµ„÷ "ÃáŽzGì_ÜØ#߆s£íÂbn@°iªW•ÀM·f”ÁK¦qÒÚ0œ¨åŠ&ÆÁÏòhxÛwûœŸšþQo}“‹¹™E9îÖ°ŠVänËÒÛäŽ7ÜT· *¤ 6ö½dØŠ2Éu±öku5^’‡œ«MÎkƒn2e) Vã&ç’¸B £ñ^,åDYSgÂýV²NáñXÜ´Š¿_°Íäh|ùYøÀ!”UåÁÞÝ$•Ü28i,/±ùSq¬úpéAzßh]6®HLEÈŒúâÎÀÄr¾öq3ŸÌTÞãÑ<-î—wsÛ5‡/à€-fŸ„,‰ßôè;dßY«o0Lƒƒš‡H€˜NèwDUÂ!ž7y 4‰ ¿xýf*mû¡.Æuý…_—v“£ñ1貫 |;·åE„»\qOÇ="_ë-’ ’Uò|§Kɼ~­ì2KÕež %ý΄hû¦*žalÙø´8@0Èîý•uÙx•­„âlîGaªõ"!®Ðo@‚ò¡„á_Z »û25½Î;“¡=³D¹A;Mã Ȩ/,£P/³ÇxvX“ùü{€ù8sÄÕ[hŒùN]±Ïã¿÷*åDGÔÎÕ0x©¸³˜X‚=©©ÔT6ùÿLw—½®ì÷bùÐì@_ „ùqŒ½:I*r|¸$ôå`ÔvE¸§e=ÃC@¬ö šO¹.‘ŠülÄR’©º#!“làãGU+r¨ï›¿©ÿC“ý=|.øƒÛ•éÀ±©Ù_|í+“ ÂOL·þ)G~û‡‘Ò îKgI6ù‡GvðÎÂêÈ6ÅßÙâVê„pŸE Š!Ûl-N{@J’¯õÄ8M w;õŠ4·"ç¯#$Ñ•+ªl\p¼J{á? ØÈ°<‚êS;K!˜Ö>vÒ¤°„¨ìÑÖ½BCciþÙDu‚†iz`ÕÇH|RØô ½:Œ¤sLžžL4QŸ¢Ü®lÝœàú¯#líû@°¢;^I:™ Ù»l ¢ëÖD¢?8âN-;#“!aŽtÜ–”¡Ÿ!Mq[NFGöœ£~ž6¾ž¯vB9ŸF¢Ž—õA#ÁØŸ9OØÏ/âÍ6=øþC7Ó´Ÿ€Èqpîòn"зxñR"ÛÄÔjí§˜Y­º¢|=Ÿ˜yã)ÕKgc~áX’ô¿Bô Hª˜¼sûû´¹¡ œcdR ÜRT9Dl³k- ô= VPû> stream xÚ­weTÚ’5îNpkÜÝÝàîÒ 4Æ-¸$¸÷àÜ]‚»»· ÁB°{ß¼y³Þ7¿fæG¯Õ§ªÎ®]µëÔꦥT×b•:Z‚ä!n¬œlBU°ƒ¥»«–D…UÊÑx3ò¢ÐÒJ»€,ÜÀŽ 7@È€¬\\NAAAZ€´£“· ØÆÖ À £©ÇÈÌÌò/Ë_!KïzÞnº‚m º·/ {G'Äí â|Q ¸Ù‚Ö`{@ZMÝ@QUÀ ¯ªA@.öuwK{°@l‚¸‚ÖŽ.ûVŽ ø¯Ò\ÙÞ°$]W'øíÈË äô—‹àrq»º¾}€]6.··¸9À+{wà_ÞìÖŽrrq|‹pxó½©;ºº¹Z¹€ÜoYÕeäþÁÓÍÖÂí¯Ü®à77ÀÑú-èhåþWIûÞ`Þ¼n`ˆ+À äåöW.Kvu²·ð~Ëýæäþ›†»+bó/,… Ðäêúó†ýWwþU'à¿Toáädïý÷mÇ¿£þ“ØÍdo͆ÂÉõ–ÓÊí-· ‚Âþ× (B¬œÿ°Ýþéó¹üÝ †¿f†ñ„Ðbï ‚¬QØUÝÞRþg*³ý߉ü ñÿ‰Àÿ'òþïÄýwþË#þ߾燖s··Wµpx€,ÀÛ†q¨þÚ1ÿ_¬…ØÞû¿‰þ÷@=Ð?þw Šnom„ؼIÁÁÆñ#ØU쪃ݬlÖöo=úÛ®‚\ìÁЛ–·ÀÊÉËûo>m[°ÕÈ_MçüÛ‚ÿù›<óf×–y¯§¯ÅüïÛôï(õ7ÕÝ´½ÞˆýGïÿyø CJÊÑ àÃÊÉÏ `åæà{lÜAA¿ÿ&ßß@œÿ:¿·ps{ŒÞŠæàü»ôÿøüëdòo0²+Gà_s¢åf¾Öþr[¹»¸¼)ú÷k+ùŸç¿‡òY¡¬,:Z ‡Ú¥e¦»ÕäŽËõõpÂ~r*©×.̬rìH ߬0ªþÄÖ0)ôÒê½pâô¼§Ä´?܃oOß:ÿJêGÍØ›½A×ÎϼÌnZ‚ž~ªís1¯²gÈÇ¡»ÿc\CÓ´ø l²Ûéâž1Ú#?ð͆¿Uj]^VNMÁÉ)Ý—£û;úþ‘¡Áî+øÞ=æœ8dZa ÿäÊ$7os—›z«gOÖ*¡ì/Ÿ&(­ú†ØªiP{hàö%I$ÈlÏMÒD¹·"­šVý祉•¸&ÉjMÜp›B;GXF»ÆMžZRD“…<¥–ìÁü”÷Iâ 6ŸhIxäûEbî¥"€v›S°6¾!1.(¯³<´9Iþvý\éÜÔGO¨¤È6:úUò¨DOm>Æ_/~;¼¼Ï¹äu4Ñ›GeŔɶµ²xõ@[ÖÑ_©k_Kû:¶pôãä~úW_ÜšÉ&¾}ïçQï(%å“ך—A`J›0•Åj.HÔn ËfÎÅy¸Ï’ÎþÍ›µAãä+püÉ÷è) |ОR>qóÊ~7Ò<ŠrL¡: ƒZ37E?æ½"çÞgì[lC”Œ«êtÞš”!éˆ'}EôŽòŒŒ™á‚óùb²ƒè1Ï.Ì<ÉÒù¯B!ëÏì£VŸK÷|ŠL#Ö Ð†±^ê|l©#šî‡z‚¶`‘ŠHóÆjñÐ:|û7£N¶{µwpÔ¹µb«¡zEu– £Æ…s¿SjÊ„ÁepF(ë´ ¢÷PǨÁ˜ ¾ƒw¯ì…yv‘§Ñm*53|«ˆâ½ÃmØŠ+¤RìrÄR9“Í#p\Ð6+¹’â*¾cQPtÝ þÂÐ7ãE(óµ–ww²z•xú‘|bˆ湺œ$ìJø¡×ö¡ kÄ ¿ïu»™¦ü‚,T¿Œ‡ÁþIvÄœd¶ˆ³”‚Gí ËNܸØGÄùôÐBªÑ?ûmϲ"<}'1=˜|£66-lÌ?Vh»k•g|Z*R _*‰`²cÿBùôþNõçhxnVšõ'•D3—±C‰lô,Dž£¿j¢1v÷±Ú~Ö½®}”­SêÔ •TÿRZb 1wÔwÌ2¼ir°}Í 1‡oÑ™±÷ãEn {‰–ÞF¾¿úšZ¢õõ¸o2Ó"¡-”bHB;)¥Ü£º¢¶ÑsM‘h`ÕÓ9÷ÍB_ÊÁ…>˜Q&"Ù¥s)eV¡¶²Í´72­‚«ÂW÷4>]‡¥*]‡#È·v¿¸íd_bãP"ÄQ`ÿBÅùXôãœÌÄŽÒ«!;0uƒ]ÚèWï)u±Ø˜2ý~œ8ƒŸæ¹&¥®Q=Æ“ ­hm€óO®ÅíÀN‰Œ†¦âcVS‰TeôßPÈ7+qÇGß~®ñ8ƺ'‘bGT5}º¹d)-¶ïöó)Ï ªeQ`Äo¸-òj" w¤FÆ›Ž:žãÖªèN,w` t€éfLˆ‚\:Kßeaaoó?x ýINaKxÆ¢ÎîòB¾ ‘(ϰ؜ý±iÙr¶#±6³µ”ñý¸| ‚o@­D'Á7í#Wœë¯'ùéÀNŸü'Ez‹¢]îÔ7\EÖqÊnR4²y®GM~hD€+F®F³yð…ªËì¯ÓªPg=?ʨ7ú/K â<¬‚B;%l5Xæ<ÆeÀG¹ö‘VAíÆ‘òŠ}W¥ôÞºi¿>líìQŽOU.ØJK'õÔXm4÷àý Çt•‡êD ŒÈ–óšX?ôȼ Îž¤ÉÆÕFEÖVŽÁbÝ_²|sÖŒÃÀ1±uSúËð‡Jx(Û——è½õW׋ÍÂóNp}¢œœ”…S?ÇCÔÎj#TµBSÓ­oR^ŠÆ®Öød+FŠŽ_à.uqQúÁE‚¹Õ• šˆ_¥•C"¥ËY„¶ Àðôþ=Ž#¤²|Þƒ Îøn)ãèìŒ~ÓÎ5Ä0®äzáÞø¯Ëò¶Æ6jاPÕó‡GÙÆñXÒ´(HÖº(Téû£nĨ«!‘ß‘,í€ÂÑ03ΰ=QÑ?$-Ë&Òglž×n…¿ç~U©ÐDeK¸øÈ¨9Â7lʱû“í¸Ò;“¾™•]x.0G2Q_>#„“Þù¥þªÌ¥G ;¾3G±i(ý”v÷8Œ'oT)è}°êÞ¨VÈài´½l8UÄ“æµf5^Ý“Ó6ê}¨€»‚¹âSÌ€á.ôC7ÃYÜÍSÐâ2)zHmÇ»Àù¤–‰³:­|ŽÇdôÛgÒçë–š»<ü(èòâxqª>SHÙì¦SKû—ñ‰#ÉÙVê†4ßñçÞ~¨ý¹%Ò;‰|hÁä¢ôÎLàH²ãelú\ EÆÄ1½w•êÌE©‰†õZRF×[Ðãú¾nV¢Ã-=ëH©íÞ¶nÎÔÓH‹œIA¬*{bÏ;†oñŠeÇRhŠí1ßxgKŽC? eÅ´&vš¬˜­£Åý:œn»èŸŒÛíûøØG'üðök1‰?% '@”YK°/ÙÕêP]Ëíÿ:Àm£7{ò Í¡ýŒÂ«8­·*2d6aø.¥ÅM|u\Åì8vÝqõâþ„a¹b󳆈ð¨-씲¼®?émEÓ›àA/Ef¤ÎzªÞ,<Ã2êXgÂwµ[ÓÔ¦TP#0T#=Sæšë?éãÝêá®áfqÃ(ô¨/PÓj{ÚC)×#úΦôùTCXúºî—¡iq¨¾‡^Jív_û´€YgÓ¨JZAü÷#NVXÖýpÏÅ9æTña܃}•ØÒªr‚Tú9n³ÏÖÌs„t˜œŠŸó²&tU¡ˆ`ÏGÐp+ºÓ‚ÞMp£MøçnJí–)(ë¢-÷~\Å8(yÀ(ˆ®þ(ß=R :¾¦T¨}íÁJ„GV$‘zOÿDäT±ÿÍ;¯¼ß^)mJźžÍuËEš\«‚‚OÃÞ.“µÎ_àgi*oUv®Äk!KO£E>§Aš>å¶´ Þ>V(ôáO|®wó5ûתôuFL(&ÌpW^ò”ÐÊ®‰ED+<ƒ¡8Ýð$|”¹@Ñfij­r´%ÎV¥d–C¢¦;Â(ZF8°÷Ô"Ýïe­ýjZs%èÄ@œÉ^)ÞÆîì‹v±A(ß̦?Þ^ê™ÓT»7ç©aSͳkiÿveÇØLFf¿záí²“¨V^qq>ߋߞ\Murt_ 9)é"zwRzˆù˜Œ¹Ûo•C-Õ¨];Yhdl¹=.E‹¨ «\;ƒvÍ0]ˆ³E…'+?-ãÁ!õ øòÄP`ò雕–c@¹"ÚúÜÄ.·³qã(°¦tR¨ûmJœ‰ÝõxàvÉ/ý¼`Ï }ÜèúÂVÄ¢†\„}­ƒ—pä±Þfhâ½>Óp=T`ñ67塀¨²äˆå£é·Þ2R¬Ýš“ÑäÎy¥0Þ?Ø;ÔVü ‘NVe³1!vºv"êÝfJ“ØìÅ9ÅpŽ9Öä“÷3/Û;'´ÓÐJÝ×TÌM­,~í{wZÄÍrÏ çñÜoÖ$µ’”6¬– -ÅbJ§;9æMÒ‘2 Z‘4o5êá/ Mµ±WÛÏkÝð‘=vˆ'¶Ä²èÕºÄ)*Z"øn¿pzr0é h<ÏÕÈDrÐp-¬Šç½TšÓùÜñaÎú/L+,ÙYXÚLÎLiŠØ ÇÖ't£ÖÏç‘ô×U†ŸÖÓRxµ;cZ‹çîòYĘñqp”žÖ<\9ÆÇ~ÑÜd-œÖx+HgÇ~T|.D)¥HuùœQº¬C“|È®T!ÜÙ¯0>Êî8§õºØô1Sä º¿€8î—@›à†}³ª–$&É ÞÖs›†` ú9öÁ“%Kz Q¥Äf|ãÑĉVC?8HÍÓœ|Ë­Cïþ„;yBòZ±¤êì9»s$n1Ü®ì9Ø™rŸö÷‚OÃx‘éÌËLö°Ð™2˰sÁ^z¶÷ü”·D»åì1B˜"à+/ó7ιˆ¤Ê¶[Qy/syÄV!Ù¥Ðd`†¯¹ÃØù!§“›…{ZÖšè΢dñ1YZ#ýÓ×Û'C_àÍt=²¢ ¥‘ñoLù¦›á× ”‰±] l;1äã˜212éXÀÐÔ–B/ñ<û®°ŠÞMÓ÷‹Êm:ªéÝ/õbð£>tº¨ÁGÛè&ã‹k1^ ÅéÄ»DsBÒÞú©OUËg’†àdežÁ,仺¢g}X?jx=˜eúø£¯¼Ü$=|J ‰&Ðø•ØyÌ÷`¦~Ë6F¶‰´øLökÇ¡ÎBh0L$áÜ_躦~JSÈ8:/–ú|—± ¦Sc˜r¶l£R Â)Ÿ Gµaò2« +ÂqÀ¬vΗC¬©…ÀZnäÙc¹xéo°%Çç(!ôè Ìèi~»bÇ/êÊ€GE?„›ˆÝƒÆäˆ»tŽôBZÁŒ¦ù „dPéɵR-r€»¹ÅÖ6­õ G–‰U§PzÙÿ·x¥Ë>팤óŸDÔŸp”T™¬ÙŸ´“Š( NW xÁJÆç¡µÏ­ò&ZŠXUKÈâæÆ\6­™AôÐËDR¿ß Ê ©q‘[âáÁðíéo)côíG\î£Uˆ®H–1 xðb%Ih­VèÖ"¢ pQ!jÎÀý!_^Í3ˆ,5!–ØÒúüƒO /¬åErúLâàÊ…2FKxŸ>ÔH"ÜoPaê1íhû3Ãû@PŒ³§Î…ù÷ÈÇâgå—[ò%¿¶/dmÝ6à éaè­Þúð2¡ ²Ò%QÊ"F‹Ì‡@ àÙ`6QÅDŒ›8ÕQ˜3(»X’,h°`;Ã0ÌžÑûÏ/‚ê‹^,Sé—-Šœîÿþ®C6²CÖ/Õ3Ã;V†¦R‘õb4G¸ï»/4!§mãô‹µ¡áßÙ¿q§ö©1ÿRˆ¡ R}½n=<È)<ÀJ “câ<©Õn.¡Þ94Êš¬´ …íöL=×QͧàýRÓKÞ6Çßµ€î™&}oq0ÞàæÉèyϵðIÝ/ÿ"ë36(E÷R͉šÖÛÉJçˆWÜÈ¥£´ó­5¶L±tïzœjʺúp¡sL¬Q_Þ£€´—¨HŠ%"ƒ¶ ½‰sY·y­.éºC^« ÅÇ®¼xœ³í3*'^$hAi–e*~{rÆÅOꇿ¶sF•ûXïFomk@²â½(õ,¿dã[iÜ 5µs=koúÕ þS©¸‚^! [ñ®w:çç!Ö‰sòš¦Wëy<÷x´ÁK0Ÿ€I*ëË–…f•ŒíjâK“ÂϦ';Eˆ¯'š¡¡ÿs2FÐ¥qAÒ )ƒRßáùÁŒjw @¦‰yG†râjáªý7L`%KE‘ؽ<•&4öP«8o"ÑÚ¶©e£´¤’`Íy!òů)>ä>5ã;¨×H?åM’©~1fx*ÉÁeÆK½Gœsw¨÷fZÖç/–¼ƒQІ"zö|¾ZT9'tˉ%Ú”Z¶®!«\žgÚ±×0Ëœo‰ ?u ´—ècOw­—h5”û‹c~ÅrKyGÏxÞ\DïGpÌÖÅ•h³º@z¶–Dê÷@†uîlÝ#Öð`¦äíÝ›¨(›‰ŠÄ=ýåë¶Œàn 5‡ ƒX‹üŒÂ®0¥{˜j"ñ­ØLØ?Þ€½„  ]¨Ú-cýIΧ »£+‘4¦Ýä;—¡×DÉVko¾![ ‘ëÌW|u@f_#up% n¼Øˆ`·’ߢZ²",p_Nßÿý‡~wÆç:™›cýE•BVäêC;³ô¾ƒÊÚh¢:ÿiJ# 6#›'NÃN˜î]n”ùe¬Ì5÷t¾HˆA¥£ùWÒXݲqÇ•á *’•nîÌ ÛÔДµêïôá¼²Z í?Þ«Þb€WPˆø¹Î>ðËÆ£_ÖôÂÄ8Û›MnÕï"9ÉF]G{™àü–î‰?üоÇ;²¨Z|Õ&(Dxç2xa3)m¸ÂçÉk Ín(JSÜþ*g±!Špvz$`sy…¡,J·‡sz2ùîc›€¸\x>c[™QîRoêud {[mŸê/&–éçïeÚ°”Ï¤ÚøEï-|LGÓÈÕ1ÆÚ9(¤ËT͸¦ÒZ°&•ö©ü›o´áQ@Œ³uÍN¤€#ìÞU8íÖãO:êIT[m}'aïu¢0å:sÔqª ä˜îSmŽöÖè>£L—êçÄÈ ˆëè$üíÌbI‚°ÕR 7GDÉNƒˆÃ𸸦¿Ë=5É” !†ú º>Bcdæ–±äD§N¨8ç÷ɧ0&`8Œ¶ Ò&&£ãq†kh>Ìðo63IîŸç¼7bÛ°}" kyþÀ¡Üà 1Qì˱i-<ôN¨Ô›¶ZÞRÊb2UM.t¸•Á¼Þ€®½¼ž9óôÈœ ™m#¦óÎÐi¦w¡Ó¢rÎI2Ê'”\}­.*»Š+ëšÁ¯=ëÒz¦ ˜änÑ&Rk$Gnx>cÜ^S=ÁÒWŒ/Ô](·ŸIûi`ó^¦°€0£ýüOa²RRÃÎ;Zß»}…emŸ®ã\íð{œ®%/V½¼ê»1ñþÌWùø§,‹¼_‰Ë½ i¤œ‹áÄQ.h)\ææÎàØ4c}’Wèk •FâG_ Q(9Žôz09Ó_–_að$m¨0;Å6‹AߦFlhBH²¹=­9ÒOX¦O@ÃíþÈ`þSfÉ­C­Õ2¿)^3b"Ã9À…rØÐc2ûuFæÜWJt¯ÌúÀ÷ÝjË㺪=Çz´y5@+·9~èi ÿwÜ‚MÉàcôg±XózëÚ§ß`˜˜Ì"M~q:C4·ó¶öÞ­GP¹¼Ú×ιñÔ= ÁP|ñ‘Cz{öŠ·l<¬KžSžöIž6ŒA¥JîyËx1æ6¿U4À=ì™ÔùÄf¢ÞÉãÇIÕ C´H‡$õȼ†Yžœ/*Ê OÅ gÌô‰ô HÛØ'6ÇJüûI?TZm&¼Ãéy„ÖnQœRÂáp”õ°©²:®t<•[E‚p)K/@¶¸´a¨"h}´rþ¬zfbR[Dÿ=D͆„±ñæ Ùf!C ’S­kù=Öéó•z¶ÐÐ +MßWã>KÑúu‚ý6ADZDò U¬a,ÒXìx‡¤Z:‚ õSCM´åºP•1kB«E.¿9˰3:knó¬±"²ØçY:<,£_ó`ZYM—Yêâ#WkÚîÔ3Ù‡‹ÆÚ”w“wàÖÒîL/È]üŸŒþ•ÕhræF4W1<Ãj…ø,NqÐ÷I‰/;W¥cTÑF5Fƒ£ Ýz7/þ›ïÙ!—ÓÊþ[ø§áŠ,tšÁO|6Ë'Îï<øySža÷}HKwsË’û§ÔÞ& ± è „6^ÂS®ušE6¼æUßH—dîüäûQ{r')(¥ÃdåwÃÊw 8ÞG*÷Ý b1Q|æ ü™ÉϼêbVgªá‚)ò"xR ²:ÁØÈ-t¿„N~ 9—ñØ`ŽŽ‡_àôðÂfD~eq΂¼·î²t× 3…¨Z0|{ê \0Ô>®)ÆU›öEt®”ì-ÒÞêˆ-¸ñ€Ónœ´uËUù¢£*éÏð=t>ÓgË1±Þ’Ö„Hp“Ì$ÙÂ~EøË¼¶Aµ´€Šu¡BÌÉ’7NñŽWÿ É.†Ê?—Ó—øÉÑdï.šâB™éû—ƃ-Wó&úÄHºVz…×zÀzÂÍ"­w7¹/gSÔhMÐåViÜÔ2c§PÎ5—hs"¬Ìƒ—Ê"A(&ö@!ŽZë¬ïÖßÁ9¹—Ûè”룰óú]X**4Õ,Òq(3øsO¦§Ó†¦H_ƒéÜòÒlË^+öcx–@$ÐçÑoÓ;äãTl´¼§ˆ'“'£‡ 1ˆO#mgÛóÍ߯$¢õ4OEŸ‘öE Â™9—æŠø§¤bÇoêYI¿âݺ(³—}¸›ÁH#.Wkì¿öÜÒã?÷1žíê96»ø@t‰"*ôc 7_y¬h/N~êË(øl‹9KH^òc»sǸ0 w¬‘3eofuÜÇÂÊi/Š{Ô:™¢d©Ž‘-sóñôÚV=ù.ËL—ˆ—¤_Vv…ÿ`<ò³7²WƒÉÒ6°’ü¡õ‘€p—3þÃ`Øož÷Ò.I&¸nÄJü\.³`gc„äÓ{­0ä‹þ›W­OM!×ÕBF ñº÷¡Í‹Ç_-·ôyäÏ I ÊõÛWKžä„ý •_ƼUMR•héWN” Jt…D½ dOdKy½y£ aZtÙÚùž€–×ÂH(ÜÙ~¯ÞžÌœ†E«×ikÙÄI¤„&‰ðm“{畵í±´|ÙR[Ÿ•kQ".²‘-ŸËÅD±eÙ»¸ào2xjÏÜTù5FŸ!³ßá'9í4uø7h¡iÙ.ÆX³ÔÁðh”5‰AxY!‚£}”ö4ßö´ØÄ¦ŠÒ`Sªß)4çù›õo$ß…»@¹æç-¥é´:ßvH`ÝH¡n–¦« žø ³/µ)ÈLÒ\ˆ°/vxŸYµ^÷|, =l,äÜóÊÍ×z_;$©@ P¥Î °ÇÀ5Âä–×…y2CúZã9ë¥ü â9ºK"@°G¤ä«ø°ó.:þüù‘_’°YS$£$—$РM–LynD½˜¸Çýá‡Þx GÏçJîbJ¤Z©,Vw¾ÐŠNËÒk<µÎê¢[*Âè(Œ'Ü\Ï¥ ¥–ƒ–‚vÑ0§ÇHüSfZÝ&œ_#ËW[þŒw `úÕȉWÈÖQ¬ÖGDëø}öÉÀÍcóÙŸKç>¤œ6FŽš•-*rÉÖkÕ®ýÕ^š; æØ~ÒoK¶_q:ìN òô‚Ï'—rO¶‹Ú%ü-ŸáMhÌN9MÆÞ¾P3 Ž™Úïìµv;àË÷àÜïh^"u¥ j¯»òv«µ·øÑ%íZšÊêüiDtBßæ7Õï‹Èý¸~ øÒLyH·~3šóVyÄqnç¿öŸhÖì vÓE;‹´vðh¦9v­Ò½¿/ë˶—öDÒ‚tù ~ °þ$ÒÊž´ž<ÕâøQŽ2W\»!–4qÈN"$æè?‰’3ð376œýSw¨A…Õ‰G%„øj²Ëò³}Ìã°"'Ò1cÆÌö“T"¦TϦ[\è3¡t¢éÄŒT–Ë8¿E/1ùJ!›õŒuàCKæRzȽ¢ÂdAŸ~ìÙê­G™ R°ªcî ݃Fc¸SúuÖšƒ,È<ºI‰w6¯7B¿ƒPºÃ]$Z¡ÍÛû0v…à^n*î.Ô±YžÏÛS*q°i‡êÎOCcÅÌvVw€!Öûv¾o‘@2EdsF:œ`«Ÿìbp™Nçmüfƶîç“ñ$ÖQ ^Ÿ©0W 763$iãÚ_2Ž3”Rd/èò`YŒŠ3+¿âKåS[žH$ˬ VńؾÜJóîj¸t Þèç=‡X¡¥Ë‰ü„?.5,h©÷Ýk ²6löŸzŸõØ-7ŽBÅÜRKáÏ(n+¼¢ê²Y$þòƒeÓpü§¸b‹I¨Ô3¶þ&Íç£ùœm¬Óþ•o͵ó7f›E¥NìsÏ—ò~íͭͯšC·Ôó£‹ô7NÃÂç·܉,>™sìåýaq×j‚xó!ìÙ$ Ë“HŒ“7롊 io´…PcÚ…%c«†k}lÄA~Cº0-wðºä sÒ¤©b‡W±Á6>o†vü '“ïS’‘t(qE‡ÒQˆ¡ÀoC÷¾Éöþ¼Ë#aWÒú[Å3q‚Ù bYèfv° Õ¼†À»D^¼Æüñ‰0h‰~[ ¥,~¤ÏÞf>QÁUƒ^%ØÌîTõðhf‡æ Œ¢›§.ÑõfkÕ覔ݟ­Ÿ8û~µhc2/UAÃXf¹Îm7×?BÛ•~:2¤ìIËf@ö×)ûã3íHuÞÇ@þ¾è^{ä·î”}Ñ:¸WlÜ;U¨” Ö‡‡ƒÖWá¹çûhT6ýùOjJfmrMïÅ+NÎ<{žnåŒr¯ ÊÆ51MtÑ_²¤¼ÓÎYüldÚðu¤­új¶Üµì–g¼nþ¯kgž8 ˜޳˜û%RµÒÂ%ùª.o,µ*›)„itò½¯ ë@dÊ4ÂòyÛ+y;™³Ê áÇÑäšÖ'ï_ÌŠ1ã~þ>AÌ­¯©ÀTÃ\y>¢;îìБ_ÄY]Ï ¸ýe–Ñ\ÎÞ¤ËʇiÙ|Ï»CÒov»Zô]‰\g‡Æ|â«ÿÃWa·g¢ç=äcòKx‡°ÑÚ?¤øVR>|žšÓ…Ä(©z‘* ý¦*g& ªñ'ô‹~¼ ôV¤àš’/¿)â?‘=ø‹ƒ ]B0×.•‹ qIØ6©c…§Óph(ÖeäΛ1VŸd•8Þ~èÀ `+Å$œÂ0=_7Ú3«ŽÍí ŃœÃ] .èôVR¶Ð¨ª­/gŽ+&¤3É®Vh!¿fg¶ãá™%W"%Ó^Ø>ua^b$'®ÓÒKCñchŽV¨&Â9ß…1„ÚÛ TË¥¿$I^ê¼×›¸ö"Kð¤üþSa>a[ø»Šk‚sÝãDÜæ;gb˜úή†…ƃ|bĆ(-ò´€?Ù°ºôÎöc¨·•âôžï›Tb5cÁG{´Šp®ä!¾QÞ”IýcH—Çð™¶dX*ÕæF½p‡ÄÌ‚‡Xä¼ÝûñxÁÇe•ïÄ™Acº"SuHz±àÂDJ Gì™ P•É|÷Û|nÖ ßwò˜t³¾ÉJñ> ÇãßñIš«±FÐ3Þï Ð/òµ)Qî5ÌxÒ¦² ÇÞ”¹)µÒÜîÒ¹zþÉǃ×|ÉÝTñ‹€… -? gÖ‡?2)óË•0°UÍ¥¨<^‡|"RÿäL^|˱Ÿ| 邯÷Ø+Wå8¼ÙQUwôMåE»cªõÒŒ®R‡xSs憩;ÊåûÈ¥xç·˜ghâG#»ˆ°*Ò Ç¢+¹4·÷E“Æ·÷4[õ¾l¯ºb£dIè¿ê¯ŠSþ±ËÐ`?;y¶â^b#o}ÍsQ‹Žù¨Õ>ò¾»§±Åë+Ó¡”Ë2•稶G ò“ì ¾`V¢â‹’¨6”ðÚq …=õÃã'AzÂR‘õT?øü/›[¿Y¿>@Õ3CÙ-±ƒÐ¤2.i.L-¢øW¯:Œû0Y+·bÐÐ]ÙÐõW[9ø]ú´ZFyüÍV˜HL˪r;]ZSž±&:®yðöçò‚ÎÑj÷M!Øx‡ºb‹òi^L7’¾¢`}ÂÞíŒ{É`õŠÞØØ³ÍžºaÅL=ã}QÞ÷¿á0Ö˜Ð#‘}Wd]l &‚cPÙÒUj4/²cÞ¯Tnh™ß¯­ÁŒ× ~ïv/ظ>Âᯚ Ë_¬~ð²ó ËÍ­Èe„úþ Ñ‹ IÀ×Ì©l=­?n³!Õ[gex7ˆ<‡þBÊ×rÕ “‹eÒNBT%6]KuñvŽ&Ζ_mH= ÆÔ؇âBMZ7ŸŒµº‡)Ñ®J^3Lñ6½D>˜•~UM8{9–u½²9$<¬­i¾= 9ûu3@Ø„6U;‡ î±*ëJu£!ZÈÈüØ–vÊ?Æó™ Ž-þ]”˜à¼ìÞwôjÔPBÙ>û™çße‹`:~¯ü ñ/¯‹´ï;ê7€ 4 ±µò’)k'FÌfwˆ·Nµƒ–†£ÓLž›ê•ò`õôí²¦_C,Ó"‘|Pƒ.qË’Ùéä5;ì´„–­êH¨Yy>~ê*Zn>`%aö›–±½JõÆWÚ?gV‘ßõÌšŸ©Ü—ö…?`ÿâhuÅÛFWÝYÍ¢«Ô7Pâ˜ÁˆñÐ×ÉÒ x#éË2ÝahB.4f ¹[¦žcÖž.ô¹ãëÉõ_ÓÓø A¯a¥V´(œ±“žÍŠBza/â@ *ìÔ-R0ƒ  žÑ|5A÷1òª¬ô) óQZÈ©¸¤Ïâòp=7Ì‚d¨MV*p§²7–X†K“8/ã0lȌʩJ IýÍ•r:žºŽr“ƒöb1š+çàÞGe‘ÄW‹.K‹ðÒhBàÅb”v)b ?uÁå ß8þ:ø©Üã°+!"z9 qG[‰¼|É:]MRüÓ8ôBΧÇ%›p‚œ¿=Aç3¼ÅÌIr?úÁ…‡dìªïà»QçÏÝXÄ Dž0:ZWá‘<°‚„=*þV÷ zÅ ÍŒ%ÍY¢OM ZŒP¦FtM1l½}ZãžÜWú£5£¯!½“­s2ŸgÀÕh¸Üu§ŽÄ<´û³žáWx‡b—‹ŽÝ8•åAA‘¶ÉÕ}µyýh;}k¬»©zDkåhJ'½óh=0éÒ-¯i×™aÆ€–à">†¤Ñ»LÜì$µ&ô9O¨á¢ ”Û)XŸ5n;"L/âYšOÝ ÿ±róÅÉ6ßñ‡^‹ÚÍÏ!¯>ê\³ŠÊorÔÁ´n¤§ÿÖ#} endstream endobj 1017 0 obj << /Length1 1625 /Length2 11761 /Length3 0 /Length 12600 /Filter /FlateDecode >> stream xÚ­weT\m—%ÜÝ www î®EáPxpw'`ÁÝ‚»{.ÁÝÝ%dÈûMwÏú¦ÍôZë>gŸgŸ}äž»Šš\UƒYÜl’;º1³³° ”mÌÝ]5Ì™%Àö’`G À;ÀHM-é2s³;J™¹: €àà°óóó#R$ÁN^.6VÖn:-uzFF¦ÿ²üu˜{ýò~ÓÕÆÊ@óþà²;9€ÝÞ)þŸ/j€@7kÀÒÆTQÕ“W–ÐÉ*kdAŽ 3{€ª»¹½  h9º‚è–`€ý¿à{–6Sseyçw˜\@@›÷k O Èé/Äp¹8ظº¾?l\V.fŽnï5plöî¼Û-Áÿrr¿{8¼cïdª`W7W ‹“à=ªª”Ì¿tºY›¹ýíjóÀ–ïž` ûß”þÁÞiÞQ73GW€ÈÓío,sÀÂÆÕÉÞÌë=ö;™“‹Í?2Ü]m­þKÀdeæbaru}§yçþ[ÿÊðdoæädïõÏmð?^ÿ©ÁÆÍdoÉ‚ÈÎñèöÛÊÆ‘õï°È;Z‚ìlÿ²[¸;ýærù§@tg†þ]„™ØÑÞ `²DdU»½‡Ðý¿u™å®Éÿ-þiðÿH{ÿÿšûï=ú?^âÿß÷ùß©eÜíí•ÍÞà_Kð¾e\Š€¿{ðwÑülñÝ2s°±÷úoîý»£è_ZÿÒý;&ïfö^qG«÷¦°±°ýËhã*cã ²PµqZ,Íìß«õ]ë]‰‹½#轫ÿÀÌÎÆöo˜¦µ ÐÎñoù¹ÿÞå¿)oÔ?ºYµôµU%$ÿ»Ýú§êû ¸iz9½‹ûß¹(-þóð—GBì ðafçä0s²ñøÞ×.?/·ßòöÿ:+™¹¹Øx Þófcÿ'ûÿýû¯“Ñ¿ÑH;Á‡FÃÍÌÑâ}ÎþÓ𺻸¼·÷ŸWÿ=ëÿ8ÿ3ñ 'ˆ¸4 †Ú¦e¦»Õàå Iôõ°C…9•Ôkæ~w¤EnòW˜>W‡±4L¼¶zý:vzÙýȰ÷£מ¶û+è<Ø’¾7c¦—q/˜Õ¸%ýD'ÖçbNqFŸ‡M{okLMݸøùÉD;§ üÅ} ¥G~ 6Õ½ª?0µ.§½³¦àø„&ùðážv`dxh°û ¶w—ˆ1;ZÐ ÏÿË1yŠ›—©Ëm=ðöɃGáæw\pÖSÓc•õsÓ³ÀZi n ›¯Ý!‘}e  ÈÃì‹@>º!Ö=}.V•ÞWʘúÔíC1&¥ø´™þéSçìâ÷c2Q!¹q¢Ú³;³Â´Úø^ëVegkÇA™P8&¾§yJ  ‹³K¼åmõ€a~Ö/k*jOŠiÞ¤ÖË+È ßì$áYcìŠ@KKì`ã\1T¦ó>¤tùí²· }*ûÒ|週²n?0‚ÀZÜr`VAo÷=ûלl©S»þ®PEöé¼ ¦OüQ ÐçÒöô´²”ÝÝ*Ý€—»w†6Ó…'`.ëFø;Œ jXÏå™4£8k‰p´‹^‰VrF-J´3ư0tîÌ­éN½=—ù«CÐÏ4¤G¨» YU[›µæ`ýÚYðø%[×ÝÊ}°Öåk§W- IhpºbqnÇøËQ •ͽ²ƒ{ )æ\7Gßij#÷"MÃÔòÌháW62Ú¿±w•q7Xv{Íl3—Yá•oh:Ú}§’¸Ãýú€^“鬛 }jé!ß’Ï亡†œO÷ªA„Á~F_ÞǪu®Þï­µ«ìÃÒA—¶<`øéHÑ8‡òZÝ–ù¹UÆn]md9¯’õ{ÐÉ­ñ¥¦€ï§Œ*”M=Øû&{ðŽu°æJO£Ï$/M™Ëuiˆ°÷m½·»sZLiGó¥Á¸çƒpJÌ#ëÂ…°:>žÂ ÷ZZæídêŒ9“¯ß9F”´Ø7 •e7æ•_˜ßH˜Æ³[ÛNWÈr¤)†[Æ$¿pëpË5jP¹upÒýVÄò%×ué\ØFÚ}Äï—S88ÔÿŽÜ”êd-æºUÔ2w‡5°Zi ø/ß\$.Jù§Bm~dvt–¶„9DX³Y·Š5ØË2–¤ †£¯‡›ÉÊüÓé£Ý9…ƒÒx'“,©PPš‘±ÀÈ úÔ´qf1£’NZ¯p@ÎÈýü›¬ä4!dð[¾~5ÂrºG*[/øiÛQ#žQØ+eÝ yޱ c½•âðø ¶ŸÖ‰‹’û.zÃ\'m|l2ØQ™^> öŽU"Pî²¼aº1rÆŒ åÒØˆ™ +ÝPͪ5Ãd×gº¸F5ö±…Í£lú…õÃ9L!?%žÂ`o"ƒ€÷„å„ÿº ¨MbñîÖ‡aD'nÍ4³Ò¦_N!¢ÁS—9þ(ü‘ŠáÔ£•ÜŽÐh/dÇ­1w,?ÃÞz(`ÜdÄù"È-êõOúM>󱩴Ö«V‡FßþŒ:9¨ Áak¨8ðìþJàíËägßÄb—ÌÚ³ÆrVTÏŠÇ}²¤àa./ îíÏA6â‘¿åÎ vrn€"Ïœ‚ýè<÷in`×ÃÂTVÊÔ’Óv¬êö܈/W•Œ±×â‘Ü´Àk‹9õc«Q° ¥önµbóð!»§VÐŽ‚6å pàYÒ³Z8¢êzð êÑr1-Ã{ؘAeÉ͸¹“M­AÂÁ øè¼®dE7ÛÇÌgÃuô*Ñî,H >&uÒÖ9ø½ÆÅj7}»vð€>t·~.'ˆÝÖír¬•Eò•”'À´-@ô3zw4Lº:qzSSëÓ¨4½–¿ Á²»qo¡ÄóA«ð‰¿,دËÜ(w{Z$áËöµ^ñœíˆbOêIAœ°ÉL+9^ËÜ=§æ¿ÁÌ9-™w>}ÆR…N.36@Q ¯Ã‚ÊrMnÇ:Tóîžvm•Szc_áµå…èçÙÁC#ª.î1'ìºË’82©„¹&›ÐO”½”ZÓ¡´0þAð×— '#*¦ËQgÉy)a _å>K.‹å É‹³ÊbÑY âc º%>¤Šþöh–fåL!ÊNlD&„ÐßGMÚà]ÈEırùýÛ°@$% ;–Q3wo…2HâKMG^NJN.à Tp¿ Óãu*ïµ÷U¶<á§ÍåÄV^„úÁ|Ìzu"v‰8>MEPÓ&~mFûÆèì©]kBòlu+Êö±Ûí/ÒK3šiü'ÌîX¼ŸÁ!)ß´¶Ñ†¯`;dô7ð²4áJVÑ5tÇÛ8á:h˧$usbƒ†‡C¸ÄGÎ"Uù0(ZÂV¶¶tŽÔOô÷û’g‚ Žžëõ}= Ë"ç=7ù}Šq·‹`\…V¸ò&}ùô*·W̶H'¤Þ<Âùë÷æd¡„-xöÎ5M¿·ÂÌ‹[¾!B¾ }5£éA±j÷”›Ú°ç$há&¿Mx¸Ã5 •KƒU~ vˆm9 {Y¢G„o¸QÌÀÅçÔ±Cd«é'wnkÑóËÎ…`Ž«N«);%·Ú=ÜΉ•Kú D É4åTnûG' éÖÝ#n 1A cDõÂýxùv™ Ib‚:¡®! wš° ªAÁ©Ö 8O›g=’{«YÐó‚÷éH¹H°ÑĆ\Àx„|,Õn‹s-Ñ']ËrLJK9~àîú:äyÏe+Í×,²¨“ ¿ðM«}͉a±ü¢\ZÄ‹Ç>›ˆØä´‰LçgÔCûÝÉßzO {LTC¹-È¥VÊCý¶Ê…Tˆ[iv)/7»é]ê†8¼¡u–³.wæŒIôÓÅûEÉeMIpqXe´¢»ªÍ/QyÝ ûÊ#È8fð(á!¹…€ðÛ©•U$kD¤(HönÊ^!wOªþ\xd ½$ü¶}¬+ªßfÇNúÓ´4…ÑxS}Hy[egZ<›Ev:D°8X5ì})œ·;Ñ+ââ‹vx ÙaC'•TMS (Æ–D4wÎ9ûÙ|H@ü24e5ӜӼ˜ðàƒ›Ÿ<‰yñâˆþ8ºÀñpS‚ÿ¶›| ,¯”¹ä^ØÍŽ úñòjï^ÀÙ%kö3C_ÄÖUÔc¡–gÉWÖ1lî> õd5Ò ôžjrÝ^;Ujg&È^¬HrÑžn†]ü…äª3y’)ȹü÷½É ‚ÀE‡ʾÿG9u4„H–™oÅñeÄ»mD©¥ô ‰Ý—gŸJB|{>Þ4·=¶B^áÏðžo÷DªQOL%¿Áè9qûÍÎ<Å$±8©`âëdt便 ç«Ò-fl"¬¿ª…­B¯ý4ñ+Eú5Šm#)$áßÝ«huŠyZ¬j…¶šŒØ—у|#•©¾uõ¹\–»f%Ù§o@±ìÖaiõ+›9{-)ìÍõKþ5ÒëüÜeCEw“9u(ù«iÔd£=¸\Õ4y•Šo”^ä:p᱿͉ۘàBvGN?œÇSõ¼÷öN®)»SHz5‚$ºp ­ú[M¨’Æ`“¸# ðIZ>nùºBК·…—…Ô(Õž³°·õŸŠSÅÇåëԼόVÄùþ‑¶ÃÙ.rh3+3t®%¢K§-&%ìýöœ¯%Ñ5 ”8øÛœ× ®´ÚÛN­Åpšc¬ü¾/VÄë¸'d¾W!i™´2¾®ªð`Ô{]W~8®5uµƒ?6þé¢qVÁŠÓ¾Û&_ͶËl§ÂÈç8Ü(æEó˜^ä¸1/~h¨â “¿>vÞ­ÂÒ²”Z™ìD;„œ„ϵT3A—°cÈÁ¬ì.NÎàA­NN=™ò©O¼ù>ÅÊù*×m=dŠÊM¦(ì\5'_ÚC¼Hÿ•:/Öˆ©A2cõ¨ÍZì:Ò02}-jáÈÖÉ% ”jòªO/ÎÍ!E®aK·ëí}Í-*ÅŸŠ’gæÆ§ÒêÏÿÑ4H.³—¦öÉ™_pG7÷xfã!F#=ˆ~VÓƒóƒVÇß9Ö꿎z¦¥¢Ÿ¹h‡ ð¼D^½°Çâ1ˆ/Í£ÆS©h” Œ]ýD¤®@ߌGr„ Rï+³‡pò±äï™›_ºªùx¡ýÑDnWÐÌ«¨-«½4K_~mÁcmÆ® .–oO•ƒúÃáíšjÝ<$±Yi¼z Âù¬öRQnÒ#ìÊ´ßDïâJž<Uî& yœ ù;ôS–ôPzòio¿‡þ´xŸ:~£9«Oê&b3\Y%TS’Aƒßa:úÞ¾95{ïÒdqÀvcÑa ­ŒÅ‰=ªFÁ´=)C¼Éf×< ë;_LÜ$(íqøž9Eã†ÔŠ?äÉ7²}™… òcÅ·7U3C<Û;y©íT‡ÇöbÔN|EºƒR®žûÔ±ïwœ˜¾O=#8\T ¶>ˆ%ýF‘4Ʋ<ë4Œ¥Lã=3Y¡úXÆRš¿Ø[nñTé¥>ò»#²­J¸Ãm’) Ùã©ð„Ë5q Eräóž“;¿TÒ®XY¥•ó³\Qolv³×bÖ È Œ™}Ü?~#ò#˜H•òúG4;‡ ¾àË-þì€ãf-Í·ž¤Ìà:5Çð+Å KI)áå{(©ë*'ƒ ±'¬œsi,jª~¢ýõ«_1päH£­ð@ò7åxnYÁ)hð2R°+LÑ%më¾’q1¥kÆ£†½= >+5U,ivß‘¸‡Ñ€LòrõyG&—bè[µZq ¶Ø$~zºØäП»ÛÝâ+ZöÞGF©ÌR!5I¸4ŸÈ3‘­9’$|4XÅÆ‹1ØšÃêíÔ}ÚYÖ‡±ZKh×[&ôø0¹*0—æ,aíjþ¬£Üœ‰- Ð§¦/Sðü¦¬÷y§Ø·ŽD7qˆi.j^Óô,ü Mú$·Ã¯Ù";Ô€B[(B" ÝöAñµŸ³ãEA°Bª-üµ{¬{'`~§%uăöšÒÁ&™&{•Ù$XÒ¡{§ÞÏk“Î$Bo´o&Ï/¢Àˆsɼ8]íåéŠ9¼K·6k¸–@™ÁøJ¤pWú:αs M[¼ŠÝ•» ÿ\ÆzQ³IW¯ŒÐ²QÛ~1ïÙÓ¹/¿Œ`Â:¯9¬ØÏT‰eBvSZF÷ÍÁØtÙÒ— ~©¨aÎp ò3G—ªÁGQlí%9/V½ÎAua·ªø}îî3I¶žS+ˆËø¦ßu<]úaÄ4¶FÌòƸàlVê?Æ ƒÓÞÑ‘G½˜S9œµDŸ€8Ð'cᇠÉ<¾D‚~eLñÔ±võJø4¾õ;sÁ?<7BEQé/rÝ”ÀXQgEÛ”4W?(ÅÔ ¼ò¢†Ü2*2XC×½¼ëK<bÃÔòùßOaÚôOFçU_1r? {#&“|êÇÆqÉÄúÑa„‘³lEƒSÌ1G¯òjæ.;uc[yõ^ƒ‹0dtRªÑ#Ô•QŒì¹ù°æ)OðË®œJaCÞæó…≮’ö¸=ù†ÙÏÔ¬¾Ùýdê_ÈŒ‰ÅÊ% ±aÒù WVf¾üDýÐ%{ÒIÝ‘7ŽïHòvýE=¦_‹2sàIõñl\¹dñYŸôtŸ9Ÿd^â£+jìãnºÏd®Âž6 š­Úý§mBZA¯sL;reŽÙÒ÷¤?¦Âê„X”]NElV{ørS =‰J ©O>·´^5Ú›P·’‘pކßvÐÅšIf'‹#âl Tè§DPǔͮ|ÚÀh幸8°D'ÀhêW´£-Bºp2¦Êl7»OõVfåí¾/ wu¾Á(Aï ¡Ý°lýÒ×Ëàþ‚<9Í»€|Ð3üq:†…{I»ÂB9ZÔ.*t±ê°ŠÂÏ{dP euúKÁ:þÖ ¬[.‹l“®ÃˆÐE•SðsŠu¤/C˜£7Í%Bû—ä? ¥P!Õ¾ ¶Ú‘;”eL^ŸQ÷ž´%nR©X ÃènH®PIöh%>3ѺŸ_±ýá+ù»OÏ¡e,Û3N©«KŽ$@‰¢"n”nóO]Eæá¿GT¥½#?Hù¬­ª¹ÀŽzŠÝ¼¸&lNL€ mžþêýø5ËP[8ý‰eJHÖÂçÒý iÈÐuw—?MþðÈSÏU_4žä)bU1Ù„ ÏbT§ ¹.™o `#Iîè3vöÀ6Í!Þf#¡ºÅÉ9Еbú­›Â—ã®_ê}ë’;èÌ#…æObô™Ã¶rS_Ze¾µ4f©¶Â8Áìó½ë]å»gƒÕ^¤Á7D¢n Ýï ÈœO%‡•ÊÕdì/tQìþË¡~º!¼?s> §¿…_s>:túU¯Gÿ¤Ê¾©|Ìï:߇/Z†~UÝ<Œ!¬.F%;dñø¡FEF¿#Sò›|Býø{¬Â ¬5ß8%w99Ú«%ÞmnN;Ü ›_ÉóÔò:EZß5ô«U.Y%,ñªãUàóòÛ6“› ת±Ùt›îžO½{0½®kØšÂÊæÉSÜw Jíæ¸,¹`˜oß*¶?2éœÍpÀ cÆ eX7ôóñ.v3V6©Û‚ýãñ¥#*W }H½ð¤,Ñ ’ÕhX"ì`J–YµO4ÓúѼ¾g0Æò.ئ>–ÄcȈ«Î&î¹( ½žî”ê©ÁÊ€Ûï¥[B‰`д"ærm“¶zõö¨j¸B‘ëk3ñ85¸ê¾_BlÏÝÞËÓ§@ØÏýYõi¸µj1쉩DžŽGílz)IjôLòÌÓùMòi¨h‘ç19Òµxë{ê#äŽÌ^ì4J•šÁÝQ ¶¸Ô„€\Ëwóq¯×kÆœÌi~Ú'¥­ä”úÓ.I/þ¬ã‚ŽÆABªþà:Avþï¬(ñ7Æéý£6¤û[-4ØODyÃ[¥v¾"‚° «Bº%f¶é¼¾,;3©MZ½S+zSì\Æ^B>p´€ù½. ·Eÿs›ýzÁ°ÊTâ¯Á$Gùnv½Ïðç³/“ËtñÄà|ÆŠqGfÙ¶×k#’ù,-cr¹ŽÊ #Ú‚(ÐñŠ3Zr𱤬¾¹lߢˆáñ 2“÷—ňógsµz1C5Lrm_ÔquµObý7‰’°‰¸5•Z”TkA#(qÚC޾¢c笥·V 'LŸYˆF§Nüõ¶®šìG ZT£ÄøRÓCNAlTZŽ{CÓÉ«ùLyi“©¢€z k~Ïîè ÞP,™)p'W~&>´ÔÁG‰pp+EŠà6‡3µï"É ;ŠiØ ¿_¼]Ó½£€„g-·]ȹ:é¾ìñž|r¹Õ«ªj¤‡±9ÜD¾ ©•Þg¯ØÕ›êuó|¹f­æ›–ß•ÛTø—Z.>?__gÍâ÷œw™•¶ÓÉUÖ³ ÔªÅ>ä+UNÆâp$Ä^¦qL«˜AÃOórãã“ið"ØÜnÖ–‹›«Ê­¤Tò‡/sýÃÜ¥–©h$ «t“Ö|ByH—Q…Õõ°"£(IbKìËôŒîªÌ’]öVÈÆB€€JìqîÈú9…ƒÝÒÒXßÈÒR8dî…®$Ú²aÅu†‚ äŒúÑóš­»~ÏxÙøEñ¨¤šVò‚{b Ó‰uq¾ÓFm—‘þuùJÜ[q Q1eY…¯ÆÎKË;!¥"3„àWJŽ›0Í)Ãõ$yL>0ªbŠ4R)ç›:ÈJOxHùc"í}ÞàÒDü/ÄW¨: gYå^Û¾ Z2V“Õ¦ËÝa3ãÐ육;FAkëòòÍþ(Þ2ì­·hÈà6Ÿý•Nj%ÅsBL³7§O&؆'•PÙŒ‚ÎK3ôú˜™‹Q…‡$46 EBh˜Ïê8«HÕêô¬IµõìzäÓ'±ÝÙuò?û›™©óhQó°xàÓÙ-iWœMûa1V¡êaL—!+;‰h½S²\ˆ+á&jª‘k„³èÆ!'Ø/%ÌÙx}F[!¬É )E-Ó¨ë¥¨É v%_eMŸ²ç:ÝÚéyDƒ†pTº.Œ¡V8Žþ“ö…£°P?ÍY—¡­Ë½ ÷$}ôœ}BbcŸÐî÷5î÷D‹XrL¬;4¾˜Ñ ÆS1KÁ¹¾ÐFÅRWÐG‘'$/#Byi0TsBÌ÷]®ÐåÉæn³ðÌ!(-fö5ýj3æ;ÕÉÔK?'øtüØ8õ Ÿ‡ƒÊ‰’P…ÕÇôVú-Չȷþtókzæˆé—É£Ÿ7ú‘âx¥çàFÀd’­‡°È rßBàíã`ÙÖg>'…ؤ|%x>Óâ–D€—§ÁÚÀw¿†‹â‡g¾ÜK¿3üÅøÛk­èŠ ÿ:‹§BC&ð÷µVÁ¥…‡Îz…›“ ØŒœ«:bDîÖtö· *¸æ[9ì#³^«^ýé\ ŸŸ±‹ßS/tÑ.9¢Õ¡:ª¬ÂH:ã *÷úÏS}…ô|#™ÝìïëA …¨ËÆÔ»ÌY„oåc°†RŸªÇ¡²º£¦n»á,D¦ MëGÅ&^µ$ßXïVRR3XŽd,Fg©€4ªé¦þÇc/<Uö‡ ºõaÏMõâó³~0ÜL#¤”m¯Þ†pפêx}Ó½ôÊ)$þ'5ñ ´o1‰û!ÖCAæZ/ÐP2•ÖžŒ5{|öALGü±½—AñLÅ+¿øìÖ ÞÐl…Ø[KP²d ¯hu‡Ps­Ù&¿œbušøfpȉ¡ç}9g¼æô1xVR ¯›§9øïô1®×Ä[žÙ°RànŠ»nØì–uKÄ%âÌ£÷ÄÅI SãnžÏr’zŠFFR½~þªèËz?TN¢ezŸ3A5qŠý!‰$ç-Ξ¤ pj€úÀœv»˜AZÿ9Ê[ƋŇ߭ߟ\ŽF7HDܼ{ Qnô€“+ni¯xÛZZ“O§æ‡§Ðo™älÄ3à'íð1×J0)[´åûÓîN­ß׉ÂWÑ»×Âö½× sMÅ—ݘ/æyO75O é–Ùˆí;»ß¤ã¬¼uŠ"ºˆö`SÕc;äw2·û‰Í…‰x$;þt74‰Š‹C…ëOQbáI|×´ú7ƒÜÇ)‰°ä­›4¦Þêë]– /_‘ø¤ÉC¿Ðç_ÚSR§†r]ˆ²zƒp‚p:[•Ó .¹R3 LP¼¥Ö„Äœz 8î~®¿¥¤c4å¼½²¦=Qé‹}ãÉèê£ù6j­n†h2ÁŸvRÇ#™Y`Z»!þ`vt!„—½%HzkIüi?¶D‚oëËIö!ì%n°ß>ÍñÆf ñáóUž9ãÉø+%·åÔæƒP.Wê’* ͨ áYÔÚÖ’XÝÓíÜï­ŠµRÊGñz ö¶_r"i)hÉ6ðݽâêU}¨1yPoëîL’T,ÛÈAÐ9.é$X ‚bj$Ó² = øÜAº§†š¿U˜nž…4%8ž÷%6 }̽sþ@Öß ?¹7ëcaSWud‡pŽæ]_wʹ«eÿëTäÇ.Ý/‰laÈ¥‰Š¢ß²]ÇI®Ö*qå[m¯¬ädTÁ…¯¹p•í$3{™SÛ¯ó ÒqÓC÷\¯àå8¯’Ÿ;Lwú®µtqAÍú¿ëÓ2ÎqÊÓ™›ùû:_ûI¹ÄéKÙZ|÷lã0¸-3e  …•Р®‚SèJ]Ò–l;`Öo ö¿ÍuÃÈíXÚxJظrÎ È“º:Ïåvé( ,M´»ž,¯ÝoPj’/gýQ˜>ÞÒJ_¢3_~p†ÊN¯¾3“˜Â˜ÚȱêÜÊ4 ×o±?÷Š‘nxz¦Å¬¾Š‰¥w/–2PøHéÒ럧ÀX»()†÷íŠ{d=” Q ë´iÿT®5×¹¦šñˆØ‹ˆH¥îªè, +wÜŸãåGŸ…@%ð,»lJk⦢³Ì ,1õûuNz.µg>Ö0a[2‡Û I׺!›… ¿Uz¯15°\roKŠ£Ê0UˆŸÿ/ŽÆ÷h endstream endobj 1019 0 obj << /Length1 1641 /Length2 7057 /Length3 0 /Length 7900 /Filter /FlateDecode >> stream xÚ­teX\Û²-®BpMãîÁ!¸»¼ih¤¦ñà nàÜÆ!¸'H‚ $ÁÝy$û³ï·ß}î=?ÖúÖ¬Q5ªjŽZÅD§­Ç%cãb Vt¹ø¸yÅšgkw= TKÖÅÉFÎj£:@A&&9‡¸@åp°Àlƒüü>QQQ&€œ‹« bg°è±qppþmùí°öùò鱃˜><ÁN.®Î`(üâ¨àö`€-Ä ÓÒ~¡¢©`UÒ4(¡`ØCÚÖN@CÝÁl[Àé¯ôÐ)äwkîÜ\2î ÀÝ ‚<„½A`×ß'À s†¸»?| î; ¸¸ 9yØü.àÁnëò§ W˜Ëƒ‡óö@¦íâwÁ ®pÀCVmyÅ¿ê„Ûá¿s»C`€‹íƒ§ ÈãwK°š„@Ýp°7üw.k0ÀâîêôyÈý@æ ƒü)Ãõû»N l„Ù8ÝÝh¸ßÎß}þK÷@WW'Ÿ?Ñ.¼þ]îv²åÆáãÈ ‚?䶃@qx~Œ ÔÖÀÇû—ÝÆÃõ_˜'öç‚XÏ ÛC@¨“Àl‹Ã£éH `ýŸ©ÌýŸù? ñDàÿˆ¼ÿ;qÿ©Ñù‰ÿ·ÿó?©=œœ4Îð×¢ká0ˆ7À”—›——ððþ×ó÷Éü4 P‹ÍïÒƒ¡63÷oÃoäƒ=Hýg ‰û œ¨Bß.b™é1®Aƒ†H³Ñ±A¢sÉÉR²C Å뫾”Áu H*×;nÑð^“ŠÖøÝžîµ…¤Øy³Ñ;=o…šÛMµÞôÔ,üýœƒJ|GÂì;üò¬ê<¶z¡ýa&‡ëb¡ÅÆ¥EkŒµ$æŠ×fÜDæÜŠ'h±[+¿Z0 Efö;õÆH¼ßtßÅʧ)s¤eƒ ™atÖDY¥SrΫºÏ?”­Ô®Š"Ðï ;ÂË|+Mq¹Æmù¦~´ý{A`ñÛ7sϦ”¥…—\§ð"gæËêM–£íúž½Ü-}?´¤©2eòMý(f,©‚¦ÆÙìퟪ_û">ùÀj®Ð å‹p,h÷¯–á³Õѽ2OQ2&Tz×T…·g¥„¦‰>š;cäpoúõJáеT¬¯ù±çÙ¾ˆÍ¢Õ縴·"ú§º ¿ð~u,5Å :À·¼¾ %¥x‘ž¿eß¾nóðy³í?ÉŒ©á7ÿ¸-BÙ¢÷¼Vð–£-4Y‹uÞrUîH’K•g®”;?ÕìjCƒ?€Oåº-JŠ`øù1÷'¾MròÍV\9¡ÓøèÈz._^t¾ÃiÄœ7;¢Ígª Ö³}ù$»Ée½sêý˜–q7Ÿë@ߨ×놎uê×ÀîZ•|‡Ö_´Æ}ª•‹A†ÁgÕÕø2®‘¨F=&â”Ø/ß1n•~ŽY¡Ù¢ä­lÎÈÐ’µz{&¿(ÅSòüðD…Éü©Û]âð£—ný[s.W7‚ ù;ÜüŽÌ0;´ÉzñÐý —œºÏŸÜ™wÐýÈC—n°ÍÆñQÖÞ|IDZn†ÍI­²D}\\1›¾xÎ~Áþ¦,àéãÀÕ,½}ÏÂÞ˜^õ­­QCŠr¸ •&Cñ$ýúæ%ºìÖ‰ ’O°©Å°Gµ‡ËSäðÞÑžt –£Gû’¿€1@.¬°oó~`ñË„ahÑžF`…ºpS™``*.¾¢n„”7ŒüÌs–`Æ7 ø°Û}x(“wÛœµ8¦÷*Åÿ'ÝØç"ÆAM qâ+ì}HH=…iɾƒÆ³Ú°.Ф DŒÌrì•îr²ÙS*‚'ºÀ<÷'ã¦Rb4gæ³´‰ÔB9â´'Ò©JÚÏü¯3M®¤(¢R¾Mø{Þ¢kOI•C©µ µ\—JE‘ϼ™lïõƒ&¶ÌïÀ?ønô˜fˆ[Ú[oª<ü~c|¡oD†3°[ÐÙÏa!Êå»|Ëåæ®&l1¥rIöÂR?ÌÞNġهJ¾Y ÿ¼”ô³5÷êʦdàî ÅûºŠ¸ö%?Ê-Ä4qx•CT7QµÖêK*.­gM‚z %Ï€öøÝ¶|oÞ|©#v~‹”ö‹u̦kÖú,M«6µá8å×…¼ë¸²’ÊbL}9GÄ4ò„ X 6רÀ¥W¬šà Yuz-:©L䨡–­M‰¹ù‰2{Dˆ37 ™üÜí;åÈ=KX å×B!Á #fãL´Áùqsý/¾{ÜÖ£·Œ§Ö¯“–eÒ¿z—Ãø9Êͦá§Iý˵ã É—äàw/åq¬b$›1Ù“Æeûp¶ãs /TsFÊé§ÕjMIEøŒ—LÇ¥óMG‘Œ2hÃUp¸ååâQ›§®{pðÔ&'{‚ô6‹TîLj¨Ôµ¾$0ω¢·Çôôh¦(áHÃnø.²ú¡ó/ЯC“c(î”ÌG]=’Â`ß0Kj"ð-q®êUâ׿Òõ;õ€YžÈW߬”{H8u,⹂*ë3Í k¸C°ªjU•îRhwÙ­좳$VË¢ãl2áL× O™3Qʦ5€•ów’”’gØ …þùg˜Õ1ÓÙ¥_5—±XI)IbÑÝ^„um"V{ƒ”­âΧ¡XæŽ:·Ï«ã© †[ÕzJIç÷B›ÅưìÊ ¯¾>·Y‘*èzî|Ô’¾ø8–õ]ĺWs!È=’á²MÌEŽÄmÒÞ2ŠºR‹rT‡µRŠ¢Xö›æMaãY Œ½è‡-\ú¥œf¸²Qçî¼4þÕ"xľö­Èþ~nΩ_÷¼ÎÆPýf-I§ñ¦gÈZc !yüÒ„™byШ±t àÆ§æŽ7Ëå@ÖgõÖÕTRcâ&ôk‹lƒn:>8P…½®I¥ÐÖ,H™jà„ó1®¸ÊàFãGzí°º`ÑúÛà§K5­ê+k„÷… Ý%÷ÜFØ>^Êû‡ÆÁ° YÅí]ïÀæß©¬ÆsR¼,±j°²^ÇÜø? \ÀºŠ0¶ƒkDЮ‘òZ²!uIå×e¹ÕÑ£4]ËÓz6¯òñI†]Òç³iòËåÞ:¶õrÊ.{½hê?O·n\õ=úÒ;!ŠÓìÆÞ'»k¡ø>sC£3e®ðu !1Ùs`úZ²ò#=ºÌ—–·Ê\{k/[Ê*žg' wÈeËP*:œèÁî^.9OfO«8˜ü,<7üŽÐN8§ìÛK ™õÌ®{—'ÌËàõ¯"ª•Ê^‚}ÔÇG‹Ò51&Œ1e7æª'õ÷6ý…â°Žò4»Û±ð'~od÷~”ç5Ö@ÿŽ’ ½m™åú€s :Cé/q®~É#òÎÛµÀƒ‘™Ž}Õ°HóE?´‚â²»GvÖHÀ®Æëw·æÜHúlŸ…+ÕR—’ƒo| fiƒ.²¢íެÆ^^²-4Ý I³qBu]^ i+ó l\•~ñ³«×”\’”靈¯6Û˜»çÕ ¢¸3Oçhì}Ï>äoŠÚóÊø~ØxÄÁe}5vlµ2B ËN-^.¤±WÄüh­a ¦÷²¢¤N8çFïíaŠ> 0t.ù±'AÁ1Øñ-·½¼ nTiÉæ|«ÃÔülá˜HZ>=›ŽOñž½ÒbÆÒuH8˜qWÛæßKS4È3ãvò–øÍp(8gã(¦6“XY¶{ÙwhÌÔü|VLÔ{55DZ¿¼©‹¦ãRFH ÜÚ°ÏROzíÖc¿Ìck-楊ýÄ•+|ë0Ÿ]¡yL—«çÊ;–»ÄÈ.S8¯¡¨ñZîi4-Š0UP‚K·„ ¸û­o.ÛÌCM½¬Õ˜|öðë'm,Ëê;EÅ“<éÇ\qD ¨’Àá÷MX³JüÉ2ÆQŽÌšnÑÓ¸Ñ.^¸éó‡2|9„è{5·ózèµ´Eµî.#ð:¾a¥¿(z®(uð*O@ZÑL¥3ÿôFÚÞ•u×Ñö±jmÇoèøØ^±mÖü‘Á§o6çÒo>ž‡(öÆm„`mI%ê6KѪ/«ñÕâ»7üi'nÙñÍcë;![? ýÊêÀ]°ÜÌóM3û´lçÂT<ï"¾’z¯ûù|æµ1|ðX÷ÆÎ«‚ytË ì¤ÞçÑîú™Õr÷”“Á8Ö§¤5ØâY÷‡þþxoõ%µ%Þœ'³»Æà\ª)éàµ$¥u¨ÌÏOgfµÊfå¥òSé2aKåYÞ}*Müuƒsƒ©$†1x“J ¢ð¦Ð|ñ3×Éxàà±ÏÆ(³eï£,›OìŸ x܇èýˆ=9C?ºÝ6² ¾Ò?5q øÁx­R^,©Mœ"p·žÈW«?žÞ÷]KàÔC—pûDÓ{Õ«o…Y¸@Æòø79β ¾¶ª{7~!èŸ ¯ŠÐ"ÙÛo;ÈvO?° ²l¬±ûz–t%.·(…™þ@Ž;¡6— Óù^·{'E¼ëWj’ËËÃÚ ð6’(‰1ÀUØ0SWnäøS}ƒ–˽¡ýµ¦#QñdfßbWšî¹Ôù.œyñÅø!eÌDWÊl||‰ö6ï¹ësµ%ÒÕûtª­Qõqš3q(>Š…6·^Éë>ˆÌIû³Úbqú—fyÍÊ2÷5Þ£úÎG{E ò»¨© "˃̪U¾ýHðK3E‚MÛžeRÜq(?~ÊÙAW¿pº³ƒj@Gîñ…‹ó nV{» °,¶¡Ýðel–H}ó5Ø~»@™ ¯àR«¶¦î#–Vfòö|¾qÑŠ®^Ž+ø»GÂR% W"-‚¹¶~ôþùž‚jKBëT®J¬éý—È (óEGÝÂòM¤µNš°#uw¾ï+žBvˆcÏžR@u¿ ú·ð/Ú'çÇ ¸ý¹ÑʼܦÅY=!çM®¢Ü,ñí¹l;} xÄ.ôq–Çù×Y‰ˆZ˜©qa5Ò¦è*kv^‚TÕ.Ý(¾|`“`€Ìµß—䢜3úò”†þèX2H2DïPç‰\‡Òé:Û=ýakt‚“â{–°JNörqI7®©èYQö8“ ³\7‡ÂQû²ºH q¹žB_½7Š0Ù‡úg„SظN?;½‡±S­›¥‘ó8NkGã"æ±zÚsÚÄpk{GkÔ·ÏH¢ï‹Œ>,/ ºEÚm©jµ£yäÓÈÚ3éÈ9 `}Ž…‹½e¦ö*00ÐYU¼‹S ¯ºB!ÛÄOáa6}L‡ óU‰‰ºŒo6%ôófXd2fSÐÓÄ6|š§u^A)Àøs}žŒðD™„#׬Î~Ô—~]«.šöÕ)¹ ?ù‘šžb5Èw¶ÞÈ€A{­$»7÷`ÕW•ÅÆÚøtBÑȃj‘Ï»A`ë@’|¶™àdÎTBŸ"¿W>ýÚëS qÓÕ ÖÏñ3á¡Yцl „zÔs‘é‚#ÇŽîÆ?žÅꎶ|Ú œtë½Jc#iœY 0Ï‘«Ìy«ù‹¡!$:§úÄOZp…kí-Zÿ6Ήýzô gV >—x˜(¹Å2D.ó×­å<é„ü*•©~2ç1/Ÿ ˜kxŒÚJâè}&Lÿþ¢CÛ”ö;©U³5…O=oó‡ݰÎÙ‚ºêžPŠÝŒˆÙ.ì5‚õí„ãew~ü£˜%²ˆp4{‘§• ŒGºÈZ¥ƒ±W'̑޶¾Üõ/üØØ&Î#®$ìÃÛë r>Xæ»}f²m ëþmí½Ïö3Lr½3Õ9?¿¥';hº‹¨t‘µž®0 l¹öà)bP(´'®ý–ýeA¶ƒÐS}&—K]ò ';¤îd@€ÑãÞ€üŸ5ºQqUÕo!Îø,óçTÖ©¿r´]냞‡<1Må$~\‚›q\áuü!¡ƒf›‰¶Ã½åÒÜRàÏ}¢gÃÈD µÁÞ@O–†9‚7S<ù}§—î4žuÅHÿTDÿâ endstream endobj 1021 0 obj << /Length1 1144 /Length2 12441 /Length3 0 /Length 13215 /Filter /FlateDecode >> stream xÚu·eX]A¶-Š»tãîîîî è6¶qw·àîÁ=@p×àîî®Á›î¾çô;}î[ëGU1kZú¾µ(IUÔEÍÀ&@)°3#+ @ dkââ¤nl§À¨´pü9‘()5@Î6ÀÿEÿ%ÄÆÎ °„±ó_^ÃÒ hì`c°²ð±ððq²þ³°ÿ—!Ø‘ â²{T€Î@GÝ_Jlêb ´sVw±··ÍÔ€N`GS Àüofÿ;*@lïá²°tÐhªiÓÒÓ3üaååå˜xü:,ìT'®@°ý?"ýu! ´:þMÚì¶*æÆ’f ç”  ±tv¶çcf¶77þŘœÌ™ì€ÎÌ´•´3ÛþÃÒ?z&ršþ-ʃù?ûfmv³óú_°9ÈÎìŸ%™¹Ø3kÚ\€²ÿ×ø/„ôoÌè àdacáea@wSKæ„Ôð°þ“dýllgæãe¶˜Û8}@æÀ¿’—“±+àìèôñúÿÿs…ÄÊ 0™:L€áßÞÿÂ@ó­Aî=&VË?Þÿžü=P3°Ç¿Í•Œmf5Mi% Múÿ¬ý¿­ÄÄÀ]2²rsÙx8ÿ*å¯G^Nöÿô¨b ú¿±ü{³¬9Àû¯Äÿvì¿’w::ýU!€æŸ‚¥üOOJ`g)@óo‘è³p²üÕÇßõÿ)žÿÁÿ?%ôŸ1¤\llþY?Í¿ ü­Ü  øGí6ÆŽÿËÜØdãñÿØðŸ†ÚÀéüÿǬ³± ÈTÔÎÂæ¿Ûr’¹ÍT@Φ–ÿÆ¿pM;³Þ8  Ø ô; `dådýNÃdjmtrú«¾R@;³ÿ)ig 6ÙYÔÿêÏØÑì¿Ц.ŽŽÛóÏú»÷¿Öæ ¿ î@S¤å°)°U]pûc(ãþ{—æý‡ ÒwÈ]&¨^%<ë2Žw<ÉÙ*£–BÕzЊСq’߹ݬyÅ:˜à1±B0¡d"ðϘ~ (ñ¡\!ÐLýaéÃÆKÍ=÷ø-sIZq¯K)$>Ž© þìGôøõðÈAŽ€¸¢  Qùh–ç9ðBYÆÆW•nn¸S‚Å*0,Y®«qú‰Zî+rãÙVU¦ÑüB¿*§ß\¨4’sÝ• n7_çxÛ³e‡¼H'd7CQdõá óòûÖ0Ý ^b<Ñ: Þd§‚-ÿ²)AÆ|~Ç4Í0 Ï£¨Ñ©ÉO7²È ϲœ1„*¡øgb « ¸ñÄ[Vݰ§ K:¶•ÊW´Pà²Þ ä×Y—€@r’Ct8©~ùíú,ƒJÅ}¿×"þîk/X¡°}ƒæÇ‡Œô¢’ÝB}¥(b¥[Œ‘D1ŠØ£ÅÆd,Ç…õPý鲃‡: î>¤Éî^Â¥¯”êâ\ß±\@oøI­4˜ÊŒžl~œpALø£%D =ƘZÛ,â{!ôjžŒôñüNÔãK„úFxƒŸFÉüºÀ?/:%ŸZ ¢ðg"Çá{µP¯—M…velx?r?à9]DÔ pmÆgù;WÌv#¹[ÏR“4A¥1%h-êÚ„·ÍN—_¶Baö ë(ýêv"%t÷u=ðD–å\6ÂT÷x £†õè3pë“)!éØñ-¸Fþ‚h‘‹§˜CÌÕhh1ð_¿`ü Å·Ê‹¨/zóî®AA*†<BˆØ‰º=duéÓå³àþ¹ †ÅÐJvz»€ÍÚ”>Ú,̃ÿ5Á©…3ûó¯–Ú hÏz7OÞ‹+ÕK›–&ÁÃ(¦œ°†ÔÃà£w¥µÎv˜€Y+G>Ô½Ò¶sz‹ÉX쪭2G€\±Ô®ˆ@*!È^Ôäææ¾ez¶ò®š"¶Ùþrzg3¶[[‹/‚Ÿ¢C°7ÓyÕ>6¥WÒ©¬[‹ü­~ ›Ü0feRGÃó´jYYÄšÐ6ùjYBPô!äÜOf~Ì8vªßÚŠÛg·LŸž-© Çy!ª7'²KgUFTø²TPÄ#t¯!‘‘ðJß^ b=†S[Z/MV”á'oˆO ²qͯ]ôZaìßÞfòKÈÆhjÙÛÉv`tù–ûª„œºâÈ.p K ˆ¼GêB³!Vø]êk±¶ü;2VãëÙO­ â嬋kU¤ªF¡%;Ç s ŒÔ¿+O¼Gár¦®jVË9( #“*fàÚªáÙXÏ‹‹<÷ÖÈˉz‰–cw|¨°¿Û±bê÷jÉ7ÃZ o/eÕ#¾X¼ ’ ÚÌ9 ´–åèF1V{€Ú¹ ÂNch¶M_'E-øÂêý.m/r¬}ׂ𶢓UR}o§i¾øüZlU52Û —îtÐé"4JÄ¥¦BÕ>ŸLˆ_â”O{ô¢E‚|oøšÎʨLÒgØÚuî­<{a7º"íï±;>‹ú¾ÅëÄXÀƒˆ›²A…!ÿWÍKŸIªÎ`šÜm(‡ûñ±CľqÛ#'`Ä­MÖùø37Š˜7òÀ‚A^¥YŠ] é½mæRX ´"È…×™ÇýŒ{É~_EùÖùô#'¡jfËÏNofÍo¹^0€\*ñ˜ÀÄð$Pš¹æZÌ*ÔÙ•æ|Òs™µò EQäOàþ"LŸhž.ª3 ;f‘fïËý’ëV~ÂHs#ãA`á\½ª&œ‡ÎÒ¨ ],;ÇtŒÄaMÕâ±-ÞÌž«J»Ø›î¼ aƒŠ-ÚNº’¹¸.}]•p³Ä+ÝÞ’3›·©в³´7P´¯6âSéðhä^Q쎫íà] gY³Tc üH"Ù¡Eì¿ gü² Z•k~t-²M…/KöÄ9>7,Õ‰&*çÝLìm}Ãb$,&*`è³EE½¾á9µ>ÝÌ$ÃUïfKLÊ©Ëô² ­ìaìÿà ‹ÞD}{}ËV 3m¤é à ؚßc =øêŒöæHÙcï&ôûÞ^~YªÌøÉ¾Ø¬tW^Û§m3N¸d·èlŸc“ÎÕ¯so_>n¼øG´q2ˆ_ÿk3Aµ1÷¢ zD²´Öì‚oõAF ¦n{”ù;•`±]êx/ýÔíÓ]v<qh¬î,3ú$“û,ûyìõÓ5/ÃcK(†€feL·µ×³wÎøƒ¸‡{@”BL3ç”®Äõî—äÆž z ¿§K+tŽLÁþÑd"ìVz´À™§FÍá 0w´Y•7—Ó#²b›uü9bæÜ9D1Wÿ÷ê©P<»´ì‰ÒE³¼á¾u‰0LCÓú&CÒÁñΞÊÒ}Ÿüš¢J&G6†ä6’!TÜGµøºÞüz@m^‘î®3¼*^§ )1í0…5—wakÝ3ý9eû½{d¡Ã ís'-dIëZæqT¤ ÖSÚ»lcŽâVA©ñ¬ô٦ߧG~j›æ0öà‘Y|h;•dX‚5¸¡ ß?0C[a*lÛº—®´Q–vZQŸCJ+›˜ˆè†ÊźUW¥tåovû­F¡ßD¾íH«¾j‡W¥•NÓNÊÐO8µ_iϰ˜ÎPT›Û ò%sä`Ø9ya•ƒ#7ç<)>²×!M瘌ïÊÀy¤ÉËñ‹Èr¨º¨#õuqI“üœY•”Î_ïž 1*£¼ÆèË0–L¥…w®4Ì•u¨ëž>î½1н/ìj_}_$Í!# ªxêiòïÛ´”ºlUXË$jg~Ó‡ºLÁ²u^êÓˆ ©æõÜ@…·¼\9ó2Š'|!‚)²»É…}]ÜŽ€–¸Âú£ë,w­u 7µi…lë{@®“säÇ黜ö}ªkcÔÚš™Ü Hµ²eS±1–ˆ—bYšg’º½aNKè%k ¬_Æ&¤#j]Ü¿€ ¯úúì/=ãT '“÷;Op“Z™#»çj¼C'»9À¡ø&íFo`%²;‘3)s¿þa¨Þ-zöOÆà¸B‚)cTÚBUþ{¦¬Ü6J{6†»kÏ#ú§ç‚º¹Úq—¨—ìç[ãÍI |š “+ÃMõX=ã ‚Ünú__‘KÉܵ©…'¶“x\›×¾Ü·­º…ÚV—«O/!Mdñ‡ T  V9å §Â\%[Xœš$Ï,Ð)+oa©§´ÁÖ¶ÍŠ—Sƒ×Ï$u˜ª¿VV+°U­~û\x´tG(+iJ~Äç{`Þ£n1!ÞŸ/:3$uÁà&ÈJÅ7jŽf…§[Qï‰ë-åNá3’ šMÉLph!wAöï¶qOJCYÕöA\Çw•Ã3ËŸä£Ý‡¾~R’Œ³ “¾?õÙ"Dyú~Evk ™¢šà*Zn±¯”csTåÇü…‹迴ɲ4BãIƒâð h›GÙ’í6Y®’ÛáHN]R‚ÀìKc{åB’a-kr¦:\ǘéxÄײ2b𬀠S[ÞOê]}j>o>ÚÑŽï™­]ýg{mâ´üÈûn£ýߦ}d‘þð1›¤ô]ɤ¸¼Ë[‚KÆ)+¨såWèp­ðp:0þ¬ˆ¦„!=í¾Þz¿•ŠEñ@aYþuaZø5Á.òüêãÔg ™îª Jh46Ê<ôÀ …»‘QàQÝûuåG`¬’?jåÞaÓ*é±)kÔÙÝàóÏôM›[Ì–=/[òÁùˆ²m&(¸Dó¡Œç$ Á C{Y†ñ IYoá¥ÊÚËËäžy…7•c-¢ƒlNüï¹T¹cE'ùáóå³´U>Xj[ýƒ R/Î1„N†.»£Ôb³Âþ_LšT8!ŠÄ.ž”s*aµ9"±n11oƒª(l>JCÂåù\99v/é"¤Jƒà{µHôb¹¸Æ¶òŸ`Så¹Ñ=oÔlÌ×.dÕŠ+6+4ÜcÝí¦›ŒËÆ~RxãÛ ¾°m!ôF‚„ø“³úñÝÞ¦xŸï×'ùö=UŒ=´œ^ìž[žgͨÎBæ-hm>èÔ Œ÷¨¥é«„lØ}LÅ/A“JLÝ&ë¹oÚr®Ó”¡Õ‘ íÑ8_–I­;ü*ò¢·h¹ZnÒôÓ!^`£ÍËWyƒqȆ,§Š]uaM~V[ïP¥ak—WT°4P‡È£ ¦í©º÷¥4±€[ß‚.…8‚ y—œäR †ÉøyðpBˆ´ 2iAß ü]u"AèâåRè²°°¤) W{ßcÕ´ÉF¾…Ô…,e××ìÒå7Ò$Ũém$µkÇs‚ Ï]¦}­™Á9ë†&(¾’_Ä ·_ Çø©Iõ6ÅÔúÀ±ärR $‘&æY²Ý‹2›½×Sß”GcC[ñ‹âÉ»yð’;Hìc²RŒu¼cЧÑO[[ùó2øR¥_,¿]Fž·IÝ÷(ÙJ $& ¸Xãë;ƒÅà€7¡e°Žu²Kí ]KIŒ*ú™û;”ܲ3ª˜èBã9AͶ@§€(ÑOÄ(ª±ClÚ‘‹æ¿ø~÷,–“â@ß¡¯övü¦ñÜÎQ%àÛ$ˬ1Y³×õ*.ë|!ËÊüñ[Øyô'µLžgSmð-¦(Ï[‰S _…æÌhç8캉j«ÕNZUµÝ,è,$.2^ލAº§‰ñGÆFŸ@ECŸÝéµ|“ 57šND -¼Fþ´O ŽŠoí ªhøqYUœ—ªÑ‹ü²‚+{tZ)!À´PÅóÛµRn¥^oödh˜`„ì”Ù“'ɯÜo–÷¸už\“ŸŸ}ñ³Oß×€\X5 >9ó•Õíø,ƒáa؆è/,sù™tÆÇ­iÈO•hpeÝH1– »—ÓžIFï|îsÜæS°¶xMÎǧyP¾Ý8A¬8.õ¿S|¶œÝ3^¼¶pŒ­@ƒÒö{•¦!ç»»UhÞóÞÉóþ¿öº²Â ®°@J©öüÓ\.ÔÍ'7®¬®EÜuÃìzeÅud_( 7+Ol ߨdÃâÝœ³V½·4P¶¹‹‡d‰ì×TÕ á42¸´Ù'™¡—h ª‹¹׌xð â33ãñUþxlô\0IcÐàGÎ)Ò`TeÈÝ# ]´­ÞÐÙ.rÙŽjµp”ÇWÅN‘©3a=–ÈÙÄv.ÃccmXŒzÇ "!X¬°c [éD`q>L~6Êga“1}š ‰,œˆnñ}§^[ß\=Õ n’41EGLdnªoUVl%gOX8Êä©E5äÙ`øà0½q&¾Pµ Dz+{ƒjùÇò¬µ±ëO@&±œ«z¼ŒI{íÿ ïTP'¹7WÆc›=Û;~älS”cb4k—?Rèf4®w`² :SÒò䉬Dï_kK´nüÝ¡\ÅÛmâ ¢®JúG¯µ–0Å_0¯Z¢•„ò( +YsZ8h” âðÉáøè7+¿ÆÛç)|‚Èäd|îÄî”Åã4ïvy·(Ý1òÄf¾÷a­MAiÜ„|“Œ+âN8‘ÂÔ!ø¾Èœ’'ÝrÜ“{^q®ûÝÎ|vž!Ýð uÑõ*/‰œ°9;±-ö„=•¶z¯íò|ž|•ɲ!*tޏOàa;ooê¹ðÜ[g¬0“µ ðL©·ÿqx–'½¼GR¿ -—õ.Ü[ò¨!%þt*õm¤è:RgÓ¯D€º6õíü¶ó‹ú¨öÓ­&ªŽëQùDâ¯bÄ¡··Uå¤ù¡+˜A‡§ó¤a¨b½»Î‰³{Ö`¨LÁ޼*î.^ŒguéI%¬eÅmBŒ{À4æV¸r…„ÓàsGO$[x€>%²”û´öÖ2ÎL€FVú"sêãvQcBFJŠä9þ—{¾è' çZ×6yaœDu’Ö£ <¬¯ú]ãœòtÂ(dŸê¸Ê‰yb ^fÝI@–k¨ë¾ö„Y8CUŸ&åt½ZCó85¯,›«ÙB²Þ6 VÝ*«fß?[ p ÷­2ûµåX-®ä[}É¿=IÔ©ïlY+” |ȈPó3Y0? Ê:q _üã”–$(]Þ¨{·•o¥®.ú²°ÔÇô‘¿;Ƙm¡•üŠsòÛ©)n®m{—ÿØPD°çi#ýú~¾XKo§hÁþDÿ`R˜Âo0¸*Â#‹…[þç¸qíú¡vž«ò¿œˆ÷žKäå¢e‹ ý—QÓ~ ñg¨ 2+…ÿ¾ ÜÙ$]"S(˜Çznhs%:‘gŽÆÑŒ!ÝîfÙ °1›ŒŠ¹›=JKv}WΓLzjç­= Fž¤æ: ¾ÇÈ"ÁwY=Cu fªÀþM¨Pœk²¦ÅyIuf×YÖqñ“¶$Žÿžçу`ïúÖB#‹o#ä5 ê­\jÑ¡&ÌXÕÝ”YñQ¸I~•ÇðA;C¡Ñk4V98Ý*«ñ¯þš½â’‚cÎ<ÕÖ´X…ö;R·"#Ž‹Y‚ƒò"†bz:çÏ¥£ P‰DZµžƒ¸WÌóN,ûîõÚÞAmTÙ¾Ìte³°tÈDuHÚfºÌdà›cº§äÉ×$žTÇX•É7lø‰_b»o¦Î²¤ºÚª"OðB^²z'PB9Œ/Wƒ÷ˆûŽ.,¯´ë €Òå ¡ñZÛpÊΛŽ~ðSHëܹ2bèÃVŸ Z@Xg|@­–2j˜:á×dÜY°ä0+Žþëaíµ,êå˜#5ÚujEËßÈÉmÚrBR‹G„ñŒÆ*Ĩ"F$ MŒ}.@ÃrÈœ ‡D¸¥,ææèJí|~ošèß"²¥sØÍÅ 0ljôz¹](ÝïÀ“—ËP«š›¶ok£'¿µ&†ân¿óç•[õ‰º]Þ©'¡ãr ѪýdmLÝz‚“–Ï¥ òIŠ*ã™—©®ÛG‰ÇÈ ùC6¢ €kE#2ò˜&%}¼kø¦’@ݯÚÖ¼öŒÞTrD\êw!ÖËRTy:wÕ $Žʘ-n-ùø¦EC`:=Ôt)fFÒ¿K‡i!/ W@z²ƒË¡(|I¯ÈÝmyèU–?£éÅx†þtbÌáje]óG‘ gyèa.Uw+ Žy£¢›Öbü‰ÐÔ/ ZXñÍÏM¾1÷ä¬HÛz³+ðsñ¶ÙêŽ=ÂÌrÀ…'‚&ÞúÓg?fr˜×ùðôüÉÞ¢™Èæö>Ýæ•2'ÅgáR0¦Õ¥ x¯M>v]µÜMmËt`ÿ)X¡É^ ‹Sv§”îžØ­NbR&.íwóÐaû™[êBòFR1c\ΞípW*Øœ·Í¬ÿ)§ûáîÁÔþ) ¥µV%ýÖó}ÉÌqóÓ>sA qp†ü¥+ò¡ìv”‹Oö[_Ö.†î¥”\|»žég uRäÆÔ—``½U3´GÔ6 #ª|Ñ/߆†‚c+ðºêž…Ó'n}†)Ù]çxK<©1î5_¨@h£E‰|Óu3D†©˜…'ÎOÃZ«Í–Cø©ËCî’wI 2“ô§s‚¯ÞçmûÕuæ%¬Nò¥øš&®S•%tè÷ý83'O«_Žtˆ4x4–öÝ Dú™„Èb˜…`—ÆíšI.uìY±¼ü­Ýj\ÓšÞ­ÜþÉCûª£r­AÂîùÅQJûK ‘å˜õáfÒjH°Ë匬Tr½kµÂjBÅOÑpßè†×ÒQ<?²9â(à§^n1¶ƒ¼2Ž÷•`¹‡/ã¹fCGq;¡dcmŠ_ÀR PýN´"J·p´eõ¥2$ö}ñpt¢ñ”šöttùèG1(õ¡²ŠÓ2—ÔÈ) ¼c®„\î|ÃÂý$WìÉvM›°ûºðÖ/?˜§;¯G²‚zsñQú¢¿ÑÔ¨W©Œ•FÀ{~´m…çÏY5žXÉïx¡LôÒqr§§Ê÷_‡Ìß– «‹œ”¦3YºÎ”°„ÅÊp}2L^7ñP•ôŸ!lõÖO©9`Ö„%ÝÓN˜|Mñ&íTuÏØ“ ènñ³xrgÁ?V \t¾ë¤K,{PÇÉ9’Áx·òè^š‘¢tƒ¼¼Zþe#„ÍŸç¶ÃÆÀ<œ ³Ù}Þ;ûUžAȱrþj²u×6â¸È1©Å­¼>§œ=¶)ì[æbO ¾S&û&:Ø3Gx²Š]{éÔuìî¬õ…ÂÈuŠê^ pË52<7í°ÕVð`á{ÌÇÉ[GTÄgi–ÁÒ~qw\«Éï¶²¾ä³ÅL(¡º\º U^\Ø5¨Oð]±#çDïé(­ dõdN‡{êG_‰ÃWçú)×\[1LÏVÝ¿Sû÷¡h¹‹1®=‚õjD–^=9ºo7÷UL×mr®™%—d­È8ÕÈÂ>nìA7#YÿƯQ)ðÓªç6q 4jwöF(n/*—öц^ß½ðôê?wϬ[°Ç=#&Rä÷>1 $ºÓÓïÝh‘q°ý3|p"2‡§œlí\>LeÔÔ¦Ù0ðµÂ~”-9fEÿ•¢nå Û¯HáÆ L\ŠÔ‰‹ÛJ_ðÏBÕwŸÏóuÄn­†\b/yµÅ'û¸'\j4ˆ—dÅ;p š+Ï¡ó]­»vœÚ UL;iXJ¸ŸÓ*L! 1X))ɹD-"úA}q­"pjßÌu[ ;«ŽÐ«æ©e¤@£LEg9ÝÙµÍÙRôäkÀÕ •9à–öÆ7ý÷{÷ÉÆóóèßm›Þ(ÆJkQ½£Þ-”¹lô„­yÈ’zuTDˆëý¸÷eÚî7~atü “ûp©ºûŸ%&Ž_àBòû=ŸöKA໢Ÿ@Z¬/\Î¥¨¡fÔáKrÆ'fãßcçßYok©2# ÎiŠXO›¾²èÚÏšTÁgÍÝDÃ::Û 1_àšŸJ§þ‰ÛÂqiÿ†‹Ù‚äµxI·¦3Ðmw©]µ÷X?)ܶ˺Ûr™lɘàŠÌKºñÇügä9Ì£Å/Ø^Ê1´\½FäÊ<˲;Ës­wP³ãøN¯8ãëEÖÅoŒÙ„•dfOÜåÖ¾yÕäs¼FA®q³7åëÑ8fõÛbfP"ÄþÃïðc˜ò ëbš‰ÔÈ64ã·,(îiÉÏ„šÕªæ4¸Êqv dbÓtŒ*Ùå`á$=Üð‘¡G´íÔùylÒAm*ú¦Ú^™#»Õ›ÛˆÒ†rÛZ½w³N°ºòˆærãYm"ß|2ªt~ôÜ5Wã÷¾X½E'Ü‚ƒ%# |~}[ö˜:·½XVi;ñªì€Ò¹cÉXƒMÚÃi'˜è6:Æ<®:ÏÖ›HÊŒ‹03Á{cÕžoU›w˜+gv/§Á¡Þ&ÖœN ÷BÃyÛdkxÚý¹XÅw¥\è:d1…yš51Ò·ï B j¬p$A²hmÚX{L¨éñ‡±Ö–¢›r¸š{nèí÷_ µD)ðâ!Q¼ó Å²~%=ø“C)ÇéæJû½›|v›r§à¤4/ÖW››ÌŽ[̅ĤHé’ϱíK€õ>ì†Æ<)‘ yBt'„WW!stD«™Š@Ž/?²„…Îu.o¬ôå_ M T:ôŒ”˜0Y_·ímøS"Õx¾üÿ&8L¡Â HãœS$Gæå\—’µPM*¸á¶R!'pRùÙ廼Âþm‰GŽ7Ü@Ñ!ûžz¾SÁj…NM¢+fÛ°ñY yà aIŒx€"eíÖȲûÇg7d²Y´{Þl©#FrPWŒ\~J€¼fZ-ˆµ|x@½ê]3;žoE ÿÜê¹^õÇvF(œ^ já=ÉX컉£4N•Úøº6±ŸhþÔwl}çNF^dTYD!C°–¶‚®Áôñý÷j{Žù¾ïÜà™ÈÛQ³%îö”“û ’ K•¹€Oˆ®ÇÎ}ä å–ǰÙh—=e¸=¼ìBZˆN¡·ƒ¢iMïkÛ)ƒÚŒ‹Ýl+¶o;ÙL™I,K”ˆ%\0L],M? B£õ¼J ¬*©tRp”AšLN„uô:‹ûrl¿Ÿp‘ÏûÏ*öW9àí—þÁé¥  1¼——1d"¤u¼ƒ/ Ê›ñSØ/’!ƒƒy¤ õén¹(絬ñ?ãÂŒÆgSVæÂ;47Z[yå)újB¼© ±g$i£6™!ÿÒ€æF17=‡öì~uÖƒÒ-ØùÔJ²Cj®Çò„— mqîŽ-¯¿5T4½D¿eª‘Ò¦r†³É“q1FþÊ¥Ëdb•SòB6åU+JEXNß—µ´/Ìg‹’\(R×І¹ÔxakÔV«Ãlãä[PŸÓü*ÂíýtLœÌî¹®Ã+ žƒï×ù*¶tÔ„/ên“s®;  WØó!‹2à.ùý[í´A®•$B’/0‹­ ^»5S+Šñ5d–ž»ÜŒÅš¥îÄN­ÁYúYÙ3Kd,þ(‰8{O-PJ4“Pm)¥7ù'–¨ÜµàÍ»ýÛ¶‚ÜQ§Ï…e°ktÅŒÍæ‚õïÌSD1©_Ry‘½½ñÜÇ«xËþZÔuߥ¯:'œ³üp‘10K»×Qµ ƒ!{¿@¥õ¡CÙþŽ‘9ÓÄZáŽH­ñÈ·hNµÞÎæÕS¾àVc±ûó¸|$m¿2» ¤â†>/ÇÍ}F]tag­éàbƒ`uŒÇ™ÃpÈl±wÀº­[”@Ú.k–Ð&üó° áŽ$Ø·àO8U½¹±=A_Ýùtûä üôsbõ‘½y—·Ûͧï™N0Ÿeë°Æi¿rVœiU‘ïóÚŽw‹Xvâ2'{c—,]ä¡îeWߪC׉`ûɰ¿¬áÁã1Üß’°¿"jXšûTì_ea58,Í,2zãYCV5X'îQpzðˆ}¬ƒ Ö=¾Ê\[ަqö€»™Èø¦°:FQvÞ+ª˜ù.MÁĵ%4ä2«qM­‹}Â×G†áD½W*ÏdÙ“yIÑ-ŠHY“´ã4“žlÈàçÕ°"˜Tål[qøÙ[^þàS©r”€Wò-wæÊüùÒ‚QLoR¿'ö[¥·[LôÇâÏ ›ãþ¥ó>BË.rè z?Œ!; ¯{IC¨ æŠ,'¹©GšK¼˜XùŒV¹ã¯XøðVÐ8˘V kø½Ñ2‹%ïý)·:»täV£…PŰ'¡¶\Q^«ÞÝúœ¶ºKºå›£Ómbî>Àø´f}ωW}t¤ªÑ¶›i’]fÛõÛ„%ÍT#± i;MLß4}ò ̳àReÉoÊý¼á‹å–#·Ë?µèR?¬¢„~(gL«|±Í÷'m(‡ðØžÏÅA=UR{x5T•IpCäJ Ò ‰ µ9‚r%5ŠX§þÏwc”MÐH Ç0¦ÖÆáÞ_øQ©›ÍÏ×Ìç"ôºS;¼~àuM.™ôÃóëFærÜu%¼pðÉ»ŒXW¼A•©0Á'ÈÊvÙ¢†‰ž†ÓðghŠÙþù¢âÊ0Æ02~ÌKÔ•²‰o ^C)ú›ºzˆe¹ìmÓ¢+ěӖDNÑ—‚ ‹+’¿,jE°“ò ]×:3hk¨4rÎ÷Èh½-Ððk5òñ`“~NY‹P‹èv3dÏÕ–M5ÀÎ9ÉS!iõH€jŽ,4$ù‹|6BEÅ!–!” ÄÖ½ ç’dññ]a1ô„Mݽ›¹Ó÷ÝmòþCBÖ~–gÜÈ’q}잢þÂŽ8àœäªéüFòåêgÆ•<¡êNbÎVì€) ÿ¢ø'ˆ'œ4À€+F²ÁLo;¨÷ð>Æ“çgPã‘B5ébÑüf ʈ¹é•’›á²ì2+ žåu˜jÎËj¹HÐH-–ÔùÒ óÈA¹‹ þ a÷Ï—1‹¥àü(¥Vv«p¹µI©³|¬1‡‚ÿ`9êoÁ„É"ÜMäªß¸·l™]ë#^_»Ù°l– aô'ˆ1töŸ0k¶5£Ÿa‰WéÌí´S cD{Ø(ŒÑ@sŸ}ð¢çšñ\ÂÝ¿UC…UBIfÔ;WÖ]…Ê´a[5hÃ÷gÞÚ}ãz.­þ®iŒ"à9ý(N×ꜭ-¦Á¡z%ýÍBT’Œâ="Ûg¥fÕÃ0|}öóûÖÅÉ‚˜AËW!jÄΣ/æyf•ØU|äóÂZŠÝIdØ|áß¡•Ê*¡UëKÕ†ð±Ž÷ŠDd|8 ^ÖÖz–ïÍsçªÛwÿ„ӓ˹Að¯º÷íέÊ$—sIüÀ&ß3ÏT*¢JW$]Nè–!jc®^mͶµ#b}‚‘«°p¦5ty­áûE§»ÛàEħRUÐg£‹Æ{Ù=éóÓk ÁB0?g}Ÿ&D¦ckÚO_¼]ZåŒ1» )ù)\@ƒÌ;w~©w&¨;ª2‘°»5i eÑÆ o…È3¾ÿfsaëøú+ŒZª­޾éŸkR80.‚ûÖÃÂjB"åy6J°Z+sµøÉ/ Ä•þÐv‚¤‰@곞Σªt§†‡! û"áûr¬Û7o<‰×ôö˜j¯ÔÀb¡V½Î0йíÉRR“R¿\7ù(âê: ïŠ`¸Ñs $JÔÅç¦"³Eé*ÎÔ‡²?Þ}ÔÖŒIºhªÇz¢"©µ 2É8…£,>P0£©ÉŒ¡\ÕïÏS%bdT¾{+ ¿ ÌmXd섨mè®OiJ=‚E­žé(,þ ïšÊ=×õ.lèÚªtÁLŸlôTá q(×YìÐ5“ãd¿£’„xŽ-SñçÄr¡6ç!•ržóÎh;íb.ˆZŸV'Óצ3‹—2ÊÓÞ5Äðckª¥uMé‚$:ß[Š»—Y‰ÔËî>›“NÃÁéòÛS鬸!ýsôlÁñy÷*ý¦FFŸ~ç÷ƒ×sPî_ékÍ‹(´ ®ºTßrÊ/9Z‹lNaxˆ¶›Ç×Ì4·3œR¸o ïë0öý> stream xÚmvuTœIÞ5î,@ÐÆ]www‚k5Ò8ww n Á%Ü= î‚‚ó23»;ßî7çù£ªîýyÝ:ç¡¥T×b•°‚X€d!NPV ‡ @ìháî¦eî¤Ìª ²qW€š;^s4ZZm0Ôô&/¤”+È †8I›C_l´mÝ*æ®NCƒ_›ãeÏÁõoCˆ« @Ýìñ¨ƒ  W°Ó % ±tw9AµÜÀ +MÄÝÕä&°~©ðŸ3¤ ÎÞ®`[(€AGS‘™™åo( °ðþ7¹mœt/Äùl/!ä@N ח­þ°U·6—±CÿhÀ` …: ²³;[›ƒ^067k6'”ñ¥X'+)ˆãÜÐþ˜Ÿ4ØdùÒ˜7û?ÍÐÞ âéäû”5ØÉêÏö¬ÜÙuœÀ.î é9¼@hc6 (€‡ƒ“C€ƒr€¼,mÙÿH­íí ú“þ›;Yùû:CœÖæn °5èeAóu3÷ ®î ßÿ—øï°[B ›—+ù;ú ²þë¬bu{ 9Ø88€Ž?¾ÿìŒ_.× âäàý·¹ª¹#À®©#%¥«ÊüOýÿÇRRò–ÈÇ`åäç/} ðpýoTusð¿ªâøÛYÁÉø«ø—©ý»«Û‹* Š˜ðß‘T!P°%Àð·`Œ8x8^´ò²ÿQHÿÅÿ£œþ7‡¬»ƒÃŸ3`ø«yÀK÷neÀý;¼<‘?f¶üÿ¼ÌÁÞÿà÷¿†z ¿¤ÿ¯pÿKÿ]ÂÉÆ`rþ‚ÝdÁ^ +u0ÔÒö/•ü…ë8YýùAê7ðùÅ…ø?œ¶-ØÒÞ äæö"Å?)“Õÿ$•q²„XlZÐ1š»Zýøƒ¶twu}™ÓŸ7õâûï³5ø¥DÈ d‰¶4± µ«ý|S'Aâɺ;ÉÕÇ«sýìNÁç»Í׫Jdÿ„»ðÚ{iõ1[ÑCxxØðD™8>O{ÉN6d\¼0\8ù(âŸl ª‚g( Óç}ÄI±Dù?¤¼åO)«®õiE¥&pµÂ!¯Èn ö\ÔHÈ«Š«QÕæî‚OÔäÞi"ÍtIsØGd +~iž¹¥W4@oþù¯º×ìÛ|¿$&OÀ\¸´þÌ‚DÿŸ`×ÄÎ;ÛN%ñ.Øn–ÒèúýKöqô§¦9 $¢”$²U ,"¢© eG¡%K’ìoEý3 #ü‹¬NfGµžTÑk>ò ¨‰Ü•‘å6¶–oZÇ9Ç:!Ö—6Ʊ¡CøŸ ­æ– R$ð ?¨d %ïgkÕ(šØxU,/045×ìM\ˆ—Ë è¿à©€ìl³M^žÁ,`£*±ä$áTD{û(*Lm2bôIrl™C”8e½èJ¾ËB‘~!ì>((•Ë( QE"”7¦è›‰X_+ð;š]^Dhdv ™ÝùzDŸ¯©¥ 0ÑÔæ®Ì Na¿i¦º¡6Jï: Y/t %(ÿ‘åJ¿Ëâ„:LjN”@ÒŒ‰z‰y^q¹.?Uõ‘óYµ6æÂÿÈìó–¹/ËÂ!&mš¯ õt ÊS­t¨7f)”õÃúb…¨Ös^:zç‹Ùê)³#2±øi1¨†Pm¼ùì3˜+¯™óú Ž'ÁÔ܂МVøN4ªg:Þ—Uµ«ÑØê6ñ$xyp®èÙ\3Z꽊 Qu[DLàŽóÌùÓ0ý<·tâ†u3èXOàÁ¯AsFf˜ÌQÅ8ö³ê¨•yÙØIG9Üoö<µ* I»âVa~?4+‹òðïMN)¿Kª­é“Œú¾Gíõ â¾×ó]ܘ/G=ò╳ì(ÜÓQ) ñYæÇr.²Ç‘TÅê6ðD¾¥ø5Ú…ŸS‘¶™à¯¼/Ò£ü9$±¯S£Y2`ðª¯ûp·k(C„]˜ë'¥çùŒu]WêÍ‚‰‚øt©î–ÔIZÂóÍÞÅΛ5Ì—D#Vx`€[“r=±ÑÀíšý­ê€zijI}iÈäÒƒò‚5#i· )Ðÿk­ôŽ-ÌÓ’_ œf`‚Ýɺ| •Q<á‰TIp¿Ú.›^­ü7…Lì/©wï0áE¹âñÓˆšDÞñÀ?åf4›u0ø‡|ëäÁ_‘'ƒY”6þÉ\qô,Áùš&é­Q\~Ü‘iHU¸JBØÂQåÛäûRa²ãW«Âéb>j€æØçl… šŽ›*¨>f¬»K¬uÃ^ƒi ˆºzÐþ¸l§3MŠƒ£mÝúl 9þ>’æ—*p<]¢äbÖ¿‹ÅÊ¿x9 G; ÜÖÉô:2kœŠùS«°o—§W÷YDãž³mmì½öñ’†®‹Csa>ÜýN«‚î|@°oÆÑ…œ!£øgœH‰£/SŽ?F?ÐôØ7iâ@y!µek•(5Ø¢Yeƒ1¡G‰êø¦ÓîŸ/³;`á'ܰbš •ÌÚ¬éGe>Tï#"À¹‡U™{¥Ùß´ÙŽrã8`}‚鵩¯†Ê_ õÀ*¢’¨#“Vü@0éRdL»i,æzrÝ™¤dPñ³‡(ª2«×ÒÚ ,TÐj¡UâE§ÌÖëÅÌ e"*ËŽ¼JÏ_ö%I!ƒxZÐûP=5׎#¶>ìwiÞ È|.ý½’ô’ŽÆ˜•!×í5ú[?F–Ú¾°pÌÔHe$Î÷ÜXGb6˜ÞÔyK½Â›cê¨ØÉ~S-Ü.šŸòÛyÔ~^·ìCJOUgÔÕXp§Ðè¯T+âvLœçÑN’Ew Œ]5˜”Š¢*øŽG3™®ïzý¥‘'#DF*t°ÞÕûôÌé'„,ã>=õFg”*‰Ïßä0a”ƒØ?I%ĉr#Q$¯aü˜AÇíOŽãïtå\PënÄžWÍŠ{ô…h•5:$·òMÝ`ÚJÆ)6=ì¼Y7è<¸f["ÏÓw¤5îMl»æÌ!1 Çû×X!ûs­âNcÛ™oÓ8ÍçKÌ~~æB³6$®ùÎ1…¸™…ÍdóÎþâÆ´þ­„£÷øœlõò;ì ÑQ¬ùõ/-Ã'À§‚I‘µè2IŒ—ÛÑSz9ZÇC&U"Ÿ;äƒÂDZUaPË^8¢ÊŽëÞÛI¤WÂäœ$‘h\ÌmûÝ,Þx[ÃÆ™¤ Š*ØR§ï}“ed&6¡iÀM¢‘w8î|ïšÈš{Á{€‘ØIUiþ¹èšpÑKª¯?$“vrþ@áé±'§’NþWÌh83>7 Ф:I n/ëQ´ ¤ÅVÀ[@åj?Ì×ÎñTÙõé"~%TØ JÚŸ•œ}DôUýò[‰/uóÌz!¢ö;Ûkë=+mfÙö–³'^_#4¾Xž4QŒ›üyÁ¦Y¬©ŒfDÏ%Ølª>²ÍZäštÁ°­¦?ä Ê.d‡6ú]•àí~îÝ,Ò 0üÎ …aOú`±"'¦óí}ظ´3P}ÕˆŽƒì;’xÞ^|Þ…‹r­H#’\YL-Sb:é³ü„¼¬­"Šf§¹\.iµò“j5ÆrÄ0:¹rürJ§¿SJóªê‚ILOí\}•õ© ¹[íÎ@(÷J÷En¤úÛÞÙ„Þ˸}8 `ø+¶rðôÇŠX»¤4õ„Êþ!‰wAÎÕÖ˜ÕÝ60^ià›‚4ʯ!ìëT¦\øq¾z9ÜßÕÅ5b*Š ¸ÄB„jÁ±á(>¢–¿B&)%» 8¿'$b°çÖá5û õ¸jJXtK÷øåshÁÿ°N%çÔ•º£ì´îtÈ3 2ŸòâÐ~ ×=ý1Îÿæá cm?»èÂ飏ɮ x__€€áËÁÊZ&`Ø"ª:W9U74•x³õ~2QvZ9ŒàjM‘ÞµÚ]$Âóž±hš›  xE ÎLKSšÉ’9ÞÚÆR2çÏRž¼ûÚbÔX3)a— U±iþêÃXÌkŽÕ…öÙ}Mf nþKcù¸A!g4ŸJäˆ{½ ¬EÎkÍ/xㄈl˜m8Ïq˜àðŲÉS3Ôî¸÷CÄ݆¥ÑRUO³3]C-Ùo]=›ÁmþN’ªì‚\jÁ·.‘-"¼“D‹º`*G%ÔV5 Ñ˯¯öa¹Â` ¤ÒÐË( xf _°]ÏìVñîD5³~ }fv„¿ä_\žŽÛqò¹hü‰àe bʺrí×ðõ“‡ÍÝ IˆAæÞ«¿°¬þ'Ž.Œ†£˜?ŸÛ5+4|êùa<ß]‹bÑtÐã¬ÉÁ¶EXv¦ÑêæI–‹¸÷6Znp îš¼Ò¯*î=¬W*ˆøqû€Û›‰’“kœÐÕsg¿‰¸Ù|‹`ËYVÛCîX˜Øg9‘öñ3GW¸TjcÜHµY]QAÕàM ѾŠÿôsiÊ’²`²·‰Š±ß섎nG,LA½DˆñXúõçâtÆÕÓ-c„â½r{Í!¬à1»ÌOø¿[¢Çç ­ä_;ü/?×H\L°ih¯uÓv  ”'TItSüÉJ`¡W˜:7•¥Y›dàŠÁ ø¤M°dë£i¢¢Ûð@æchU‘›'íJµò_þZ¶ûhdÃ'ü4œ×í…M5Õ|iüæÌ† m‘GœÁS:.k6owŽ$ŽègÔá}Äè–´>>Ú5"ÎÔ}×iqd? Ì÷MW‘ª  ´Õì¦øÆJœá„üÌØGb_ÇíSâ±…1½ß¿ˆCýb7ôÅÞô)U«oï„Üm° öÚZ„â­Å/¢;¼j?©½S5B–\Döü âÖ¿ý™ø«*@cÒQ÷ñR¹6ç kt~ŠD˜'?‰)±J1°c°þµÁ+QñW{ï)鳇uØbxíLDöè¤OÚgðAÞoî‚›Gí›%B†ˆiutý;ßdëp3Ô†&‡Tò«‘™ŒÚq¨tÌ‘E"ñà_oŸï'–ŽƒüŠîPuÁt&—óÈqÒÔ¹nôL¯,w¼èQ™Ë%'.+È{¬¡Ä¥Cº7ܹ"nJ²xÒDKXìKúXlÄh¿Õ¾m£XÜß&drÿ~|½ÕªÇ1¤”w*Âò)”oZàsB’7´‚g×M÷S•‡eAXçëòÁè4ph Å”·CÓ ÛÒgGãó„ jõ6ØûÂe=a_/öóM4þÌ“c W¾Ô$íÆ&)'²VÌ`úvIãÉFEè8ÿuN¿«\gWGÖãC¦Àpö©˜ Nxœ€Î>Çì'=žœ§}«È­âßh„‘˜÷êó(Y?š/{’€4~é¾2V ¼Ê _I'mô9A¥6³¸P’¡’W 3=;¾>ìì5{ÝV&aÄä#Å… W|t.¹òCÛ¯š{ïô³+P²g´û¬ÌùgGk»±¥ðÀ‡Ï]™µëÆT…=ö­tL½‡âg9–•KäYóù|ƒ_6tÕÊ&ê† »G•¿À5³;Zl¡4YJ"Çp*J„ÃEX–¨T¼î|¬bú1óÈöÁÆ™+‰¾mîÇvì,ÏYBz¤¡ª·ÚÞ↬Émf%Wß.óz®ÛSxï“Õøš4Ëû€æ £øO«T~X '0µÖ²~ åXœ$¿µnçiã~bzLç5yœ-«gèÐXXݼ>d<Ãx'³0“pßf!ã¶½ªBgã3®t©á™ÿéÁPµ-œeI&#åã‚rI¸NpK8,5tL¯²µkï^“¼Ó©Ê®JVÙ­ëú,ö¨ÄÖn²ÓßþÉÄ^ñMÂkÁÛÍ!ìíBz¹*²âÒ5±þ‰J‹„gÉ(Ñ対À½ɘ•]“½BõËšÀZÒùÈgBŸ¥iÀ;u(æ*ƒ—L72¸f?1Ñ ^‘–™st/£^j03<¬ysm²¬ûŸãÕéñh༤n‰ü·5ý±a­Ò¼Œ„ŒÅðÊmØlºdÁQ-iÓq½l-§Ðµ êÁ|ôÕ ©0˜Àa_®Î^îC~”[•)™8Š×Øu‰ õ~¼3ú‚[ÈòíÎ,ÑBiîÝ+hÖæï„M_&4Áé Ê|S¾ö2ˆ½Ï·â*@½Ð”‡,UÛ&Þ¥a3è’pýzV 1œ²b¾2ÖŽO°3fÂóbŽ•äÊßuw{9[±„ˆ­²Tµ¸ÓùyƒÄ>ç¾}„Öv€Öqà“bßNºmŽpÐø©²ÄpÃMìeÚ%a¨Ñ«·oXÏL¤bg›Ò›zýL Dö„ rTήŽÖ玿,2KÒ„b¢Jäbt0F«ÞV ]çò±“Œ7X³²S¬V~­F§þ¶ Œç|%-DS¶-S/Ì+R*âóFjõ¤¯[ÿjé#›¨,j꜓™8¡ÝýèžW E uMÁºp’¸jšÓP‘YIïƒÄÕäh2_]XPfÇÌ âw]:·ç°CÑÁpÖ-ض«9eêý¹àë&Ÿþ;ù¬[:úFC¥}ä*I¼@ËY©ßmⱯ“ÏMˆ"#eRÚùäW«rnÞ­~$§†˜PÈÕ¯ì+pS‰>›L\²µ^t¤ø€˜$À›Uµ³.jÑä©r«¤z#”dfŸƒöê1HÅ áÖÑ›AuÀæÞdŒŠQ^ÆÄÁf²êŒyùjàÒ÷œM:ïÇŽL3@¶k6íœâü…¦êã¦F§ûó—•û»iéíT•C&eïôey²Mà°ŠBà¹f¨‘k¼_Ò.S„Œœ…DõÑ2‹ö»²`åk Ç µTG# Þ-++¶Ë„'“Fà ’0뜷|jDDú̱ƒ™Ò§)…ôÂ%»ÅG¢ÐÍHI±Œ)„؆0)ò¾”Ô0^#Øž¦{^¡øý„Ÿ,²rtÍsDšÀÆÄî¬ó}ô{:;&§r/ùŠ›%í™ê}ÛU Œ!îT¶vµ§¥­Çø¥g¿YàJn°×'O§-ûò°ªÐ¹`Ñxµoy‰¡¸sÆ™ Õe.®¥ø;}xNÊ»ò#B¬_Å"Ôk¦ò‡ûE.Ƥ¼—Õœ‚ïdTø¬ËÜÈîúîöqÇ€îŽ]mK¿—=ô1c>kKÛ}4.ÇsÝ<ðZ" ñ6äéÌ‹¾GºÁä!meW€~ò%væ2úºLu(»ÛFj\ökô¨j4‹W^u©bñ-# X¼@£¶fá.aËVæg…ÙçŒó3³Æ ‡§EÊ!{‹|¡çB–€Å ÓϾ”qyݺº¯^É ®_é‹8ON®y7!º}ú ؤÛzµJ‰Qõý›Ñó#˜ 5_L‰åé¥Ji‰Ÿ‘–¯Úõ½íM¦«Ž`$N’½“ŒÔxðvÚç£ÞÚT!¾£/ˆÊݬí«I^]~ÒŸ¾6­C‡¸¥ý¶]„ú§˜Œ=u.U>rrÈ1¿ŠvÉ£å3ªã’V:ûiîj¸ ’ž»K£KC o3¨'ð£N©¶T8ìO¸LÑÚÃWö¢tôÒÁ€ÄÔ“Ö±…a˜ïð8‰”Ès]ÿ†9— endstream endobj 1025 0 obj << /Length 696 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS >Ù_êãP·ò{=éÇsæ@öd”ôÇöçºkŸ˜xäœ;`ÝVY×`Œs4½JaÓQÜ¡n«þª‡í¡.’Uu9\ßèY6î>¼ý<¶Ù´‡.Z.ÙôÍž‡þ“4>DÓ—¾²}Ý~°û¯ÒÜÑör:-d0­V¬²WÑÍÿ¼k,›þ8ãóþy²LÒ»ðºÊ®²çÓ®´ý®ý°Ñ’ó[Å*²mõíLrŸ²?ŒÜÔqù¥ã• â5F8@ šˆ=@Šð)&°  È8Ô¹€ÂÅRx u€Dº\j2H—†ª¡ÐVÁ¹0CzL]ø Âb°ct‘I ©g$`htÑ‹0œÆ\F„áŒ0ä†sê‡á jd< —Iê6œ»õñzgóñºË»þê W ¤qÈ’£+—Ÿ#ö•ñÌÇkÄÞ .‰bªsré…¤šáæÄç†bïmŽXú¾„Kß7ǵHß7Géû„û¾nb§>&jÊØµäuœ¯¼ú•ñ1ÜV™÷•âÜãâµÇ‰Ou$ÕŸqWèS/%1{\øxB!€§ÔK(hH©—TЖ枃»J©Ïϯv×ÜëÁ=küÒ2ø¥UðKÏ‚_:~é$ø¥Óà—ÖÁ/¿Œ ~™Eð+7¿èË¢/ ÿlì¡ÛÒ(/}ïö -+ZXukoûìÔE?Z„ãæÅÛKýqíƒÄ endstream endobj 1026 0 obj << /Length 695 /Filter /FlateDecode >> stream xÚmTMoâ0½çWx•ÚÅ$ !Ù ‘8l[•jµWHL7IP‡þûõ¬V=Mžß̼ñ s÷ëu;ÑU··õÈÙ›=w—¾´“ì÷îÝÝå]yil;<[[Ùj<=?±×¾+·v`÷Ù&ß´õðàÈ›¶<^*;²~&ûQ·‚>ìþÝþ”MS§“ý¥>u;áà¾×ÃÑq~:fc_0F)l®»ö‰‰GιÖm•u f8GÓ«6•ê¶ê¯bØÒ"!YU—Ãõžeã.ÉÛÏó`›M{è¢å’MßÜáyè?IáC4}é+Û×í»ÿ¢Ìl/§ÓÑBãÑjÅ*{pÝìϻƲéOÞ(ïŸ'Ë$½ ¯ªì*{>íJÛïÚ-9_±eQ¬"ÛVßÎ$÷)ûÃÈM—ÏñP:^9À ^`„ª‰Ø ¤Ÿbr š€Œ@ ‘{@(\,…RH¤Ë¡&€ti  mœ+3¤ÇÔ…Ï ,;F™$Б€‘zF†F½ÃiÌeDÎ(ó0œAº1a8§ÎyΠFÆÃp™ nù[¯w6¯»ü·ë¯Îpµ@‡ )9ºréñ9b_iaÏ|¼Fì-ÐÐà’(¦:×ù(—nQHªY^`nA|n(öÞæˆ¥ïK¸ô}s\‹ô}sÔ‘¾oA¸ïë&vqêcâ ¦Œ YK^ÇøÊ›!¡_Ãm•y_)Î=^ ^{œøTGRý÷w…¾1õR³Ç…'ÄxJ½„‚†”zImiî9¸«”êðøüj'pͽܳÁ/-ƒ_Z¿ô,ø¥ãà—N‚_: ~iüÒyðËÈà—Y¿2qó‹¾,ú’ðÏÆºíŒòÒ÷nЪ¢5Q·ö¶ÍNÝ Yô£58.]¼½Ñ»á‚ò endstream endobj 1027 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw%gÏçáí4Œ3‰ä§áô–’>\ ‚‚6ý§ã°¿ õEJ™€õØ7ûÆ8ó 1¿’{Æ~ºðÏ`W(-ú¡;]¾è·Û%=°ùñýxŠ»‡ñe_,—bþ+-OÓ;qü\ÌL}œ†ñUÜÿI--=ž‡·B«•èãKª˜æÿ¾ÝE1ÿpÆ[ÎÓû! Mߊyuû>Û.NÛñ5K)Wb¹Ù¬Š8ö­iÇ[ž_®¹uÊ•MúÑzQ­Š¥Ò)V†€Ú(TØ€àx¿àÞ¢ žjy‹°°!ÀÐÔ•µZÔÀ2àP="¦ZdÔ0\ÃG©R\¡·”).–2*ÎШa!„U¼Ä,†³ÔÛHð° `+jÐÃ.¸5Nα@èâ°èÐVK-àxŸ%ô˜Ü3š% A°YÓ€z¡ÎšÔ>kP#¬³¦õ™5m0W£oš¦Ã¾žj­®§Üý·.†ÐZ¡ŽT$X/©)n)æ#W—„o(æ“oÀRZÞ $K¢p4’ŽZ¶-bâ\­1¦Ü°Jä æP"Gñ‘XÔQ¬‚i/8ºkÉ^€ÂZqŒ:ZsŒ½š9”d š­Bù Ž)ßsLù-ï7½æx˜ÏJ›¡¾Ò`¯ažÉ½)f¥É$†µ’1™¸ dÑŠcªCZCù<£7Ã3JÊgózÌnøþHȰíáÌYÉšäTœ¯a…Šï¯Æ,_»œ-Ÿ—Oë87Ë}êÛKÔ´Ü—Ll¹oKñšò+Êg­JÌâ.¾GZyóº‹Vðc­48¸’ï¼äØWtù]Í:P~`áŒñ±–rZŽq.nÍ1]Ç ÇàSÿæ/©ßP•ýïuö¿7Ùÿ¾Ìþ÷Uö¿·ÙÿÞeÿû:û?Èìÿ ²ÿƒÎþ&û?”Ùÿ!dÿ‡&û¿1y–¦¼ÍH·œn5þ¹ã)º½ÝyšÒ“Bï½x#†1Þž´Ãþ€]ôGoáõñÅ×Mñ?®Xê endstream endobj 1028 0 obj << /Length 900 /Filter /FlateDecode >> stream xÚmUMoÛ:¼ëW°‡éÁ5?$R. ¤d9ôMðð®ŽÄä ˆeC¶ù÷³k›m‘CŒÕp¹;;†wŸ~>Î|¿Ž3óEŠ_ñ¸?O]œ5ß¶‡âî®Ýwç]Oßcìc]=~?§}÷Oâ¾yhÆáô9%?ŒÝ۹׬“B|Æœ‚>âþ)þ;ëvÇw7{>o§aœIä> §·”óѲH˜ø´åŸ8‡ýøU¨/RʬǾÙï0ñ˜_xˆù•ÙË0öÓ…ŒxµBiÑÝéòE¿Ý.‰ÍïÇSÜ=Œ/ûb¹ó_iñxšÞ‰áçbþcêã4Œ¯âþfiåñ|8¼E°²X­D_RÁ4û÷í.ŠùGÞRžÞQhúV̪Û÷ñxØvqÚŽ¯±XJ¹ËÍfUıÿkM;ÞòürÍ­S®lÒÖ‹jU,•N±2Ô@  "À–,Àû  ð õTË[<€5€ €¦¨¬Õ –€ê1Õ"à†á›×cvÃ÷GÂ@†m¯gÎ üKÖÄ §â| +T|5f©øÚÕàlù¼xZÇ1¸YîëPß^ê ¦å¾dbË}[Š×”_Q>kUbwñ88Òʘ×]´‚k¥ÁÁ•|'à%Ǿ¢ËïjÖò{ g䈵”ÓrŒsqkŽé:n8Ÿú7ÏxIuø†ªì¯³ÿ½Éþ÷eö¿¯²ÿ½Íþ÷.ûß×ÙÿAfÿ•ýtö0Ùÿ¡Ìþ!û?4Ùÿɳ4åmFºåt«ñÏÑíÙèÎÓ”^z­è¥À1Œñö öì¢?z ¯ï.¾~lŠÿP}éL endstream endobj 1029 0 obj << /Length 699 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šhµ×œ.Rˆ$‡þýΛ1i·Z)Aãç™yoÆ7?ž·“¬î^Ý$º×êźËP¹Iþsß77EW]Ž®=?:W»zÜ==¨ç¡«¶î¬nóM±i›ó%oÚêýR»1ëÿI+÷Ö´Ÿ)àQ·;÷{ÒWÃ`‡ ý4òvÍùö¿o)Z«ëZqê/7œš®}Pæ^kMÀº­óîݧ`ê¹ÕtTshÚzðÔ+ä&TuSýŠŸÕ‘ @ñöãtvÇM{è‚ÅBM_hót>XÙ]0}j74훺½ª"t{éûwJË¥ªÝšÑ¬û£SÓïC]·w½S!¯¨©ºÚú}å†}ûæ‚…ÖKµ(ËeàÚúÛž‰¥äõ0æ&”«çx˜™Y°F\20/0–b“Ò# “!Ú‡\§)&q)€% 1Ϲ‘NÐÔ"Û‚%”’4¢81`rÈH%ÃDdè‘åÜ#C ýйk Ю%£íºÀÜ"l é%²Ë€ìR„Q ƒF'b=:SýÙäøuX¤ð$”Qúó:ú\C¼–AfpGÇR~m%^!N%ί$†h³³&„ÕšñR 󛣿#Æ¿p'XϾ¬½>ÿ‹A£Iä Â}3N¸h2Ž5ó¯gNÑE'b«£œkýkåØ¿sè ý»¢%Æ|Vâ ¬áž!ü°¡äÀË3™¬?Ðfc91˜ÓŠ—9Ç|u 6ãZÖcW‚Cƒåƒabî ýd1×®eFæ-9žAg깟ú÷Æ3•ZÆ=üI=ú¤ž ç6-Ä7p¥Ìçœã?)pe…øÆgT<ôŸ«?}øpq¹\¯ƒê2 tSð Ä·¾ÿ¦u×KªïzTñŸo·ñþÄê© þ…çr{ endstream endobj 1030 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁnâ0½ç+¼‡Jíb'$8B ‘8l[•jµWHL©$Q€•ú÷;oÆÐ.Z ¢ñó̼7/Žo~<¯GYÝmÝ(º×êźÓP¹QþsÓ77EWö®=>:W»ú¼{xPÏCW­ÝQÝæ«bÕ6Ç;J^µÕÇ©vç¬ÿ'-Ü[Ó~¥€Gݾºß£þýÏÖ#úiä½6ÇÚ¿ÞR´V—µâÔ_n84]û Ì½Öš€e[çݺÁØs«ñYÍ®iëÁ P[È L¨ê¦:ú?«=€âõçáèö«v׳™¿Ðæá8|²²»`ü4ÔnhÚ7u{QEèúÔ÷ ”æsU»5£Y7{§Æ×C]¶_?{§B^QSuµ;ô›Ê ›öÍ3­çjV–óÀµõÕž‰¥d»;ç&”«§x˜‰™°D\20-0–b“Ò# “ !Ú‡\§)&q)€% 1O¹‘NÐÔ"Û‚%”’4¢80`rÈH%ÃDdè‘åÜ#C ýŠ©K Ð.%£í²ÀÜ"l é%²Ë€ìR„Q ƒÎNÄúìLõ¾Èðë°HáI(£$ôçuôµ†x-ƒLàŽŽ¥üÚJ¼@œJœ!^H Ñ:ggM«5ã9¤æ7F7ÌFŒãN°ž|[{}&þƒF“È„ûf*œpÑdkæ_Μ¢‹NÅ0VG9×ú×ʱçÐúwþDKŒù¬Ä4XÃ=CøaCÉ–g2)4X( ÍÆrb0§/sŽù4êlƵ¬Ç.‡ËÃÄÜúÉb®]ÊŒÌ[r<ÎÔs!?õïf*µŒ{.ø“z.ôI=ÎmZˆoàJ™+Î9ÇRàÊ ñϨxè?Wúðáâr¹\Õiè¦àˆo|ÿMë.—Tßõ¨â?ßnçû«§2ø Ý7rX endstream endobj 1031 0 obj << /Length 701 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ©D’•ú÷;oÆiÚí@ãç™yoÆW?×£¬î¶nÝjõäÝi¨Ü(ÿ¹éƒ««¢«N{×ï«]}Þ=ܩǡ«ÖóU±j›ã %¯ÚêíT»sÖÿ“î¥i/)àQ×Ïî÷¨ý³µC;²ÃH#ñ¹9¾Q·=E€ºŠ“¹áÐtí2·Zk–mw{H?cO¯ÆgA»¦­¯Am¡(0¡ª›êèWü®öäŠ×ۯÚ]ÌfjüD›‡ãðÎÚn‚ñÃP»¡i_ÔõEÁëSß¿9HP:˜ÏUívÔæ½ßì›ëcÿù½w*äµ=UW»C¿©Ü°i_\0Óz®fe9\[ÿ³gb)Ùîι åê)^fbæ,— L Œ¥Ø¤ô ÃdB@ˆö!×iŠ @F\ ` H ÅSn¤4µÈ¶` ¥$(N' ˜2RÉ0zd9÷ÈÐ#C¿b*À’€´KÉ(@»,0·[Bz‰ìrÁÅ »aà³±>;S½nòü:,RxÊ( =¼Ž.kˆ×2ÈîèXêÀ¯­Ä Ä©Äâ…Ä­svÖ„°Z3žCªa~atÃüaÄø'îëɧµ×gâ¯4šD¾ Ü7Sá„‹&ãX3ÿBpæ]t(†±:ʹÖVŽý7‡®Ð;ð'ZbÌg%ΠÁîÂJü°<“I¡ÁúCm6–ƒ9­x™şQGÐ`3®e=v!84X>&æžÐOsíRfdÞ’ã t¦ž ù©ÿn|0S©eÜsÁŸÔs¡Oê¹pnÓB|WÊ\qÎ9þ—WVˆo|FÅCÿ»úÓ‡×ËÇ}P†® ¾ƒøÀÿß´îãšê»Uüðýv¾D±z(ƒ¿Çt~ endstream endobj 1032 0 obj << /Length 702 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ©D’•ú÷;oÆiÓí@ãÇ›yoÆÆW?×£¬î¶nÝjõäÝi¨Ü(ÿ¹éƒ««¢«N{×ï«]}þz¸SCW­ÝQ]ç«bÕ6Ç"¯ÚêíT»3ëÿ¤…{iÚO tÔõ³û=ê_ÿl;;´#;Œ4˜ÏÍñß?*BÔ¢˜þË ‡¦kÕZ°lë¼ÛÃý!{j|ö´kÚzð6Ô¦ªº©Ž~ÅïjOc@òúýptûU»ë‚ÙLŸèãá8¼³»›`ü0ÔnhÚu}á‹ðõ©ïß<(Ìçªv;*G=ßoöN¿·öAx~ï ymÄQÕÕîÐo*7lÚÌ´ž«YYÎ×Öÿ|3±¤lwgnB\=ÅËLÌœ€%â’iA€±›”^a˜LQ>äO¦zÝ 4èë°H1“PZIèáuô¹†y-L0Kôµ•x8•8C¼¦uΓ5!F­ÏaÕ°¾‰Ðºaý0büB;Ázr±öþLüƒG“Èbúf*š˜¢É8Ö¬¿œ5ÅŠ1Xåœë·•c¿çðú½ƒ~¢%FVâ ¬áš!æaCá`–{2)S¯~ê÷f*¹Œ{-Ì'õZ¨“z-œÛ´¹A+e­8gŽÿ¥ •27>£2Cÿ»úÓ‡ÌÇ…P†î ¾…øÀÿß´îã¢ê»Yüð w¾I±z(ƒ¿Ôãv© endstream endobj 1033 0 obj << /Length 700 /Filter /FlateDecode >> stream xÚmTÁn£0½óÞC¥öƆ@LE"¤¶­šjµ×œ©D’•ú÷;oƤÝj¥Ÿgæ½y_ýxÜN²º{q“èV«'wìÎCå&ùÏ]\]]u>¸ötï\íêq÷x§‡®Úº“ºÎ7ŦmN7”¼i«÷síÆ¬ÿ'­ÜkÓ~¦€G]?»ß“þíÏ`‡ ý4òž›Ó;íßR´V—µâÔ_n86]{§Ì­Öš€u[çݺÁÔs«é¨fß´õà¨È L¨ê¦:ù?«€âíÇñä›vß‹…š>Ñæñ4|°²›`ú0ÔnhÚWu}QEèöÜ÷ï ”–KU»=5£Yïw§¦ß‡ºl?ôN…¼6¢¦êjwìw•ví« Z/Õ¢,—këo{&–’—ý˜›P®žãaffIÀqÉÀ¼ ÀXŠMJ0Lf„hr¦˜dÄ¥–€ÄP<çF:AS‹l –PJÒˆâtÆ€É #• ¡G–s =2ô+æ¬ (@»–Œ´ës‹°5¤—È.W PL²KF1 ˆõèLõ¶Èðë°HáI(£$ôçuô¹†x-ƒÌàŽŽ¥üÚJ¼BœJœ!^I Ñ:ggM«5ã9¤æ7F7ÌFŒáN°ž}Y{}&þƒF“È„ûf.œpÑdkæ_ Μ¢‹NÅ0VG9×ú×ʱçÐúwþDKŒù¬Ä4XÃ=CøaCÉ–g2)4X( ÍÆrb0§/sŽù4êlƵ¬Ç®‡ËÃÄÜúÉb®]ËŒÌ[r<ƒÎÔs!?õïf*µŒ{.ø“z.ôI=ÎmZˆoàJ™+Î9ÇRàÊ ñϨxè?Wúðáâr¹\Õyè¦àˆo|ÿMë.—Tßõ¨â?ßnãý‰ÕCü_er¨ endstream endobj 1034 0 obj << /Length 701 /Filter /FlateDecode >> stream xÚmTÁn›@½óÛC¤äàx ^"Ë#ùÐ&Š£ªWÖ R Û•ò÷7³ÄiSÉF³™yoÞ.{õía;ÉêîÙM¢[­ݱ;•›äßw}puUtÕùàÚÓçjWowêa読;©ë|SlÚætCÉ›¶z;×nÌúÒʽ4í%<êúÉýšô¯¿‡Îúi$>5§7JøòN .€âäŸn86]{§Ì­Öš€u[çÝÒÁÔÓ«é(hß´õà5¨g( L¨ê¦:ù?«y€âíûñä›vß‹…š>ÒËãixgm7Áô~¨Ýд/êú"‹àí¹ïß$(,—ªv{êFóþØœš~™ëãýÓ{ïTÈk#zª®vÇ~W¹a×¾¸`¡õR-Êr¸¶þ牥äy?æ&”«çx˜™Y°F\20/0–b“Ò# “!Ú‡\§)&q)€% 1Ϲ‘NÐÔ"Û‚%”’4¢81`rÈH%ÃDdè‘åÜ#C ýйk Ю%£íºÀÜ"l é%²Ë€ìR„Q ƒF'b=:S½îòü:,RxÊ( ýy]Ö¯eÜѱÔ_[‰WˆS‰3Ä+‰!Zçì¬ aµf<‡TÃü&Âè†ùÈñOÜ Ö³Ok¯ÏÄcÐhÙA¸oæÂ MƱfþ•àÌ)ºè$P cu”s­ßVŽýžCWè÷ü‰–óY‰3h°†{†ðÆ’?,ÏdRh°þP@›åÄ`N+^æóiÔ4ØŒkY]  –†‰¹'ô“Å\»–™·äx©çB~ê÷f*µŒ{.ø“z.ôI=ÎmZˆoàJ™+Î9ÇRàÊ ñϨxè?Wúðáâzù¸ªó0ÐUÁwßøþ›Ö}\S}×£Šÿ|¿—(V÷eðcWtÓ endstream endobj 993 0 obj << /Type /ObjStm /N 100 /First 948 /Length 4323 /Filter /FlateDecode >> stream xÚí\ÙnG}×WÔcºö °ä8É$vËk?PR[bL‘ I%v¾~έªn6׈²¦Ý{-çî÷V7`‚E#™ÔGÅ”s8j¦cÄÑ0«Ž–9gqtÌÇ€£gQK“ÂQƒÈ¤Œê Z‘”aÑbHcÑÎ*&mÄ$V3éf±†É`1µLÆ€yp¡¤Â8è nG˜ÒSÙÈ”Uò :l,:É”hƒ‰U”˜Â®ÀÌѦe 6–i-©cÚftži€Ù¦½B™ÆD/@m@w/™‘ݽbFèè53Ú£»7ÌXIm,3ÎPÇŒÇíè=3Q€´³Bƒ™•˜1¨Õm0±Å@8QÌZLƒf8‚<ÝA’%P18æ¤ÀÁ3§H.`„Ó$€¨˜3˜Á5g!¶I4½"zEboD¯$HÊ"¢ôFC2B„Ôt&YИgŠ…Šp†ÞZˆœ]$'¤ð`%NIÚQSKpBJIR˜@JíitpUBÖ4¼D7% ÑMYð4¡•Š©¤ • “A]$ Pœ%ÆklÒx’'$ˆ‰¤„@qfT„X!­H­ÑÃj(›" ¬UxJ`Á[° L–6y À{éDÒ:Sô gð4é±³’‚ÎpB异J@½¤ lÒSb²#.xBîa µ²Q$WÄ0mé4׵ב8M Ð>ÝÅHºÁd‡3ÈS êD*® &éIIe¤ÞæëÂYpîà›oøËÏ75ãÆãÉü€ŸÜžÍÓõOÃñÇ~4™^ÔÓS2lñžÏàǧ2]ðõùœ‚ÖÊ…4[Eæ„*G<¾R*¢Ý#öÍ7ŒŸ0þÝäå„ñÇì«›Áe]õ/öïàÿ€¡rÐLˆ òp4 ºç‰•V~;­„u•…¯Ud¨soƒ£® Ù;@˜aD%5ùKYɘT»d VTPªžA¨X‰à t¨|4=°“Cbz2Y2våª{‡®àz`¤“Gò*•!{•PÔ ûUEPBUÎ÷% PG™„²+S‰¢Ò®F+X'‚— •@”5Æ©˜‡‘ÂMîpSè!4X/ERߨ{|%o<<ÂÒFØd„‚ê!l{m*Ør=@2fÈwî² ÷ $@@JU{Öˆ"¤„ÀÔ++JK½„oD(Gp†Çð%ª eO ÜÂÅP)øHÝ”‹Pß'-tÁ("&7a¡ËEøNÕ'D¬(_‡SªL3Ò¤}eYôÄ —Di²d(xId_EA|'ürBÂ*"¬È)¬$eòŽÄdw€+—ÒS¤1‰Ã+Ù¨aPT¸ ³BælkzªV´_vñ!>¤mÀ@Q®8„l‡£§êÎ)‹ «'FH]Q)ã(f£ö5˜[%L¸¯ûRòÕp (À«€ú‚<UeNÀNC_"‚•»‚#ÇåQV¢æA¢ozÒJcaÖ9¨#ârkGU9JíbO ÞR9l-2KTÆ#ˆ؈‘=qBƒb‹\•ò: 1P¦ia¸ÊîHoxø„0‚•j ݰÂôB#£¥•xÊ*-ER'2 …µ&öVmJpŲn%¤wIC>dE&G¾:ÂW#†aFŽ:ô¢ÉgLÐ)š7ùŒ!p¡/N !ï@u§$Û@Ý©Á˜—¥B¿à,‚ nÔ÷ÌãibÁzð¥/…@&å$ùÎ2}K«¯VëTO¨¼ •^¥«0¹G"¡cª}Pvô³Rf4²7im)+­CW´JMÉ]ÜY«‡MoN¯À`›Ò[Ádœ1öŨ_Zà ¡’I%OiÅu˜0=- Â¨¬•LC,•ÁF žf_!‚ï „GÍmiu\S¨‚ƒ¢x NÀnå®2Ø<äòŒÑ˜  i© F–Mï-´£úËõÄ 8éíJ²L‡ÄNƒ3Hð”ê‹’OéåP€P´x q Ò;+Ðøð T¤à P€ô–eç;å(n„vÅN!ÉÙ™Pýd¡ ô ¬aƒBÒmÃ]ùð˜ÆH³¼`üí»_ ½FM›Æ·ÌE-‘·BD‘ö°Ä‘=9‘ÉèED#ºÓ+i/¨“C’€2ïc&Ø–¹ˆFC8‘É%z7ì;´h6í;¢1ˆÍ> réi‡Î!`ï ž…b§3ÜiÏwï´O/ÁmÙîÞíƒ¦Ýæ»Í|‹;Æ‹k‡ O–ýƦ*½<¦–´ŽQö!$õL{Ò;kIäyŸ[$Ri)¨Ùw@æÙ|$rÖ%I%ò¤ŸVeµ MCŒ§yȧÃüiïò8Ž^µGÒ9z‰‹&P[zoD ë"Á2…¦Ñ‚X‚‡\Z# ûòTÈ´;©­,‘ºaßa…³aßp_'å½*j䈙ÿl}nÅx“=Ðg9(+lŠ*Ó&òÝ`X2Š,=MÑ.$ßôžË˜>J›F¦qi ´Mѹ3‡1ÍÚ–±ikúüÝÖ¶O_ð”ͺÒd´y•l._ƒïCºN“û PëÜ÷S¿Ò®íWÎéÝW36Ýo@Іr¨ed ”ÝÜžj‡çt EÝ-‰€ž7ý²iÌ)‰1j‰<§ Òm2ãIŒMZ r—¢M¶‰‘žÓWÍ8$¦&áIIBI^š9R’€þI¢î•D‘LÈ ÊäD[ƒltëK ’>²jÆ1Þ,dceÍ8]ƒ$¬ôÍ^c‡;í1i˜J÷ïk îGÇîß:džÏ];nÚ'‡Už5[âO§_»àÏ?nõÿ­¡€.³¸’k,’HDB{ÃÁ§‹U)¦ÍŠÂÍ"ú6=Õéà< #Z Z’ŽíŒ^Ó‚SAAo’š{dë4j¹×Ú%µK‘¢cóÎA™vKúÞce˹p#ÁÎÖ•˜*Rn$¿º0ßmÓÕ¦¢ÛÔ“T¾+ýUµ½“ºÇ´rÿ}gõƒÖ׳óéðf>™æ5†gƒk<9y÷äùÑ믟>ýA < .gÌäGG“OìôP+v¨èKla@¤¥µ‘G³ózI}ÒYî3å3>«¯‡™„YýP̆ŸxfƜϯ¦uÍçNø-¿_ÆùdZó?øŸüÿÌÿâÕÓÉŠ:é}Ôéåã§oÞžu:@Ž&£‹-ê„„ýP _~˜‘×Ï‹á(ÕU¨tÙ*”’ÛJv5Êjõ%uÖjÂE+|’÷’È;¢&A·2n›e—ÅÒc«ŠÖE°W˜yõëëçGÇ«"8žŒ·‰AÇ,úH\rÍ÷”ù±/’›/—ÀV¶‡„vÊ~1ó—oýüv“”ˆ§[$e`0Š~Ÿ&é7S÷¶—ÃØŠJ‰­¢ú! c°ÛSf i$Q ‹&à6qt¾ÎÁÏ+LÛ+¿xõݳǯºLÛ¬PŒª`óOÁbþð«pK.sK.sKoÑë`;¼Rz·ZÿgI±Ù².†õ´ž g‹àu¶Ùg·£Q½Î'7Ÿóã……Ôã òõkqªXÍhƒáü¶ËtZ”oD«!j¯hÔÎsGsSr?Í9>~ýlUsv˜*h½áK´çý ;ôç:³ê».pajÝ<$ 6[ÞÇÖöîèíî‰Ô†dàÛñ9”d| . ?|€ÇçõŒª¤s#Á¶zÑQ°’]•\‡éØÍf6’ÐKÒ¶Ì–¢É…º¬^>±‚ˆËd&ÍOf´0écæfÒûFM…Mi[æsIí˜3”`îmípØË–½ÈO;65ëÊ`‘àe=èºÙß:â¾Éeg{Û1˜NÒÛ¤ÀyibãL²« _|.< -³.\SÆ-\ýPya¨ï×m¯ó5ÝD2v4˜Õéóµ²~ÉTóïpIµø“át6'Ë`Í~40£7ËùÕ,ýî75}9y5†¬.’fnÉ‘vAZ)È×…UDÆvÑE‹Èm@äöG´ZI¯B’b’î ’Âu Å üþVêß5Dj ‘êB"2ZH~¤°?¤­5ë8³n‰_j!² ˆÆ?K¿Ö^Ç÷Ç»µ(ZûfK¼T² Wß®ûÃÝY@¬A»!«.du'ÈòvówÙô*lµfHÆla5ý‚»ÀVûÃޚϮÁU»¸ ·Üå²¹\}¸;’¨5Èf]–w‚lÖ!?\Ö3dR“[Z†:Àõ”òˆô Ò?/(Én á,ò¦ÒÛLg£gº<×Ù^ÞßkmdÄ–A­ËGW÷å¹·_0IzY‚Ab 3™w8†|”å~.Gï7‰QeÐÃh ²3Ûèç˜éh¿€cË`Ζc¹ö…Ÿ¿-4A~Á$¡ ^¾u´EàÖd6Ú<8ýa’½&qÝI\a—3y2çòàÎg™ø¼œŽ²<Ü_T×»<™ù:ä—,!›É®IÔÖIBÎXù4t× z ª_²6é¦?;’Ž¡èfö éŽdÉþ-?h)iË,.{ÜôJæwFËñ¹s£'-Vºý|;¡&˜ÿÅŠ;"ÿ•þ¢Iº*uÛuˆôž©&I{„–ñ‚„.ŸOë?à—=ZîÞ$ÂÔ]-wÝÞJˆM½eÓ[6iòÆÞ²IYŸÑgºjåMVK6ùevŽ¥–Æ›ÆÒ‹±Äæ±RïzÿÎúc" endstream endobj 1039 0 obj << /Type /ObjStm /N 100 /First 938 /Length 4881 /Filter /FlateDecode >> stream xÚ­\ÛŽ¹‘}×WÔ£{yg0Œ•åYcà‘Ff°7 ’IŽ;£Z­…?O0+«2³˜Y¥Ñ>¨;‹—à‰Á+[’è ’ÌA ‰ßxvú ½;(ð[4·;:éðÛŒ'ük1ǺƒÓ˜cÕÁõB:ðiÌæqƤÆ\ÁZ¤Tø¡ EzLU£<ÖPø  y!c¸ã¬/¤à%%ú;€‚0€Óæƒw‡€¶€^¨#ƒS(¤„e4Å˰BÊèæ*hô )PH´C!e¥9@!eÉ rø­1Ž ) þ…T€\ÍýêhÅ1DË€ßÜÅZ¹ƒÖU´h 3Ö0Ê:æò´S’ŸäAûÐtÄØ  jc¢ÔÚ°´––Ÿ,ÀŒãÏY&Ã@"é&…V¨ÖáÉÂXZñ\+¶ÙO`š…å°†Õ멃úA3*kA±d6°aO@ ·qtðÆ5)áàCCþÈžáä‚óü¤ž5àRAkž ¥ƒ•m†…ñšæ#ßžxš †Úä;×$byÙÜRð((Å­Íešs ßüɳ6¬°6¦µBc÷hdSͳsiÛZÙQms}æ ¶ÖМŽ™y«$ÙÙ-càÏ6H¶Óæd#Å¸æµ ¿ó²µòž qò¼ ¯ÆNêí¸o2×0ÞóB"à‡§ñQñ®Tôâ|ñ‡ž)ø°gß½øÃK<ºññm|*žÛn??•ÿmÛ·}ú·‡§Oè ÇßG|Âö?½züŒ™¿7/þô§Å"ö¼ˆZ.2‰Küi5[žf{Ú›í ¼)ÿ|nqèRìt’eú²Ž³{Hà§Ùb,»”E ê&˜º æD^-éÎöq+ûØ…ò®§®;ïÔîl1ì¨'ëlK{²ì ]\ölkú²Ž³{f°g3Ø]3è’•Û…Ž*oy°9›Á¬Ì0-2.izêš³ŒÚ½0ƒé™ÁœÍ ©/ë8»‡DŸ‰×f:EsYvIÝs¤ÎЮë³µôÚZ=Õ™jµ‘FP“ºGPz‘NŸŽ äz‘³EÔÊ"âD+Aó%•‹%'’Ž;yɃ]/y6œ\N.ötVäÙpÒôg¬¨ÞŽ‘gÈ¥ hau!úÉÅ9JžôS«5ÄÙnbe·Iìq‘žcгA„êÏõ=Ÿ'nm«G Ÿ–KŸ>¢:ê*hO×p2FXÚ‚æ®sL‘Ë™'CÑÙ°…Žœõ*O/JÝÐ霣iC,¬1íÈq9Zì©öâÂ9«¯“úr=3'¦—ÓÏ)}•ÑÍ\ŒïãœÎWÙ|1ÓÍøŽeÎ)z•¡—bæfê¡9çêUª^Š™ÓßËÓç4½ÊÒ 1‹ÝKÑç mwX]$ë^®>§jÛ§¸Í´VÏwpWþ1ç•ÞoçÞï—ÞïW«È7»Þ¿Hнü|NÏz×­¹º—ªÏ™z¨—‚‰ÚtLpο«ôÛ˾çä«vY_dâe"^äáý4|ÎÂûIXÍYïÂ>çÖ]Öç\©n}p>¨-ƒìâlÔ;XÓWoâñ4ÛI§M¿ëv‹CÈò ²8ÅîEøs†ÝXjÜBsŒoâ¯åÓá¿÷êÇW÷ï|÷Ý›¿ÞÁ¤ ÍaÖxÿÃÇòáõ[ô‘ûþò˜ÿþ9>=ßÔè‡ß}û/_¿ýþ[–põÝ›÷?¾üþ{nQÇ–çòë7 £×þŠ=üúð¼Æ0ûûèØ.î°¡å\¢ä–ùŠ×°³Í ~Ö`¸f  ãNÃ:­8 êcr<Ùͤyn˜¯Gw|3kŒYŒ ß÷æoGö ß|ûïïù#ua¹qÄn½gq ó[˜Ìè™Àû×?üå§ï_¾ûî¿~üî‡7ÜifoxýVq£[7Þ×â/¿”_îëãÓÿð?òT>>=æòéÓÇŸïëý§ÇÏO¹Üׇ_Ê'Öz¾È/ßšòUÚJµ5ö匾ªýxÿüq`G`È÷?½ÿöówÔå§÷/ÿÚ\SŸãG¸ôððÏo^Þ|Xµýùî@ëq¯îø©‹ø a>ünþGüø\žØýìM- ]†e“æµl‚êÕDvY»lbG k˜³¥g7z¶ðR,{ïqñòü˜ÿÿ–§è¸ëÃÏŸŸÊ7ã?´M>v<|Ê?ñIºÙçû÷?½~ýòÝrû&\àX¾€=Ãc#ca?|wtÇñéAÝß?•ŸÑyÿð¡>ÞÓ?îvŠ ãÏ¥) ͼA0µvÞÂaG\8Å Óiìø±ƒ·œs±š[ n ó˜ÞL2¶8n¡yK³ã¼Óª§QÀZÄ’s²Ì|‰f笩›ý¼…Irs1Š5v¾‹îΣú¸Óã™?'L1=~N˜bzhN˜bzh•5kª `¼êiÔ0ÐcÅœ N:f¾¦=vÊc è± \ôØ0gYCŽS}Cò¢§Q}\ô83WTƒç0@£¹jÐãÅœB z¼^ŒÁâÞô ãUO£úÀ8/öœ=ÞÍÉ0-i1ôðG³ÐC‹½` Gp×Åu‚…A°ÀNs3`'„9Šyç6â¸ëæá‚~Џ¡ïõ¼â4¨)ðák2ò â×/©…-­D§ý>ÊRtÐ&’Š­IiR*•”¯YT“9v™îLc3E€W6i=$¡3 Y < ºjbç9í¿ÕÌ\EB$“ƒÉI)t„Eâpá¨;Ó:ïéê]’ÞÛ`C©Ñy•±2ZÛ%¯m€/vIòR€3ÖˆTŒ(2Cèü+.Yésäx#\WŠÅïd!cr¤,Z¸D:$/œs·´×EÒAî ¸8Â"ƒY—ëÅ…w5Q¢v®è%í‹0çüèäà‚ö¶æj† lTCÒ*Ê{%öEXø‰"rÒ“'.poŠJq ’ ‹ûRžûò[6¾„¸½‘ª„!æ(`© ³³šjòIhö¹:Qòu5{/-‰ReQÙ•RKΖÃ)?m‰î(d†›–¥CöAèûSô,Bï‹Èä’©Ùda«›@L @àå©fö ¿/bd]öZG †"ɃÐ*$ŽÆò CÄR%êN›(…”aOcÀx9Úñ‹ß`›ßŽcËA>*OóðºÜóÞû(|r¶Vm¤²º L2Qzk¢MN9Îg+Ã/ç£:÷²«y(…¿ý®•R¬DUj¸qä|H;ó±}ò¼ËÊ:°†\r¨bBYh^ßíÌ¿¾½W;ó½¥PUV1 ›l*ƒÍÒæPL3^°¿xÚ0ö’çß(ÿ#Þ•½Û£)˜"ÃPc’)i¼HRÙ8´£’÷{ó=’Qn¦Ã`U¼)Å «BVÔh6;ó‹xdCp¹R¢ÑÈËQ’k닽ùÒ« W1"f§XõE&)cªµZŽO~\–ó+¼>‚Ý”Œò4Ø‚D®I$µ <_Þ`æ[,ñì;ÂE’u¶·-;½– ¦q~Ae*68‰P(¹„àîA ¥fÞjNå ôáZ pœ*°)Nð…f"ìHkSöÁ£ò)hm‚¥ËêëRTÒøŠe1BEE•K­Œ%Üì·Xë«Ð|‰ã8=8‹¥Q)ê(Qi Y!˜b?YœšÛ— þú&8…M‹Ò²jüª, ¯£Êú&åú&D5r%WP Ѝ¡í ¤1Áùv£u݉QfKasš\ÈÀUA fõà9¾²É¯;¡êÌ„”"µÓ3BqöÓ¸€µîº3Xª‚’¨j÷Z†äsÊHÁP‹5²þ 纵¾ Í—8N€»©¨ L[”NˆaED9˜’r»5W Jƒ ƒÈA8O”Á;üîS¦"K\ YÝXˆ2¾Âºƒ´|§ XƆ쩒¤’ˆ÷§½îÄ…2€Ä=c¤OÖÁ ø6¨ŽÄ§ï¯K‰ÈhÆgãµL¦HdU*R{T “Oöþ:/5ð5p¬©9¡êG‰MA%¯°Þ["úǹn­¯Bó%ŽƒlGVÄX¬,‡BLYI»ÊS× Éü‚Æ:¿:n‰O%þ{-  ˆ1V“—Q¹b4è4Ý(KÕ †šuðQ ðUaŠÅ‘‡½˜U)•e™e58þÆ PÖ„x—Û½¡$ø/Î…ogä²<âC¨Æ© ‘^óºE´uÒÔpÉ/pšë–úÀ´ï:=‘u¿°¤]]ô8– v9¾#õc¦(VóV·"N]¨ªF1¡¨Dœ€)¸ZD-^ªF™½QöbG4Õ{“ƒÇ –Lr`OûÁæÊÚß(«®eN…À1'lA±¥pRW8A<–5ÅÅÏiVšs):}¸êá Ýîšÿ·±}¹Î¥Mç#T«å…î€T­ ?”ó.=ÞØØnÏš¾fšu½:ÞóhÙéa\¾ût‰õrÞž‚¯ŽZÝ]”ï&Œït ZÛíj—L¡ÛÅîvñG'M\`½œ·¯`»ß’¾Õ4¨>t»*õ Ú&0ÈnW{ÛÍv»X`» šK ÚîMÓr¿Ôݦˆ›èàM;XyGÓTÞÑDÛý¼ig3q1vö¾AÞ„¾Û’püòÊôîÛº_aÃm…6=™°ÝÏ6ß Kz$ÚY¹ÝÏÛÔª[ˆw[®¡G‹9«·ðn·ÝýñjНŽäV¿ûÕv?Ùß c?Iîº;' Wˆ‡±Eú®?öóÛcRôûãµÜê×c¿Úîç¯eµÞîç/hµÙ'â¤É†„«Dèñ(âµÝÒÎNÞèí~jÌv?¿bvä3ÑÆõûÍ‘èþ±£É†„«D˜£Å\Ø¢ÛÑÄÎfŠôv?3Ef»Ÿ™ÚÚæè’×öÆI• 71Á_»ní îço`ûiaì篼i‡¨ÀDnÌ·£ÉI¹­~=öû[ˆè‰QÂU"ìèQ¤6¶½AÚo÷óKÝš®µ¾;J8ýÛÀÙíÿÐáÛ¡s|PÓƒžÌô`wÿF­ó‡4§eÜ$ÂO4=„ムX¹÷÷/¯öOkØ ¸€Û ø±èlÿ%ÏñÁï¼£ÿÕïOž MJÚII7)é&¾Ýûò݇þk¯müŸDOE endstream endobj 1104 0 obj << /Producer (pdfTeX-1.40.25) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20250323191610Z) /ModDate (D:20250323191610Z) /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) kpathsea version 6.3.5) >> endobj 1094 0 obj << /Type /ObjStm /N 10 /First 88 /Length 459 /Filter /FlateDecode >> stream xÚ•“M‹Û0†ïþ:î^l}KÁÐz¡”î&!›ž–`[†|,kçÐ_YÉtÛÚM[ry2Öè}ßÄ(B £ SrM"E¬X¢t<DKF£”+Õœ—R'³Y’}i뎼0ªePX…~­4‚A°0À&ÉÛCÛ‡þ»ÎW}{:¦,å÷ä®ëßÎU¿\<-yY®ü.|)ËöØœJ§9P¦¼ó²ò­å¶2žÖŽ6´nœošûM’ç¿83ôªjGèÞ¨‘³^D­xQ[%ÓÞÔZ:!•k¸`C’ó£©Hå„=“Á1“+XŒ`ÙÈÞÏ2EÍ÷êÇ”‡Ÿ [œ‚Å)Xœ‚ÅZ4gÍ”ðï*0R/Rb³ u{û¡q*Î¥.&.Äa p߀I“ÂhÍź(Ÿ×«ÏóOÿ´5ÀÁn ì¯æYàšexƒóyãºß…žø€Ã-X]{õ$+\ïö§]’-Ý·CTÄ I¶8÷ûöx)ÙKiî¾»¼ÿøhy:Õ>ûÚy<‹në÷Ýl–Íχî…xÎ\žóoy.#<äù&xɯþø!Z'œý°øDš6÷ endstream endobj 1105 0 obj << /Type /XRef /Index [0 1106] /Size 1106 /W [1 3 1] /Root 1103 0 R /Info 1104 0 R /ID [<1BC2C23AC4A919669180691C0F25B601> <1BC2C23AC4A919669180691C0F25B601>] /Length 2611 /Filter /FlateDecode >> stream xÚ%˜[h]YÆÏZç$iÓ¦é%mš¤I›ô~K“´iîMs;M›¦íîiÒ$½¤MPÁÛÀ@ÑoaPF§¾,gDFpœ‡Q|°3ŽèBt :>,Qtú¢ƒ0Ôýûæå—½¾³³ÏÞëûþkÿÏ* …§¶P°S(4æ a«-”»Ñ °hKh'A íÚ †5 íÚq†u`C~ÙJ íàmÚQ†›Àf´#hG6€-hÇÑ3l[Ñ΢b¸ lGG;ÈphB»€v€áN° íÚ~†Í`7Z­‹a hE[@ëdØö ÝDÛǰt ÝFÛËP؇v­ƒ¡.Ð…¦yÑ¿éËó»2Þ ía¨?„¶M_©‡>‚v­•¡&ìZ7šnW“}­m7CÕÖ‹¦G=zÐVÑv1ì}¶`3Ý‹¦é48ƒfÑšöƒ³h3hšâ0ˆvm;Ã!0ŒvMöŒ€Ñ\sÊÁV†càZ-š¬çÑ6 ma8&ÑêÑ‹)0¶m3ÃPFkBS¤.€Y´f´z†Á%´Q4Åq\F›@ÛÀp\A»„¦(_×ÐæÑH{>E9®£Ý@ST@>´IuD¥Ø°ˆ¦{V ÝKhºgªÌ.ƒ4ݳÊï¸6ŒF…Ú;à.Z~CŸÎpÜCËÐÖÞkh7Ð4ääP0æ7 |p“î¡ñm!¿buëî4¨Ø·˜Bm‡–ž2¨Ø™—À„f20Ź˜Lag%_UZåèýrŽg{r<|9Ç÷žäøÓƒü6ý-ÇGŸ~+ÇwjôÛŒy㤎¹=åu†D/l7æ‡?( aT ¶<‚¨€@ij&PL* ”_ .µ¨ä@…j?P—Õ"Põ%Pƒ)Py5,PoU/Peu2P[¡PQ¡PGá  zÂY0 A“1>®¤ŽEF¥Î "œ”A˜„?L"Ê€ ‡Y@¼Ã%@¨Ãe0dÌÛOõEW)×Ù šSnr óÆüü“ú_¥DXæHÿ»¦ÛHYæj€ä£`œ³ ŠÙ]c~5§++f÷¹¨nw#=Â:'ŒíjçÝTÙ¬1|GÃ"¨åd]¹l`XáH¯“zcž<ÔÉ›€^'ºÉ Á˜w¾©OõNÙ ô†h¹=þ‚>ÝÍEçÀE†Í<¯Þm ´ó·u²^ztóÏ{Òö½öVþÊAÀz_aá®tó¯»:ù08Æ·Ý`¥¦ÄÝáƒSà¤1ÿiÒÉ,ð•^ÐNƒ3`ôóßÎëçûÀ ÷–®—gãýA2 ÆÀ5Öôëƒs`L[“¤MÍÆŒ±µÿ“Væž8º .»ñU}0®€e0olýwõÁUpð¨•E°ÖÀбÏé¼[àX÷™—ZŽÖmÌ)^°€Xø¨1öÃú€äø:c iIó®¾\ÍÝã`LÚ²Œ>,»@žÕÝ€ŒÞ'ÓÝM&4‰j”Xá2Þ$Ù ËXú²‹Æ>xAß;2Pú›`Üw¸”nœ0d÷½O¶ŽQ\Å`¼\5ö¹Ÿé,sDÅ)%˜âˆ…k5ö•×t yqäÅ1ÅŽ)v̸ÛbìóÓ)˜çvÿ*G¸ê0Êa”Ã(§ a#/™tå”+Qo £…ð opari2_region_info.h /CI/build/_work/src/src/opari-lib-dummy/ opari2__region__info_8h OPARI2_Region_info pomp2_lib.h /CI/build/_work/src/include/opari2/ pomp2__lib_8h void * OPARI2_Region_handle pomp2__lib_8h.html a8ae6e761e844cad11e306b839b7065d9 void POMP2_Assign_handle pomp2__lib_8h.html a4ced2800b4c94cb22193e4a8b9d7a0b2 (POMP2_Region_handle *pomp2_handle, const char ctc_string[]) POMP2_Task_handle POMP2_Get_new_task_handle pomp2__lib_8h.html a45c8a37325b33db03c8dc30db0d3f385 (void) size_t POMP2_Get_num_regions pomp2__lib_8h.html a5677283f76b1775959efa672bd0595af (void) void POMP2_Init_regions pomp2__lib_8h.html a1ee3934a87de5fb3e14bbef827fc0f4c (void) const char * POMP2_Get_opari2_version pomp2__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) size_t POMP2_Get_num_regions pomp2__lib_8h.html a5677283f76b1775959efa672bd0595af (void) void POMP2_Init_regions pomp2__lib_8h.html a1ee3934a87de5fb3e14bbef827fc0f4c (void) const char * POMP2_Get_opari2_version pomp2__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) pomp2_region_info.h /CI/build/_work/src/src/opari-lib-dummy/ pomp2__region__info_8h opari2_region_info.h POMP2_Region_info #define CTC_OMP_TOKENS pomp2__region__info_8h.html ac86b4fc4c04b1049b788a9fec71dc8fc POMP2_DefaultSharing_type pomp2__region__info_8h.html a93b8b7fd1fc771580ef1e2c6eefecc59 POMP2_Region_type pomp2__region__info_8h.html a680a7412e9daca09b793c6538fb7b381 POMP2_Schedule_type pomp2__region__info_8h.html a9bada01c672e9a100dc7903ba06e76a7 void ctcString2RegionInfo pomp2__region__info_8h.html ada8fce980385bdc6598a889bc2ba7892 (const char ctcString[], POMP2_Region_info *regionInfo) void freePOMP2RegionInfoMembers pomp2__region__info_8h.html a328c8dd30c3edae6a9c076f990ea36c6 (POMP2_Region_info *regionInfo) const char * pomp2defaultSharingType2String pomp2__region__info_8h.html ad0856c731e68eef9a148ab79cd0329b1 (POMP2_DefaultSharing_type defaultSharingType) const char * pomp2RegionType2String pomp2__region__info_8h.html a41324a61d69375fcf4d905a2db32a1b5 (POMP2_Region_type regionType) const char * pomp2ScheduleType2String pomp2__region__info_8h.html a5a45288617878806cd3773be2bad8ec4 (POMP2_Schedule_type scheduleType) pomp2_user_lib.h /CI/build/_work/src/include/opari2/ pomp2__user__lib_8h void * OPARI2_Region_handle pomp2__user__lib_8h.html a8ae6e761e844cad11e306b839b7065d9 size_t POMP2_USER_Get_num_regions pomp2__user__lib_8h.html ae0dfec7d859997b69bbcda438dca1867 (void) void POMP2_USER_Init_regions pomp2__user__lib_8h.html af54040ee98b4278d5b991a36b813357c (void) const char * POMP2_Get_opari2_version pomp2__user__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) void POMP2_Finalize pomp2__user__lib_8h.html ae172c40c40ac62b7587e1b11abfff559 (void) void POMP2_Init pomp2__user__lib_8h.html a973f7b06d14fddd52ed74ee50529c284 (void) void POMP2_Off pomp2__user__lib_8h.html a07b65ff3417a1f6924b4a1754a5b6260 (void) void POMP2_On pomp2__user__lib_8h.html a540cdb76c25649773dcec9fd6a9fac03 (void) void POMP2_Begin pomp2__user__lib_8h.html a103798c6fcdee1063ff8baf88f13d8ea (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) void POMP2_End pomp2__user__lib_8h.html a94e19dfab1ba91569bc18c057ca5ad37 (POMP2_USER_Region_handle *pomp2_handle) void POMP2_USER_Assign_handle pomp2__user__lib_8h.html a7589f2c2aa05b5bed5c15c9e4f07b701 (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) size_t POMP2_USER_Get_num_regions pomp2__user__lib_8h.html ae0dfec7d859997b69bbcda438dca1867 (void) void POMP2_USER_Init_regions pomp2__user__lib_8h.html af54040ee98b4278d5b991a36b813357c (void) const char * POMP2_Get_opari2_version pomp2__user__lib_8h.html a64540be40e1ccb2a6084608e6b517ca4 (void) void POMP2_Finalize pomp2__user__lib_8h.html ae172c40c40ac62b7587e1b11abfff559 (void) void POMP2_Init pomp2__user__lib_8h.html a973f7b06d14fddd52ed74ee50529c284 (void) void POMP2_Off pomp2__user__lib_8h.html a07b65ff3417a1f6924b4a1754a5b6260 (void) void POMP2_On pomp2__user__lib_8h.html a540cdb76c25649773dcec9fd6a9fac03 (void) void POMP2_Begin pomp2__user__lib_8h.html a103798c6fcdee1063ff8baf88f13d8ea (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) void POMP2_End pomp2__user__lib_8h.html a94e19dfab1ba91569bc18c057ca5ad37 (POMP2_USER_Region_handle *pomp2_handle) void POMP2_USER_Assign_handle pomp2__user__lib_8h.html a7589f2c2aa05b5bed5c15c9e4f07b701 (POMP2_USER_Region_handle *pomp2_handle, const char ctc_string[]) pomp2_user_region_info.h /CI/build/_work/src/src/opari-lib-dummy/ pomp2__user__region__info_8h opari2_region_info.h POMP2_USER_Region_info #define CTC_USER_REGION_TOKENS pomp2__user__region__info_8h.html a93fefda49d7492bf924809e8b6b6ee77 POMP2_USER_Region_type pomp2__user__region__info_8h.html ae76f4de310f343b64c6541b68ef60600 void ctcString2UserRegionInfo pomp2__user__region__info_8h.html adf68daa6bcbb49e313189a50c692217a (const char ctcString[], POMP2_USER_Region_info *regionInfo) void freePOMP2UserRegionInfoMembers pomp2__user__region__info_8h.html af2baca6fe4127338e932a68d84af374f (POMP2_USER_Region_info *regionInfo) const char * pomp2UserRegionType2String pomp2__user__region__info_8h.html aea1b2a34dad1e46141aa650948fbacfb (POMP2_USER_Region_type regionType) OPARI2_Region_info structOPARI2__Region__info.html char * mEndFileName structOPARI2__Region__info.html aa33fdbf1549f6429201ee0293e7c3fc6 unsigned mEndLine1 structOPARI2__Region__info.html a79fa5ad783540110f20895c447d1744b unsigned mEndLine2 structOPARI2__Region__info.html a69ae9b2133cfc45a05348c9e942cff14 char * mStartFileName structOPARI2__Region__info.html afe9ce03c86b5a601fc5d5a02f364d10e unsigned mStartLine1 structOPARI2__Region__info.html afe9d460b353581336ef01828f36c532a unsigned mStartLine2 structOPARI2__Region__info.html a00a8fe35010120cc7bf9a69aab78428d POMP2_Region_info structPOMP2__Region__info.html char * mStartFileName structPOMP2__Region__info.html a6034a8b8c7b55bc7979977b9334958db unsigned mStartLine1 structPOMP2__Region__info.html a9f0d2a2d58e6ee5e23b2b1e0a1d4ebc1 unsigned mStartLine2 structPOMP2__Region__info.html a5685e6673c14de2660bf224eaa554b76 char * mEndFileName structPOMP2__Region__info.html a8c0105ca03822a142662e80953d75358 unsigned mEndLine1 structPOMP2__Region__info.html a94d58f08bbf8e8529fedb7cbccffd017 unsigned mEndLine2 structPOMP2__Region__info.html ade27fd75d1537732a2459c78f818eb8f POMP2_Region_type mRegionType structPOMP2__Region__info.html a34a3ca3ada9bbf45ae4f1e8248b13e70 bool mHasCopyIn structPOMP2__Region__info.html a2f7f3d1dc98587dbff386c6d8e38b96b bool mHasCopyPrivate structPOMP2__Region__info.html a4bf7f82ec65b0115b0a929e307c1bf58 bool mHasIf structPOMP2__Region__info.html afaf850aae51e3e80f1566ee8fbf836f4 bool mHasFirstPrivate structPOMP2__Region__info.html a4087657089faf52b1d6edc383388ff85 bool mHasLastPrivate structPOMP2__Region__info.html a8e6ec810e13638ac587810f23678487c bool mHasNoWait structPOMP2__Region__info.html a5f2a12e99defcacafcba38d7c161e89d bool mHasNumThreads structPOMP2__Region__info.html af9ecc5af683aba508fb892b2738bbdc5 bool mHasOrdered structPOMP2__Region__info.html a24a152ec56e0eafe41326d1d0329bc9b bool mHasReduction structPOMP2__Region__info.html a629015eae4cec0d4bc7e0da0f0dfaeff bool mHasShared structPOMP2__Region__info.html a127860ebef450e083a0100ddbb3b42a0 bool mHasCollapse structPOMP2__Region__info.html a80c536c6186f3c61f0358b073a302571 bool mHasUntied structPOMP2__Region__info.html a8790f498cf86eb6808a9df5d01449677 POMP2_Schedule_type mScheduleType structPOMP2__Region__info.html aeaa2f47c4731b4e10dd3bfb35a2024a3 POMP2_DefaultSharing_type mDefaultSharingType structPOMP2__Region__info.html abd19d390e07d1ed760ce07bc8e1ec915 char * mUserGroupName structPOMP2__Region__info.html ae8cebc481d4414f0857d96080ca16a8a unsigned mNumSections structPOMP2__Region__info.html a63d659e3d853a16e7dc2364a345af231 char * mCriticalName structPOMP2__Region__info.html a4e4565e6d2c2881d007ab343769f6766 char * mStartFileName structPOMP2__Region__info.html a6034a8b8c7b55bc7979977b9334958db unsigned mStartLine1 structPOMP2__Region__info.html a9f0d2a2d58e6ee5e23b2b1e0a1d4ebc1 unsigned mStartLine2 structPOMP2__Region__info.html a5685e6673c14de2660bf224eaa554b76 char * mEndFileName structPOMP2__Region__info.html a8c0105ca03822a142662e80953d75358 unsigned mEndLine1 structPOMP2__Region__info.html a94d58f08bbf8e8529fedb7cbccffd017 unsigned mEndLine2 structPOMP2__Region__info.html ade27fd75d1537732a2459c78f818eb8f POMP2_Region_type mRegionType structPOMP2__Region__info.html a34a3ca3ada9bbf45ae4f1e8248b13e70 bool mHasCopyIn structPOMP2__Region__info.html a2f7f3d1dc98587dbff386c6d8e38b96b bool mHasCopyPrivate structPOMP2__Region__info.html a4bf7f82ec65b0115b0a929e307c1bf58 bool mHasIf structPOMP2__Region__info.html afaf850aae51e3e80f1566ee8fbf836f4 bool mHasFirstPrivate structPOMP2__Region__info.html a4087657089faf52b1d6edc383388ff85 bool mHasLastPrivate structPOMP2__Region__info.html a8e6ec810e13638ac587810f23678487c bool mHasNoWait structPOMP2__Region__info.html a5f2a12e99defcacafcba38d7c161e89d bool mHasNumThreads structPOMP2__Region__info.html af9ecc5af683aba508fb892b2738bbdc5 bool mHasOrdered structPOMP2__Region__info.html a24a152ec56e0eafe41326d1d0329bc9b bool mHasReduction structPOMP2__Region__info.html a629015eae4cec0d4bc7e0da0f0dfaeff bool mHasShared structPOMP2__Region__info.html a127860ebef450e083a0100ddbb3b42a0 bool mHasCollapse structPOMP2__Region__info.html a80c536c6186f3c61f0358b073a302571 bool mHasUntied structPOMP2__Region__info.html a8790f498cf86eb6808a9df5d01449677 POMP2_Schedule_type mScheduleType structPOMP2__Region__info.html aeaa2f47c4731b4e10dd3bfb35a2024a3 POMP2_DefaultSharing_type mDefaultSharingType structPOMP2__Region__info.html abd19d390e07d1ed760ce07bc8e1ec915 char * mUserGroupName structPOMP2__Region__info.html ae8cebc481d4414f0857d96080ca16a8a unsigned mNumSections structPOMP2__Region__info.html a63d659e3d853a16e7dc2364a345af231 char * mCriticalName structPOMP2__Region__info.html a4e4565e6d2c2881d007ab343769f6766 POMP2_USER_Region_info structPOMP2__USER__Region__info.html char * mStartFileName structPOMP2__USER__Region__info.html a2f92dfc397a0dbc804e55c4ab7ac2eef unsigned mStartLine1 structPOMP2__USER__Region__info.html adad6ea05f301f28eabb3896fe0fe712f unsigned mStartLine2 structPOMP2__USER__Region__info.html afd6302572b35de605e7442e0824b7ae0 char * mEndFileName structPOMP2__USER__Region__info.html aecc81da4f774c976d884b6ae537d5cf7 unsigned mEndLine1 structPOMP2__USER__Region__info.html a199ea4217019eda9cf853871a26e4340 unsigned mEndLine2 structPOMP2__USER__Region__info.html aa6690583d3f6a7766d016dd527ffd4e2 char * mUserRegionName structPOMP2__USER__Region__info.html a42d60ea34302fba9dc19dfa189c79aae char * mStartFileName structPOMP2__USER__Region__info.html a2f92dfc397a0dbc804e55c4ab7ac2eef unsigned mStartLine1 structPOMP2__USER__Region__info.html adad6ea05f301f28eabb3896fe0fe712f unsigned mStartLine2 structPOMP2__USER__Region__info.html afd6302572b35de605e7442e0824b7ae0 char * mEndFileName structPOMP2__USER__Region__info.html aecc81da4f774c976d884b6ae537d5cf7 unsigned mEndLine1 structPOMP2__USER__Region__info.html a199ea4217019eda9cf853871a26e4340 unsigned mEndLine2 structPOMP2__USER__Region__info.html aa6690583d3f6a7766d016dd527ffd4e2 char * mUserRegionName structPOMP2__USER__Region__info.html a42d60ea34302fba9dc19dfa189c79aae INSTALL Installation INSTALL USAGE Basic Usage USAGE CTC_STRING CTC-String Decoding CTC_STRING OpenMP LINKING Linking to a Measurement System LINKING POMP_USER POMP User Instrumentation POMP_USER EXAMPLE Example Code EXAMPLE NEWS Latest Release News NEWS MODULARIZTION LINK_STEP POMP2 POMP2_Parallel_fork pomp_tpd TASKING Preprocessing_of_source_files installationfile OPARI2 INSTALL installationfile index OPARI2 - Introduction and Contents index content SUMMARY opari2-2.0.9/doc/PaxHeaders/Makefile.inc.am0000644000000000000000000000013214770056734015362 xustar0030 mtime=1742757340.079533574 30 atime=1742757340.151533135 30 ctime=1742757366.931369905 opari2-2.0.9/doc/Makefile.inc.am0000644000175100001440000002036414770056734015717 0ustar00builderusers## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2009-2011, ## RWTH Aachen University, Germany ## ## Copyright (c) 2009-2011, ## Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany ## ## Copyright (c) 2009-2011, 2019-2020, ## Technische Universitaet Dresden, Germany ## ## Copyright (c) 2009-2011, ## University of Oregon, Eugene, USA ## ## Copyright (c) 2009-2011, 2015, 2019, ## Forschungszentrum Juelich GmbH, Germany ## ## Copyright (c) 2009-2011, ## German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany ## ## Copyright (c) 2009-2011, ## Technische Universitaet Muenchen, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## ## file doc/doxygen-user/Makefile.inc.am ############################################################################### ## doxygen related targets ## ## In the following conditional we must distinguish if we are in "developer ## mode", i.e. if we are working on a svn working copy, or if we are in "user ## mode", i.e. we are working on a tarball. ## ## In developer mode we can create doxygen and pdf user documentation (make ## doxygen-user) that will be (automatically) included in the distribution at ## make dist. When creating a distribution, the developer should make sure ## that she has doxygen and related tools e.g. pdflatex in PATH in order to ## generate a complete documentation, see also ## build-config/common/m4/ac_scorep_doxygen.m4. ## ## make install is ignorant of documentation issues in developer mode. ## ## The user gets ready to install documentation in the tarball, i.e. there is no ## need to run doxygen and pdflatex in user mode. In user mode the provided ## documentation is just copied to a subdirectory of $prefix. DOC_SRC_DIR = $(srcdir)/doc doxygen-uninstall: rm -rf $(DESTDIR)$(docdir) if GIT_CONTROLLED USER_DOC_DIR = $(top_distdir)$(ac_scorep_doxygen_distdir)/doc doxygen-user-install: doxygen-user-generate: doxygen-user-pdf doxygen-user-html-compress copy-revision-file-to-dist update-revision: @$(am__tty_colors); \ if $(AM_V_P); then echo "cd $(srcdir) && git describe --always --dirty > 'build-config/REVISION'"; \ else echo " GEN $${mgn}$(srcdir)/build-config/REVISION$$std"; fi; \ cd $(srcdir) && git describe --always --dirty > "build-config/REVISION" copy-revision-file-to-dist: @$(MKDIR_P) "$(distdir)/build-config/" @cp -p "$(srcdir)/build-config/REVISION" "$(distdir)/build-config/" @case `cat "$(distdir)/build-config/REVISION"` in *-dirty) \ echo >&2 "WARNING: distribution does not match a single, unmodified revision.";; \ esac doxygen-user-html-compress: $(AM_V_at)if test -d "$(USER_DOC_DIR)/html"; then \ cd "$(USER_DOC_DIR)"; tar czf html.tar.gz html; rm -rf html/; \ fi doxygen-project-number: update-revision $(AM_V_at)echo "PROJECT_NUMBER = \"@PACKAGE_VERSION@ (revision `cat $(srcdir)/build-config/REVISION`)\"" > doc/doxygen-project-number.cfg CLEANFILES += doc/doxygen-project-number.cfg doxygen-user-clean: rm -rf $(USER_DOC_DIR)/* if HAVE_DOXYGEN OPARI2_V_DOXYGEN = $(opari2__v_DOXYGEN_@AM_V@) opari2__v_DOXYGEN_ = $(opari2__v_DOXYGEN_@AM_DEFAULT_V@) opari2__v_DOXYGEN_0 = @$(am__tty_colors); echo " DOXYGEN $${blu}$@$$std"; opari2__v_DOXYGEN_1 = OPARI2_V_DEVNULL = $(opari2__v_DEVNULL_@AM_V@) opari2__v_DEVNULL_ = $(opari2__v_DEVNULL_@AM_DEFAULT_V@) opari2__v_DEVNULL_0 = >/dev/null 2>&1 opari2__v_DEVNULL_1 = doxygen-user: doxygen-project-number doc/doxygen-user/main.dox doc/doxygen-user.cfg $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/tags" $(AM_V_at)echo "OUTPUT_DIRECTORY = $(USER_DOC_DIR)" > doc/doxygen-user-at-make-time.cfg $(AM_V_at)echo "GENERATE_TAGFILE = $(USER_DOC_DIR)/tags/@PACKAGE@.tag" >> doc/doxygen-user-at-make-time.cfg $(AM_V_at)cat doc/doxygen-project-number.cfg doc/doxygen-user-at-make-time.cfg doc/doxygen-user.cfg > doc/doxygen-user-html.cfg $(AM_V_at)$(MKDIR_P) "$(USER_DOC_DIR)/html" $(AM_V_at)cp $(abs_srcdir)/doc/images/* $(USER_DOC_DIR)/html $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ else echo "QUIET = YES"; fi >>doc/doxygen-user-html.cfg $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-html.cfg CLEANFILES += doc/doxygen-user-html.cfg doc/doxygen-user-at-make-time.cfg doxygen.err else !HAVE_DOXYGEN doxygen-user: echo "WARNING: doxygen not available. Cannot generate documentation." >&2 endif !HAVE_DOXYGEN if HAVE_DOXYGEN_LATEX OPARI2_V_pdflatex = $(opari2__v_pdflatex_@AM_V@) opari2__v_pdflatex_ = $(opari2__v_pdflatex_@AM_DEFAULT_V@) opari2__v_pdflatex_0 = -interaction batchmode opari2__v_pdflatex_1 = -interaction nonstopmode doxygen-user-pdf: doxygen-user $(AM_V_at)cat doc/doxygen-user-html.cfg > doc/doxygen-user-pdf.cfg $(AM_V_at)echo "ENABLED_SECTIONS = LATEX" >> doc/doxygen-user-pdf.cfg $(AM_V_at)echo "GENERATE_HTML = NO" >> doc/doxygen-user-pdf.cfg $(AM_V_at)cp $(DOC_SRC_DIR)/license.tex $(USER_DOC_DIR)/pdf/ -$(AM_V_at)cp $(DOC_SRC_DIR)/images/project_logo.pdf $(USER_DOC_DIR)/pdf/ $(AM_V_at)echo "LATEX_CMD_NAME = \"pdflatex -file-line-error $(OPARI2_V_pdflatex)\"" >>doc/doxygen-user-pdf.cfg $(AM_V_at)if $(AM_V_P); then echo "QUIET = NO"; \ else echo "QUIET = YES"; \ echo "MAKEINDEX_CMD_NAME = \"makeindex -q\""; \ fi >>doc/doxygen-user-pdf.cfg $(OPARI2_V_DOXYGEN)$(DOXYGEN) doc/doxygen-user-pdf.cfg $(AM_V_at)cd "$(USER_DOC_DIR)/pdf" && \ make $(OPARI2_V_DEVNULL) && \ mv refman.pdf ../ && \ rm -f * && \ mv ../refman.pdf @PACKAGE@.pdf else !HAVE_DOXYGEN_LATEX doxygen-user-pdf: doxygen-user echo "WARNING: pdflatex not available. Cannot generate doxygen pdf documentation." >&2 if test -d "$(USER_DOC_DIR)/pdf"; then rm -rf "$(USER_DOC_DIR)/pdf"; fi endif !HAVE_DOXYGEN_LATEX else !GIT_CONTROLLED doxygen-user-clean: doxygen-user-generate: doxygen-user-pdf: doxygen-user-install: $(AM_V_at)if test -f "$(DOC_SRC_DIR)/html.tar.gz"; then \ $(MKDIR_P) $(DESTDIR)$(docdir); \ $(INSTALL_DATA) $(DOC_SRC_DIR)/html.tar.gz $(DESTDIR)$(docdir)/html.tar.gz; \ cd $(DESTDIR)$(docdir); \ tar xzf html.tar.gz; \ rm -f html.tar.gz; \ fi $(AM_V_at)if test -d "$(DOC_SRC_DIR)"; then \ cd $(DOC_SRC_DIR); \ dirs="pdf tags"; \ cd -; \ for i in $$dirs; do \ if test -d "$(DOC_SRC_DIR)/$$i"; then \ $(MKDIR_P) $(DESTDIR)$(docdir)/$$i; \ cd $(DOC_SRC_DIR)/$$i; \ files=`find . -type f`; \ cd -; \ for j in $$files; do \ $(INSTALL_DATA) $(DOC_SRC_DIR)/$$i/$$j $(DESTDIR)$(docdir)/$$i/$$j; \ done; \ fi; \ done; \ fi copy-revision-file-to-dist: endif !GIT_CONTROLLED ## ## ############################################################################### opari2-2.0.9/doc/PaxHeaders/example0000644000000000000000000000013014770056766014137 xustar0029 mtime=1742757366.92736993 30 atime=1742757371.935339406 29 ctime=1742757366.92736993 opari2-2.0.9/doc/example/0000755000175100001440000000000014770056766014546 5ustar00builderusersopari2-2.0.9/doc/example/PaxHeaders/pomp0000644000000000000000000000013014770056767015113 xustar0029 mtime=1742757367.31136759 30 atime=1742757371.935339406 29 ctime=1742757367.31136759 opari2-2.0.9/doc/example/pomp/0000755000175100001440000000000014770056767015522 5ustar00builderusersopari2-2.0.9/doc/example/pomp/PaxHeaders/Makefile.in0000644000000000000000000000013114770056734017230 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 29 ctime=1742757367.31136759 opari2-2.0.9/doc/example/pomp/Makefile.in0000644000175100001440000000671414770056734017571 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # Copyright (c) 2009-2013, # RWTH Aachen University, Germany # Copyright (c) 2009-2013, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # Copyright (c) 2009-2013, 2020, # Technische Universitaet Dresden, Germany # Copyright (c) 2009-2013, # University of Oregon, Eugene, USA # Copyright (c) 2009-2013, 2016, # Forschungszentrum Juelich GmbH, Germany # Copyright (c) 2009-2013, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # Copyright (c) 2009-2013, # Technische Universitaet Muenchen, Germany # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. ###################################################### # Compiler # ###################################################### CC=@CC@ FORTRAN=@FC@ OPENMP_C_FLAG=@OPENMP_CFLAGS@ @CFLAGS@ OPENMP_F_FLAG=@OPENMP_FFLAGS@ @FFLAGS@ ###################################################### # OPARI & DUMMY LIBRARY # ###################################################### POMP_INC=-I@prefix@/include POMPLIBDIR=@prefix@/share/doc/opari2/example/lib POMPLIB=-L${POMPLIBDIR} -lpomp BINDIR=@BINDIR@ OPARI=$(BINDIR)/opari2 OPARI2_CONFIG=$(BINDIR)/opari2-config # We need to make sure that we use the right versions # of nm, awk and grep. opari2-config returns the right # commands with the necessary options. NM=`$(OPARI2_CONFIG) --nm` AWK_SCRIPT=`$(OPARI2_CONFIG) --region-initialization` all: c fortran ###################################################### # C EXAMPLE # ###################################################### c: example_c example_c_inst ./example_c ./example_c_inst # Build without instrumentation example_c: example.c $(CC) $(OPENMP_C_FLAG) $? -o $@ # Linking step example_c_inst: example_c.mod.o pompregions_c.o $(CC) $(OPENMP_C_FLAG) $? $(POMPLIB) -o $@ pompregions_c.o : pompregions_c.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_c.c : example_c.mod.o $(NM) example_c.mod.o | $(AWK_SCRIPT) > pompregions_c.c example_c.mod.o: example.mod.c $(CC) $(OPENMP_C_FLAG) $(POMP_INC) -c $? -o $@ example.mod.c: example.c $(OPARI) example.c ###################################################### # FORTRAN EXAMPLE # ###################################################### fortran: example_f example_f_inst # Build without instrumentation example_f: example.f90 $(FORTRAN) $(OPENMP_F_FLAG) $? -o $@ # Linking step example_f_inst: example_f.mod.o pompregions_f.o $(FORTRAN) $(OPENMP_F_FLAG) $? $(POMPLIB) -o $@ pompregions_f.o : pompregions_f.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_f.c : example_f.mod.o $(NM) example_f.mod.o | $(AWK_SCRIPT) > pompregions_f.c example_f.mod.o : example.mod.F90 $(FORTRAN) $(OPENMP_F_FLAG) -c -o $@ $? example.mod.F90: example.f90 $(OPARI) example.f90 ###################################################### clean: rm -rf example_? rm -rf example_?_inst rm -rf example.mod.* rm -rf example.*.opari.inc rm -rf pompregions_?.c rm -rf *.o opari2-2.0.9/doc/example/pomp/PaxHeaders/Makefile.inc.am0000644000000000000000000000013214770056734017770 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 30 ctime=1742757367.275367809 opari2-2.0.9/doc/example/pomp/Makefile.inc.am0000644000175100001440000000101114770056734020311 0ustar00builderusers## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2020, ## Technische Universitaet Dresden, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## examplepompdir = $(docdir)/example/pomp examplepomp_DATA = \ $(SRC_ROOT)doc/example/pomp/example.c \ $(SRC_ROOT)doc/example/pomp/example.f90 \ ../doc/example/pomp/Makefile opari2-2.0.9/doc/example/pomp/PaxHeaders/example.f900000644000000000000000000000013114770056734017136 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 29 ctime=1742757367.18336837 opari2-2.0.9/doc/example/pomp/example.f900000644000175100001440000000226314770056734017472 0ustar00builderusers!> !> This file is part of the Score-P software (http://www.score-p.org) !> !> Copyright (c) 2009-2011, !> RWTH Aachen University, Germany !> !> Copyright (c) 2009-2011, !> Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Dresden, Germany !> !> Copyright (c) 2009-2011, !> University of Oregon, Eugene, USA !> !> Copyright (c) 2009-2011, 2013 !> Forschungszentrum Juelich GmbH, Germany !> !> Copyright (c) 2009-2011, !> German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Muenchen, Germany !> !> This software may be modified and distributed under the terms of !> a BSD-style license. See the COPYING file in the package base !> directory for details. SUBROUTINE FOO INTEGER i !$POMP INST BEGIN(FOO) WRITE (*,*) 'Hello from FOO.' ! work is done here if (i.eq.0) THEN !$POMP INST ALTEND(FOO) RETURN END IF ! other work is done here !$POMP INST END(FOO) END PROGRAM EXAMPLE_USER_INSTRUMENTATION !$POMP INST INIT WRITE (*,*) 'Hello from PROGRAM.' CALL FOO() END opari2-2.0.9/doc/example/pomp/PaxHeaders/example.c0000644000000000000000000000013214770056734016763 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 30 ctime=1742757367.179368394 opari2-2.0.9/doc/example/pomp/example.c0000644000175100001440000000267614770056734017326 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ #include /*Disable unknown pragma warning for the intel compiler. * This avoids warnings for pomp pragmas if the file is * not preprocessed with opari.*/ #ifdef __INTEL_COMPILER #pragma warning disable 161 #endif int foo() { int i = 0; #pragma pomp inst begin(foo) //usefull work could be done here which changes i printf( "Hello from foo.\n" ); if ( i == 0 ) { #pragma pomp inst altend(foo) return 42; } //other work might be done here #pragma pomp inst end(foo) return i; } int main( int argc, char** argv ) { #pragma pomp inst init printf( "Hello from main.\n" ); foo(); return 0; } opari2-2.0.9/doc/example/PaxHeaders/openmp0000644000000000000000000000013214770056767015440 xustar0030 mtime=1742757367.307367613 30 atime=1742757371.935339406 30 ctime=1742757367.307367613 opari2-2.0.9/doc/example/openmp/0000755000175100001440000000000014770056767016045 5ustar00builderusersopari2-2.0.9/doc/example/openmp/PaxHeaders/Makefile.in0000644000000000000000000000013214770056734017554 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 30 ctime=1742757367.307367613 opari2-2.0.9/doc/example/openmp/Makefile.in0000644000175100001440000000676614770056734020123 0ustar00builderusers# This file is part of the Score-P software (http://www.score-p.org) # Copyright (c) 2009-2013, # RWTH Aachen University, Germany # Copyright (c) 2009-2013, # Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany # Copyright (c) 2009-2013, 2020, # Technische Universitaet Dresden, Germany # Copyright (c) 2009-2013, # University of Oregon, Eugene, USA # Copyright (c) 2009-2013, 2016, 2023, # Forschungszentrum Juelich GmbH, Germany # Copyright (c) 2009-2013, # German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany # Copyright (c) 2009-2013, # Technische Universitaet Muenchen, Germany # This software may be modified and distributed under the terms of # a BSD-style license. See the COPYING file in the package base # directory for details. ###################################################### # Compiler # ###################################################### CC=@CC@ FORTRAN=@FC@ OPENMP_C_FLAG=@OPENMP_CFLAGS@ @CFLAGS@ OPENMP_F_FLAG=@OPENMP_FFLAGS@ @FFLAGS@ ###################################################### # OPARI & DUMMY LIBRARY # ###################################################### POMP_INC=-I@prefix@/include POMPLIBDIR=@prefix@/share/doc/opari2/example/lib POMPLIB=-L${POMPLIBDIR} -lpomp BINDIR=@BINDIR@ OPARI=$(BINDIR)/opari2 OPARI2_CONFIG=$(BINDIR)/opari2-config # We need to make sure that we use the right versions # of nm, awk and grep. opari2-config returns the right # commands with the necessary options. NM=`$(OPARI2_CONFIG) --nm` AWK_SCRIPT=`$(OPARI2_CONFIG) --region-initialization` all: c fortran ###################################################### # C EXAMPLE # ###################################################### c: example_c example_c_inst OMP_NUM_THREADS=4 ./example_c OMP_NUM_THREADS=4 ./example_c_inst # Build without instrumentation example_c: example.c $(CC) $(OPENMP_C_FLAG) $? -o $@ # Linking step example_c_inst: example_c.mod.o pompregions_c.o $(CC) $(OPENMP_C_FLAG) $? $(POMPLIB) -o $@ pompregions_c.o : pompregions_c.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_c.c : example_c.mod.o $(NM) example_c.mod.o | $(AWK_SCRIPT) > pompregions_c.c example_c.mod.o: example.mod.c $(CC) $(OPENMP_C_FLAG) $(POMP_INC) -c $? -o $@ example.mod.c: example.c $(OPARI) example.c ###################################################### # FORTRAN EXAMPLE # ###################################################### fortran: example_f example_f_inst # Build without instrumentation example_f: example.f90 $(FORTRAN) $(OPENMP_F_FLAG) $? -o $@ # Linking step example_f_inst: example_f.mod.o pompregions_f.o $(FORTRAN) $(OPENMP_F_FLAG) $? $(POMPLIB) -o $@ pompregions_f.o : pompregions_f.c $(CC) $(POMP_INC) -c $? -o $@ # Use nm to find the initialization functions in the # object file of the instrumented user code. Then the # awk script generates these functions. pompregions_f.c : example_f.mod.o $(NM) example_f.mod.o | $(AWK_SCRIPT) > pompregions_f.c example_f.mod.o : example.mod.F90 $(FORTRAN) $(OPENMP_F_FLAG) -c -o $@ $? example.mod.F90: example.f90 $(OPARI) example.f90 ###################################################### clean: rm -rf example_? rm -rf example_?_inst rm -rf example.mod.* rm -rf example.*.opari.inc rm -rf pompregions_?.c rm -rf *.o opari2-2.0.9/doc/example/openmp/PaxHeaders/Makefile.inc.am0000644000000000000000000000013214770056734020313 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 30 ctime=1742757367.275367809 opari2-2.0.9/doc/example/openmp/Makefile.inc.am0000644000175100001440000000111014770056734020634 0ustar00builderusers## -*- mode: makefile -*- ## ## This file is part of the Score-P software (http://www.score-p.org) ## ## Copyright (c) 2020, ## Technische Universitaet Dresden, Germany ## ## This software may be modified and distributed under the terms of ## a BSD-style license. See the COPYING file in the package base ## directory for details. ## if HAVE_OPENMP_SUPPORT exampleopenmpdir = $(docdir)/example/openmp exampleopenmp_DATA = \ $(SRC_ROOT)doc/example/openmp/example.c \ $(SRC_ROOT)doc/example/openmp/example.f90 \ ../doc/example/openmp/Makefile endif HAVE_OPENMP_SUPPORT opari2-2.0.9/doc/example/openmp/PaxHeaders/example.f900000644000000000000000000000013214770056734017462 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 30 ctime=1742757367.179368394 opari2-2.0.9/doc/example/openmp/example.f900000644000175100001440000000217114770056734020013 0ustar00builderusers!> !> This file is part of the Score-P software (http://www.score-p.org) !> !> Copyright (c) 2009-2011, !> RWTH Aachen University, Germany !> !> Copyright (c) 2009-2011, !> Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Dresden, Germany !> !> Copyright (c) 2009-2011, !> University of Oregon, Eugene, USA !> !> Copyright (c) 2009-2011, 2013 !> Forschungszentrum Juelich GmbH, Germany !> !> Copyright (c) 2009-2011, !> German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany !> !> Copyright (c) 2009-2011, !> Technische Universitaet Muenchen, Germany !> !> This software may be modified and distributed under the terms of !> a BSD-style license. See the COPYING file in the package base !> directory for details. PROGRAM EXAMPLE INTEGER i, lsum, sum sum = 0 !$omp parallel private(i, lsum) reduction(+:sum) lsum = 0 !$omp do do i=1,20 lsum = lsum + i enddo !$omp end do write(*,*) "LOCAL SUM: ", lsum sum = sum + lsum !$omp end parallel write(*,*) "TOTAL SUM: ", sum END opari2-2.0.9/doc/example/openmp/PaxHeaders/example.c0000644000000000000000000000013214770056734017306 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 30 ctime=1742757367.175368418 opari2-2.0.9/doc/example/openmp/example.c0000644000175100001440000000230014770056734017631 0ustar00builderusers/* * This file is part of the Score-P software (http://www.score-p.org) * * Copyright (c) 2009-2011, * RWTH Aachen University, Germany * * Copyright (c) 2009-2011, * Gesellschaft fuer numerische Simulation mbH Braunschweig, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Dresden, Germany * * Copyright (c) 2009-2011, * University of Oregon, Eugene, USA * * Copyright (c) 2009-2011, 2013 * Forschungszentrum Juelich GmbH, Germany * * Copyright (c) 2009-2011, * German Research School for Simulation Sciences GmbH, Juelich/Aachen, Germany * * Copyright (c) 2009-2011, * Technische Universitaet Muenchen, Germany * * This software may be modified and distributed under the terms of * a BSD-style license. See the COPYING file in the package base * directory for details. * */ #include int main( int argc, char** argv ) { int i, lsum, sum; sum = 0; #pragma omp parallel private(i, lsum) reduction(+:sum) { lsum = 0; #pragma omp for for ( i = 0; i < 21; i++ ) { lsum += i; } printf( "local sum: %d\n", lsum ); sum += lsum; } printf( "total sum: %d\n", sum ); return 0; } opari2-2.0.9/doc/PaxHeaders/doxygen-user0000644000000000000000000000013014770056767015136 xustar0029 mtime=1742757367.18336837 30 atime=1742757371.935339406 29 ctime=1742757367.18336837 opari2-2.0.9/doc/doxygen-user/0000755000175100001440000000000014770056767015545 5ustar00builderusersopari2-2.0.9/doc/doxygen-user/PaxHeaders/opari2-config_usage.dox.in0000644000000000000000000000013114770056734022152 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 29 ctime=1742757367.18336837 opari2-2.0.9/doc/doxygen-user/opari2-config_usage.dox.in0000644000175100001440000000406214770056734022505 0ustar00builderusersUsage: opari2-config [OPTION] ... with the following commands: --nm Prints the nm command. --region-initialization Prints the script used to create the pomp2_init_regions.c file. --create-pomp2-regions Prints the whole command necessary for creating the initialization file. --awk-cmd [Deprecated, use --region-initialization instead.] Prints the awk command. --awk-script [Deprecated, use --region-initialization instead.] Prints the awk script. --egrep [Deprecated, use --region-initialization instead.] Prints the egrep command. --cflags[=(gnu|intel|sun| Prints compiler options to include pgi|ibm|cray|fujitsu| installed headers and adds compiler clang)] specific flags to prevent warnings for unused variables which can occur during the instrumentation. --fortran Indicates that the target language is fortran. Sometimes for fortran different compile flags are provided, in most of the cases there is no difference. --version Prints the OPARI2 version number. --interface-version Prints the pomp2 API version that instrumented files conform too. --revision Prints the revision number of the OPARI2 package. --help Prints this help text. and the following options: [--build-check] Tells opari2-config to use build paths instead of install paths. Used for build testing. [--config=] Reads in a configuration from the given file. Report bugs to . opari2-2.0.9/doc/doxygen-user/PaxHeaders/opari2_usage.dox.in0000644000000000000000000000013114770056734020707 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 29 ctime=1742757367.18336837 opari2-2.0.9/doc/doxygen-user/opari2_usage.dox.in0000644000175100001440000001002514770056734021236 0ustar00builderusersUsage: opari2 [OPTION] ... infile [outfile] ****************** general options and parameters ******************* [--f77|--f90|--c|--c++] [OPTIONAL] Specifies the programming language of the input source file. This option is only necessary if the automatic language detection based on the input file suffix fails. [--free-form] [OPTIONAL] Specifies that free formatting is used for Fortran source files. This is the default for Fortran 90/95. [--fix-form] [OPTIONAL] Specifies that fixed formatting is used for Fortran source files. This is the default for Fortran 77. [--nosrc] [OPTIONAL] If specified, OPARI2 does not generate #line constructs, which allow to preserve the original source file and line number information, in the transformation process. This option might be necessary if the OpenMP compiler does not understand #line constructs. The default is to generate #line constructs. [--disable=paradigm[:directive|group[:inner],...][+paradigm...] [OPTIONAL] Disable the instrumentation of whole paradigms, or specific directives or groups of directives of a paradigm. Furthermore it gives the possibility to suppress the insertion of instrumentation functions inside code regions, i.e. only the surrounding instrumentation is inserted. See the paradigm sections below. [--preprocessed] [OPTIONAL] Indicates that the source file is already preprocessed. It requires that necessary instrumentation interface headers are already included. Furthermore, it requires a marker, e.g. ___POMP2_INCLUDE___ immediately after the respective include file. [--version] [OPTIONAL] Prints version information. [--help] [OPTIONAL] Prints this help text. infile Input file name. [outfile] [OPTIONAL] Output file name. If not specified, OPARI2 uses the name infile.mod.suffix if the input file is called infile.suffix. ********************** OpenMP specific options ********************** [--disable=omp[:directive|group,...] [OPTIONAL] Accepted directives are 'atomic', 'critical', 'master', 'flush', 'single', 'ordered' or 'locks'. These directives form the group 'sync', that disables all of them. The group 'task' prevents the instrumentation of task directives. E.g., --disable=omp:master,atomic diables the instrumentation of master and atomic directives. [--omp-nodecl] [OPTIONAL] Disables the generation of POMP2_DLISTXXXXX macros. These are used in the parallel directives of the instrumentation to make the region handles shared. By using this option the shared clause is used directly on the parallel directive with the respective region handles. [--omp-tpd] [OPTIONAL] Adds the clause 'copyin()' to any parallel construct. This allows to pass data from the creating thread to its children. The variable is declared externally in all files, so it needs to be defined by the pomp library. This option is not supported when using the Fujitsu compiler. [--omp-tpd-mangling=gnu|intel|sun|pgi|ibm|cray] [OPTIONAL] If programming languages are mixed(C and Fortran), the needs to use the Fortran mangled name also in C files. This option specifies to use the mangling scheme of the gnu, intel, sun, pgi or ibm compiler. The default is to use the mangling scheme of the compiler used to build OPARI2. [--omp-task=abort|warn|remove] Special treatment for the task directive abort: Stop instrumentation with an error message when encountering a task directive. warn: Resume but print a warning. remove: Remove all task directives. [--omp-task-untied=abort|keep|no-warn] Special treatment for the untied task attribute. The default behavior is to remove the untied attribute, thus making all tasks tied, and print out a warning. abort: Stop instrumentation with an error message when encountering a task directive with the untied attribute. keep: Do not remove the untied attribute. no-warn: Do not print out a warning. ********************************************************************** Please report bugs to . opari2-2.0.9/doc/doxygen-user/PaxHeaders/doxygen-user.cfg.in0000644000000000000000000000013214770056734020726 xustar0030 mtime=1742757340.083533549 30 atime=1742757340.151533135 30 ctime=1742757366.959369735 opari2-2.0.9/doc/doxygen-user/doxygen-user.cfg.in0000644000175100001440000031665614770056734021277 0ustar00builderusers## Several variables will be added at 'make doxygen-user' time # Doxyfile 1.8.10 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all text # before the first occurrence of this tag. Doxygen uses libiconv (or the iconv # built into libc) for the transcoding. See http://www.gnu.org/software/libiconv # for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = "OPARI2" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "OpenMP Pragma And Region Instrumentor" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = @abs_top_srcdir@/doc/images/project_logo.svg # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = NO # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = @abs_top_srcdir@ # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines. ALIASES = scorep=Score-P \ cube=CUBE \ cube4=CUBE4 \ opari2=OPARI2 \ otf2=OTF2 \ mpi=MPI \ pmpi=PMPI \ openmp=OpenMP \ pomp2=POMP2 \ ibm=IBM \ "bluegene=Blue Gene" \ "crayxt=Cray XT" \ "crayxe=Cray XE" \ "crayxk=Cray XK" \ "crayxc=Cray XC" \ "necsx=NEC SX" \ papi=PAPI \ "seclabel{1}=\latexonly\label{sec:\1} \endlatexonly" \ "secref{1}=\if LATEX \latexonly~\ref{sec:\1}\xspace \endlatexonly \else   '@ref \1'   \endif" \ "verb{1}=\latexonly\verb+\1+\endlatexonly\htmlonly\1\endhtmlonly" \ "htmlimg{3}=@anchor \2 @image html \1 \"Figure \2: \3\"" \ "teximg{4}=\latexonly\begin{figure}[hbt]\begin{center}\includegraphics[\4]{@abs_top_srcdir@/doc/images/\1}\caption{\3}\label{fig:\2}\end{center}\end{figure}\endlatexonly" \ "img{4}=\if LATEX @teximg{\1.pdf,\2,\3,\4} \else @htmlimg{\1.png,\2,\3} \endif" \ "figref{1}=\if LATEX \latexonly~\ref{fig:\1}\xspace \endlatexonly \else   @ref \1   \endif" \ "href{2}=\2" \ "emph{1}=\1" # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = YES # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, Javascript, # C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: # FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: # Fortran. In the later case the parser tries to guess whether the code is fixed # or free formatted code, this is the default for Fortran type files), VHDL. For # instance to make doxygen treat .inc files as Fortran files (default is PHP), # and .f files as C (default is Fortran), use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See http://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = YES # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # (class|struct|union) declarations. If set to NO, these declarations will be # included in the documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = YES # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = NO # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= NO # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong or incomplete # parameter documentation, but not about the absence of documentation. # The default value is: NO. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = doxygen.err #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = doc/doxygen-user \ @abs_top_srcdir@/doc/doxygen-user \ @abs_top_srcdir@/include/opari2 \ @abs_top_srcdir@/src/opari-lib-dummy/opari2_region_info.h \ @abs_top_srcdir@/src/opari-lib-dummy/pomp2_region_info.h \ @abs_top_srcdir@/src/opari-lib-dummy/pomp2_user_region_info.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: http://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, # *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, # *.vhdl, *.ucf, *.qsf, *.as and *.js. FILE_PATTERNS = *.h \ *.dox # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = */.git/* # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = @abs_top_srcdir@/doc/doxygen-user \ @abs_top_srcdir@/INSTALL # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = @abs_top_srcdir@/doc/doxygen-user # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # function all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see http://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the config file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = @abs_top_srcdir@/doc/doxygen-user/header.html # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = @abs_top_srcdir@/doc/doxygen-user/footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # http://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 199 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to YES can help to show when doxygen was last run and thus if the # documentation is up to date. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: http://developer.apple.com/tools/xcode/), introduced with # OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the master .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 1 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # http://www.mathjax.org) which uses client side Javascript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /