summaryrefslogtreecommitdiffstats
path: root/openmp/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'openmp/runtime')
-rw-r--r--openmp/runtime/Build_With_CMake.txt3
-rw-r--r--openmp/runtime/CMakeLists.txt12
-rw-r--r--openmp/runtime/README.txt32
-rw-r--r--openmp/runtime/cmake/BuildPLRules.cmake11
-rw-r--r--openmp/runtime/cmake/Clang/AsmFlags.cmake11
-rw-r--r--openmp/runtime/cmake/Clang/CFlags.cmake12
-rw-r--r--openmp/runtime/cmake/CommonFlags.cmake51
-rw-r--r--openmp/runtime/cmake/Definitions.cmake9
-rw-r--r--openmp/runtime/cmake/GNU/AsmFlags.cmake11
-rw-r--r--openmp/runtime/cmake/GNU/CFlags.cmake11
-rw-r--r--openmp/runtime/cmake/GNU/FortranFlags.cmake11
-rw-r--r--openmp/runtime/cmake/Intel/AsmFlags.cmake11
-rw-r--r--openmp/runtime/cmake/Intel/CFlags.cmake12
-rw-r--r--openmp/runtime/cmake/Intel/FortranFlags.cmake19
-rw-r--r--openmp/runtime/cmake/MSVC/AsmFlags.cmake11
-rw-r--r--openmp/runtime/cmake/MSVC/CFlags.cmake11
-rw-r--r--openmp/runtime/cmake/MicroTests.cmake18
-rw-r--r--openmp/runtime/cmake/SourceFiles.cmake11
-rw-r--r--openmp/runtime/doc/Reference.pdf13925
-rw-r--r--openmp/runtime/doc/doxygen/config2
-rw-r--r--openmp/runtime/doc/doxygen/libomp_interface.h24
-rw-r--r--openmp/runtime/src/defs.mk4
-rw-r--r--openmp/runtime/src/dllexports22
-rw-r--r--openmp/runtime/src/exports_so.txt10
-rw-r--r--openmp/runtime/src/extractExternal.cpp4
-rw-r--r--openmp/runtime/src/i18n/en_US.txt22
-rw-r--r--openmp/runtime/src/include/25/iomp.h.var4
-rw-r--r--openmp/runtime/src/include/25/iomp_lib.h.var4
-rw-r--r--openmp/runtime/src/include/25/omp.h.var4
-rw-r--r--openmp/runtime/src/include/25/omp_lib.f.var6
-rw-r--r--openmp/runtime/src/include/25/omp_lib.f90.var4
-rw-r--r--openmp/runtime/src/include/25/omp_lib.h.var6
-rw-r--r--openmp/runtime/src/include/30/iomp.h.var4
-rw-r--r--openmp/runtime/src/include/30/iomp_lib.h.var4
-rw-r--r--openmp/runtime/src/include/30/omp.h.var4
-rw-r--r--openmp/runtime/src/include/30/omp_lib.f.var4
-rw-r--r--openmp/runtime/src/include/30/omp_lib.f90.var4
-rw-r--r--openmp/runtime/src/include/30/omp_lib.h.var4
-rw-r--r--openmp/runtime/src/include/40/iomp.h.var2
-rw-r--r--openmp/runtime/src/kmp.h640
-rw-r--r--openmp/runtime/src/kmp_affinity.cpp405
-rw-r--r--openmp/runtime/src/kmp_alloc.c14
-rw-r--r--openmp/runtime/src/kmp_atomic.c62
-rw-r--r--openmp/runtime/src/kmp_atomic.h6
-rw-r--r--openmp/runtime/src/kmp_barrier.cpp1607
-rw-r--r--openmp/runtime/src/kmp_csupport.c554
-rw-r--r--openmp/runtime/src/kmp_debug.c4
-rw-r--r--openmp/runtime/src/kmp_debug.h4
-rw-r--r--openmp/runtime/src/kmp_dispatch.cpp387
-rw-r--r--openmp/runtime/src/kmp_environment.c4
-rw-r--r--openmp/runtime/src/kmp_environment.h4
-rw-r--r--openmp/runtime/src/kmp_error.c4
-rw-r--r--openmp/runtime/src/kmp_error.h4
-rw-r--r--openmp/runtime/src/kmp_ftn_cdecl.c4
-rw-r--r--openmp/runtime/src/kmp_ftn_entry.h38
-rw-r--r--openmp/runtime/src/kmp_ftn_extra.c4
-rw-r--r--openmp/runtime/src/kmp_ftn_os.h20
-rw-r--r--openmp/runtime/src/kmp_ftn_stdcall.c4
-rw-r--r--openmp/runtime/src/kmp_global.c57
-rw-r--r--openmp/runtime/src/kmp_gsupport.c334
-rw-r--r--openmp/runtime/src/kmp_i18n.c6
-rw-r--r--openmp/runtime/src/kmp_i18n.h4
-rw-r--r--openmp/runtime/src/kmp_import.c4
-rw-r--r--openmp/runtime/src/kmp_io.c11
-rw-r--r--openmp/runtime/src/kmp_io.h4
-rw-r--r--openmp/runtime/src/kmp_itt.c13
-rw-r--r--openmp/runtime/src/kmp_itt.h46
-rw-r--r--openmp/runtime/src/kmp_itt.inl296
-rw-r--r--openmp/runtime/src/kmp_lock.cpp1177
-rw-r--r--openmp/runtime/src/kmp_lock.h61
-rw-r--r--openmp/runtime/src/kmp_omp.h4
-rw-r--r--openmp/runtime/src/kmp_os.h39
-rw-r--r--openmp/runtime/src/kmp_runtime.c3825
-rw-r--r--openmp/runtime/src/kmp_sched.cpp563
-rw-r--r--openmp/runtime/src/kmp_settings.c424
-rw-r--r--openmp/runtime/src/kmp_settings.h4
-rw-r--r--openmp/runtime/src/kmp_stats.cpp615
-rw-r--r--openmp/runtime/src/kmp_stats.h706
-rw-r--r--openmp/runtime/src/kmp_stats_timing.cpp167
-rw-r--r--openmp/runtime/src/kmp_stats_timing.h104
-rw-r--r--openmp/runtime/src/kmp_str.c4
-rw-r--r--openmp/runtime/src/kmp_str.h4
-rw-r--r--openmp/runtime/src/kmp_stub.c38
-rw-r--r--openmp/runtime/src/kmp_stub.h10
-rw-r--r--openmp/runtime/src/kmp_taskdeps.cpp115
-rw-r--r--openmp/runtime/src/kmp_tasking.c228
-rw-r--r--openmp/runtime/src/kmp_taskq.c24
-rw-r--r--openmp/runtime/src/kmp_threadprivate.c4
-rw-r--r--openmp/runtime/src/kmp_utility.c4
-rw-r--r--openmp/runtime/src/kmp_version.c19
-rw-r--r--openmp/runtime/src/kmp_version.h6
-rw-r--r--openmp/runtime/src/kmp_wait_release.cpp52
-rw-r--r--openmp/runtime/src/kmp_wait_release.h496
-rw-r--r--openmp/runtime/src/kmp_wrapper_getpid.h4
-rw-r--r--openmp/runtime/src/kmp_wrapper_malloc.h4
-rw-r--r--openmp/runtime/src/libiomp.rc.var6
-rw-r--r--openmp/runtime/src/makefile.mk93
-rw-r--r--openmp/runtime/src/rules.mk4
-rw-r--r--openmp/runtime/src/test-touch.c6
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/ittnotify.h63
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h6
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c113
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h12
-rw-r--r--openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h4
-rw-r--r--openmp/runtime/src/z_Linux_asm.s220
-rw-r--r--openmp/runtime/src/z_Linux_util.c200
-rw-r--r--openmp/runtime/src/z_Windows_NT-586_asm.asm227
-rw-r--r--openmp/runtime/src/z_Windows_NT-586_util.c4
-rw-r--r--openmp/runtime/src/z_Windows_NT_util.c220
-rwxr-xr-xopenmp/runtime/tools/check-depends.pl2
-rwxr-xr-xopenmp/runtime/tools/check-tools.pl14
-rw-r--r--openmp/runtime/tools/freebsd.inc1
-rwxr-xr-xopenmp/runtime/tools/make-fat-binaries.pl234
-rw-r--r--openmp/runtime/tools/objcopy.cpp4
-rw-r--r--openmp/runtime/tools/src/common-checks.mk2
-rw-r--r--openmp/runtime/tools/src/common-tools.mk20
116 files changed, 17816 insertions, 11218 deletions
diff --git a/openmp/runtime/Build_With_CMake.txt b/openmp/runtime/Build_With_CMake.txt
index fbc0f77826e..ca69b7696da 100644
--- a/openmp/runtime/Build_With_CMake.txt
+++ b/openmp/runtime/Build_With_CMake.txt
@@ -137,8 +137,7 @@ libiomp5 version can be 5 or 4.
OpenMP version can be either 40 or 30.
-Dmic_arch=knc|knf
-Intel(R) MIC Architecture. Can be
-knf (Knights Ferry) or knc (Knights Corner).
+Intel(R) MIC Architecture, can be knf or knc.
This value is ignored if os != mic
-Dmic_os=lin|bsd
diff --git a/openmp/runtime/CMakeLists.txt b/openmp/runtime/CMakeLists.txt
index 62c84c6e414..b620f5af1c9 100644
--- a/openmp/runtime/CMakeLists.txt
+++ b/openmp/runtime/CMakeLists.txt
@@ -238,8 +238,18 @@ set(USE_BUILDPL_RULES false CACHE BOOL "Should the build follow build.pl rules/r
# - these predefined linker flags should work for Windows, Mac, and True Linux for the most popular compilers/linkers
set(USE_PREDEFINED_LINKER_FLAGS true CACHE BOOL "Should the build use the predefined linker flags in CommonFlags.cmake?")
+# - On multinode systems, larger alignment is desired to avoid false sharing
+set(USE_INTERNODE_ALIGNMENT false CACHE BOOL "Should larger alignment (4096 bytes) be used for some locks and data structures?")
+
+# - libgomp drop-in compatibility
+if(${LINUX} AND NOT ${PPC64})
+ set(USE_VERSION_SYMBOLS true CACHE BOOL "Should version symbols be used? These provide binary compatibility with libgomp.")
+else()
+ set(USE_VERSION_SYMBOLS false CACHE BOOL "Should version symbols be used? These provide binary compatibility with libgomp.")
+endif()
+
# - TSX based locks have __asm code which can be troublesome for some compilers. This feature is also x86 specific.
-if({${IA32} OR ${INTEL64})
+if(${IA32} OR ${INTEL64})
set(USE_ADAPTIVE_LOCKS true CACHE BOOL "Should TSX-based lock be compiled (adaptive lock in kmp_lock.cpp). These are x86 specific.")
else()
set(USE_ADAPTIVE_LOCKS false CACHE BOOL "Should TSX-based lock be compiled (adaptive lock in kmp_lock.cpp). These are x86 specific.")
diff --git a/openmp/runtime/README.txt b/openmp/runtime/README.txt
index 50d207b5fd0..1ed7b2cdbb5 100644
--- a/openmp/runtime/README.txt
+++ b/openmp/runtime/README.txt
@@ -37,7 +37,7 @@ omp_root: The path to the top-level directory containing the top-level
current working directory.
omp_os: Operating system. By default, the build will attempt to
- detect this. Currently supports "linux", "freebsd", "macos", and
+ detect this. Currently supports "linux", "freebsd", "macos", and
"windows".
arch: Architecture. By default, the build will attempt to
@@ -72,36 +72,44 @@ There is also an experimental CMake build system. This is *not* yet
supported for production use and resulting binaries have not been checked
for compatibility.
+On OS X* machines, it is possible to build universal (or fat) libraries which
+include both IA-32 architecture and Intel(R) 64 architecture objects in a
+single archive; just build the 32 and 32e libraries separately, then invoke
+make again with a special argument as follows:
+
+make compiler=clang build_args=fat
+
Supported RTL Build Configurations
==================================
Supported Architectures: IA-32 architecture, Intel(R) 64, and
Intel(R) Many Integrated Core Architecture
- --------------------------------------------
- | icc/icl | gcc | clang |
---------------|---------------|--------------------------|
-| Linux* OS | Yes(1,5) | Yes(2,4) | Yes(4,6,7) |
-| FreeBSD* | No | No | Yes(4,6,7) |
-| OS X* | Yes(1,3,4) | No | Yes(4,6,7) |
-| Windows* OS | Yes(1,4) | No | No |
-----------------------------------------------------------
+ ----------------------------------------------
+ | icc/icl | gcc | clang |
+--------------|---------------|----------------------------|
+| Linux* OS | Yes(1,5) | Yes(2,4) | Yes(4,6,7) |
+| FreeBSD* | No | No | Yes(4,6,7,8) |
+| OS X* | Yes(1,3,4) | No | Yes(4,6,7) |
+| Windows* OS | Yes(1,4) | No | No |
+------------------------------------------------------------
(1) On IA-32 architecture and Intel(R) 64, icc/icl versions 12.x are
supported (12.1 is recommended).
-(2) gcc version 4.6.2 is supported.
+(2) GCC* version 4.6.2 is supported.
(3) For icc on OS X*, OS X* version 10.5.8 is supported.
(4) Intel(R) Many Integrated Core Architecture not supported.
(5) On Intel(R) Many Integrated Core Architecture, icc/icl versions 13.0
or later are required.
-(6) clang version 3.3 is supported.
-(7) clang currently does not offer a software-implemented 128 bit extended
+(6) Clang* version 3.3 is supported.
+(7) Clang* currently does not offer a software-implemented 128 bit extended
precision type. Thus, all entry points reliant on this type are removed
from the library and cannot be called in the user program. The following
functions are not available:
__kmpc_atomic_cmplx16_*
__kmpc_atomic_float16_*
__kmpc_atomic_*_fp
+(8) Community contribution provided AS IS, not tested by Intel.
Front-end Compilers that work with this RTL
===========================================
diff --git a/openmp/runtime/cmake/BuildPLRules.cmake b/openmp/runtime/cmake/BuildPLRules.cmake
index 8db0f2f5576..01af0589312 100644
--- a/openmp/runtime/cmake/BuildPLRules.cmake
+++ b/openmp/runtime/cmake/BuildPLRules.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
###############################################################################
# This file contains additional build rules that correspond to build.pl's rules
# Building libiomp5.dbg is linux only, Windows will build libiomp5md.dll.pdb
diff --git a/openmp/runtime/cmake/Clang/AsmFlags.cmake b/openmp/runtime/cmake/Clang/AsmFlags.cmake
index b23e6b9a499..da2b6666880 100644
--- a/openmp/runtime/cmake/Clang/AsmFlags.cmake
+++ b/openmp/runtime/cmake/Clang/AsmFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds Clang (clang/clang++) specific compiler dependent flags
# The flag types are:
# 1) Assembly flags
diff --git a/openmp/runtime/cmake/Clang/CFlags.cmake b/openmp/runtime/cmake/Clang/CFlags.cmake
index 54e180972d6..e0c14a0c937 100644
--- a/openmp/runtime/cmake/Clang/CFlags.cmake
+++ b/openmp/runtime/cmake/Clang/CFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds Clang (clang/clang++) specific compiler dependent flags
# The flag types are:
# 1) C/C++ Compiler flags
@@ -19,6 +30,7 @@ function(append_compiler_specific_c_and_cxx_flags input_c_flags input_cxx_flags)
endif()
append_c_and_cxx_flags("-Wno-unused-value") # Don't warn about unused values
append_c_and_cxx_flags("-Wno-switch") # Don't warn about switch statements that don't cover entire range of values
+ append_c_and_cxx_flags("-Wno-deprecated-register") # Don't warn about using register keyword
set(${input_c_flags} ${${input_c_flags}} "${local_c_flags}" PARENT_SCOPE)
set(${input_cxx_flags} ${${input_cxx_flags}} "${local_cxx_flags}" PARENT_SCOPE)
endfunction()
diff --git a/openmp/runtime/cmake/CommonFlags.cmake b/openmp/runtime/cmake/CommonFlags.cmake
index 301a3c4e742..01063d0f383 100644
--- a/openmp/runtime/cmake/CommonFlags.cmake
+++ b/openmp/runtime/cmake/CommonFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds the common flags independent of compiler
# The flag types are:
# 1) Assembly flags (append_asm_flags_common)
@@ -71,22 +82,21 @@ function(append_linker_flags_common input_ld_flags input_ld_flags_libs)
set(local_ld_flags)
set(local_ld_flags_libs)
- #################################
- # Windows linker flags
- if(${WINDOWS})
+ if(${USE_PREDEFINED_LINKER_FLAGS})
+
+ #################################
+ # Windows linker flags
+ if(${WINDOWS})
- ##################
- # MAC linker flags
- elseif(${MAC})
- if(${USE_PREDEFINED_LINKER_FLAGS})
+ ##################
+ # MAC linker flags
+ elseif(${MAC})
append_linker_flags("-single_module")
append_linker_flags("-current_version ${version}.0")
append_linker_flags("-compatibility_version ${version}.0")
- endif()
- #####################################################################################
- # Intel(R) Many Integrated Core Architecture (Intel(R) MIC Architecture) linker flags
- elseif(${MIC})
- if(${USE_PREDEFINED_LINKER_FLAGS})
+ #####################################################################################
+ # Intel(R) Many Integrated Core Architecture (Intel(R) MIC Architecture) linker flags
+ elseif(${MIC})
append_linker_flags("-Wl,-x")
append_linker_flags("-Wl,--warn-shared-textrel") # Warn if the linker adds a DT_TEXTREL to a shared object.
append_linker_flags("-Wl,--as-needed")
@@ -98,13 +108,11 @@ function(append_linker_flags_common input_ld_flags input_ld_flags_libs)
if(${STATS_GATHERING})
append_linker_flags_library("-Wl,-lstdc++") # link in standard c++ library (stats-gathering needs it)
endif()
- endif()
- #########################
- # Unix based linker flags
- else()
- # For now, always include --version-script flag on Unix systems.
- append_linker_flags("-Wl,--version-script=${src_dir}/exports_so.txt") # Use exports_so.txt as version script to create versioned symbols for ELF libraries
- if(${USE_PREDEFINED_LINKER_FLAGS})
+ #########################
+ # Unix based linker flags
+ else()
+ # For now, always include --version-script flag on Unix systems.
+ append_linker_flags("-Wl,--version-script=${src_dir}/exports_so.txt") # Use exports_so.txt as version script to create versioned symbols for ELF libraries
append_linker_flags("-Wl,-z,noexecstack") # Marks the object as not requiring executable stack.
append_linker_flags("-Wl,--as-needed") # Only adds library dependencies as they are needed. (if libiomp5 actually uses a function from the library, then add it)
if(NOT ${STUBS_LIBRARY})
@@ -117,8 +125,9 @@ function(append_linker_flags_common input_ld_flags input_ld_flags_libs)
append_linker_flags_library("-Wl,-ldl") # link in libdl (dynamic loader library)
endif()
endif()
- endif() # if(${USE_PREDEFINED_LINKER_FLAGS})
- endif() # if(${OPERATING_SYSTEM}) ...
+ endif() # if(${OPERATING_SYSTEM}) ...
+
+ endif() # USE_PREDEFINED_LINKER_FLAGS
set(${input_ld_flags} "${${input_ld_flags}}" "${local_ld_flags}" "${USER_LD_FLAGS}" PARENT_SCOPE)
set(${input_ld_flags_libs} "${${input_ld_flags_libs}}" "${local_ld_flags_libs}" "${USER_LD_LIB_FLAGS}" PARENT_SCOPE)
diff --git a/openmp/runtime/cmake/Definitions.cmake b/openmp/runtime/cmake/Definitions.cmake
index bdd11ab678e..dafbff28abb 100644
--- a/openmp/runtime/cmake/Definitions.cmake
+++ b/openmp/runtime/cmake/Definitions.cmake
@@ -42,6 +42,10 @@ function(append_cpp_flags input_cpp_flags)
endif()
append_definitions("-D INTEL_ITTNOTIFY_PREFIX=__kmp_itt_")
+ if(${USE_VERSION_SYMBOLS})
+ append_definitions("-D KMP_USE_VERSION_SYMBOLS")
+ endif()
+
#####################
# Windows definitions
if(${WINDOWS})
@@ -133,6 +137,11 @@ function(append_cpp_flags input_cpp_flags)
append_definitions("-D KMP_USE_ADAPTIVE_LOCKS=0")
append_definitions("-D KMP_DEBUG_ADAPTIVE_LOCKS=0")
endif()
+ if(${USE_INTERNODE_ALIGNMENT})
+ append_definitions("-D KMP_USE_INTERNODE_ALIGNMENT=1")
+ else()
+ append_definitions("-D KMP_USE_INTERNODE_ALIGNMENT=0")
+ endif()
set(${input_cpp_flags} "${${input_cpp_flags}}" "${local_cpp_flags}" "${USER_CPP_FLAGS}" "$ENV{CPPFLAGS}" PARENT_SCOPE)
endfunction()
diff --git a/openmp/runtime/cmake/GNU/AsmFlags.cmake b/openmp/runtime/cmake/GNU/AsmFlags.cmake
index 91fccb07947..c422349e5e9 100644
--- a/openmp/runtime/cmake/GNU/AsmFlags.cmake
+++ b/openmp/runtime/cmake/GNU/AsmFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds GNU (gcc/g++) specific compiler dependent flags
# The flag types are:
# 1) Assembly flags
diff --git a/openmp/runtime/cmake/GNU/CFlags.cmake b/openmp/runtime/cmake/GNU/CFlags.cmake
index 88654ccc27a..4785a3cdc07 100644
--- a/openmp/runtime/cmake/GNU/CFlags.cmake
+++ b/openmp/runtime/cmake/GNU/CFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds GNU (gcc/g++) specific compiler dependent flags
# The flag types are:
# 2) C/C++ Compiler flags
diff --git a/openmp/runtime/cmake/GNU/FortranFlags.cmake b/openmp/runtime/cmake/GNU/FortranFlags.cmake
index 2a479b28dd3..de79850d4f2 100644
--- a/openmp/runtime/cmake/GNU/FortranFlags.cmake
+++ b/openmp/runtime/cmake/GNU/FortranFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds GNU (gcc/g++) specific compiler dependent flags
# The flag types are:
# 1) Fortran Compiler flags
diff --git a/openmp/runtime/cmake/Intel/AsmFlags.cmake b/openmp/runtime/cmake/Intel/AsmFlags.cmake
index 59d22d99502..2800af54d80 100644
--- a/openmp/runtime/cmake/Intel/AsmFlags.cmake
+++ b/openmp/runtime/cmake/Intel/AsmFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds Intel(R) C Compiler / Intel(R) C++ Compiler / Intel(R) Fortran Compiler (icc/icpc/icl.exe/ifort) dependent flags
# The flag types are:
# 1) Assembly flags
diff --git a/openmp/runtime/cmake/Intel/CFlags.cmake b/openmp/runtime/cmake/Intel/CFlags.cmake
index 2122e29933d..5d4b54565c0 100644
--- a/openmp/runtime/cmake/Intel/CFlags.cmake
+++ b/openmp/runtime/cmake/Intel/CFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds Intel(R) C Compiler / Intel(R) C++ Compiler / Intel(R) Fortran Compiler (icc/icpc/icl.exe/ifort) dependent flags
# The flag types are:
# 2) C/C++ Compiler flags
@@ -41,7 +52,6 @@ function(append_compiler_specific_c_and_cxx_flags input_c_flags input_cxx_flags)
endif()
else()
append_c_and_cxx_flags("-Wsign-compare") # warn on sign comparisons
- append_c_and_cxx_flags("-Werror") # Changes all warnings to errors.
append_c_and_cxx_flags("-Qoption,cpp,--extended_float_types") # Enabled _Quad type.
append_c_and_cxx_flags("-fno-exceptions") # Exception handling table generation is disabled.
append_c_and_cxx_flags("-x c++") # Compile C files as C++ files
diff --git a/openmp/runtime/cmake/Intel/FortranFlags.cmake b/openmp/runtime/cmake/Intel/FortranFlags.cmake
index 9279a887e88..5fb16563fa3 100644
--- a/openmp/runtime/cmake/Intel/FortranFlags.cmake
+++ b/openmp/runtime/cmake/Intel/FortranFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds Intel(R) C Compiler / Intel(R) C++ Compiler / Intel(R) Fortran Compiler (icc/icpc/icl.exe/ifort) dependent flags
# The flag types are:
# 1) Fortran Compiler flags
@@ -17,12 +28,20 @@ function(append_fortran_compiler_specific_fort_flags input_fort_flags)
append_fort_flags("-GS")
append_fort_flags("-DynamicBase")
append_fort_flags("-Zi")
+ # On Linux and Windows Intel(R) 64 architecture we need offload attribute
+ # for all Fortran entries in order to support OpenMP function calls inside device contructs
+ if(${INTEL64})
+ append_fort_flags("/Qoffload-attribute-target:mic")
+ endif()
else()
if(${MIC})
append_fort_flags("-mmic")
endif()
if(NOT ${MAC})
append_fort_flags("-sox")
+ if(${INTEL64} AND ${LINUX})
+ append_fort_flags("-offload-attribute-target=mic")
+ endif()
endif()
endif()
set(${input_fort_flags} ${${input_fort_flags}} "${local_fort_flags}" PARENT_SCOPE)
diff --git a/openmp/runtime/cmake/MSVC/AsmFlags.cmake b/openmp/runtime/cmake/MSVC/AsmFlags.cmake
index dcc83021183..685762de17e 100644
--- a/openmp/runtime/cmake/MSVC/AsmFlags.cmake
+++ b/openmp/runtime/cmake/MSVC/AsmFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds Microsoft Visual Studio dependent flags
# The flag types are:
# 1) Assembly flags
diff --git a/openmp/runtime/cmake/MSVC/CFlags.cmake b/openmp/runtime/cmake/MSVC/CFlags.cmake
index b76147a0ded..2b17cebe7f5 100644
--- a/openmp/runtime/cmake/MSVC/CFlags.cmake
+++ b/openmp/runtime/cmake/MSVC/CFlags.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
# This file holds Microsoft Visual Studio dependent flags
# The flag types are:
# 1) C/C++ Compiler flags
diff --git a/openmp/runtime/cmake/MicroTests.cmake b/openmp/runtime/cmake/MicroTests.cmake
index 50beb594db8..dffc4ee53c5 100644
--- a/openmp/runtime/cmake/MicroTests.cmake
+++ b/openmp/runtime/cmake/MicroTests.cmake
@@ -1,3 +1,14 @@
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
######################################################
# MICRO TESTS
# The following micro-tests are small tests to perform on
@@ -219,15 +230,14 @@ if(${test_deps} AND ${tests})
set(td_exp libc.so.7 libthr.so.3 libunwind.so.5)
elseif(${LINUX})
set(td_exp libdl.so.2,libgcc_s.so.1)
- if(NOT ${IA32} AND NOT ${INTEL64})
- set(td_exp ${td_exp},libffi.so.6,libffi.so.5)
- endif()
if(${IA32})
set(td_exp ${td_exp},libc.so.6,ld-linux.so.2)
elseif(${INTEL64})
set(td_exp ${td_exp},libc.so.6,ld-linux-x86-64.so.2)
elseif(${ARM})
- set(td_exp ${td_exp},libc.so.6,ld-linux-armhf.so.3)
+ set(td_exp ${td_exp},libffi.so.6,libffi.so.5,libc.so.6,ld-linux-armhf.so.3)
+ elseif(${PPC64})
+ set(td_exp ${td_exp},libc.so.6,ld64.so.1)
endif()
if(${STD_CPP_LIB})
set(td_exp ${td_exp},libstdc++.so.6)
diff --git a/openmp/runtime/cmake/SourceFiles.cmake b/openmp/runtime/cmake/SourceFiles.cmake
index a884feaf51b..dcc78cbb176 100644
--- a/openmp/runtime/cmake/SourceFiles.cmake
+++ b/openmp/runtime/cmake/SourceFiles.cmake
@@ -69,7 +69,8 @@ endfunction()
function(set_cpp_files input_cpp_source_files)
set(local_cpp_source_files "")
if(NOT ${STUBS_LIBRARY})
- #append_cpp_source_file("kmp_barrier.cpp")
+ append_cpp_source_file("kmp_barrier.cpp")
+ append_cpp_source_file("kmp_wait_release.cpp")
append_cpp_source_file("kmp_affinity.cpp")
append_cpp_source_file("kmp_dispatch.cpp")
append_cpp_source_file("kmp_lock.cpp")
@@ -78,10 +79,10 @@ function(set_cpp_files input_cpp_source_files)
append_cpp_source_file("kmp_taskdeps.cpp")
append_cpp_source_file("kmp_cancel.cpp")
endif()
- #if(${STATS_GATHERING})
- # append_cpp_source_file("kmp_stats.cpp")
- # append_cpp_source_file("kmp_stats_timing.cpp")
- #endif()
+ if(${STATS_GATHERING})
+ append_cpp_source_file("kmp_stats.cpp")
+ append_cpp_source_file("kmp_stats_timing.cpp")
+ endif()
endif()
set(${input_cpp_source_files} "${local_cpp_source_files}" PARENT_SCOPE)
diff --git a/openmp/runtime/doc/Reference.pdf b/openmp/runtime/doc/Reference.pdf
index 680f98c0faa..d6faf7eefc1 100644
--- a/openmp/runtime/doc/Reference.pdf
+++ b/openmp/runtime/doc/Reference.pdf
@@ -88,1803 +88,2362 @@ endobj
<< /S /GoTo /D (chapter.3) >>
endobj
64 0 obj
-(\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x)
+(\376\377\000H\000i\000e\000r\000a\000r\000c\000h\000i\000c\000a\000l\000\040\000I\000n\000d\000e\000x)
endobj
65 0 obj
<< /S /GoTo /D (section.3.1) >>
endobj
68 0 obj
-(\376\377\000C\000l\000a\000s\000s\000\040\000L\000i\000s\000t)
+(\376\377\000C\000l\000a\000s\000s\000\040\000H\000i\000e\000r\000a\000r\000c\000h\000y)
endobj
69 0 obj
<< /S /GoTo /D (chapter.4) >>
endobj
72 0 obj
-(\376\377\000M\000o\000d\000u\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000C\000l\000a\000s\000s\000\040\000I\000n\000d\000e\000x)
endobj
73 0 obj
<< /S /GoTo /D (section.4.1) >>
endobj
76 0 obj
-(\376\377\000A\000t\000o\000m\000i\000c\000\040\000O\000p\000e\000r\000a\000t\000i\000o\000n\000s)
+(\376\377\000C\000l\000a\000s\000s\000\040\000L\000i\000s\000t)
endobj
77 0 obj
-<< /S /GoTo /D (subsection.4.1.1) >>
+<< /S /GoTo /D (chapter.5) >>
endobj
80 0 obj
-(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+(\376\377\000M\000o\000d\000u\000l\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
81 0 obj
-<< /S /GoTo /D (section.4.2) >>
+<< /S /GoTo /D (section.5.1) >>
endobj
84 0 obj
-(\376\377\000B\000a\000s\000i\000c\000\040\000T\000y\000p\000e\000s)
+(\376\377\000A\000t\000o\000m\000i\000c\000\040\000O\000p\000e\000r\000a\000t\000i\000o\000n\000s)
endobj
85 0 obj
-<< /S /GoTo /D (subsection.4.2.1) >>
+<< /S /GoTo /D (subsection.5.1.1) >>
endobj
88 0 obj
(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
endobj
89 0 obj
-<< /S /GoTo /D (subsection.4.2.2) >>
+<< /S /GoTo /D (section.5.2) >>
endobj
92 0 obj
-(\376\377\000M\000a\000c\000r\000o\000\040\000D\000e\000f\000i\000n\000i\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000W\000a\000i\000t\000/\000R\000e\000l\000e\000a\000s\000e\000\040\000o\000p\000e\000r\000a\000t\000i\000o\000n\000s)
endobj
93 0 obj
-<< /S /GoTo /D (subsubsection.4.2.2.1) >>
+<< /S /GoTo /D (subsection.5.2.1) >>
endobj
96 0 obj
-(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000A\000T\000O\000M\000I\000C\000\137\000R\000E\000D\000U\000C\000E)
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
endobj
97 0 obj
-<< /S /GoTo /D (subsubsection.4.2.2.2) >>
+<< /S /GoTo /D (subsection.5.2.2) >>
endobj
100 0 obj
-(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000A\000U\000T\000O\000P\000A\000R)
+(\376\377\000E\000n\000u\000m\000e\000r\000a\000t\000i\000o\000n\000\040\000T\000y\000p\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
101 0 obj
-<< /S /GoTo /D (subsubsection.4.2.2.3) >>
+<< /S /GoTo /D (subsubsection.5.2.2.1) >>
endobj
104 0 obj
-(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000B\000A\000R\000R\000I\000E\000R\000\137\000E\000X\000P\000L)
+(\376\377\000f\000l\000a\000g\000\137\000t\000y\000p\000e)
endobj
105 0 obj
-<< /S /GoTo /D (subsubsection.4.2.2.4) >>
+<< /S /GoTo /D (section.5.3) >>
endobj
108 0 obj
-(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000B\000A\000R\000R\000I\000E\000R\000\137\000I\000M\000P\000L)
+(\376\377\000B\000a\000s\000i\000c\000\040\000T\000y\000p\000e\000s)
endobj
109 0 obj
-<< /S /GoTo /D (subsubsection.4.2.2.5) >>
+<< /S /GoTo /D (subsection.5.3.1) >>
endobj
112 0 obj
-(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000I\000M\000B)
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
endobj
113 0 obj
-<< /S /GoTo /D (subsubsection.4.2.2.6) >>
+<< /S /GoTo /D (subsection.5.3.2) >>
endobj
116 0 obj
-(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000K\000M\000P\000C)
+(\376\377\000M\000a\000c\000r\000o\000\040\000D\000e\000f\000i\000n\000i\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
117 0 obj
-<< /S /GoTo /D (subsection.4.2.3) >>
+<< /S /GoTo /D (subsubsection.5.3.2.1) >>
endobj
120 0 obj
-(\376\377\000T\000y\000p\000e\000d\000e\000f\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000A\000T\000O\000M\000I\000C\000\137\000R\000E\000D\000U\000C\000E)
endobj
121 0 obj
-<< /S /GoTo /D (subsubsection.4.2.3.1) >>
+<< /S /GoTo /D (subsubsection.5.3.2.2) >>
endobj
124 0 obj
-(\376\377\000i\000d\000e\000n\000t\000\137\000t)
+(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000A\000U\000T\000O\000P\000A\000R)
endobj
125 0 obj
-<< /S /GoTo /D (section.4.3) >>
+<< /S /GoTo /D (subsubsection.5.3.2.3) >>
endobj
128 0 obj
-(\376\377\000D\000e\000p\000r\000e\000c\000a\000t\000e\000d\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000s)
+(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000B\000A\000R\000R\000I\000E\000R\000\137\000E\000X\000P\000L)
endobj
129 0 obj
-<< /S /GoTo /D (subsection.4.3.1) >>
+<< /S /GoTo /D (subsubsection.5.3.2.4) >>
endobj
132 0 obj
-(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000B\000A\000R\000R\000I\000E\000R\000\137\000I\000M\000P\000L)
endobj
133 0 obj
-<< /S /GoTo /D (subsection.4.3.2) >>
+<< /S /GoTo /D (subsubsection.5.3.2.5) >>
endobj
136 0 obj
-(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000I\000M\000B)
endobj
137 0 obj
-<< /S /GoTo /D (subsubsection.4.3.2.1) >>
+<< /S /GoTo /D (subsubsection.5.3.2.6) >>
endobj
140 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000o\000k\000\137\000t\000o\000\137\000f\000o\000r\000k)
+(\376\377\000K\000M\000P\000\137\000I\000D\000E\000N\000T\000\137\000K\000M\000P\000C)
endobj
141 0 obj
-<< /S /GoTo /D (section.4.4) >>
+<< /S /GoTo /D (subsection.5.3.3) >>
endobj
144 0 obj
-(\376\377\000S\000t\000a\000r\000t\000u\000p\000\040\000a\000n\000d\000\040\000S\000h\000u\000t\000d\000o\000w\000n)
+(\376\377\000T\000y\000p\000e\000d\000e\000f\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
145 0 obj
-<< /S /GoTo /D (subsection.4.4.1) >>
+<< /S /GoTo /D (subsubsection.5.3.3.1) >>
endobj
148 0 obj
-(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+(\376\377\000i\000d\000e\000n\000t\000\137\000t)
endobj
149 0 obj
-<< /S /GoTo /D (subsection.4.4.2) >>
+<< /S /GoTo /D (section.5.4) >>
endobj
152 0 obj
-(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000D\000e\000p\000r\000e\000c\000a\000t\000e\000d\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000s)
endobj
153 0 obj
-<< /S /GoTo /D (subsubsection.4.4.2.1) >>
+<< /S /GoTo /D (subsection.5.4.1) >>
endobj
156 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000e\000g\000i\000n)
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
endobj
157 0 obj
-<< /S /GoTo /D (subsubsection.4.4.2.2) >>
+<< /S /GoTo /D (subsection.5.4.2) >>
endobj
160 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d)
+(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
161 0 obj
-<< /S /GoTo /D (section.4.5) >>
+<< /S /GoTo /D (subsubsection.5.4.2.1) >>
endobj
164 0 obj
-(\376\377\000P\000a\000r\000a\000l\000l\000e\000l\000\040\000\050\000f\000o\000r\000k\000/\000j\000o\000i\000n\000\051)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000o\000k\000\137\000t\000o\000\137\000f\000o\000r\000k)
endobj
165 0 obj
-<< /S /GoTo /D (subsection.4.5.1) >>
+<< /S /GoTo /D (section.5.5) >>
endobj
168 0 obj
-(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+(\376\377\000S\000t\000a\000r\000t\000u\000p\000\040\000a\000n\000d\000\040\000S\000h\000u\000t\000d\000o\000w\000n)
endobj
169 0 obj
-<< /S /GoTo /D (subsection.4.5.2) >>
+<< /S /GoTo /D (subsection.5.5.1) >>
endobj
172 0 obj
-(\376\377\000T\000y\000p\000e\000d\000e\000f\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
endobj
173 0 obj
-<< /S /GoTo /D (subsubsection.4.5.2.1) >>
+<< /S /GoTo /D (subsection.5.5.2) >>
endobj
176 0 obj
-(\376\377\000k\000m\000p\000c\000\137\000m\000i\000c\000r\000o)
+(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
177 0 obj
-<< /S /GoTo /D (subsection.4.5.3) >>
+<< /S /GoTo /D (subsubsection.5.5.2.1) >>
endobj
180 0 obj
-(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000e\000g\000i\000n)
endobj
181 0 obj
-<< /S /GoTo /D (subsubsection.4.5.3.1) >>
+<< /S /GoTo /D (subsubsection.5.5.2.2) >>
endobj
184 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000s\000e\000r\000i\000a\000l\000i\000z\000e\000d\000\137\000p\000a\000r\000a\000l\000l\000e\000l)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d)
endobj
185 0 obj
-<< /S /GoTo /D (subsubsection.4.5.3.2) >>
+<< /S /GoTo /D (section.5.6) >>
endobj
188 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000k\000\137\000c\000a\000l\000l)
+(\376\377\000P\000a\000r\000a\000l\000l\000e\000l\000\040\000\050\000f\000o\000r\000k\000/\000j\000o\000i\000n\000\051)
endobj
189 0 obj
-<< /S /GoTo /D (subsubsection.4.5.3.3) >>
+<< /S /GoTo /D (subsection.5.6.1) >>
endobj
192 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000k\000\137\000t\000e\000a\000m\000s)
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
endobj
193 0 obj
-<< /S /GoTo /D (subsubsection.4.5.3.4) >>
+<< /S /GoTo /D (subsection.5.6.2) >>
endobj
196 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000p\000u\000s\000h\000\137\000n\000u\000m\000\137\000t\000e\000a\000m\000s)
+(\376\377\000T\000y\000p\000e\000d\000e\000f\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
197 0 obj
-<< /S /GoTo /D (subsubsection.4.5.3.5) >>
+<< /S /GoTo /D (subsubsection.5.6.2.1) >>
endobj
200 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000p\000u\000s\000h\000\137\000n\000u\000m\000\137\000t\000h\000r\000e\000a\000d\000s)
+(\376\377\000k\000m\000p\000c\000\137\000m\000i\000c\000r\000o)
endobj
201 0 obj
-<< /S /GoTo /D (subsubsection.4.5.3.6) >>
+<< /S /GoTo /D (subsection.5.6.3) >>
endobj
204 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000s\000e\000r\000i\000a\000l\000i\000z\000e\000d\000\137\000p\000a\000r\000a\000l\000l\000e\000l)
+(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
205 0 obj
-<< /S /GoTo /D (section.4.6) >>
+<< /S /GoTo /D (subsubsection.5.6.3.1) >>
endobj
208 0 obj
-(\376\377\000T\000h\000r\000e\000a\000d\000\040\000I\000n\000f\000o\000r\000m\000a\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000s\000e\000r\000i\000a\000l\000i\000z\000e\000d\000\137\000p\000a\000r\000a\000l\000l\000e\000l)
endobj
209 0 obj
-<< /S /GoTo /D (subsection.4.6.1) >>
+<< /S /GoTo /D (subsubsection.5.6.3.2) >>
endobj
212 0 obj
-(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000k\000\137\000c\000a\000l\000l)
endobj
213 0 obj
-<< /S /GoTo /D (subsection.4.6.2) >>
+<< /S /GoTo /D (subsubsection.5.6.3.3) >>
endobj
216 0 obj
-(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000k\000\137\000t\000e\000a\000m\000s)
endobj
217 0 obj
-<< /S /GoTo /D (subsubsection.4.6.2.1) >>
+<< /S /GoTo /D (subsubsection.5.6.3.4) >>
endobj
220 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000o\000u\000n\000d\000\137\000n\000u\000m\000\137\000t\000h\000r\000e\000a\000d\000s)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000p\000u\000s\000h\000\137\000n\000u\000m\000\137\000t\000e\000a\000m\000s)
endobj
221 0 obj
-<< /S /GoTo /D (subsubsection.4.6.2.2) >>
+<< /S /GoTo /D (subsubsection.5.6.3.5) >>
endobj
224 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000o\000u\000n\000d\000\137\000t\000h\000r\000e\000a\000d\000\137\000n\000u\000m)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000p\000u\000s\000h\000\137\000n\000u\000m\000\137\000t\000h\000r\000e\000a\000d\000s)
endobj
225 0 obj
-<< /S /GoTo /D (subsubsection.4.6.2.3) >>
+<< /S /GoTo /D (subsubsection.5.6.3.6) >>
endobj
228 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000g\000l\000o\000b\000a\000l\000\137\000n\000u\000m\000\137\000t\000h\000r\000e\000a\000d\000s)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000s\000e\000r\000i\000a\000l\000i\000z\000e\000d\000\137\000p\000a\000r\000a\000l\000l\000e\000l)
endobj
229 0 obj
-<< /S /GoTo /D (subsubsection.4.6.2.4) >>
+<< /S /GoTo /D (section.5.7) >>
endobj
232 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000g\000l\000o\000b\000a\000l\000\137\000t\000h\000r\000e\000a\000d\000\137\000n\000u\000m)
+(\376\377\000T\000h\000r\000e\000a\000d\000\040\000I\000n\000f\000o\000r\000m\000a\000t\000i\000o\000n)
endobj
233 0 obj
-<< /S /GoTo /D (subsubsection.4.6.2.5) >>
+<< /S /GoTo /D (subsection.5.7.1) >>
endobj
236 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000i\000n\000\137\000p\000a\000r\000a\000l\000l\000e\000l)
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
endobj
237 0 obj
-<< /S /GoTo /D (section.4.7) >>
+<< /S /GoTo /D (subsection.5.7.2) >>
endobj
240 0 obj
-(\376\377\000W\000o\000r\000k\000\040\000S\000h\000a\000r\000i\000n\000g)
+(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
241 0 obj
-<< /S /GoTo /D (subsection.4.7.1) >>
+<< /S /GoTo /D (subsubsection.5.7.2.1) >>
endobj
244 0 obj
-(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000o\000u\000n\000d\000\137\000n\000u\000m\000\137\000t\000h\000r\000e\000a\000d\000s)
endobj
245 0 obj
-<< /S /GoTo /D (subsection.4.7.2) >>
+<< /S /GoTo /D (subsubsection.5.7.2.2) >>
endobj
248 0 obj
-(\376\377\000E\000n\000u\000m\000e\000r\000a\000t\000i\000o\000n\000\040\000T\000y\000p\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000o\000u\000n\000d\000\137\000t\000h\000r\000e\000a\000d\000\137\000n\000u\000m)
endobj
249 0 obj
-<< /S /GoTo /D (subsubsection.4.7.2.1) >>
+<< /S /GoTo /D (subsubsection.5.7.2.3) >>
endobj
252 0 obj
-(\376\377\000s\000c\000h\000e\000d\000\137\000t\000y\000p\000e)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000g\000l\000o\000b\000a\000l\000\137\000n\000u\000m\000\137\000t\000h\000r\000e\000a\000d\000s)
endobj
253 0 obj
-<< /S /GoTo /D (subsection.4.7.3) >>
+<< /S /GoTo /D (subsubsection.5.7.2.4) >>
endobj
256 0 obj
-(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000g\000l\000o\000b\000a\000l\000\137\000t\000h\000r\000e\000a\000d\000\137\000n\000u\000m)
endobj
257 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.1) >>
+<< /S /GoTo /D (subsubsection.5.7.2.5) >>
endobj
260 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000c\000r\000i\000t\000i\000c\000a\000l)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000i\000n\000\137\000p\000a\000r\000a\000l\000l\000e\000l)
endobj
261 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.2) >>
+<< /S /GoTo /D (section.5.8) >>
endobj
264 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000f\000i\000n\000i\000\137\0004)
+(\376\377\000W\000o\000r\000k\000\040\000S\000h\000a\000r\000i\000n\000g)
endobj
265 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.3) >>
+<< /S /GoTo /D (subsection.5.8.1) >>
endobj
268 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000f\000i\000n\000i\000\137\0004\000u)
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
endobj
269 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.4) >>
+<< /S /GoTo /D (subsection.5.8.2) >>
endobj
272 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000f\000i\000n\000i\000\137\0008)
+(\376\377\000E\000n\000u\000m\000e\000r\000a\000t\000i\000o\000n\000\040\000T\000y\000p\000e\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
273 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.5) >>
+<< /S /GoTo /D (subsubsection.5.8.2.1) >>
endobj
276 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000f\000i\000n\000i\000\137\0008\000u)
+(\376\377\000s\000c\000h\000e\000d\000\137\000t\000y\000p\000e)
endobj
277 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.6) >>
+<< /S /GoTo /D (subsection.5.8.3) >>
endobj
280 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000i\000n\000i\000t\000\137\0004)
+(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
281 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.7) >>
+<< /S /GoTo /D (subsubsection.5.8.3.1) >>
endobj
284 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000i\000n\000i\000t\000\137\0004\000u)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000c\000r\000i\000t\000i\000c\000a\000l)
endobj
285 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.8) >>
+<< /S /GoTo /D (subsubsection.5.8.3.2) >>
endobj
288 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000i\000n\000i\000t\000\137\0008)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000f\000i\000n\000i\000\137\0004)
endobj
289 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.9) >>
+<< /S /GoTo /D (subsubsection.5.8.3.3) >>
endobj
292 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000i\000n\000i\000t\000\137\0008\000u)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000f\000i\000n\000i\000\137\0004\000u)
endobj
293 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.10) >>
+<< /S /GoTo /D (subsubsection.5.8.3.4) >>
endobj
296 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000n\000e\000x\000t\000\137\0004)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000f\000i\000n\000i\000\137\0008)
endobj
297 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.11) >>
+<< /S /GoTo /D (subsubsection.5.8.3.5) >>
endobj
300 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000n\000e\000x\000t\000\137\0004\000u)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000f\000i\000n\000i\000\137\0008\000u)
endobj
301 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.12) >>
+<< /S /GoTo /D (subsubsection.5.8.3.6) >>
endobj
304 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000n\000e\000x\000t\000\137\0008)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000i\000n\000i\000t\000\137\0004)
endobj
305 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.13) >>
+<< /S /GoTo /D (subsubsection.5.8.3.7) >>
endobj
308 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000n\000e\000x\000t\000\137\0008\000u)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000i\000n\000i\000t\000\137\0004\000u)
endobj
309 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.14) >>
+<< /S /GoTo /D (subsubsection.5.8.3.8) >>
endobj
312 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000c\000r\000i\000t\000i\000c\000a\000l)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000i\000n\000i\000t\000\137\0008)
endobj
313 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.15) >>
+<< /S /GoTo /D (subsubsection.5.8.3.9) >>
endobj
316 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000m\000a\000s\000t\000e\000r)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000i\000n\000i\000t\000\137\0008\000u)
endobj
317 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.16) >>
+<< /S /GoTo /D (subsubsection.5.8.3.10) >>
endobj
320 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000o\000r\000d\000e\000r\000e\000d)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000n\000e\000x\000t\000\137\0004)
endobj
321 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.17) >>
+<< /S /GoTo /D (subsubsection.5.8.3.11) >>
endobj
324 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000s\000i\000n\000g\000l\000e)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000n\000e\000x\000t\000\137\0004\000u)
endobj
325 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.18) >>
+<< /S /GoTo /D (subsubsection.5.8.3.12) >>
endobj
328 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000f\000i\000n\000i)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000n\000e\000x\000t\000\137\0008)
endobj
329 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.19) >>
+<< /S /GoTo /D (subsubsection.5.8.3.13) >>
endobj
332 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0004)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000n\000e\000x\000t\000\137\0008\000u)
endobj
333 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.20) >>
+<< /S /GoTo /D (subsubsection.5.8.3.14) >>
endobj
336 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0004\000u)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000t\000\137\000d\000i\000s\000p\000a\000t\000c\000h\000\137\000i\000n\000i\000t\000\137\0004)
endobj
337 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.21) >>
+<< /S /GoTo /D (subsubsection.5.8.3.15) >>
endobj
340 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0008)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000t\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0004)
endobj
341 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.22) >>
+<< /S /GoTo /D (subsubsection.5.8.3.16) >>
endobj
344 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0008\000u)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000t\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0004\000u)
endobj
345 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.23) >>
+<< /S /GoTo /D (subsubsection.5.8.3.17) >>
endobj
348 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000m\000a\000s\000t\000e\000r)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000t\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0008)
endobj
349 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.24) >>
+<< /S /GoTo /D (subsubsection.5.8.3.18) >>
endobj
352 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000o\000r\000d\000e\000r\000e\000d)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000d\000i\000s\000t\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0008\000u)
endobj
353 0 obj
-<< /S /GoTo /D (subsubsection.4.7.3.25) >>
+<< /S /GoTo /D (subsubsection.5.8.3.19) >>
endobj
356 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000s\000i\000n\000g\000l\000e)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000c\000r\000i\000t\000i\000c\000a\000l)
endobj
357 0 obj
-<< /S /GoTo /D (section.4.8) >>
+<< /S /GoTo /D (subsubsection.5.8.3.20) >>
endobj
360 0 obj
-(\376\377\000S\000y\000n\000c\000h\000r\000o\000n\000i\000z\000a\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000m\000a\000s\000t\000e\000r)
endobj
361 0 obj
-<< /S /GoTo /D (subsection.4.8.1) >>
+<< /S /GoTo /D (subsubsection.5.8.3.21) >>
endobj
364 0 obj
-(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000o\000r\000d\000e\000r\000e\000d)
endobj
365 0 obj
-<< /S /GoTo /D (subsection.4.8.2) >>
+<< /S /GoTo /D (subsubsection.5.8.3.22) >>
endobj
368 0 obj
-(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000s\000i\000n\000g\000l\000e)
endobj
369 0 obj
-<< /S /GoTo /D (subsubsection.4.8.2.1) >>
+<< /S /GoTo /D (subsubsection.5.8.3.23) >>
endobj
372 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000a\000r\000r\000i\000e\000r)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000f\000i\000n\000i)
endobj
373 0 obj
-<< /S /GoTo /D (subsubsection.4.8.2.2) >>
+<< /S /GoTo /D (subsubsection.5.8.3.24) >>
endobj
376 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000a\000r\000r\000i\000e\000r\000\137\000m\000a\000s\000t\000e\000r)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0004)
endobj
377 0 obj
-<< /S /GoTo /D (subsubsection.4.8.2.3) >>
+<< /S /GoTo /D (subsubsection.5.8.3.25) >>
endobj
380 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000a\000r\000r\000i\000e\000r\000\137\000m\000a\000s\000t\000e\000r\000\137\000n\000o\000w\000a\000i\000t)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0004\000u)
endobj
381 0 obj
-<< /S /GoTo /D (subsubsection.4.8.2.4) >>
+<< /S /GoTo /D (subsubsection.5.8.3.26) >>
endobj
384 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000b\000a\000r\000r\000i\000e\000r\000\137\000m\000a\000s\000t\000e\000r)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0008)
endobj
385 0 obj
-<< /S /GoTo /D (subsubsection.4.8.2.5) >>
+<< /S /GoTo /D (subsubsection.5.8.3.27) >>
endobj
388 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000r\000e\000d\000u\000c\000e)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000o\000r\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0008\000u)
endobj
389 0 obj
-<< /S /GoTo /D (subsubsection.4.8.2.6) >>
+<< /S /GoTo /D (subsubsection.5.8.3.28) >>
endobj
392 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000r\000e\000d\000u\000c\000e\000\137\000n\000o\000w\000a\000i\000t)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000m\000a\000s\000t\000e\000r)
endobj
393 0 obj
-<< /S /GoTo /D (subsubsection.4.8.2.7) >>
+<< /S /GoTo /D (subsubsection.5.8.3.29) >>
endobj
396 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000l\000u\000s\000h)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000o\000r\000d\000e\000r\000e\000d)
endobj
397 0 obj
-<< /S /GoTo /D (subsubsection.4.8.2.8) >>
+<< /S /GoTo /D (subsubsection.5.8.3.30) >>
endobj
400 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000r\000e\000d\000u\000c\000e)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000s\000i\000n\000g\000l\000e)
endobj
401 0 obj
-<< /S /GoTo /D (subsubsection.4.8.2.9) >>
+<< /S /GoTo /D (subsubsection.5.8.3.31) >>
endobj
404 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000r\000e\000d\000u\000c\000e\000\137\000n\000o\000w\000a\000i\000t)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000t\000e\000a\000m\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0004)
endobj
405 0 obj
-<< /S /GoTo /D (section.4.9) >>
+<< /S /GoTo /D (subsubsection.5.8.3.32) >>
endobj
408 0 obj
-(\376\377\000T\000h\000r\000e\000a\000d\000\040\000p\000r\000i\000v\000a\000t\000e\000\040\000d\000a\000t\000a\000\040\000s\000u\000p\000p\000o\000r\000t)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000t\000e\000a\000m\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0004\000u)
endobj
409 0 obj
-<< /S /GoTo /D (subsection.4.9.1) >>
+<< /S /GoTo /D (subsubsection.5.8.3.33) >>
endobj
412 0 obj
-(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000t\000e\000a\000m\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0008)
endobj
413 0 obj
-<< /S /GoTo /D (subsection.4.9.2) >>
+<< /S /GoTo /D (subsubsection.5.8.3.34) >>
endobj
416 0 obj
-(\376\377\000T\000y\000p\000e\000d\000e\000f\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000t\000e\000a\000m\000\137\000s\000t\000a\000t\000i\000c\000\137\000i\000n\000i\000t\000\137\0008\000u)
endobj
417 0 obj
-<< /S /GoTo /D (subsubsection.4.9.2.1) >>
+<< /S /GoTo /D (section.5.9) >>
endobj
420 0 obj
-(\376\377\000k\000m\000p\000c\000\137\000c\000c\000t\000o\000r)
+(\376\377\000S\000y\000n\000c\000h\000r\000o\000n\000i\000z\000a\000t\000i\000o\000n)
endobj
421 0 obj
-<< /S /GoTo /D (subsubsection.4.9.2.2) >>
+<< /S /GoTo /D (subsection.5.9.1) >>
endobj
424 0 obj
-(\376\377\000k\000m\000p\000c\000\137\000c\000c\000t\000o\000r\000\137\000v\000e\000c)
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
endobj
425 0 obj
-<< /S /GoTo /D (subsubsection.4.9.2.3) >>
+<< /S /GoTo /D (subsection.5.9.2) >>
endobj
428 0 obj
-(\376\377\000k\000m\000p\000c\000\137\000c\000t\000o\000r)
+(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
429 0 obj
-<< /S /GoTo /D (subsubsection.4.9.2.4) >>
+<< /S /GoTo /D (subsubsection.5.9.2.1) >>
endobj
432 0 obj
-(\376\377\000k\000m\000p\000c\000\137\000c\000t\000o\000r\000\137\000v\000e\000c)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000a\000r\000r\000i\000e\000r)
endobj
433 0 obj
-<< /S /GoTo /D (subsubsection.4.9.2.5) >>
+<< /S /GoTo /D (subsubsection.5.9.2.2) >>
endobj
436 0 obj
-(\376\377\000k\000m\000p\000c\000\137\000d\000t\000o\000r)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000a\000r\000r\000i\000e\000r\000\137\000m\000a\000s\000t\000e\000r)
endobj
437 0 obj
-<< /S /GoTo /D (subsubsection.4.9.2.6) >>
+<< /S /GoTo /D (subsubsection.5.9.2.3) >>
endobj
440 0 obj
-(\376\377\000k\000m\000p\000c\000\137\000d\000t\000o\000r\000\137\000v\000e\000c)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000b\000a\000r\000r\000i\000e\000r\000\137\000m\000a\000s\000t\000e\000r\000\137\000n\000o\000w\000a\000i\000t)
endobj
441 0 obj
-<< /S /GoTo /D (subsection.4.9.3) >>
+<< /S /GoTo /D (subsubsection.5.9.2.4) >>
endobj
444 0 obj
-(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000b\000a\000r\000r\000i\000e\000r\000\137\000m\000a\000s\000t\000e\000r)
endobj
445 0 obj
-<< /S /GoTo /D (subsubsection.4.9.3.1) >>
+<< /S /GoTo /D (subsubsection.5.9.2.5) >>
endobj
448 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000c\000o\000p\000y\000p\000r\000i\000v\000a\000t\000e)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000r\000e\000d\000u\000c\000e)
endobj
449 0 obj
-<< /S /GoTo /D (subsubsection.4.9.3.2) >>
+<< /S /GoTo /D (subsubsection.5.9.2.6) >>
endobj
452 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000t\000h\000r\000e\000a\000d\000p\000r\000i\000v\000a\000t\000e\000\137\000c\000a\000c\000h\000e\000d)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000e\000n\000d\000\137\000r\000e\000d\000u\000c\000e\000\137\000n\000o\000w\000a\000i\000t)
endobj
453 0 obj
-<< /S /GoTo /D (subsubsection.4.9.3.3) >>
+<< /S /GoTo /D (subsubsection.5.9.2.7) >>
endobj
456 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000t\000h\000r\000e\000a\000d\000p\000r\000i\000v\000a\000t\000e\000\137\000r\000e\000g\000i\000s\000t\000e\000r)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000f\000l\000u\000s\000h)
endobj
457 0 obj
-<< /S /GoTo /D (subsubsection.4.9.3.4) >>
+<< /S /GoTo /D (subsubsection.5.9.2.8) >>
endobj
460 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000t\000h\000r\000e\000a\000d\000p\000r\000i\000v\000a\000t\000e\000\137\000r\000e\000g\000i\000s\000t\000e\000r\000\137\000v\000e\000c)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000r\000e\000d\000u\000c\000e)
endobj
461 0 obj
-<< /S /GoTo /D (section.4.10) >>
+<< /S /GoTo /D (subsubsection.5.9.2.9) >>
endobj
464 0 obj
-(\376\377\000T\000a\000s\000k\000i\000n\000g\000\040\000s\000u\000p\000p\000o\000r\000t)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000r\000e\000d\000u\000c\000e\000\137\000n\000o\000w\000a\000i\000t)
endobj
465 0 obj
-<< /S /GoTo /D (subsection.4.10.1) >>
+<< /S /GoTo /D (section.5.10) >>
endobj
468 0 obj
-(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+(\376\377\000T\000h\000r\000e\000a\000d\000\040\000p\000r\000i\000v\000a\000t\000e\000\040\000d\000a\000t\000a\000\040\000s\000u\000p\000p\000o\000r\000t)
endobj
469 0 obj
-<< /S /GoTo /D (subsection.4.10.2) >>
+<< /S /GoTo /D (subsection.5.10.1) >>
endobj
472 0 obj
-(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
endobj
473 0 obj
-<< /S /GoTo /D (subsubsection.4.10.2.1) >>
+<< /S /GoTo /D (subsection.5.10.2) >>
endobj
476 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000o\000m\000p\000\137\000t\000a\000s\000k\000\137\000w\000i\000t\000h\000\137\000d\000e\000p\000s)
+(\376\377\000T\000y\000p\000e\000d\000e\000f\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
477 0 obj
-<< /S /GoTo /D (subsubsection.4.10.2.2) >>
+<< /S /GoTo /D (subsubsection.5.10.2.1) >>
endobj
480 0 obj
-(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000o\000m\000p\000\137\000w\000a\000i\000t\000\137\000d\000e\000p\000s)
+(\376\377\000k\000m\000p\000c\000\137\000c\000c\000t\000o\000r)
endobj
481 0 obj
-<< /S /GoTo /D (chapter.5) >>
+<< /S /GoTo /D (subsubsection.5.10.2.2) >>
endobj
484 0 obj
-(\376\377\000C\000l\000a\000s\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000k\000m\000p\000c\000\137\000c\000c\000t\000o\000r\000\137\000v\000e\000c)
endobj
485 0 obj
-<< /S /GoTo /D (section.5.1) >>
+<< /S /GoTo /D (subsubsection.5.10.2.3) >>
endobj
488 0 obj
-(\376\377\000i\000d\000e\000n\000t\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+(\376\377\000k\000m\000p\000c\000\137\000c\000t\000o\000r)
endobj
489 0 obj
-<< /S /GoTo /D (subsection.5.1.1) >>
+<< /S /GoTo /D (subsubsection.5.10.2.4) >>
endobj
492 0 obj
-(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+(\376\377\000k\000m\000p\000c\000\137\000c\000t\000o\000r\000\137\000v\000e\000c)
endobj
493 0 obj
-<< /S /GoTo /D (subsection.5.1.2) >>
+<< /S /GoTo /D (subsubsection.5.10.2.5) >>
endobj
496 0 obj
-(\376\377\000M\000e\000m\000b\000e\000r\000\040\000D\000a\000t\000a\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+(\376\377\000k\000m\000p\000c\000\137\000d\000t\000o\000r)
endobj
497 0 obj
-<< /S /GoTo /D (subsubsection.5.1.2.1) >>
+<< /S /GoTo /D (subsubsection.5.10.2.6) >>
endobj
500 0 obj
-(\376\377\000f\000l\000a\000g\000s)
+(\376\377\000k\000m\000p\000c\000\137\000d\000t\000o\000r\000\137\000v\000e\000c)
endobj
501 0 obj
-<< /S /GoTo /D (subsubsection.5.1.2.2) >>
+<< /S /GoTo /D (subsection.5.10.3) >>
endobj
504 0 obj
-(\376\377\000p\000s\000o\000u\000r\000c\000e)
+(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
endobj
505 0 obj
-<< /S /GoTo /D (subsubsection.5.1.2.3) >>
+<< /S /GoTo /D (subsubsection.5.10.3.1) >>
endobj
508 0 obj
-(\376\377\000r\000e\000s\000e\000r\000v\000e\000d\000\137\0001)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000c\000o\000p\000y\000p\000r\000i\000v\000a\000t\000e)
endobj
509 0 obj
-<< /S /GoTo /D (subsubsection.5.1.2.4) >>
+<< /S /GoTo /D (subsubsection.5.10.3.2) >>
endobj
512 0 obj
-(\376\377\000r\000e\000s\000e\000r\000v\000e\000d\000\137\0002)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000t\000h\000r\000e\000a\000d\000p\000r\000i\000v\000a\000t\000e\000\137\000c\000a\000c\000h\000e\000d)
endobj
513 0 obj
-<< /S /GoTo /D (subsubsection.5.1.2.5) >>
+<< /S /GoTo /D (subsubsection.5.10.3.3) >>
endobj
516 0 obj
-(\376\377\000r\000e\000s\000e\000r\000v\000e\000d\000\137\0003)
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000t\000h\000r\000e\000a\000d\000p\000r\000i\000v\000a\000t\000e\000\137\000r\000e\000g\000i\000s\000t\000e\000r)
endobj
517 0 obj
-<< /S /GoTo /D (subsubsection.5.1.2.5) >>
+<< /S /GoTo /D (subsubsection.5.10.3.4) >>
+endobj
+520 0 obj
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000t\000h\000r\000e\000a\000d\000p\000r\000i\000v\000a\000t\000e\000\137\000r\000e\000g\000i\000s\000t\000e\000r\000\137\000v\000e\000c)
+endobj
+521 0 obj
+<< /S /GoTo /D (section.5.11) >>
+endobj
+524 0 obj
+(\376\377\000S\000t\000a\000t\000i\000s\000t\000i\000c\000s\000\040\000G\000a\000t\000h\000e\000r\000i\000n\000g\000\040\000f\000r\000o\000m\000\040\000O\000M\000P\000T\000B)
+endobj
+525 0 obj
+<< /S /GoTo /D (subsection.5.11.1) >>
+endobj
+528 0 obj
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+endobj
+529 0 obj
+<< /S /GoTo /D (subsection.5.11.2) >>
+endobj
+532 0 obj
+(\376\377\000E\000n\000v\000i\000r\000o\000n\000m\000e\000n\000t\000\040\000V\000a\000r\000i\000a\000b\000l\000e\000s)
+endobj
+533 0 obj
+<< /S /GoTo /D (subsection.5.11.3) >>
+endobj
+536 0 obj
+(\376\377\000M\000a\000c\000r\000o\000\040\000D\000e\000f\000i\000n\000i\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+endobj
+537 0 obj
+<< /S /GoTo /D (subsubsection.5.11.3.1) >>
+endobj
+540 0 obj
+(\376\377\000K\000M\000P\000\137\000C\000O\000U\000N\000T\000\137\000B\000L\000O\000C\000K)
+endobj
+541 0 obj
+<< /S /GoTo /D (subsubsection.5.11.3.2) >>
+endobj
+544 0 obj
+(\376\377\000K\000M\000P\000\137\000C\000O\000U\000N\000T\000\137\000V\000A\000L\000U\000E)
+endobj
+545 0 obj
+<< /S /GoTo /D (subsubsection.5.11.3.3) >>
+endobj
+548 0 obj
+(\376\377\000K\000M\000P\000\137\000F\000O\000R\000E\000A\000C\000H\000\137\000C\000O\000U\000N\000T\000E\000R)
+endobj
+549 0 obj
+<< /S /GoTo /D (subsubsection.5.11.3.4) >>
+endobj
+552 0 obj
+(\376\377\000K\000M\000P\000\137\000F\000O\000R\000E\000A\000C\000H\000\137\000E\000X\000P\000L\000I\000C\000I\000T\000\137\000T\000I\000M\000E\000R)
+endobj
+553 0 obj
+<< /S /GoTo /D (subsubsection.5.11.3.5) >>
+endobj
+556 0 obj
+(\376\377\000K\000M\000P\000\137\000F\000O\000R\000E\000A\000C\000H\000\137\000T\000I\000M\000E\000R)
+endobj
+557 0 obj
+<< /S /GoTo /D (subsubsection.5.11.3.6) >>
+endobj
+560 0 obj
+(\376\377\000K\000M\000P\000\137\000O\000U\000T\000P\000U\000T\000\137\000S\000T\000A\000T\000S)
+endobj
+561 0 obj
+<< /S /GoTo /D (subsubsection.5.11.3.7) >>
+endobj
+564 0 obj
+(\376\377\000K\000M\000P\000\137\000R\000E\000S\000E\000T\000\137\000S\000T\000A\000T\000S)
+endobj
+565 0 obj
+<< /S /GoTo /D (subsubsection.5.11.3.8) >>
+endobj
+568 0 obj
+(\376\377\000K\000M\000P\000\137\000S\000T\000A\000R\000T\000\137\000E\000X\000P\000L\000I\000C\000I\000T\000\137\000T\000I\000M\000E\000R)
+endobj
+569 0 obj
+<< /S /GoTo /D (subsubsection.5.11.3.9) >>
+endobj
+572 0 obj
+(\376\377\000K\000M\000P\000\137\000S\000T\000O\000P\000\137\000E\000X\000P\000L\000I\000C\000I\000T\000\137\000T\000I\000M\000E\000R)
+endobj
+573 0 obj
+<< /S /GoTo /D (subsubsection.5.11.3.10) >>
+endobj
+576 0 obj
+(\376\377\000K\000M\000P\000\137\000T\000I\000M\000E\000\137\000B\000L\000O\000C\000K)
+endobj
+577 0 obj
+<< /S /GoTo /D (section.5.12) >>
+endobj
+580 0 obj
+(\376\377\000T\000a\000s\000k\000i\000n\000g\000\040\000s\000u\000p\000p\000o\000r\000t)
+endobj
+581 0 obj
+<< /S /GoTo /D (subsection.5.12.1) >>
+endobj
+584 0 obj
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+endobj
+585 0 obj
+<< /S /GoTo /D (subsection.5.12.2) >>
endobj
-519 0 obj
+588 0 obj
+(\376\377\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+endobj
+589 0 obj
+<< /S /GoTo /D (subsubsection.5.12.2.1) >>
+endobj
+592 0 obj
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000o\000m\000p\000\137\000t\000a\000s\000k\000\137\000w\000i\000t\000h\000\137\000d\000e\000p\000s)
+endobj
+593 0 obj
+<< /S /GoTo /D (subsubsection.5.12.2.2) >>
+endobj
+596 0 obj
+(\376\377\000\137\000\137\000k\000m\000p\000c\000\137\000o\000m\000p\000\137\000w\000a\000i\000t\000\137\000d\000e\000p\000s)
+endobj
+597 0 obj
+<< /S /GoTo /D (section.5.13) >>
+endobj
+600 0 obj
+(\376\377\000U\000s\000e\000r\000\040\000v\000i\000s\000i\000b\000l\000e\000\040\000f\000u\000n\000c\000t\000i\000o\000n\000s)
+endobj
+601 0 obj
+<< /S /GoTo /D (chapter.6) >>
+endobj
+604 0 obj
+(\376\377\000C\000l\000a\000s\000s\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+endobj
+605 0 obj
+<< /S /GoTo /D (section.6.1) >>
+endobj
+608 0 obj
+(\376\377\000i\000d\000e\000n\000t\000\040\000S\000t\000r\000u\000c\000t\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+609 0 obj
+<< /S /GoTo /D (subsection.6.1.1) >>
+endobj
+612 0 obj
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+endobj
+613 0 obj
+<< /S /GoTo /D (subsection.6.1.2) >>
+endobj
+616 0 obj
+(\376\377\000M\000e\000m\000b\000e\000r\000\040\000D\000a\000t\000a\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+endobj
+617 0 obj
+<< /S /GoTo /D (subsubsection.6.1.2.1) >>
+endobj
+620 0 obj
+(\376\377\000f\000l\000a\000g\000s)
+endobj
+621 0 obj
+<< /S /GoTo /D (subsubsection.6.1.2.2) >>
+endobj
+624 0 obj
+(\376\377\000p\000s\000o\000u\000r\000c\000e)
+endobj
+625 0 obj
+<< /S /GoTo /D (subsubsection.6.1.2.3) >>
+endobj
+628 0 obj
+(\376\377\000r\000e\000s\000e\000r\000v\000e\000d\000\137\0001)
+endobj
+629 0 obj
+<< /S /GoTo /D (subsubsection.6.1.2.4) >>
+endobj
+632 0 obj
+(\376\377\000r\000e\000s\000e\000r\000v\000e\000d\000\137\0002)
+endobj
+633 0 obj
+<< /S /GoTo /D (subsubsection.6.1.2.5) >>
+endobj
+636 0 obj
+(\376\377\000r\000e\000s\000e\000r\000v\000e\000d\000\137\0003)
+endobj
+637 0 obj
+<< /S /GoTo /D (section.6.2) >>
+endobj
+640 0 obj
+(\376\377\000k\000m\000p\000\137\000f\000l\000a\000g\000<\000\040\000P\000\040\000>\000\040\000C\000l\000a\000s\000s\000\040\000T\000e\000m\000p\000l\000a\000t\000e\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+641 0 obj
+<< /S /GoTo /D (subsection.6.2.1) >>
+endobj
+644 0 obj
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+endobj
+645 0 obj
+<< /S /GoTo /D (subsection.6.2.2) >>
+endobj
+648 0 obj
+(\376\377\000M\000e\000m\000b\000e\000r\000\040\000F\000u\000n\000c\000t\000i\000o\000n\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+endobj
+649 0 obj
+<< /S /GoTo /D (subsubsection.6.2.2.1) >>
+endobj
+652 0 obj
+(\376\377\000g\000e\000t)
+endobj
+653 0 obj
+<< /S /GoTo /D (subsubsection.6.2.2.2) >>
+endobj
+656 0 obj
+(\376\377\000g\000e\000t\000\137\000t\000y\000p\000e)
+endobj
+657 0 obj
+<< /S /GoTo /D (subsection.6.2.3) >>
+endobj
+660 0 obj
+(\376\377\000M\000e\000m\000b\000e\000r\000\040\000D\000a\000t\000a\000\040\000D\000o\000c\000u\000m\000e\000n\000t\000a\000t\000i\000o\000n)
+endobj
+661 0 obj
+<< /S /GoTo /D (subsubsection.6.2.3.1) >>
+endobj
+664 0 obj
+(\376\377\000l\000o\000c)
+endobj
+665 0 obj
+<< /S /GoTo /D (subsubsection.6.2.3.2) >>
+endobj
+668 0 obj
+(\376\377\000t)
+endobj
+669 0 obj
+<< /S /GoTo /D (section.6.3) >>
+endobj
+672 0 obj
+(\376\377\000s\000t\000a\000t\000s\000\137\000f\000l\000a\000g\000s\000\137\000e\000\040\000C\000l\000a\000s\000s\000\040\000R\000e\000f\000e\000r\000e\000n\000c\000e)
+endobj
+673 0 obj
+<< /S /GoTo /D (subsection.6.3.1) >>
+endobj
+676 0 obj
+(\376\377\000D\000e\000t\000a\000i\000l\000e\000d\000\040\000D\000e\000s\000c\000r\000i\000p\000t\000i\000o\000n)
+endobj
+677 0 obj
+<< /S /GoTo /D (subsection.6.3.1) >>
+endobj
+679 0 obj
(\376\377\000I\000n\000d\000e\000x)
endobj
-520 0 obj
-<< /S /GoTo /D [521 0 R /Fit ] >>
+680 0 obj
+<< /S /GoTo /D [681 0 R /Fit ] >>
endobj
-523 0 obj <<
-/Length 257
+683 0 obj <<
+/Length 258
/Filter /FlateDecode
>>
stream
-xÚ…ÑMK1àûþŠaÇ™I&=ж(Š"{SÖÆ² «”ì¿w?j]±ài†ðæa&AµV¨þSOªâxî¼"†D$ªzVŒ¼'%Ö‚$§ª•ºÓçM›_ÌCu1¤DŠ4„8d%ÀÆä=‹ß',XvªœD¯ßssus@„äâT=:DH艷M[¿fSrˆú²^n ¡~ܘҢÞþA’ï‰28Tél·È ,r“Ç›m^ÖÒp/ ýé›é¸Ïí:7ãA ´÷# Oaxž
+xÚ…ÑMKA à{EŽ;ÂÆ$“ùêQ´EQÝ›z°t,]KYÁþ{·;¥V,xJÞ<Lf@0Ñ?õ¬NÔ &fÍ+)zÏà¬E—š9<V—m—ßÌss5¤FŽ<„•
+…’|ç÷Á–­(ÔÑÛUnoŽ0i<TOŽ‘ù_âýgÛ-ß³©%Äêz9[¦êemjKÕæ‡ .ù-QE§j%´ý"ƒ2Ím.“]žkfd+ ýù‡é¹¯Í"·å€1¢EÞûɧ0<O@gjñÈ‹>1êªþJìªe™ȫ҈ßUbÝÑ~,n¬ikÿù¼‹fô GDmÖ
endstream
endobj
-521 0 obj <<
+681 0 obj <<
/Type /Page
-/Contents 523 0 R
-/Resources 522 0 R
+/Contents 683 0 R
+/Resources 682 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 526 0 R
+/Parent 686 0 R
>> endobj
-524 0 obj <<
-/D [521 0 R /XYZ 70.866 771.024 null]
+684 0 obj <<
+/D [681 0 R /XYZ 70.866 771.024 null]
>> endobj
-522 0 obj <<
-/Font << /F46 525 0 R >>
+682 0 obj <<
+/Font << /F46 685 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-529 0 obj <<
-/Length 1184
+689 0 obj <<
+/Length 1186
/Filter /FlateDecode
>>
stream
-xÚ•VYoÜ6~ß_! •
-¯L]””·Ä‰IíÚ @’Z¢w‰HäFGÝí¯ï í®,4퓆3Ã9¾9(âm=âݬÞlV—×eæaIiâmž¼œ„¥^^Æ!¼Mí}öãàëæýêÝfõ}Á-âE“VQ„EœzU»úü•x5ÈÞ{$LÊÂ{Öš­—fI˜¥ Ð÷°ú}E~è™F!q®¯7WÁ:Î ÿv?ˆVüÍ¡¤áü¦Qq íò:¥'vˆ·Ž¢°Ì2câW9ðæç #~¬“¸ô+ÕîEÃ;{lYÿ`ª[`J5X© "ˆ2ŸΠìwg=k-Uóm¿ãöü„}©äZf݉ªSûNU¼ï• ìì‚:É¿w>Ù€éÏfz$‰ˆQŠï£eêˆáë¼9÷é…Á:J³ã½½7
-Æ|jù¢1°óuJH´h“ø£öͪaìxm$˜ÐÁЖp²ž‡&V[ÿxf}]ó=—5—ƒIzŠ1ˆ|[tà
-i¾ÃNhNæƒJiئù€+À+«-€S/Ãaì­Î³v†åJÌån¤$÷¯°RâL,‚5kÑ4¶P!Ñïy%¾Wx6ƒ‹|ëIí˜uÕN \ciØÌÌf`;SKOÇtÉÜ‹<ò2óïÎúɨi{ß……¹4Úû}#*¦«Û€…¸ Gøã"÷?é‘­'Y÷êgpYqýE#‚ªS(hUg y@YÜêIÇ·¬«…Üš+zŒ
-²±0uT7£ŽòJ!*MlÝ…±?mdÓrvp÷kHúÚ> Z²ÁЉ~z8~ŠI‘‚¤æí8{ƒf†6AœÕ¼eÝ·þ_ÞzòÖ\7p%-ij‘OíáĆºÛ «ÖÙ˜³¨´[ ß7›7î’™+ezr¯Ì¥ã)¤ƒÍšýÀð„ˆh8v©ë‹¶qÎõŽÅS¥Fik'x?!­Ó§!M²È¥Ÿ†„&ý_ÊÂ,½u¤Ûaò"áµìg=Ú-]÷nÉÙ§X m*UÃDë–ëg‰ÂHìÝ®8œ#§Ÿ‘c>ÞÚÆwVugçöáÇ»c¨³H‡%½FmÕ¬œ0.¢ø´œXÞEïÏ6rîmks¬è³á½Q ÊØÕçs‘¹ÄÜ
+xÚ•VKÛ6¾ûWè¡R±ÖR/JÊ-ÙfƒMw»ë
+rS°Ä·ºZ´´.!—6Ú­õ!1ÔãKÆ|jù¢1°ó5$$Z´IüQûfÕ0v¼6’'t4´NK8YÏC
+«­¸°¾®ùËšËÁ€žb "߸Bšï°š“ù` †R¶i>à
+Æj›À©—á0öVçY {Ãr¥ær7R’û7Ø
+BKÏÇtÉÜ y™ù÷ gýdÔ4޽ïÂÂÎ\íáÓÕmÀB\ÐSúã"÷?ê‘­'YêgpYqÃ}7ŠGU'(hUg y@YÜêIÇw¬«…Ü™+zŒždca>ê¨nF啬˜lbë.Œýy#›–³€»_§t¡¯íÓ U VLôÓÃñCL¢ˆ$5oÇÅ43´
+Øà¬æ-ë¾öÿòÖг·æÊ¸ùƒ+iIS‹|j'6Ôý^XµÎÆ<˜E¥Ýêô}µ¸q—ÌìÜ(Ó“e.H!]Ú¬Ù Oøˆ §À®u}Ñ6ιޱxªÔ(míï§Lkø4¤I9øiHHaàÿ´¡,ÌòØ['ð7a“t7L^$¼–ý,GOvK×½[rö)ÖB ¥j˜hݲcý (ŒÄÁíŠãeæô3rÂã­m|Uwvî`~¸?…:‹tXÒkÔNÍÊ ã"úOËù»å]4üúb3!çÁ¶6ÇŠ>ÞÅ Œ]}9™æ¨VÕØêM¯;¥w½tй¶ußí­üsœE04ÉÕê¾´ÔÝX“µÞåc¶Hu°ÓŸáÒf–ÃæÿùÍt¿—4Œsšb#Æ”„eš‚fH©mÅwðNwlp…q“sÛÙ‰|äCÄÔ~I”*¢¯âìUš›ÓKà&IçrF/Šh–M •yR`DQ…q‚Hu0°8“i%âÎ@'v:0•Â5â¯â©Ót³mù³ÂZþuÜi.ç9þ á3.
endstream
endobj
-528 0 obj <<
+688 0 obj <<
/Type /Page
-/Contents 529 0 R
-/Resources 527 0 R
+/Contents 689 0 R
+/Resources 687 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 526 0 R
+/Parent 686 0 R
>> endobj
-527 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F99 531 0 R >>
+687 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-564 0 obj <<
-/Length 1078
+724 0 obj <<
+/Length 1124
/Filter /FlateDecode
>>
stream
-xÚíš[oÚH†ïó+|i_xvÎã¹$@"vC‰¨«VjW‘ N° õaÛþûÎØc¶II‚´Ú˜^Ä‡â™øùÞïH õ`AëúVG€™>Õ‡ë‹Kÿâ+……1 ÐÖo <Î-.àYþÜúl÷×qÆYêüíÿù¸”ú‰¬D_è“éµZK2Ë’s¢W‚–ËÕ•ºW,‚©öH­µü‚w\Ƹ=Ù„ñøV¯¬—–Tc®÷ DªUЧ¿@Ḣv÷€
-Z}fšÇY´
- Ͼ‰¾&A¢ö„öÏòŽÞ8¹fáÞkXŸÕJé©ß¯¼Ý|+ÊwvtQ€¤å"$áæÝ@ñvœëM’õ<ŸeÑ:®ïãbýÖ¬<ðS^ñ.,$‡ ¥·olŒr™GËy?”:ÈF"•^jf’Ržmp2cƒ÷ùf³VþH¡…sc
-ü}Ò”z€©çÍD9É „
-ïÈFP³Æ†õ8˜%ë
-´þ Ž
-ȵL¥‚\ z!d'y¶Må
-¨Û©Ü_ãÛ»Ñ`øÎ¿ëù“ñ¨¯øÝM‡ƒýa!ƒÿ¯yÐӮݦ´ítmÊrÛSP¦Mo†ofŒÿV¤Áê²7ކšÕÝðÓmó!½]4l }
-ÍhÜDÓÐÒÛ• k°/RÁÝY¿€oðSgýæWŒ^—ɹ‡ò1Åͦž‡÷¿íuu³‰:^±ÉÚŸw•Ç¡ñ “±©
+xÚíZ]s›F}÷¯à û½ì£-É®[»Î8êä!éxÚXL¨|´É¿ï.,HäH¶f:áƒ0ìŠsÎ=÷î]ëÙÖÍhŽ¢úTn.®æï®!àB>²æ_-<Ÿ1‹qê1­ùÂúdOÒ¤I‘;ÎÝ ¥~C+ÓôÉãKPË÷cX,—qϧ¨:.T?ö­+þŒ(s\J™ý°–Éý{=²z\XB=Ž˜~܇ÆBR=ý
+á«ïW_î¿a[3º+€„åBîq]ýn^õvŒéI²tQ†E”&Ýy|ŒmO¿5­씟Ø9 {‰Ò‚Û%R®Ê(^DÉs­ƒbi$Òè¥C“bäàd`ÃÁ‡r½NU<`ra˜ßÕ'Aú”k¯Q±ŽžËÌQ¡è8Ê{Dý³AŒ41H_;„Ú™²lW&èIºZG±Ìò&ÚEýá_³fRû/s)*–ÍQ¾áªCgäL¡¦ꇲˆ£D;KBÈù9ÃÿÆ*_$=’ª¤Œ1²/‹Læy›òe5ôƒ¨Ôò‚/v,{ŽÃ):´+˜ñ>˜1ô|À\MT 5)³LŠ5²s*0e¸L¢¿Ë^–ežƒÄ¡ b?¢`LdÀ¼.‹2“‡` £#˜.%W«ƒR¿”¯Ö ‚ª¤P±Ž;‹G]P ƒ~¡AðèÑGyôáR熗ٷ`µ°\“1wž†5ä¸ÜÉÛÜùQÇÆnyøaÙäË&¡{ÑÙ‚_EÙÛSØéb¸X÷I|ËEƵé•ܧ‹2–S-¤£@ÿ¶‹2!¾GÕ³¦ÂìbŒ=ÖòÞLÛ¶1ê‰ó>¡p,kOšü@‘@â B6"ÁF$¿DRwºT}êü¶ŒÂ >F2âU’1V[ÉLâ 7kEýêT.*×vËi F­¼F+âh­x
+Ć|¡¥ýcµÐ4MÃr¥ÖwA¿»Ý• ~‹dh+™Ë"]Ea=ûÃZ¾ÐÄc©þ
+…àcÊÂf¥¯Ë©,‚(nš(S™‡¦$\í|@@йC_c¾õ:Œx³…ñÑ!JùQñîQÆ2ÈM@¦Û!¡èÌûÀS0J¿'}¤°ÇIÒ›ô8°5 ±FëY¢å­’Ζ̷bß×Ý̤÷5†¶^?/L‡zµ°m¯Vï¨ÏO…ưƒ¥|,º·À/ <Ør¤ížçU7ÅK«×þÖFc½ûVKW$Áãü~þFïû9nýü>³´Zïó'ÑÆÓ7Ë åâÐs.~.<èx{9Þòòßîß?ÝNg¿ÏŸ.ç÷·
+¾ÉÓãlúÇdÖ³vðú/ìüãY}œÍ/þT¡Îg
endstream
endobj
-563 0 obj <<
+723 0 obj <<
/Type /Page
-/Contents 564 0 R
-/Resources 562 0 R
+/Contents 724 0 R
+/Resources 722 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 526 0 R
-/Annots [ 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R ]
+/Parent 686 0 R
+/Annots [ 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R ]
>> endobj
-532 0 obj <<
+692 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [69.87 603.843 269.381 614.255]
+/Rect [69.87 604.987 269.381 615.399]
/Subtype /Link
/A << /S /GoTo /D (chapter.1) >>
>> endobj
-533 0 obj <<
+693 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 587.661 156.569 596.145]
+/Rect [84.814 589.033 156.569 597.517]
/Subtype /Link
/A << /S /GoTo /D (section.1.1) >>
>> endobj
-534 0 obj <<
+694 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 567.833 192.443 578.209]
+/Rect [84.814 569.434 192.443 579.81]
/Subtype /Link
/A << /S /GoTo /D (section.1.2) >>
>> endobj
-535 0 obj <<
+695 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 549.897 253.511 560.479]
+/Rect [84.814 551.727 253.511 562.309]
/Subtype /Link
/A << /S /GoTo /D (section.1.3) >>
>> endobj
-536 0 obj <<
+696 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 532.069 284.247 542.543]
+/Rect [84.814 534.127 284.247 544.602]
/Subtype /Link
/A << /S /GoTo /D (section.1.4) >>
>> endobj
-537 0 obj <<
+697 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 514.025 145.101 524.607]
+/Rect [84.814 516.313 145.101 526.895]
/Subtype /Link
/A << /S /GoTo /D (section.1.5) >>
>> endobj
-538 0 obj <<
+698 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 496.089 254.45 506.465]
+/Rect [107.728 498.606 254.45 508.981]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.5.1) >>
>> endobj
-539 0 obj <<
+699 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 478.261 255.621 488.736]
+/Rect [139.608 481.006 255.621 491.481]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.1.5.1.1) >>
>> endobj
-540 0 obj <<
+700 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 460.325 251.64 470.594]
+/Rect [139.608 463.299 251.64 473.567]
/Subtype /Link
/A << /S /GoTo /D (subsubsection.1.5.1.2) >>
>> endobj
-541 0 obj <<
+701 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 442.389 178.895 452.864]
+/Rect [84.814 445.592 178.895 456.066]
/Subtype /Link
/A << /S /GoTo /D (section.1.6) >>
>> endobj
-542 0 obj <<
+702 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 424.454 149.082 434.722]
+/Rect [84.814 427.885 149.082 438.153]
/Subtype /Link
/A << /S /GoTo /D (section.1.7) >>
>> endobj
-543 0 obj <<
+703 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 406.41 233.28 416.992]
+/Rect [107.728 410.07 233.28 420.652]
/Subtype /Link
/A << /S /GoTo /D (subsection.1.7.1) >>
>> endobj
-544 0 obj <<
+704 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [69.87 379.149 143.966 387.601]
+/Rect [69.87 383.952 143.966 392.405]
/Subtype /Link
/A << /S /GoTo /D (chapter.2) >>
>> endobj
-545 0 obj <<
+705 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 361.222 143.604 369.706]
+/Rect [84.814 366.254 143.604 374.738]
/Subtype /Link
/A << /S /GoTo /D (section.2.1) >>
>> endobj
-546 0 obj <<
+706 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [69.87 332.068 136.506 340.714]
+/Rect [69.87 338.244 163.647 346.89]
/Subtype /Link
/A << /S /GoTo /D (chapter.3) >>
>> endobj
-547 0 obj <<
+707 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 314.061 148.58 322.832]
+/Rect [84.814 318.762 172.628 329.237]
/Subtype /Link
/A << /S /GoTo /D (section.3.1) >>
>> endobj
-548 0 obj <<
+708 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [69.87 284.988 185.937 293.633]
+/Rect [69.87 292.537 136.506 301.182]
/Subtype /Link
/A << /S /GoTo /D (chapter.4) >>
>> endobj
-549 0 obj <<
+709 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 265.277 183.378 275.751]
+/Rect [84.814 274.758 148.58 283.529]
/Subtype /Link
/A << /S /GoTo /D (section.4.1) >>
>> endobj
-550 0 obj <<
+710 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 247.341 221.956 257.609]
+/Rect [69.87 246.829 185.937 255.474]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.1.1) >>
+/A << /S /GoTo /D (chapter.5) >>
>> endobj
-551 0 obj <<
+711 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 229.405 157.475 239.673]
+/Rect [84.814 227.346 183.378 237.821]
/Subtype /Link
-/A << /S /GoTo /D (section.4.2) >>
+/A << /S /GoTo /D (section.5.1) >>
>> endobj
-552 0 obj <<
+712 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 211.469 221.956 221.738]
+/Rect [107.728 209.639 221.956 219.908]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.2.1) >>
+/A << /S /GoTo /D (subsection.5.1.1) >>
>> endobj
-553 0 obj <<
+713 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 195.237 269.163 204.008]
+/Rect [84.814 191.932 206.941 202.407]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.2.2) >>
+/A << /S /GoTo /D (section.5.2) >>
>> endobj
-554 0 obj <<
+714 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 176.409 316.457 186.072]
+/Rect [107.728 174.225 221.956 184.493]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.2.2.1) >>
+/A << /S /GoTo /D (subsection.5.2.1) >>
>> endobj
-555 0 obj <<
+715 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 158.473 282.09 168.136]
+/Rect [107.728 156.518 276.39 166.786]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.2.2.2) >>
+/A << /S /GoTo /D (subsection.5.2.2) >>
>> endobj
-556 0 obj <<
+716 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 140.537 306.514 149.994]
+/Rect [139.608 138.703 218.833 149.286]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.2.2.3) >>
+/A << /S /GoTo /D (subsubsection.5.2.2.1) >>
>> endobj
-557 0 obj <<
+717 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 122.602 304.514 132.058]
+/Rect [84.814 121.104 157.475 131.372]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.2.2.4) >>
+/A << /S /GoTo /D (section.5.3) >>
>> endobj
-558 0 obj <<
+718 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 104.666 254.689 114.123]
+/Rect [107.728 103.397 221.956 113.665]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.2.2.5) >>
+/A << /S /GoTo /D (subsection.5.3.1) >>
>> endobj
-559 0 obj <<
+719 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 86.73 264.65 96.393]
+/Rect [107.728 87.393 269.163 96.164]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.2.2.6) >>
+/A << /S /GoTo /D (subsection.5.3.2) >>
>> endobj
-560 0 obj <<
+720 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 67.983 235.71 78.457]
+/Rect [139.608 68.794 316.457 78.457]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.2.3) >>
+/A << /S /GoTo /D (subsubsection.5.3.2.1) >>
>> endobj
-566 0 obj <<
-/D [563 0 R /XYZ 70.866 635.428 null]
+726 0 obj <<
+/D [723 0 R /XYZ 70.866 635.428 null]
>> endobj
-562 0 obj <<
-/Font << /F107 565 0 R /F95 530 0 R /F99 531 0 R /F46 525 0 R >>
+722 0 obj <<
+/Font << /F107 725 0 R /F95 690 0 R /F99 691 0 R /F46 685 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-609 0 obj <<
-/Length 1206
+769 0 obj <<
+/Length 1242
/Filter /FlateDecode
>>
stream
-xÚí›Os›8Æïþ:ÂÁªþ zÜ6élg·í6žÙCÒa& ^O7ýô+@áÆîÎ¬á’ØkäŸ^=ïóJ@àÃä—Ùä͵Ë]!(˜=
-Ä¢ª«ª‡BlO1s+š‡IæeE«¦ÁíTJׂö”sQþãgywÖÆþÛ¦JjaWsj¢SΠTA2Å
-WV¤©ú"Âz®ÖaàgáÜžéX×Û$È¢4Ù4¹3F‡Ç¶ûÔ(0‹ C£@t1ÓƒàÔƒP;¥D CæGq5ïÃM°VW¸­òÁhŽFŒ ûàÈxH4ë*Ä5ë4Ø.•Òøm JG² ²CÇÁ-xkåö¼§å*ðÒ'/K½›"+-£ù©É×Eüòµù0Ê}m®eim¾É|Å!+Û®Ê`õ­7[[Ù<µÖïFÜR$F±>&Ö¸“X×ÎF±>QRpg±f£XŸ‡l»X3S¬ïÃEd˜ ÔOUg&Ù‡*™n ä\»B9Lô@…Âuüb« ¨!Vã8ŒK%¸CíY‹7¥Q¢>ņ,06ô±of$ý2#3ã‰úM:« ¯3ãÌÆYÏ«p>tÈŽ”árŸ$Éw’d¡êË(X§†º¸tàº~ëôW:z»³‡íŽ@Ц·SvÄÛ„Z‰ý8ú‘áÜ[©r7±ŠqA‰Z±ißö|…(8fæÂrœáí0ék0³Ð_KË‚8 H{äxZ¬íP\m7^’OÕí2‡¨f®ÉÑ«½ˆã¯±z\‡¹ÌÍ7¦¼±AÒû´ZÃKVPìbsÕ–\:¹5©Ð5éLE•¯«œ_“Zâ·–­öÅeîX|v,>Y¿=41Ÿ'LÖY>ĸ,{²í•‘hY–M·Ê¼×ÉL©q¡<F2ãâ¯Å¬³?æŠkÉ)Oö¹5ª‰™“~
-ʘ–ÿ ª^aò¹o¹~÷`½«Rl²da|G¸(ß~^…Éï_òŸ¨z䪹’:Ź2‰!¡¸:æ¦f
-Õwíö›«{HuÏ×m’EK]Iüݯ‹Â[Uå'÷y7ž+'—êÿ</ŠÂ¤Éø_:ƒ
+xÚí›]sÚ8†ïù¾4¨ú–Ü»¤ݦa Ý™¤ã! oÀ°`¦Íþúʶ Æ2’™.öMlüùñÑ{Þ#ÙЙ8ÐùØ84Þ]xÌ‘Àãœ8ƒ{G@ 9w„‡GÎ`ìܸAÐü6øäPHÆž>/ÙúáêË óepïktHï‚Ú^BJ 1uF³ÆÍ7èŒõ¾OÄ“Î÷äÈ™CŒ½>u®6 iVzåÄ\°oJy¦¡ˆBÀ!sG
+üûÜäoÆ[üôÚ‡<@Je•ɵR"»oÆ¢EvM„¡û´Pcußla!Ýö|´ž©0FÁ<Ìã$&Ç'hÔÔÅxêÒ™H%
+‚Wû À-ƒE‹³Þ„x —„ÔdK)·Æ»Unßœ-FþüÑæþ}“@wžFócž¯Y´™¨ÍÌhóu4ÔÜ(t£õ" Öahâúa­k‚h<oj¬ßmãy-Ö/‰5-%Ö[aµX))´tÅÂj±~²ÅbÍl±¾S“À"Ê®ªŸ¦¥ËŒþ˜JËt%c¢â
+=0 r“{Mu"Dúïtª¦©ÜBw¬Å»æA¨·"K(­z‰xhfd‡•1¼ÎŒGê7+­6|›뱨ׂ\œ$y&I&ª> F˹¥.©¸®³r£©®¤övo¶$ïí´ñWÊ(ñpüjì/t ™M¬–bœ`P*ÉÛ·_á4;s!Q÷p»nãf®d/ÌH gÖÐ2ÇU˜uâQ¤»ëÕƒÆ]u=‹!êžksôªÃj§û²_±zXªXæÆ+[Þh%#‹ïÒ*L ÏYA³›Ú£¶øÔÉí©I…©I:ª†¦Êé†[‰ÃÌÚzuñY²ø‡ ËŠºø<Ò`ŠÒò!êaÙ×![lÝEÁ°ì|­Íû6™i5N”ÇJfŒÿïµX”ÎùÂqM9ÅÉ>¶F[bv§¯
endstream
endobj
-608 0 obj <<
+768 0 obj <<
/Type /Page
-/Contents 609 0 R
-/Resources 607 0 R
+/Contents 769 0 R
+/Resources 767 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 526 0 R
-/Annots [ 561 0 R 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 586 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R ]
+/Parent 686 0 R
+/Annots [ 721 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R ]
>> endobj
-561 0 obj <<
+721 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 758.989 209.364 768.446]
+/Rect [139.608 758.989 282.09 768.652]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.2.3.1) >>
+/A << /S /GoTo /D (subsubsection.5.3.2.2) >>
>> endobj
-567 0 obj <<
+727 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 740.48 197.428 750.748]
+/Rect [139.608 741.292 306.514 750.748]
/Subtype /Link
-/A << /S /GoTo /D (section.4.3) >>
+/A << /S /GoTo /D (subsubsection.5.3.2.3) >>
>> endobj
-568 0 obj <<
+728 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 722.783 221.956 733.051]
+/Rect [139.608 723.594 304.514 733.051]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.3.1) >>
+/A << /S /GoTo /D (subsubsection.5.3.2.4) >>
>> endobj
-569 0 obj <<
+729 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 706.789 238.777 715.354]
+/Rect [139.608 705.897 254.689 715.354]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.3.2) >>
+/A << /S /GoTo /D (subsubsection.5.3.2.5) >>
>> endobj
-570 0 obj <<
+730 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 687.388 260.553 697.863]
+/Rect [139.608 688.2 264.65 697.863]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.3.2.1) >>
+/A << /S /GoTo /D (subsubsection.5.3.2.6) >>
>> endobj
-571 0 obj <<
+731 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 669.691 198.665 680.165]
+/Rect [107.728 669.691 235.71 680.165]
/Subtype /Link
-/A << /S /GoTo /D (section.4.4) >>
+/A << /S /GoTo /D (subsection.5.3.3) >>
>> endobj
-572 0 obj <<
+732 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 651.994 221.956 662.262]
+/Rect [139.608 652.805 209.364 662.262]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.4.1) >>
+/A << /S /GoTo /D (subsubsection.5.3.3.1) >>
>> endobj
-573 0 obj <<
+733 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 636.081 238.777 644.565]
+/Rect [84.814 634.296 197.428 644.565]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.4.2) >>
+/A << /S /GoTo /D (section.5.4) >>
>> endobj
-574 0 obj <<
+734 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 616.491 240.755 626.867]
+/Rect [107.728 616.599 221.956 626.867]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.4.2.1) >>
+/A << /S /GoTo /D (subsection.5.4.1) >>
>> endobj
-575 0 obj <<
+735 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 598.902 233.78 609.17]
+/Rect [107.728 600.605 238.777 609.17]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.4.2.2) >>
+/A << /S /GoTo /D (subsection.5.4.2) >>
>> endobj
-576 0 obj <<
+736 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 581.204 178.886 591.679]
+/Rect [139.608 581.204 260.553 591.679]
/Subtype /Link
-/A << /S /GoTo /D (section.4.5) >>
+/A << /S /GoTo /D (subsubsection.5.4.2.1) >>
>> endobj
-577 0 obj <<
+737 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 563.507 221.956 573.775]
+/Rect [84.814 563.507 198.665 573.982]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.5.1) >>
+/A << /S /GoTo /D (section.5.5) >>
>> endobj
-578 0 obj <<
+738 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 545.81 235.71 556.284]
+/Rect [107.728 545.81 221.956 556.078]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.5.2) >>
+/A << /S /GoTo /D (subsection.5.5.1) >>
>> endobj
-579 0 obj <<
+739 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 528.112 230.767 538.381]
+/Rect [107.728 529.816 238.777 538.381]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.5.2.1) >>
+/A << /S /GoTo /D (subsection.5.5.2) >>
>> endobj
-580 0 obj <<
+740 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 512.119 238.777 520.683]
+/Rect [139.608 510.307 240.755 520.683]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.5.3) >>
+/A << /S /GoTo /D (subsubsection.5.5.2.1) >>
>> endobj
-581 0 obj <<
+741 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 492.718 310.423 502.986]
+/Rect [139.608 492.718 233.78 502.986]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.5.3.1) >>
+/A << /S /GoTo /D (subsubsection.5.5.2.2) >>
>> endobj
-582 0 obj <<
+742 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 475.021 252.071 485.495]
+/Rect [84.814 475.021 178.886 485.495]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.5.3.2) >>
+/A << /S /GoTo /D (section.5.6) >>
>> endobj
-583 0 obj <<
+743 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 457.323 263.036 467.798]
+/Rect [107.728 457.323 221.956 467.592]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.5.3.3) >>
+/A << /S /GoTo /D (subsection.5.6.1) >>
>> endobj
-584 0 obj <<
+744 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 439.626 289.998 449.894]
+/Rect [107.728 439.626 235.71 450.1]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.5.3.4) >>
+/A << /S /GoTo /D (subsection.5.6.2) >>
>> endobj
-585 0 obj <<
+745 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 421.929 295.485 432.197]
+/Rect [139.608 421.929 230.767 432.197]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.5.3.5) >>
+/A << /S /GoTo /D (subsubsection.5.6.2.1) >>
>> endobj
-586 0 obj <<
+746 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 404.231 290.482 414.5]
+/Rect [107.728 405.935 238.777 414.5]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.5.3.6) >>
+/A << /S /GoTo /D (subsection.5.6.3) >>
>> endobj
-587 0 obj <<
+747 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 388.238 185.422 397.009]
+/Rect [139.608 386.534 310.423 396.802]
/Subtype /Link
-/A << /S /GoTo /D (section.4.6) >>
+/A << /S /GoTo /D (subsubsection.5.6.3.1) >>
>> endobj
-588 0 obj <<
+748 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 368.837 221.956 379.105]
+/Rect [139.608 368.837 252.071 379.311]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.6.1) >>
+/A << /S /GoTo /D (subsubsection.5.6.3.2) >>
>> endobj
-589 0 obj <<
+749 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 352.843 238.777 361.408]
+/Rect [139.608 351.139 263.036 361.614]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.6.2) >>
+/A << /S /GoTo /D (subsubsection.5.6.3.3) >>
>> endobj
-590 0 obj <<
+750 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 333.442 300.972 343.71]
+/Rect [139.608 333.442 289.998 343.71]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.6.2.1) >>
+/A << /S /GoTo /D (subsubsection.5.6.3.4) >>
>> endobj
-591 0 obj <<
+751 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 315.745 296.489 326.013]
+/Rect [139.608 315.745 295.485 326.013]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.6.2.2) >>
+/A << /S /GoTo /D (subsubsection.5.6.3.5) >>
>> endobj
-592 0 obj <<
+752 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 297.94 299.968 308.316]
+/Rect [139.608 298.047 290.482 308.316]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.6.2.3) >>
+/A << /S /GoTo /D (subsubsection.5.6.3.6) >>
>> endobj
-593 0 obj <<
+753 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 280.243 295.485 290.618]
+/Rect [84.814 282.054 185.422 290.825]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.6.2.4) >>
+/A << /S /GoTo /D (section.5.7) >>
>> endobj
-594 0 obj <<
+754 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 262.653 259.593 272.921]
+/Rect [107.728 262.653 221.956 272.921]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.6.2.5) >>
+/A << /S /GoTo /D (subsection.5.7.1) >>
>> endobj
-595 0 obj <<
+755 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 244.848 164.029 255.43]
+/Rect [107.728 246.659 238.777 255.224]
/Subtype /Link
-/A << /S /GoTo /D (section.4.7) >>
+/A << /S /GoTo /D (subsection.5.7.2) >>
>> endobj
-596 0 obj <<
+756 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 227.258 221.956 237.527]
+/Rect [139.608 227.258 300.972 237.527]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.7.1) >>
+/A << /S /GoTo /D (subsubsection.5.7.2.1) >>
>> endobj
-597 0 obj <<
+757 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 209.561 276.39 219.829]
+/Rect [139.608 209.561 296.489 219.829]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.7.2) >>
+/A << /S /GoTo /D (subsubsection.5.7.2.2) >>
>> endobj
-598 0 obj <<
+758 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 191.864 228.301 202.132]
+/Rect [139.608 191.756 299.968 202.132]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.2.1) >>
+/A << /S /GoTo /D (subsubsection.5.7.2.3) >>
>> endobj
-599 0 obj <<
+759 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 175.87 238.777 184.435]
+/Rect [139.608 174.059 295.485 184.435]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.7.3) >>
+/A << /S /GoTo /D (subsubsection.5.7.2.4) >>
>> endobj
-600 0 obj <<
+760 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 156.469 244.36 166.737]
+/Rect [139.608 156.469 259.593 166.737]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.1) >>
+/A << /S /GoTo /D (subsubsection.5.7.2.5) >>
>> endobj
-601 0 obj <<
+761 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 138.772 278.629 149.246]
+/Rect [84.814 138.664 164.029 149.246]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.2) >>
+/A << /S /GoTo /D (section.5.8) >>
>> endobj
-602 0 obj <<
+762 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 121.074 283.614 131.549]
+/Rect [107.728 121.074 221.956 131.343]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.3) >>
+/A << /S /GoTo /D (subsection.5.8.1) >>
>> endobj
-603 0 obj <<
+763 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 103.377 278.629 113.852]
+/Rect [107.728 103.377 276.39 113.645]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.4) >>
+/A << /S /GoTo /D (subsection.5.8.2) >>
>> endobj
-604 0 obj <<
+764 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 85.68 283.614 96.154]
+/Rect [139.608 85.68 228.301 95.948]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.5) >>
+/A << /S /GoTo /D (subsubsection.5.8.2.1) >>
>> endobj
-605 0 obj <<
+765 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 67.983 278.629 78.251]
+/Rect [107.728 69.686 238.777 78.251]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.6) >>
+/A << /S /GoTo /D (subsection.5.8.3) >>
>> endobj
-607 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F99 531 0 R >>
+767 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-652 0 obj <<
-/Length 1107
+812 0 obj <<
+/Length 996
/Filter /FlateDecode
>>
stream
-xÚí›[s›F†ïõ+ö.´Ýó!—mãL39´±îì ƒÑÚf*!¡$î¯ïr…Y"O\ÃÑ¢õòð~ß»b¸¼™ý¼˜ýt¡9PP AÁâH•@j‹%¸ò~ùøañúÃâÒÿ¼x Ù¨ü.Žãüôìõbö× Û³àz ¥ " DëÙÕg–ö»·
-ÄØÎ¨š+ƒR(ý9fZyAðçzËx· ³è>ˆ“8 ˜½}1éÃWsE™ý9ç¢uàOÐzê¡-êU]¡ËÑçXB¡e˜z ˜raý  {rfú3Õd¦g6‘éA"ÃÈŸkF:ÀãSä}Ë#Ó†ä¨áSÀ:ÃHñQF#&'X©I\mqÑSÀF-®6+Öbe’e¥v(îÅY…+SòÇ_èS3¤hCÞa¸w™I]xDê ž›ÝDÞ&]šÔ,]z’Is56ÙÁ¶‹“»•éR£“æ\xªï6,lÒ`—…6çב$î8Ч ­êÇ
-í„´–T€$†„âÃV¤|ù£êÕœ6·}ȡϧ}’ÅëÊB½‹oÒ0¯ám¥Yž¹É§ñp(8‹÷ îŠ&qÿÆRÈI
+xÚí›ËrÚ0†÷<…–fªû%˶I¦™6m»$Ã8Æ!š‚¡ÆLš>}e(¾€ñ.ØÞ`ËÈâøó¯££ƒ„À pÝû8ê}¸Ò(¨… `ô $‚J 5ƒÑÜ;Ÿ¾ßŽ.oGÃþãè0& ²Pú1&¾Ü»õ~÷°½Š
+q€™VÎxük¾ôÆ^hËÜ1‘ñÜYbîöwÀý
+¶·C„q(ì!¡í~èFÛQlëa¯B“ž ýez§á’#Š×€ÄgX\~ÁdZzî“8Á”¾‘?{ |sÏ÷¥|û?¡5H[ƒ´¤*Ù"1$o·¤< D7µöÍæ¶ÙÖ¹[‘™ûiÃ_ÍSèÆBAÎ[zå)6ãm;L$ xÞ¦I?È#þ€$„¶
endstream
endobj
-651 0 obj <<
+811 0 obj <<
/Type /Page
-/Contents 652 0 R
-/Resources 650 0 R
+/Contents 812 0 R
+/Resources 810 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 526 0 R
-/Annots [ 606 0 R 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R 623 0 R 624 0 R 625 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R 633 0 R 634 0 R 635 0 R 636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R 643 0 R 644 0 R 645 0 R 646 0 R 647 0 R 648 0 R ]
+/Parent 686 0 R
+/Annots [ 766 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R 797 0 R 798 0 R 799 0 R 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R ]
>> endobj
-606 0 obj <<
+766 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 758.177 283.614 768.446]
+/Rect [139.608 758.177 244.36 768.446]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.7) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.1) >>
>> endobj
-610 0 obj <<
+770 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 740.48 278.629 750.748]
+/Rect [139.608 740.48 278.629 750.955]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.8) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.2) >>
>> endobj
-611 0 obj <<
+771 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 722.783 283.614 733.051]
+/Rect [139.608 722.783 283.614 733.257]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.9) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.3) >>
>> endobj
-612 0 obj <<
+772 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 705.085 283.847 715.354]
+/Rect [139.608 705.085 278.629 715.56]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.10) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.4) >>
>> endobj
-613 0 obj <<
+773 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 687.388 288.832 697.656]
+/Rect [139.608 687.388 283.614 697.863]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.11) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.5) >>
>> endobj
-614 0 obj <<
+774 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 669.691 283.847 679.959]
+/Rect [139.608 669.691 278.629 679.959]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.12) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.6) >>
>> endobj
-615 0 obj <<
+775 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 651.994 288.832 662.262]
+/Rect [139.608 651.994 283.614 662.262]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.13) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.7) >>
>> endobj
-616 0 obj <<
+776 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 634.296 264.301 644.565]
+/Rect [139.608 634.296 278.629 644.565]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.14) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.8) >>
>> endobj
-617 0 obj <<
+777 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 616.599 266.166 626.867]
+/Rect [139.608 616.599 283.614 626.867]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.15) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.9) >>
>> endobj
-618 0 obj <<
+778 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 598.902 269.662 609.17]
+/Rect [139.608 598.902 283.847 609.17]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.16) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.10) >>
>> endobj
-619 0 obj <<
+779 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 581.097 262.185 591.473]
+/Rect [139.608 581.204 288.832 591.473]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.17) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.11) >>
>> endobj
-620 0 obj <<
+780 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 563.507 271.375 573.982]
+/Rect [139.608 563.507 283.847 573.775]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.18) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.12) >>
>> endobj
-621 0 obj <<
+781 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 545.81 281.345 556.284]
+/Rect [139.608 545.81 288.832 556.078]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.19) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.13) >>
>> endobj
-622 0 obj <<
+782 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 528.112 286.33 538.587]
+/Rect [139.608 528.112 297.565 538.381]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.20) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.14) >>
>> endobj
-623 0 obj <<
+783 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 510.415 281.345 520.89]
+/Rect [139.608 510.415 300.282 520.89]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.21) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.15) >>
>> endobj
-624 0 obj <<
+784 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 492.718 286.33 503.192]
+/Rect [139.608 492.718 305.267 503.192]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.22) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.16) >>
>> endobj
-625 0 obj <<
+785 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 475.021 246.225 485.289]
+/Rect [139.608 475.021 300.282 485.495]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.23) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.17) >>
>> endobj
-626 0 obj <<
+786 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 457.323 249.722 467.592]
+/Rect [139.608 457.323 305.267 467.798]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.24) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.18) >>
>> endobj
-627 0 obj <<
+787 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 439.518 242.244 449.894]
+/Rect [139.608 439.626 264.301 449.894]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.7.3.25) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.19) >>
>> endobj
-628 0 obj <<
+788 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 421.929 173.506 432.403]
+/Rect [139.608 421.929 266.166 432.197]
/Subtype /Link
-/A << /S /GoTo /D (section.4.8) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.20) >>
>> endobj
-629 0 obj <<
+789 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 404.231 221.956 414.5]
+/Rect [139.608 404.231 269.662 414.5]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.8.1) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.21) >>
>> endobj
-630 0 obj <<
+790 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 388.238 238.777 396.802]
+/Rect [139.608 386.426 262.185 396.802]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.8.2) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.22) >>
>> endobj
-631 0 obj <<
+791 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 368.837 244.862 379.105]
+/Rect [139.608 368.837 271.375 379.311]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.8.2.1) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.23) >>
>> endobj
-632 0 obj <<
+792 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 351.139 277.248 361.408]
+/Rect [139.608 351.139 281.345 361.614]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.8.2.2) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.24) >>
>> endobj
-633 0 obj <<
+793 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 333.442 307.876 343.71]
+/Rect [139.608 333.442 286.33 343.917]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.8.2.3) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.25) >>
>> endobj
-634 0 obj <<
+794 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 315.745 297.189 326.013]
+/Rect [139.608 315.745 281.345 326.219]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.8.2.4) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.26) >>
>> endobj
-635 0 obj <<
+795 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 298.047 266.175 308.316]
+/Rect [139.608 298.047 286.33 308.522]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.8.2.5) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.27) >>
>> endobj
-636 0 obj <<
+796 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 280.35 296.803 290.618]
+/Rect [139.608 280.35 246.225 290.618]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.8.2.6) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.28) >>
>> endobj
-637 0 obj <<
+797 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 262.653 237.761 273.127]
+/Rect [139.608 262.653 249.722 272.921]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.8.2.7) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.29) >>
>> endobj
-638 0 obj <<
+798 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 244.956 246.234 255.224]
+/Rect [139.608 244.848 242.244 255.224]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.8.2.8) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.30) >>
>> endobj
-639 0 obj <<
+799 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 227.258 276.862 237.527]
+/Rect [139.608 227.258 291.083 237.527]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.8.2.9) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.31) >>
>> endobj
-640 0 obj <<
+800 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 209.561 220.13 219.829]
+/Rect [139.608 209.561 296.068 219.829]
/Subtype /Link
-/A << /S /GoTo /D (section.4.9) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.32) >>
>> endobj
-641 0 obj <<
+801 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 191.864 221.956 202.132]
+/Rect [139.608 191.864 291.083 202.132]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.9.1) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.33) >>
>> endobj
-642 0 obj <<
+802 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 174.166 235.71 184.641]
+/Rect [139.608 174.166 296.068 184.435]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.9.2) >>
+/A << /S /GoTo /D (subsubsection.5.8.3.34) >>
>> endobj
-643 0 obj <<
+803 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 156.469 228.283 166.737]
+/Rect [84.814 156.469 173.506 166.944]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.9.2.1) >>
+/A << /S /GoTo /D (section.5.9) >>
>> endobj
-644 0 obj <<
+804 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 138.772 246.996 149.04]
+/Rect [107.728 138.772 221.956 149.04]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.9.2.2) >>
+/A << /S /GoTo /D (subsection.5.9.1) >>
>> endobj
-645 0 obj <<
+805 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 121.074 223.8 131.343]
+/Rect [107.728 122.778 238.777 131.343]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.9.2.3) >>
+/A << /S /GoTo /D (subsection.5.9.2) >>
>> endobj
-646 0 obj <<
+806 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 103.377 242.513 113.645]
+/Rect [139.608 103.377 244.862 113.645]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.9.2.4) >>
+/A << /S /GoTo /D (subsubsection.5.9.2.1) >>
>> endobj
-647 0 obj <<
+807 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 85.68 224.302 95.948]
+/Rect [139.608 85.68 277.248 95.948]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.9.2.5) >>
+/A << /S /GoTo /D (subsubsection.5.9.2.2) >>
>> endobj
-648 0 obj <<
+808 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 67.983 243.015 78.251]
+/Rect [139.608 67.983 307.876 78.251]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.9.2.6) >>
+/A << /S /GoTo /D (subsubsection.5.9.2.3) >>
>> endobj
-650 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F99 531 0 R >>
+810 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-674 0 obj <<
-/Length 925
+855 0 obj <<
+/Length 1302
/Filter /FlateDecode
>>
stream
-xÚí™IsÛ6€ïú8‚¡Ø—›Ä™dš¤µus2š‚eN,Š%©:þ÷yà⚤TGn3S;ò…$=<x+AÑ
-QôföëböˉSȧµ@‹Kd(±Z#ã8Ñ -–ègEŸ裸pîàwÍè˯?,λÙëÅìσW±;ÖË%J׳óÏ-áÝ;D‰pÝ43×H*A”pÎfÌh§V+§\uO;E¥¾§(£–o4#´WUGD4gBp|²ÍÓ:ÛäÑœ‹_mÒíÚçuÒ ûÅÐùÜ
-I4WJµ=¸¨ðô?Í`C±0‹1p$±–¡93Dæ¿ñ~ë,Žã/ë"ÓM Šo‹ÆU°®pRû1diŸ—ÇŠžâxÒ¥º’QÖW¥O–#Ã>N“ôÊ/ÇHÝs5°9ñ½ J¿ÊªÚ——O•=•<UÜ útâ°üY@š+I 丑û1Í5£x1NqR}ÉòU›*ªmQl€—¤¸3ÑŽ=³4ðãE·‰ÆíÛΉcrlÉŒ†<cŒÆ¯|d×üÚ<î«´³åbW*gTòŸûÀéÔB"
-¬5Ó¿"»»f
-xƒ1;°Ì.(oÖE\C̉o²ú*†h¼ôE5&,„zêÕûîÌÕ@âH7xz’Õñ.@Œö¼ªÇ}¼FM¤!b„Cà¥DYÓ2T þðË뤪t`)¡õ2¢ïæ$Û»ò ë‚¢À¶¹aQMOÀ´ÆÙ–k?«Û8½M»Sæ^ú<4Üñc} îݧiö¥Ù™ÐÓ裂ý~àtÊšw¬ßûõ´ -é¤N¦Þ>0aÎ;bæPuíÝw‡O”ŠdUM ’Ÿ" <.³fÆwß%Šj³-§‘šQet¡;0äþcFé«% '¶ø2f“\²#á@˜d¿r/a~$üŸV{ ‹#á 7Õ=4@F9=(ï%%TvGoó¥ÍÐ×qÏ Ž¿;•‘CûÞu.£ ±üS™þHn´
-rM‰“f ›•ßøÜ—Iݘý7„“2ë+δ½a¢½rÚß1þ‚ºª{ºŒ8Å›®zz›×þúWº}üXøüýïá_h䌰Íi£¬ÇJ„nÖ}½ÌáýœÓm^gkß
-þ-»(“PS|ÛŽ\5nûÊ-4._oWÍŸÜŒ–
+xÚí›[sÚ8†ïù¾´/ðê,¹w %iÚ$°àtv&éx£$žÃ“lþýʧ>Ü´ÓÆp #;òã÷;èCÚ½´ÓαÝùëÄ¢š0-ưfßi˜‚1[ÈdP³'Úµî?_ìÄDÈR×%g{ƒK»iãï:}»óoª¯€¿ÝBS ¢yÓÎõ MÔw5`bKhÏIÏ©F(6)Áªý¨;w@6¬ô>á}vÃQ6PÂÖ
+ 0 gÐùP©i™È$FKèŽóu:÷Lœ[7 ÕYªû2t ¨OÝE$Ãdìù?Õ®»–ºit)¥éýÌOìßZÁ:¶²g*TÇ.ä&³ø:)Z&ÊÉÒ“E2ˆ‹ßÿ„¿žX‡Çêà9ÁÌPR{Žÿ¸~Td û%3¾Iê
+L÷ #ìת¸Åv9ÅûE®K‰ÉU†P!F—A Û¡t'FæY„}2bÉôìÄܸÅõÅr>Ÿ©>è%®âVës÷ Ôû :uï)ÝBR~&4ºœ3ý½Œ\ÿQf¯ä½\xÙ[™Gþ,(‡"‚öûà ‚5JYÛD@™Ë‰¼ËxϼåT‘[x€\ CSXtÒ1éX×–iâ¢=/š•’vŒYË\ÀúðfŽE¼ ÖI·ôÊ1X~Ÿ%^gY¡QqÐèŽ\7Ÿ¸ÖI”@v º“RéÑI…R¹
+ƒ}­:)F¤aá 
+O¯‹Údwç óÂS?0ПüpĉPŠü³ÁîfÐÝ۸ǣ\”œ'Ç໺`˜' ®Îreß
+9$0ºX°NÌ¢:‡¤t.Ö£««˜ lùN²‚Á]|õƒ¬8ò½E:Ì‚í¬~üòеSUeåÑ¡ªòºIéî *!Ê«*‡_™^E¶fºVkx²2öl:w"åsœg?zˆãOä|QžÍÒ·î”w_Mž@B%Hù"T§
+¶+ˆYMƒNƒØÕ".òÇ6ûä/ü¬ð™•ú3“.Ñã–8D­-Q‹*ÓશùPn
+Ôd“O¾çˆ™ˆ3oåA ˜!ª§ÉÔ“×{*ºQùr¯|úic,çi±ì I[½CôʉR Äz˜e9 "ùxƒhvÍ`.ƒ‹aüˆjD–‘űH6qh" ó½Nñ†…¬×ú¸©êƒò>£eùÓLwçþm˜”âþ’žIdù’‡–øWöÿ^î“2(2þÍ4Ìà
endstream
endobj
-673 0 obj <<
+854 0 obj <<
/Type /Page
-/Contents 674 0 R
-/Resources 672 0 R
+/Contents 855 0 R
+/Resources 853 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 526 0 R
-/Annots [ 649 0 R 653 0 R 654 0 R 655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R 665 0 R 666 0 R 667 0 R 668 0 R 669 0 R 670 0 R 671 0 R ]
+/Parent 686 0 R
+/Annots [ 809 0 R 813 0 R 814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R ]
>> endobj
-649 0 obj <<
+809 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 759.881 238.777 768.446]
+/Rect [139.608 758.177 297.189 768.446]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.9.3) >>
+/A << /S /GoTo /D (subsubsection.5.9.2.4) >>
>> endobj
-653 0 obj <<
+813 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 740.553 264.31 750.821]
+/Rect [139.608 740.48 266.175 750.748]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.9.3.1) >>
+/A << /S /GoTo /D (subsubsection.5.9.2.5) >>
>> endobj
-654 0 obj <<
+814 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 722.929 304.953 733.197]
+/Rect [139.608 722.783 296.803 733.051]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.9.3.2) >>
+/A << /S /GoTo /D (subsubsection.5.9.2.6) >>
>> endobj
-655 0 obj <<
+815 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 705.197 305.939 715.573]
+/Rect [139.608 705.085 237.761 715.56]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.9.3.3) >>
+/A << /S /GoTo /D (subsubsection.5.9.2.7) >>
>> endobj
-656 0 obj <<
+816 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 687.572 324.652 697.948]
+/Rect [139.608 687.388 246.234 697.656]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.9.3.4) >>
+/A << /S /GoTo /D (subsubsection.5.9.2.8) >>
>> endobj
-657 0 obj <<
+817 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 669.948 172.789 680.324]
+/Rect [139.608 669.691 276.862 679.959]
/Subtype /Link
-/A << /S /GoTo /D (section.4.10) >>
+/A << /S /GoTo /D (subsubsection.5.9.2.9) >>
>> endobj
-658 0 obj <<
+818 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 652.431 221.956 662.699]
+/Rect [84.814 651.994 220.13 662.262]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.10.1) >>
+/A << /S /GoTo /D (section.5.10) >>
>> endobj
-659 0 obj <<
+819 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 636.51 238.777 645.075]
+/Rect [107.728 634.296 221.956 644.565]
/Subtype /Link
-/A << /S /GoTo /D (subsection.4.10.2) >>
+/A << /S /GoTo /D (subsection.5.10.1) >>
>> endobj
-660 0 obj <<
+820 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 617.182 303.044 627.451]
+/Rect [107.728 616.599 235.71 627.074]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.10.2.1) >>
+/A << /S /GoTo /D (subsection.5.10.2) >>
>> endobj
-661 0 obj <<
+821 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 599.558 281.48 609.826]
+/Rect [139.608 598.902 228.283 609.17]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.4.10.2.2) >>
+/A << /S /GoTo /D (subsubsection.5.10.2.1) >>
>> endobj
-662 0 obj <<
+822 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [69.87 573.746 178.477 582.392]
+/Rect [139.608 581.204 246.996 591.473]
/Subtype /Link
-/A << /S /GoTo /D (chapter.5) >>
+/A << /S /GoTo /D (subsubsection.5.10.2.2) >>
>> endobj
-663 0 obj <<
+823 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.814 556.05 198.791 564.821]
+/Rect [139.608 563.507 223.8 573.775]
/Subtype /Link
-/A << /S /GoTo /D (section.5.1) >>
+/A << /S /GoTo /D (subsubsection.5.10.2.3) >>
>> endobj
-664 0 obj <<
+824 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 536.722 221.956 546.991]
+/Rect [139.608 545.81 242.513 556.078]
/Subtype /Link
-/A << /S /GoTo /D (subsection.5.1.1) >>
+/A << /S /GoTo /D (subsubsection.5.10.2.4) >>
>> endobj
-665 0 obj <<
+825 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.728 520.802 258.7 529.366]
+/Rect [139.608 528.112 224.302 538.381]
/Subtype /Link
-/A << /S /GoTo /D (subsection.5.1.2) >>
+/A << /S /GoTo /D (subsubsection.5.10.2.5) >>
>> endobj
-666 0 obj <<
+826 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 501.366 201.385 511.948]
+/Rect [139.608 510.415 243.015 520.683]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.5.1.2.1) >>
+/A << /S /GoTo /D (subsubsection.5.10.2.6) >>
>> endobj
-667 0 obj <<
+827 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 483.849 214.341 494.118]
+/Rect [107.728 494.421 238.777 502.986]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.5.1.2.2) >>
+/A << /S /GoTo /D (subsection.5.10.3) >>
>> endobj
-668 0 obj <<
+828 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 467.036 227.342 476.493]
+/Rect [139.608 475.021 264.31 485.289]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.5.1.2.3) >>
+/A << /S /GoTo /D (subsubsection.5.10.3.1) >>
>> endobj
-669 0 obj <<
+829 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 449.412 227.342 458.869]
+/Rect [139.608 457.323 304.953 467.592]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.5.1.2.4) >>
+/A << /S /GoTo /D (subsubsection.5.10.3.2) >>
>> endobj
-670 0 obj <<
+830 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.608 431.788 227.342 441.244]
+/Rect [139.608 439.518 305.939 449.894]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.5.1.2.5) >>
+/A << /S /GoTo /D (subsubsection.5.10.3.3) >>
>> endobj
-671 0 obj <<
+831 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 421.821 324.652 432.197]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.10.3.4) >>
+>> endobj
+832 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [84.814 404.124 242.393 414.706]
+/Subtype /Link
+/A << /S /GoTo /D (section.5.11) >>
+>> endobj
+833 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 386.534 221.956 396.802]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.5.11.1) >>
+>> endobj
+834 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 370.54 230.94 379.105]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.5.11.2) >>
+>> endobj
+835 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 352.843 269.163 361.614]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.5.11.3) >>
+>> endobj
+836 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 334.254 274.119 343.917]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.11.3.1) >>
+>> endobj
+837 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 316.556 273.123 326.219]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.11.3.2) >>
+>> endobj
+838 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 298.859 300.013 308.522]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.11.3.3) >>
+>> endobj
+839 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 281.162 328.427 290.825]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.11.3.4) >>
+>> endobj
+840 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 263.464 283.578 273.127]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.11.3.5) >>
+>> endobj
+841 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 245.767 277.607 255.43]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.11.3.6) >>
+>> endobj
+842 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 228.07 270.64 237.733]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.11.3.7) >>
+>> endobj
+843 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 210.372 313.982 220.036]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.11.3.8) >>
+>> endobj
+844 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 192.675 309.006 202.338]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.11.3.9) >>
+>> endobj
+845 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 174.978 263.664 184.641]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.11.3.10) >>
+>> endobj
+846 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [84.814 156.361 172.789 166.737]
+/Subtype /Link
+/A << /S /GoTo /D (section.5.12) >>
+>> endobj
+847 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 138.772 221.956 149.04]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.5.12.1) >>
+>> endobj
+848 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 122.778 238.777 131.343]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.5.12.2) >>
+>> endobj
+849 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 103.377 303.044 113.645]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.5.12.2.1) >>
+>> endobj
+850 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [69.87 392.689 99.805 402.433]
+/Rect [139.608 85.68 281.48 95.948]
/Subtype /Link
-/A << /S /GoTo /D (subsubsection.5.1.2.5) >>
+/A << /S /GoTo /D (subsubsection.5.12.2.2) >>
>> endobj
-672 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F99 531 0 R >>
+851 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [84.814 69.686 194.245 78.457]
+/Subtype /Link
+/A << /S /GoTo /D (section.5.13) >>
+>> endobj
+853 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-678 0 obj <<
-/Length 2008
+877 0 obj <<
+/Length 890
/Filter /FlateDecode
>>
stream
-xÚ­Xm¤Æþ~¿…‘ަ¡û¶wÉYŽs²å¬d[¹(b™ž¡µ¼e`|ÞŸª®jØÙÓÅÎ'úµ^Ÿª®"òN^ä}ó*rß0NqˆŸo^½»õ惈2OäaZ(áݽ,
-s¥<•G¡ÊbïþàýÓ_—äÏû Žs_ìÿuÿ· !¢Ç¡Œò©D^¦a’3o»I7ŸâTíƒ$Uþ÷ƒî>þ€tÞ|(
-/NÂ,Ï,w!áV*á¾½÷)Š$ÛÐY˜d…;ö㥛L«I¾¿›‡s ²æþ- óó±¬ô ÁoÛ…‡…)² D
-{’V>ËV„bˆ(ŠÅy/R¿?\ªÉôqbÚo>$ÊËÃB)ɦ‰ó0Dã¾6ã>2ò}uiu7ñL(4̓ÆqáOµ¦Mc5Úõ²KùG~5} •‡}¡ p<ß\8)nQ€±B!ãôMO†J¨­/Vê€*2ó‚ÅAÛ¹¹6à’½
-Ê\€;DX¤)±›êl[@^Óà`κšš'šUeÓ Qì‘‘¾£i‡†O/uo9»áø2ZÔ#‘þ`GW.]Ï|«Ëù ŽsüV®c¾µ†[°ò§ °ï*¦Ú›³»6Ž;cdW Ëd,¢:kÍ‘F–;7Úñ8èÊ ªd:°X¢N¿îãÔ/MSZ ¾{<÷-ÃU
-$
-6=:SOM«m?NîbÛö]óDë„Y<ÝÙ<f‚[ <÷>Ÿ#*Iâßïœç8µÞ˜û )–.ÍäŽLðÚœF—©ñðÓ ß®@tæF™Ìšd(".þ‘èlËGM#Óûï'^ËÂ(ÏéÚ/{‘€ÈFXÉ™®ªËî´•í[·o5¥|ã
-™#}m%€ƒ¹<Õ‡—'¢1³¶u7uY”-<fÁz®œ±ô¢>lˆ³"Vî_°´%‡ÍEf±š½£¾TB`i<[|'ãÝ2µrêýö"ßI°pÆD ˆ.„t˜¹úäEß”åÚÿáT%@®ß#Vkª¦ÊbY«¶¦áÙ¨>]7OˆyÎ T þûþ¬i´Â¸]Á—oé»`MõÏ‹ áú:šìLå.0ôaôÀô]MRØ"¿/”ÊËžÖf
-Á™BÁÕ*°+*ЋV5.ÐÁsšL3Ò ‚£>‚ØjG¸V*ò;]¡ãxí·qy(+ŒµÇò¤™\kÉÛ‚sAÒtãäZf¸f{Hõ\AŽE–Àîrb ;M®ÐË]RÀeÛyÁ÷ ý8W9º&9fÊwÝ}—
+xÚí™ËrÚ0†÷<…–öŠttu§ÓE/d’i’6aG3 …a
+†Ú&-o_Ù–©1¦^-f#[–%ñéø÷,‚&ˆ óÎë^ç¬
+¤q(%C½G¤ÖR"–õƨケ¹î½»îÝù÷½KĹÆBh{w~í)«ì¼ëu¾t¨­#ˆnzÐkàh4ïôï Ûk—ˆ`jô5o9G\0,8³Ç3t×ùØ!nVE?ñÄuxû³yJŠI9QéÔþ¼7³a’ø(í½]ŒVs¥Ãtºˆò¹–ƒØbGW¬ü'‚ºËõ±Ïº\V8h,!DU¶änhL³Á¥ô¦c;\1ø]ÛJá­F®âÖ<úŒxƧ^l¢‘ÙžP?€<ìBÈ¢Ÿ}ÿØ5å„ï_'€CÊݺˆÍºä+ÃxoM:œÎÌØE†IFÅòL—»ÁÑ(ápêÜŸNvž Žõ•™?˜Ø‘¦ÃݧÑ>;ÌA…-VÄ(Öš6°Í#™‡ÚûDN’:>ÍNBŽîÚòf„±¨¢‡z™,Vñ®RS"tK÷º[ÌÝØ$™JØwâ“Â3ã­“朶„3ÂpTüò½„¡%ü«„·bXì%ÌZÂÇÇÊügp¦úó|9(^zYg]JQh9ÈÌ‘‹[;îlüË¢Á–e§ãe‹ ]hÌd¯öu±iQI0z>ëèçËÙ05Û.¿Ñâs`ÿ™Åyne¥ÀŒÊºFAkËÓ?®VÐhË»«h”®Ysk̹ uZ›m8TløÄ¤uL
+ø %äÝÉ@ʼn[Úƒt½ÜQTU&-Ýœ.Û«Äû"šµIû¡jÁR‹Jü²ZÌ£½ {«¿Ï ï9¶Q‹t÷Fàô>™þq iöéÌùôĪDâœz2p~¸â–+ÖØJÉ®;Ö’ò×ퟑoþºÍZý—=ßo²iŸaž"La-4
+8ÁÄþE46¾eü­¾³D±P›”Tð­ËM›eÂö Çl••bVô”ä• 1.°´E>ð¹‰LlÓR¥ÕïÆS·?e–ÅHWÊ‹#*_€xÁUqöèÛwáœÁE”šÙ'îž›¥‰®\N†vB¡b:O™µ93-)d¢àZU§-l(ÛÜ®¢t:w²ñ~ú³&Þº¨yȦ±.]I&$ßÖ“¼‰êˆ¿noË
endstream
endobj
-677 0 obj <<
+876 0 obj <<
/Type /Page
-/Contents 678 0 R
-/Resources 676 0 R
+/Contents 877 0 R
+/Resources 875 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 684 0 R
-/Annots [ 675 0 R ]
+/Parent 879 0 R
+/Annots [ 852 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R ]
>> endobj
-675 0 obj <<
+852 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [69.87 759.953 178.477 768.598]
+/Subtype /Link
+/A << /S /GoTo /D (chapter.6) >>
+>> endobj
+856 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [84.814 742.257 198.791 751.028]
+/Subtype /Link
+/A << /S /GoTo /D (section.6.1) >>
+>> endobj
+857 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 722.929 221.956 733.197]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.1.1) >>
+>> endobj
+858 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 707.008 258.7 715.573]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.1.2) >>
+>> endobj
+859 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 687.572 201.385 698.154]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.1.2.1) >>
+>> endobj
+860 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 670.056 214.341 680.324]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.1.2.2) >>
+>> endobj
+861 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 653.243 227.342 662.699]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.1.2.3) >>
+>> endobj
+862 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 635.618 227.342 645.075]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.1.2.4) >>
+>> endobj
+863 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 617.994 227.342 627.451]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.1.2.5) >>
+>> endobj
+864 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [84.814 599.45 279.825 610.033]
+/Subtype /Link
+/A << /S /GoTo /D (section.6.2) >>
+>> endobj
+865 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 581.934 221.956 592.202]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.2.1) >>
+>> endobj
+866 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 566.013 274.148 574.578]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.2.2) >>
+>> endobj
+867 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 546.577 194.911 556.953]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.2.2.1) >>
+>> endobj
+868 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 528.953 216.842 539.329]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.2.2.2) >>
+>> endobj
+869 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 513.14 258.7 521.705]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.2.3) >>
+>> endobj
+870 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 495.515 193.907 504.08]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.2.3.1) >>
+>> endobj
+871 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [139.608 477.891 184.94 486.456]
+/Subtype /Link
+/A << /S /GoTo /D (subsubsection.6.2.3.2) >>
+>> endobj
+872 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [84.814 458.455 231.042 469.038]
+/Subtype /Link
+/A << /S /GoTo /D (section.6.3) >>
+>> endobj
+873 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [107.728 440.939 221.956 451.207]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.3.1) >>
+>> endobj
+874 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [69.87 402.651 99.805 412.396]
+/Subtype /Link
+/A << /S /GoTo /D (subsection.6.3.1) >>
+>> endobj
+875 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F11 878 0 R /F99 691 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+882 0 obj <<
+/Length 19
+/Filter /FlateDecode
+>>
+stream
+xÚ3PHW0Ppç2ÀA
+endstream
+endobj
+881 0 obj <<
+/Type /Page
+/Contents 882 0 R
+/Resources 880 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 879 0 R
+>> endobj
+880 0 obj <<
+/ProcSet [ /PDF ]
+>> endobj
+886 0 obj <<
+/Length 2007
+/Filter /FlateDecode
+>>
+stream
+xÚ­XYÜÆ~ׯ ÂDŠÝÍSo+%2G°á,`Qp9=ÃÆòÊcyÿ}ªºª9$wVPì<±Ï:¿ª®bä¼ÈûæU価LpˆŸo^½»õ惈2OäaR¤Â»?zYæiê¥y¦™ôîÞ?ý÷u9Lú¼¤Ì}±ÿ×ýß6„ˆŠ”¡Šr‰T"/H’0ΙÀ·Ý¤›O2I÷Aœ¤þ÷ƒî>þ€tÞ|(
+OÆa–g–»Pp+QpßÞûEŠŽmè‹,Œ³ÂûñÒM¦Õ$ßßÍùYsÿ‰ùùXVú†à·íÂF‘a!D‚ì‘ÀDI/H••ϲ¡Ø"Š"dqÞ‹Äï—j2}Gœ˜ö›qêåa‘¦ŠM#ó0Dã¾6ã>P*ò}uiu7ñL(4̓Ʋð§ZÓ¦±ía„ZÙ¥áÜ£
+`yž}‡Ê,`ªtŽ»zš†·oÞôÀ¾Âþ|úîw9€àMeâðÏr”¦¥5•Yíá‹@Á¯FÄÿ64¥aµflbÖk}jÆ×Šê¼½Â-ŒÂÙæ(o¼WÒ§pC“jÂvÓà†u¿9utÈÆ6|×
+ÞŸ·Èjˆ#ˆîºV+ ¢¨ÕU áE7G0lÏãäð9˜j/!ò“§ÀãAc#„B4*é,­¡‘t£é(½8òÙ›!8—â^9Mº,¦,qZ=hñ Í’öÆ‹™®©7ª¾C¶§ Ž©‰§¦Õ¶'w±mû®y¢uHÂ,žîl3Á-PžûŸÏ‘ ¨8öï÷ÎsœZoÌ}ÐK—frG&xmN£ËÔxøiÐoW º‚ sc™ÊšT(".þ‘èlËGM#Óûï'^ËÂ(ÏéÚ/{ƒÈFXÉ™®ªËî´•í[·o5¥|ã
+$mlÁåÏÆ¾HÉÐ:Õ†^À
+‚ÓÍ{N/usáiÜ>dTp,2ROqù8{qc
+G>GÅÜæ¬äÊîwÍÈ2lžm¥”¿;±XPÔº[‘µ(ðWï;-, ¢| rëX”„Qñu?Ä2¹ú!ÆâHÿ˜_¦Ø¿"7ú
+endstream
+endobj
+885 0 obj <<
+/Type /Page
+/Contents 886 0 R
+/Resources 884 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 879 0 R
+/Annots [ 883 0 R ]
+>> endobj
+883 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[0 1 1]
/Rect [232.239 506.533 335.85 517.008]
/Subtype/Link/A<</Type/Action/S/URI/URI(http://openmp.org)>>
>> endobj
-679 0 obj <<
-/D [677 0 R /XYZ 70.866 789.024 null]
+887 0 obj <<
+/D [885 0 R /XYZ 70.866 789.024 null]
>> endobj
6 0 obj <<
-/D [677 0 R /XYZ 70.866 771.024 null]
+/D [885 0 R /XYZ 70.866 771.024 null]
>> endobj
-680 0 obj <<
-/D [677 0 R /XYZ 70.866 580.643 null]
+888 0 obj <<
+/D [885 0 R /XYZ 70.866 580.643 null]
>> endobj
-681 0 obj <<
-/D [677 0 R /XYZ 70.866 580.643 null]
+889 0 obj <<
+/D [885 0 R /XYZ 70.866 580.643 null]
>> endobj
10 0 obj <<
-/D [677 0 R /XYZ 70.866 580.643 null]
+/D [885 0 R /XYZ 70.866 580.643 null]
>> endobj
-683 0 obj <<
-/D [677 0 R /XYZ 210.362 462.213 null]
+891 0 obj <<
+/D [885 0 R /XYZ 210.362 462.213 null]
>> endobj
14 0 obj <<
-/D [677 0 R /XYZ 70.866 444.007 null]
+/D [885 0 R /XYZ 70.866 444.007 null]
>> endobj
-676 0 obj <<
-/Font << /F107 565 0 R /F99 531 0 R /F46 525 0 R /F160 682 0 R /F95 530 0 R >>
+884 0 obj <<
+/Font << /F107 725 0 R /F99 691 0 R /F46 685 0 R /F162 890 0 R /F95 690 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-687 0 obj <<
-/Length 2634
+894 0 obj <<
+/Length 2636
/Filter /FlateDecode
>>
stream
@@ -1892,5033 +2451,6719 @@ xÚ­Zmܸ þ¾¿ÂHQÔdKòkÐ+K›CIÓ&[´Er(¼cíŽ=g{.Yýï%EÊ/3În6™/;¶DQù"é ¼/ð~ºøñò
…¥eh¬¬»>¯*ÃÃy]¸qúíí60sèLû‡U\hbŸ÷[E§,
ÐlÐ@·oꢬoˆìÅJ¾¾EeçÌy*›œÈ¨³#)GiŽI² ª¼u*¤ò
CpŸaJi‘ÉÁ'žÂñÃÐ"Ý Ž¢´#&(Ì5j!?T=ÍY Ãï£l—wæ‘ Âgtp˜™šÜæj¥ÿpóÈžÕ[‡è-|ƘDº\I ±L4šŒ@å2"Á´ß\ã¯bËâÀ¾g@Ò«i žø„ÀMB¿+wûʱ+
-Ò”“€!“XèA\Ð^"’P:Úõ?u¾3 Ì")R=–?}™›ÿa‰ƒP:ùjiìyóê°$‹’BÑ}² ¬¬-Õ|Ô˜Á—ϹUá¨ÓòšfoѬÍ^>!A^÷ôÖ7d,²|i=‰Ê~KO7P,T‰(ÊæŽÞmò‚
-B©gS}³_WV¡ÒŠæ_çQG.*5h9^ûxE¾»£pýY:íö4l_oé9'н¡Õ¼Y·¡×rß;éòž(1TÙ‘ŸŽ^ ^@2w3æ…éó²ZŽàs¡m¼¿›îèyLJÆãÚ{AMî…©Œö~rÛSبÔj¾¿à~°úÄ­³D¤Ùà×}ÓTÝ“+„¢ØW fNµˆÓØ‘Ûk/äköøTV=íYºš¥+ëëÁc"8X?ÜŒ’–o^]ö|c^’ßtΤˆ’”5È@£½雦î[ž½ÀyC´fiH™LžwßáGj²cëõÖTûû=ã%"^fË’iø%ïG’º¡ß¼½9ì ÷è÷4Yö4G*ÇuýpAáxÏk'¡Å²"ÚÎðò†¥©&·ÚÍb™ò­†öû¶qö…ÌŠóÚÍ·L»Ë7Û²f´¸y[n¶#á‚[Ìâ!§LIàoakSCòÁAœ„ö QQ— ÛŒb0½ÿä(%Î »P:Ó„D\tM}kÆ®Ø0Ö‰næÌ ZHX7­a9H­–“u[Ÿ³ƒ
-“)$3-
-•ë<€šÂ%£Hš BsÆPÍÚñÊÀÈqhw=©:ÇÅJ)!exFq£†bã!òœ¶ÀK„Ê€I$”/H
+Ò”“€!“XèA\Ð^"’P:Úõ?u¾3 Ì")R=–?}™›ÿa‰ƒP:ùjiìyóê°$‹’BÑ}² ¬¬-Õ|Ô˜Á—ϹUá¨ÓòšfoѬÍ^>!A^÷ôÖ7d,²|i=‰Ê~KO7P,T‰(ÊæŽÞmò‚
+õ¸Ê;NdÌéµJý·—¯èáG¶;<>´œ“ çé݉—¥Âù)…É’™
+á’Q$Í¡9c¨æ íxe`ä8´Æ»žTãb¥”2<£8ÈQC±ñyN[à%BeÀ$aÊ $€Oʵשit¢Šó9j¨À¿ï :É„ÖG'áLs~‚H…BÉo8À)>Eò}è ¾…á„8md$ DJ0ˆ„½4‡¯Wàà¿‡Ï J'HÃd|Ü»9ªZ²ÊÇ á›w§Ú€}†“80NOòï•„ˆcºAÈÇüÈ;@y! }I
õ8\–ÂëÁBœ X$aô]ÐÒ˜givh˜7 °1ü_ËÐ
Á€ ØZÍ9dt ™Ê8þ’ÁlÎ!Æ
¸Ëoã~¢(
(ž<) ’ÔPðôìô©åãM°-
^|cj3ÊÓý[fgƒÃp˜§ôÄ6Ã6œŠ1v@BüüN¶e·T½e·9tË«»wn¨ñrbû±@wÎV4Û"ü6D ‚7‡¾*±ÁöPÃ…Áqÿ=Äž/~¶ßÆ6LdÕ SW¹=4Y …ü)Ò.+Lî†ló1”nrúY‡aûnµéÑPNFd™_Ó(Û|Æ“0„CÍüNzÝçd˪2Õ’ á”q´=›ïúPo&=×õK]×϶Xj×T¹§c= Ã–†U_î]?¦ß¶&/:×-
-ã;?×›ià¿÷¥¬‹°’¿7ŒàZê‘C^‘¶!áo‹H›½½·“þ[Sóoºïmýºi0», —áýC‹þËèŽÜ†Ãö³Ø}¾îwû6¿ÙåÔ¨ÑXk°êäp÷3D–±HtB;ɉˆ4‘NE¹fšKâ=¼½TP4KŠéš“`@ÄWæX<Ù꓉ädbà»Ô²‹üæüÐ,2‹ÀÎ*TŦ­ŸÃHÄ1ç ?aDïE—5¼hKzø³Ù¸~Uàž¤zdO#íºÒjÄõäN¶Wõü]FäIlýi¹ø¿.£ÜøEY}åÿº¸OˆVöÆ~ý½½±àÍG:þ?îÝ›g
+ã;?×›ià¿÷¥¬‹°’¿7ŒàZê‘C^‘¶!áo‹H›½½·“þ[Sóoºïmýºi0», —áýC‹þËèŽÜ†Ãö³Ø}¾îwû6¿ÙåÔ¨ÑXk°êäp÷3D–±HtB;ɉˆ4‘NE¹fšKâ=¼½TP4KŠéš“`@ÄWæX<Ù꓉ädbà»Ô²‹üæüÐ,2‹ÀÎ*TŦ­ŸÃHÄ1ç ?aDïE—5¼hKzxgöô bþ dÈw`üTEOÃÄu¥ÕˆëÉl¯êùÿºŒÈ“ØúÓrñ]F¹ñ‹²úÊÿuqŸñùÏýú{{c À›tüê›—
endstream
endobj
-686 0 obj <<
+893 0 obj <<
/Type /Page
-/Contents 687 0 R
-/Resources 685 0 R
+/Contents 894 0 R
+/Resources 892 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 684 0 R
+/Parent 879 0 R
>> endobj
-688 0 obj <<
-/D [686 0 R /XYZ 70.866 789.024 null]
+895 0 obj <<
+/D [893 0 R /XYZ 70.866 789.024 null]
>> endobj
-690 0 obj <<
-/D [686 0 R /XYZ 244.482 523.188 null]
+896 0 obj <<
+/D [893 0 R /XYZ 244.482 523.188 null]
>> endobj
18 0 obj <<
-/D [686 0 R /XYZ 70.866 504.993 null]
+/D [893 0 R /XYZ 70.866 504.993 null]
>> endobj
-691 0 obj <<
-/D [686 0 R /XYZ 430.105 302.276 null]
+897 0 obj <<
+/D [893 0 R /XYZ 430.105 302.276 null]
>> endobj
22 0 obj <<
-/D [686 0 R /XYZ 70.866 283.974 null]
+/D [893 0 R /XYZ 70.866 283.974 null]
>> endobj
-692 0 obj <<
-/D [686 0 R /XYZ 257.237 222.002 null]
+898 0 obj <<
+/D [893 0 R /XYZ 257.237 222.002 null]
>> endobj
26 0 obj <<
-/D [686 0 R /XYZ 70.866 205.592 null]
+/D [893 0 R /XYZ 70.866 205.592 null]
>> endobj
-685 0 obj <<
-/Font << /F95 530 0 R /F99 531 0 R /F46 525 0 R /F11 689 0 R /F160 682 0 R /F107 565 0 R >>
+892 0 obj <<
+/Font << /F95 690 0 R /F99 691 0 R /F46 685 0 R /F11 878 0 R /F162 890 0 R /F107 725 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-699 0 obj <<
+905 0 obj <<
/Length 2937
/Filter /FlateDecode
>>
stream
-xÚZYsÜÈ ~ׯ`ž–“²h²yï>ÙqäòV6ë¬U•ï–‹"{fXâcV”Tþ{p5/Q–”§éÐÀts\ë`¹Öû‹·×¯¯ÒÐJœ4Š|ëzoÅ®“D‘§Ê‰<뺰>Ûží.UœØ+oÚ¬Ý]z®}Ï#ê^·û,×Ýî럭 Hœ0L€5-ôqðâ¯×_/<s-odŸ$N¢+?]|þõ
-˜ûÙr?M¬;¢<YAè;aàC»²>]üã‹D"Gžã™ËLB;oêrío;ÚD\»×Ï•ußp«kNº?–õ»ý1ë¹U5ÍíÄ)×ç~Ȫê^&Ë[ä­Í"³çïnèÞu;NH£ÎNZH†Ž…ˆl°§Ç,"ûk 󲪆®‡I×Îú’åÿ §’‰a«³ŠìîZ—žç¤aÈÊWpN´ödzÚuÞ—`êa y{qëF󯈭*ëÑlØÌöcó¹ëX**Ê.ºqZ”[§¦•VÙuìé…¶ã8`$ÜÜëôë:!´Zìró·÷pä^äZ‘“Æ~‚g+åx*a»Œ”/ù9@é:
-
-{RZŠvéŽq²uN ÑÕ#÷vcËs8L#ño?pÂÄ pèxˆ»°Ë›bÛE«»ŽñJA°³–Úß0¾²¶Ìn€¬b\åY'QàDf— ‰Ñ[€·š=ÿ
-ö¸ö¯g]ÿò¹CI­˜*’ÜsSGù©åCþˆŒÝ]Ÿ)—¸í¤©zN„o>~·ie£Ì4êÑ'´OQÒý
-™;ƒAé
-a+
-|ýVºÓáAožÀ‰1¦)š0ûziäBäOò2ø]B6ŽTY}Ó°;>`ïMuhd¼Qx¨}·¥4¢¹®
-™O‰å™&ëM‹šf²nøWªshµúëP2$Co¶”¹Žé„¿å9Š|!kŒà-
-s*¾-% wÆ$E½¹¨89Õöлöˆ§,ŸTösi¶Åµ¥)ƾ¯"Ž}Ã9ëJª[q°9ï¤èTd«Óó+±.7 ó#ÄÉb`¨A¯¯; †PqÁõl«tPì êÉ1³!;¶ð·.4Ü` àlʲû鯼€™ûÈ3ª†U˜fíf)ln
-«|Ï’¬,ÄFšßæ!òðÏ%óØz×ÐSÆýt½6ñÿ
+xÚZYsÜÆ~ç¯@žŒM‰0¸í')Urűb±*²K³»(b1ŒËÿ=} .‚"™§£§§»§ûëžÁºÖÁr­wo¯/^_¥¡•8iùÖõÞŠ]'‰"+N•yÖua}²='Ú]ª8±ÿQÞ´Y»»ô\ûžGÞ×½n÷Y®»Ýï×?YA8a˜
+
+;lPرyÆÂ†Ô_–¢]z€£Aœlht`õÈ½ÝØò\'ÓHüÛœ01:â.ìò¦ØÅvÑê®c¼RlǬ¥ÀƒöWŒ¯¬-³ «—GyVÀ‰A8‘Ùå=BCbôÃà@Ç­fÏ¿‚=®ýËY×?@î@R+¦Š$÷ÜÔQ~jù?"cw×gÊ%n;iêžá›ïÇmZÙ(3ºAô í“A`”t¿€Ú:7’îÛæ´’Õ¸÷ò¦q†í Ì&„.Áå9€a°#`|e¸›ÔÀrq$z1(¼Dà’L©ì.oΚ›fH¤R˜Pú¬¬%ë¨Ñ™
+ÂiOcDýmhÁzŽŸë]Ø:‡à9Öå—A¿ ~Ð$µ ™Îe1tc;gþè´8;7º’e¾?ʺ¥-qêabG:¬;ha#ët®K“›q"“õÜ<“šBæÎ`P:€9åGY#Ђ£›>±å$pFyV/+‹,‡@«‰ÕØÔ4xÐS¬Îjtº
+Ýår^7hRdR¡ ³š-Òod§ùc×OãGôêýH}Ì:ž<‹ª#×¹aX°sÁºƒê‘ :D}á"\UZFZ}€Í:¦dçÃa@õ±ôç9Øè~SU“Dãä›è÷|°‰ç`£l®†~ <ÿ?±&aŠA¼BgØ
+$
+۞Ǹæo…‘ìY±ï”¹äd˜©u×/6
+›À³Šáy¨ry'3¸|„^*ŠºPµ·èœ`¦Ð¦x;o™#ãÁäâ¤Ü‡ÙJñS
+®&Q¡èpÑ_°Ä8ä&îŽ ½%
+z­am—øNo[±y^‰§ NæA¬ƒL(Ãï5w1™w’„¯w›Ex3íÊB¯·î%yä½äx¼+± ï¹Sk]ÈÃO,Ï8XmB‚ %‘9C,l*ÝKoÏ8ö-ä ƒÑ‹UèO§}¹†pßì«]Ú|£Í™¬liøýZ’Eî˜ÀŒŽ[®ò'èK†%$‡
+LÖŒ%[Ç}r \ EŸaj —†©méêÅ–ȳÎ|ÀojSN3ƒïòšen6 ßh’Ù&™n4‹%O ý’ iª&‰Æi©ÐŸ™š«ûÞ‡’¼7ûØeÞÞÏ.ǹX‡<ßzö"G%>½ ÇO½ ÇŠ_†…p–LLJÝ6×·tO9©ç…¸É¥j§|é§ô cúØI7uóµ3¡ÈUëߺ¨'Žù°rmžl7¾É%sh£®ù,¨¦"†^‘Ï:/±èι/ ã{*ôÀfOË>Î: ¨ÿô$Žë&‹#0WyÎ^=ôÐcr+“E““£mÌÛwQîÇ{¾×CÒðœdý|~jŠaùà2~뉜8‰aYäxž/(®>%â§fþ€ þ¨†‘ýÊÙœýåzç!&ŸW‡ „âMEF¡ŠmâóD¼ú>ºY¶=|7¯óÚ>á̺Ú#1u|?|©n?ês«ól¼Ý]üÀ[ê¶Š£ëm¨žN·¿+“ †õâZ©jêƒ)šÇݦÆÑK5þØ›8β;?0ÅöÇãÐ&'?­üm¤vÙ—YUþwüÒ lŒU/¦¶Ï|¾ãÖßÂ|þ%~0ÿÓ
endstream
endobj
-698 0 obj <<
+904 0 obj <<
/Type /Page
-/Contents 699 0 R
-/Resources 697 0 R
+/Contents 905 0 R
+/Resources 903 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 684 0 R
-/Annots [ 693 0 R 694 0 R 695 0 R ]
+/Parent 879 0 R
+/Annots [ 899 0 R 900 0 R 901 0 R ]
>> endobj
-693 0 obj <<
+899 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [94.777 106.654 144.523 117.128]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES) >>
>> endobj
-694 0 obj <<
+900 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [94.777 87.211 184.477 97.793]
/Subtype /Link
/A << /S /GoTo /D (group__DEPRECATED) >>
>> endobj
-695 0 obj <<
+901 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [94.777 67.875 185.714 78.457]
/Subtype /Link
/A << /S /GoTo /D (group__STARTUP__SHUTDOWN) >>
>> endobj
-700 0 obj <<
-/D [698 0 R /XYZ 70.866 789.024 null]
+906 0 obj <<
+/D [904 0 R /XYZ 70.866 789.024 null]
>> endobj
-701 0 obj <<
-/D [698 0 R /XYZ 70.866 653.962 null]
+907 0 obj <<
+/D [904 0 R /XYZ 70.866 653.962 null]
>> endobj
30 0 obj <<
-/D [698 0 R /XYZ 70.866 647.487 null]
+/D [904 0 R /XYZ 70.866 647.487 null]
>> endobj
-702 0 obj <<
-/D [698 0 R /XYZ 267.799 580.069 null]
+908 0 obj <<
+/D [904 0 R /XYZ 267.799 580.069 null]
>> endobj
34 0 obj <<
-/D [698 0 R /XYZ 70.866 563.111 null]
+/D [904 0 R /XYZ 70.866 563.111 null]
>> endobj
-703 0 obj <<
-/D [698 0 R /XYZ 138.731 469.333 null]
+909 0 obj <<
+/D [904 0 R /XYZ 138.731 469.333 null]
>> endobj
38 0 obj <<
-/D [698 0 R /XYZ 70.866 454.267 null]
+/D [904 0 R /XYZ 70.866 454.267 null]
>> endobj
-704 0 obj <<
-/D [698 0 R /XYZ 309.53 215.752 null]
+910 0 obj <<
+/D [904 0 R /XYZ 309.53 215.752 null]
>> endobj
42 0 obj <<
-/D [698 0 R /XYZ 70.866 197.622 null]
+/D [904 0 R /XYZ 70.866 197.622 null]
>> endobj
-697 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F160 682 0 R /F107 565 0 R /F99 531 0 R >>
+903 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F162 890 0 R /F107 725 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-722 0 obj <<
-/Length 2188
+929 0 obj <<
+/Length 2211
/Filter /FlateDecode
>>
stream
-xÚíZ[Û6~Ÿ_!`ÀÞŒRE)Ù,ÐíL‚´M›&.ò‚,Ó¶vdÉ•äºÓ"ÿ½¼êJ{d'í¾ìËHC“çú‡’ µ¶ õòê?ó«'/lù ð<Çš¯,ïy là!k¾´>LÜéÌf?ãÉ«¬¢éG{ÓÆÞä‡Í^¿™þ<ÿ†É¬€É°=.Ãqp˜8(ׄÐQ³:š€K\=çí>«’-ešˆ?ù.YQ1!8¹—#\s±ŠbÊå\Ýί~¹Bl)´Pm°ïßv­x{õágh-ÙoßX8oÄÌ­åb`—›•Zï®~¼‚*° ×k™èàaÇ"PGã£mcaE³œ›Q¬•=o_^YD|ÞL]8a~07¢4¥©tå#Äp5uà$çâÉÝ“ÿæIÆFQG*“a2Yí³¸Jò¬”‹ë…üŸd»Ké–²Àek_äÁVïÏÅ:Äùv7yNvQ!íiëëy>Ó‹g6ãs}Ÿo
--uò³ñdqÎõµÜïvüžET¸+«–’²Š*Ÿ$ûeŸÈà&´ìj‚—:ô¾2©çÝ&RZdü»þpÐä„KŒ®Ä²-QŒÄlm%ÇöqUê`Äy•¦ÄÛ®Œ‰_1mbz'Õ.¾[ëµI  ˆ£’*ßNáÈ€H Âî~Žv*6¿NŒT¶ÉdUÑ#Æ|t“Qå†e\™”úBéµÎÐŽgõ>Éäÿ´Š¿äÞÝgñ¦È³ä÷#%Ã]b{Ø+9` Ü€ ’I•ÄQj
-A€8è ,¢¢H¨ {?Œ=o r••Q"
-gÛ¢ä|‘44)? ‹QKrÞ–|„ØŽU˜2ô&÷|ËÆI©™,¤**ïjÞÙDškª$M»F.TTiTÍ
-3ƒßëYVo‹øžÖuÍ(2ÜÌq“Z@JÜû©ËÜ+8¹Ú’®¥ì¥éuñˆº€ [
-žo^ïj½¢í|ÊqÐÉÜPM Ku·¦™N]öÅ`»A·ÐÝ1’jÓ´Zž)¡Ëû,ªáRÆ6-e>ƒŠk4^)Ïâö­0«?ÄñuVS
-Xô7VwY/Al¦H ûËåõ†d¥ˆ=(Í£;ËÍ)ç­‘BÑÍ“¥I o©ž#ŽyŠ0”£If4sq¢Wò¡hÛÄœ£‰Wꀰ(ŸÔ–œë
-ž¢öÅÕ= w8ß§jł귈u¶Z„>Òô÷ZÇ&?(cªR[ÅŽ+QªHblC ª-ˆ£}Iõš®×ùŠõ­&Oë-‹ƒÒZÏ
-ì·Fðõ@g„òJtÙ:f&1Da]Ok¾ I¨›…Pc\­(P?ZS¨c Í–cJÊPJc›†‚Vû"3Ñ<½mŸ`ªÖþPVk…Žm!‚aÝ,…Uˆ/è>"5¡cW¨®æÓ³sll>J(ËM¨-„¬ùÓ0ï:ý£CtŸÆ¼iÛ3ÖE-/Ù84úÎàIn•óte‹ù`•FërXËqÎÎÙš6¿}ý&|usûý<üjþÃëW_‡ooo~úúVU½æ¦’VcX&°ÄØD5ÉJëÞî’”ª2§yÁýü*Ï ’‚ÔU=dè´âà’ s¦M¨P¥y¬“pÀeÚ C@ˆ
-áç‘Ö~L»LÊ]TÅ›·b¡;fó%×ò@l€ W‚™QŒÚ…*Ö;XwÃêô: tÖÖ>CŽüÀo{vØ$½GƒíGbó¡ÝcÕAÉØ¹ö¼ x8Ä>|$(†˜­%úCm”?j
-;…äöZraC»}×ÜDC\O• €ÐéÐŒîô¾˜â¨4Ö(zªÈ`Ì,
-N—Qg‹Ôèä(#Τ¸!-²sÈgdÍõ€‹Ñ™Ìø¨×Sf@ÖLxî”ü‚ ïú&¦âþp¢ìn¢”Mi(š7Œ–Ëщs•økcƇçOi¼éÛL€oŸóå‰þìÆ6ñ\ñÊÞƒ¬_vÙLà1‰ÂÔ—M³Þ¼§ó'/ŠDÞÜPõ¢9òjC}‡ì§0xŠýÉn^"µ>âQo+Ûñ4ÏgaAk^÷v>âiìÆlŽ=ò#ž7CÝßäâ%ÚýZL Y?Æ
+xÚíZ[Û6~Ÿ_! @`7c†”D]’M¶™énÚlâE’BeÚfG–TI®;-òßË«®´Çöd»/û2ÒÈä¹~çã!%h­-h½ºún~õäeˆ­
+ª Àn0\¯cbà;–ï!
+Tå¬M°ÓFa¾’×”.(K;>Ï]åÜ‹<ÙñRæBÊÍ$oÔquÛ(ÛÄšYkš¦}ªæ÷*"uM2
+›Còh ØFî~ø¨ ñG-ºuãâ05½`´œ1>ê:×
+˜¤½Q–ïcZŸ%5–T69j¹¾ÐMºŽÜA?.¬èöîš™H„›¡E8:Ý4mÞÃá¤,NâÊX£è©¢€13!(<VF½õQƒ`€ƒl8“ÒŒ›¤Íõ€‹ÑY¬øhÐMŸÌ~¬ðœž ¶!¼ÚÛß»›¾5Á>ìs¾4ÑŸÙxÀö=W¼¢÷ k]6xž:|Õö«í›ª`ò²¤ê{RÈÛSWˆ\y‡¼§6~êúú=ŠÝ¾Gé|´£^Ov?Úi(‘Ϣݾßí}´ÓÚÙûÄvÜ uÿ"ï‘îÖb
endstream
endobj
-721 0 obj <<
+928 0 obj <<
/Type /Page
-/Contents 722 0 R
-/Resources 720 0 R
+/Contents 929 0 R
+/Resources 927 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 684 0 R
-/Annots [ 696 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R 713 0 R 714 0 R 715 0 R 716 0 R 717 0 R 718 0 R 719 0 R ]
+/Parent 879 0 R
+/Annots [ 902 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R 923 0 R 924 0 R 925 0 R 926 0 R ]
>> endobj
-696 0 obj <<
+902 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [94.777 758.07 165.934 768.652]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL) >>
>> endobj
-708 0 obj <<
+914 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.777 737.915 172.471 748.497]
+/Rect [94.777 738.259 172.471 748.841]
/Subtype /Link
/A << /S /GoTo /D (group__THREAD__STATES) >>
>> endobj
-709 0 obj <<
+915 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.777 717.76 151.077 728.342]
+/Rect [94.777 718.448 151.077 729.03]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING) >>
>> endobj
-710 0 obj <<
+916 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.777 697.713 207.178 708.188]
+/Rect [94.777 698.745 207.178 709.22]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE) >>
>> endobj
-711 0 obj <<
+917 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.777 677.558 160.555 688.033]
+/Rect [94.777 678.934 160.555 689.409]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION) >>
>> endobj
-712 0 obj <<
+918 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.777 657.404 170.426 667.878]
+/Rect [94.777 659.123 170.426 669.598]
/Subtype /Link
/A << /S /GoTo /D (group__ATOMIC__OPS) >>
>> endobj
-713 0 obj <<
+919 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [94.777 639.205 229.442 649.787]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING) >>
+>> endobj
+920 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [86.607 347.75 138.811 355.276]
+/Rect [86.607 331.81 138.811 339.336]
/Subtype /Link
/A << /S /GoTo /D (group__STARTUP__SHUTDOWN_ga53f4ef16321f42eeb3b8dd463b51f112) >>
>> endobj
-714 0 obj <<
+921 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [86.607 299.929 130.443 307.455]
+/Rect [86.607 283.989 130.443 291.515]
/Subtype /Link
/A << /S /GoTo /D (group__STARTUP__SHUTDOWN_gacdedfb2c01fe256ad6c75507644bdfed) >>
>> endobj
-715 0 obj <<
+922 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [99.16 244.138 130.443 251.665]
+/Rect [99.16 228.198 130.443 235.724]
/Subtype /Link
/A << /S /GoTo /D (structident) >>
>> endobj
-716 0 obj <<
+923 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [86.607 172.407 180.654 179.934]
+/Rect [86.607 156.467 180.654 163.993]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) >>
>> endobj
-717 0 obj <<
+924 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [120.082 164.437 214.129 171.963]
+/Rect [120.082 148.497 214.129 156.023]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) >>
>> endobj
-718 0 obj <<
+925 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [120.082 124.587 205.76 132.113]
+/Rect [120.082 108.647 205.76 116.173]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_gafc5438d4c4f01dcd347d9bfde27f68e1) >>
>> endobj
-719 0 obj <<
+926 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [115.897 92.706 218.313 100.232]
+/Rect [115.897 76.766 218.313 84.292]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_ga5c40184c6babbe35c50d43a47573c5c5) >>
>> endobj
-723 0 obj <<
-/D [721 0 R /XYZ 70.866 789.024 null]
+930 0 obj <<
+/D [928 0 R /XYZ 70.866 789.024 null]
>> endobj
-724 0 obj <<
-/D [721 0 R /XYZ 70.866 628.003 null]
+931 0 obj <<
+/D [928 0 R /XYZ 70.866 610.714 null]
>> endobj
46 0 obj <<
-/D [721 0 R /XYZ 70.866 621.455 null]
+/D [928 0 R /XYZ 70.866 604.032 null]
>> endobj
-725 0 obj <<
-/D [721 0 R /XYZ 70.866 586.291 null]
+932 0 obj <<
+/D [928 0 R /XYZ 70.866 568.921 null]
>> endobj
50 0 obj <<
-/D [721 0 R /XYZ 70.866 586.291 null]
+/D [928 0 R /XYZ 70.866 568.921 null]
>> endobj
-720 0 obj <<
-/Font << /F95 530 0 R /F99 531 0 R /F46 525 0 R /F160 682 0 R /F107 565 0 R >>
+927 0 obj <<
+/Font << /F95 690 0 R /F99 691 0 R /F46 685 0 R /F162 890 0 R /F107 725 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-741 0 obj <<
-/Length 534
+949 0 obj <<
+/Length 625
/Filter /FlateDecode
>>
stream
-xÚ”KoÓ@Çïþst
-¨Q€’[SEN¼i-'8´B|wÆ^»)jKvgvö?¿Ùñ„Á508 ÞL‚—§‰‹‰Ö&K0 ­Ö`šÃ$ƒË£EÂØðä6]oWn7ºšœC[TÊ’L¤jgp2 ¾œ| øo)kÑŠëàòŠAFgçÀP&¾7‘kˆ•DKÚ¯àsð)`- PTd”äé­‹k#mÍιF›H0š#ëèç¥K¿4p*9¼ãyˆ¸ úD†ô½Tæ–é~UŠ5º ±\ø980(¿¬3
-J‰œ~ˆû®š„‘‚Â$n ú¶É³„H3®Ó¼˜q6+]¶_¸™š2ÅÚ¸¾ÆAþÖ®*÷‹êI½*ß³jÖt7¨lLX(„‡zæ¿ ääî½-Êêf÷â1zj…J$Ãú..8ÊXý5Wy³5’ôTÜ·J„Ñ÷šøÃk?èa_\ôºl€¶¥—{þʯ}š>âè‰O¢­õOƒ¤ ÍÑ¿ŒQ7Ý…Ññ`ºc…š–&ï™+\™V.ó3¾)üzZæ~sì~Ã¥_ëv\ŒY2V­µ nJo¼-*·š
-¥½ùaëŠ÷ë
- (ެ¡®HÞý‹L“mÔ[QŒèb.öE•¯~—ÏË”rrÞyϼÆh÷Ç›‘dáíÝuàŠÃ'þI1¦
+xÚTKoÓ@¾ûWì 9 »ë}Ø©à€h+*Ðæ–V–coZ«~ÇVˆÿÎx×!NZ•Âewvvæ›oJ® %§Þ»™÷ú$’$„H©€Ì–DS•":â ™edî3У ס|—”«Â¬GW³3"DR†cd§ôŽgÞ7¡Žö* !䂤¥7¿¢$ÿ3B!ˆBòÃZ–DÈ
+*Ã4In÷Ÿ…õ "™Y&›¢=›Z4tPÐ5`àðkð¡Ýü   É1&0<-‹}UG…v‰A$œë÷:Ïkd™ä•-š-`,mŸœÝ.ÇA‚ÎkÝ6›´ý+^›×UÜÆvº gd(\›»,ÈNÛS)nÖ㧘`©%H K÷?¼g8÷òÙ¼š›õn¼\«p>A«½&þt؃&7y»?­¯Þ G¹ ³³8z8{ÑçúØ‘÷Ç¿¬íVSÀµƒ­&$(¼lÜSS™&iMæv[]¹û¤ÉpaVNિ)NbjÊåTô[q9âÔ¯÷øPµ¦¸ä²÷ù¼2Õ§/]†H(®*] Øv{^RôVCÚmøÖæ|SµyiðÇ|Ñ$“QÿÞi^~_êßÝ_[S–ø7 Ño0
endstream
endobj
-740 0 obj <<
+948 0 obj <<
/Type /Page
-/Contents 741 0 R
-/Resources 739 0 R
+/Contents 949 0 R
+/Resources 947 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 684 0 R
+/Parent 951 0 R
>> endobj
-742 0 obj <<
-/D [740 0 R /XYZ 70.866 789.024 null]
+950 0 obj <<
+/D [948 0 R /XYZ 70.866 789.024 null]
>> endobj
-739 0 obj <<
-/Font << /F95 530 0 R /F160 682 0 R /F99 531 0 R >>
+947 0 obj <<
+/Font << /F95 690 0 R /F162 890 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-745 0 obj <<
-/Length 319
+954 0 obj <<
+/Length 321
/Filter /FlateDecode
>>
stream
-xÚ•QÉn1 ½ç+|ÌH=áXQPQ«ns,!ÁÐŽ¨Zþ¾Éd¦¨Ë¡=ÙNžŸŸý6€0"—%¹z Žyc$”k°Èœ1`½`†C¹‚ 5EOÄoM¯«cØM…ŽZz÷ªÛûbVŽ#‡9„IRZ&#æþ)¢lQ_&1eU‡y|­ŽÛ}ˆ“¬£7ÛE=¯‹GzÊ/ir½ž/Câ!W%y!<¶"ðOÁÎ1',÷d2CXÅ¿1 “ÞÁ[ƒÜƒÒ’i•díà‰<lÐÅœÚFÊÿ0vç4LX£Ò’ óJE$3‘±ÙuªPÏa•w;T9ëmNa™.sØe\ôÑ÷u[­ ôPŸOÔš“Êoææ­tI·œ É5ç¬[GŒø£9‹$£Í‡B"}?m@¨¿ºGß>
+xÚ•QÉn1 ½ç+|ÌH³: ǪµêÂÜ€K@H0ÐUËß7™Ì´êrhO¶“ççg?à0$—%¹xŽyDå,g¬— ”+˜P,z2~zSÂn*M|0éý1TwŬE>rHLJY¦"ÏýSÎU‹ú2‰i«;ÌÓKuÚîCœd½Ý.êy]ô§çü’&×ëù2$r]’g"b+ñ!Ø9椆åžLfVñoœ)ïàµAîAÅŒN²v0&„·GèâNc#å»s"“uZR"g^ëˆd›]‡¡
+õüVy·C•ã ÞædŽ9‘ØF.tÎö¥ék›«u!9=ÔŸ'jÍIå7sy«\R$¬`R‰_ÍùÔm"FþÑœE’ÑæW‡BqúvÞ4€P5~u޾½rW“
endstream
endobj
-744 0 obj <<
+953 0 obj <<
/Type /Page
-/Contents 745 0 R
-/Resources 743 0 R
+/Contents 954 0 R
+/Resources 952 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 684 0 R
+/Parent 951 0 R
>> endobj
-746 0 obj <<
-/D [744 0 R /XYZ 70.866 789.024 null]
+955 0 obj <<
+/D [953 0 R /XYZ 70.866 789.024 null]
>> endobj
-743 0 obj <<
-/Font << /F95 530 0 R /F99 531 0 R >>
+952 0 obj <<
+/Font << /F95 690 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-759 0 obj <<
-/Length 557
+971 0 obj <<
+/Length 651
/Filter /FlateDecode
>>
stream
-xÚí—MoÔ0†ïû+|tq=Ží8Ü(°¥HÔFâP8X›l74›DI(¿gÇ[X!²¨¥”\2N"¿cÍ“ù'—„““ßY&Ô°ÌÉì8ÍÇ S‰’.I̙њhÙŽI3rAŸ­lÓçm
-a¨>¤¯~B!XÄT8 •bÒx×u¶)sÜZey
+xÚí˜AoÓ0Çïý>&‡º~Ží8Ü(Ð2¤‰i â08˜&]ÃÒ$JÜÁøô8µ[¶©BKÇÆ¹ä9Žül½_þÏÏ&è4­Å”·ÍÖLãx0š
endstream
endobj
-758 0 obj <<
+970 0 obj <<
/Type /Page
-/Contents 759 0 R
-/Resources 757 0 R
+/Contents 971 0 R
+/Resources 969 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 761 0 R
-/Annots [ 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R ]
+/Parent 951 0 R
+/Annots [ 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R ]
>> endobj
-747 0 obj <<
+956 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [513.443 514.707 525.406 523.088]
+/Rect [513.443 514.523 525.406 523.088]
/Subtype /Link
-/A << /S /GoTo /D (section.4.1) >>
+/A << /S /GoTo /D (section.5.1) >>
>> endobj
-748 0 obj <<
+957 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [513.443 502.568 525.406 511.132]
/Subtype /Link
-/A << /S /GoTo /D (section.4.2) >>
+/A << /S /GoTo /D (section.5.2) >>
>> endobj
-749 0 obj <<
+958 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [513.443 490.612 525.406 499.177]
+/Rect [513.443 490.796 525.406 499.177]
/Subtype /Link
-/A << /S /GoTo /D (section.4.3) >>
+/A << /S /GoTo /D (section.5.3) >>
>> endobj
-750 0 obj <<
+959 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [513.443 478.841 525.406 487.222]
+/Rect [513.443 478.657 525.406 487.222]
/Subtype /Link
-/A << /S /GoTo /D (section.4.4) >>
+/A << /S /GoTo /D (section.5.4) >>
>> endobj
-751 0 obj <<
+960 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [513.443 466.886 525.406 475.267]
/Subtype /Link
-/A << /S /GoTo /D (section.4.5) >>
+/A << /S /GoTo /D (section.5.5) >>
>> endobj
-752 0 obj <<
+961 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [513.443 454.931 525.406 463.312]
+/Rect [513.443 454.747 525.406 463.312]
/Subtype /Link
-/A << /S /GoTo /D (section.4.6) >>
+/A << /S /GoTo /D (section.5.6) >>
>> endobj
-753 0 obj <<
+962 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [513.443 442.792 525.406 451.357]
+/Rect [513.443 442.976 525.406 451.357]
/Subtype /Link
-/A << /S /GoTo /D (section.4.7) >>
+/A << /S /GoTo /D (section.5.7) >>
>> endobj
-754 0 obj <<
+963 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [513.443 430.837 525.406 439.401]
/Subtype /Link
-/A << /S /GoTo /D (section.4.8) >>
+/A << /S /GoTo /D (section.5.8) >>
>> endobj
-755 0 obj <<
+964 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [513.443 418.881 525.406 427.446]
/Subtype /Link
-/A << /S /GoTo /D (section.4.9) >>
+/A << /S /GoTo /D (section.5.9) >>
>> endobj
-756 0 obj <<
+965 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [513.443 406.926 525.406 415.491]
+/Rect [513.443 407.11 525.406 415.491]
/Subtype /Link
-/A << /S /GoTo /D (section.4.10) >>
+/A << /S /GoTo /D (section.5.10) >>
>> endobj
-760 0 obj <<
-/D [758 0 R /XYZ 70.866 789.024 null]
+966 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [513.443 395.155 525.406 403.536]
+/Subtype /Link
+/A << /S /GoTo /D (section.5.11) >>
+>> endobj
+967 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [513.443 383.016 525.406 391.581]
+/Subtype /Link
+/A << /S /GoTo /D (section.5.12) >>
+>> endobj
+968 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [513.443 371.061 525.406 379.625]
+/Subtype /Link
+/A << /S /GoTo /D (section.5.13) >>
+>> endobj
+972 0 obj <<
+/D [970 0 R /XYZ 70.866 789.024 null]
>> endobj
54 0 obj <<
-/D [758 0 R /XYZ 70.866 771.024 null]
+/D [970 0 R /XYZ 70.866 771.024 null]
>> endobj
58 0 obj <<
-/D [758 0 R /XYZ 70.866 585.116 null]
+/D [970 0 R /XYZ 70.866 585.116 null]
>> endobj
-757 0 obj <<
-/Font << /F107 565 0 R /F46 525 0 R >>
+969 0 obj <<
+/Font << /F107 725 0 R /F46 685 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-764 0 obj <<
-/Length 299
+975 0 obj <<
+/Length 300
/Filter /FlateDecode
>>
stream
-xÚ•QËnÂ0¼û+ö˜ê®ß6ÇŠ‚ŠŠú 7à
+xÚ•QËnÂ0¼û+ö˜ê®ß6ǪõAnÀƒ"åA#PáïëÄI…ÔSO;^Ç3»@˜‘‡ŒÜOKÖ²=¤Vk0ŽSÍ Ëa•Øt“ÍA8M…•áYß\4ù¹ôé76y®sŸ2•\:"yÊÈa‡À~嬥–Kø¬Èjƒ‡»9 ÎÂwϬ@*A•—°$ï‹cý£©LüâVSn´ìÂrÔI˜TÅ>ØÌ׾ݞ|³5u¬Ó¶ˆ`ép=Td2"¦'\M¤‰§}Ê1iÚqD'_®¹Þ¼}½xëÆ¹àÈa;GÌ0ʧ¼FëÖ·
+>r>Îõ©¨†U¼»vþd˜\cg×Ùðc“
+L.×COðu¿¯qÀao?áy×
endstream
endobj
-763 0 obj <<
+974 0 obj <<
/Type /Page
-/Contents 764 0 R
-/Resources 762 0 R
+/Contents 975 0 R
+/Resources 973 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 761 0 R
+/Parent 951 0 R
>> endobj
-765 0 obj <<
-/D [763 0 R /XYZ 70.866 789.024 null]
+976 0 obj <<
+/D [974 0 R /XYZ 70.866 789.024 null]
>> endobj
-762 0 obj <<
-/Font << /F95 530 0 R /F99 531 0 R >>
+973 0 obj <<
+/Font << /F95 690 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-770 0 obj <<
-/Length 310
+985 0 obj <<
+/Length 519
/Filter /FlateDecode
>>
stream
-xÚå‘=OÃ0†÷üЉ¸wþŠÃ¢Ä„²U !qh$ªÆü|bÙ-”‘‰é}ï,?÷…ð« Ê…6È*»ª³Å’°²\W† î¡Dnc‘›R@ÝÁš]oš­w»¼Â2™?Õ÷ß@‘"—hE  Zse€×fšâ÷»±s9û8ƒ9ßejQðŠH'¸‘\iá’S^"—y&+$æb© X^#CX®("nÝÎÍÿJËšƒñ›dÚ
+xÚí–M‹Û0@ïù:ÊPÏjôe¹”º4ÛöTŠoÛ²x56õ:Æv ù÷•VJÁ‹›¥„,”æ$E½4ÏBŒl#7 v+?õÃÍâ]±¸Z"ËP¹FR|'£5цÎ8)Öä–^We7Ú>I97T$ߊOO@Â9f¸§0’*ÒDÀ‡ÚöeŸ ¢«$£U½*›
endstream
endobj
-769 0 obj <<
+984 0 obj <<
/Type /Page
-/Contents 770 0 R
-/Resources 768 0 R
+/Contents 985 0 R
+/Resources 983 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 761 0 R
-/Annots [ 766 0 R 767 0 R ]
+/Parent 951 0 R
+/Annots [ 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R ]
>> endobj
-766 0 obj <<
+977 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [84.043 514.604 105.474 523.088]
+/Rect [513.443 514.523 525.406 523.088]
/Subtype /Link
-/A << /S /GoTo /D (structident) >>
+/A << /S /GoTo /D (section.6.1) >>
>> endobj
-767 0 obj <<
+978 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [513.443 514.707 525.406 523.088]
+/Rect [513.443 502.568 525.406 511.132]
/Subtype /Link
-/A << /S /GoTo /D (section.5.1) >>
+/A << /S /GoTo /D (section.6.2) >>
>> endobj
-771 0 obj <<
-/D [769 0 R /XYZ 70.866 789.024 null]
+979 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [513.443 490.612 525.406 499.177]
+/Subtype /Link
+/A << /S /GoTo /D (section.6.2) >>
+>> endobj
+980 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [513.443 478.657 525.406 487.222]
+/Subtype /Link
+/A << /S /GoTo /D (section.6.2) >>
+>> endobj
+981 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [513.443 466.702 525.406 475.267]
+/Subtype /Link
+/A << /S /GoTo /D (section.6.2) >>
+>> endobj
+982 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [513.443 454.747 525.406 463.312]
+/Subtype /Link
+/A << /S /GoTo /D (section.6.3) >>
+>> endobj
+986 0 obj <<
+/D [984 0 R /XYZ 70.866 789.024 null]
>> endobj
62 0 obj <<
-/D [769 0 R /XYZ 70.866 771.024 null]
+/D [984 0 R /XYZ 70.866 771.024 null]
>> endobj
66 0 obj <<
-/D [769 0 R /XYZ 70.866 584.926 null]
+/D [984 0 R /XYZ 70.866 585.116 null]
>> endobj
-768 0 obj <<
-/Font << /F107 565 0 R /F46 525 0 R >>
+983 0 obj <<
+/Font << /F107 725 0 R /F46 685 0 R /F11 878 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-774 0 obj <<
-/Length 300
+989 0 obj <<
+/Length 310
/Filter /FlateDecode
>>
stream
-xÚ•QËnÂ0¼û+ö˜ê®ß6Ç–‚ŠZõ•p
-gá«gÖ • JŠ€+x#/‹©þÑT&HþG1…Õ”-»°\#u!’TTÅ>×Ô7¾]|³šX'í>‚±ßDÀD¬b|„n¤†Ó6ç˜Ú4¢“¯\éx|z÷Íãs7®àÈGÎÛ9b†Q.XòQ ¬ß¾UàðÄyýlNûÚGá‡ýº]…?f—ØYw6<>ä³óe×|Óï+ 8ìídÙy`
+xÚ•QMSÂ0½çWì±=7ß GGAz@v
+vp„oÒ´Ž3ž<í&yûòÞ[„ ŒÉmAnFN¥NkÅ R«5Ç©fP”0ÏæËbÂhjP„¹öö¡òͪÉ9f›œaö^mVû|ÀÍëÒçLe—8Fî òAX˜B`?ìÖRË%ld¾D(ÃÛ
+gá«E@*A•Œ¿íaFÞvŠûú‡S™@ùÆÞ»¦Üh½sÔITÆÖæØ×ÁçÙ—ÉÛ±NuÔT©™ùSj¸î*2™:¦‡\ ¥I§mŒêØôý~ÁU7óròõókŒ+(rA‘3ÂFEÌ0Êë3_ Šõ[·
+Þc¦Ÿõ¹:øDüT­ã’aA×t³Ž2ºþî˜ Ì.×] ðu»¯>à°·o*u}·
endstream
endobj
-773 0 obj <<
+988 0 obj <<
/Type /Page
-/Contents 774 0 R
-/Resources 772 0 R
+/Contents 989 0 R
+/Resources 987 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 761 0 R
+/Parent 951 0 R
>> endobj
-775 0 obj <<
-/D [773 0 R /XYZ 70.866 789.024 null]
+990 0 obj <<
+/D [988 0 R /XYZ 70.866 789.024 null]
>> endobj
-772 0 obj <<
-/Font << /F95 530 0 R /F99 531 0 R >>
+987 0 obj <<
+/Font << /F95 690 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-778 0 obj <<
+999 0 obj <<
+/Length 482
+/Filter /FlateDecode
+>>
+stream
+xÚí•ÁnÔ0†ïy
+©qgìØqâ@Õ]@Êm‹ª4ñv£¶ÙUœ<>6ãM»m…'ÏxÇ_ÿÿÌ»fÀ– V.TòLÞÖÉé¡dh¸ª4²zÍJàFk¦ p]
+Vwl•žmšÝdÇ,¤Eö¥þð
+ŸîÛéþö~è·ƒ‹˜¡£ üÅ­3 iÓÚøã×~ÚPtE Þ®)ï¬kãÖn
+´W³oø¹C6†$Ÿ— C ¥d9–\‹‚¾ªïì0¿¶Ê5BÊ3¯Žž-êgÿ,šx¤Ø*Ç¢‚Tá?)µ·."¯”"•oîv—
+endstream
+endobj
+998 0 obj <<
+/Type /Page
+/Contents 999 0 R
+/Resources 997 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1001 0 R
+/Annots [ 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R ]
+>> endobj
+991 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [84.043 514.523 105.474 523.088]
+/Subtype /Link
+/A << /S /GoTo /D (structident) >>
+>> endobj
+992 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [513.443 514.523 525.406 523.088]
+/Subtype /Link
+/A << /S /GoTo /D (section.6.1) >>
+>> endobj
+993 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [84.043 500.756 148.859 511.339]
+/Subtype /Link
+/A << /S /GoTo /D (classkmp__flag) >>
+>> endobj
+994 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [513.443 502.568 525.406 511.132]
+/Subtype /Link
+/A << /S /GoTo /D (section.6.2) >>
+>> endobj
+995 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [84.043 488.801 138.865 499.383]
+/Subtype /Link
+/A << /S /GoTo /D (classstats__flags__e) >>
+>> endobj
+996 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [513.443 478.657 525.406 487.222]
+/Subtype /Link
+/A << /S /GoTo /D (section.6.3) >>
+>> endobj
+1000 0 obj <<
+/D [998 0 R /XYZ 70.866 789.024 null]
+>> endobj
+70 0 obj <<
+/D [998 0 R /XYZ 70.866 771.024 null]
+>> endobj
+74 0 obj <<
+/D [998 0 R /XYZ 70.866 584.926 null]
+>> endobj
+997 0 obj <<
+/Font << /F107 725 0 R /F46 685 0 R /F11 878 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1006 0 obj <<
+/Length 301
+/Filter /FlateDecode
+>>
+stream
+xÚ•QËnÂ0¼û+ö˜ê®ß6Ç>@E­ú 7à
+LΗ}OðU¿¯qÀao߈gyˆ
+endstream
+endobj
+1005 0 obj <<
+/Type /Page
+/Contents 1006 0 R
+/Resources 1004 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1001 0 R
+>> endobj
+1007 0 obj <<
+/D [1005 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1004 0 obj <<
+/Font << /F95 690 0 R /F99 691 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1010 0 obj <<
/Length 1918
/Filter /FlateDecode
>>
stream
-xÚµZ[›F}÷¯@ê‹­Ô“¹ÂLÓVj›&m¤ªj»oI´b »‹‚kã\þ}¿¹a0†,—¾,f˜9g¾óù`qðààõû#¢Bÿԇ׋ŸoÏ_D"¡BÜÜF2 ƒPbF4¸I‚·Ë_ã}™VkJå’¯Þß¼¹
-Öõ©ºyR¤Ž!dˆ f8"«5Á/*‹m¶±\îÓƒá9Z¢>hŒ"ÐÀA3Œ8¦tþ2-ã,OJzܲý9‡ÿü‰T2‡G9
+xÚµZ[›F}÷¯@ê‹­Ô“¹ÂLÓVj›&m¤ªj»oI´b »‹‚kã\þ}¿¹a0†,—¾,f˜9g¾óù`qðààõû#¢Bÿԇ׋ŸoÏ_D"¡BÜÜF2 ƒPbF4¸I‚·Ë_ã}™VkJåR¬Þß¼¹
+Öõ©ºyR¤Ž!dˆ f"«5Á/*‹m¶±\îÓƒá9Z¢>hŒ"ÐÀA3Œ8¦tþ2-ã,OJzܲý9‡ÿü‰T2‡G9
…²x7éQkÉåýi·±Ó3§ñÁµŸŽ†B÷X1¼,ö$ÛîóTk—ílKùèFlãÝŠˆå{–d÷f`z€Î¶éãŠ
- €8Ä2KË,uœÅ½ãö²é6mEðÒI#ŽOB"R^²Z3‰—›b»UúŒ,³£mK{žgwúÇËò‹½R®ç.Ïv©ïmùõï ~Ó·|´xت¤›vqy²ýòÜ!Oû}áÈ´„ºÛÝŠâ¥göS.ãÃCê&6Y™n
+ €8Ä2KË,uœÅ½ãö²é6mEðÒI#ŽOB"R^²Z3‰—›b»UúŒ,³£mK{žgwúÇËò‹½R®ç.Ïv©ïmùõï ~Ó·|´xت¤›vqy²ýòÜ!Oû}áÈ´„ºÛÝŠâ¥göS.ãÃCê&6Y™n
½§zùm.ô4K#5ÞEào×!¬ƒ lUìšaþúðƒ=àny Tá6Z4,Ì/‚ÉÚÙ}³?ÄÛØ¢€·ì§\sÎO€&!ŠXTÇ?>{ö¢oÁ®ý!!Ý Ó±½êtS^åèXÚåu2kú;Í`Ó 
û*qeÂ\¶HwâËwXàWZé—(øíµTH
%^úTÜÞ~Øî7·Öc·÷Ùç4á·q’\IáÂLÁܧ<i.×sùÖ1è#(u®äb¹½ðdÿ`
»«w6/&¡¦"AxÄ( ï;àv¥ë‘»x{YØ+’®›MºÛ‰Ÿ°/–6Œ¶ã“¸Œ]Ó—}Ô¹ä¢Ã#µî&+vÌÑkà†‚qÎwÈ263ÊÓómhñëÍâßÑÕ. ~¿ÂC
ó`³]¼}ƒ®½Ñ…@Éà“é¹ `¯€gð;þYüUÇ ‡"
îltÇkIgÇ÷+?’ùºò n«|·å‡3·¤×›¦¼†hËS)+Ç3Ú«û8ÞÝkÌv[Û­ú`Þ¶ê
-xÕ4é…„#›Eú P<Õñãx;„¯1Ýe·ìƒyÛ² ¸;O¼·R{i<ã¹B¡zºãÇ1w_ç¶Ê÷8~0s[zý Ž':žqDÄ<ŽgŠÜù;ŒY÷ ?Ž·Cøó}¼=5~0o[vxjPb¢ã)EDÍãx*P$]ôIqrï z¤ÇÝ!}ÝhßSm·µ‡¥&Zž`nËPª¦çÍS<Áö¨ßËI,#÷lŸ=<–îíÒ]Vú.fœÅÕ‘´q“îHZ}Ú&i0Ýά fng 0Ÿ¶ã *£Y²† ’¾^èw²¹yüÙ½%%uÅ"„ùWß_yj*nU½ "Å#ßïÇî< ³#Ï@!ÎÏÝ…q8q+ÍK9-Í2DŒÑ9ÒL$(BÔüinÙ (ª?ȧdz\¤×3ÝŒUgº» 'ng ›¸ #ŽX4Ë‚&pTáÿ· mul'Z‘'-éqv$ºªNtOéÎÜÎ4@hìšv¡~õA§¹EÄ„œïãD pÂ× PŠ»-õß=^˜- ÿUbb•¯®ò´/ãj{ ˆ˜¶±#œ!ŽgÙØx:SÒÕÓg=ùœ²JAÓ}z½.÷`Ò¶Ü
+xÕ4é…„#›Eú P<Õñãx;„¯1Ýe·ìƒyÛ² ¸;O¼·R{i<ã¹B¡zºãÇ1w_ç¶Ê÷8~0s[zý Ž':žqDÄ<ŽgŠÜù;ŒY÷ ?Ž·Cøó}¼=5~0o[vxjPb¢ã)EDÍãx*P$]ôIqrï z¤ÇÝ!}ÝhßSm·µ‡¥&Zž`nËPª¦çÍS<Áö¨ßËI,#÷lŸ=<–îíÒ]Vú.fœÅÕ‘´q“îHZ}Ú&i0Ýά fng 0Ÿ¶ã *£Y²† ’¾^èw²¹yüÙ½%%uÅ"„ùWß_yj*nU½ "Å#ßïÇî< ³#Ï@!ÎÏÝ…q8q+ÍK9-Í2DŒÑ9ÒL$(BÔüinÙ (ª?ȧdz\¤×3ÝŒUgº» 'ng ›¸ #ŽX4Ë‚&pTáÿ· mul'Z‘'-éqv$ºªNtOéÎÜÎ4@hìšv¡~õA§¹EÄ„œïãD pÂ× PŠ»-õß=^˜- ÿUbb•¯®ò´/ãj{ ˆ˜¶±#œ!ŽgÙØx:SÒÕÓg=ùœ²JAÓ}z½.÷`Ò¶Ü
endstream
endobj
-777 0 obj <<
+1009 0 obj <<
/Type /Page
-/Contents 778 0 R
-/Resources 776 0 R
+/Contents 1010 0 R
+/Resources 1008 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 761 0 R
+/Parent 1001 0 R
>> endobj
-779 0 obj <<
-/D [777 0 R /XYZ 70.866 789.024 null]
+1011 0 obj <<
+/D [1009 0 R /XYZ 70.866 789.024 null]
>> endobj
-70 0 obj <<
-/D [777 0 R /XYZ 70.866 771.024 null]
+78 0 obj <<
+/D [1009 0 R /XYZ 70.866 771.024 null]
>> endobj
-731 0 obj <<
-/D [777 0 R /XYZ 70.866 585.116 null]
+938 0 obj <<
+/D [1009 0 R /XYZ 70.866 585.116 null]
>> endobj
-74 0 obj <<
-/D [777 0 R /XYZ 70.866 585.116 null]
+82 0 obj <<
+/D [1009 0 R /XYZ 70.866 585.116 null]
>> endobj
-78 0 obj <<
-/D [777 0 R /XYZ 70.866 548.234 null]
+86 0 obj <<
+/D [1009 0 R /XYZ 70.866 548.234 null]
>> endobj
-776 0 obj <<
-/Font << /F107 565 0 R /F46 525 0 R /F160 682 0 R /F95 530 0 R /F11 689 0 R /F99 531 0 R >>
+1008 0 obj <<
+/Font << /F107 725 0 R /F46 685 0 R /F162 890 0 R /F95 690 0 R /F11 878 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-785 0 obj <<
-/Length 2710
+1017 0 obj <<
+/Length 2709
/Filter /FlateDecode
>>
stream
-xÚÅ[m“›Èþ¾¿‚OWlÊšÌ;ÃÅ媤îìòÕ]Åçl*•²/[¬„Vœ%Ðòîæ×_Ï bArlÐ0t÷<Ý3ÝÏ ‹½{{ï®þvsõç·¡ð
-¥dÞÍÚ 0RRzAH‘$ÞÍÊûäzýËÍqÂà=ÓúS¶:lãë ”ÿ]¶<ìâ´ŒÊ$Kuç«ïo®~»"Ð{¤–©R”{ËÝÕ§_°·‚g?x±Py¦çÎã‚!ÁµŽ­÷«Ÿ¯°³³+K_ÇÉjÈ Ká"„«’½
+xÚÅZmÛÆþ~¿‚Ÿ^am÷ËÔ0Ð"±á Aç‚¢°ÓO¢NŒ%R!)ß]}g_H‘"Å;ŠlóÁÖÞr93ûÌìÎ<»ÄÞ½‡½wW»¹úóÛPx
+…R2ïfí))½ ¤Hïfå}ò ¿þõæ Ž8aðžéý1[¶ñõ‚Êÿ.[vqZFe’¥zðÕ÷7W¿_‹=RËT
+)ʽåîêÓ¯Ø[Á³<ŒX¨¼3rçqÁàZÇÖûùê§+ìììÊÒ¿ãd5d„¥ð¯’£
…p" \\6á
-åÔ $ÀÝ 2ßt a€$S³¨d˜!ED[g”®îºj划 ´vñà;NÛˆ@
-B;ò_оLc?Ú •Y>°œŒÖÙD`<1¾Aåê°ÄÀ€&ØD!.\ºûÏ
+åÔ $Àà 2ßt a€$S³¨d˜!ED[g”®îºj划 ´vñà;NÛˆ@
+B;óßоLc?Ú •Y>°ŒÖÙD`<1¾Aåê°ÄÀ€&ØD!.\ºû÷
ûh
-^*£{{ͰÉQ”~š¥‹e¶³«†ÞÖøzM…¯w;˜ô³}œëf·£¸†œöJ¨“ÄÜK…2™Tû%·yüÕvk™&`Voª,£Ôm‹Ìj»‹]Ëj¯ìíúhªôËëǺÙšUß–±èzÁ Ok¨î}é¯éҎȵG¥½[Fûò
-+Ö bc„½U¤/ï4‰ÅG€¬‹Ð(Y,‘äÄ[
-‰ IL­Ž¯Y²jéð>-$Æþíí—Ý~yk»} #ŽÊ§}üæöµŽqßoôàÝ»zÍÐV˜›µ”d§åmÙV@ äaˆȤŽþÉD;‡š†{ædÓxýÊÅÜK†\©M˾1Ý—É
-f‹¾½ù÷‡ïÒ%öX£ƒj®Ñ¼ÝÍ—Í]¾)ìvÕ_Ú¾ê™$GG/8(eæVnÓåÃ5å~”G»¸Ô!Nü¢ßý½*NŸöm
-óŒ>CM!bBÑ—Hça“1BEìèݲ€70$DoÛy\AM&ë9\
-ÅyÖ6xÐ
-“HÕÒïZ$âÔýYbÕ ÄóhWtcD<û×sñ<^ÆÙÃUŠ!ÊH‹O‡ PúE\º–µ½šÓËÇe¼¯6t2¡ê³H,p—TO6qï™+XÔ®Yf»ý6®Ž›ßµšS­ºßë>QACÐz›Ee˜uJÕ‡—oz€è¢>֬ЎãA³ÏãPL[“Ã7†šf©ù…ðe˜ø.ží†
-Öà˜‘{ \
-®,ãôhÏ–$H¨°½æ$Ëh Fpê+»…§¿W°Ÿ¦ÀPáJü]¶Jô7#ޤ›g§û­fP`ê¿OÝK°ú%O¶û2*âÂ>¨$¼ÿëBǾnŠòåü¿´»»ú!Œ¼ˆ]ÿ­8§åÎuJÒm’êÏlôÓ"I—íå®o×GHÑÑŸ.A K˜’ÛOa0
-!uq…ƒ‹ÄwzÛ3*cÇ~«IÞæ‰ûó¬Ø}hB˜½R\Ýú-¿¬ún…:xáÇ{HÛÏTHûó$Ê+3B–2rüD¤Šñ–Ý0q­ú|<¤e²sUÙÉ]éªÉ]#©|—™Löto:Äé)Æ¿IpPÖ
+^*£{{ͰÉQ”~š¥‹e¶³»†>ÖøzM…¯O;˜ô³}œëæ´£¸†œöJϨ“¤ÜK…2™Tç%·yüÕk™&`Vª,£Ôm‹Ìj»‹]Ïj¯ls}4UúåÆ ÈcÝm Í‹jlËXt½`0¦5U÷¾ôׇtigäú£Ò¶–Ѿ<€t}\!
+eë¸IZ³­Œ@ Åa[¾²Ô½Åaýcú؇’ NÕ -÷e?H× %…k±1B„>*Ò?ï4‰ÅG€¬‹Ð(Y,‘äÄ[
+×'¶dma‡j&ÐþŒ~HÊMvpïF}°3M*Âàwµ‹OæÌ R¼†„“Bõ/ÒNÔðcDàÿ\;£ÝõÑ8¬(boüÂ`©B¢„0CS«ãk–¬Z:¼O ‰±{ûe·_ÞZàn_ÃŒ£òi¿¹}­cÜÄ÷=y÷®Þ3´¦ñ±–’¬â´¼-Û
+(< Q™Ô‘À?™hçPÓp¯Ñ¬`¯_¹˜{É”+µiÙ7§û2YÁjÑÍ›}øÞ( aSba5
+1¨æÝÛMÑ|Ù´òMaÚUiûªg‘½`࢔Y#X¹C—×”ûQíâR‡8ñ‹~÷÷ª8}Úw(ÌC0ú 5…ˆ E_"C†MÆ<±£OËÞÀ}lçq5™¬Cæp-
+&:j6B¸Ð^ãõ6;à×ËÔöûµ©uhõÖ>߯k—åë:/r÷hc»®TÓÜ=I†s7×”|ª»‰>
+as-ìù ³/SÚïì£ÎcùlNÈ’ûÍ(§Ž6ªëÁŸ»nzΩãe´«ë˜µ•6ˆǰMUew«V=)ô@!EU­®_RÔ/Ü;}¥=­•™?š þ<-Êm¯­ÉI£À§úœ_šFƒdófêžTý5‡bþÃ&YnlâÔÆPÜÛ V‘C,í‹¶§ä.v–Å­qÇùÒj4Ø›ÍmÚŒ®"!ÑZo?BŸ&@eÈ 4ûOn'оè¿âr³Z%¨*Eù½ù> ½‹­b»± }Fæ$Ô󭸤ËaEÕWc¦©_eP’÷± ˆU¢4ˆG”úŠÚS¶‚Û<åXs¿„™hf{);aÀ&X`A?=ùcØI?9ä&s·`@×eÞ"
+7Œ¹$\‚ÿ¹¦á/àß„ž#àDÁê ùJÀaZv:ŒÕð>toŠhñqO‡¢A“PŸêƒLG =s+©š·’Ù¡œ^^ÿÌe¿bH* “
+]œ´Ü€*wþæIuûÿê˜æÙë(–­=ë·Ó?ØÅßúúr#Ä+XC‚cFîÙ$pðdc`Q‚™Q¾²
+ÒL'©ý‡ð‹Ã~¯O´8öËÂ>¯áñÉÇ)æ¹;̃V‘€KŸìÈ8-ìÉfc„¨v#ÞÞ„Û¸ïH´Ì±<yp\YÆéÑž… ,IPa{ÏI–ÑŒ àÔWöO¯`?M©Â/ñwÙ*Ñߌ8’nžž·š@©ÿ>u/Áî–<Ùá˨ˆ û ’ðþ¯ ûº+Ê—ðÿÒžîê‡0ó"vãO@´âœ–;7(I·Iª?³ÑO‹$]¶·»¾S EGº1,auJn?…Á(„ÔÅ.ßécϨŒû­>$y›'¶ñs¼· *Ý/&ܶˆü–ŠoyP}·B¼ðÇ{HÛÏT¸wN¢ü¸3(d)#ÇODªoÙ ‡ÑjÌÇCZ&;W•ý=¹Ë#Cu"¹k$•ï2“ÉžîÍ€8=Åø¿{Q
endstream
endobj
-784 0 obj <<
+1016 0 obj <<
/Type /Page
-/Contents 785 0 R
-/Resources 783 0 R
+/Contents 1017 0 R
+/Resources 1015 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 761 0 R
-/Annots [ 780 0 R 781 0 R 782 0 R ]
+/Parent 1001 0 R
+/Annots [ 1012 0 R 1013 0 R 1014 0 R ]
>> endobj
-780 0 obj <<
+1012 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [249.795 529.114 281.078 536.64]
/Subtype /Link
/A << /S /GoTo /D (structident) >>
>> endobj
-781 0 obj <<
+1013 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [266.532 345.072 297.815 352.598]
/Subtype /Link
/A << /S /GoTo /D (structident) >>
>> endobj
-782 0 obj <<
+1014 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [224.689 151.522 255.972 159.048]
/Subtype /Link
/A << /S /GoTo /D (structident) >>
>> endobj
-786 0 obj <<
-/D [784 0 R /XYZ 70.866 789.024 null]
+1018 0 obj <<
+/D [1016 0 R /XYZ 70.866 789.024 null]
>> endobj
-787 0 obj <<
-/D [784 0 R /XYZ 70.866 570.145 null]
+1019 0 obj <<
+/D [1016 0 R /XYZ 70.866 570.145 null]
>> endobj
-788 0 obj <<
-/D [784 0 R /XYZ 70.866 503.984 null]
+1020 0 obj <<
+/D [1016 0 R /XYZ 70.866 503.984 null]
>> endobj
-790 0 obj <<
-/D [784 0 R /XYZ 70.866 398.447 null]
+1022 0 obj <<
+/D [1016 0 R /XYZ 70.866 398.447 null]
>> endobj
-791 0 obj <<
-/D [784 0 R /XYZ 70.866 311.972 null]
+1023 0 obj <<
+/D [1016 0 R /XYZ 70.866 311.972 null]
>> endobj
-792 0 obj <<
-/D [784 0 R /XYZ 70.866 98.181 null]
+1024 0 obj <<
+/D [1016 0 R /XYZ 70.866 98.181 null]
>> endobj
-783 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F11 689 0 R /F99 531 0 R /F160 682 0 R /F107 565 0 R /F174 789 0 R >>
+1015 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F11 878 0 R /F99 691 0 R /F162 890 0 R /F107 725 0 R /F174 1021 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-797 0 obj <<
-/Length 1149
+1029 0 obj <<
+/Length 1152
/Filter /FlateDecode
>>
stream
-xÚåX[£6~çWøªÄk0°­*µêΨ«VÝÝæ¥šYEœ„–@Ö˜ÉLýÚØ’fZû¹/Á9þ|üùÜ|A`¸÷~\yo0£4«-HL)IF Å`U‚?‚8X’$õí¡*tû·#㹨ڦ >¯Þƒ(
-aœ„Ré0‡Jê½[y_<,…àIsšÂ”D 8xŸ(eß{€`˜¥à4  Š¥²H)«ÁïÞGÍÙFô[Š!éŠ= –!ŠüœûJ°Bô|Äþ®Ïy€‘Ÿ7‚±N£Ä>º·i„IÔÇ~ÕìtO[=7ø¶Ñ²¼®v +pó§œÇ ò¢`]§»bÿT‰½‘kA'ÕÖ†âZ®šþ‹™Išu`¨Lkto #°Äfq¬WÙµD«¿4ÒßM¥h¨VÕèoWýÈÅ0õ'U ¤Ä¨Z)ƒ)äŽ5föZ ¶d¦’Ø?h‘d£çq–—¦kÎ}$1„ÇäÁñûæS(Ì’0U~”ŒHÃÈúãû`Iò×ë¿Çb·þN¼Ù÷k^êÎG#£]Åß™@ûtï‡Q•¬kqA`Bœ¦Ò3ßè –òÌÄU¹æl»Ðã¡¤Š 4‚Xþªé®D³‰›«Iµx'ªr¡ÉkT“f’0»Á&…!Íæl궘Ž¿U˜«l—’ª/ Õ£î&νv2.Øë¾›À7Âà¿Úé5ï›u>µUyËz7ƒA-ä ûn>xhñ}w Þ@h§y †G À&qF/"&Œ`ŠR1}­òŸ¤~]uB·†´—ßmßSÕŸ¥óE*FÆÙX_*Qµ¬ÝeÝÿ,>ºôÍ‹M˜PÝÈg;Ð™Š ä…éïæ[×­ê;uSé»i â!)ŽGCÈt:¨¥+-CU\“›Cê+ÎØw3ãfÍùØx
+xÚåX[£6~çWøªÄk0°­*µêΨ«­ºÝÍK5³Š8 -¬1“™þúÚØ’fZû¹/Á9þ|üùÜ|A`¸÷~\yo0£4«-HL)IF Å`U‚?†8X’$õí¡*tû×#㹨ڦ ¾¬Þƒ(
+aœ„Ré0ÇJê½[y_=,…àIsšÂ”D 8x_(eß{€`˜¥à4  Š¥²H)«Ágï7ÍÙFô[Š!éŠ= –!ŠüœûJ°Bô|Äþ®Ïy€‘Ÿ7‚±N£Ä>º·i„IÔÇ~ÕìtO[=7ø¶Ñ²¼®v +pó‡œÇ ò¢`]§»bÿT‰½‘kA'ÕÖ†âZ®šþ‹™Išu`¨Lkto #°Äfq¬WÙµD«¿4ÒßM¥h¨VÕèoWýÈÅ0õ'U ¤Ä¨Z)ƒ)äŽ5föZ ¶d¦’Ø?h‘d£çq–—¦kÎ}$1„ÇäÁñûæS(Ì’0U~”ŒHÃÈúýã»`Iò×ë?Çb·þN¼Ù÷k^êÎG#£]Åß™@ûtï‡Q•¬kqA`Bœ¦Ò3ßè –òÌÄU¹æl»Ðã¡¤Š 4‚Xþªé®D³‰›«Iµx'ªr¡ÉkT“f’0»Á&…!Íæl궘Ž¿U˜«l—’ª/ Õ£î&νv2.Øë¾›À7Âà¿Úé5ï›u>µUyËz7ƒA-ä ûn>xhñ}w Þ@h§y †G À&qF/"&Œ`ŠR1}­òŸ¤~]uB·†´—ßmßSÕŸ¥óE*FÆÙX_*Qµ¬ÝeÝÿ,>ºôÍ‹M˜PÝÈg;Ð™Š ä…éïæ[×­ê;uSé»i â!)ŽGCÈt:¨¥+-CU\“›Cê+ÎØw3ãfÍùØx
dj1Þ“ï ÚÎx˜—ñîÒ>S‰þáY˜Ý oLmNÍî¹ÕfÆoZµ7i z3»Ô7s±Ê°Ó™–Þ7Uë `E_Åt*ø&š/S{[=³¯ó²·«Düwäº8
-ôöh nÊÔ…FSÖPÍeõd¼Ö‹ÿ.ë ËÛºÍEê2àè
-ÿ¥ÚðáµjxA:ñ ÷VÝž_v€5×&þ
-‰ÍÀ‘
+ôöh nÊÔ…FSÖPÍeõd¼Ö‹ÿ.ë ËÛºÍEê2àè
endstream
endobj
-796 0 obj <<
+1028 0 obj <<
/Type /Page
-/Contents 797 0 R
-/Resources 795 0 R
+/Contents 1029 0 R
+/Resources 1027 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 801 0 R
-/Annots [ 793 0 R 794 0 R ]
+/Parent 1001 0 R
+/Annots [ 1025 0 R 1026 0 R ]
>> endobj
-793 0 obj <<
+1025 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [199.583 706.07 230.866 713.597]
/Subtype /Link
/A << /S /GoTo /D (structident) >>
>> endobj
-794 0 obj <<
+1026 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [199.583 655.404 230.866 662.93]
/Subtype /Link
/A << /S /GoTo /D (structident) >>
>> endobj
-798 0 obj <<
-/D [796 0 R /XYZ 70.866 789.024 null]
+1030 0 obj <<
+/D [1028 0 R /XYZ 70.866 789.024 null]
>> endobj
-799 0 obj <<
-/D [796 0 R /XYZ 70.866 615.524 null]
+1031 0 obj <<
+/D [1028 0 R /XYZ 70.866 615.524 null]
>> endobj
-800 0 obj <<
-/D [796 0 R /XYZ 70.866 556.212 null]
+1032 0 obj <<
+/D [1028 0 R /XYZ 70.866 556.212 null]
>> endobj
-795 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F160 682 0 R /F107 565 0 R /F99 531 0 R >>
+1027 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F162 890 0 R /F107 725 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-804 0 obj <<
-/Length 663
+1035 0 obj <<
+/Length 664
/Filter /FlateDecode
>>
stream
xÚ•˜Ms›0†ïü
-íCT 9vÚdši¦ñ-É0p„CPíüû
-0ÆqÍî‰?Z^´¬õj{b‚];ŸWΧ«Èg!”òØjÃÁC¥X¹\I¶ÊØýBÂòquÃ<8HÏŽëïÞÖ™)óå…„‹/ujª\·I[Ôºƒ¯+çÅ‘–L¾Ç CºÀÒʹ,³¿Ý0Á½(d»ž¬ø÷¡{FÉîœ_Ž˜ê”J0Å£À §B•äbTǪm'm]i¼)öyæÆI–Åé¶íßA°‹ÀF˜¡7[,¬³5¥ÈÐY9Eå Kñ$-nGÇMN‰¿)ë¤ )¶¯%!dzr.;U²G¶$aº«BãIJ\SâIZ\Z²ûØdë£üÉ– ¼nÖx’·Ä“„¸M†_ŸK<Ip ‹OÎ Á×êësƒ'IÂâ?X7‚@›5ž¤èhÒ„Û!èâê`Â[î°qwØ4îk‰Ÿ8ƒ_ m14ÿ[ åÜlR m}3ø¢1´ª1ô²1¤ºÎ“áI´r8áõä9kö€föàƒÙ›A ‘±ß7>o {= z=8Q r†Æ‹Áš=ˆ)VÐ^H^Ð^H^Ð^Ny=9ƒ“²M0{ðÁìÍ „ Áz= y=@{= y=8òzç2‚5{05{ïûïSÛy?°»yÊf~l6(î
-º=¼«
+íCTI,rì´É4ÓL?â[’a°Á S„ Úù÷`g<ŽkvO|øÙåEËZ¯$ØìÚû¼ð>]Å‹x¬µÏk
+iÍÂXq-Ù"c÷3©ç‹æÀAú.n¸{[g¶Ìç*Œf_ê•­rÓ¥]Q›ö¾.¼O:V0ùž3Šx¤€­*ïþQ°ÌývÃ÷ãˆm²bø<€þ%»ó~yâP§ÔŠi‡~t(TK.öJ“äOÕ¬’´««b•¬‹mž©$ͲdÕtÃ;vº ôºÁÂ&[PŠ “•‡¨œ` ©³â/ž¤åíé¤Í)ù×ev% !Àx-ù <•sÕ©Ò-2±# Ã]ORòÚOÒòÒŠ=`‹mŽê''X‚ðº]âIRÞOò¶|}.ñ$AÀŽ>n>9‚ïÕ×çO’„·Ä°>‚@Û%ž¤èiÒ€»tsõ0á-7ؼl·5ÄœÅÏ…–6Úÿ͆r*[K›ß,¾i,­k,½m,©o ÷dx­Nx=yŽÆš= ™=ø`ö&PBfì÷ ¤ÏÈ^¨^N4ƒœ ñb°fŠU
endstream
endobj
-803 0 obj <<
+1034 0 obj <<
/Type /Page
-/Contents 804 0 R
-/Resources 802 0 R
+/Contents 1035 0 R
+/Resources 1033 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 801 0 R
+/Parent 1001 0 R
>> endobj
-805 0 obj <<
-/D [803 0 R /XYZ 70.866 789.024 null]
+1036 0 obj <<
+/D [1034 0 R /XYZ 70.866 789.024 null]
>> endobj
-802 0 obj <<
-/Font << /F95 530 0 R /F160 682 0 R /F99 531 0 R >>
+1033 0 obj <<
+/Font << /F95 690 0 R /F162 890 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-808 0 obj <<
-/Length 638
+1039 0 obj <<
+/Length 639
/Filter /FlateDecode
>>
stream
xÚ—As›0…ïü
-íCTI€¹¥“ÆÓL;mSnI†Á§LA8
-Äο¯@¶Çõ0d7'düéùyÙoy"Œ,¼Ï‰÷é&‰¢±”>IÖ$bTII¢XPÉI’“ûY@ùüBDjvÕ6u¹rë›ÂdmÙè—ùcrK‚À§aä[Ña û»Þ—Ä{ö¸½É?*+E•ȪöîÉí{·„Q?Vd;5 B+ôbùíýòØ©[.‘4Ž|ujWrÊ~Óôo½Y¥Ùà6]—»"Ò—?UºÚ´©)^ÃŒ\DVåÚÀÉÞ Ž>wÂßÙ‚0Þ-á$Ƹ£qNÒõ#¤·PÝ-´»Æ@bQxáº4/_(R×·ÚG#ÄÁ‡¦ÃšîǦC•fy'ÁÖ ,¸…u¾D :¯(BùìñæÓ(Nõt»ëªÉZ…Ù°AÀp/Å3‚DT¥ÎvÐr[#\j8‰Ñí*8‰ÓÅ5{Ø
-Ò˜
-N"t ô‡Ñ&,8‰0€Ízj,ëñIÜ€… ʸAÇügA³žBe=…Îz
-“õÔXÖ›ìÎ*¼…¶ñ,ìM“ðÂÁ³žÂe=…Ïz
-•õÔhÖãS<øÐàžêðÇæ¿¬ç1*Â~Âì/‹ã°96»†‘]1“ëa¾–TD28XƒJ{.
-ÝÏÒEî&ëF»ë)ÝâºØÏÜÜwWÁ+..Y|î_­ç‚Íì“:¼øªÛ¢z¡<ÎëúûÏþûZCñÉÍ#N…Ï“ûcþž:µZF˜»N·e]8áoåÒdö39›½¹;ËÞÆ~}ÝÌ}6Û½= @¡G
-n ýI=Ò
+íCTI€¹%ÓÆÓL;mß’ ƒ N™‚
+Äο¯@¶Çõ0d·'düéùyÙoy&Œ,¼ë¥÷é&‰¢±”>YnHĨ’’D± ’“eFf!åó ©ÙU[WÅÚ­4¹IÛ¢Ö¯ó§å- Ÿ†‘oE‡-<êïz_–Þ‹ÇíMFøQY)ªD@Ö•÷ðÄHfß»%Œú±"Û¬HZ± +ɽ÷Ëc§n¹DÒ8òÕ©]É);øM’?U³NÒÁm²)vy$¯¿ËdÝ´‰ÉßÃŒ\DVåƒÚÀÉÞ Ž>wÂ?Ø‚0Þ­à$Ƹ£qN’Mƒ€Ò[¨îÚÆ]m  ±(¼p]’o©Œë‰ÛmŠ£âàCÓáNM÷ǦC•¤Y'ÁÖ ,¸…u¶B :+(BùìñæÓ(Nõt»›²N[…ÙÐ `¸—üA"ªR¥;h¹-Š.4œÄèv%œÄéâš=l€6[Ãû§G8Õ–Ú@ϸ%©M 'ºúÃhœDÀf=5–õø$nÀÂeÜ cþ³ YO¡²žBg=…Ézj,ëMvg ÞBÛxö¦IxáàYOᲞÂg=…Êzj4ëñ)|hpaOuøcóOÖóa?aö—ÅqØ›]ÃÈŽ®˜Éõ0_K*"œ ¬AH¥½ ¹îgé<s“u­ÝõÆnqŸ7n!äþÊxàV\^Šð2ˆÜ«Í\°™}R‡_u›—"”Çy]ÿÙ_k(>™ yÄ©ðùardÌßS§¶Cˈs×鶨r'ü­X™Ô~&g³wwgÕÛØ¯?×sŸÍvïÏë‘‚ÛBÿK=ý
endstream
endobj
-807 0 obj <<
+1038 0 obj <<
/Type /Page
-/Contents 808 0 R
-/Resources 806 0 R
+/Contents 1039 0 R
+/Resources 1037 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 801 0 R
+/Parent 1041 0 R
>> endobj
-809 0 obj <<
-/D [807 0 R /XYZ 70.866 789.024 null]
+1040 0 obj <<
+/D [1038 0 R /XYZ 70.866 789.024 null]
>> endobj
-806 0 obj <<
-/Font << /F95 530 0 R /F160 682 0 R /F99 531 0 R >>
+1037 0 obj <<
+/Font << /F95 690 0 R /F162 890 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-812 0 obj <<
+1044 0 obj <<
/Length 854
/Filter /FlateDecode
>>
stream
-xÚ•Xßo›0~Ï_áGZ×gÀ˜>N[ªU«ö+“Ú*JéЂÉ´Ýþúù´IQß“møîüùŽûЙQžÂÌp5afªÇw³ÉÅ4Kˆ¤™™­Iʨ‚¤§È,'·ˆð~vM¢$¦1DÚÎ>½©ónS„ç<•ÁûzÕU…jmY+ž|˜M~O@cŸRRÉc²ª&·÷Œäúݵ&e’<YdEâ$¢IlöØï“¯vÀÚ²–ž +€²ï´S+Cd§Éq¬CH‚ºq‹;Æ¢ZÓTn½­KÕZÆCH.¦±ØÛ€‘sÓ4v®g?‹FŸ9b,X “Ç'AÑìÜŽƒà´#f÷6‹ý½ÍÚím§*tÕR»q.êµ{±+ÿú½»øÌŒ"ý¬ç¢r7Ñ©²ã2ä,øÓ;cLÃó@oŸ°YúE¡Qôz/ÇëvE¾wó2=³_…Ž
-0–O
+xÚ•X]o›0}çWø¤Öµ1¦Ó–jÕª}4“Ú*JéЂÉ4í~ýüm’EÔ÷É×pîõñ5÷ k‚Y‚1ÃU@Œ©ÇÓàb’%HâLˆMW(%X
+ÒŒaAÑ4Gw!•ÑÃôÅ ÇœÆÚÏ>½©ón]Dç,•áÇzÙU…jçmY+>Mƒ?ÕX‚èkL)±d-«àî \¿»Ö„âL¢EVˆ'1N¸Ycnƒï9`mÙR’ž +(&ßI§–†ÈV“c2\E4 ëÆMî ‰kMS=ºù¦.Uk)¹˜p±·
+0v&ž@‰·8¨wêz¸g&4úHÞBx@u wQ?NÇð¾ÿo…lP\ÝxŸ¼oy9(„1´ÀzÿMž(±ÑÃñýÍj¨o‘ ÿ"°"þe#`e#àe#@¿D ?ú'Òw°ò¾¿EEvÅûÚ>žº{HR,äæa¸˜¥‚›.” ‚3Î5 Ѻ*TÑÌ[Ó!›Ö¶Vnœ4¥3n‹3˜èGB¹³¨¸dÉ%OÝleúf{I¡'ŸU[¬ïYÒû|Ýêæ›Ù¢f”íõÅ4¥˜Åt¸‘1 |Úçh 0?:Õ–Uß–)Í\¯Im[ož -¾»Ô1—Ï/P¨ãÿãþ¡.
endstream
endobj
-811 0 obj <<
+1043 0 obj <<
/Type /Page
-/Contents 812 0 R
-/Resources 810 0 R
+/Contents 1044 0 R
+/Resources 1042 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 801 0 R
+/Parent 1041 0 R
>> endobj
-813 0 obj <<
-/D [811 0 R /XYZ 70.866 789.024 null]
+1045 0 obj <<
+/D [1043 0 R /XYZ 70.866 789.024 null]
>> endobj
-814 0 obj <<
-/D [811 0 R /XYZ 70.866 752 null]
+1046 0 obj <<
+/D [1043 0 R /XYZ 70.866 752 null]
>> endobj
-810 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F160 682 0 R /F99 531 0 R >>
+1042 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F162 890 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-817 0 obj <<
-/Length 1072
+1049 0 obj <<
+/Length 1075
/Filter /FlateDecode
>>
stream
-xÚ­XÙŽÛ6}÷WðQÆ wQA[ Û ¤hÒø-²-ϱ%W–gé×—›6`“@Ÿ¸èððòޣˀÀÝì—åìÝm„‰,· FP
-â„@Ár¾F âù‚Ä2ú¹©öÅÚÖÿ:äuÖUyœ[~
-Âã±×j²™f›ÍÄDt‹,Ž6ãe¥-+•ùæE&û¹.WfS&J 1ï2£]æ‹âŽa(Y‡ûaŠ*†1Ã-bSVÊao‰(79ÑÁ~šŠú{i7UUOzA&Ø™Ù÷ˆ£ïE¹ùQªž`– Ô57jRC &R¼QÐÙäÌ„ê÷™Ée<$ÊzÊe#8ÊR}¶ïM Ƥ’«¬E¡@d*¹²V‡—Òp´U2`¼çà ðMñäI¬a–˜×w¿1Úg3ŒðG«ó€?2l¡žG ‡Ÿ4.ÅÆã¤Ñ#ÃLö<™ŒÑÞö<–´è맇´‡’«@yþ‡áËPo_HïFé_ë_é_zë_ÉYzœðLÍø24À‚PuÊ uJouJ_ubä½X¨·3ÜWŸê¿Uôxo×¹!p_‘Zhˆ[joûf] ±!T¨nˆÏu°Ã{jUA}Å*üÅ*ÂÄ*üÅ*‚²i÷÷µÓª8×*¾‚ 1¾öö··XE˜XE¸X…¿øúÇw”žz8â1”$äÙ¨}ÜÄê&Ó¿1®.)šs——ú!K߇7¹Ûº°•ßr÷à…©- jk˜¼GÉ{îZ[}“7oªñGÙä»{ÂE÷XVþùÉÞ*’dpEÀ1V7±î^¡¯Þ54›+ i1ŸÊ¦Øç–øc±ªÍ£Š^m}Pp¶Wæ:ýú`
+xÚ­X[ã&~ϯàÑ‘&,`ÀxÕVêmF]mÕËämg9‰3cmb§Ž3—þúÇvÆJ@ê|Îù|¸ôˆº›ü4Ÿ|¸MR8•2Fó JVR¢$eXR4_£/‘Àt:c‰Š~lª]±‚úû¼Îš¢*Ó¯óOˆó‹$Ö¤vMMïä×ùäŸ ÕѳRX1ŽV»É—¯­õ·Oˆà8UèÅ"wˆ MÆ ÙÝOþš¾µT2$qšÄªo®¤˜´ö.ßvûÕ"³Ö.6Û*k¨\ìŽÛÅjßXk š%šâ¼^û"Çe
endstream
endobj
-816 0 obj <<
+1048 0 obj <<
/Type /Page
-/Contents 817 0 R
-/Resources 815 0 R
+/Contents 1049 0 R
+/Resources 1047 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 801 0 R
+/Parent 1041 0 R
>> endobj
-818 0 obj <<
-/D [816 0 R /XYZ 70.866 789.024 null]
+1050 0 obj <<
+/D [1048 0 R /XYZ 70.866 789.024 null]
>> endobj
-819 0 obj <<
-/D [816 0 R /XYZ 70.866 663.484 null]
+1051 0 obj <<
+/D [1048 0 R /XYZ 70.866 663.484 null]
>> endobj
-815 0 obj <<
-/Font << /F95 530 0 R /F160 682 0 R /F107 565 0 R /F46 525 0 R /F174 789 0 R /F11 689 0 R /F99 531 0 R >>
+1047 0 obj <<
+/Font << /F95 690 0 R /F162 890 0 R /F107 725 0 R /F46 685 0 R /F174 1021 0 R /F11 878 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-830 0 obj <<
-/Length 1376
+1058 0 obj <<
+/Length 963
/Filter /FlateDecode
>>
stream
-xÚ½˜YoÛFÇßõ)ô!PmöàÌ›%p5®ªâ@ ÅCD"UŠjã~úΤD‰d0y°IÓ³3ÿ]þvf–8xpðªw9é=ó@¡XL>#%D cŠ &ið!$ªÿqò:`<Ba0Î>éz®û*Ux]ÌÖ WI•¹1î '½¿{lq@ŸJ!E£`¶è}øˆƒþ÷:ÀˆÅ*ø×Z.‚ˆ3Ä#cüÑû½‡½NŒ(7·æâU,BQLßÖ-µðÑþ€`ŒÃËd•Í@+Uᤩðq©WVgÀ_Ÿ¿ŒÄÖj¤’Á€*X é¼ÞQÊ[cƒÎEXÓTr+²ªJÍÃõ¬ò¶f!Ê¿"c;ŠJf)¬ÛŽ”ƒ¦Ê™N«ƒºá×€0XKöm‘¿¤úcšëo©Rá›ÑíôæzøÛdzÓ'áèrו±Á_1i?¯5ÐŽ5¼1n¯Žˆ ?GĈx?yw{1>¢CÖÁ~€ŽÉ»ÑÍÕt<¼~5<¬†àŸ³*— æb<¾Ž§Ã¿nßC¾˜›Ñ11G^N+§ø„‚‘ä±0[Pï}Æ‘‚YgD|N¹ÖU’ÍuêÒʵ^ÍÊlÙ$À# ¦N#›©¬¿IŸP첑•W}N*w—”>·®W6„ýgY¬>ëªþÛ›øT“WÙB÷á2?¼?³:[Ž’YiüõÔìkÈìÜÜ“½|8Q» Ggoc6ë¹yÝ6¼ÖýJB" \póò[•ÊWÜ”‘¦`leö(FàÁxâB9=–¢A%ÈQ'Qe„bµÃ^Øí¼—b(¸*î".Å·ãúüaW{/cìp V Õ¿õ¯ŠÅ¶@é0|Ð9Ü&UÍsR [x ¥:…jè‚?‹åæþSŸá°ðn¾,–³©5¶ú“8ˆAµØÒˆ"FIÝ…
-³UÉÀÂÏ%:–ƽgq¬-ôºÔùìÔéÔî§Ó•v >K@¯ÉË:nOâs ?äW/3O[.Nþd¦ÙùL3(qÕÓÆáñILwÕ3Ý
-{階CF*ÒE`JL—´Û–Ëï$úüÁ óCíGápY$Ž“/#wyvŸ”ž]>sÏÒ¬ÔÉÿéS€É=Êò¦[ñi|V¤úéûJýÈ$,UàEt‘„')NKÂ]DõÀ¶Â~Ø×À¶ç;Ú
-r~?ðg_šR¶®›ÎV7y_ã`:Åäaµ{¨ªWs˜ª¿²¸§´ÔœîL÷zg€ygzžGìýªâŠîbYlØj‰…>ƦOæÉÜgålVU²ú²z2½<þ‘ôŠóé%pú‡~ôOŒŸ–L»ˆêém…}c>MÕøÒóñmð˜ VÕã|ýo‰ëR?ANÇÀë?ô—K¤è9ßpëoÌQ ¯Á”èaâÈ ¨Wá•éÜ7]{=—eæ?1kŒ$Ì])®ï}ãœÕŠn6Ô l¨ùåþL÷n©sÇ¥=UŒ’)÷b ¢ìÀ©²¥›ƒ ­mÆþ{‹uü6»/m-jú÷í^þº0›üëãƒ5Ðùîÿ~pê
+xÚ­V[£6~ϯð#HÅã;°«ì¬ºêªíl¤>̬FœàH·Óªÿ½ÇØ0„¤«ÙªO6Ç>·ï|ç`‚öˆ ÷«·›ÕÍm*Q‚S¥8ÚìPLp¢ŠS†E›ÝŒ„Ÿ7— ÊAo~lŠS¥ÃˆÅI°nòÓA×}Ö›¦¶—Wï6«ßVîD'›I‚&P~XÝ&¨€³ˆ`ž&èËpó€„äX
+ë£BŸV?¯ˆ“`&íÖ.>jJbDN)•ó¸Åd \bF”ürd¦¿¹Ó•Î:6K‚æ¨Û!änˆyræ×›[¡fÈP…ã$FK
+S_ªµî3Sé•h­»¼5ljWÿReXÉÔÙÛ”PaNTPhˆšÕÆyeP› pûÝ©ÎgG¥n½ž9+mm?eÐöª&¤2øb««»ÞËtÈIð{Èd +'êËVg…Óížë¼l›Úü™Í\5;·v§î¨ëÂÔ{Ýèp4`.†þƒ)Å©”.Ç,dÄF"ƒìiP·%0=%!àüÙ‰³Ö7ê©€…]߸uk¯LåÅ¥Ù
+n¿HÌŠlÇØäÇT¬¬;å¥wã%Û¬™Ñ­Ù$†ÍÎÚlÜñÓͯ©ñkhC. 3öö»:Œ¡×|+;ÚlB‘¶¯‰.ÆÓõ¹â¼^²*™9xª[kn1Ba†!Æ9éû”W:}ÁâÈk^ry9.Aa{Ãá¼Õç~¼Ýõ«Ôþ¢ôS Μyü ðD§PˆAÔž”³Z€ƒkCõ%uÏQ˜ª6uX ãKè3n瘥ñ8Üu,4ý<³naáÜ}äm
+È |XRz¯kKì±Æ¼n[ã6ŸôÑm˜ò+¡ž T½aòˆGäÙ òß×½®˜ô:?ÂïàãO~ª¤Qódh˜bÆé|¬L³ç%n˜QœwîNuoÐ̶ÍlY§¿Âvö‡X7– <ï‡ º^bül³v„
endstream
endobj
-829 0 obj <<
+1057 0 obj <<
/Type /Page
-/Contents 830 0 R
-/Resources 828 0 R
+/Contents 1058 0 R
+/Resources 1056 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 801 0 R
-/Annots [ 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 825 0 R 826 0 R 827 0 R ]
+/Parent 1041 0 R
+/Annots [ 1052 0 R 1053 0 R 1054 0 R 1055 0 R ]
>> endobj
-820 0 obj <<
+1052 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [119.604 729.66 157.981 740.242]
+/Subtype /Link
+/A << /S /GoTo /D (group__WAIT__RELEASE_ga507a7197646f995b5529a68c1481e39b) >>
+>> endobj
+1053 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.969 729.66 190.385 740.242]
+/Subtype /Link
+/A << /S /GoTo /D (group__WAIT__RELEASE_gga507a7197646f995b5529a68c1481e39baa8e37e16d043d78e34da1d19387be5ba) >>
+>> endobj
+1054 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [193.378 729.66 219.794 740.242]
+/Subtype /Link
+/A << /S /GoTo /D (group__WAIT__RELEASE_gga507a7197646f995b5529a68c1481e39ba8b02d824728fb546d43123b8b069ed04) >>
+>> endobj
+1055 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [222.787 729.66 271.628 740.242]
+/Subtype /Link
+/A << /S /GoTo /D (group__WAIT__RELEASE_gga507a7197646f995b5529a68c1481e39ba9e8f1573ea73441426c6a6dda73b4e49) >>
+>> endobj
+1059 0 obj <<
+/D [1057 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1060 0 obj <<
+/D [1057 0 R /XYZ 70.866 771.024 null]
+>> endobj
+90 0 obj <<
+/D [1057 0 R /XYZ 70.866 771.024 null]
+>> endobj
+94 0 obj <<
+/D [1057 0 R /XYZ 70.866 715.416 null]
+>> endobj
+98 0 obj <<
+/D [1057 0 R /XYZ 70.866 643.945 null]
+>> endobj
+1061 0 obj <<
+/D [1057 0 R /XYZ 70.866 617.024 null]
+>> endobj
+102 0 obj <<
+/D [1057 0 R /XYZ 70.866 617.024 null]
+>> endobj
+1062 0 obj <<
+/D [1057 0 R /XYZ 88.314 535.933 null]
+>> endobj
+1064 0 obj <<
+/D [1057 0 R /XYZ 88.314 519.993 null]
+>> endobj
+1065 0 obj <<
+/D [1057 0 R /XYZ 88.314 504.053 null]
+>> endobj
+1056 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F177 1063 0 R /F99 691 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1076 0 obj <<
+/Length 1352
+/Filter /FlateDecode
+>>
+stream
+xÚ½˜[sÚ8ÇßùžÙ‡Âª.ÖÅ}Ë…tÒ–m–ÒI:Œƒ•ÔS°Ycv›ýô{t±Á@RÈ8yHF:ç/ùwŽŽ„ƒû
+EB°`|HŒ”Œ($'Áu—#ÖëS©º§ñ2ºæ¸'p÷a¡—½oãA2Ä%“v
+Ûg0!ŸÚI` ‹êm¤Þ062{!°`,q¡œKѧ’"*ÂV¼ÊE<lº=±á¼ë—â…*jÃ/Å5ýúüaW{'clq +#¬ùÏòùB pÞë šwã²â9.óyU6:ÝÐ1_óź}×c¸›{3?æ‹éÄv¶5JD „ZliH£¤*7€æz5åVÝúD"5‡í¼²Õç>giæc‰¨Ðëó;¹2Óµ´ƒøúþx„5`g E˜nÂN‡=ä!b’·
+†‘Š´á˜Ó%MǶfò¡@‘€C8á`¾¯~È2óØqòÃãê>ÞÜÆ…çGoܳ$-4¤âz`rÒ¬.7|žæ‰~~`ˆ—Ì¢áñÀRVDYÔX’â°,Ú†WlÃí/mÁqls¾Ã5°ëJúÙțȦóÅ,¦§Mp—u]»HÃQµŒ#ÛÄ‘?G(ÈÌ­I 8‚%&Ùa8¶àµÂ±ávxZCAŽßÐÿìI³•­ªª±QÞV8˜R/¾_nŸŠªÄUŸ†ªk÷Ôƒ–˜ã™ƒéVo 0ïLÏ’Çûº¬†¸Mw¾È×l5ÄB!bÓ'ïfñÌgåtZäe¼ü±|6½R¾$½âxz ßá„Þ½Æã‡%Ó6¼zzn?š»¥
+_z<¾5Óþ²|˜mb¸s¸*ôó1ˆÇÀëßw Ë%Rô˜KØê¢X *á5¬/[CŽDµïMå½®º«i\©k|Ñ × ¾2 ˜ø“ï(Ê*žè:ž.!žf7”û1Ÿ:sXÚS!°(™rï• Êöœ
+²9ô¡UŸ‘¿/±†?¥·…ÝŠêú{³?ÏMŒÿ|¸·t¶½ÄÿA8]<
+endstream
+endobj
+1075 0 obj <<
+/Type /Page
+/Contents 1076 0 R
+/Resources 1074 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1041 0 R
+/Annots [ 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R ]
+>> endobj
+1066 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [151.227 729.56 172.659 740.035]
/Subtype /Link
/A << /S /GoTo /D (structident) >>
>> endobj
-821 0 obj <<
+1067 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [173.159 729.56 202.068 740.035]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-822 0 obj <<
+1068 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [126.678 716.979 200.912 726.642]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga951d8a0a41a4b285b3da9cabd7a99f85) >>
>> endobj
-823 0 obj <<
+1069 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [126.678 703.587 210.873 713.25]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga50e3ecb5eb8d70f437a84a8b2bc9e88f) >>
>> endobj
-824 0 obj <<
+1070 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [126.678 690.195 228.312 699.858]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga744ef043bd848d5e338b4c72ef247adc) >>
>> endobj
-825 0 obj <<
+1071 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [126.678 676.802 262.68 686.465]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_gaf2f9e5d03f9f38651a3b8d5ef8635d44) >>
>> endobj
-826 0 obj <<
+1072 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [126.678 663.41 252.736 673.073]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga7358cc60d0f006b36752a1795e6d5d93) >>
>> endobj
-827 0 obj <<
+1073 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [126.678 650.018 250.737 659.681]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_gaaffb56f3d5bd8803b41e9862e2aeb863) >>
>> endobj
-831 0 obj <<
-/D [829 0 R /XYZ 70.866 789.024 null]
+1077 0 obj <<
+/D [1075 0 R /XYZ 70.866 789.024 null]
>> endobj
-705 0 obj <<
-/D [829 0 R /XYZ 70.866 771.024 null]
+911 0 obj <<
+/D [1075 0 R /XYZ 70.866 771.024 null]
>> endobj
-82 0 obj <<
-/D [829 0 R /XYZ 70.866 771.024 null]
+106 0 obj <<
+/D [1075 0 R /XYZ 70.866 771.024 null]
>> endobj
-86 0 obj <<
-/D [829 0 R /XYZ 70.866 634.736 null]
+110 0 obj <<
+/D [1075 0 R /XYZ 70.866 634.736 null]
>> endobj
-90 0 obj <<
-/D [829 0 R /XYZ 70.866 573.056 null]
+114 0 obj <<
+/D [1075 0 R /XYZ 70.866 573.056 null]
>> endobj
-832 0 obj <<
-/D [829 0 R /XYZ 70.866 548.085 null]
+1078 0 obj <<
+/D [1075 0 R /XYZ 70.866 547.994 null]
>> endobj
-94 0 obj <<
-/D [829 0 R /XYZ 70.866 548.085 null]
+118 0 obj <<
+/D [1075 0 R /XYZ 70.866 547.994 null]
>> endobj
-833 0 obj <<
-/D [829 0 R /XYZ 70.866 486.191 null]
+1079 0 obj <<
+/D [1075 0 R /XYZ 70.866 486.191 null]
>> endobj
-98 0 obj <<
-/D [829 0 R /XYZ 70.866 469.913 null]
+122 0 obj <<
+/D [1075 0 R /XYZ 70.866 469.913 null]
>> endobj
-834 0 obj <<
-/D [829 0 R /XYZ 70.866 392.174 null]
+1080 0 obj <<
+/D [1075 0 R /XYZ 70.866 392.174 null]
>> endobj
-102 0 obj <<
-/D [829 0 R /XYZ 70.866 375.896 null]
+126 0 obj <<
+/D [1075 0 R /XYZ 70.866 375.896 null]
>> endobj
-835 0 obj <<
-/D [829 0 R /XYZ 70.866 315.781 null]
+1081 0 obj <<
+/D [1075 0 R /XYZ 70.866 315.781 null]
>> endobj
-106 0 obj <<
-/D [829 0 R /XYZ 70.866 299.503 null]
+130 0 obj <<
+/D [1075 0 R /XYZ 70.866 299.503 null]
>> endobj
-836 0 obj <<
-/D [829 0 R /XYZ 70.866 239.388 null]
+1082 0 obj <<
+/D [1075 0 R /XYZ 70.866 239.388 null]
>> endobj
-110 0 obj <<
-/D [829 0 R /XYZ 70.866 223.11 null]
+134 0 obj <<
+/D [1075 0 R /XYZ 70.866 223.11 null]
>> endobj
-837 0 obj <<
-/D [829 0 R /XYZ 70.866 145.371 null]
+1083 0 obj <<
+/D [1075 0 R /XYZ 70.866 145.371 null]
>> endobj
-114 0 obj <<
-/D [829 0 R /XYZ 70.866 129.093 null]
+138 0 obj <<
+/D [1075 0 R /XYZ 70.866 129.093 null]
>> endobj
-828 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R >>
+1074 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-841 0 obj <<
-/Length 450
+1087 0 obj <<
+/Length 447
/Filter /FlateDecode
>>
stream
-xÚ•“MOÜ0†ïù>&‡5ão›#Ú.**¢-¹ª²‰"í&4ëø÷ulg ˆKO3žñÌ<ž7ôˆ
+xÚ•“MSÛ0†ïþ:Ú‡,«o™#Ó†)S†¶ø ãØ
+x&±SGž’_Ù’C`rá¤Õ~>Ú×FòB\'WEr±Ì%1+ÅI±&Á(EtÎ@QRÔä!e,{*n—å¾nòÞvõ°±Ù‚i“~ëªak[Wº¦kÇää{‘üM¨ÏEB=é¶ÉÃ’ÚÇnÏ ù7en‰¤glÈ}ò;ÁȉÀähŽG¤¦¨ EÐ2W§ÜŠÎà8ðlA1-2aÒÃÎÖví™Ù9æóä÷!Y0Jš“@ãw:aïú¡rcëO;6 (eó"›ÚS„ŠÉ|vh.–BÔ.bq€ÈC‹â5
+1÷ÒÓt%S0ô1ì^Ë­í¾
+ñfe÷ÁWÆÂnè«X°éªi?ð霸R{m¿"íüé)`Z‰ñiL!äBøLP¾ãô²kÛÚ¾t¶<^©é\öM0îí.LÅ©U—L^
+nëŒaÚõáò£uvóÈd¬¹ÛÙööW*÷D¹æf$¢šãtVê‘å|ç–>ç¨æŸ¡uÍ6®ïg³êËq͘‚g5bæ¿&㘾^¦Û~ÞñJßß
endstream
endobj
-840 0 obj <<
+1086 0 obj <<
/Type /Page
-/Contents 841 0 R
-/Resources 839 0 R
+/Contents 1087 0 R
+/Resources 1085 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 843 0 R
+/Parent 1041 0 R
>> endobj
-842 0 obj <<
-/D [840 0 R /XYZ 70.866 789.024 null]
+1088 0 obj <<
+/D [1086 0 R /XYZ 70.866 789.024 null]
>> endobj
-118 0 obj <<
-/D [840 0 R /XYZ 70.866 771.024 null]
+142 0 obj <<
+/D [1086 0 R /XYZ 70.866 771.024 null]
>> endobj
-838 0 obj <<
-/D [840 0 R /XYZ 70.866 751.762 null]
+1084 0 obj <<
+/D [1086 0 R /XYZ 70.866 751.762 null]
>> endobj
-122 0 obj <<
-/D [840 0 R /XYZ 70.866 751.762 null]
+146 0 obj <<
+/D [1086 0 R /XYZ 70.866 751.762 null]
>> endobj
-839 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R >>
+1085 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-848 0 obj <<
-/Length 1055
+1093 0 obj <<
+/Length 1044
/Filter /FlateDecode
>>
stream
-xÚ­WM›H½ûWô¤¸ÓßÝäM&J´Ñfg½§™Èb =AÆàÅX³þ÷[ 6{w"ŸhCQU¼ªz¯LÐ "èóìãböþ>’ÈàH)Ž+¤ 6J!1¬(Z¤è1`$ü±øŠ¸XPï5w¿•é>·áœiÜ•É~c‹:®³²pƳO‹Ùß3
-¶ÑÞ§1Ø0’ÍìñA)<ûŠæ‘A¯å ɱ.FŽþœý1#>O‚™tGwñYS¢e8¢Tžæ­(&]âópN !ÁÝV6‰k›BÂÌ÷û"q¹îšd§£øk)‚ 9'XÖz¿àÃ_ßß u+UX 8Ž´l<1&ï¢Ç¹”*Xo¶Ë¬¨9ó„Õ‹Çò¡1s /—`˜,Ëõ²iP.W!'AYÁË`=öë^x"’\td)\¾½¡>‚©ö#œe×O„pg>úT°1¬³ÉËÂÒÖëuxçÔ
-Çé†n|͛ÞzàXqu“Ä…Âð$î&z"o¥€Ô¢›DUÆ5Æ0j¹žˆ©56Zß$¦!X*=ŒY—1Á€y“˜
-!ž.¿‡L
-—Jí5ú…‹°nEvK]²Ûo·n…$¨q‚£99lÀÁì-ûr·Ï+Ì4ˆ¢£3Ep$XB»xL?ÛÂV~nV”öz_e~·‰ÿ"Þ^éN”} ÑÉ»ˆw¢/Emó'&Uûó÷­-¾}ï‰j¯¹iÚ_»òÒsæä-Á¦ß"öEm<’¿eÏUì†
-é ïÒ8tE\…ÿ9¼4¶cü/W|ö°
+xÚ­WM›H½ûWô¤NäM&J´«ÍN¼§™Èbp{‚ŒÁ‹±fçßo54Ø`ìÍD>¡yUýªë½2Aψ O³óÙ»;+‘ÁV)Žæ+¤ 6J!mVÍ—è!’XÄ7L›èÖm+—&µ[¶¿ïöEZge±‹¿Ï¿ !8–šnóãþéìã|öÏŒÂC‚hn 6L t3{øNÐÞ}AskÐK³rƒ„0áÁrômö׌„„ fÒßúKHŸ(ÖRy¼E1ì€B†[`£-œ‰B¬¥U>A7œ`AX‹~#\ßÝ uÄ/UX 8¶Z¶
+¥Ú@ éA²KŠ
+ß¾æÍa8V\]%q¡0>‰ûŽžÈ[)5{•¨Êøƒ1ŒZ®'bjÖW‰i–JcÖåDLX@„¼JL ÀGì®|ϔպ=šó^ãŽTq$†œbÁ'´j{쫘Àòƒ†5£“€5å¤N.GŽ2lBK šÈ{
+!A.¿ÆL€ %W»*¦4šv§iÌñÛ)—`°\«Ë&®°µr¢}®‚á 
++,fìâÕ[)§;bžC±ýÉ” bUK‡ÁîÃgr˜¥'Q“ Å ðKïm“Ü !É4èû…„NËä2Äÿ—ôí§ÄtXŒb"Ûð2ïyu0«ÆÝ9óL“†ƒí‰èsx™ä­W{ ˆ•«÷ÞÐeÔóû¿?6¦êM LJÁ¸Ú¤që ÃY‘Hpž!.•&xþ*ayx釺t·ßný!HTãZs²Ù@ƒÙ[æån°W˜i0ŧBÂi ”~r…«ã|·¡»*ko¾¹0û0®„†¿T½gò½ÐÝHÄ#Ñç¢vù#“á›?·®øãk¯›PzÍMsúµ¯.=ÎAÚÖôCäý¾¨³M ò÷ì©J|o@CÝ}áþ¶ôþ÷õ¹YàŠ1ÅÿÛø\
endstream
endobj
-847 0 obj <<
+1092 0 obj <<
/Type /Page
-/Contents 848 0 R
-/Resources 846 0 R
+/Contents 1093 0 R
+/Resources 1091 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 843 0 R
-/Annots [ 844 0 R 845 0 R ]
+/Parent 1099 0 R
+/Annots [ 1089 0 R 1090 0 R ]
>> endobj
-844 0 obj <<
+1089 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 704.801 218.727 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__DEPRECATED_ga27292e41af4c26e0bdf45b12b1f76d5a) >>
>> endobj
-845 0 obj <<
+1090 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [222.213 704.801 251.122 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-849 0 obj <<
-/D [847 0 R /XYZ 70.866 789.024 null]
+1094 0 obj <<
+/D [1092 0 R /XYZ 70.866 789.024 null]
>> endobj
-706 0 obj <<
-/D [847 0 R /XYZ 70.866 771.024 null]
+912 0 obj <<
+/D [1092 0 R /XYZ 70.866 771.024 null]
>> endobj
-126 0 obj <<
-/D [847 0 R /XYZ 70.866 771.024 null]
+150 0 obj <<
+/D [1092 0 R /XYZ 70.866 771.024 null]
>> endobj
-850 0 obj <<
-/D [847 0 R /XYZ 70.866 723.517 null]
+1095 0 obj <<
+/D [1092 0 R /XYZ 70.866 723.517 null]
>> endobj
-130 0 obj <<
-/D [847 0 R /XYZ 70.866 690.557 null]
+154 0 obj <<
+/D [1092 0 R /XYZ 70.866 690.557 null]
>> endobj
-134 0 obj <<
-/D [847 0 R /XYZ 70.866 630.933 null]
+158 0 obj <<
+/D [1092 0 R /XYZ 70.866 630.933 null]
>> endobj
-851 0 obj <<
-/D [847 0 R /XYZ 70.866 606.078 null]
+1096 0 obj <<
+/D [1092 0 R /XYZ 70.866 606.078 null]
>> endobj
-138 0 obj <<
-/D [847 0 R /XYZ 70.866 606.078 null]
+162 0 obj <<
+/D [1092 0 R /XYZ 70.866 606.078 null]
>> endobj
-853 0 obj <<
-/D [847 0 R /XYZ 70.866 573.531 null]
+1098 0 obj <<
+/D [1092 0 R /XYZ 70.866 573.531 null]
>> endobj
-846 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R >>
+1091 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-860 0 obj <<
-/Length 1540
+1106 0 obj <<
+/Length 1554
/Filter /FlateDecode
>>
stream
-xÚ½X[“›6~÷¯àÏÄŠîBé[g³™¤M²Mö-›ñ[ëeŠÁÅ8Éö×÷Ilì®ímŸBœû9ß8ZD8z3úõvôòZ‹(AZJÝÞG
-£DÊHiŠ$‰nçÑ—˜#>žP•ÄŸë´‚ŽëÍÊí¤ÅÜ?zØÔórLDü£½}qÎP ´42(±»£×·£¿F6qDZUI‚Ê£Ùrôå+Žæðì]„ÓIô£9¹Œ¸
-ˣϣ?FØ›vi/Þ‚UD(Ò„ˆ®;’ Üó‡`Œ½CDz‡hpˆn"Þ¡:½BŒ”ÐÒ*ÄÑ„aÄ1uº®7ŬÎÊbÝ—á¯/¯¹ìÄžH¤~¤•pî(½w£/!dü}LE\fsÿÌÆ³ZøÀ~jNÙ´L§.W³é7³ÈŠ])öùø „¤“Øõ´î½ £# VÓÆcB1ÂT…LßaÌìñß8Ò gòrfKå…«0qš5£coféb ¦‘¾ÉBÂ8± ¤yÆ
-ûc†ã²r7yö­Ûî‚íG·›Y¥yöwÚ¨ïug€ §xŽ÷]¦ÞåÐtÞår¶YB§{Ni8ƒFAU¨.ÞVWoª¢Q‚Y$”@“cc F¬ngZG…Šaäd íüëLèE(…}ÇØŠ°› Ä¥x­<ADð¾V7ƒšŒ„¶Ú
-oéж¹|gí4#ˆ3±ßODumP0“d§¡^øC}CaàŠvrA\öÃB¹B”¨ç åàVý°¸Á7à
+xÚ½XKsÛ6¾ëWðHÍDÞôÖqœIZ7nì[œÑ0-sJ‘*E%M}@‘¥Z’ÛAØ]ìëû
+†@L™Aʘ-¼ Ô—FBèsÕö‰ð!jH_kæ[êºÜT3ß•Á’N³ÍŠm—ñò
endstream
endobj
-859 0 obj <<
+1105 0 obj <<
/Type /Page
-/Contents 860 0 R
-/Resources 858 0 R
+/Contents 1106 0 R
+/Resources 1104 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 843 0 R
-/Annots [ 854 0 R 855 0 R 856 0 R 857 0 R ]
+/Parent 1099 0 R
+/Annots [ 1100 0 R 1101 0 R 1102 0 R 1103 0 R ]
>> endobj
-854 0 obj <<
+1100 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 704.693 173.789 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__STARTUP__SHUTDOWN_ga53f4ef16321f42eeb3b8dd463b51f112) >>
>> endobj
-855 0 obj <<
+1101 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [177.275 704.693 206.184 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-856 0 obj <<
+1102 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 691.849 166.813 702.324]
/Subtype /Link
/A << /S /GoTo /D (group__STARTUP__SHUTDOWN_gacdedfb2c01fe256ad6c75507644bdfed) >>
>> endobj
-857 0 obj <<
+1103 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [170.299 691.849 199.208 702.324]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-861 0 obj <<
-/D [859 0 R /XYZ 70.866 789.024 null]
+1107 0 obj <<
+/D [1105 0 R /XYZ 70.866 789.024 null]
>> endobj
-707 0 obj <<
-/D [859 0 R /XYZ 70.866 771.024 null]
+913 0 obj <<
+/D [1105 0 R /XYZ 70.866 771.024 null]
>> endobj
-142 0 obj <<
-/D [859 0 R /XYZ 70.866 771.024 null]
+166 0 obj <<
+/D [1105 0 R /XYZ 70.866 771.024 null]
>> endobj
-862 0 obj <<
-/D [859 0 R /XYZ 70.866 723.517 null]
+1108 0 obj <<
+/D [1105 0 R /XYZ 70.866 723.517 null]
>> endobj
-146 0 obj <<
-/D [859 0 R /XYZ 70.866 677.605 null]
+170 0 obj <<
+/D [1105 0 R /XYZ 70.866 677.605 null]
>> endobj
-150 0 obj <<
-/D [859 0 R /XYZ 70.866 618.089 null]
+174 0 obj <<
+/D [1105 0 R /XYZ 70.866 618.089 null]
>> endobj
-732 0 obj <<
-/D [859 0 R /XYZ 70.866 593.218 null]
+940 0 obj <<
+/D [1105 0 R /XYZ 70.866 593.127 null]
>> endobj
-154 0 obj <<
-/D [859 0 R /XYZ 70.866 593.218 null]
+178 0 obj <<
+/D [1105 0 R /XYZ 70.866 593.127 null]
>> endobj
-863 0 obj <<
-/D [859 0 R /XYZ 70.866 560.521 null]
+1109 0 obj <<
+/D [1105 0 R /XYZ 70.866 560.521 null]
>> endobj
-733 0 obj <<
-/D [859 0 R /XYZ 70.866 464.406 null]
+941 0 obj <<
+/D [1105 0 R /XYZ 70.866 464.406 null]
>> endobj
-158 0 obj <<
-/D [859 0 R /XYZ 70.866 449.166 null]
+182 0 obj <<
+/D [1105 0 R /XYZ 70.866 449.166 null]
>> endobj
-864 0 obj <<
-/D [859 0 R /XYZ 70.866 418.306 null]
+1110 0 obj <<
+/D [1105 0 R /XYZ 70.866 418.306 null]
>> endobj
-858 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R /F160 682 0 R >>
+1104 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R /F162 890 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-883 0 obj <<
-/Length 2382
+1129 0 obj <<
+/Length 2373
/Filter /FlateDecode
>>
stream
-xÚÕ[[oãÆ~÷¯ ЇJ@4;÷K ×AƒMS¿íMÑ2»’¨ŠTÒí¯ïrx¿¬(Ò ôÅ–¬Ñ93çú}ghìí=ìýðð—ç‡OFx)™÷üê)Œ´”ž2Iâ=ï¼+J׿=ÿè1Á' ¾—ýõçxw=„ë Uzõ×cxJý4ŠOvñÃ_Ÿþý@`-öH)Sk¤)÷‚ãÃÇß°·ƒÏ~ô0bF{d+ nu¼>üã»}bD…}i¹]¬<B‘!DÔ÷- ÂÅÆ9ë Á¯~YS¾ò/þá`ËT¯>a_×D¬âËçÿŠ£üd[ï×éb¤„‘V!ö6 #Ži®ëyÍõêË9Ü…¯ISŒûýá‰Ëš‰DJ+ö‚Œ¹ŒO”ŠÆw½!ä*Íåæ¶þ}MaÓÑÎÀ.ÿÏ€\šmKD©*œô cæ$ZG\öÎ#¿vö£W¼øÚçã9أ෷cw`-eµÃªmtJíÙXIÖÙGK)GF“bÍþ¿ø‡mí¾ËO:&_+D Ÿ"þ%¾žv™t„Påìq'o¨&ˆa¾æH •‹zºžéÓÍÇ]øvÀeÎþÛmæŸó5yÛžÖ¯®Çmº&«·Kèï’áA™«h© ê_l»Sq°É$wâÀ¦WÇ—ÙÛ_goËcågê䦷!Ê Å4¼
-º ]_× CU€Ê!VŸ·ÔŒ®IÕ&eYœ.fRÿ²wŸŽr<µ³R?ùÜL’ÊêL"F™³:™muiú£9ôÝ@†Åó­. ÂŒÝ`uÚguÒ°:l¨ÈÏ›'ã–m²F»!R ]yCXÙ5‡‘\ЈÐwO„4„Óç–Eê §PfõÿY2phBÚ,– •å“0·zä¢ÿÚs„»íÙšÿbã$G1ïâÈ%îÎŽ‘2ß[Á¡§0ñB£ÏMÈ›&|wûiƒ¤áïj¿¯¨ô4
-»¢(#öMt<BK¢Ó>7 ‘¸4H¦ÆYçOç‹¿?úë„ÇÇsþâ\ ù®m 1HˆÒºè6›hÒ™LW&£Îd5lï¬Öá;c¤aÐŒ™ŽÒ1i]Ãï–° £|%‘1=Ø¡©N! Ëk˜¾KÍlJà È-À#Ü ¡)‰YIÁj¦W
-1’‹"ØäZm ÍXV4twA‰oˆ%vA)2.š»d)@–°øšùš§dϤrË9Ta½q‡0hV#zÔ€Z/ s3ìÝì—ѰîþC‰
--R~?âßûtöº·R™B8t°U£¥·®‘¢SküÑ9‰’aÇOÞyÇg “y|j–ˆÜ늑\
-/~Zø¡èËO—ÈýgF¸é?ËS\¼"ô{l¾¬x V4ü Ü}ø88û÷sxúù——Éí“×îi-ZÍO+`ÞØ·€5%„üõzJ££«%?E/—,jÊ;úýÎcœÝ ~Ùg ÂæõÍÿ
+xÚÕ[YoãF~÷¯ °+QOßG³6H°9ü6´DËÜщJvö×§úàMqD‘`_líª®£«¾¯šÆÑ&ÂÑwÿxzx÷hD¤‘‘’EO/‘ÂHK)C‘$ÑÓ:ú0HÎTéÙOs†gñ)Þn“­ÿä#øeNñìpúôî?‡tùoOßGœ3$-NöÓ‡>=üþ@àC‘B•ÖHS­v~ÃѾû>ˆýéVî".@·Â¶Ñ¯??à°}Œ¨°/í¯` Á*"BDÕI®ÙC0Æ`åƒhn-ƒ®è
+1RÂH«G †ÇÔëzšs=û|LÖÉ˹.&ü~÷ÈeÅýD"¥U{AF /ã# ÞËÿ&ú°BÎ2/×Gâ9…M§kk€] a5‘¹ÔmKD©Ê£ñc$Ú@œ6!"¿´ö£W<ÿ³O»ãj¹KW§Cs;!ˆÕ«–é>c´càu$Yk ¥Mò5›íá9Þ.³tý·´O¾Vˆ>Düóá²_;é¡2ØýA^PMÃb͑ʋz¼ìWYzØ4ïtÛ+! þ_.]|Ž—óër?'xvÙ-³9™½ž’x}¾1|Uæ,]'û $Tÿ°NÅÁ'ƒÂ¹=¬ìñjÅҽ퉵{[˜åmjÍhA”AŠix~tB¿¾Øâw8Aå³OËÔŒ¶KÕ.eYœNæÒø´ ßöÙ´ÝY|þT?$¥×™DŒ²àu2ÚëÒtgsïÚ‰ ‹Ç{]„»Áë´Ëë¤æuØP#‘[ß×-º*&,[¸Žº R ÍzAx94‡ž³ ¡o~²JLWX&©/œB™Õÿg‡CÒf²ÃPzþœx¯§ñ6ýŸµ#Y/Öý'›'żIàt(q÷éè)óz
+o¸ 4zïB^wá›ûO$ Sÿ} °@Íà §X
+»"/#öMº;n“82Ýo¼kˆ¤5 Aœšà¿OñfÏv~Øý‹cŽäÛ¾%Ä !
+ï¢Û|f Éà2]ºŒ—U°}ðÚau±FÄ-¿u©ºêF§£LVÕð‡%,×Q¾’ȘìPW§†åLߦföJà \pW€{¸ðDS³‚‚U\¯bÄ‹"Øx­¶†:–U! í]P¢ bŠ]P
+¤Œ‹ú.®² KX|ɵóêd‡ R¹e“˜
+šßvÍ“˜1ˆ0Ý?O²…Ré2± ;kÓ°@³>°ÚCùjÖ*^­žX  ’Œò¶]¶ÿŽÂ F@‚Þ©¼Þ4CÐkº‹$ /dŽ¥ ¡“[8”fŸC*½4r«º4±ü_û#Y]\篯Í3µÍT! a¸™íPk;‰áãÒe”Œ.®åš±é¡Í)uŸÈƈ«']îSÞ.UÝE0ÐæéR$2GzRd°iíð‚ÎÆeÈ!A$ETÉ‘ b'5Ü€0û
+:`Ojܧ¶;5ªZÀɩхίÐbÖ•™vœsÞg{ϰMrF±Z%eÏtß}¾£~ 6®Y•—Ãe´œËºB¼yŸ
+v 9©M :îò±SåæÃ}²:ìÏ™_}YeôYÐEÀ…”ß*9Ž˜r¹:_ŽG{,9žehu]Ö°”×jýèÍØp åì7TBö³¢x“û±ßZö«iÍŸrê€Ô ¦Ð „(g]³{v¢~QÈn®¾>üR½ð‹Â©ÔBNá* ¼á–~øU˜»‹“MnFÝq ª[k¹ôº$ °D’‹¥îr{¾šç£¦P› º3ù•AêE踪=N†ïÉv8g¤švl[-¿vÝ©¶³×´N»†o°¡ä¸™ÿ8>Äî©Y>2Â
endstream
endobj
-882 0 obj <<
+1128 0 obj <<
/Type /Page
-/Contents 883 0 R
-/Resources 881 0 R
+/Contents 1129 0 R
+/Resources 1127 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 843 0 R
-/Annots [ 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R ]
+/Parent 1099 0 R
+/Annots [ 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R ]
>> endobj
-865 0 obj <<
+1111 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [153.358 704.693 203.669 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL_gab49014fb4572e7d0f308fd9b1824daf7) >>
>> endobj
-866 0 obj <<
+1112 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 646.862 228.519 657.444]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL_ga345b3a5866deefefc91ae1e8958f49f4) >>
>> endobj
-867 0 obj <<
+1113 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [232.004 646.862 260.913 657.444]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-868 0 obj <<
+1114 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 633.91 185.104 644.492]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL_gac2b7cc2fa78dde5381bcf00cfc48d124) >>
>> endobj
-869 0 obj <<
+1115 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [188.59 633.91 217.499 644.492]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-870 0 obj <<
+1116 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [305.433 633.91 355.745 644.492]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL_gab49014fb4572e7d0f308fd9b1824daf7) >>
>> endobj
-871 0 obj <<
+1117 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.41 620.959 222.953 631.541]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL_gaae9462b03457d809faeb3e767a5b2283) >>
>> endobj
-872 0 obj <<
+1118 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [226.36 620.959 255.269 631.541]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-873 0 obj <<
+1119 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 596.052 196.07 606.634]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL_ga1cab712d076ba1d2758b0c3bf5ffe38a) >>
>> endobj
-874 0 obj <<
+1120 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [199.556 596.052 228.465 606.634]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-875 0 obj <<
+1121 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [316.399 596.052 366.711 606.634]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL_gab49014fb4572e7d0f308fd9b1824daf7) >>
>> endobj
-876 0 obj <<
+1122 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 583.101 223.516 593.683]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL_ga7b1ba1cc8d9d2fea8654bbb1e59f079e) >>
>> endobj
-877 0 obj <<
+1123 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [227.001 583.101 255.91 593.683]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-878 0 obj <<
+1124 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 570.149 243.456 580.731]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL_gac341818e68b06d910111e4cf08bb54dd) >>
>> endobj
-879 0 obj <<
+1125 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [246.942 570.149 275.851 580.731]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-880 0 obj <<
+1126 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [254.484 426.459 332.071 437.042]
/Subtype /Link
/A << /S /GoTo /D (group__PARALLEL_gac2b7cc2fa78dde5381bcf00cfc48d124) >>
>> endobj
-884 0 obj <<
-/D [882 0 R /XYZ 70.866 789.024 null]
+1130 0 obj <<
+/D [1128 0 R /XYZ 70.866 789.024 null]
>> endobj
-726 0 obj <<
-/D [882 0 R /XYZ 70.866 771.024 null]
+933 0 obj <<
+/D [1128 0 R /XYZ 70.866 771.024 null]
>> endobj
-162 0 obj <<
-/D [882 0 R /XYZ 70.866 771.024 null]
+186 0 obj <<
+/D [1128 0 R /XYZ 70.866 771.024 null]
>> endobj
-885 0 obj <<
-/D [882 0 R /XYZ 70.866 721.36 null]
+1131 0 obj <<
+/D [1128 0 R /XYZ 70.866 721.36 null]
>> endobj
-886 0 obj <<
-/D [882 0 R /XYZ 70.866 665.685 null]
+1132 0 obj <<
+/D [1128 0 R /XYZ 70.866 665.685 null]
>> endobj
-166 0 obj <<
-/D [882 0 R /XYZ 70.866 555.905 null]
+190 0 obj <<
+/D [1128 0 R /XYZ 70.866 555.905 null]
>> endobj
-170 0 obj <<
-/D [882 0 R /XYZ 70.866 496.389 null]
+194 0 obj <<
+/D [1128 0 R /XYZ 70.866 496.389 null]
>> endobj
-887 0 obj <<
-/D [882 0 R /XYZ 70.866 469.469 null]
+1133 0 obj <<
+/D [1128 0 R /XYZ 70.866 469.469 null]
>> endobj
-174 0 obj <<
-/D [882 0 R /XYZ 70.866 469.469 null]
+198 0 obj <<
+/D [1128 0 R /XYZ 70.866 469.469 null]
>> endobj
-888 0 obj <<
-/D [882 0 R /XYZ 70.866 411.292 null]
+1134 0 obj <<
+/D [1128 0 R /XYZ 70.866 411.292 null]
>> endobj
-178 0 obj <<
-/D [882 0 R /XYZ 70.866 317.163 null]
+202 0 obj <<
+/D [1128 0 R /XYZ 70.866 317.163 null]
>> endobj
-889 0 obj <<
-/D [882 0 R /XYZ 70.866 292.2 null]
+1135 0 obj <<
+/D [1128 0 R /XYZ 70.866 292.2 null]
>> endobj
-182 0 obj <<
-/D [882 0 R /XYZ 70.866 292.2 null]
+206 0 obj <<
+/D [1128 0 R /XYZ 70.866 292.2 null]
>> endobj
-890 0 obj <<
-/D [882 0 R /XYZ 70.866 259.594 null]
+1136 0 obj <<
+/D [1128 0 R /XYZ 70.866 259.594 null]
>> endobj
-891 0 obj <<
-/D [882 0 R /XYZ 70.866 175.434 null]
+1137 0 obj <<
+/D [1128 0 R /XYZ 70.866 175.434 null]
>> endobj
-186 0 obj <<
-/D [882 0 R /XYZ 70.866 160.194 null]
+210 0 obj <<
+/D [1128 0 R /XYZ 70.866 160.194 null]
>> endobj
-892 0 obj <<
-/D [882 0 R /XYZ 70.866 129.276 null]
+1138 0 obj <<
+/D [1128 0 R /XYZ 70.866 129.276 null]
>> endobj
-881 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R /F160 682 0 R /F174 789 0 R /F177 852 0 R >>
+1127 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R /F162 890 0 R /F174 1021 0 R /F179 1097 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-899 0 obj <<
-/Length 2514
+1145 0 obj <<
+/Length 2511
/Filter /FlateDecode
>>
stream
-xÚÕ[KãÆ¾Ï¯ C$`§Ýï‡íEŒÙØsóކ3b–"eŠÊzóëSÍn¾DŠ+>2ˆ/# Ù¬ª®ª®þ¾j
-¯Þßýåá42R²àá%Pi)e(’$xx~Ùp$¶÷Té͇-Û0“$JÜ•Xà—-Å›,ÿôÍ¿²8… dûëÃç Å@K)ƒ2{õîû‡»ßî\Ä©Ui4åÁîp÷˯8x†{?1£ƒÏåÈCÀãVXü|÷Ï;Ü6ŸËó%A¸²ÿ»Ì[ì#÷%ÜçÐÏàÅÎ)Ë·÷Dl>ùÛé³û²ƒ™^<zˆwyV„'?4N/îçQY‰ÿÞR‚
-w5ݼ9ž¢ÜýŸ½TåQø|Ú‚nTz ÷D! Þp–G1¦i\Ä™Wz‰IœzT©®PûHâo~:w§óñhgÈñ¦@»RÑFTX'Ú÷àD‚UË‹`£àHQ'
-'Hê–ª5àb½S#Õ2Ÿ£´x,ü8G¥ÇâLTã ǘDTÛ…0 ÷ƒ’l÷κ°)¡ªQ’¾_(LFó5ÜB¥F‚u½§£CæCþR\Ûæ6n¯Õ$ºn#HÐöv¶4”¥pH²àHêÚ}õP[IÞmï¥æ„г òJ¿»òZWÀú³³žaùr@Ø¡ú5üÁ®Z¨Ý‡¨€*DÈæ4,gPÞåÝ¡2.5C”©ñ2.‘1b`ݯ"ƒ”³•öSÓ10š #D'ko'”?&ƒ¸A‚Uù<T; ¿„ž«¶³y65¤«õ”ó/ç`AØìqZo^°ÙÜž¦ ŒÎ0°û©Ù²/’áC,4”v³0ÄT"¦!ÄP‚Õ’‹ñ<½Ã1n«- $ãP,; 8Ÿ®
-A¸â9k}4}O
-ÏþqŒÒ¿¨1\“ D¹NSÄuÌ0¦þýÔOç´ˆÞ‘‹Ÿòò%iÇÛìY[Åá¬íYÉ
+xÚÕ[M“㶽ϯ`U‘ªv|ô1e{+®¸âxçf»¦8î k%R–¨l6¿>(‘"¥?2v¥!ÁîFw£ñ^ƒ¢ÑKD£÷w}¸ûË÷±Š,‰µÑÃÇÈPbµŽL̉fÑÃsôË‚ëåo?DBI"™ÀsÕÕ‹çÃ:]Þscß«Ã&ÍË¤ÌŠÜ ¾ûîáî÷;†±4bG™ÖËe´ÚÜýòžqÛès5rI%ˆ’NÇ:úp÷Ï;Ú´Sê;5#´6ôÛ›S¾»’UyHÖþûÇ¥ ‹b·¼gjñ)ÜΟý—U²^Ÿ=ºÉV»¢Löah–ŸÝߥ˜<$þkÉ•þj¾dtqØ<¥;ÿwñ±~l—&Ïû%t“Ê™4ºg†hxÃ[žþJ)ϳÊÞ¶ qåA#þµ…ºGê|ÚlWûÃvëf(é¢$«JÑ%\9'º÷p"£¦áE˜!8©¼Šh"ˆ€(­¦&EöÜ (c1±TD†Qb »Q¤Q| gC„
+6XB•í90®ˆá^”2ÜÏþXõØ-‘˜ìZ¥%LɶÖ.ÀÅîSf͉”fÍZ&t[s™&›=R»´PÔp¶°9B&X½z³g,×Ç2Œ‹£ã¸vã#R¨zrLøAÌÄÍåG(†‡Aëbõ. :³”eêQI×/“±r·pm‰m¯dy)xŸùÈ_Nö';·—zm·1¢xs«GW–ŤO2Ф¶G÷‡ºJòny¯­\Búœ…Ês~ò»b~ý†
+xül­g,_i#„E0¬áŸÜªMvÉ&-Q…[ìûåôÊ;¿ÛWƵ„ s½ŒkǪgÝÏ"ƒU³ÕîÓòk20š‘X©VÖÙL”?¡ „!nH°:ŸûjòKÙ±j[›C°yÌÚZ÷Åa·
+å$§½ Ë›6›Í…]i
+a|„Ýð¸O+¦…x’ŒbeQÚã‰!æØÔ,BŒ,˜ª—ü˵ÓÛã¦Ú…`}*À²
+Kí/
+þWØJÓÐWûÓv—¼l`®¢+°óV_N@Áýå
endstream
endobj
-898 0 obj <<
+1144 0 obj <<
/Type /Page
-/Contents 899 0 R
-/Resources 897 0 R
+/Contents 1145 0 R
+/Resources 1143 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 843 0 R
+/Parent 1099 0 R
>> endobj
-900 0 obj <<
-/D [898 0 R /XYZ 70.866 789.024 null]
+1146 0 obj <<
+/D [1144 0 R /XYZ 70.866 789.024 null]
>> endobj
-895 0 obj <<
-/D [898 0 R /XYZ 70.866 741.549 null]
+1141 0 obj <<
+/D [1144 0 R /XYZ 70.866 741.549 null]
>> endobj
-190 0 obj <<
-/D [898 0 R /XYZ 70.866 726.309 null]
+214 0 obj <<
+/D [1144 0 R /XYZ 70.866 726.309 null]
>> endobj
-901 0 obj <<
-/D [898 0 R /XYZ 70.866 695.391 null]
+1147 0 obj <<
+/D [1144 0 R /XYZ 70.866 695.391 null]
>> endobj
-894 0 obj <<
-/D [898 0 R /XYZ 70.866 586.524 null]
+1140 0 obj <<
+/D [1144 0 R /XYZ 70.866 586.524 null]
>> endobj
-194 0 obj <<
-/D [898 0 R /XYZ 70.866 571.284 null]
+218 0 obj <<
+/D [1144 0 R /XYZ 70.866 571.284 null]
>> endobj
-902 0 obj <<
-/D [898 0 R /XYZ 70.866 540.366 null]
+1148 0 obj <<
+/D [1144 0 R /XYZ 70.866 540.366 null]
>> endobj
-893 0 obj <<
-/D [898 0 R /XYZ 70.866 431.897 null]
+1139 0 obj <<
+/D [1144 0 R /XYZ 70.866 431.897 null]
>> endobj
-198 0 obj <<
-/D [898 0 R /XYZ 70.866 416.657 null]
+222 0 obj <<
+/D [1144 0 R /XYZ 70.866 416.657 null]
>> endobj
-903 0 obj <<
-/D [898 0 R /XYZ 70.866 385.739 null]
+1149 0 obj <<
+/D [1144 0 R /XYZ 70.866 385.739 null]
>> endobj
-896 0 obj <<
-/D [898 0 R /XYZ 70.866 277.271 null]
+1142 0 obj <<
+/D [1144 0 R /XYZ 70.866 277.271 null]
>> endobj
-202 0 obj <<
-/D [898 0 R /XYZ 70.866 262.03 null]
+226 0 obj <<
+/D [1144 0 R /XYZ 70.866 262.03 null]
>> endobj
-904 0 obj <<
-/D [898 0 R /XYZ 70.866 231.113 null]
+1150 0 obj <<
+/D [1144 0 R /XYZ 70.866 231.113 null]
>> endobj
-897 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F107 565 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R /F160 682 0 R >>
+1143 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F107 725 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R /F162 890 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-917 0 obj <<
-/Length 1998
+1163 0 obj <<
+/Length 1993
/Filter /FlateDecode
>>
stream
-xÚÝZÉrÛF½ë+p«¢ñ,˜-Ç”â”SI9±u³]*„$T@@ÁØþûtÏB$L‹ä,‰ƒYº{^÷ôë!H“Û„&?ýpyö⥕‰!V)‘\Þ$š£T¢-'Š%—Ëä]ʳŇ˟!3’1ë\ï¯írS—‹s®MzÑ›UÙôy_µ N>ûñòìÏ3si¶2!†gI±:{÷&Kû9¡DX“|t3WI&‘ꨓ·g¿ŸÑ`'%\b?‚ÕŒê„qb“C»#4žµ8g”Òôò®+ó%ËMúª¹Y0™¶Ýjgî´ž „-­B%49”d”{ù/7M"ÖcáóÅËL €eŠh£0X-½€÷œËÑÚäݹ”*ýcuU5½àaAìnšoÜ4„ýê
-&W·u{½`i^_õn›WÍ‚Ñt³Ú—ŒKÞSI¿(4­–àÄ«~´âÃ&¶ÁÌZbÀc!
-ÞS*púÞf3b ‹sê¶
-¨FP ×øÆä½oöwAZ±é:@°þìK\ú ÿ•Ŧ¯šÛ8#•<€Ð; x
-»-¶”? TN‰R(J“…=î"~¬6CÚ6'«JD 5‹á™"ðާpÂn¥ œ±³hUc¬¢°YN¨µ æêYÔZ¨3=VÛ,tdŸ‘^LpYÆçÐË™ Lð±Þ˜å]ÐÇd¶W
-p2ù–Ñ=Ø¡¼.;ÿÜÞ 9w=²ÇÛUÓ”Á=í:zìú׺œQeåÙʆ–ÁUtSôÎ¥`x/3p¤5‘&lä›jP<%uÕñÀNc‹qI¼c%X¬7÷÷DM{R|¹|‘;£äÜùCÈ]`¹wrGQRˆ‘û©jÉ}ù ?Nîsh ä>ÒúrŸCm ÷‘ZX¦È‚[΢ƒe{ÑŠŠcÜÅ*æ¿Àí
-+êêÚ—†hÖVÁ*_ÄgÖˆ-ѻܚô¦kñâk-” ]éû`oµ®L„Á¦mΣµ~
-: £ö´Œ½!Îï°ôeѯãH”í
-?[*‹xòŸœÆãßSû½qo|··W4ë÷\ªI*
+xÚÝZKsã6¾ûWðHUÅÞ·&“šÔn%;öm&å¢)Úf…"½µ“ù÷Û €)ÑŽdÓ³»9Øñèn|Ýè¯!Š&÷ M~ºøÛõÅ÷ïJ,qZ‹äú.1”X­ã8Ñ,¹^'ŸREÌê’›^?´E¶íõÝŠÓ´i7YW6õê·ëŸ)QF€d¿Žì½øñúâ_ :iÂñÖËe’o.>ýF“5ŒýœP"œM¾ø™›D*&QX•\]üó‚F“)á
+›ø7À¨I'Ž15Þ‚f„NöÀ(¥ûMð° ¦&›xBOTB‰QN£š\
+J$åAþû]£ˆíTFüüþ½Ô#Œ™&ÆšL Ψ à3çj²6ùt©”Nß<Þ”u'xDÛûˆæG? Ýqsó›ûª¹]±4«n:¿Í›zÅhºÛJÆ%Ÿ©¢O
+MËuQw7Ýd!„ŠKlƒ{˜sĂǢ»?S*púÁf%q–õsª&µljÎ%§’Xã’Kt¢boHD"³}Dp#b¿Û× âˆÐ<"—Dä¶Ù õú[D§”88" ࡈµâ-"dÀãÛˆ‚
+Èå,¯MçeŽÎñ
+ŠˆŒgkxMœS3gh XÞ«D:C${6@`6–T“Ì3Â]p SM
+B©˜øè0}X¢ ÿ¿Píô
+à˲{7ú&ûi¦ï/ã@ÕwîÿaúZü&ô/N¡.€˜]‚þQgö$ú?Wí1ý/ax¤ÿ‰áÏÓÿZ#ýO´â·àY5ÇÿÄ"jàvà¤'¯öpéÓbµ’ÃÆ±«=%FÛ@ÿý |súçTûïÛ_C ¯“è«JÃÝ2ôÏœ%‚©èÿ…jgé¢u1ú?ßÂ#ÿ õ:Ÿ/âLògZAåáj÷¥~ø¹k›ê‰êà—Ç¢þǯ3©ƒS(ÔD3ýìKäJ»Ÿ«º+7E¨¸€aÅ ¡‰rªßR æB…4¼~Oyæ,½-úŽÊ¿êÀv'ÁÐñ5N€=†· ÝŠ¥ª©Ó]½Ìع~÷8Ô5‹oŽaÅgDÊOéaÅ…ÖÐ_ìu{|÷«FöøbCú$hÕòâõVEÂÀNQ©aiÝÄŽ,>-5¨«_€38èXû ë$”Xë8ˆ¿|øE(Â@´Õ··]V¯³vÝ ®ª-ÎüžL·eGa§°¢*oCiˆf
+6ÙªðfˆÑÒ{—;›Þµ ^|ƒ´-B쯭Ɨ‰0X7õeom˜‚NB㨀=­û^„ç·XzŠ"ï¶ýH/;
+AøC?ÓáÌzI¾`ÇÎ}øQ^¤ë0üå¡o¡ÖèWxÊ<l„à¡ÓBŸ±²èÝ¢ƒ)¦‹m\ác{À‚n0È£‹ueã½MúËÕÔê™M—1C=”÷XF|×'¤~ °ûÌØÅÞ¡3úâ0áM¡ñ”4Ju/§íÓh/_ÐY¹/¹g²0`Òïd’¼g_*bù9¿ ê¤ 7Pîÿ7S­ã ù©€‹YÖñâÖ“îû¶ «â14¸ŽŸ”ůQ™þ«¤é·Æ÷[û
+æ ?•øƒÞ þ;$D'ÜŽò·Ð_ïý„¢>„ø?IßÊ
endstream
endobj
-916 0 obj <<
+1162 0 obj <<
/Type /Page
-/Contents 917 0 R
-/Resources 915 0 R
+/Contents 1163 0 R
+/Resources 1161 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 843 0 R
-/Annots [ 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R ]
+/Parent 1099 0 R
+/Annots [ 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R ]
>> endobj
-905 0 obj <<
+1151 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 704.693 253.66 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__THREAD__STATES_ga39488769ed881a75703495759c0f109f) >>
>> endobj
-906 0 obj <<
+1152 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [257.146 704.693 286.055 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-907 0 obj <<
+1153 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 691.742 258.143 702.324]
/Subtype /Link
/A << /S /GoTo /D (group__THREAD__STATES_ga127cc7161bbef3ccd2446a9405973192) >>
>> endobj
-908 0 obj <<
+1154 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [261.629 691.742 290.538 702.324]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-909 0 obj <<
+1155 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 678.898 254.664 689.372]
/Subtype /Link
/A << /S /GoTo /D (group__THREAD__STATES_ga9a981e3dcd9264c2cf5bd8a8cc6f16af) >>
>> endobj
-910 0 obj <<
+1156 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [258.15 678.898 287.059 689.372]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-911 0 obj <<
+1157 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 665.946 259.147 676.421]
/Subtype /Link
/A << /S /GoTo /D (group__THREAD__STATES_gadcc691c6c7695988deba68a2de817a66) >>
>> endobj
-912 0 obj <<
+1158 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [262.633 665.946 291.542 676.421]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-913 0 obj <<
+1159 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 652.995 217.768 663.47]
/Subtype /Link
/A << /S /GoTo /D (group__THREAD__STATES_ga5c4aad6e2e289283e9c58031f7c4e228) >>
>> endobj
-914 0 obj <<
+1160 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [221.254 652.995 250.163 663.47]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-918 0 obj <<
-/D [916 0 R /XYZ 70.866 789.024 null]
+1164 0 obj <<
+/D [1162 0 R /XYZ 70.866 789.024 null]
>> endobj
-727 0 obj <<
-/D [916 0 R /XYZ 70.866 771.024 null]
+934 0 obj <<
+/D [1162 0 R /XYZ 70.866 771.024 null]
>> endobj
-206 0 obj <<
-/D [916 0 R /XYZ 70.866 771.024 null]
+230 0 obj <<
+/D [1162 0 R /XYZ 70.866 771.024 null]
>> endobj
-919 0 obj <<
-/D [916 0 R /XYZ 70.866 723.517 null]
+1165 0 obj <<
+/D [1162 0 R /XYZ 70.866 723.517 null]
>> endobj
-210 0 obj <<
-/D [916 0 R /XYZ 70.866 638.751 null]
+234 0 obj <<
+/D [1162 0 R /XYZ 70.866 638.751 null]
>> endobj
-214 0 obj <<
-/D [916 0 R /XYZ 70.866 579.128 null]
+238 0 obj <<
+/D [1162 0 R /XYZ 70.866 579.128 null]
>> endobj
-920 0 obj <<
-/D [916 0 R /XYZ 70.866 554.273 null]
+1166 0 obj <<
+/D [1162 0 R /XYZ 70.866 554.273 null]
>> endobj
-218 0 obj <<
-/D [916 0 R /XYZ 70.866 554.273 null]
+242 0 obj <<
+/D [1162 0 R /XYZ 70.866 554.273 null]
>> endobj
-921 0 obj <<
-/D [916 0 R /XYZ 70.866 521.725 null]
+1167 0 obj <<
+/D [1162 0 R /XYZ 70.866 521.725 null]
>> endobj
-922 0 obj <<
-/D [916 0 R /XYZ 70.866 416.51 null]
+1168 0 obj <<
+/D [1162 0 R /XYZ 70.866 416.51 null]
>> endobj
-222 0 obj <<
-/D [916 0 R /XYZ 70.866 401.27 null]
+246 0 obj <<
+/D [1162 0 R /XYZ 70.866 401.27 null]
>> endobj
-923 0 obj <<
-/D [916 0 R /XYZ 70.866 370.41 null]
+1169 0 obj <<
+/D [1162 0 R /XYZ 70.866 370.41 null]
>> endobj
-924 0 obj <<
-/D [916 0 R /XYZ 70.866 265.196 null]
+1170 0 obj <<
+/D [1162 0 R /XYZ 70.866 265.196 null]
>> endobj
-226 0 obj <<
-/D [916 0 R /XYZ 70.866 249.955 null]
+250 0 obj <<
+/D [1162 0 R /XYZ 70.866 249.955 null]
>> endobj
-925 0 obj <<
-/D [916 0 R /XYZ 70.866 219.038 null]
+1171 0 obj <<
+/D [1162 0 R /XYZ 70.866 219.038 null]
>> endobj
-915 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R >>
+1161 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-930 0 obj <<
-/Length 1537
+1176 0 obj <<
+/Length 1542
/Filter /FlateDecode
>>
stream
-xÚ½XK“Û6 ¾ûWèhÏÄ,ßsì¤É$ÓNÒÄ·$³#Ë\¯¦2µ‘å¦é¯ø²-Yq½»N/–LAÀGàgë g¯&¿.&¿¼Ô"Ë‘–’e‹ÛLa”K™)M‘$Ùb•}œr$gsªòéâ®5Å*Ü¿¶·3ЧM»)ºª±³Ï‹7ç Å@³
-·:ùm1ù2!°ˆ3²WŸç(§<+7“Ÿq¶‚go2Œ˜Î³¯^r“qʸSVg&Nð1d.G K‚pÂüÂ|˜ÚÊcó€‹.\ëÊšpGˆ
-7Ím¸ºWêøð¯ÍýM¹ÝÝß7ílÎñ´C%òÛÁˆ
-Å]^‚ÕœÍ8bï:DŸÍ ÆØé<õ @ZñLÑö/ιB¢÷þð~è'#)ƒ*¢e€Pَѳ#Žó›=ÖÀdò*À¹D üÙÞ*GpK QÖW±*s¤„î[]×Ͳ¨GìjŒ´¸ŠY ~© ™ub• ²êf)ш1Õ·kgjºÛ
-]Eñ»•PQ¸ñŒ&ÀaÑãTž#ÏCíbReª?Õ¬¥aùÈ‘ùcÍöê7JO5é[ýÐìÚ2Öb@P
-y's'üÓpü S„‚*(†ôOâãTˆó*þ3ÆÐ1NʑԖå4!À}ypß{ÓíZ;Nö¡ûsÄ9ÏæpÅ4zq]Ë¡¿ïŽŽÿÊ®Œ‹Â?ý´KïeWý=ƒø˜ãw}˜À’‹9$ªB€G‹Õ6ˆÞîlyˆvYÄ›¥I umö(¢5;#bú-
-4¶ غ`{‹Ú oé5`åT¬œª) ÞÞÙ®Ú˜ðè®Ø†›&)vrKclX†hZÂýqEO_³sµÆ“³ÙƇµG<R‡¥Û¶Ù„а°­ìºŽ\1¶¦4ÛmàUuDa;;#Ó{cÿx7R‡9ÖHPšÁ!Cä°÷ç¦Ð¯ B­›qñzâÅIèÖæ1Mâ‘å¼A5A×â@XÇa8Z–ÞðßG×ËøF V¾ÞUå]¼uÂÍ®^jXn‰½#­‰j—®éüÄhÑÖN#oö&Ztž ûðf‡‡Áq{d…ÿ÷àsÐåˆVït´u`ض‹¬)dsƹØÛ6Pð_ÇÓ6‘¥‡äh#‰×m3ž.=‰ÕG6Ÿ…E`Li™·)¶a‡ÃŒM&OX•$TI8mÀ9²ŸDâDŒñéÆ;½îª{Ç\ÆXàg §—¶á!l(¬ú Šk6,^bƒÝ&EƆ§¯ník2Ï·R„ËÎV_v&‰/¸uß¿T®Ñß›ß4v=å€5%6Û'…3 yXÂ}çhéž$ZöÄ÷:©1,f¸m× ÞóD(ê]ü Ð6 z–qqæ›dßÑÜëHÜŽ ]]îC‘w¸÷VÛ±­ϕߔx®ÚŸM¼ræ’™LóŸ6’ñã‘L\2’qåÆ}‘Ì©"좉ì¡VO'²kàŽÙ1îóÙ5ŒÆ¬ï¬“J œ±«˜TЖQÖ3 Å7ÞEŒÃ4E.‹ä%c‘ø9cÌzˆˆ<ŒEXýOcôw(ìI-óÓt„±| ȯ3qÈPš‹ Æ¢Gš‹zV¯6=ái|@×úi1~¸ŽŽEƒsý´±ˆ†×ɰ¡KMÕX£ç#ø1它Þ>Åi Õb?·\Øþµf ñ|v®½„&áÌ|uÉáK)yÌé{¦ ƒÃC¾ò¦ÒpF+wbï¿îr´cÊ+cMš/6nèe[…›¦Œ_xYÜNw„>Çú¹ˆÿâ'ìôE»3õ'*âÇî·ý 8¨XŽ ‚è¡ôJz6ÌâŒ&™÷©ñsН–­o¿÷ýÔqoõ¢ñ´ù¶öÆ]ü6u’
+xÚ½XK“Û6 ¾ûWèhÏÄ,ßsì¤É$ÓLÒìÞ’LF–¹^MeÊÑ£iúë >d[²âzw^V2 °8Ù$8y5ûõvöËK-’i)Yr{—(ŒR)¥)’$¹]'ç4]|¾}“0Á' öùÕ·Õº+ÍbIU:QåÝÖØ6k‹Ê:áÙo·³¯3²8!{iŠRÊ“|;ûø'køö&Áˆé4ùæ%·  îl”ÉÍì>ÆÉåNIî¾0Ÿ0¦¶ð(<°¬ ϲ°*!ix©îÂÓméÏñçv÷%oºÝ®ªKŽç-Ê‘?FT8(îñ
+ ¬Ž°àdÉ(À†@
+QÄK‚1v:O=BˆBZñDÑÎ/ιâ ÷þð~'#)ƒ*¢e€PØ–Ñ ³#ŽÓ›=ÖÀdò*À¹D ü9
+ÜxFHà°p*Ï‘ç¡v1© %Ÿj6ˆÒ¸|¤Hˆô±fõ›@¥§š ­ÞT]ÇZ ²C!/ì݂ṫËTÌ·þ :E(¨‚bHð$>N…8¯â?cüÓ¤œHm©Q
+AÜ—÷}0mWÛi²ÝŸ"Îy²„'¦Ñû·÷Ñõ±ú÷X¤bÖÆEáïá Úöû²¼-þZ@|Ìñ^&°¤Àb
+‰ª
+Z´ÛÈ›ý-:Ï…sx³cŒãาÂïøt9¢•{Ö´‘59lÉ8÷{W
+þãXcê*²ôu$qÏu[M§Ë
+×èïÍo+»™ŠrÀÚ'6Û'…3 y˜Ã{ëhé¾ô´ˆïtRcXÌp¿­kGû<²²‹?¡Úª5AÏ*.®Ã|ÓÛw4÷:znG®.¡Èƒ;ܾu3uôqâ¹òÛ'ž«ög¹d&Óâ§düx$—Œd\¹±D_c$sª»h"{¨ÕÓ‰ì¸ãDvŒûü@v £q :k¤(eì*&´e” LBñí ïÇ"Æaš"ŽEò’±Hüœ±f=DDÆ"¬þ§±ú;”
+ö¤–ùi:ÂX¾¤×‹8d(MÅcÑ#ÍNŽE«W‹Žð4> ‚ký´?\ÇÇ"ŽÁ©~ÚXDÃv2nèú¦jªÑŠóü1y×BoßÇ©j±Ÿ[.lÿj³x>;×^B“pf¾ºäò¥”>æö=S„‚Áá!ÿåíÿ -UîÆ¾K¨ÄHC ¸
endstream
endobj
-929 0 obj <<
+1175 0 obj <<
/Type /Page
-/Contents 930 0 R
-/Resources 928 0 R
+/Contents 1176 0 R
+/Resources 1174 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 934 0 R
+/Parent 1099 0 R
>> endobj
-931 0 obj <<
-/D [929 0 R /XYZ 70.866 789.024 null]
+1177 0 obj <<
+/D [1175 0 R /XYZ 70.866 789.024 null]
>> endobj
-926 0 obj <<
-/D [929 0 R /XYZ 70.866 759.174 null]
+1172 0 obj <<
+/D [1175 0 R /XYZ 70.866 759.174 null]
>> endobj
-230 0 obj <<
-/D [929 0 R /XYZ 70.866 743.933 null]
+254 0 obj <<
+/D [1175 0 R /XYZ 70.866 743.933 null]
>> endobj
-932 0 obj <<
-/D [929 0 R /XYZ 70.866 713.016 null]
+1178 0 obj <<
+/D [1175 0 R /XYZ 70.866 713.016 null]
>> endobj
-927 0 obj <<
-/D [929 0 R /XYZ 70.866 507.107 null]
+1173 0 obj <<
+/D [1175 0 R /XYZ 70.866 507.107 null]
>> endobj
-234 0 obj <<
-/D [929 0 R /XYZ 70.866 491.867 null]
+258 0 obj <<
+/D [1175 0 R /XYZ 70.866 491.867 null]
>> endobj
-933 0 obj <<
-/D [929 0 R /XYZ 70.866 461.007 null]
+1179 0 obj <<
+/D [1175 0 R /XYZ 70.866 461.007 null]
>> endobj
-928 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F107 565 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R >>
+1174 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F107 725 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1012 0 obj <<
-/Length 1802
+1262 0 obj <<
+/Length 1851
/Filter /FlateDecode
>>
stream
-xÚí[[¯›F~÷¯àÑHñfï»DêKÕœ¨Q£¶É‘úpNdùâ ØØµ¡éQÕÿÞYn1ö‚Á§MÏ“/ ßß|3³³
-#-¥£<Š$qn}çnL¥ûþöµÃGœ08/ý÷ÍÚO–;¡JXÏ“Uų8\GæàÑËÛÑï#Çb‡”˜Z#M¹3_îÞcLJ±×FÌÓÎçôÈ•ÃC‚›9–λѯ#œÛ‰æ«ùÈ­&X9„"±o·$†s¤Ü Ás¹¯·ŸÀ\ªÇï>ζa´H µÏÃc¤„' <v& ~1™!¿Œ\5†KÞ¦W¼«"åŸÏo¸Ü#–H¤´r&”#Lr˜{JEå\çn"„‘K0àçc†Ãí"'ómz”a}7ÿøÓøqb˜Ñ¿êNÖˆPgBòDnƧÕf
-`ÓåÚ%büÙÌlm˜ßeîf4û|Öl_»3º˜7áñNx‹$ôáÂç“è“KÁV¿ [vž%ñº MŸ@Ã9³¢ÊlF|³e<ç-ÍL6›FqÑh½õ[»\¶w‘=ér)»i€OøGáNfž¢QÑ@~¸‹·gÄ8|0rLâ ðw;‰zä¢YŽ‘U‰L»ð­ZËÈöDìI9I»àuÊ
-Χ«Ù.vIMTÝckQÆ õ(žVi„U›çx`7M¯œŒ$ÓÅÚìcf?¸:`G“â˜åznbý™[Š?»˜ôçb¹~˜-§qèƒi¤j2ä kC¾0$O¬dþp©¯C¿GAä§<@Ô@<q8S×â ÂY÷ÏÄ}°µå<ÕCxðX ÕpÃòFC†#!{YèAD@ãƒS½ÍMïÍóu$WÛj´ÉŒ f{ã•˘F³UÍQµDC_¨EKJ\‹OXéad[N Úµ»¦ñB‡­è¿Æ5mˆ¶r 3ÛíªR·Ò½ £ÅÒÔî"‘W+I$]' ¢ß”§`˜„ âB^‰$ðˆY$ôNRº"^o‹î$B£p¸%!—]ÂëÂ%!]ÁêAŠ)ƒ¶w3‹¡Ÿ£0žò³˜žO“¥ s ½–ô|¤½¼tÔì¶ÖN¸|p9ÞËZ*p GJÒjgµw^rxÞÞØ.¶ÿŸ¶Ý䋽 e5
-HŽøC/ ùåÜ¢Èx…!ÊK÷ÃH ÷à î‡Ë;t?é„I9#ÛófMé~(]m¬“ÿ€
-ÐO) ’RŸœ“¾ª
-×^eñ ‹Ïã‘À©bQ,eˆRÞM²•€ÉÂĈbzüðcm+Î5,ǽnÚ*µó(‰V7Øé·+Tå»ý½”àæÚ¢ŸjKŸµE~©-}µ\'jKÝvGOµÅß6^h»x)nIØãåÔ ‹¬¶ˆëÔýÿ¬-â‚€9][¬" ¶ØÅÜ[m¹,VÈð±b{¥zo¸²/ô/JD•äYRÃÈ㎄øËðU™Wë?³geŸ7Û0ß0È_ ,û¤¸øFè ì½ù¯æíõ6ûñcË{*ò8~ÞÑ›_JÒ!·*¦³p"ˆÚ¶’+vƒ"Yé™·I‡«ümȟ‡íÌ8³Ò7v‹w%Ó]ÎÇEz@rügxý„
+xÚí[[›F~÷¯àÑ–âÉÜgˆÔ—ªÙ¨Q«¶ÉJ}ÈF–×&»64ªþ÷ža€€=`°ÁIÓ}òeà›Ãw¾s™°÷àaïÅèûÛÑÓ_xùR2ïö§0ÒRzʧHïvé½ ¤'Sªôø÷‰ÄãÍîƒýõúý|F“··/=ΊfzõÍ¿£ç·£?FþÄ)€µFšro±½y‹½%Œ½ô0b¾ö>¦G®=.
+¶.›°e'ìyošÐô 4œ1+«ÌZ
+à#˜¯à9oif²Ý6zˆ‹@›Ý²µËe{Ø“.—²%‘%‰àþQ¸“™§hT´Ð2ÜÇ;È3bÞ9&qû»D}rÑ,ÇȪ@¦]øÖ­å@d{¢ö¤ˆ¤]ð:e
+\‡Sáˆ+=p‹™A½nßô"_³f§_oÚmå¨ü¼miêVÀ÷aô°2| H$ÅÕêI»…aœ “S8AÖÖ×a \bZ…þYJ;ãÍ._%‚¨àJh×rÙ%Â.l )(‹*DDŸœÁúw;aaFa<ãgQDŸfKÁ‚ôZس‘>6õÒÑ¢«vÂÕý„ãò˜][g`M$6þJç%‡ç•Æö±ûÿtýíPA¶ÃØOØPV#äˆ 8ôòp‘bέŒŒW(¢¼ð?Œ´ð?œÐ฼Cÿ3‘N˜3²’
endstream
endobj
-1011 0 obj <<
+1261 0 obj <<
/Type /Page
-/Contents 1012 0 R
-/Resources 1010 0 R
+/Contents 1262 0 R
+/Resources 1260 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 934 0 R
-/Annots [ 935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 951 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R ]
+/Parent 1266 0 R
+/Annots [ 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R 1198 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R 1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R ]
>> endobj
-935 0 obj <<
+1180 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [119.604 703.425 167.45 713.693]
+/Rect [119.604 704.887 167.45 715.155]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gadcaf200537aaa0218a60c398438f81be) >>
>> endobj
-936 0 obj <<
+1181 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.777 691.362 158.824 701.738]
+/Rect [94.777 692.824 158.824 703.2]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea7ed3535e3c97c9c2ce299addd74b4a01) >>
>> endobj
-937 0 obj <<
+1182 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [184.501 691.362 248.28 701.738]
+/Rect [184.501 692.824 248.28 703.2]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea2a987351b9605b918693a17d4dd90772) >>
>> endobj
-938 0 obj <<
+1183 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [273.957 691.362 382.424 701.738]
+/Rect [273.957 692.824 382.424 703.2]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea52b66fc7ba82beb3d6fbdb82a6ef045d) >>
>> endobj
-939 0 obj <<
+1184 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [408.101 691.362 468.401 701.738]
+/Rect [408.101 692.824 468.401 703.2]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea270b6b98ec2f9ec4832f7a59b0a0d532) >>
>> endobj
-940 0 obj <<
+1185 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.777 679.515 182.477 689.783]
+/Rect [94.777 680.977 182.477 691.245]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beae4b8e84801f56fdb39472c45762bd051) >>
>> endobj
-941 0 obj <<
+1186 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [205.662 679.515 271.44 689.783]
+/Rect [205.662 680.977 271.44 691.245]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beab1e0332cc09c1f3ee029b9fcc1c40ba0) >>
>> endobj
-942 0 obj <<
+1187 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [294.624 679.515 357.677 689.783]
+/Rect [294.624 680.977 357.677 691.245]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea9a4a0dce1e919688bcd27411746b7ad8) >>
>> endobj
-943 0 obj <<
+1188 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [383.354 679.515 446.137 689.783]
+/Rect [383.354 680.977 446.137 691.245]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beaa0f903270046d7a28b002855648da9f1) >>
>> endobj
-944 0 obj <<
+1189 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.777 667.56 154.081 677.828]
+/Rect [94.777 669.022 154.081 679.29]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beadb87fc98ffc6440f53caa1f5d6606512) >>
>> endobj
-945 0 obj <<
+1190 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [179.758 667.56 244.541 677.828]
+/Rect [179.758 669.022 244.541 679.29]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beabbef146a7c8d44992e9c61bec2309348) >>
>> endobj
-946 0 obj <<
+1191 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [267.725 667.56 392.582 677.828]
+/Rect [267.725 669.022 392.582 679.29]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea28ae6227a8117b9f39b797caf3211313) >>
>> endobj
-947 0 obj <<
+1192 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [415.766 667.56 501.924 677.828]
+/Rect [415.766 669.022 501.924 679.29]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea4132f477daf882e74036a9062a97b7a3) >>
>> endobj
-948 0 obj <<
+1193 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.777 655.497 157.327 665.873]
+/Rect [94.777 656.959 157.327 667.335]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beac30b06c765f4623efb929a141ff9457e) >>
>> endobj
-949 0 obj <<
+1194 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [187.989 655.497 250.271 665.873]
+/Rect [187.989 656.959 250.271 667.335]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea7d1b46242e62919d0c5af733553351c3) >>
>> endobj
-950 0 obj <<
+1195 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [280.933 655.497 387.902 665.873]
+/Rect [280.933 656.959 387.902 667.335]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea14900e8333498e699db5038b413fa53a) >>
>> endobj
-951 0 obj <<
+1196 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [418.564 655.497 477.366 665.873]
+/Rect [418.564 656.959 477.366 667.335]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea2816d8223370b9c78f554321cd308b53) >>
>> endobj
-952 0 obj <<
+1197 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.777 643.649 174.999 654.124]
+/Rect [94.777 645.111 174.999 655.586]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea3dd2ff18afe8c14f3076694e52942ee5) >>
>> endobj
-953 0 obj <<
+1198 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [206.066 643.649 282.809 654.124]
+/Rect [206.066 645.111 282.809 655.586]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea1fd38bd33c374db6667332f011a980d9) >>
>> endobj
-954 0 obj <<
+1199 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [313.876 643.649 378.157 654.124]
+/Rect [313.876 645.111 378.157 655.586]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea9a30ec9215efb0a584597aeda2c03e19) >>
>> endobj
-955 0 obj <<
+1200 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [406.635 643.649 476.134 654.124]
+/Rect [406.635 645.111 476.134 655.586]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea317dd63053ef79e3b3cea2ce2b676b38) >>
>> endobj
-956 0 obj <<
+1201 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [138.63 571.045 204.4 581.627]
+/Rect [138.63 575.385 204.4 585.967]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga721f06c8017479ccc6cb46ae0552b597) >>
>> endobj
-957 0 obj <<
+1202 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [207.885 571.045 236.794 581.627]
+/Rect [207.885 575.385 236.794 585.967]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-958 0 obj <<
+1203 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 557.385 199.199 567.967]
+/Rect [113.489 562.52 199.199 573.102]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gaa290fe71698081e26ec234a234d2fdcc) >>
>> endobj
-959 0 obj <<
+1204 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [202.685 557.385 231.594 567.967]
+/Rect [202.685 562.52 231.594 573.102]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-960 0 obj <<
+1205 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 543.725 182.755 554.307]
+/Rect [113.489 549.655 182.755 560.237]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gada4a8fc8b0a17d3109acdeaf2c9443ea) >>
>> endobj
-961 0 obj <<
+1206 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [186.241 543.725 215.15 554.307]
+/Rect [186.241 549.655 215.15 560.237]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-962 0 obj <<
+1207 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 530.065 202.696 540.647]
+/Rect [113.489 536.79 202.696 547.372]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga06dfab09153c455fcaa609e97846b0d5) >>
>> endobj
-963 0 obj <<
+1208 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [206.182 530.065 235.091 540.647]
+/Rect [206.182 536.79 235.091 547.372]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-964 0 obj <<
+1209 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 516.405 177.393 526.987]
+/Rect [113.489 523.925 177.393 534.507]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gafc4e7d07089576fe946c42777ef191cc) >>
>> endobj
-965 0 obj <<
+1210 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [180.879 516.405 209.788 526.987]
+/Rect [180.879 523.925 209.788 534.507]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-966 0 obj <<
+1211 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 502.745 197.334 513.327]
+/Rect [113.489 511.06 197.334 521.642]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga134f0e9d82a69403d9e167dbbf7ae731) >>
>> endobj
-967 0 obj <<
+1212 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [200.82 502.745 229.729 513.327]
+/Rect [200.82 511.06 229.729 521.642]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-968 0 obj <<
+1213 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [138.63 489.085 200.419 499.667]
+/Rect [138.63 498.195 200.419 508.777]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga794e820b3c076c766cef93bb414908cc) >>
>> endobj
-969 0 obj <<
+1214 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [203.904 489.085 232.813 499.667]
+/Rect [203.904 498.195 232.813 508.777]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-970 0 obj <<
+1215 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 475.425 195.218 486.007]
+/Rect [113.489 485.33 195.218 495.912]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gaa7d615b194c12278b00841852b0dff2b) >>
>> endobj
-971 0 obj <<
+1216 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [198.704 475.425 227.613 486.007]
+/Rect [198.704 485.33 227.613 495.912]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-972 0 obj <<
+1217 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 461.765 204.408 472.347]
+/Rect [113.489 472.465 204.408 483.047]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga4bec24e63a011cc0bfca98e79f3c0b93) >>
>> endobj
-973 0 obj <<
+1218 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [207.894 461.765 236.803 472.347]
+/Rect [207.894 472.465 236.803 483.047]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-974 0 obj <<
+1219 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 433.115 211.662 443.697]
+/Rect [113.489 445.31 211.662 455.892]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) >>
>> endobj
-975 0 obj <<
+1220 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [215.148 433.115 244.057 443.697]
+/Rect [215.148 445.31 244.057 455.892]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-976 0 obj <<
+1221 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [353.969 433.115 401.815 443.697]
+/Rect [353.969 445.31 401.815 455.892]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gadcaf200537aaa0218a60c398438f81be) >>
>> endobj
-977 0 obj <<
+1222 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113 407.5 216.159 418.082]
+/Rect [113 420.489 216.159 431.072]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gaed75fbf8e655bc644d585a48e810bcfc) >>
>> endobj
-978 0 obj <<
+1223 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [219.156 407.5 248.065 418.082]
+/Rect [219.156 420.489 248.065 431.072]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-979 0 obj <<
+1224 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [355.728 407.5 403.574 418.082]
+/Rect [355.728 420.489 403.574 431.072]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gadcaf200537aaa0218a60c398438f81be) >>
>> endobj
-980 0 obj <<
+1225 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 381.884 211.662 392.467]
+/Rect [113.489 395.669 211.662 406.251]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gafb31932f7af41b5db5e7d80b21926853) >>
>> endobj
-981 0 obj <<
+1226 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [215.148 381.884 244.057 392.467]
+/Rect [215.148 395.669 244.057 406.251]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-982 0 obj <<
+1227 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [353.969 381.884 401.815 392.467]
+/Rect [353.969 395.669 401.815 406.251]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gadcaf200537aaa0218a60c398438f81be) >>
>> endobj
-983 0 obj <<
+1228 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113 356.269 216.159 366.851]
+/Rect [113 370.849 216.159 381.431]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gaf047657f8ff072f15174f03ff80b4882) >>
>> endobj
-984 0 obj <<
+1229 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [219.156 356.269 248.065 366.851]
+/Rect [219.156 370.849 248.065 381.431]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-985 0 obj <<
+1230 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [355.728 356.269 403.574 366.851]
+/Rect [355.728 370.849 403.574 381.431]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gadcaf200537aaa0218a60c398438f81be) >>
>> endobj
-986 0 obj <<
+1231 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.451 346.029 230.56 356.611]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_ga9a4e5434d7a476580c6ef7ad2c776bb5) >>
+>> endobj
+1232 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [234.008 346.029 262.917 356.611]
+/Subtype /Link
+/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
+>> endobj
+1233 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [372.65 346.029 420.496 356.611]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gadcaf200537aaa0218a60c398438f81be) >>
+>> endobj
+1234 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.31 330.654 210.701 341.236]
+/Rect [107.31 321.209 210.701 331.791]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) >>
>> endobj
-987 0 obj <<
+1235 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [214.759 330.654 243.668 341.236]
+/Rect [214.759 321.209 243.668 331.791]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-988 0 obj <<
+1236 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.899 305.039 216.276 315.621]
+/Rect [107.899 296.388 216.276 306.971]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga9ef4cfec5c836de61180767240c7f380) >>
>> endobj
-989 0 obj <<
+1237 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [220.923 305.039 249.832 315.621]
+/Rect [220.923 296.388 249.832 306.971]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-990 0 obj <<
+1238 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.31 279.423 210.701 290.006]
+/Rect [107.31 271.568 210.701 282.151]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gad49ead8c4196b726b6f04d4b1d53d01d) >>
>> endobj
-991 0 obj <<
+1239 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [214.759 279.423 243.668 290.006]
+/Rect [214.759 271.568 243.668 282.151]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-992 0 obj <<
+1240 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [107.899 253.808 216.276 264.39]
+/Rect [107.899 246.748 216.276 257.33]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gab1eac772e1ef6ddc3a8512c00a4e78be) >>
>> endobj
-993 0 obj <<
+1241 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [220.923 253.808 249.832 264.39]
+/Rect [220.923 246.748 249.832 257.33]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-994 0 obj <<
+1242 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 228.193 211.662 238.775]
+/Rect [113.489 221.928 211.662 232.51]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga5f02c0e2081859da86664bfeaec6de62) >>
>> endobj
-995 0 obj <<
+1243 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [215.148 228.193 244.057 238.775]
+/Rect [215.148 221.928 244.057 232.51]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-996 0 obj <<
+1244 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 214.533 211.662 225.115]
+/Rect [113.489 209.063 211.662 219.645]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gac9f8cad27477155b583b54848887997d) >>
>> endobj
-997 0 obj <<
+1245 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [215.148 214.533 244.057 225.115]
+/Rect [215.148 209.063 244.057 219.645]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-998 0 obj <<
+1246 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 200.873 216.647 211.455]
+/Rect [113.489 196.198 216.647 206.78]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gaf293aeef6b6f673f2d824171d6ec20e3) >>
>> endobj
-999 0 obj <<
+1247 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [220.133 200.873 249.042 211.455]
+/Rect [220.133 196.198 249.042 206.78]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1000 0 obj <<
+1248 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.489 187.213 216.647 197.795]
+/Rect [113.489 183.333 216.647 193.915]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gad99af80b23202044e80aaed7d711b9ac) >>
>> endobj
-1001 0 obj <<
+1249 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [220.133 187.213 249.042 197.795]
+/Rect [220.133 183.333 249.042 193.915]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1002 0 obj <<
+1250 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.195 158.563 214.085 169.145]
+/Rect [113.195 156.178 214.085 166.76]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gab516cbd738ec072f4929faecbbc456f9) >>
>> endobj
-1003 0 obj <<
+1251 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [217.277 158.563 246.186 169.145]
+/Rect [217.277 156.178 246.186 166.76]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1004 0 obj <<
+1252 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [115 132.948 220.875 143.53]
+/Rect [115 131.358 220.875 141.94]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga305bbe90a798fdc8347aa809978365f5) >>
>> endobj
-1005 0 obj <<
+1253 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [225.871 132.948 254.78 143.53]
+/Rect [225.871 131.358 254.78 141.94]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1006 0 obj <<
+1254 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.195 107.333 214.085 117.915]
+/Rect [113.195 106.538 214.085 117.12]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga20f319fbf345661d19fc6bfd325231a5) >>
>> endobj
-1007 0 obj <<
+1255 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [217.277 107.333 246.186 117.915]
+/Rect [217.277 106.538 246.186 117.12]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1008 0 obj <<
+1256 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [115 81.717 220.875 92.3]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga91d58a0a222e1f75e1d5d65b8ece3645) >>
>> endobj
-1009 0 obj <<
+1257 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [225.871 81.717 254.78 92.3]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1013 0 obj <<
-/D [1011 0 R /XYZ 70.866 789.024 null]
+1263 0 obj <<
+/D [1261 0 R /XYZ 70.866 789.024 null]
>> endobj
-728 0 obj <<
-/D [1011 0 R /XYZ 70.866 771.024 null]
+935 0 obj <<
+/D [1261 0 R /XYZ 70.866 771.024 null]
>> endobj
-238 0 obj <<
-/D [1011 0 R /XYZ 70.866 771.024 null]
+262 0 obj <<
+/D [1261 0 R /XYZ 70.866 771.024 null]
>> endobj
-1014 0 obj <<
-/D [1011 0 R /XYZ 70.866 722.85 null]
+1264 0 obj <<
+/D [1261 0 R /XYZ 70.866 723.517 null]
>> endobj
-1015 0 obj <<
-/D [1011 0 R /XYZ 70.866 590.578 null]
+1265 0 obj <<
+/D [1261 0 R /XYZ 70.866 594.122 null]
>> endobj
-1010 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R >>
+1260 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1065 0 obj <<
-/Length 2534
+1331 0 obj <<
+/Length 2352
/Filter /FlateDecode
>>
stream
-xÚµZK“¤6¾÷¯ b/TÄ”¬7ÈGoÏÌ®×ÏzÚáÃŒ£‚u1” poï¯ßÔ
-êÕÝ{B )3•ùåC8X8øxóÃÝÍw”b¤¤dÁÝCaKDŠ"I‚»,ør-–4ŠÃ߇Õþ›{û¼Iöy¹^üq÷cÀ9C"b@ÓΠ‘ùzóþîæÏq@zÂqŒbʃt{óådÐ÷c€SqðhGn.€7ÄŠàóÍ¿o°#*LÓ<¼èGÁ(J…—áôˆ,–cÞê&É Áh ouºÏwM^•VÜŽÏw¸hKÊ‘±£w·ÑµŒ…m™šÙµ{Möþ{[[Œ‡ f4æ>çÛ]¡·ºl¼Ö@|‰Œ¨•žH…(:%þm·OÖÛd±” yµÝ¹ÆP³sG2Æ
-IÉ»™ïæ¨óáˆyÚµöË™2 D!!È+8˜,Y¡HKBÒ¬A…žáÉbÄ@ëž`Rf³J‹çñéum“ºÑûÙUa„cÕÍNaí ‹ˆ°M›zOää&R üd ì$ ×ÿ}£K°¬’á„+ŒUí[QU;;ùÝbÉ0 ›¶ÈP‘‡ŒÉò‹ è)÷iˆ&óÚC^t’n…êÁ}¢®QçëÒ ÚFGvT[?3:ê–¡änØ}îyçe£×Ú3kžvÚbÀ@ßZJ¸?nr'‡/(ÿZPj÷Å ÄÃ2ÙúVÝ>|ŘþÇ.´žµňˆ>n¬ø¬‘¬§'·ï‰´sT"¤;K¥ç³Šçˆp$;H¡èÎyiàDQY¼Þô6(‘Z$orÞƒ€÷_z°Ãü~Ö_›8DR‡uuè3>9Sð®Æ&w€…h_•Å“ke&lZ'Éï-ÂloªŸxŸ›k¤Ìú†kÕéFg­óónd6OëK†®y¹ïÅ»qYd¿öéä×7Á;fµú¶Ý¥+ï/«Úr[åeÞ88õqÝ·^`~ºÌ¼¯/y¤Â_ìJíH/© P¶&E1–·Ô:Ó™quˆ÷04õ#ng|(7‘ˆà0éÌÚk*÷¼÷ºÖf)ÎkÒ¶étìuaÛIiö/ë¼÷CCl³×‰Ÿ’&å˜r¦ëå"ÜæeG8ñbÔUUŽ¿8ü@Ùʹv‰k(ùa=H¾••‘ë±ãÀÇËÛ' ’Í/½:%˜^º%›¶×çÈY^ï’&ÝC
-R_
-¾/&·zŸøECAx·àqÉÏ—‡UÚšj-™ˆs\Ö‹–i_jÇÖ¥„Qá E/æ}ùT§F%à"+“O•§K?Ñ1UÞÕ†1ú¸3{'ÔóaÈ—±Ð:Ô"ÆÛÇ
-¦2»ävF`y(šýx/Q½ÓižùÍ*tvVCè˜$ëbN¶roàÐrãzLÊT¯G7ùEbu”ŽÉ•´
-«Ì.ôd†8{#ØWÓðqkÈ@RGÏÝ”E—îè™ÕZI-ö‚À8lÄGò¿&8ªGèä:çxRÖè¬Tç½ÐO>¦“ó@¶™
-!Pà Ï…-97ÿ>à¨O ¾P=nÚ1žµì±­WòÆ\À)f«[Ö]*›½\® böæ:u޼”
-‡w{«g†Vm‘¹!÷~vâ^wÔ b÷á–z5ê6A ¶DßüǺ®`£e¯DMï#ï®çˆP3×O^ÄwÝ9Ow÷¹íNaÍïþc›7þ$õ©Ûêå¶Ï÷6ýÅ÷<¸¯µÍ˜æÄ›ñWaûz]–œÁÅôšß·ºÌ$¢‘äƒß´ <—Ò[å£.ÍÏá÷ü°Ï]ãVûÍ6ñ{-Š»¡ßcõ½`Ý^”ö¢ÿ,]|¥Bº×_vºüùS_íÀ‚#»ß1 ÜadZïŒÄ0¦?Àüµ-ý-(þ)¿ßÛ£÷þ‚~xY[ً˧µ ÇÛ5€Ìÿ
+xÚíZIãÆ¾÷¯ XåÚ‹ô1é±Ç;ž6r˜16Y-#‘ŠHzÒùõyµ"%RKz
+IÁ% ­À(VŠvYð~.„ ÿ˜Q–yæÇŒh»¥—ñW;‹q.7Ût‘åU½xš1–»EeTKy‘× ~Hšq~ÀO’ ó Œ³¨ ÁîqƒT=HD£ªµîŒ™™~ -GqDÚ9ë2~3›3‰Cä«Y–užÙ2aa•®´Ýºvm†e9ŒŠ0£ÖÍÙ®“ªÎk½› , xæ,ˆbÌ A±nâ)¾œ!Ưd[>Í[ÞsÊèI6Š~è5fß6ÛíåäbÑuZXò÷3åèÓÓ»¨Š_%~Uïfs°€ÒC`¨„å™é^E6!˜Ó˜¡HÉáf¦«¦ø~@†þ11ÛÎÑçú'äyÿliÓHÝÂA9R*z™ƒÒ(Xò:2rà Ã#Š#$öLoî Í¤‡ÆcröÆ<”aÒñ™‘pÜà–’ëݨcO«n$ù 7åi7¥ ÿgzik§)À²ç¥^ŹßLp7Nâáfv+!c_à¬êK$Óèk2½q2•ü‹$ÓQ6·K¦ãäo—LGéß:™“ÉÔ‰p˜LåÅÉT}‰d}M¦7O¦ãú*ÉtÜn—L§ÜèVÉtœþm“©õÒ%S»òl2¥
+E±üìd*;g­u²9Ó‘Ê[ø¨¢HqþÂ$:ôD#P›DÏx {áë‚ðÂxà¤GB°+I?Î8îkÔ‚PN: é¬bvo/𖝨)¥d„ø•Þ¼°Ö¶ýDu<:s1“3q³O²i¤§#˜}¨ƒ¸¸Æˆ½t$åÀRêE½>#ðO£ö©^÷–ñdW£ä…po‰wp§ˆJ2Äû$c*Q Îq&oxòj€7 ávmÒ‰È}쇑}¼¤yýÈ>Ê÷âÈ~è£Äoô¶Dú¹fÙÕkFöèÿ$²×9Äö/ÙÇñþZ‘]î#û8àoÙÿ·
+ÛΤÜMÿçJ®%]pk³«ð¤ 0•[>°ž·Mj½Ò0êP‹²üÉÂFŠÚ½êÊ<vèu:IWîuùä®@ÔÝTù²°ˆ3ä‹Ì½lŠýk¶'Ñݰë¦Uø˜×m[]ë¥ÞyÒÏ[ma`Ðß߬O«Ü‰ÁAéÅ.›h÷Æ ÄÃ"Ùø»ªy‚ø@ÿm­F7bÈYn|tŸ¬§À' {"ÍE
+«ÒQ6P06óÙŸt‚[ðx˜il!$—ÅúÙÝe&~ºóšG‹3;šê½ßà¡Ã¼³uhJ™s{çOþ¬û˜g#¶¹Z§2tÍÃc'ÞDqN»’å²`¾õsóäµÐEæ~ÎUþl5µ3½¤.RÙû4Y¯‡òZgÚÖ×`jêgóx’=‰$8LÚëÕ¥»>z[k£Šó´©[{[Øû¤0û‡eÞy£!¶ÚéÄ/I“bH9Óµõunò¢%œx1ª²,†o„àÆm›¹Û&Nü¡ä§u ùX¸3Ïbˆ¯úý3 ¨ÔÛ/½9%ïm?<´*›{oÏ©&­ÿ-k›Ôéjòì·î;EŠ‘*ÜŽŒ’ë×Dçц”‘b í"ã‹Äû,±ðr±›8Ÿr£~VÈ~“ͼ¦®ÌÉ©ð7vǘwznøúpJ«•{:/P}¾éˆ%õÙíÎÒý#/›Ñ\b‹;6žÜÕ’—ÎýЪÅà£ÖEß-VIi=C—”†Ø×„t_R_¾)f*l6z—x¥¡2|˜ñ(„èëÄ£¿¦ºßF¸Ž¢Ç´+Eµcë«ëþŸ]‚A÷ÝUjUjL.²09ùT:÷ Lïû1zÚ™»¯/£aÈ׳p·¯HŒ·àc=2«ÅºÂrsŒbSmQhg!YMzûäJࣟÎöv!ªO@»ÂMs!Léþ7íŸѻSÖ5'”í{Ïþ'g¬²)ƬÔå.ƒÏÙ¬W MÊ<÷ü òÈc¡]v;#±]7áç{‘ª­NódÿǨ¡³³¢B“¢,ˆ:ÙÂ=KÑÖ=Ðo³¸Ã·[ü"¹ZJ“‚% ù”… ò”]Y92ûÐn¾ã§¦ö.:YŸ4†¶Cuuf’¦ºªr›ãÖGUDø²Y®ÜÃßßþ²x÷—¿¾¹ÿí§7>¶
+Ïwe±q}D2ï÷IKø´1½L“ÆtŸOYÓ-ôJ¹é¯âŽÏ‘ @ôÌ.tgs2¿À§Döe5¼Ü2š†1t{Ì¢MzôŒ¾NÔI}/ˆ ‰}g>Ðàs‚£:)×9ï“1
endstream
endobj
-1064 0 obj <<
+1330 0 obj <<
/Type /Page
-/Contents 1065 0 R
-/Resources 1063 0 R
+/Contents 1331 0 R
+/Resources 1329 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 934 0 R
-/Annots [ 1060 0 R 1061 0 R 1062 0 R ]
+/Parent 1266 0 R
+/Annots [ 1258 0 R 1259 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R ]
>> endobj
-1060 0 obj <<
+1258 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [217.141 662.297 318.031 672.879]
+/Rect [114.08 758.07 233.906 768.652]
/Subtype /Link
-/A << /S /GoTo /D (group__WORK__SHARING_gab516cbd738ec072f4929faecbbc456f9) >>
+/A << /S /GoTo /D (group__WORK__SHARING_gab1acaeaf1525bb1d998ba2110c268b24) >>
>> endobj
-1061 0 obj <<
+1259 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [227.294 632.718 325.467 643.3]
+/Rect [237.983 758.07 266.892 768.652]
/Subtype /Link
-/A << /S /GoTo /D (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) >>
+/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1062 0 obj <<
+1312 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [344.952 632.718 448.344 643.3]
+/Rect [113.569 721.002 238.38 731.584]
/Subtype /Link
-/A << /S /GoTo /D (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) >>
+/A << /S /GoTo /D (group__WORK__SHARING_ga7054a4ec6bf4a65dda00a0aab75db65f) >>
>> endobj
-1066 0 obj <<
-/D [1064 0 R /XYZ 70.866 789.024 null]
+1313 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.946 721.002 270.855 731.584]
+/Subtype /Link
+/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-242 0 obj <<
-/D [1064 0 R /XYZ 70.866 771.024 null]
+1314 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.08 683.934 233.906 694.517]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_ga21ff57e990e07b43d08dfb4214d928c8) >>
>> endobj
-246 0 obj <<
-/D [1064 0 R /XYZ 70.866 596.455 null]
+1315 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [237.983 683.934 266.892 694.517]
+/Subtype /Link
+/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1016 0 obj <<
-/D [1064 0 R /XYZ 70.866 567.642 null]
+1316 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.569 646.867 238.38 657.449]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gac7d4d8d2d7f5d33b5c2b33d89b3ec0af) >>
>> endobj
-250 0 obj <<
-/D [1064 0 R /XYZ 70.866 567.642 null]
+1317 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [241.946 646.867 270.855 657.449]
+/Subtype /Link
+/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1017 0 obj <<
-/D [1064 0 R /XYZ 88.314 486.659 null]
+1318 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.285 595.061 224.913 605.643]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gac43752941984fb8fda7dc8f2a430f4cb) >>
>> endobj
-1018 0 obj <<
-/D [1064 0 R /XYZ 88.314 470.719 null]
+1319 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.195 595.061 258.104 605.643]
+/Subtype /Link
+/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1019 0 obj <<
-/D [1064 0 R /XYZ 88.314 454.779 null]
+1320 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.358 569.948 228.97 580.53]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_ga99c820d33a0515e359a8f3414d3e9392) >>
>> endobj
-1020 0 obj <<
-/D [1064 0 R /XYZ 88.314 438.839 null]
+1321 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.324 569.948 261.233 580.53]
+/Subtype /Link
+/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1021 0 obj <<
-/D [1064 0 R /XYZ 88.314 422.898 null]
+1322 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [114.285 544.836 224.913 555.418]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_ga5d02abafbc1bf1f9c8d7f3d44ad85970) >>
>> endobj
-1022 0 obj <<
-/D [1064 0 R /XYZ 88.314 406.958 null]
+1323 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [229.195 544.836 258.104 555.418]
+/Subtype /Link
+/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1023 0 obj <<
-/D [1064 0 R /XYZ 88.314 391.018 null]
+1324 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [113.358 519.723 228.97 530.306]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_ga81091e3b6b3dfe02aab5e0a661f65433) >>
>> endobj
-1024 0 obj <<
-/D [1064 0 R /XYZ 88.314 375.078 null]
+1325 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [232.324 519.723 261.233 530.306]
+/Subtype /Link
+/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1025 0 obj <<
-/D [1064 0 R /XYZ 88.314 359.137 null]
+1326 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.141 376.557 318.031 387.139]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gab516cbd738ec072f4929faecbbc456f9) >>
>> endobj
-1026 0 obj <<
-/D [1064 0 R /XYZ 88.314 343.197 null]
+1327 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [227.294 346.977 325.467 357.559]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) >>
>> endobj
-1027 0 obj <<
-/D [1064 0 R /XYZ 88.314 327.257 null]
+1328 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [344.952 346.977 448.344 357.559]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) >>
>> endobj
-1028 0 obj <<
-/D [1064 0 R /XYZ 88.314 311.317 null]
+1332 0 obj <<
+/D [1330 0 R /XYZ 70.866 789.024 null]
>> endobj
-1029 0 obj <<
-/D [1064 0 R /XYZ 88.314 295.377 null]
+266 0 obj <<
+/D [1330 0 R /XYZ 70.866 493.147 null]
>> endobj
-1030 0 obj <<
-/D [1064 0 R /XYZ 88.314 279.436 null]
+270 0 obj <<
+/D [1330 0 R /XYZ 70.866 310.23 null]
>> endobj
-1031 0 obj <<
-/D [1064 0 R /XYZ 88.314 263.496 null]
+1267 0 obj <<
+/D [1330 0 R /XYZ 70.866 281.321 null]
>> endobj
-1032 0 obj <<
-/D [1064 0 R /XYZ 88.314 247.556 null]
+274 0 obj <<
+/D [1330 0 R /XYZ 70.866 281.321 null]
>> endobj
-1033 0 obj <<
-/D [1064 0 R /XYZ 88.314 231.616 null]
+1268 0 obj <<
+/D [1330 0 R /XYZ 88.314 200.035 null]
>> endobj
-1034 0 obj <<
-/D [1064 0 R /XYZ 88.314 215.675 null]
+1269 0 obj <<
+/D [1330 0 R /XYZ 88.314 183.889 null]
>> endobj
-1035 0 obj <<
-/D [1064 0 R /XYZ 88.314 199.735 null]
+1270 0 obj <<
+/D [1330 0 R /XYZ 88.314 167.743 null]
>> endobj
-1036 0 obj <<
-/D [1064 0 R /XYZ 88.314 183.795 null]
+1271 0 obj <<
+/D [1330 0 R /XYZ 88.314 151.597 null]
>> endobj
-254 0 obj <<
-/D [1064 0 R /XYZ 70.866 141.073 null]
+1272 0 obj <<
+/D [1330 0 R /XYZ 88.314 135.45 null]
>> endobj
-1041 0 obj <<
-/D [1064 0 R /XYZ 70.866 116.11 null]
+1273 0 obj <<
+/D [1330 0 R /XYZ 88.314 119.304 null]
>> endobj
-258 0 obj <<
-/D [1064 0 R /XYZ 70.866 116.11 null]
+1274 0 obj <<
+/D [1330 0 R /XYZ 88.314 103.158 null]
>> endobj
-1068 0 obj <<
-/D [1064 0 R /XYZ 70.866 83.504 null]
+1275 0 obj <<
+/D [1330 0 R /XYZ 88.314 87.012 null]
>> endobj
-1063 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F160 682 0 R /F179 1067 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R >>
+1276 0 obj <<
+/D [1330 0 R /XYZ 88.314 70.866 null]
+>> endobj
+1329 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F99 691 0 R /F107 725 0 R /F162 890 0 R /F177 1063 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1075 0 obj <<
-/Length 2433
+1346 0 obj <<
+/Length 2093
/Filter /FlateDecode
>>
stream
-xÚå[K“ã4¾çWø˜T1BïG
-v
-ŠÇ §]jÊãxf\›Ø!qX†_OË’½vâ8~1@qI[é¯Õ-}jµÚ8x
-pðvñåÝâó7F)Yp÷(Œ´”2IÜ­ƒwKªW¿Þ}0Á' þWÜý>[7ñê†*½ü*‹ŽÛ8ÍÃ<ÉRÛxñõÝâ·¶8 •L­‘¦<ˆ¶‹w¿â` Ͼ 0bF‹–Û€ †·›àvñÓ×õä²EOI.ý:Íã=hDÍ2ÊÖ±»Úí³<ŽòxmêåÊâå‹{ZU?C$ ¦Ò
-&˜"¥LÙÍhŸäIn\Ó†
-Ü ­hÕ0K9 ±<F9ZÝ0@»{N÷ñ˜F…u
-äB‹MÙ¯wï˜æÉÆ]æÏ±ûW¼bxù‡ýˆ£cž¤Oåó}®}OC/3.{¯ËÿÃC§Ð§.ð<+\d„pÊâB9T4ÁðL!Iý³¯â÷Ó4ñÚƒ»ÃÜ}o’Ô
-1D¡Cãåï+Ê—Y²>m„€_0 ¤áFd×pK˜j¬Õ$P†0#ƒ%£´ÙBRÔ‰’D¹ž€=¢½¹@\ŠYP¹FDð&ê:9ìÂ<Z©ås ¸PÉf× Ášànµà†ÖÑDån:¼Ç»ùÛ :"e5Ñ“5L ûÜ·35F`q&ÊvÐæyCÕñÂÐÜ7‚©ý™oÔTR"%TÙ
-ÆÁ¹E¨2ˆ‰YLB5E˜Ó¦M’4g´­0m(®ºù”»¹uÖ…„¬C7“=QWß™ÜP‘T
-+u˜jTS5P{ÅTs€û˜ª~%¦šÖÅT T~ìª"’üë‚*Íæ|›P tÃNÆÁßTpÕ …-gÚFU°•ó*ÜÆ±ÿ“íðþÉ÷ügˆ¾Þ”qoçHÅ÷nøÜóÔ(¦¢X¾SñÞLÅa0ØæŽgª¡:˜ÊŠ"‚ôaª9P=S5P{1Õàž©àW˜jXÇT TýÞýÍ`’r÷×°É+W°ë“ž¨ô?NTĨW"*ÑŸ¨ 䤘M!ªºˆ
-DaÌ{Õ ¨%QÕQûÕ à%QÕÁ¯Õ °ž¨ê¨ú¿RÍ`“2¤jåRñJL%û1LSÆoÄ脺¦ƒ%\b*eEAO„¼ÆT‚ÈYP¹.]õ*SÂg¦’˜7Á@xJ‘YP-QÉ&¨Í§3ÞQiJûñ”V=xJõá)­ÅÕˆJi1‡IlDÅ•8uDO}âPËSí]
-V#=Ñ÷°#1˜ƒB°m`>=•{’ îÜîþ:î]YÞâ(.ÉŸ–¡Ëe6ó3¼^¼ìn}Lòç¿ÖùÜg6 ÎÍ4¿—q±Pˆhc¥él•7“fù¸"˪ÐÛÞ€©± ÷qñØ—ÙÛ¾N<Í“mìeîÉ!}‘´»ºÛ¾¶(Ül^Üý2øZ—À0ÿ융ÏÊÚ£Ïà§ýfh=õ{Q=nÛz-|»âV¸*
-øÖÝhu#á Ä!®ª—j)‹²”ýà³×{?>@¹2²QEŹ»¿ûÔ%ûûqŸmOJªlwh&¼«g'º-§Â†ü=u»ÓzF]]ϨÃÄÚÉlÇ)0BKhͨK¦(D1L¯eÔ³ ŸÙÓªꕌ:ìÉ8Ÿ\ÃêÏxürF}Lf6MÈ¢–J˜‹ uwÖ'¡®ˆ¼žPgøzB]!.¯œûID™Ã$z CÉ©.§ï¸–Wóé0µ!½òéZ ˧ 9<Ÿ®pwÔ®8‚ÎbN. lKNÌy¼hO`£ô•„ú Ó°à)¿
+xÚÕZ]oã¶}ϯУ 4,¿?úX´»hÑ¢½Ý
+–z(ÅUY ‘Q!‡žÑGP~|_¾„š1"© 2ÆÐNE¸%“Õ'f眡Xw†߃x¾nrD™º n^·^Ê1Á½ËÐÅ2}Š«u9èŒdSÞa¼¥T?㢕¬Òeµ¶»Yý=^?¾@•«M½Ãݰ‚åB°cÖ†¾K?aLó¬ÌŠÜ?é-‚-?G†‰ß1žÜ§}díoÂ,æLÌÐ
+9ò”–¿ý¨Ý
+oxWPs0%H·võÖ0¨‰°„8¬xXe þ}iþÕV«x”KØ’™íûmõÚ<¾Û×Èp ™JØp##a+=õn¤ž-Wà[a†lÀhÐBto{\ȤB°OÂÆÊG_ÍÔ“úZØ®r„FÂÒë î‹j—øíć½5ËJBÌ6õtÊPP…¤¤W0<’ðy[ˆo1á#,9RPo‹0†Š)À×VùÚ.¯‹²wS¾½?Чà.´åj—Æ^.æVÔU›Ç $‡B|1·Óø€ oŒñM6|¹}@ OTxq`C·Î d2Ó¡Öz;á« û܆®µLV¾Îï™aµüe†C¨Sw¡aæ$’½·O·¨ï¥Á³‡U¶÷C‹j½tCýÓ±ûº-@IÌIݦ×Ö‹Îm[ ezñ÷ûú°2õ¶>ƒºwwÞ e…?hbŸA®<9Š_…S ß@@W㯀©p±Êʸ>àX¿†N0û³:î}lO8”ã—Fç4=Á¶p>Å/·qš%Áýšø¦ûû¼¬ýE Dy™ºÿ¶»¢?×Í4(çÚ‡¯îVì…xæ A¦H)ÓÖ!~G8t*Š6‹<œDUI iâͧÅ}j5UƱ µw×*Hðµû·N!ûTj7©ÿÚ?iR•®§¬ïûgg{›i˜½Ï›ž„¯ Ø x÷e"j²ò…^Иj&ÓE²‡~Þf8dz%o·¨”„–¼Ý@ÒÑ $eRÞÐ@^ja dÜ&˜Ó@NêÈê2Ûoã2™«Ùª\¹Fc
+pí¸Ë \á“ÀB§Í›e¨Rš‘Íò¨¦DŽj–‡[>ª bb—P = §]ŸŒm–½Ž;™BBŠ‹Û*
+i€Ê—m« IFoÚ¬n³áô#A1M[Å£|D[u%l¯ë ~hµU~£m7XoÊË †L
+–TS€zIÕ¥¨¦ÀöŠª}FPMêU”WÂJb!ÿ8A¥aœOáª%¬›¯ž:*S÷š7ÎÜ›Cf¯ÕÛqšú‡ì|wÏ~â¿ðúXW‹Å®¦`,\ò,xêº"EÙ*R|t‘"ÌäñŠÔ¥Š”5%°S¥¦@õUªƒ:ªLMîËTüLšÖÕ©ªþ7~¸$4~Ÿ|áBÅA•Á¥¿³P‰K
+á·ª¡^S€r¤—ü1ü\RB/b«Ã‘¦€ôô/°Þ§yºs‡Ì5y?Áw»Ìÿn2Ýú úó7ŠÃD‰ü†Šo¸
+¿›¡‡ßÍü—éúþ™_¶iþó¯Í
+ú›=Å ç×?e»ZD»WÕ:}Uö‡%õáæës= Í{Žþ?ÞG·
endstream
endobj
-1074 0 obj <<
+1345 0 obj <<
/Type /Page
-/Contents 1075 0 R
-/Resources 1073 0 R
+/Contents 1346 0 R
+/Resources 1344 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 934 0 R
-/Annots [ 1069 0 R 1070 0 R 1071 0 R 1072 0 R ]
+/Parent 1266 0 R
+/Annots [ 1341 0 R 1342 0 R ]
>> endobj
-1069 0 obj <<
+1341 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 540.757 186.487 551.231]
+/Rect [88.313 185.633 186.487 196.108]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga5f02c0e2081859da86664bfeaec6de62) >>
>> endobj
-1070 0 obj <<
+1342 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 465.609 186.487 476.084]
+/Rect [88.313 106.258 186.487 116.732]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga5f02c0e2081859da86664bfeaec6de62) >>
>> endobj
-1071 0 obj <<
+1347 0 obj <<
+/D [1345 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1277 0 obj <<
+/D [1345 0 R /XYZ 88.314 761.061 null]
+>> endobj
+1278 0 obj <<
+/D [1345 0 R /XYZ 88.314 745.121 null]
+>> endobj
+1279 0 obj <<
+/D [1345 0 R /XYZ 88.314 729.181 null]
+>> endobj
+1280 0 obj <<
+/D [1345 0 R /XYZ 88.314 713.24 null]
+>> endobj
+1281 0 obj <<
+/D [1345 0 R /XYZ 88.314 697.3 null]
+>> endobj
+1282 0 obj <<
+/D [1345 0 R /XYZ 88.314 681.36 null]
+>> endobj
+1283 0 obj <<
+/D [1345 0 R /XYZ 88.314 665.42 null]
+>> endobj
+1284 0 obj <<
+/D [1345 0 R /XYZ 88.314 649.479 null]
+>> endobj
+1285 0 obj <<
+/D [1345 0 R /XYZ 88.314 633.539 null]
+>> endobj
+1286 0 obj <<
+/D [1345 0 R /XYZ 88.314 617.599 null]
+>> endobj
+1287 0 obj <<
+/D [1345 0 R /XYZ 88.314 601.659 null]
+>> endobj
+278 0 obj <<
+/D [1345 0 R /XYZ 70.866 558.937 null]
+>> endobj
+1292 0 obj <<
+/D [1345 0 R /XYZ 70.866 533.974 null]
+>> endobj
+282 0 obj <<
+/D [1345 0 R /XYZ 70.866 533.974 null]
+>> endobj
+1348 0 obj <<
+/D [1345 0 R /XYZ 70.866 501.368 null]
+>> endobj
+1304 0 obj <<
+/D [1345 0 R /XYZ 70.866 380.944 null]
+>> endobj
+286 0 obj <<
+/D [1345 0 R /XYZ 70.866 365.704 null]
+>> endobj
+1349 0 obj <<
+/D [1345 0 R /XYZ 70.866 334.786 null]
+>> endobj
+1306 0 obj <<
+/D [1345 0 R /XYZ 70.866 248.381 null]
+>> endobj
+290 0 obj <<
+/D [1345 0 R /XYZ 70.866 229.617 null]
+>> endobj
+1305 0 obj <<
+/D [1345 0 R /XYZ 70.866 169.005 null]
+>> endobj
+294 0 obj <<
+/D [1345 0 R /XYZ 70.866 150.242 null]
+>> endobj
+1307 0 obj <<
+/D [1345 0 R /XYZ 70.866 89.63 null]
+>> endobj
+298 0 obj <<
+/D [1345 0 R /XYZ 70.866 70.866 null]
+>> endobj
+1344 0 obj <<
+/Font << /F95 690 0 R /F177 1063 0 R /F46 685 0 R /F107 725 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R /F162 890 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1355 0 obj <<
+/Length 2875
+/Filter /FlateDecode
+>>
+stream
+xÚå\Ko#7¾ûWè(Ã÷#ÇE2ƒ ìlì=MC#µíÆÈj­™xý»I¹»Õor¹LË»¾b}Åb±HFTÌgØ>Þß`ûžÿ¸»ùö3Œ”lv÷0Si)gÊP$Éìn3û8gtñÛÝ3&8â„Á{ù·?g›ó6Y,©Òóï³õù9ÙV§4ÛÙÆ7?ÜÝü÷†@[<#™Z#Mùlý|óñ7<ÛÀo?‚BÌèÙ—¼åóŒ †·ÛÙíÍ¿opEë\[‚Uƒº’ ìõH#³XŒñü÷åó,Ý\«EˆA³üe*»Ô[˜‹N%”!ÌÈX Ý T EIµŸŸ÷ë­¹@\Š \#"xt“÷«Óz¡æO Ø
+”,¶&HVÅþcºK` C„Æ@5à5+ë3ø0Õ
+ Y²… y|Ðùö—¥ÖK*(ØNÃޤÐÅ[·Iâ^²ý=<ºŽÿòþfö19÷÷v|Ü;}º/œçžW àŸ%h#!|äR¿OŠfyœÊŬNÅs›î\0£úžÊЧ}LJ:
+ÌJ¬ªÛa(Ç(9,FÁ•@à;1Hi:ZB[”RV”@DõD)AdTSÖé*¨½aÊâ”ļ
+ž‚µD)E¢ Ú8%« üñÖ0¾Eé°0¥Õ€0¥†„)­Ew˜R)-b˜„jJÔ‰èˆS¯!ÔÆ©æ.€zìÒÑdît~n°.'à—Ià¸^<J6÷§—}Ò/bÐêíó| >6êÂ`2fÝæäv$0Ü\`d¨œdÎí§fcR¤Œìî€ÑH²(S`°1å;°dÆ AdI2ÂásKG(×=ÿAÕÀXWR(4ÖUmE1ÐLš€§6&dÚÑH Xým ®ûÅAŠAqÞ}nêL4RÐÖ âò¬L¹@®¯Ö6“ À¶,Þþ`'×Õaõœœ’Âù±YV£Ìú¯MëÉ%’À`çºF"cDÃôE†MÝ 42ŽU]2 uáÿe:¯¸#ELBŒ±ñæP?4MñRx=¶’X÷Q;žÊ¨·Ùù°vihв¸hðv:Ak@£:ŒÈ ŽHp_¢X ‘Ô B¤MÚd5ao!rl3‘%Ô÷ÛìÓj[ðxz:$«Mñ¹I— ›£u¹ffm£x›A2›RxH&VÈp “0Ä}`;®]NÑÎè$èfBËÈ·¹àÔeA-LŽÕáš i!"
+…QˆK]!i`MÈ^°`>Ÿjgp"j3…eП²ó/v†Y1çñSvÞu Éñª\Ñ`EP©‚¨ “á¸Ô6Å “j
+iHja‘åRÊ.§¡6rYýÏ~?”ÃÑ*\Û_ó<áâ0H†ãPÁzC˜8ãQ(‰>«îàpj3‡eÐÛS²÷Õ&3Ggº[[Ywº‚ÔË‚âyv.þØ’‡³Ãø’'7s?ZõkÞ@„èÑÏ} Ç=äù–AaÜÃzÄ`Â`ñb¨[•øI ýÓ€›é/ãÞ=¹É´P ÿxLÿgc´Ÿe37Â-÷6!‡‡kø%==uð>ZçkÎ@„]ºñ>^Ƶí¼,X¤ð‹åÒãbɤ™?,Èü¼[µ]ûŒŒýêä?ÛÔ3)¾†±f=ïNésâ~ÊŠ_ާüÈñüT|¿*¾Þ¼ìVÏézµÝ¾ßûÌkãaøÙ!kÛfY^þþ4°Ø\Y¢~OwE[§…k—µ:<æ»gGË6Z,%<ÀŽyR•W°-9.õzp=<ºòõÁ¹(ç³je•ußï_»dÿ~8dÏ>/åoÇjÅûò[M7¯-©ó%u*Ä•ÔUIb„5Ÿqp&ÒÛw”ÔÌ¢c%4–Ô%S̸„`¤D_I]Át™ݭª ö”Ô "œG×iÆ«àí%õ8˜ÌlªÜΟ´VÔ5ÃUÔ‘ýu†û+ê6ÁîÙ÷“ˆ2Ã$2HCI†öÚײ· C‹2¨ ®Õ¸‚ºã ê
+wWAí„#hsra%5sž[í Ä(ÝSQ_2 󪭛˹à:¶NÁ…-LXDÂ6¢0Ði.ýè*¨w;6QІ±(P
+iÊ*X“ž^O‡1EJAo>F£¦~µ+)¦Ãvåm\±'O¥üz /'zðž<Ó aEöäÇJèØ“gz¢íÉÇ@u{òÔA{ò1ÀÝž|¼{O>j±'_Õá=ù&ñ{ò5"þ–{òÌé÷äëæ”ü-öä#tÀïÉë@mO^ÆÚ“gŠäm#ìÉ3È ˆêg"âž| ým ®»üù„Ø–·¾^þ0ª
+²±¼‹*r~!
+endstream
+endobj
+1354 0 obj <<
+/Type /Page
+/Contents 1355 0 R
+/Resources 1353 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1266 0 R
+/Annots [ 1343 0 R 1350 0 R 1351 0 R 1352 0 R ]
+>> endobj
+1343 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 390.462 186.487 400.936]
+/Rect [88.313 733.519 186.487 743.994]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga5f02c0e2081859da86664bfeaec6de62) >>
>> endobj
-1072 0 obj <<
+1350 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 85.607 186.486 96.081]
+/Rect [88.313 430.478 186.486 440.953]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) >>
>> endobj
-1076 0 obj <<
-/D [1074 0 R /XYZ 70.866 789.024 null]
->> endobj
-1052 0 obj <<
-/D [1074 0 R /XYZ 70.866 729.594 null]
+1351 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.313 343.375 186.486 353.85]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) >>
>> endobj
-262 0 obj <<
-/D [1074 0 R /XYZ 70.866 714.354 null]
+1352 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.313 256.273 186.486 266.747]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) >>
>> endobj
-1077 0 obj <<
-/D [1074 0 R /XYZ 70.866 683.436 null]
+1356 0 obj <<
+/D [1354 0 R /XYZ 70.866 789.024 null]
>> endobj
-1054 0 obj <<
-/D [1074 0 R /XYZ 70.866 599.276 null]
+943 0 obj <<
+/D [1354 0 R /XYZ 70.866 716.891 null]
>> endobj
-266 0 obj <<
-/D [1074 0 R /XYZ 70.866 584.036 null]
+302 0 obj <<
+/D [1354 0 R /XYZ 70.866 701.65 null]
>> endobj
-1053 0 obj <<
-/D [1074 0 R /XYZ 70.866 524.129 null]
+1357 0 obj <<
+/D [1354 0 R /XYZ 70.866 658.836 null]
>> endobj
-270 0 obj <<
-/D [1074 0 R /XYZ 70.866 508.888 null]
+1297 0 obj <<
+/D [1354 0 R /XYZ 70.866 500.953 null]
>> endobj
-1055 0 obj <<
-/D [1074 0 R /XYZ 70.866 448.981 null]
+306 0 obj <<
+/D [1354 0 R /XYZ 70.866 485.712 null]
>> endobj
-274 0 obj <<
-/D [1074 0 R /XYZ 70.866 433.741 null]
+1298 0 obj <<
+/D [1354 0 R /XYZ 70.866 413.85 null]
>> endobj
-735 0 obj <<
-/D [1074 0 R /XYZ 70.866 373.834 null]
+310 0 obj <<
+/D [1354 0 R /XYZ 70.866 398.61 null]
>> endobj
-278 0 obj <<
-/D [1074 0 R /XYZ 70.866 358.593 null]
+1299 0 obj <<
+/D [1354 0 R /XYZ 70.866 326.747 null]
>> endobj
-1078 0 obj <<
-/D [1074 0 R /XYZ 70.866 315.779 null]
+314 0 obj <<
+/D [1354 0 R /XYZ 70.866 311.507 null]
>> endobj
-1046 0 obj <<
-/D [1074 0 R /XYZ 70.866 157.266 null]
+944 0 obj <<
+/D [1354 0 R /XYZ 70.866 239.645 null]
>> endobj
-282 0 obj <<
-/D [1074 0 R /XYZ 70.866 141.039 null]
+318 0 obj <<
+/D [1354 0 R /XYZ 70.866 224.404 null]
>> endobj
-1047 0 obj <<
-/D [1074 0 R /XYZ 70.866 68.979 null]
+1358 0 obj <<
+/D [1354 0 R /XYZ 70.866 181.59 null]
>> endobj
-1073 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F160 682 0 R /F107 565 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R >>
+1353 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F99 691 0 R /F179 1097 0 R /F46 685 0 R /F174 1021 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1086 0 obj <<
-/Length 2765
+1365 0 obj <<
+/Length 3256
/Filter /FlateDecode
>>
stream
-xÚÕ\YoÉ~ׯ˜G0{ûª>ö1plì"A[@ì…@‘#‰0E*<âU~}ªgzFlrîi ñ‹9¦zêî꯫J¢É}B“W¹¾ú僅Ä«”H®ïM‰Q*Ñ–Å’ëeòu"‰žÎ¸6“Mlwßóÿ}y˜ïV›ûé׿'R
-Z Íì nÝ·W½¾ú÷Ã/iÂJÂÆÃe²x¼úúM–ø³ßJ„5Élåc"‰IGl|¹úçõÂRÂÁ=º/:£ºBvÅ=žb¦3F)ügÊåd»Z^ŠÇ˜%dö2WMâ¡al)Û .5¼/
-5¢5õøþø´¨Z¦b0•†p
-!Óåjÿ4?,¦zòPÁ[ãÛLÆàmQT†¼W›Õ¡‚©„iƒ©Œ–'† ròu¬Ï¶ã¹¼ˆñÕ2Ýn~M,®C‰p`D]¬ûF©È1+¡Z‹ÖÛÅ;¿(Rc X…1pi®-Ñ"X„N¤†s7¯’÷ ‡RËûÃjY­J'J=Ó ÆÒñ±Â¸C@²bÝ~1etò.oÏOi{`Ds±þ¸NÝVŸTÊ" a¢ÙšÒm¡#XS%–« k*ÙnÍõmµ-9ÑV5Ëo Q"ƦŠæ²£ü3a-¡˜?fŒ /?Öè„1ݨ˜M-îsi‰@²c6ºÀtjrRŒªŽ eŒìuŽPÓŒ "Žü.Ku—½Œ|K7ß«4À#FÉQÀ2Š£ö—Rz—¦7Ë“—øžÍßú’¦þ%§ðîÞkþùãUò5C77îÔºñ§ÈÃKé72`„ÿ̘&
--£ù>Å|ÉqÝj»ÉaÆü®W›4âŒñüi{—ºwÖþ§È²äHOOS’ó ðùEP ^Á)n°í¸S<öe¢´$ Ì@à ïM¡9(Ü„ŽŠŽ¤Zƒ–…+æL) äÚ0œ¥ŒÂ±ƒ2d^âð´hf²4G ?°µØÁ cd'ì ™jÇ‚¶cMdóaÁÂÃŽÅ0 GXo9;wC=vFµbÜZ‚±NØÁè~ØTì isÊ— ð(攘o1Í…æ<Ö&~Ì V›ô0ïG:<¡«Ï. «q«(Ž
-—‘(•9) æŠ([*Òš#›i\#D ´FØ/B :ÁÃáÇZ@8ÇÜ#{)
-•» †/àÁ`@5ãܪ…©TÃ"àÙ‚§´Qx»Ë³°!sŒÆ&V" ÜÆÑÚ:¿CÈÙ…¤  õÍ:Ö CùAv¨>h+[ ÞÛ…Šan$^8Ï,ÒX~à]ªJ6ßøžìFFñ©,D½—ºx©JvíJRCe8 í*‰g²¯çu'ÚL4ßà%Ë’–¤;0­~;»ºr¶5:†]%f7¥Ïdo¨ïЖúº‰Š8VÅ4ªy«2;Ò¬@-¡LÅ0+ ˆÕç'U ^œIêÒ¶ñÈW5áFŽß‡Ǥxøƒ#$‰m7-í’¯¹j°-ÃËeräabwÓ‘§’ï•ÑJ3ÈUÿª»6ÉÌâÝ,¢@‡F½/>¹òÊ|7LéξûjR•$ÏZÕu™×˜»NŠX 
- WDÅì*
-ZFùF~ýgEùÐËȹ×ô÷úÀé¯ö…Ó Ní¨ÀGâ[
-rlàˆlˆ@›µØ}ä›"gßÊÈ Ø¶GÎñééí#¦·º—Þ6€÷1£høˆÑÏr%Õ¸ "Ç[°˜¦Ãk Ûê€9eÛ0ûCîßU>_9Vzkzég$Í5ýöXéO£ó²®M$ñ–á
-™>§‡ãnS}+;w#f_)ñ®mðÆê» ("Ý¥!ŒíøúÖ/]::øãw­"kHD@3ÁÐ(¾ÿ1C7¦ˆ
-Dþoù¼™?®óõú9ÿŸÜU&uYÈØ2jŒs)µ9?SÂ%S€i2 “ßîJAv^”bÝf›>n‹Ÿ<œî–¹7gº tòóz.{–;M¸AœihØܤ©O²›í!´÷ãv¹rm‘tIÊ7{÷Y$¼NŸÅU MÐgaÍ}×ã‰`€ŸlhŸE÷&P×f‹¤$1’·µY4Q¸º>‹!×ÖF £<
-s×h±<dÞÜhq˜œ‡QaBÎÒMk`°ÕuZ0ž”èÔi*:”î¬èÐk±¼}\t£`6#\¥±×ò2ÜÝ8ê©››ÂÖu”p®°®D­
-5VÝÏQ•í ¥lß‘>l·¼ÝʳÐÔn±mÝÜ0â"VºL©d(ڱβ˜Ê´‚±–u#ÿx Ë:Ø£äY¦©o¸˜—!âjÃ7IǰFg¿úÓ°Yoƒö6*gz‘. R÷k
-jT‡
+xÚÕ\YãÆ~Ÿ_AäIXí¾?/l8ˆã ¶1ÐHœÁ£#:²ÙüúT‘MJ-6)‘ìY$O¤ÈfÝ]ýU±)š½d4ûx÷燻o¿w*³Äi-²‡çÌPbµÎŒãD³ìa‘ý:QÄÞO¹±“Ük:Ùìþ(}zí–ë—ûß~̤D4‹'„À«wy¸û烋4c5ak‰å2›¯î~ýf ¸÷cF‰p6û\Œ\eR1‰ÄÞ²Ow¿£^ØúH¸ÂS<x5g:hG¬ÉŒ–DSYJôK~8îÖûB¬Kzß~/õÙÓÌ)e6…#å¢||³ÎK¥—ÏåñðšïªKûòøùž¡uî§LM¼‰›òøä‡.Üþ¦üù<Ïw~Ði~^îó¢Sf@ ›Á-¢@›BŒùÆÚ‚}yôüÛ_^|YÏVËùìííKyÎ6óÙ!_àO7™¿×”w6ÏåñRj¸ôŒ$ñRɩЯ8Ûå³¹Ÿ
+£&?<ׂì¼(Õ¸õ¦<®6Õ€êî>¸¾Ðåíé^ÒÉ7Ç'/ûzQžìå£ËEi
+ÆaÄ)Ueêä|í½Ú,–¿QÊs»zÒÍ}P|ÈñæzyXnÖå3OàmY9œ ͽ¼ëñ™7÷Õöq±Üog‡ù+™o·÷BMHdA^F("8ÌUÏ0"c &¥t²\šó‡a<Jži¥‰‘®kÁÔuõì9£Àá¦7Èc\€ý]Aªr˜b‘ƒ¡" S©a¼˜zÛß›Ék„·1„Qž„·qRbÀ§2é×dì0wS0vàuaÆòÁöU™_dpˆp¡ëT “f}x<øq.s0Žk'Q´Q-ÊA ëùz@¨«A2ùÆ
+¥ÔÄQZGBÓ&Ü‚&‰M “®C›À”<&?ƒ±§…éå°\Ä5
+§Ýf• &‹‘)Ì*1EjHvl³+¤0ùw¤]«8ÅSØU -Ãóö·*¬:Íja"Y­) [B³N%ñ, WòmlÕcDbþ“°c_Æ$a¼$¥\¥G‹A:Ö· ȸr]¬kˆð\(WW6 ú†¨åª#jd«’ÕÂ*"CÙ÷‡¨I)
+¦ˆeÈó*¤Ò%áHP¸y7ä.Öý®BÎX™C„·AAN ã7AAyËR(o
+¦à컂gûÿÜL`”ª-å+ö¨PõÛTxÇÆà0é£Á@úÁ†­:ƒhǶµ5mk0e«Ö`hÙѽÁ†õ½Á”†íÝ”†´ÍA$Õ}’Þà0±¢½Ás±:aªÖ`
+“–­ÁsÑß¡3èÞ özEì¾ZgPz<ø¯{.'›å"V@ÚØnHÉB€H`ؾ¢¨Ð+KR\ònTèˆ4•‚«â„[rÄ@™ÃBOÁU[˜2¢Áµ‹:˜²iTæRå¥ÊKˆÛäb¸½Æ&á
+ª¡«DÊ»Z’VßÖ’4·¬Áú–¦¤UÝ0TPJ(@64ÔâÒ0ôÔnì„¡´^sò5ÄÓq±.¤FÍë¦Ë~Žo^óÅãáË6±WŒˆB¯Ç1yÁiTa¡€ºÒs‚© “L*i¬Ë­Æl,€²_ÈD[NœÈÁÙ/´.â˜Ëì×
+ˆ§@ð3ëÑtV ³)AÓ Iq{KýäûvªµëHÆgè
+ÀZ†R`8Âã`6‡®¯
+Ô)§Ì8¸+1¢W
+èÊ\r}ÆÈ‚ -èdàŒñÕ½v!ãýæ_ÄÌX‘H€n ør*‹ž}À·­¸5–µ\LeC®XÜ(ÙZÜ"Ný­ÎâFks©re®70…®¼WT
+9˜Ùu —pÍ^ÕZ¨¶"àïZë &ÔÏjsG”dÝeŽÓ
+uP0æÝÔ=n·ªÂâjÝ•yXÑi@UŽÒ·«joPÕ†š~@ÀW_(_ÙÿU|Ÿ&¨*öÏä»yP;~4Õž©ŠæJg¢*¢<…[%€L.ZÝÚH»gÊ.×óöØÄ”¦å•÷]š–ÂaÒ7*oSb*,'æMÇT¼ñ/ ³©æ„á ^ìŸ+žýqûl7[åE•ÕgœR”âåÝØ‡œœŒ–¶ûCN ú«òOBƒÁR¢Šm±ª{;Œ.têd
+ó]ØÆ®]þ'”.ÒÂþSÝÓ³—Žè-yÓ{?%
+º<íq0Œu<Î9Dƒ×B ·ðM÷1
+“Ç Q4ÊÀ-/zl±rÆ
+,ˆ¯ëÞWõ¯Aq0Œ< ÎÙ_ƒó5jâÃ^EAo%®
+J+ýG‘(ƒÁBÅØØ`
endstream
endobj
-1085 0 obj <<
+1364 0 obj <<
/Type /Page
-/Contents 1086 0 R
-/Resources 1084 0 R
+/Contents 1365 0 R
+/Resources 1363 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 934 0 R
-/Annots [ 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R ]
+/Parent 1266 0 R
+/Annots [ 1359 0 R 1360 0 R 1361 0 R 1362 0 R ]
>> endobj
-1079 0 obj <<
+1359 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 721.564 186.486 732.038]
+/Rect [88.313 617.053 191.705 627.528]
/Subtype /Link
-/A << /S /GoTo /D (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) >>
+/A << /S /GoTo /D (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) >>
>> endobj
-1080 0 obj <<
+1360 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 634.461 186.486 644.936]
+/Rect [88.313 529.95 191.705 540.425]
/Subtype /Link
-/A << /S /GoTo /D (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) >>
+/A << /S /GoTo /D (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) >>
>> endobj
-1081 0 obj <<
+1361 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 274.15 191.705 284.624]
+/Rect [88.313 442.848 191.705 453.322]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) >>
>> endobj
-1082 0 obj <<
+1362 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 179.878 191.705 190.353]
+/Rect [88.313 355.745 186.486 366.219]
/Subtype /Link
-/A << /S /GoTo /D (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) >>
+/A << /S /GoTo /D (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) >>
>> endobj
-1083 0 obj <<
+1366 0 obj <<
+/D [1364 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1301 0 obj <<
+/D [1364 0 R /XYZ 70.866 687.528 null]
+>> endobj
+322 0 obj <<
+/D [1364 0 R /XYZ 70.866 672.287 null]
+>> endobj
+1302 0 obj <<
+/D [1364 0 R /XYZ 70.866 600.425 null]
+>> endobj
+326 0 obj <<
+/D [1364 0 R /XYZ 70.866 585.184 null]
+>> endobj
+1303 0 obj <<
+/D [1364 0 R /XYZ 70.866 513.322 null]
+>> endobj
+330 0 obj <<
+/D [1364 0 R /XYZ 70.866 498.082 null]
+>> endobj
+1300 0 obj <<
+/D [1364 0 R /XYZ 70.866 426.219 null]
+>> endobj
+334 0 obj <<
+/D [1364 0 R /XYZ 70.866 410.979 null]
+>> endobj
+1333 0 obj <<
+/D [1364 0 R /XYZ 70.866 291.913 null]
+>> endobj
+338 0 obj <<
+/D [1364 0 R /XYZ 70.866 276.672 null]
+>> endobj
+1367 0 obj <<
+/D [1364 0 R /XYZ 70.866 221.903 null]
+>> endobj
+1363 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1373 0 obj <<
+/Length 2943
+/Filter /FlateDecode
+>>
+stream
+xÚå\K“Û6¾Ï¯àQªò`ñ~ä¸åĵ)»6ÏÍIMq(z†e¨ˆÔz½¿> ¤Hñ!QÂL¼µ{$ìF?ÐèÍŽ#½»ùûÝÍß~2"ÒÈHÉ¢»Ï‘ÂHK)C‘$ÑÝ*ú´`|ùûÝÏqÂà¹êê‡|µ_§Ë[ªôâmžìŸÓM—Y¾±ƒo~¼»ùã†ÀX‘†¦ÖHS%Ï7Ÿ~ÇÑ
+îýaÄŒŽ¾V#Ÿ#.ÜòXGoþuƒý<û´$ATN“’È€h5© ‚°‘â<IFd„ð$*mÅ[ê"„!΀¦
+Ü{ ~Þoö
+÷õ)Ýùaqý![AhÌ’Øë5¶ª¾åxQz»üùˆC¼{¬â©¿üm›Ö€¨ŠÃ8º%`*ZgDµ'b¿&ùóÖ®cø"e{u¿Ý¦;÷1ެ܇un‰µæ¯ï=äûͪpÏ6ãš±J=2÷ÃkêEêÇ6NÖá^¤¥û`ujÿfeêÜ®5qGT6DSKê?ö¿4VœsUJ¨¢Ö7«.YkQ,’ýnç•h¯îÒxå>×o-ìÞ&Z{"Eò”ÚýÍ?Q­÷Ä’,žbO4+Ü_PHRÇÏú‘ÔDÍØdeæA.þ½¤Ü>õTœ£µF{+
+ƒíúL¼"Õi£PgàÆÔ ¼ÂªŒ6€N–
+€W,)u€i’‹Í„9-¶ý> ­N&íLŒD|!„¼ÆÀüÔ‹É{«èSÈLQÈ,eY©âURw¶¬ú Yç@f¦«ŠÆ<„¬L
+©pypi‰ b2®Ý±ÏYRÜ2MžÉnt|1¤b¾¤¢ù« }ne…û2ˆ¼¢²2—ÂDeÅ’’TSY ÁÕWV:\§++!¸úÊJ‡ëÉÊJƾ²Òa|ª²€o]Yé𮬄àê++®ú¹²@)ueåȯVY !‚¯¬\"BðÊJ
+3n$x\ç ¿þ®
+p ×b3Q¬¯ìĤªRQ)e:Æ›A.ã:Ø ÒaZäû]’Ö¯t'ñaÃÍ6‡7ÀÅ⹺ƒÆ›=fO°o;—¾Î¾×ðæ•
+)zmˈ ÒaíÀz_fµ™/ã>lç>󺇤îsЋÍ÷Ï©ÑʳçÖ·
+×þPNXø"ÖÃn³vDå·%Àæšg ÷m5p¡™™KŽì½"MÜš¾•/îžl§J54߯Wnȃ:v_·9äKâZ€,õ¼sÛ0Š_üŢȓ,.SOëkV>¹;#“èSñS|ãó|ï£Eþì#V¤ê‹û¬Œ«¶ן£ûMöÇÞlúhšÞ“Ÿk¾{ ¯rñù4F;Öì¹5gC¾Oc«¡Ju™oÑéúG¥ÑŽòwé:‹lóX7ýXM~k6ox^j¬öÕŽ‰›®·uÝ'´÷ÌjbYéÇtû¸ê ç¸íp¨Í‰bVRì·ÛÜwÙ¡d<ämxHñÙðÐbrq§™O`É!ÑeçÀÃL=<ìp„‡!˜zxØaúe1&Á¡4ß6¤ˆ@z@/*£ºz™Æ†ò46”ÕÑeÓëCû†Ugz>gê×fVt6~¡p À¶×Å/„A»²¡ý:.÷!Ôæ¦, €±áó3ðË…\óž6Ó`øeþûÖT\‡P¯£á-l×…1a ¥-µ<Â\È}ØÒ}æWA˜ùsëˆPd®3ñ\
+£¹Öˆÿ ,b—T}9ú€´îή¡ØGRPÇa7ƒí…
+Ë~—¬Æuø2Ý~wo—>:üÀ8÷ø¡ÊŸ€¨˜nêlü¡î·=äþî¡ÿ½5á¶i©äQ‡qxh@*a!°Kűç-'1?ï”F\’wNìB!Mçü Nýƒ=QesU« {)‡‘‡ƒŸwé&Ý9tæ åþþ´Ë܇©oï§ÒÿÅħÔDþ@Å\Õ¿@¿ðM™®£Â?óÏmºùðK“=[+¦Ý»%Q6PkìÌBáÁŠ¿îßÖÀï}ö°«¾ñŸ¶/½Í+oùöX H7Ç:þµ }¨
+endstream
+endobj
+1372 0 obj <<
+/Type /Page
+/Contents 1373 0 R
+/Resources 1371 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1266 0 R
+/Annots [ 1368 0 R 1369 0 R 1370 0 R ]
+>> endobj
+1368 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 85.607 191.705 96.081]
+/Rect [88.313 565.29 208.14 575.765]
/Subtype /Link
-/A << /S /GoTo /D (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) >>
+/A << /S /GoTo /D (group__WORK__SHARING_gab1acaeaf1525bb1d998ba2110c268b24) >>
>> endobj
-1087 0 obj <<
-/D [1085 0 R /XYZ 70.866 789.024 null]
+1369 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.313 466.233 208.14 476.707]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gab1acaeaf1525bb1d998ba2110c268b24) >>
>> endobj
-286 0 obj <<
-/D [1085 0 R /XYZ 70.866 771.024 null]
+1370 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.313 367.175 208.14 377.649]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gab1acaeaf1525bb1d998ba2110c268b24) >>
>> endobj
-1048 0 obj <<
-/D [1085 0 R /XYZ 70.866 704.936 null]
+1374 0 obj <<
+/D [1372 0 R /XYZ 70.866 789.024 null]
>> endobj
-290 0 obj <<
-/D [1085 0 R /XYZ 70.866 689.695 null]
+1334 0 obj <<
+/D [1372 0 R /XYZ 70.866 647.72 null]
>> endobj
-736 0 obj <<
-/D [1085 0 R /XYZ 70.866 617.833 null]
+342 0 obj <<
+/D [1372 0 R /XYZ 70.866 632.48 null]
>> endobj
-294 0 obj <<
-/D [1085 0 R /XYZ 70.866 602.593 null]
+1335 0 obj <<
+/D [1372 0 R /XYZ 70.866 548.662 null]
>> endobj
-1088 0 obj <<
-/D [1085 0 R /XYZ 70.866 559.778 null]
+346 0 obj <<
+/D [1372 0 R /XYZ 70.866 533.422 null]
>> endobj
-1049 0 obj <<
-/D [1085 0 R /XYZ 70.866 351.793 null]
+1336 0 obj <<
+/D [1372 0 R /XYZ 70.866 449.604 null]
>> endobj
-298 0 obj <<
-/D [1085 0 R /XYZ 70.866 330.579 null]
+350 0 obj <<
+/D [1372 0 R /XYZ 70.866 434.364 null]
>> endobj
-1050 0 obj <<
-/D [1085 0 R /XYZ 70.866 257.522 null]
+1293 0 obj <<
+/D [1372 0 R /XYZ 70.866 350.547 null]
>> endobj
-302 0 obj <<
-/D [1085 0 R /XYZ 70.866 236.307 null]
+354 0 obj <<
+/D [1372 0 R /XYZ 70.866 335.306 null]
>> endobj
-1051 0 obj <<
-/D [1085 0 R /XYZ 70.866 163.25 null]
+1375 0 obj <<
+/D [1372 0 R /XYZ 70.866 304.388 null]
>> endobj
-306 0 obj <<
-/D [1085 0 R /XYZ 70.866 142.036 null]
+1289 0 obj <<
+/D [1372 0 R /XYZ 70.866 195.92 null]
>> endobj
-1042 0 obj <<
-/D [1085 0 R /XYZ 70.866 68.979 null]
+358 0 obj <<
+/D [1372 0 R /XYZ 70.866 180.68 null]
>> endobj
-1084 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F99 531 0 R /F177 852 0 R /F46 525 0 R /F174 789 0 R >>
+1376 0 obj <<
+/D [1372 0 R /XYZ 70.866 149.762 null]
+>> endobj
+1291 0 obj <<
+/D [1372 0 R /XYZ 70.866 68.979 null]
+>> endobj
+1371 0 obj <<
+/Font << /F95 690 0 R /F174 1021 0 R /F46 685 0 R /F107 725 0 R /F99 691 0 R /F179 1097 0 R /F162 890 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1091 0 obj <<
-/Length 2310
+1380 0 obj <<
+/Length 2701
/Filter /FlateDecode
>>
stream
-xÚÍ›Ksã6€ïþ<JU1ïGŽ[“Lm*©Ín|ˤ¦dжY‘IG¢vÖÿ~H "Èák]s±$
-ênt7_ƒ0Nœ|¼ùûÝÍß~4"ÑÈHÉ’»‡Da¤¥L”¡H’änŸü¾axûÇÝO qÂàwõÕ_Êýùmo©Ò›ez~ΊjWåeaßüpwó× ±8!­L­‘¦<IŸo~ÿ'{øî§#ftò¥ùœpÁàVÇ!ùíæ_7ØÛ‰ö­}ñV¬"fK‚pc7G
-1Døö–`Œ7ÿÙR¾)ó}×>BÒ†Ö¿¦rÈ>pŠi» ™üûÈ45H“p>¿¤›¹AB°5t
-Š(g¡Ò¬ˆùI
-¤_C§ÔgêLy•§»äÕ›OXÔyw•Ÿ ŒÕ²IÂ|Y÷¹òãLb`XfÇÄY;îÆÌ "*H„!£ü C™~ç]‹”ÐÍ(G×3T¤ðž¡ŠÃø+ÏäEÅhÌ~bÅíå=¸¯c#)3ϸ@#qÚVåû¸×"D zAS±Æ}ÃA†Óž|ê*V-×P¬ ¦©«ÂSìž³HJR‚Þ’mTFÚôøV°7I‚ÔSl‹e´h&· ntMH·Ø*ܯµUqw‹«ì¸%dsŠËŠÊ¼þ6ZõCjØÉ\HdŒˆÖUdz¶
-Ü/’£!„o
-
-Ñ cŒâÂÊ„ÛjúEiý\Eñ¡ õ<íñPw•»àVOÇl·wï‹-Á›óó}vtŸ‡‚<Ù¶n€@&fYÉpA–š#ƒÍðT€èÀ‹÷1¬×°Èb\‡Ú[
-yá§EÕ>CÜ«ýMÓjH~NOç—›Po*”º”É䚘ÀXºuC=¾5£[C‰%’ŒÏï §
-èo­$Îø˜æp ¥¾; ´v‡k(õía ôywªê‚1ØÖ‚¿±Þ"‚õ~±Í¡2*ôËps(¿ÞB/d憭Ój}6LÇ1„ö¦ö0TBïÛûö0B¶˜eè³L†C!a
-èÇO+‰9?×Pêñ3Ð:ˆŸk(õø(…€Ã½¹ÏŽuê0(˜A¾Aˆ2µ†w¨RЖªÐ;cŸPôÑ BBòé4È9Òô½iÃZ©ô²m‚e2)@ú@eSëÐ çàÂGÐàLµQD´®FƒÓ-ìÆDpª—Åx‘ cÊUlaŒ¡r3ÂÁ?Z†wbOŒç©ÇøRë×)Pà!œnX7, +¾,´Óeô2 3Qí1ù‡†õ:ûiWXĨI(¶í3×òèV«.5AÙdokOZ§Ê¡ç9­<=*ê“ÓñIóÿ>ñ
-ý²øhƒ[yn®\íÞIðÙU® íÞM?@LêÝy­>µ"—üe2ÜZÎ0°÷מOå5¥MŽàµ™j£ky u¯õ¯éÓ ì†Û^dY„—ˆp¦†ÕF®²uG ôDœŽßº›©=çˆòAhëít£:±"”X¶1;CF/¯QX)êlÙ1Ü<±ÇÂmÙÙ+õ³|¸ß²cHèv«À¯Ñ=.azií–SÖ
-›e$¶L†C1"9Ì^®ÃÚDÚ5`í™j£ hý-ÆÚ½Ô5ÝŒn$¬$L- ä">‚ ©é:LM„@ÐÐgê™Úãñ¼Tþ±‡©cÆ´QlL7" ‚k¶,ªÓeô²4UANüíR׋+ ¬GÄSú”ÙIÛ7wIù²eþÀh{qصì†O!M§ü7\óßzQeÑÐ>&ÇÈØ'•Üèýø1+²ã®¥èf‚?sÿÏzYê'ÈÜ+ÅÍ;B¿Çæ{á?=XþnÎíþ£¨²Ã'*¤ûøÏ—¬øå×– Ü
-VÆúIA”‘.2vÛ‡‘íÃýŸ‹*oNÿœßëDhÑÿ² øPÖ½Çëc= +"Oÿ;O¬Q
+xÚÍ[Kã6¾÷¯r²i.ßs 2l`gwØC&¨eM·1nÉëG²³¿~‹Ù’E©%QäbK2UU¬,~E–qò”àäÝÝwûI‹$EZJ–<|NF©”‰ÒI’<l’ßV¥ë{ªÒտׯªÃw÷á9;l˧õï?'œ3$™ö &ÌÓ»·wÿ¹#ð'ä"8MQJy’¿Üýö;N6ðÛÏ FL§ÉŸ¶åKÂãFØ.ùp÷Ï;ìň
+si¾¼é«€í’ Ü01DÉúž`ŒW¬)_UÛM×>BJ5µoS9dxF_Œk
+PˆL~?Ð B5JI»_^öyÀf®‘l ‚"ÊY[iQ†ü$Á¥‚/¡S¦€3oë¬k"V›âPl`˜Ñtõ l¬¸§ ¬ ºpÛMQž>|;hhÆ™vq&ëv1f®Qº9r†Aåíªüotc/R"­["]çP%ejçP¥¦ªíœmyb4d?шâKžNn€w: üê Al.ó+8Ï’{Ê9LY Lîí÷f"e‡ì¥8
+Æö!i-sqÄöVQ¡ É€Öi!Zh*Þô<£ˆI@“
+D` Õã,4¥aR@‹™j¹lMjˆ|𴵫ó!/\ ²Ó¶*Ýݶü¼f&ÀíX½Ø_P×BqNJ:ÃÂ.> ‚)‡q” 1†ùCÒHŒ!l3X¡(ż={@ž§7 rKí®zÌvÖÓó¡È6îº\¼:¿<”x5îd˺À€ !:
+Üé2ºò²d
+1™Qç ·¥÷Ha†üÍG‘Ÿ¯s¡úì¾³ÒRðÉuQ1’ ²âzÉrË•mØÒ “]Ÿ¼*'˜\°¾ó“u~rO`n²sÁYRß,T´Ü^íÉN~ÆnK?w•àmSÍ+;ÿ#,NŸòãy¿7“™ãÕ åìv¾] pr*­c¼çNt4w’ #Íé|ò4U@?{2’øu{ZB©§O-­ƒôi ¥ž?µ”’ÛQÐOŒƒØHæ$Æ0'9Š9©aæ$!àpµ„_(DuÍTÛ/c©“ œóa0•玕–BÞÀôf¬ô16†ð5­ÏØtê›36‰â8
+øq2Üj.4„gÁ—alBùå#ÛL­Áµ¼©t_ë_ѧÛ×LjÀ‚G'ìÀe‘ðb¸
+s!ìêjŸþcd!¦¦ée›À/Ž]¢Æ
+í8í‚–ˆ>550µ €Yª<­)l?äó”‡!oêþàv%Lº4hÆÎÉft¡HM
+WÔ'ÃÃ)5RXD é¥)Ž¦Ê¹ö† ÷Ã9OyΦî÷¦*±‚%¾8x<«›íªïŒu~ZÛ¯lÄþIJ§0Ùò.z Bฺä8~ËYì&¼Ù¶ãf8™d m§*ƹƒÃ`žáaÐ4àõaжÐeWçr(”O6¶‹ˆ "ŽŠÅÉðÈs b«•‰°5Ô€Y×ùœ­ñyšÃˆ7¿Ž¸³lÒ“ì¢"”ŽÛÉ“á‘Â,yl%›9G›˜²k¾jLÒÚ÷<õa¸Ú_G{м ГÍë‚ÄL}B܉jœ 4…ŒP/@ÅSp‹)PQª‘Í÷<KmߦÖ_Ìé¯QÌÅKQž`œjD€uÜqjœ "V¶ð8rºj¤1LWh(ê“×[=8ÎS²©÷¡žÎ
+%¡2ÉÚÝùkÕ%­ (ÁçÃÁúaÒ(Á¤Þá­¶æ4rMVõa¸}t= 7·ö0Ü¿”y¡®X”®6Å1÷®y¬ÛM²‡ðž
+æþ5«lw.¼ WæÚxÁà
+ÿÎ?öEùëûËÁD e2óÿ\ó5Ò=yh™-ì¿Ø|›!|¼x§þ²}<Ø2KMo³¾÷ÇÊΖ¯O¶AQŽþ?DÍ=~
endstream
endobj
-1090 0 obj <<
+1379 0 obj <<
/Type /Page
-/Contents 1091 0 R
-/Resources 1089 0 R
+/Contents 1380 0 R
+/Resources 1378 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 934 0 R
->> endobj
-1092 0 obj <<
-/D [1090 0 R /XYZ 70.866 789.024 null]
+/Parent 1386 0 R
>> endobj
-310 0 obj <<
-/D [1090 0 R /XYZ 70.866 771.024 null]
->> endobj
-1093 0 obj <<
-/D [1090 0 R /XYZ 70.866 745.88 null]
->> endobj
-1038 0 obj <<
-/D [1090 0 R /XYZ 70.866 637.412 null]
+1381 0 obj <<
+/D [1379 0 R /XYZ 70.866 789.024 null]
>> endobj
-314 0 obj <<
-/D [1090 0 R /XYZ 70.866 622.171 null]
+362 0 obj <<
+/D [1379 0 R /XYZ 70.866 771.024 null]
>> endobj
-1094 0 obj <<
-/D [1090 0 R /XYZ 70.866 591.254 null]
+1382 0 obj <<
+/D [1379 0 R /XYZ 70.866 745.88 null]
>> endobj
-1040 0 obj <<
-/D [1090 0 R /XYZ 70.866 507.094 null]
+1295 0 obj <<
+/D [1379 0 R /XYZ 70.866 661.721 null]
>> endobj
-318 0 obj <<
-/D [1090 0 R /XYZ 70.866 491.854 null]
+366 0 obj <<
+/D [1379 0 R /XYZ 70.866 646.48 null]
>> endobj
-1095 0 obj <<
-/D [1090 0 R /XYZ 70.866 460.936 null]
+1383 0 obj <<
+/D [1379 0 R /XYZ 70.866 615.562 null]
>> endobj
-1044 0 obj <<
-/D [1090 0 R /XYZ 70.866 376.776 null]
+1296 0 obj <<
+/D [1379 0 R /XYZ 70.866 519.448 null]
>> endobj
-322 0 obj <<
-/D [1090 0 R /XYZ 70.866 361.536 null]
+370 0 obj <<
+/D [1379 0 R /XYZ 70.866 504.207 null]
>> endobj
-1096 0 obj <<
-/D [1090 0 R /XYZ 70.866 330.618 null]
+1384 0 obj <<
+/D [1379 0 R /XYZ 70.866 473.289 null]
>> endobj
-1045 0 obj <<
-/D [1090 0 R /XYZ 70.866 234.503 null]
+1308 0 obj <<
+/D [1379 0 R /XYZ 70.866 389.13 null]
>> endobj
-326 0 obj <<
-/D [1090 0 R /XYZ 70.866 219.263 null]
+374 0 obj <<
+/D [1379 0 R /XYZ 70.866 373.889 null]
>> endobj
-1097 0 obj <<
-/D [1090 0 R /XYZ 70.866 188.345 null]
+1385 0 obj <<
+/D [1379 0 R /XYZ 70.866 331.075 null]
>> endobj
-1056 0 obj <<
-/D [1090 0 R /XYZ 70.866 97.148 null]
+1309 0 obj <<
+/D [1379 0 R /XYZ 70.866 106.138 null]
>> endobj
-330 0 obj <<
-/D [1090 0 R /XYZ 70.866 70.866 null]
+378 0 obj <<
+/D [1379 0 R /XYZ 70.866 70.866 null]
>> endobj
-1089 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R /F46 525 0 R /F160 682 0 R >>
+1378 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R /F46 685 0 R /F162 890 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1103 0 obj <<
-/Length 2928
+1391 0 obj <<
+/Length 2409
/Filter /FlateDecode
>>
stream
-xÚÕ\KÛF¾Ï¯r’
-U$`q;¨ÑƒqG¬eE>=oç5RKnb0U(˜2Ó‡ S€t _͉ŒÂV+Â*˜íö³ý²NY+‰£QfØ¢\e†—ë徆©s¹€ÃxrʈU•Õ [H°ñGª(r®ìAƉ.ßLËE²ÞO÷aœ9Á8ÁˆTÇq)~3¥ÝA¨<Zmæ¯Â 
-Ä2“‚5w>!Ü*¢@Õ36€+WEa/xüÌÎ
-<î—‹z Ѻ]!9hA!a*z‰¿›O?%‹ý—m‚¶i\« ª”mUFrNœä´‘\-x£>¥5WVçª5·]Ívûå>Iñø¨UWHXºU]…»ˆÇ
-öŠ;_P5ÌäRâ„'Ũ¾Œ3ÕWà ‡r®ða»m™Â´óv#BÆP– ²Éʪk”=¡»Û§`™›·0¨k„j·GÔ-U u,O!T£ºç6é¤ïr=oF †ÒvC$à$ç&ŽÚÀ}?-¼a=¬?Õn4°pŠŸ
-ךñîǹð"ãË€{É®º³ç( CÍ0¤ÑH ó.†"­‰±€´€J¸S¬
-ªÂTb Þýø×ã]dïVùŽPw–ï& !ÚI\†z
- ¡¥gwçÓh)Ëáê'åçÙü©G†iz˜0j‡`Ñë9º¥!Æ|JÒ0l–ßdUœå<UgÛ¼*é88·éæ¹Âa–>²tŒrvˆÉ
-®tt‹¾Wô„äEAðç|ó¼=쳿1OŸ†ãogp¸f7 eGïο{W4ÕÙ4æÙèœø. Cý¥æ»dïopJñZòëwE¢ìH4ARÿÃ’9è³8ÎA!)?átüÆ-Ϻñü¦Ùú§>A€÷~Âqˆ |ùq¶Z";hfêÀ¸Ufã<ÙÞ?ä>Y$»y˜—û$p8ÊS䵯%.üñç„«ñluHv~T6#Gé‘DŠ¼Â¦4ópyU7'ëë—ÐzѼ©ÏÖRˆ¯_'Uq”s³d9ˆ¹ÃÚÌ–÷¾²
-üô¼fsGæÛíD6•Dh5C BÜxªX¾çôŠò½$ÌØ‘t`™…êY¿—àBv¥PWaàð;$¶DèK|ðÓb0Uœ€?RâÙZ¿7BDá«‘¼Â¸¹„åþ8“l ±ª2ÉÍ5|/â`®œrÂ/s•Xñš6Öñ-¡œ]UÇ7œ_.?‰Sù¬±ŽkœŒÖ"›ãpüG‚;Iø€(šë5Òñ‹…|2ð …3E‰T&†
-àÊ&M/®-æƒ!cíÕm K@±úH!3çºIŸjݳ ÎU ïr1ÿV(Il„ÒÉT_ÜÆº¼%MVeÔ:'ZAc‰µ¡àshÒíL·zï•ÕüöZ)§püYAa´GϽë¶/]Í%­¶1”µ¾¦¤ì‹óõ›'œ‰­PpÀiרmM\_]Ë7®ÝÁžµ4†£K×O‹!µüJTw+¬9Øè,„V!%õ>IÂK¨tú´÷æfô!óa§StÛ¦!„™z·fŠ^ÆT–Øõòž}ï™]Ýü*)\ÐýÚ•BKû+’BõŠö×\Cÿk‰ë¥þ×|}l‰í¥ØlCl‰okl¦¡¶ÄÓþ[`cLIè­àðR=°4ðM°}äßA¼ ¶I¡ïª 6‚¾ylU_-¿ç6X’3&F,’2àA·*þMÛ`#(›·Á^¯ì·kƒ nÞÛ¤î ´ÁÆÐ"´ÁöÑ"ªë,q³ëà:Û¯æ:«®³ä/â:ó«Ïý1 ïÜ‘@KÚ)iqEÖ9KŸt.r¼˜sŽÀ5¤œ‹l/eœ#p ç"×ö|ópžyº¹ÈÓþ³Í¦$$›Ë0¼X®y¸yª¹‡Ñ3ÍõÉÍ Ú|—yf>¯5*F¢IáGǼk­GõÍÍ4Î3Í4þV™æÚ†TsIÛw˜¯K5GP7Ï57©û¹æjäÉæ>j|½d³ý.’ÍJ¾ˆÇ,‚ÇÜj€9˜.ÃM Œ¤·•ƒ§êîâ²ÐÙ)xSF &Ë‚7¸é†f‘\ @%M™ë3œ­Y3.·MÞ¤@Â×y“Rt3- XséX3æÅ˜<3e ë¨Ýd<ú¯ÎÎ 3ø“dè'^‰¡À&YkËâ…oìÎã?°µÝ¿nåZƒHþãÖ|3õ[³ÀÆ ëÞFÃwð21³°q>naNiŒÖ[{²­íß-qÝ>n=~Ò:²˜\ÁÖÇ¿æ–ÞîžáÃ,ò†}À<ŒFÀØ€Jvh—6Uÿa>nXÑ
+xÚÕ[ÉrG½ó+p"Ìrí‹vŒc<o’M
+!€Æhô÷óª…^ÐK‰ö\ØM²:3_eU櫇%\M'Ô_ÞÝP‹ëÏw7?¾ujb‰ÓZLî&†«õÄ8N4›Ü­&§BÏþ¸ûu"”$’ <—ýõ·íêø”Ìn¹±Ó7Ûåñ9Ù¤‹t½ÝøÁ7ÿ¸»ùó†a,°“Mk‰år²|¾ùø¬ð¿_pvò5ù<‘J%½§É‡›ßÐ ê,ZFMM¸šZÆ«ˆ%OÌn¥túŸ—ÓízU‹qI˜±ÙÓ\·Å…Ép§ Î "©îk ”PwäËónYµtÄÊ>'J„.fLM·û¯š#D ·ZÉ/üüÚ©ka:Ê [C¬º˜áõfÖ8uîá8§œrÂÊ#v¦ÓOTQïüb2K(gå6[¯°¯æi1ÎMÆ!&ŒŒÎËqŸ(ù fÜù!‚=m—?ƒÂ¹Á26²…eWŽ‚À]ŒDp'‰³ê2©àuñ3¤Â
+ É@3Ý0ym=n¾Ôn5E´:«\Še8J*üã[©ƒ’¶*›Ü¢Jhåò§>$IñG½,à¿w3ù˜1áùÜ“¶ùÃLPШyNkæžfÌeà?nÑv5øpfùM‚5Ç1Î3èÌÔ"ͯOëMA³Qò›íC~õ”~ç‡% Yîv3¡¦$÷0èË9A‚cÕ¨€9ëÌYÇÔD™Õ¯aÔ™é÷µP[ÇQ2„7… `ê
+wVÆDñ
+ö̵ ½¶ÒgǯöŒ8tÛÌžAµhœI}Vîb’›ésáh§œ¢¬¨Ð§År¬‘<ûSŠëDž¥rʽtWɳ&–™ö¦†SŒÔS‚²Ä•»ÌCKyäî*{Æ0­Û!‰:Áb “1(þ®Ü9oû­ý
+,ÒIŽô}EðF@–Áû-»ëìô«vš¡üFâQÒ§(¨:c¼ZÖཅetqû¨ä¹}Ù,áhìõìw\á¥Ä‰Ü
+mp? ETê,ýf×u¶ß:«îÔÙP÷¨³ ¨³é,:+*ªÔÕ¹¯…ÙYY‰£×eçNsÝ9ðyUwŽá·žÇׄç~ å9ðÛ®<GðZJÏWûÿ,=ǘ”B{¾HÅ«iÏ ”âóÑÅçxJõ¹ Ï««Ïºƒú¬ ªC íY»¶–^ýåÊóh´¥îÜí_¥:GZhÎgH_5wSœGC-õæz¨¯¡6†PjÍý!|?¥Ùþ”fÃÙ«(Ͷ Ë­ÅBYæ1Ê­7å¯a“¹$º~QèÞnÏ-ð#%pO˜ o è†frH ¯©’&ôúŒ>Š*{˹mâÂîÆ¥èWúZÔWs­9d1&Æ÷ FYÃ:j/OÛûÅSMA”ˆaXxCæÉ¬ ÃKóShõè‡:Û\¤N×`W£Fipõ{³ØÌ¿ûÃîb¿xNüalz¨7Ukòò¿uoŽI¬GÉlû›cš8§jvc,C+5‚ÆôµØÀè\é ’$ƒ‰çDhl.-ü‡åê®+D6ã½M†áÔÀ±5϶Çý²¨é`ñÒÖ›¢­àW…ïÿCjTe޶¢ù€
+‡=̵bY#9Ûýó´V*=Èy}ž«¾óÔ¦Ÿ÷Éb•ßo<‰9>ßgU¿·¥¸ohÕìø¦ÈÆ%¸·‰ú’SSØ5ø¿Éø ¢ÅPï“ô¸ßÔ—²ËY“4Ëë'EÙ-Ôú¡œ÷õ¡šÃçíñ©¸Oü–û¯ÿ‘,iRNŠâ$œ2yþÔZŠÖœ `Y/Ýñ~ÆiVjpùòCî€<Žö_ׇiju
+ðÏõýÞ3XvR¶ÎU®7ÛŒÎ~{Ì$› ÄcÝü2
+8J
endstream
endobj
-1102 0 obj <<
+1390 0 obj <<
/Type /Page
-/Contents 1103 0 R
-/Resources 1101 0 R
+/Contents 1391 0 R
+/Resources 1389 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1107 0 R
-/Annots [ 1098 0 R 1099 0 R 1100 0 R ]
+/Parent 1386 0 R
+/Annots [ 1377 0 R 1387 0 R 1388 0 R ]
>> endobj
-1098 0 obj <<
+1377 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 451.339 189.203 461.813]
+/Rect [88.313 721.564 189.203 732.038]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gab516cbd738ec072f4929faecbbc456f9) >>
>> endobj
-1099 0 obj <<
+1387 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 364.236 189.203 374.711]
+/Rect [88.313 634.461 189.203 644.936]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gab516cbd738ec072f4929faecbbc456f9) >>
>> endobj
-1100 0 obj <<
+1388 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [88.313 277.133 189.203 287.608]
+/Rect [88.313 547.358 189.203 557.833]
/Subtype /Link
/A << /S /GoTo /D (group__WORK__SHARING_gab516cbd738ec072f4929faecbbc456f9) >>
>> endobj
-1104 0 obj <<
-/D [1102 0 R /XYZ 70.866 789.024 null]
+1392 0 obj <<
+/D [1390 0 R /XYZ 70.866 789.024 null]
>> endobj
-1105 0 obj <<
-/D [1102 0 R /XYZ 70.866 733.983 null]
+1310 0 obj <<
+/D [1390 0 R /XYZ 70.866 704.936 null]
>> endobj
-1057 0 obj <<
-/D [1102 0 R /XYZ 70.866 521.813 null]
+382 0 obj <<
+/D [1390 0 R /XYZ 70.866 689.695 null]
>> endobj
-334 0 obj <<
-/D [1102 0 R /XYZ 70.866 506.573 null]
+1311 0 obj <<
+/D [1390 0 R /XYZ 70.866 617.833 null]
>> endobj
-1058 0 obj <<
-/D [1102 0 R /XYZ 70.866 434.711 null]
+386 0 obj <<
+/D [1390 0 R /XYZ 70.866 602.593 null]
>> endobj
-338 0 obj <<
-/D [1102 0 R /XYZ 70.866 419.47 null]
+1288 0 obj <<
+/D [1390 0 R /XYZ 70.866 530.73 null]
>> endobj
-1059 0 obj <<
-/D [1102 0 R /XYZ 70.866 347.608 null]
+390 0 obj <<
+/D [1390 0 R /XYZ 70.866 515.49 null]
>> endobj
-342 0 obj <<
-/D [1102 0 R /XYZ 70.866 332.368 null]
+1393 0 obj <<
+/D [1390 0 R /XYZ 70.866 484.572 null]
>> endobj
-1037 0 obj <<
-/D [1102 0 R /XYZ 70.866 260.505 null]
+1290 0 obj <<
+/D [1390 0 R /XYZ 70.866 349.38 null]
>> endobj
-346 0 obj <<
-/D [1102 0 R /XYZ 70.866 245.265 null]
+394 0 obj <<
+/D [1390 0 R /XYZ 70.866 334.139 null]
>> endobj
-1106 0 obj <<
-/D [1102 0 R /XYZ 70.866 214.347 null]
+1394 0 obj <<
+/D [1390 0 R /XYZ 70.866 303.221 null]
>> endobj
-1039 0 obj <<
-/D [1102 0 R /XYZ 70.866 68.979 null]
+1294 0 obj <<
+/D [1390 0 R /XYZ 70.866 219.062 null]
>> endobj
-1101 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R /F46 525 0 R /F160 682 0 R >>
+398 0 obj <<
+/D [1390 0 R /XYZ 70.866 203.821 null]
+>> endobj
+1395 0 obj <<
+/D [1390 0 R /XYZ 70.866 172.904 null]
+>> endobj
+1389 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F99 691 0 R /F179 1097 0 R /F46 685 0 R /F174 1021 0 R /F162 890 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1110 0 obj <<
-/Length 1354
+1401 0 obj <<
+/Length 2895
/Filter /FlateDecode
>>
stream
-xÚÍXÛnÛF}×Wy¢
-¾¤†žÌ¨OЗ6ƒ2ç8m}b¬«ü¿Ü›¯_ŽD}ï³*ôS‰·f‹æÀ"‰ý´nüÐê {
-F¿pA¦ò>ð=
-j’€–¸DTTqÕº*ª‡®öë'§÷ùß (ź3uÄP%A]’=uô/
-Ê÷Ï<æŽ';•·^@FÁžîð¶O¸1„;^¸IH&ûu›Ä q¬Ïjûçùð3]h÷‚_F· Ãáý€l;1êèDßzœjÛ?×Ç7 ǹÀ‚ŸEðy>Á
-Rv&½X ÝFhŠ8Lß­³{P¸{œäa胲m?³GBr&çñz¼þÐ"a`ÁIä@™ ïßm»nªñ¶›o8ç ¯4Lª ?FUÜÇœ«aöWõºœéDÃÅfìÂu_æ]ù‡»o¶©ƒdƒ…ÍS±²îi‚
-pjèÙð®Ëb6%®@ü1XöôhÝBwcÒ¶öÀÜÃlLµ 5Ìã0 ‡¢•Á@|Ö»¢õZr‘Î
-Ónѽò›Ïëª-!“¿w{„Jz$;Ïñ»rWÏ­vsü¯Y#Ð
+xÚÕ\KÛF¾Ï¯ r’€ ÓïGŽ‹¬ ²H֞Ŝ` ‘èÂQ!©8Þ_¿ÕrÔIId¹XÕ¬ª®¯»ºŠ_yPò˜ äíÍßîn¾{£y¢R-Mî>&¥JˆDj’
+œÜm’ žªå-‘jñŸ¥@‹²úä¾½ZUùöqùÛÝ c4å’‚Lû•æîÍßïn~¿Áp%¸¬TªKÖÏ7~CÉ~û1A)Õ*ùlG>'Œƒ0f„Éû›Ý ol÷™n.͇ŸFò`B§J&R°T æ,z—5ûj[[³Žå}÷†‰ƒ§±JcÉ-|"BÝã?o37éü£ûlžòº½ª²ÕÆ]×Oå¾ð×Ù’¢ÅŸæŸl½o²v°¿¨Ás…¿^—Ûº©–·˜/öëæ[wó¿KøšU¥ûVƒÕç¼ÎÌÝÔºüK°S%ð{ÊaºÖλ%& °n–·ûü”™Í½hJwóÄ0ssed‚I4x‚ë ¤
+Ôæ°ZO•$:g*%H§ …se°Ø©„…Ï‘‹LÁa†Iªq™òM¶mî?N:ŠSŽU;võáPêã1ÅH·ƒŠrý­zFÀe3aÑõ¸DÃù&¢à@´€m|ŒCCIŸýâ´êfùØä›þÀÞÁbt”ãc#Ì€Âa/‘šA
+v¹Wõ9¯š,Làa"Ò3 ¿3
+[1H\Ø÷bÌRLœ(®½Êý€a½„Ð^ÿb£'Úêb&•Õ¡]cîEâü¢5íð¢ÅÊÅ©
+›d9°}(€,1 ÌY§‹áUêø±e£‡Ä‹[óíº2Eß`@“g¦!DÊtœi@U‡Õ´i¬Mð´ß~ê›JÁÉËB⸷J Óf(»ÀȾà‚@\÷õ×/&?^U«ç¬ôãEÅÙ/óø×¾òY@‘@!U-Ÿ!Ѽ'ÃŽ"N~(‚¸ F…Ñ.¢[†‚•pFA)y—WõE(DMš3MkXÞCÂA4”¾/÷U[Ú+[uXÁ¡@P _oÅ)ˆÙ4qŒ³d89”
+ÏDŠ-*)Èð¤|É.‡qœ¦¶Æ@ëÛ¢|X§ïeúliѼږ ¸}W†g9O†S!¨ïÄL4!rjÈâ¸b)bþõ×îÞdµ#xNÓÜh ¸„ß¾HiüË0k‹¥’ù<Ýk“¬Gà¾ÚÔS¬²/¼fá=K†Ç[(HÉéÜÝ+RÈý9Èzµp?Œ€=Mm?ØÚ>°*ÍÛ<û¯ýé¡ÜoÇ6ôÕö¢#$l:áY2<œŸ«X.A˜ÂFÄi*Zˆ÷cOÓÛq ¶âïv—B{µ]§°€øu²sDx`™+ú¢l]ÊiqÓÓÔöãz¨ö}“íÚøËQÙ¾ù†ê!{ζMø"üË’ E¹w_vUöÑrU—y÷Cµé§¸¬Å<ìgÉðàSød$BÖî甥jù—rmýizûÑ?TûSYîŽòj+NA ð9.â<³dx ±‚ÓKEJ¸ Ž$mA²n‹Õ$§)îGòPï]ËO:<Ué¸È0h?˜MlŠ5øð?çÍÓîWÛ|Š™¡f•ž‡ûõ2N}çe™·Ñ×QF÷ÛµÉGk÷ÕpŠŽfeØS˜pwïÎ<s¹‚Ï^aªcnÙó°vÏvãZz5ßxa–Ù5£[áuæ‡ÚÐZVGÊë¬q†74ŸA]
+ÅÐ#ÚxÓ±–2¼ÛEñÆSæµQºXï«Êžö®!ÄìíUù|4ÒW«¢ð"êõS¶Ùv2ðsaÃŒ{bÕ¸{†L5w6Y½ö^ypãÙ5´ÕÁ,K•›ÑÜýcIøbUì3/Åúãp´÷¿ã“)“ïíÝC/ð—(ì=f^Ü¡íž2÷:\Ì«Í Øäxk»]6fDÈ©{±µ{h·òü®»m¦àyÞ•uÞœm7ÈEV¸;ÎÍÖàc*_*lÖyõMû`Ý“–ç·EÑVáàƒ¯¿`¹ùîDÐ%Ñ|ÙeuHqw¿­ªÇ½qrýÒ1CW”Sèv ¦ëÝnI½šI:¹Œ@‡•!–r&'è¶âµ†tæDQ¦Î1è\GQÊÍI¤C¥ º€CSÆÑ*ÝÛø@ë(…ŽI½†BG$Ô;Ì¡ ¡bh5¼å*ÔÊL.NÉ ‹.–‹Ht&É„Œ èŠa´I+¢,vŠ`<ÇHŒ0 _¢Ë3:ƒØe)Q¾`dp'¼»¦^ÆÊ©îIt;$;ë‡Yt•*Mϰè"%˜Åð,#Ê¾Ä lÛ¹"¸¤l®k™`©$:†k™®ŽbÛ0‘~ŽG‡ˆ¥h¿j(d»Ð¯·Â.Æ"Ì7Æ(_1Fùš
+@°ÄåšÌâ| †—ZQTÓÙD:‡éAR1Ͳ#mPŸcZ6J¥óK¨ôQ¿*n[1bø¢ "´~™nÎí\§çW{8h~1•®Æç )ì˜(s&<NšÃý¨„¾%h„ ‘Ïy
+à}–ù‡Ìœ«G?ùwoo’6%¿¿7Yè½É
+ï]’vor¦{èšT 0ùU*zq+-µÞlF+íµFZi(Â.ꥡÕ÷ÒZÇ›ichõÍ´ÖsÝ´1ôúnÚ@ïx;m­m;m Uý…ûicøÄ÷Ó!ñÕj#L¡m¨šÂ+vÔN³¾·£6°>FKm϶-µÇžìÕ{j#x¶í© =;»©6†_}Síå~ßUK?G \ÚUkD§©všY½Mµ‡f97ZOm —ºžÚCÓç·ÔFðiÛR;àÓ¯ÑQc¾£vÂ,¢†R‡hã
+õ:…
+3r%C©§¥ã”@ ­ž´ž£bèõ”@ wœˆ µ¥­ê/L DðIK !ñ•(ð”ÀÐ^‘˜f}/%XƒˆàÙ–lÛeTq)®m)еs)~õ”Àe~}J€À'T 1(#
+·–a>%0Ͳ^J °l´ˆF Äð«§ëgSÜê)!¯¾>%cŽ˜2‡×£ÔÿŸøúJ`ä?ïqóÊäš¿|Óþy@GBx:è<äö|tÿé)ÛfÕÊtä9[ýtÞT¹ÿ;=mk6þaæÿ‚ˆøžðï[âã£íËö½ÛÿØ6Yñ+áþ™ŸwÙöŸ¿tBÀIO•ËqJ(>ÙP`Òn¼Ûo›üÙ»ñ§ü¡2}`ضêu¥þú‡Òv~y´²í±‹ÿìL¦
endstream
endobj
-1109 0 obj <<
+1400 0 obj <<
/Type /Page
-/Contents 1110 0 R
-/Resources 1108 0 R
+/Contents 1401 0 R
+/Resources 1399 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1107 0 R
+/Parent 1386 0 R
+/Annots [ 1396 0 R 1397 0 R 1398 0 R ]
>> endobj
-1111 0 obj <<
-/D [1109 0 R /XYZ 70.866 789.024 null]
+1396 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.313 364.851 198.94 375.325]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gac43752941984fb8fda7dc8f2a430f4cb) >>
>> endobj
-350 0 obj <<
-/D [1109 0 R /XYZ 70.866 771.024 null]
+1397 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.313 277.748 198.94 288.223]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gac43752941984fb8fda7dc8f2a430f4cb) >>
>> endobj
-1112 0 obj <<
-/D [1109 0 R /XYZ 70.866 745.88 null]
+1398 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.313 190.645 198.94 201.12]
+/Subtype /Link
+/A << /S /GoTo /D (group__WORK__SHARING_gac43752941984fb8fda7dc8f2a430f4cb) >>
>> endobj
-1043 0 obj <<
-/D [1109 0 R /XYZ 70.866 661.721 null]
+1402 0 obj <<
+/D [1400 0 R /XYZ 70.866 789.024 null]
>> endobj
-354 0 obj <<
-/D [1109 0 R /XYZ 70.866 646.48 null]
+1337 0 obj <<
+/D [1400 0 R /XYZ 70.866 687.528 null]
>> endobj
-1113 0 obj <<
-/D [1109 0 R /XYZ 70.866 615.562 null]
+402 0 obj <<
+/D [1400 0 R /XYZ 70.866 672.287 null]
>> endobj
-1108 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R /F46 525 0 R /F160 682 0 R >>
+1403 0 obj <<
+/D [1400 0 R /XYZ 70.866 629.473 null]
+>> endobj
+1338 0 obj <<
+/D [1400 0 R /XYZ 70.866 435.325 null]
+>> endobj
+406 0 obj <<
+/D [1400 0 R /XYZ 70.866 420.085 null]
+>> endobj
+1339 0 obj <<
+/D [1400 0 R /XYZ 70.866 348.223 null]
+>> endobj
+410 0 obj <<
+/D [1400 0 R /XYZ 70.866 332.982 null]
+>> endobj
+1340 0 obj <<
+/D [1400 0 R /XYZ 70.866 261.12 null]
+>> endobj
+414 0 obj <<
+/D [1400 0 R /XYZ 70.866 245.88 null]
+>> endobj
+1399 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F162 890 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1134 0 obj <<
-/Length 2153
+1424 0 obj <<
+/Length 2165
/Filter /FlateDecode
>>
stream
-xÚÕ[MÛF½Ï¯àQ2þþÈqá8Ø`›µçf-Ñ3D$j–¢ÖëüúT‘MŠMQ’â °%5«ª_u½~¬¦iôÑè—»¿=ÜýøÞ©È§µˆ¾F†«ud'šE›èÓB»¼çÆ.>~ÏÖKFOù’ÓÅ>KÿŒ‹tŸ-ø5’ReX-�ûùáî?w ¾¤kL[K,—Ñzw÷éwmà·_#J„³Ñ·rä.’
-ŒI4¶>ÞýûŽúp)á
-/ñžQ1Ncª¾f„ñ3Ji5ƒñ3ÆÁ…·O‰QN£}Ý J$å•é÷Çl&¡ ÿ÷Ç÷R· ešk¢{áUøÌ¹
-î>Ý+¥ÿ]rˆ0Ýøß¾üÑãø¡… Y­þØ=¯WŸ)ÇÃS׎øL½hc‘n’¬X²Åªî…%á"qórÎŒB¯S‹Þpxgv’8ÛŒÙî×ñ„ˆ€…‘Ý3@€2‰Ä)6#_â<‡\«Ešäçp˜!p¼€—„ 1‹ª† ÌUš‚W·û/ñvU¤›^œÁu]áįãt2<(È{ƒÕjŠ>Èì YF $ß1«‰–üVV’mêÕ%_1£‰‚›1F¤dûÆp‰uר*Ûc¨ßðŸ8-^@“áÖ½ ‚è‘›ÙŠT0^˜'›ã:y0ÁÄ5
-€#OLpÞ 'p¬ïw±ÈPFw«²ãüÐXb‹Cú'~J àrhÂ})2î™q„dD`û=tUßÒJ`»¶;s•’5ªº|6qwÌ×Àw\ ¦œàâ+è \bh÷ÊÐ>è“1”út苿Ƕ2D *Ævîmcà­úYûÊ/Ò5,…,Þ%=Þ¥Å쨩¬Q}þÑS‰’
-”m¯CþU†P,½á€ë|~ ŠÚŽc†‹ ZÇÙl\)E‡+»v¤˜ƒ<AЉɆµ“É8û_"Gix@Ž8ÔÓFH€S*T]:dÊ+eÏ,1l”ÆŸÆŠb‚‹¹Y‘McÅQzâvRt3Õœ1DSýº¬ø*ZR2ÕÿWxy“ºÞV¸Jjá/P²Mß‚0ß¹x—qºM69·ðé°ÎÓç³æE'"
-âT]Û{xJI5õ¯Mߢüçþûã¡t#–‚.öyõ!Ý=o“d,Í«oÚÚ%A‘!Ó¤~‚æ4Aî'XwRü÷ë#úÖŸ9Ÿ±k9h0„Å-›Åt¦sÀð"’š`¨+)N´kÚR-Ò'ØXM«Õ$âŠ^Yb—+–[OÔX ZÍáTÂJS2tŠ)Æ6J™¥·»…‚{’)­¢îTŒ“¢‡š™i‡a€¿u«–ðƒÂX5,'SdÎáŠGù ÀplD:Óˆ’nü°Š8m&PñMOt™ÂM‹.ðÇP»qatE½u`ƒjZû{gŸè//¬&¤>V6-©ö2â7,¤8²Äƒg¶~[½6»¿öµˆA%”qµE RÒ©žZœÅ+g+9+ÛIWlÀèJ`Y’òœmÀ˜"PJ§ª§ -QÀÖ݆ÍfX¹Ü±ÐëaÌמê!‚Ø.2|v"|µØx7PqXpšOð<=ûNü¶ßdç˜BÑZ{cŠ)01h+ ËÖ­ý“Þ¸’éiÞû3Ýv^<åIì·òtC®¤rtçi
-Øi)»QPXh
-àSáž×]ÇxfG»m[D =KàRx_NZCõ»Y¼j‹ú6ôZk§sÇŽƒ `³8vÀì–…Žý©ÄUÍæ ‘lzˆdSƒ$›½.Ùœ%Vª9p”%Ô…õÛ«ÙÔKšMHxxSÓ8 Ú5ï¤mfÑVž°‹7m‚
-"½i¸ÍFµ£Ã^4 çm¥Xg4ÛD¯½;yÛé\’m||gÉAðxzS‚o³ál
-‹Øˆy$<ƒ(=@ÂOôÚ«íÚNç’ðãã;O˜0FÞ–à›lT ƃ ææ‘ð ž÷ñØe°„Ÿæ¼?Ím߃%üè
+xÚÕ[ÛnãF}÷Wð‘¢Nß/y\L&Ø`ƒÍÎøm&8Ç&bQ^ŠÚÙÉ×oÙ¤x“LR´}±)«YU}ªëôa5Mƒ‡€¿ÜýíþîÇ÷N–8­Epÿ50”X­ã8Ñ,¸ßŸBaWÜÿ%‰dî+þúÛawzŠWknløî°=íã4òäâໟïïþ}Ç`, XmÓZb¹ ¶û»OÐ`ßýP"œ ¾#÷T‚(‰>ž‚wÿº£>NJ¸ÂKüå£fÔŒǘjÆ­¡UàŠ¸ÕšQJÃßÓíʄي©ð&#váíSb”ÓhŸkA‰¤¼4ýþ”nÑımÃÿþñ½Ô L™&Æš`Í!\£JŸ9W­{ƒOk¥tøŸ‡“ÿáË<ŽŠQøfóçþy»ùL©8»vpÄgªèEa²ƒl­X¸É[÷ÂZpƒ¸y1gÆ ¡‚WGo8¼3;Iœ­Ç<¶ñ„ˆ€µ#[3@€2‰Ä)¶ _¢,ƒ\«0‰³>f /`Á%aBÌÁ¢¬s“¤¹àåLJ§Ã—èi“'»AœÁu]âįãt6<(È{Õfó!ÈìYF $ß1«‰–üVVœîªÕ%_1£‰ƒ[1F¤d㛺Æp‰uר&=`¨ßðG”ä¯ ‡ÉpëÞAôÈÍbE*¯
+i´¼1J‹ÙISÙ®8 ÿ¨DIʶ×!ÿ2C(–Þ€ÀpÀu¾<MNEm§1ÃÅ ­‰ãl1®”¢Ã•];R,AŽðÄcéÌdHÚÉÀ€ZÉè}Ï/‘£4¼EŽ8ÔÓF›
+¬V–d yN„6`L(¥óN5PЖ(`ë™nÛÍfX¹Ü±¶×ãá”m=ÕC‘'\døôLø*Ü_èà+ NóöÓñïÄoKñM6|Š)­µ7¦˜ƒ¶’ ±lÕÚ?ë+™žç}8ÓMçùcG~+OväJ*'GÐO˜ @h7¥rº>Þ–°@¬Õ ÍÏÿÅuoO¹_÷Q_À¬-õ ê¸pYÞü.†­Š§É¹N¢ÜWO’z{°Ã•‡¯+ÿðOyu"VHÌãéù KÒ0'ÛËB©%c€4lÅ·¥Œ©”Òà–‡g4Ö¤€–²…•¦
+"½i¸ÍF¹£Ã^4 —m…Xg#4ÛL¯ƒ;yÓéR’mz|½ä  x<½)Á·Ùð 6
+¼tSrD Zšé$CG5¶j'¶E´/¢°¯&¢eSD‹1"šIW”Ú"MI=NDOuÛÑKîEt+ðë"z ¯^D·¼¾(¢—pìEtËqãÕž¶H±èø"æ_¬ìL–Yø •_hºšó UK(ø%š®MjpP£“îBñÌTð°«€ôž^[ÁÕ¢S"×¼˜¬à0…}cïe2nn·Ù(£°ˆXFÁ3HÒ#üL¯ƒÒ®ét)?=¾~rÀ„1ò¶ßd£L0ž[0·Œ‚gð¸§.£ü<çÃinú­à'ÐËX¸±u>ÙBÅ=KÊ˧¼Ì_ý³&Ü 8ƒÍPSà{`gD{4‰Ó8‹jÝY•Ìû,)/>ÆÏåEÕ~å”ÉòŠéŸ¸úIšê ›Ÿ²ÿžæñÓg®ü=ÿ|ŽÓß~¯·NõeË÷¯ ±‚õ÷ÎVÜÈÑuwæÃ)Í“½¯ó$_2TôŒ†ß ß«ÿ“(´õ÷‡b@Ü>à†%ó?tS_
endstream
endobj
-1133 0 obj <<
+1423 0 obj <<
/Type /Page
-/Contents 1134 0 R
-/Resources 1132 0 R
+/Contents 1424 0 R
+/Resources 1422 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1107 0 R
-/Annots [ 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R ]
+/Parent 1386 0 R
+/Annots [ 1404 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R 1419 0 R 1420 0 R 1421 0 R ]
>> endobj
-1114 0 obj <<
+1404 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 704.801 170.794 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_ga2cb95dd19b86bd1b925be9be29a17f85) >>
>> endobj
-1115 0 obj <<
+1405 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [174.28 704.801 203.189 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1116 0 obj <<
+1406 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 691.742 177.895 702.324]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_ga84b2ebeef737395dddd8ef446c071760) >>
>> endobj
-1117 0 obj <<
+1407 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [181.381 691.742 210.29 702.324]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1118 0 obj <<
+1408 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 678.79 235.422 689.372]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_gacea2959cabb92c4a941087e524c5f3d5) >>
>> endobj
-1119 0 obj <<
+1409 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [238.908 678.79 267.817 689.372]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1120 0 obj <<
+1410 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 665.839 230.222 676.421]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_ga35415691dad1e3430caa78c9d4b34cb3) >>
>> endobj
-1121 0 obj <<
+1411 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [233.708 665.839 262.617 676.421]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1122 0 obj <<
+1412 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 652.887 266.051 663.47]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_ga5a51fa2c8f61d807895e377d6c732b16) >>
>> endobj
-1123 0 obj <<
+1413 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [269.537 652.887 298.446 663.47]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1124 0 obj <<
+1414 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.943 639.936 235.35 650.518]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_gafc5438d4c4f01dcd347d9bfde27f68e1) >>
>> endobj
-1125 0 obj <<
+1415 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [239.149 639.936 268.058 650.518]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1126 0 obj <<
+1416 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 615.029 229.837 625.612]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_ga5c40184c6babbe35c50d43a47573c5c5) >>
>> endobj
-1127 0 obj <<
+1417 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [233.323 615.029 262.232 625.612]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1128 0 obj <<
+1418 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [140.016 602.078 205.795 612.66]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_ga6a08af1c559012315e7e5be69f7fe608) >>
>> endobj
-1129 0 obj <<
+1419 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [210.666 602.078 239.575 612.66]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1130 0 obj <<
+1420 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.489 577.171 199.208 587.753]
/Subtype /Link
/A << /S /GoTo /D (group__SYNCHRONIZATION_ga2ead7ca8fe9886581c216ca8006ae3c9) >>
>> endobj
-1131 0 obj <<
+1421 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [202.694 577.171 231.603 587.753]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1135 0 obj <<
-/D [1133 0 R /XYZ 70.866 789.024 null]
+1425 0 obj <<
+/D [1423 0 R /XYZ 70.866 789.024 null]
>> endobj
-730 0 obj <<
-/D [1133 0 R /XYZ 70.866 771.024 null]
+937 0 obj <<
+/D [1423 0 R /XYZ 70.866 771.024 null]
>> endobj
-358 0 obj <<
-/D [1133 0 R /XYZ 70.866 771.024 null]
+418 0 obj <<
+/D [1423 0 R /XYZ 70.866 771.024 null]
>> endobj
-1136 0 obj <<
-/D [1133 0 R /XYZ 70.866 723.517 null]
+1426 0 obj <<
+/D [1423 0 R /XYZ 70.866 723.517 null]
>> endobj
-362 0 obj <<
-/D [1133 0 R /XYZ 70.866 562.927 null]
+422 0 obj <<
+/D [1423 0 R /XYZ 70.866 562.927 null]
>> endobj
-366 0 obj <<
-/D [1133 0 R /XYZ 70.866 503.411 null]
+426 0 obj <<
+/D [1423 0 R /XYZ 70.866 503.411 null]
>> endobj
-1137 0 obj <<
-/D [1133 0 R /XYZ 70.866 478.557 null]
+1427 0 obj <<
+/D [1423 0 R /XYZ 70.866 478.557 null]
>> endobj
-370 0 obj <<
-/D [1133 0 R /XYZ 70.866 478.557 null]
+430 0 obj <<
+/D [1423 0 R /XYZ 70.866 478.557 null]
>> endobj
-1138 0 obj <<
-/D [1133 0 R /XYZ 70.866 445.95 null]
+1428 0 obj <<
+/D [1423 0 R /XYZ 70.866 445.95 null]
>> endobj
-1139 0 obj <<
-/D [1133 0 R /XYZ 70.866 361.791 null]
+1429 0 obj <<
+/D [1423 0 R /XYZ 70.866 361.791 null]
>> endobj
-374 0 obj <<
-/D [1133 0 R /XYZ 70.866 346.55 null]
+434 0 obj <<
+/D [1423 0 R /XYZ 70.866 346.55 null]
>> endobj
-1140 0 obj <<
-/D [1133 0 R /XYZ 70.866 315.633 null]
+1430 0 obj <<
+/D [1423 0 R /XYZ 70.866 315.633 null]
>> endobj
-1141 0 obj <<
-/D [1133 0 R /XYZ 70.866 180.44 null]
+1431 0 obj <<
+/D [1423 0 R /XYZ 70.866 180.44 null]
>> endobj
-378 0 obj <<
-/D [1133 0 R /XYZ 70.866 165.2 null]
+438 0 obj <<
+/D [1423 0 R /XYZ 70.866 165.2 null]
>> endobj
-1142 0 obj <<
-/D [1133 0 R /XYZ 70.866 134.282 null]
+1432 0 obj <<
+/D [1423 0 R /XYZ 70.866 134.282 null]
>> endobj
-1132 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R >>
+1422 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1149 0 obj <<
+1439 0 obj <<
/Length 2652
/Filter /FlateDecode
>>
stream
-xÚÕ[K“㶾ϯ`|±Tåñácb¯+®¸ìØsóº¶(гÃZ œå#“ɯOãA)r´¢ÈLU.")4»Ý ô×
-Ûä¦Ê÷™§¬ZÚûƤ¶/ÈÙƒ%ÒBx €¬²uRå¯&Ø/ûÜäÿÚRÐø
-Q6Œ»ÜÔŒNé†â®Å.9Œµc,†IáZ§ 2N#C§Õ~,ÌCQ±À <•Õ†3 d‹LIáJn'_픑”É1³ÑAÈf:AN³<mÊö’‚!‰8Ÿí%ÒZLL:«ð ®·¦o Pæ  öÙdà#>0<EL‚(F’«.¸§f®¼_+vG
-€¤¤W(8v ãø<‹/»xàbÌ‘‚²ÌÅRŽ
-t·dc|‹Ã]pMüåëÚ§! ¥{¬k›B®x(–Å¥”ÐÔ"EÿÔÁ}+Ìž=Ÿ]P,M‡Všƒ‡/Zc«ŒíLÇ
-t€´~BJÜKÁ„I—‚ƒºŽn`DHNì%½¦àiè¯íç›_lIѯ`d~ʇ
-Ó?_§ÊàRÂp$—WWJŸöôXøxEûlÅ1_›±K€eËÖ–ñnáÅÐ×nûBJ5šb_qéU’§=ÚüX@jï ~q‚Ó“n^F¶×Ñ=í“:i €n9¿)³3a0·cr@Êñ²%„+x¼Zwr›½tÈ^ïr“W¶j¢Þ~öfj{…û’Ó6'þ2ØÙqE“ý7@Q_‹ &Ü.ÉT™§1’J¿$ëOEÅÐ¥BvN·rŽ[‚7MU]2¯b×…Ê¢¯mÕö. ÄMå6b€<7'=O‹²ÌªÇÂìm‡\±FÁ»PÆ v­zRýM4ØP——v”Ú­¦·(íäÅ¥p *»™ Îv–“¼h;e™¡¬ëË<[Õ­ 2u}‘a Mì¥h(JØR5è¯Ù@ªÝ
-ªT‹½2¯WTP’ÿ»*ãVÆ|ƒšÂvØëù[DAŒÄá VoîlM¨ð²Ì¿Œ‡O`p$øJ[$&
-M‘ ¯ùO Ü‹¡ñÉ.¶‡öEÇÿS‹×üký‡cbìÓsOjè`™ýÅfS÷ …ð§Ï&‡9{(¾ÉíI2ûÝë¶~9ÿxߨÓVöcv´³1ó†°M.M·!sº{(šžfŸ=f~­ßñp;Їý
-å> å_²–3Öü.Ø@ѼeRì‚[à§Õ~×:*™è¹=<—ÚªÄaèÀº™ZÀ{L¶^1ëádd²b/ Ú{“_¹9ãå{çà‹€™Îùfªý¦K"ª$÷P#Í9PÂôæ 3“•~À8åCÿÞ•yø¤+KùºP-PÜÞúÖ߉ðto½Vübñðž
-é
+xÚÕ[Ý“£6Ÿ¿‚ËK쪌¢o¡<Þ%›ºÔ]%—·lj cf†Z[xßÜ䯿Ö Æk ™ª¼ŒDw«»¥þµZàè!ÂÑ7¿»ùöQŒ´”,º»F±”‘ÒIÝm£ßVéõ-Uñêý³IׯË5Å«Âä$u^˜õïw?Eœ3$ªî¦íÓ›în>ßxˆ#Ò’ŽcS¥û›ß~ÇÑÚ~Š0b:Žž\Ï}Äã–Ø.zóŸÄm¯ˆ
+{k/a«Î(¤F±Š”äHbî%ú5«¥©œX§ô¾}Çeçm#Îyt WL™½0™WB~ï¯õcÖÜ”Y²õ÷ÕcqÜ…ûlÍðêö'KuvòÖ>©ê¬ô÷«Î]‘Ú˧oü³?ÖD¬²²ðÿ
+x¯|Ê«Ìéú–(0Ž  §ð}
+‡æiŸ'ñeÏ¢LŒ9R0Qæ™CÈ l ˱æÝéÿ± ­¥¯ã>né.ó.¼Ì·èŒ)'K048žgÊé4†š´„’*8Eü£Øv™Òš 7§8wMVÆ·8Ü×Ä_^ ®ý×Ç£TcumSˆ•¯
+cÓ’YGm@Ÿà¤`ß—L8tiCp×õë)‚{ ¯ipÆkÇÄùêg›Qt˜€˜ŸòÝ. àº½Ý„•¦ý¹yè£Þ6­9Q«íb¶MŸ•[Íø»2ÛeI•U-•½Gö·0áW€n¿ èƒnæâJÎ
+Õ--a!JG•¢`yÀ‹L[¦` údÚ€ë#ŽI zq¹ËüÒï8*˜#ÂÈäƒqËŒzã$ƒÇ€'8[æÑð”+pá8^&Éà
+·â$W²…ž=®K%ÓšHˆx2G#˜XRXþù2I—¦#¹<ɸ’û¸¥‡Ì‡ûÙgŽéÒ M$(›·=0F0«ÀÏž¸€Ö¸vÅ )Õ`‰}ŤWq·h—ñ¡€ÐÞ"üâ¦Mþùø2³½Œîß6©“ÿ·›ùÇ2;ãSG0´ ¤ÏÛA¸‚Æ«i'·ÑK‡èõ.7yõh“&êõgoÆŠ+Ügœ¶9ñ—^]ÇåLöi€¢>L¸ÉX–§1’J¿ëO#9Å0¤B¶F·|ö¶Tw¬ê KæEl‡PYᥭšÑ%¡ó±reèž›“‘§EYfÕ¡0[; —«Q°®pÒK]«N9ª[bA½rЏ<³£X²·IíäÅ©p32»‰Î$v–’¼¨š²
+!4†í(×ÓKDÄáVoîlN¨ð¼È?†D)$øB%€×—”®d;z\§»30`º„Cû
+‡+–^«?t> Ùýeº¶»÷; F¶í¦wÛ ­o§þÌ=‡Eô°&«Övö5‡»úøUÛu;oBßìΰ}l2‡“ÔþQ/ÙÙsPÝ÷IUe[ˆ%œsÇr³Í*Gü*ßÑr;Ê`z©eCÙ ü‡ ¢ó}„ýç1*,3¹IÂ'àŽÛü¶Í0^Ú³ÿ—&æëÐàvÅáNü‡¾eöµ=ýšÀ#-Ž&¼æ?4p/†Æ'»Ù>WØ-ýO ^ó¯uÿìcÿ=w¸†–Ùßl4u_Pøläl˜Ó‡â«Ü$ÛCàwÃVÂoçCCâÿÞía+û`Ÿííj̼"l“ó@Ó#$cÎ@wÅñáÑ÷Ùf‡Ìïõ;®Ò¡x¨@û QèQn³àPþ%«9cÕïœ Í"Å&˜~é7¡“‘‘Û³sù®ÉJ†¤›•©¼ûdíóйî/F&KÁ÷’ ½Wù•Å !ñl8}¾È‘é”/¦š»$¢Jònm ¦– KЙÉJ?_œìaxïÊ<|ï•BíE65ÂC!¿£â;®BqÇ} òOpÅÝ*Â;?ƒÿüû—“Z€Ëbk \Òî“”öĆtŒÑ¦Ï¯0ó}Pë¿òMé–®ÖÂïØûï —[=?¸™Q8(úÿéÞ
endstream
endobj
-1148 0 obj <<
+1438 0 obj <<
/Type /Page
-/Contents 1149 0 R
-/Resources 1147 0 R
+/Contents 1439 0 R
+/Resources 1437 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1107 0 R
+/Parent 1386 0 R
>> endobj
-1150 0 obj <<
-/D [1148 0 R /XYZ 70.866 789.024 null]
+1440 0 obj <<
+/D [1438 0 R /XYZ 70.866 789.024 null]
>> endobj
-1144 0 obj <<
-/D [1148 0 R /XYZ 70.866 687.528 null]
+1434 0 obj <<
+/D [1438 0 R /XYZ 70.866 687.528 null]
>> endobj
-382 0 obj <<
-/D [1148 0 R /XYZ 70.866 672.287 null]
+442 0 obj <<
+/D [1438 0 R /XYZ 70.866 672.287 null]
>> endobj
-1151 0 obj <<
-/D [1148 0 R /XYZ 70.866 641.369 null]
+1441 0 obj <<
+/D [1438 0 R /XYZ 70.866 641.369 null]
>> endobj
-1146 0 obj <<
-/D [1148 0 R /XYZ 70.866 545.255 null]
+1436 0 obj <<
+/D [1438 0 R /XYZ 70.866 545.255 null]
>> endobj
-386 0 obj <<
-/D [1148 0 R /XYZ 70.866 530.014 null]
+446 0 obj <<
+/D [1438 0 R /XYZ 70.866 530.014 null]
>> endobj
-1152 0 obj <<
-/D [1148 0 R /XYZ 70.866 499.096 null]
+1442 0 obj <<
+/D [1438 0 R /XYZ 70.866 499.096 null]
>> endobj
-738 0 obj <<
-/D [1148 0 R /XYZ 70.866 390.628 null]
+946 0 obj <<
+/D [1438 0 R /XYZ 70.866 390.628 null]
>> endobj
-390 0 obj <<
-/D [1148 0 R /XYZ 70.866 375.387 null]
+450 0 obj <<
+/D [1438 0 R /XYZ 70.866 375.387 null]
>> endobj
-1153 0 obj <<
-/D [1148 0 R /XYZ 70.866 344.47 null]
+1443 0 obj <<
+/D [1438 0 R /XYZ 70.866 344.47 null]
>> endobj
-1143 0 obj <<
-/D [1148 0 R /XYZ 70.866 247.956 null]
+1433 0 obj <<
+/D [1438 0 R /XYZ 70.866 247.956 null]
>> endobj
-394 0 obj <<
-/D [1148 0 R /XYZ 70.866 232.716 null]
+454 0 obj <<
+/D [1438 0 R /XYZ 70.866 232.716 null]
>> endobj
-1154 0 obj <<
-/D [1148 0 R /XYZ 70.866 201.857 null]
+1444 0 obj <<
+/D [1438 0 R /XYZ 70.866 201.857 null]
>> endobj
-1145 0 obj <<
-/D [1148 0 R /XYZ 70.866 85.429 null]
+1435 0 obj <<
+/D [1438 0 R /XYZ 70.866 85.429 null]
>> endobj
-398 0 obj <<
-/D [1148 0 R /XYZ 70.866 70.866 null]
+458 0 obj <<
+/D [1438 0 R /XYZ 70.866 70.866 null]
>> endobj
-1147 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R /F160 682 0 R >>
+1437 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R /F162 890 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1157 0 obj <<
+1447 0 obj <<
/Length 2478
/Filter /FlateDecode
>>
stream
-xÚí[[oë6~ϯУ4,ï—¾µè¶Øb½å­§[I„cË®$7=ýõJ”%Y´l‰ÂØ—Xލ™áÌÇá ?#*¢×Ûïï°½„Ïoï¾üΈH##%‹_"…‘–2R†"I¢ÇMôÛŠ#}ÿ@•^ýú)[ß¼zËï)^í³ôï¸L÷Ùýï?Dœ3$©Õ3LØÿÞýëñî;ÿÄ9‰ÖiÊ£õîî·ßq´{?€]Ìèè½¹‹¸
-ÛF¿Þý|‡{ÆWF¬<VK‚pÇlD­éc¼ú¸; -"D!£xõ•c7ÌÉ„b$%ï[f%£­#!õT­] )#—0›KÄõ™ãÀUkÕR"JÍJ%\ÓWš'›ã:œq¹ú€¶œA“1DZ„¥›$+ŸJ7ÎDÆ]vA¼ãÆ}À˜ÕƒˆêA}´Ý¯¿pƒú¦Â(ašQ^ QÅÔz¿P%Sú†Îí'1yšÀëvÿo‡Ö1‹p&æY×ÓÇ,©è[W¦¿ßDú  ^ÂoLp
-Ú˜æîÐ0 ê…\À\2„ù™a•G vIõ×ïB
-~¦”Ítá™Sl9ÌçÂJõ8˜„-€LòQîTCÙ³Äl¤AŠðállp.ä<‰Íµˬ“Y²ŒH(‡Hß—c¶¾Y)Ø•Ýl x’¨3}ÛÖyZ¦kïª12x2 e­9Caïÿ"j—ñåÓ¶†YÛ=å£w;戰î
-®¦Ù4§Ï^• ù¹'‚‚0È«žþÉ®”8£Ë¶/²*ü²¼2ÏïzÛ›>@ëh{
-æ¬#¸…„v Ò×
-¨ËWº%¢*ÝqÙd£õö¸iŠ¥¸ÉQ»Ã6]§nÌsœ»J¦/ð
-œªŠÄJ÷·ÉŒi–¶7*¶iæÔR¢H¿|³ÏlÝÝ»ÃÓº8Öi¯J´Fuô{è9‡ØÁ(
-à ‚NÃê“2&²²öt…õVv&+ûØÌ/«Râ»ý7ÜjU6'yÑæ!§ûX$ŸÉC2w½ap}ýž–og^õió×ã.ÉÊ>“+&0¹˜°9LîÈAŒPHÓ)?žm~ã+U’w~-kY#éü÷I–äqÙø²™ÑwyZ_|›¸¸6óigFèWØ|%XÚFáßc¶¨õ×IöߟNÇj°ÚÓõq7A”ys{f s:¾þ嘕éÎ9ò?és^õTP;wëhgûÞ"ã¯O¯5/‘»øPW©ê
+xÚí[[oë6~ϯУ4,ï—óÖâl‹-¶Øn›·ž"Pl%Ž-»–Ülûëw(Q¶.´l‰Â
+ìK,ÇÔÌpæãp†Ÿ„Ñk„íÇ÷wØ^Âç·w_gD¤‘‘’E/‘ÂHK)C‘$Ñã:ú5æøþ·Ç"&8â„Á}ÕÜ­›ôþ*Ü­ŽÛ4/“2ÛåvðÝ?ï~¿#0Gä$Sk¤)VÛ»_ÃÑ~û bFGïÕÈmÄC‚[›è—»ÿÜáŽÕ•µ+¹’ ÜØ+Aéû‚1Ž?o÷C‹QÈ(^ÝGå˜Eàs2Çc
+B»æýqOqœ ¯)AŒŸÌ,²¿îtœíäTWó w#‡uƒE/”>r$mLs wh˜õB.à@.¼gXåˆ]Zýõ»
+Û‰ ¿,¯Ìþ¯ÞöÀ¦Ð:Ú@n5ÂS/"Ãî2Pç`X4j4Þ0ºÞ :뀷Ï(ìκaiÑfë‚bÓ×h$„ž«¶ÇvõÚ éj-vÇÃÊ5j`AÝ£Uß²üåžáxw€¯"Þ^èÞU°¤é ‡á|\ÄõɨC, 씆 Ä…µËæ Õ.ÇŸÊzGñGz¦v¤‡ÊëØ–o‡4Y××®Ö}†u{1ºÓDÆŠ P9‡D7L†‹®æU]ŽôdÐáAÐx§ix‚ªA@.,Fb<ÏoŒ}&ØXV±Ý½¸µ\¦Û¢¾tUšµjdgÉ³Ý 6iQí
+•ï/Ã`–r?
+ÚÊ÷»,/›ôÐD÷ ƒéñžjç0T ÁöïAá’áÂ͘ye£¶a ·=rQ‚ };ܶÍ ÷,åþp·•Cï²yN\
+ÁsØŽÎ6)Ρ«:‰¯ê/Øs$ WsÀýÍMi²mß^ØädÐ1Ãë¤àÊ™¤Üm³Ukç:ç<…]ŒÄõVsU0gÁOHh× }Óª€й|¥ÏDT¥;)›l´Ú×M±”49j»ßd«ÌyN®Ò†é £S‚SU‘Xéþ˜~˜æÙÙàFÅ&ËZb4é–oöž†eý¼Ý?­Šã~oÆq\¢ª£ßAO:`£
+à ‚NÃê“2&²²öt…õVv&+ûØÌ/¯Râ»ý“4ÜjU6§‡âœ‡œîc‘®}&ÉÜÕ&Áõõ{V¾õ¼êÓš^«Z»L®˜Àä*­ç0¹#1B!M§¼<Û¼Ü+U’×ï`d,« µ¢tþû4OIÙ8³™Òw‡¬¾ø%Ý;€H÷‰ w“”¨øÀUzÃ?!Él>Qáîù÷>Íüét®ËM1]ŸwD™ç4·c·€1§óëŸy™m'ÿ•=ª¦
+Šçv!ݼ—l¡ñß?_kb"ïûø¾·©ñ
endstream
endobj
-1156 0 obj <<
+1446 0 obj <<
/Type /Page
-/Contents 1157 0 R
-/Resources 1155 0 R
+/Contents 1447 0 R
+/Resources 1445 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1107 0 R
+/Parent 1386 0 R
>> endobj
-1158 0 obj <<
-/D [1156 0 R /XYZ 70.866 789.024 null]
+1448 0 obj <<
+/D [1446 0 R /XYZ 70.866 789.024 null]
>> endobj
-1159 0 obj <<
-/D [1156 0 R /XYZ 70.866 733.983 null]
+1449 0 obj <<
+/D [1446 0 R /XYZ 70.866 733.983 null]
>> endobj
-737 0 obj <<
-/D [1156 0 R /XYZ 70.866 525.067 null]
+945 0 obj <<
+/D [1446 0 R /XYZ 70.866 525.067 null]
>> endobj
-402 0 obj <<
-/D [1156 0 R /XYZ 70.866 509.827 null]
+462 0 obj <<
+/D [1446 0 R /XYZ 70.866 509.827 null]
>> endobj
-1160 0 obj <<
-/D [1156 0 R /XYZ 70.866 467.012 null]
+1450 0 obj <<
+/D [1446 0 R /XYZ 70.866 467.012 null]
>> endobj
-1155 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R /F46 525 0 R >>
+1445 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R /F46 685 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1183 0 obj <<
-/Length 1840
+1473 0 obj <<
+/Length 1830
/Filter /FlateDecode
>>
stream
-xÚÝZK“ÚF¾ó+tUf<ï‡oImÖW\qln^ÅJZP…„“ͯOÏh¤EB€
-pî(µwƒÏ#!døuHE¸LcÿÌÆv=óAþèVQ¦ÃÉäÏÇU4‰–«!ÃáÓÊ:$ÂÔ½ln¶¯Üa
- A! a{'õ 
-¢ÏeVOÒ,gtèlšåiìŸlÒíº p¢Â³IyGÈnˆš6ø³ò#’rM©ÈB¤¡  YC‰Ä_¤â@2‰•{ĉ³Hg$‚ŒÝ½*rõˆlÊ„d<Ãxk°—»»{p§qšÛÇu¸8¸ƒñ€vN¯E;ã¢D{î2¼‰õÉ:™¥›<Y7åÛ7Oþ4ⵂÍçìñLÒc{Á$b°Z­)0z8V ¯à…|Ùºû‡d´ atŽ”xO° °[€Û³¡]Ö‚$=HMÈD ¤0·ØÝˆ¼W™r‚Ñ4š'ñž]Lö
-I-ºAk˜DHD©ê#Dñ!2´äêÁ „jðŒÄ+ ¨ š³x÷[uéͽÓpŠàê
-xÿ0,rŒŒ;l!ôø”ŸÕbí1{[ü¥tƒËsç»ÐËõ±Sœõ;𑃂—ŽÝÀkà´MùpŠTO›z|®6¢ÒÄÒ㨎hDü\ï&ɧé"ñ“½›d­ÓU5„<0qöÉCR˜BÞxžlüó¡Üûq 4‘¾;+gjiöz¹õ÷¦Y\|ÈË!£²CÆÆÐ­èý óE]Ç{Ór’9ä:¬0MÛf¯Ç†–£àtTqÍw5€üP}ãЃ¶ @ꪺ¥=ÏT·Ø$ÙŸ5eÄ&àÚxA ›áüjªIs5SÞ90jЍ±¢ §…çh—•;™w(2Ì Mt—ÈÔÒäx¸)¶Ÿnr,FÎK{ÞqhÐÅ[ì e™fvrV`{Y‚Ýÿ_D˜UèŽ qò÷Ûòl†ìù‘ÛzÎÂt½)3g=sÐ-®ÒM™F‰÷Jâí
+xÚÝZÝs›F×_Á#š‰.·÷MÞÚqi¦¶‰ßâŒFFXf*#á´é_ß=80 $D2<Âpì×ýö·{+QoåQïíäÇ›Éëë@z†JqïæÞÓ”¥<0¢À»Yz}I€NgLÿæ!Ëâz›ÆŸ§Œú‹,*n,Ù¢¸Ú=m·›¯©ŸM?ݼó„àDjŽ*sìÝÉO7“¿&€7©•^cˆa '?Qo‰ÏÞy”ðÀxç+=!Q˜°ÂÖÞ‡Éê|¡„I{i?œg@µŒ
+õQ!øQ’Í›AAx^€Ž°< ‘T–H¸¥”Ûå-w +׬7¡Ý‰W}¡|´z'gÓܦU/Ý“]ü¯]¡ù£°ðl^Þ¯ ©‡¨m ‚C<+?b ”kJE"-eÈZJ%ô,÷” Vî'fÜBƒ7 ”ý½*2øˆlƉÂl`¼5ØÉ­ïž¥Œxgöqn3w4Ñ.Ø¥hçB–hÏò oc}žF«x—Ei[¾}óèO#ÞhÜl9$`ψçŠÛ ®ï…ÕjMÑñB}/d›Žp(?¿/©ßKF·é‡C¤,÷„ J˱¸ÚeH2Øp µ!À¶ÂÜaw+ò¢¸Ê”ã áC´Ü³‹«
+{åÌ—}ÙFËèþdå—†h.Vþ®ö;rsj"t¥þ`•²Nôh‘”!’CÛ˜VŒAh¢ŒìGa>!Æô!Z^¢
+ÅÕæþÙ•uTÍ?§\úäáp~7RÏŽOT3õØ‹I=Î aÆH=+ŠR¨¥Þ¾ZFÑIÊÆP˨&2`MµŸ£°O¾ be ÙŽžù.Î![ngÆ:Â…m Æ WÀsáÊN2Ã&@5ç‡4õy=É'×ñy$RþÜj "÷Miœ.»g%Ã%Ö§Ç»ò’.ûFëÈ
+ØÙÆÈñ“Í!­õ9üÄøÈüdüÄ_ ?1Å­ã#Г•„hwôÔ³1Dˉ.aëFGw°„WHÝ˯F<få6DpVÒ¹¢-ˆ ÄIÁúU“B¼˜¤
+DÐüþþT:*|ô²˜²çɶ‚Ù2úFUQ`Ól.©Š”
endstream
endobj
-1182 0 obj <<
+1472 0 obj <<
/Type /Page
-/Contents 1183 0 R
-/Resources 1181 0 R
+/Contents 1473 0 R
+/Resources 1471 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1107 0 R
-/Annots [ 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R ]
+/Parent 1482 0 R
+/Annots [ 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R 1470 0 R ]
>> endobj
-1161 0 obj <<
+1451 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.13 704.902 196.985 715.484]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_ga1453eca6136fd77e5de88ea0e78cc7a4) >>
>> endobj
-1162 0 obj <<
+1452 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [200.112 704.902 229.021 715.484]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1163 0 obj <<
+1453 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [114.094 680.204 239.578 690.787]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_ga120efa08eb51f45664477d30eff31916) >>
>> endobj
-1164 0 obj <<
+1454 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [243.668 680.204 272.577 690.787]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1165 0 obj <<
+1455 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [343.215 680.204 386.56 690.787]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_ga0c2f8074a8474eee42bc96a4bdc7679a) >>
>> endobj
-1166 0 obj <<
+1456 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [407.904 680.204 455.732 690.787]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gab6148c019e88c8853596bf5f516373b4) >>
>> endobj
-1167 0 obj <<
+1457 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [481.559 680.204 525.406 690.787]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gad8268ac7d007fa1c3351da682c487c0f) >>
>> endobj
-1168 0 obj <<
+1458 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [125.591 655.507 250.089 666.089]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gab4aa3dff2b1b55b1abb002ef69c7efe7) >>
>> endobj
-1169 0 obj <<
+1459 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [255.889 655.507 284.798 666.089]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1170 0 obj <<
+1460 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.938 630.809 258.135 641.391]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gaec6e88892a1b0b62287df5173a7f0336) >>
>> endobj
-1171 0 obj <<
+1461 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [262.07 630.809 290.979 641.391]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1172 0 obj <<
+1462 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [360.919 630.809 422.977 641.391]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gac1f868aef7d531d34b91eaa57e339f21) >>
>> endobj
-1173 0 obj <<
+1463 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [443.971 630.809 510.512 641.391]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gaf9503cacabf6cf90ed34f2727fc480bc) >>
>> endobj
-1174 0 obj <<
+1464 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [109.777 618.854 172.336 629.436]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gab7035b42d465074b31195534efb37e3b) >>
>> endobj
-1175 0 obj <<
+1465 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [160.832 592.419 204.176 602.894]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_ga0c2f8074a8474eee42bc96a4bdc7679a) >>
>> endobj
-1176 0 obj <<
+1466 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [153.358 579.677 197.205 590.151]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gad8268ac7d007fa1c3351da682c487c0f) >>
>> endobj
-1177 0 obj <<
+1467 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [160.832 566.934 208.659 577.409]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gab6148c019e88c8853596bf5f516373b4) >>
>> endobj
-1178 0 obj <<
+1468 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [160.832 554.192 222.889 564.666]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gac1f868aef7d531d34b91eaa57e339f21) >>
>> endobj
-1179 0 obj <<
+1469 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [153.358 541.449 215.917 551.924]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gab7035b42d465074b31195534efb37e3b) >>
>> endobj
-1180 0 obj <<
+1470 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [160.832 528.707 227.372 539.181]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_gaf9503cacabf6cf90ed34f2727fc480bc) >>
>> endobj
-1184 0 obj <<
-/D [1182 0 R /XYZ 70.866 789.024 null]
+1474 0 obj <<
+/D [1472 0 R /XYZ 70.866 789.024 null]
>> endobj
-729 0 obj <<
-/D [1182 0 R /XYZ 70.866 771.024 null]
+936 0 obj <<
+/D [1472 0 R /XYZ 70.866 771.024 null]
>> endobj
-406 0 obj <<
-/D [1182 0 R /XYZ 70.866 771.024 null]
+466 0 obj <<
+/D [1472 0 R /XYZ 70.866 771.024 null]
>> endobj
-1185 0 obj <<
-/D [1182 0 R /XYZ 70.866 723.517 null]
+1475 0 obj <<
+/D [1472 0 R /XYZ 70.866 723.517 null]
>> endobj
-410 0 obj <<
-/D [1182 0 R /XYZ 70.866 514.659 null]
+470 0 obj <<
+/D [1472 0 R /XYZ 70.866 514.659 null]
>> endobj
-414 0 obj <<
-/D [1182 0 R /XYZ 70.866 455.34 null]
+474 0 obj <<
+/D [1472 0 R /XYZ 70.866 455.34 null]
>> endobj
-1186 0 obj <<
-/D [1182 0 R /XYZ 70.866 428.312 null]
+1476 0 obj <<
+/D [1472 0 R /XYZ 70.866 428.312 null]
>> endobj
-418 0 obj <<
-/D [1182 0 R /XYZ 70.866 428.312 null]
+478 0 obj <<
+/D [1472 0 R /XYZ 70.866 428.312 null]
>> endobj
-1187 0 obj <<
-/D [1182 0 R /XYZ 70.866 368.782 null]
+1477 0 obj <<
+/D [1472 0 R /XYZ 70.866 368.782 null]
>> endobj
-422 0 obj <<
-/D [1182 0 R /XYZ 70.866 353.738 null]
+482 0 obj <<
+/D [1472 0 R /XYZ 70.866 353.738 null]
>> endobj
-1188 0 obj <<
-/D [1182 0 R /XYZ 70.866 293.831 null]
+1478 0 obj <<
+/D [1472 0 R /XYZ 70.866 293.831 null]
>> endobj
-426 0 obj <<
-/D [1182 0 R /XYZ 70.866 278.788 null]
+486 0 obj <<
+/D [1472 0 R /XYZ 70.866 278.788 null]
>> endobj
-1189 0 obj <<
-/D [1182 0 R /XYZ 70.866 218.88 null]
+1479 0 obj <<
+/D [1472 0 R /XYZ 70.866 218.88 null]
>> endobj
-430 0 obj <<
-/D [1182 0 R /XYZ 70.866 203.837 null]
+490 0 obj <<
+/D [1472 0 R /XYZ 70.866 203.837 null]
>> endobj
-1190 0 obj <<
-/D [1182 0 R /XYZ 70.866 143.93 null]
+1480 0 obj <<
+/D [1472 0 R /XYZ 70.866 143.93 null]
>> endobj
-434 0 obj <<
-/D [1182 0 R /XYZ 70.866 128.886 null]
+494 0 obj <<
+/D [1472 0 R /XYZ 70.866 128.886 null]
>> endobj
-1191 0 obj <<
-/D [1182 0 R /XYZ 70.866 68.979 null]
+1481 0 obj <<
+/D [1472 0 R /XYZ 70.866 68.979 null]
>> endobj
-1181 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R /F160 682 0 R >>
+1471 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R /F162 890 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1200 0 obj <<
-/Length 3608
+1491 0 obj <<
+/Length 3627
/Filter /FlateDecode
>>
stream
-xÚµ]sã¶ñÝ¿BRçŒàäuòözi3í$Mü–dnhж9•EU¢îzýõÝÅ ’l‰îÃHØ]ì.ö kºx\ÐÅ÷7º»ùæc®ɵ‹»‡…¡$ÓzarN4[Ü­¿.%ÉW·ÜdË»§}U¬Ýón_^qº,ÚÊ ¬‹¶pO‡ãn×ìá™.ÛÕïw?,¤D-<apôæ/w7ÿ¾a0H¬C›e$ãrQ>ßüú;]¬áÛ JDž-¾Ø™Ï ©
-Ô~ÝUëê(çÙv'—M½þ*ŠôŸòEи¶Ð4És¶ô¥ÂMá$¦ûIÿzÞ•Ó3#‰æÆÒsÏìÍ»m'6ÈŒ!‚™á×-ˆbŠÄËä› Í%ÉÄé窶1d]`c‚…B„õ ADYÇçwN6‡ú¿«ÛlYM7Æ'г7ØWŠpƆkq[kP»o>J­ºe™$BªÅ-±ªÌ-ûi¥(0aÛVp,„Ì—m¿0Ö>Un ØïW NÓJÐåW÷m]Z˜ÎÔòX¢í¼‡ã¶lëfKV·Jåp"ýzàßZ·²X±åþñø\mý@}ðhŸ*ÏbM#Ap 2ÌóÀäö æÛiƒ­qPfÙâ]¼_ª²Ù®=ò³Çh‡·¸½ãó}XÒ<XÓpËsFrÉqð«´>â•jS!ÔÃ
-øAìR
-k éÖ|¨Û¹ã–­ûÝÔ[o£Ϥ{jÜ/®Ùø¯p>W ?'áAqêÁ(1*·Lô À™2½%ÞŽ|ôBrÊú¡)-C
-;ëN
-CÏoêu(æQÄÇjt´Vð…–†(
-†E kpõÖcøxT£ØÏ†HàwiXI˜ã¯©<IÓÌžþ³yf(*áßßÅj¡rEr~V–0Û)î@ÑdÌyÁ‰Ð€å`}²ÎK¦¢„ T'»í œeGBð9ÄzhŽûÒ‡ƒ@AÑ“õö£Q›×ªåsÌ T  Zó+œˆAÎg‰x /â òmmfŠ˜Ca
-u® ³¶O뀪ÎHø:
-Òî è=›ˆâC ¯¯WÝcëø`Ï÷Yá_LïTpÈ|&ç  /|p ™ž+{C pGC&!ÍPø–¹§ö´Ücì]MÂ
-¼×%ÃÈ}ЄfWWë3ò¾”Ì©¨
-/FHÊDÞ¶lZÖ²oª÷Xr”KöíĪ}ÎõÿѽÐo·¯NçœQ‹‹·4©ðYÌS‹ËaLY`QM˜öõÓ'¬Ö}
-‡eçùꘌ4 ü­Ÿw¡6 ïÌyZû±=uEY¹oÝÄïÝÄ\æ 7~¿ß7ź,°¼¶Uµ»m?¥
-¾á½£½ò³ƒïV–܃_íng­ýÓcµ­/^ >$Á².kŒ£‚ÞžeÑ‰ËÆÄâPŒ.Dš!ëpÂ~xè“—.[íÂWg)Ò2Âï—Éht‡ªú#‘°~ |Q|ù“¾†T¬»ö>ÀÕ?Á—« øë|4ͺ2Œte;Ñÿöž=^U÷{{¹Ü/C_&ø)Ú9DŒ”™èò-E=#*S¯ ¾pTtFÎRѸ__;tæœcû*ÓËŤú[|@àWD‡Ë®Âð–;د®
-Ù¸F3¿¾ëÀ— 14X|XW‡ÒëÐζà`±^coAu8@I›-Ü ¶+ükU<ßNÍ~
-lywâ
-x³Î4þìè¶KAàöÚõ{¼Ì"b£eã¤:iGŸ‹)û½Úb‘Žb |Ím,ŒÃðÛ‹8ûârÓ;ã: Ì÷gWl6Þû)At µk²hý×uȬëñ[½=´Å¶¬¼
-rCÔ|,yMC/Ä]x‚ŸëÌtÞÓU”í±ð´‡"Éä”âÁ‘ÂR‹¿¾²fãF×¹$–6’=¯í‹Ã‡Ó
-7°©~žUøõ¶öà¦L¾qÊ©6CA¾rÆFÊ*ceE
-l¡ßáéâihÕŽ 4IŠD±x’Dî Q ¦¬Ä4ŒÒÓ×{ƒA®<¨` vc'|Àpˆ+[A¯ïO\\ŠÌ]1RÈ4” !FC?Û&$pŸšä>ù&$HA©¿dýZŽ¢hOÃæÊ£/ÜÜ¿›_=…šÎ ï¼ ÷˜ÿà:I ?Ýb\½íÝÇ\¼FÙÊ$^á ÷„¥¿¹ujC„áÀ@ˆ2_Qºex)N«Ø;ÁØ´`€`Ð>1ÂA· ª #U6<jთÞnÇ‹Bø€Ï÷•u,V8ß8·qcÎÄžß— ’ð\^²±Àé—÷ä/ Yù¨$ß ÊÀ‡Œ/ýF£+·pß<_ßy¨(?Ûyø© mÓXy!åéÄA‡ à$Ó*îä‰Á±zi"Ô¤uhTµå’<kÀP&ó«Ú3ˆ¼ùÅRý‚C©ží#TX_Óo‚2&ô
-(õÛ´a“9 -
+xÚµ]sã¶ñÝ¿BRçŒàD:yh›^ÚL3I“{K27´Dۜʢ*Ñw½þúîâƒIH¶D÷áŽì.ö‹5]<,èâ»›?¸ùê½U‹‚X­ÅâÃýÂPRh½0–Í6‹_—’¯~ÿðýB(I$°ÎþÐlž·Õê–›bùm³~~ªvmÙÖÍ'ßüõÃÍ¿oÌ¥ ÖÁ,
+Rp¹X?Ýüú;]làÛ÷ J„-ŸÝ̧…T‚(‰8¶‹_nþyC”p…¯øT3j2dkFh¤[ ˆ^Ý2Jé²ý²¯6Õ=P̋姗˦ÞüFE‚ va×®
+Óä=í×Ó­3SÃ<a0÷ÌÖPÛí;³C4I:Úâ¦m¤V.Þ©…w>Bú©ZÛ².²1ÃB! Âz…’ØžÏï¼lŽõW·Å²šnŒ+Z9_\Y"†»jqOeTº¯ÞK¬¹e ¿RÈÅ-—D«Â/ûi¥(p`×V‡Õ­vÙ6ð„±ö±òåá°btY®]~ñß6Õ±…éL-Ÿ×(A7ïþy·Fû!«[¥ìòC\¬ã‡cëW–+¶<<8cóõ1 }¬5O¤Àµ$…µ‘Ãí#ÌwÓ[ã É²³ì}º_ªu³Ûä=æ€Ñ ïp{ÏOwqIsïüÅ-·ŒXÉqðTÚq½Gµ­êqü n)…5†hðnÍ·ò`W;ïâ–”­në]pAL0ãßš{ÿÄ5ÑAq®@$^Âwâ•|…QÖ1 ЃöÊ$~D/ò>HÉ«êÔñå=ÖXÿhP"›b ,àH­jdÙ\kùBKC@|­ ¤ áÌ^ !ç8èõ 5gÝ ´°[ñ&X'BŠ!Öu³_1¶ü²?ÔŸPÊ/Ðx:ÿžF9 DzÎ9ÕáÇ6çÄQBgœ˜±ƒ8À@ÊaÒ¶Y¿Ëy:PhÚûCTÈ©{3ýŠ7á7̈K`Ö‚ç6ÀÀÒnm½ÉoÁ‚QqÚi7-P1ä›ìC˜!Fûhs{DaÚÖ{Ô‚/ÒX¤5W’6@(@ma†¤9¦€«ÜÿY.rJ¤ê<ò™Š#/S¾“û–à`´}‹mC
+H„Yý¦lËüf!i±“͞Ⱥ`ÃB]”1¼"á„Øk ò4‘|y(ï-áU@cz1æç­¤àÓµ aR½ HF(Z(¢›#IÆ9aƃeöˆ1 9%Iôàçüƒ¬J¢j\EÛÐÕh MÛ!mçüïýצÞÔí ÿ¥© ¤ÙÙÐ r(Ààà\¸Žy(Gy(Ÿ*L• öó°²0Ç_s§%M B:ZÒ ¨L”˜«…²
+Î\8uÁ Oo1Ù(U‘ðuä%ÜÐ!øÜ_"}˜•ø‘»Áß;û>+ü‹é
+™Ïä<áÏ‚„¯
+€5Wö†@‚  Ki†ÂwÌ=-ø«°çåžbïjNàörŽ#wQš}]mÎÈûR2§¢Z³yâž#ˆ[jˆq³å]€ú#[(¡V Ž™á_‡?/ñýcµÝGß÷Å—DØër|}¿½ìáõî!Q“Óªpñ¦râüéêe]˜#èÖ^!WŸÏá4Ç%À;J­O(ÁuˆóJâÅVÄÇ2™·+ŸÖ¥óìÛêk,=Ê%ûæâŽU?úÿèÐovM¨NçœQ‹‹·4©€Þy/«Åå0¦¬°¨†³Up¨?bÅîc4–}à«g2VÑ$ð·~ÚÇ-üf>ÒºèŒÕ•ëÊël¿wspYpÜøýîД›u‰enü°«ª øm÷)-ϼޖÏǪ«%'ëòxlÖ5LDèL.?×í£CJ
+DTmÀ×xV‚­ÆG¬t/M÷âyg– oõLÊ“ìÍLö†Sý͈>M™‰”™@Í’ï=ÿ‘0îÁdqa ÏÁz¥GS13N¹Ý˜“f’?F‘ÂSsÕñªB8á¦h¼á˜Ø×Û6{qäïÐ
+ÞÁûï«u—Cñì‚“¹«q×8ào·`:ú7‚ŠŠÏ]ƒjüÙ]3Ômø¶ó“Ûˆ0ª'¾GãÀ÷ÏU˜ZúÓ~Ì}õ~Ì-¨eûCuWLrÞío‘6¬@‹ÈªÞQ¾ õ) *‡‡]~þîfñë­àâÅ8·p :‹$*äÆÊ ßáŸ[ì.Wñꢖ;Ðï/~ÐÝ“ºUQ¤XjuŸ¼wÁ€‚¿ðþÑ]ý¹ Âw+Gî1¬ö w³6áí¡ÚUB/ŒÅ’aYwjL³‚ÞŸ‰Åcbq(E3ÍxêpÂ}¸ï/ÝiµK_½§ÈË¿_&£Ñ]ªêM"ãýÄ¢ôþ'I G±î’8Ä
+êKOEçä†Ú¡wçx0.Û¿\PÌú©¿§‚—‰q¹U˜ÞrÏ
+n¼îñwF¨„\'
+èŠE:É%ð§u¹0CÂï®âÜÖ9>z×E̸`~°=\±Ý†8¦‰jß(äІ¯›&IYŸ×ã·zwlËݺ
+*È PíXòº˜¦^ˆ» ?6.˜iÛÓU®Ûç2Ћ$+EÑÂQ‹ÏPYsy£ï`K— Éž×î‡Ç‡ÓJ?°­ažSx_{ôÓ"¦Ð@åU›¢à¼ò!Ž”U¦ÊЏB¿ÇÓå¡U;‚>Ò$)2ÅâÉ!rµèêÀËANÃ(=pC4œ•¬ÁnÜäcHŽie+êÕñë—¢ðWŒÔ5`
+1úÙõ"AøÔÄøz‘àJÃ%ë§Øx”d{6·Þ{úâÝý+±…ÕS¨à,4ðŠð€ùŽ}’0ˆÓý(öÊÕ»>|ÌÅkàL¯LðÆ{B„ÒßÝ:µ!Âp` äFE¨¨@Š@Ý2¼Ï§Uìž`™¶„‚AAÂÝLTe©²áI+üèývº(¦ø~W¹Àâ`Eûƹó.öü¾•„[yÉÆ"§_Þ“O¼4¤rÚŽJé½À  ÜEÈô"0l4¹"ð ÍÓõˆà>Ïv ~\Ÿ÷ûXª!ëÓ½ˆƒFAÁI¡Õ QgGrPX„šˆaÜMXˆŽ2i¯é&âeCÈu|IŒEPÄz¶™PI¢„|¤Ê€ÁËR¯'i'á´Q•{FçSÀ©&…5
+Öåze sÜø&Ó=ŒBBéWõ0Ê×ô0ÒWô0jbú¶§l850›7a ÜÁGêkη
+æ•­cRZ¢€¹®u,:ñÿ{ëx¥0¯ul ɰûS¿Mç¤u„Æ.€³c×aÍÞA¾UãØÅôMeãJOózæÁò¥ÖýÏÌžE¤ÂÆVt/"õßÏv]‰=/è)òëºÇ.'j*
+ôÑyÝcó`xéZ ö³›4PV°Röë´T¯Ãšj‚ô•}C£òåÉþ¶(î‹©H
+ (5¯[l/ë2-kçʺ ”A|5Uõ¨Q祿¯Ãœ•wñà@6_à“;‘@˜×ñ;€¶áîïJæ ›áß~I¬¦hÁ»êñŒ¤¯C›•tŠ5kÙ'H‰R¼˜”éß23Èçuz]"æ|™~QRðKþ®:þÝ7þ‘˜–þE!g—f‡‚}‡W›¾UÆYQHwÞjÿòKµ÷/\‡'e2Cô×\}-M,Èð¾ ƒ—]Û߸
+kF}4}]’a/®È”Èt+˜Ó%~~ÞµõS0úÔw×
endstream
endobj
-1199 0 obj <<
+1490 0 obj <<
/Type /Page
-/Contents 1200 0 R
-/Resources 1198 0 R
+/Contents 1491 0 R
+/Resources 1489 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1204 0 R
-/Annots [ 1196 0 R 1197 0 R ]
+/Parent 1482 0 R
+/Annots [ 1487 0 R 1488 0 R ]
>> endobj
-1196 0 obj <<
+1487 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [109.468 425.776 193.322 436.358]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_ga1453eca6136fd77e5de88ea0e78cc7a4) >>
>> endobj
-1197 0 obj <<
+1488 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [332.65 413.82 416.505 424.403]
/Subtype /Link
/A << /S /GoTo /D (group__THREADPRIVATE_ga1453eca6136fd77e5de88ea0e78cc7a4) >>
>> endobj
-1201 0 obj <<
-/D [1199 0 R /XYZ 70.866 789.024 null]
+1492 0 obj <<
+/D [1490 0 R /XYZ 70.866 789.024 null]
>> endobj
-438 0 obj <<
-/D [1199 0 R /XYZ 70.866 771.024 null]
+498 0 obj <<
+/D [1490 0 R /XYZ 70.866 771.024 null]
>> endobj
-442 0 obj <<
-/D [1199 0 R /XYZ 70.866 689.695 null]
+502 0 obj <<
+/D [1490 0 R /XYZ 70.866 689.695 null]
>> endobj
-1192 0 obj <<
-/D [1199 0 R /XYZ 70.866 664.733 null]
+1483 0 obj <<
+/D [1490 0 R /XYZ 70.866 664.733 null]
>> endobj
-446 0 obj <<
-/D [1199 0 R /XYZ 70.866 664.733 null]
+506 0 obj <<
+/D [1490 0 R /XYZ 70.866 664.733 null]
>> endobj
-1202 0 obj <<
-/D [1199 0 R /XYZ 70.866 620.23 null]
+1493 0 obj <<
+/D [1490 0 R /XYZ 70.866 620.23 null]
>> endobj
-1194 0 obj <<
-/D [1199 0 R /XYZ 70.866 191.927 null]
+1485 0 obj <<
+/D [1490 0 R /XYZ 70.866 191.927 null]
>> endobj
-450 0 obj <<
-/D [1199 0 R /XYZ 70.866 176.687 null]
+510 0 obj <<
+/D [1490 0 R /XYZ 70.866 176.687 null]
>> endobj
-1203 0 obj <<
-/D [1199 0 R /XYZ 70.866 145.769 null]
+1494 0 obj <<
+/D [1490 0 R /XYZ 70.866 145.769 null]
>> endobj
-1198 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F99 531 0 R /F46 525 0 R /F160 682 0 R /F177 852 0 R /F174 789 0 R >>
+1489 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F99 691 0 R /F46 685 0 R /F162 890 0 R /F179 1097 0 R /F174 1021 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1207 0 obj <<
-/Length 1851
+1497 0 obj <<
+/Length 1862
/Filter /FlateDecode
>>
stream
-xÚÅZÛŽÛ6}÷WèÑb†÷K^Ši‚-š¦û– ÇVv…ÚòÖ–³M¿¾Ã‹dÉ¢¼–ä¤/+­5<3âÎÂÉ]‚“דŸn&Ï_‘hd¤dÉÍçDa¤¥L”¡H’äf•¼Ÿ2=ûxó&a‚#NŒs¿þ¶]ÖélN•ž¾Ü.›4/E¶Í­ñäç›Éß¶8!¦ÖHSž,7“÷q²‚goŒ˜ÑÉ£³Ü$\0$¸õ±Nþœü1Á!Îꊨ°·ö¢'XÕ—i•(É‘ÄÜú.-»|ïÂ:Å{þŠËÚh¢ç<™ÃSæ‡?l³¼HwþE‹­¿>ÀÿDL³/3*¦‹"LþØîfOw©›±9Q€§xˆ„åð~\¯·ËjÈÓ@î‡Ï3†§Û2ˆû]ºXÅG®Å9çØ¹—4ÌÂËôÆ4ÏCÎtQøë:ËÃ`ɨ¿Ù~öW;¤äø¯ÍÃm‡gø-‘ŸàA§ì@LŒB.G1Ä
-˜,m`)= 6ÍX%R¦*UõÌ:q †F’ \²*.»ÄžEÞ’Dµ,­lFÜ.í:Žàq¨ ¥¡³‘xƒ„¼Ä4!»0Eìè~yƒÄº»ê@3Å<Å„ #ë5ëæ´kˆ¡6›‚D«n³H$sýA•¤ãP%ßZÊ»Å&µÉEÈ4^¿ãˆ§OcÍHRƒ¨bç›$L\»œ\ƒ …PB‘†úv¬ýÜ×—¦âõy‡ªÊ¤‚€°[ååÚˆ•$X¼BuÛì–Ь©!M¯ûía· -Ã5ºªßdù±‹‰é¦c¯  WJIئÇ.n:Žá1`Ì‘’b$ÁT"¦€6 +LÐc!:Ãð0¿q†ën£"‹»û”fù]ts“ýkÛTº:Czï˜ÛŒ„€ë(ÖGaxÚl 9¡ci‡³,Ît­_t²>Ðm”õ†Û(ëËm¾/<É—߬òåqÙ7¶®ñ”-éï|‹: AɸE?#Я1ÂÀÇHú9Œ€€44lÎë½;†9Ž'@ÝoG<Xz¿~›tèý*m*œ„—£0B:H-’¯¶ 
-vØ\¢L tg½îö{(SýƒoS‡12t䢅áégZ#%Íu”)f ¸7wE 0Ðq4~¿¿2ÕÿUZTZ!Ç)Sã0B:( R\G™bV±Ãôej ßx6ÔÝ~eªìmê
-œh`–;Ù7°³… lòäº:&BCu'«ãž¼#…O„zÁïœSìt{u§¤Ÿ`ÛŸfpóµH÷aLx”®SûmÓþwh˜+EjÒ5hbµ¤¼]Às:ž½iëxö×2ÿ"’Y]{â³ŸŽ„í;Åí\·y€Ñ©¤2h@„’Ë%@…Éh ð̉͞kiŸ/ÛÊ/ï` +ÉË­á<±Úš G–×ižî Œ@~ùz¯vYøðÎÉEpC˜¿R\Þú›‚•Õ«Û/P רþßßÒü··•  (¦½ CeE§·
+xÚÅZMÛ6½ûWèèb†ÃoæR´H4hÑ4Ù[,[Ùê•][Ûmúë;)Y²(¯e9é%ÒZä›Ñ¼ápø"šÜ&4y=ùézòü••‰!V)ž\I4%F©D[F$×ËäÃT W3¦Íôún›Î—þ~³Íþ¾bt:/RÿÃr^ÌýÝîa³YoñžN‹«O×o!8‘š£ÉPp÷ëäçëÉ_Àiµ]cˆa"YÜO>|¢ÉŸ½I(áÖ$åÈûDHl•¼Ÿü1¡á]ê+aÒݺKxC ºñŠÊ£­QTxÞ¥ÅÃ6ß•nâ=%Tc6"„Hfx¥Œûé›u–éÖ¿}±®t59uQ’û(í
+Œ `ØnÓ243Јg|H$ºUâý¸Z­õ”§Ê¾\q:]WN”LÅg:¢Hiœ–æ Qx™~¤”åY‘­s?t^øë*ËÃdÅ™¿YñW7eþy¿¹é±ŒñntÈúÄæ‚Ü'á„#¥tŠxbºÎ–ÝƉƔUÊMå± ÂÔ¶uú4±ÆFˆ¤0K”öP’†WÁè,"~ Kc±*`m«Hx*º.XK(V ¸À(mdÛ…mz›íüú
+bÁb¥d„ÒP)ß:ÒæÛù}êò `¯áqÈç± I1\~|CºQ2XQ.‚ ƒÅPa¡|û#8Ú¿¹:1/ÇÊÊ•F‡h¹Ð«Õ«J¸~q9ži¶½câ†Í,´­îÖÛEØ6ÊÍ®Þs²|¿“Éé½ÒqPâ~©0;‡;Ø¥—·eã¦÷/9’`ܸFÚ(.1Éö¥èÃçÙ3Ü4mŠöMâç4Ëo£ Nö¯Û©ÒåÒûÜe !$^G±>
+ÃÓ.±ÑÀÆÒŽ]³A,‰ÆLcÃèeýL³QÖ[f£¬/Öù®ð$?”~ù†õ!_ì—}«}§lEÿpç;Ô9ãý8Œ@¿¡„"#é82œ(!š[{œg8ž
+Ž“ƒ,‘S$°Žžrãb“h ÎNÔT´P]M¥yƹ$X?ÚEì)}EꮾrÄwS^¶qhÀFÄèjèÏS33, —U`E"ºf\‚
+´é¡xµsQY‹»Ï‘4Þ¥2…A4g:Ö2ǜ̯Û~­Òü¶¸‹EÏ ä`eŠ1J,Î+¥©ª¸siJpA£º–q¾iLÃ/£L ¬™Ô ÊÔyV£kË襄©Áþu¹A5NyØlP´ºŒ.%\åWü]êL»q‚›f¿¡.5Üç.cÁ´Çú(Œ@;Åî]F—N®£ö]êL³qÖ›f¿‡.5Üù.uw6rÑÂðôscˆVö2º·XÜÛ-Qoœi8š
+ó÷/×¥Œüõ¶æ‡!þü½=ƒ
endstream
endobj
-1206 0 obj <<
+1496 0 obj <<
/Type /Page
-/Contents 1207 0 R
-/Resources 1205 0 R
+/Contents 1497 0 R
+/Resources 1495 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1204 0 R
+/Parent 1482 0 R
>> endobj
-1208 0 obj <<
-/D [1206 0 R /XYZ 70.866 789.024 null]
+1498 0 obj <<
+/D [1496 0 R /XYZ 70.866 789.024 null]
>> endobj
-1193 0 obj <<
-/D [1206 0 R /XYZ 70.866 699.483 null]
+1484 0 obj <<
+/D [1496 0 R /XYZ 70.866 699.483 null]
>> endobj
-454 0 obj <<
-/D [1206 0 R /XYZ 70.866 684.242 null]
+514 0 obj <<
+/D [1496 0 R /XYZ 70.866 684.242 null]
>> endobj
-1209 0 obj <<
-/D [1206 0 R /XYZ 70.866 641.428 null]
+1499 0 obj <<
+/D [1496 0 R /XYZ 70.866 641.428 null]
>> endobj
-1195 0 obj <<
-/D [1206 0 R /XYZ 70.866 508.252 null]
+1486 0 obj <<
+/D [1496 0 R /XYZ 70.866 508.252 null]
>> endobj
-458 0 obj <<
-/D [1206 0 R /XYZ 70.866 493.011 null]
+518 0 obj <<
+/D [1496 0 R /XYZ 70.866 493.011 null]
>> endobj
-1210 0 obj <<
-/D [1206 0 R /XYZ 70.866 450.139 null]
+1500 0 obj <<
+/D [1496 0 R /XYZ 70.866 450.139 null]
>> endobj
-1205 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R >>
+1495 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1217 0 obj <<
-/Length 2971
+1520 0 obj <<
+/Length 2069
+/Filter /FlateDecode
+>>
+stream
+xÚÍY[oÛÆ~÷¯ œ‡CÑv——%Y GNÝÚ‘D§H
+‚‘ÖQŠdIªnþý™½ñÉ’b$é‹Hîevf¾ogfWØXØxsö*<ûá*p ”ÚFø`xù”^`!JŒpi¼7gôGø«a»rˆ óDëm¾Ü¦l4¶<ß|/¶–Õqä|6 Ïþ:#0¤‘éûÈ·c±9{ÿ6–Ð÷«‘øÆ£¹1×F®Ã×HùÙϰÒ#Ëå¯ü¡´&Ø3ˆ…Bܮޔ ¬w!£1Á›s®[U'‹
+4¶|óM\¯Y™d+ùùPŽˆkæù5½½ _ 3v¯¯ÇÈsÊÇÆØÆÈÁ–\÷2«ŠU} êùÕC;î&y¾gÀ²Èò9ýƒe¹½¹Æû±ëRsÁŪîÖr¥ü;C8˜YE0¶ãU±´šÏU0 <®
+W!°1qÀJ[©"%I”ë\>—¬Z”àW×L>*€3GÂÏòóv±‘lX©å¥|.òmV³²J¤¾Oûzlûð
+BŠ,Ë¥*ZØ|ìyVù{›-ÁËG ´çÚ~¦š.­¯Iö´ä?7E$hÉBë¡OP¯a€Ô¸±žôk ^ß~eœì§pêîŠQšÿë0"_¤Éÿîn®/¯Ãè;£ÅF66ÿ)Òd‘ÔÏÆ¯oÔa Á¸o‹õ„¾\½èÕÍôò·]ŽÏâ zÃxßüÈ•æ þø3侑í‘ DE|Z5”‹êuÉâeTÔ嘯
+'Š1mxÍ;¡b¼ÿô=Ÿd€ö„(jAÕx¶¯ Ĉ8Ê@UQ‡óèêúf²ƒtÒ!Ķ{¡»Ì¤{Ì”]zžÌTHC¨gÊ”&Û$Åù^Ž]ǪGÕ‘üòGõÅPk AJ$" kímŒ‘ÝVGo§¡œ3}7™ý>»ÃÉÛ6û°1ýf§%Ê
+âÎ]ŸLwË—ûþ©†…¶þ³¤qlUKV–ÏcLøËlrñz~,ilØìŸÙoã`Ÿý||g‚E\35]Äb˜QèP«vQŠŒ›ƒëB6w]ÿãJNäq‡q75­ü¹’A‰Á^cr`G€„Ú±só3M»ìx%Yõ¿ÛÇZh:Ü îVëœK~Ìds¬6
+
+‚W²WBNyOSŽdÀP’¶9*WtõZRË–¬˜§dÙÕÜô¨uÏUõ¸eç‚fØ<Ï3ùJÌsÒ4~â1Qh÷ÌŠµÊ·]^i³U ¢øÖ§Æ=…¥Ð¿KØ]ÿùºò­SþñÕÿHS8hSGq£Àq`$¢T%ò7,c%Ø£´ÒyàªLäËœòŢꉉ#ßýÑrt<ùõÀ=§sï5}éË¥½©«ƒv²œM>/zz»0ÆÒcfé›+ݨ˜ÄþâÕR{µûIÿ™.Ú§•À²¡ÿâ¨êh
+endstream
+endobj
+1519 0 obj <<
+/Type /Page
+/Contents 1520 0 R
+/Resources 1518 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1482 0 R
+/Annots [ 1501 0 R 1502 0 R 1503 0 R 1504 0 R 1505 0 R 1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R 1511 0 R 1512 0 R 1513 0 R 1514 0 R 1515 0 R 1516 0 R 1517 0 R ]
+>> endobj
+1501 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [117.694 705.384 172.516 715.966]
+/Subtype /Link
+/A << /S /GoTo /D (classstats__flags__e) >>
+>> endobj
+1502 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.678 634.64 246.236 645.223]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga49fb18e6ba9abac7dcf1f9a202741b66) >>
+>> endobj
+1503 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [198.498 620.684 311.673 630.31]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga49fb18e6ba9abac7dcf1f9a202741b66) >>
+>> endobj
+1504 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [345.106 620.684 390.481 630.31]
+/Subtype /Link
+/A << /S /GoTo /D (kmp__stats_8h_source) >>
+>> endobj
+1505 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.678 608.127 229.801 618.709]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gaccf71030e44454acab22210bb4a89d1b) >>
+>> endobj
+1506 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.516 594.17 287.9 603.796]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gaccf71030e44454acab22210bb4a89d1b) >>
+>> endobj
+1507 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [321.333 594.17 366.708 603.796]
+/Subtype /Link
+/A << /S /GoTo /D (kmp__stats_8h_source) >>
+>> endobj
+1508 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.678 581.613 274.65 592.195]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gab0bd69c3ce378f4f7079276311e034c0) >>
+>> endobj
+1509 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.178 567.656 354.926 577.282]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gab0bd69c3ce378f4f7079276311e034c0) >>
+>> endobj
+1510 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.587 555.099 209.795 565.681]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga62f4b6e3a4ba48c04b172b97df137839) >>
+>> endobj
+1511 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.654 516.63 221.322 527.212]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga7691000a7864b475046ae62fcf0536ac) >>
+>> endobj
+1512 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [142.55 478.161 236.214 488.744]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga7fa64ec62947bf0b97f3f4778dd22196) >>
+>> endobj
+1513 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [128.85 439.692 262.377 450.275]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga8b26485fe6ad4f74b63e54c42fcfd875) >>
+>> endobj
+1514 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [312.98 413.684 434.25 423.407]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga6e4f12c6bec4068d72ef9e84516ad01d) >>
+>> endobj
+1515 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [127.604 401.224 256.154 411.806]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga6e4f12c6bec4068d72ef9e84516ad01d) >>
+>> endobj
+1516 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.678 362.755 223.829 373.337]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga568b0fdabf6bf808dcb3b42b97c7bc26) >>
+>> endobj
+1517 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [126.678 336.348 216.863 346.823]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gaa30e2155ac435335965e2e615c1eaea5) >>
+>> endobj
+1521 0 obj <<
+/D [1519 0 R /XYZ 70.866 789.024 null]
+>> endobj
+939 0 obj <<
+/D [1519 0 R /XYZ 70.866 771.024 null]
+>> endobj
+522 0 obj <<
+/D [1519 0 R /XYZ 70.866 771.024 null]
+>> endobj
+1522 0 obj <<
+/D [1519 0 R /XYZ 70.866 723.426 null]
+>> endobj
+1523 0 obj <<
+/D [1519 0 R /XYZ 70.866 652.773 null]
+>> endobj
+526 0 obj <<
+/D [1519 0 R /XYZ 70.866 308.69 null]
+>> endobj
+1524 0 obj <<
+/D [1519 0 R /XYZ 524.39 254.158 null]
+>> endobj
+530 0 obj <<
+/D [1519 0 R /XYZ 70.866 237.573 null]
+>> endobj
+1518 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F174 1021 0 R /F11 878 0 R /F99 691 0 R /F162 890 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1545 0 obj <<
+/Length 2548
+/Filter /FlateDecode
+>>
+stream
+xÚÍZÝs›H÷_AmUE³ó äáªGÉy׎s²²/É–Š
+jëÔvØCÀ€ž0¬8fF¤‹›ï'=°>Fœ±“Àú 1emØ×W7¿Æ+h˜áŒ#Hà©I³p‘Xª_Ê xE¼È¶”KDäáj49@FNa*(Â>iâëbÕ#¶ôPœŸSÙ-À‘‹XØ„üø°ì9"Ú°å}ž„ñ6.# 6?=.# BÛ¸«Rïî¡õ"â@Ouh ¶$«œèß}~KÁIEAÎw“òb¹ÎÊ$W¬7Ðh¼­'þI´âÄCÒëx΋jg(¿ïSŒQD½àñŠ¥Y”'*Ä)êÍTE¹_ßrÙ˜9d¾„6º†ÅeÅ Å*‰Rà’Ø DÆjæ‡Â©@„Ô!F„u…0a? (wø)ö„¸E›a÷  û¶ïx’>A‚û' ‚‰žrꎔü½Ç$PÑò&72%àEÔ‘EGÚQ¶s p 82žˆÛruüPˆ¤-Ø–KhôS¸Ë…ÖY\QCÖaWYIšÏ¬ÈãwgÎ'M
+6@÷mn@Ɖ7É“,RN,s¿¨ ù»yžNK4ýæ °IÍ©¢-H”a…G+¢È’€]ÂyE¥IHE§Å*,£ûi
+zMy‹ˆî Zo±Öš®2•îT¿1“I¿Ÿ¿¿ÞIUöÉ jo×kú‚úó^¦½‚OaQnÌjÕ2Γx%ûÞM³¥ZßoêO˜–Ò0‹[s
+ð¼yÍÏlÕpXûR´jÚW#xûjîÈU…ǯ +扇kêŸVÕÄoÃþq~õq´³F`ˆû¼U#€ÁÔ†‘>S‘ëHÔ—÷¬k‚ý…¸€w¨jMarãP25Ü1NÝ0Ä`Ò)@‰°`mÐuƒÊß=AO«òwÎivgÝÀ N‚Ë¡`A÷ôuÃ$]˜@4¹¼î¯`¾w’äåIÙYÀGÔ þã•‚5ñÜø6\¬LÄûK‡È¾ó«~Ðå¡lwGÎã¸è$í\a+,•9OXNÈŸTNð€C•JŽJãaÊ îSÄ„wšr‚ûœ=¦œx"no9Ñ‚m8Ä,&ôæ=¢”8\ýíÕd?‹‡=è(Öƒ€ÆìX‚`Fa)=†ªfÂ&ìö¢§a÷{Q:^®u†^¥ù«ü¦¨‹„BÇ»½*ŒãNäêÔ3ý%ŒñÞÝns°¾ÛKÕ£ùqns8(õ:K:´­SÃT õbÙÚsºp «­ça¾¡·Î¡ÆJ«¢ðÉu'e‡ÕO*2Ø."X
+’‹“
+°þܬ•î«¥ ¿*/OŠÍõZÕfÉgëÆíÿ°Á¤ñÄôýùõèe]Ó0È0õ[cëõ×ÀÛbÛ€ƒ8Ò™Žaa}Iue}y¤31ǃťºil5Ÿíñ¤§¡ö»R õWª|£ÓI²NŸ¤n…<à”»ýã` ·W—«öãZkOà±³G¢B†¬›Áqosθ=j
+ó¬ ¨(–Q´ÖwÎf\µÔp±\Ø}_®Û°.h0‚º£0º¯øè+='V‹Áîz–‰J+Ds9š5äÒ7²B75Z"éÕn
+Ó¹²7_VvooK¤VS=‡¹ g3%YžÌ@´ØŒ• ºý
+Í?sµlžâ™!g;Ѧ†¹‹4{ $ð'üÛòÈ›8¶ÿX ˆ{oŸëFWa~×J;×ð7¦´-®!瓸q¬­^Qö,æÆo}ê*AÔ1—èj¦eæiµ.ͪiféÌO•*éoPš‰RuùcgvÆ|n¾ë®ÍÚüÈ’$6ïUàQ#ñr
+endstream
+endobj
+1544 0 obj <<
+/Type /Page
+/Contents 1545 0 R
+/Resources 1543 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1482 0 R
+/Annots [ 1536 0 R 1537 0 R 1538 0 R 1539 0 R 1540 0 R 1541 0 R 1542 0 R ]
+>> endobj
+1536 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [299.815 668.388 425.345 682.336]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga49fb18e6ba9abac7dcf1f9a202741b66) >>
+>> endobj
+1537 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.304 638.408 236.42 648.99]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga7fa64ec62947bf0b97f3f4778dd22196) >>
+>> endobj
+1538 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [289.836 481.36 398.93 495.308]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gaccf71030e44454acab22210bb4a89d1b) >>
+>> endobj
+1539 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.304 439.134 235.424 449.609]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga7691000a7864b475046ae62fcf0536ac) >>
+>> endobj
+1540 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.74 340.528 272.709 349.439]
+/Subtype /Link
+/A << /S /GoTo /D (classstats__flags__e_a3f4cdfcd6be0d93ac771c0e37c61567f) >>
+>> endobj
+1541 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [169.368 201.216 294.897 211.69]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga49fb18e6ba9abac7dcf1f9a202741b66) >>
+>> endobj
+1542 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [332.266 201.216 382.461 211.69]
+/Subtype /Link
+/A << /S /GoTo /D (kmp__stats_8h_source) >>
+>> endobj
+1546 0 obj <<
+/D [1544 0 R /XYZ 70.866 789.024 null]
+>> endobj
+534 0 obj <<
+/D [1544 0 R /XYZ 70.866 771.024 null]
+>> endobj
+1531 0 obj <<
+/D [1544 0 R /XYZ 70.866 753.828 null]
+>> endobj
+538 0 obj <<
+/D [1544 0 R /XYZ 70.866 753.828 null]
+>> endobj
+1547 0 obj <<
+/D [1544 0 R /XYZ 70.866 693.693 null]
+>> endobj
+1530 0 obj <<
+/D [1544 0 R /XYZ 70.866 580.245 null]
+>> endobj
+542 0 obj <<
+/D [1544 0 R /XYZ 70.866 565.004 null]
+>> endobj
+1548 0 obj <<
+/D [1544 0 R /XYZ 70.866 506.666 null]
+>> endobj
+1525 0 obj <<
+/D [1544 0 R /XYZ 70.866 422.506 null]
+>> endobj
+546 0 obj <<
+/D [1544 0 R /XYZ 70.866 407.265 null]
+>> endobj
+1549 0 obj <<
+/D [1544 0 R /XYZ 70.866 186.048 null]
+>> endobj
+1543 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F179 1097 0 R /F11 878 0 R /F46 685 0 R /F174 1021 0 R /F162 890 0 R /F99 691 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1558 0 obj <<
+/Length 2660
+/Filter /FlateDecode
+>>
+stream
+xÚÕZßsÛ¸~÷_ÁºGÍX,ü‘Nœ‹ûjÇ®-ßµ“Ühh‰–y¡I—¤’ú¿ï.vI‘¥Ø–Ú^Ÿ‚Àîb±Øý>P¶17lãÃÁÛñÁŸÞ‡Ê¬Ðóc|gø¶xžá‡Òò„1žŸL×ü:þÉp”k¹Âyº÷<Ÿ-Òx0”~`¾Ë§‹‡8«¢*É3|0üó@ÀXÛÌ °éÓ‡ƒO¿ÚÆ ÞýdØ–Æ7=òÁp•c)u¤ÆõÁßì¶®×c§',»6ô]üÙ¶e–h+´aQE¿i’±©ž¢ßüŽ~qF½Œ/“Q„2­{K¯Ä¶¤B+ðçX!l¿e†m  –(²@YBXŽå†Â¶mó3²åËÀüëùåºs„†/p…ÚæØ’°qvI×Þó‰¡G&½¿¸ÿxÒ£8´-ÏU{Q:–㨮âÑß/ÏN<¯k–Òƒ©þ>4KZžò»šÇ§ç£«Ï¶²Q5ÌðÃÖ GXeu?DÓb m3? ½À5£÷~Î;ª\ƒz"ˆ¢+çh(eù¶„† 4ëçg›Qºˆßtæ.eOàß 8º¤cy ¥16Çu]œ_NʸH¢͆@³ù7*æµa`OØ%b³¶>ãv´ …ç[ŽïCúúTVQQMâl¶_­4¦OéÍõèj’L¿N¦ùãÓó•J8ƒØÛµò jÓh‘Mï'Õ}G³IšçG¼gÂÅœcùêÃñI¤3Çä.æå$~ó&Í磯; Z¾k¾TÊ’®³Ýüz6_¬Øv|=Þæ­N"…]·|Ç‘¾¥vÅñlF)RœŽoôÛü×cšLΫUò%µÙ,.6»‡@œp>šÔéaҜֵ#ųôº®mZÝC³51m+„|€§/t8;_$žðè!®ÀR!̲÷ö+X}ÛWá¤T ú·V8ØÅP59mÏ2°–(Cù íp› -¬P©NjõÝvRСIXµb¬§–¸¥ ɽRq' ±ŠÉPtõFcõ¨UWVŽS²‹bò¾®úUô£7.ëEÌ•Žƒ,üfØ‚‘¨Cròñø|tÔ Î5Ö†£FB¯W(8GÖ—»b=|8ÝÛE|?œv’ÁáäA)SjÇprÀ d…w9c·ÄÒë´öÇRGëwb©Ž«ê^·§ºŸ•›CäÅ+\ß^¡”·[ˆ¼\FŠìÁgàwÜtÀÈRòQþeàHðq–dó ¨»…åº.”)”’ˆ\Ü †Ž#Ìó›ë1¶lóäøçõOFÔu ç—ºð$¿ã·x´éýÍÇwÐÜX°pt»`m­S(ïâŠTŒÎ®YïÛãw¤j|rúñõ¦Q€éxKɧgg,'Ç——£Ѓ†Â‡UÝ¢<jJ¯cûMéulŒØ˜:ó,.©õí>¦Î
+¿ní¯ù}ÔªÜs›£-_R™lU­Òr¥žs— ‚ÿÌe‚Û¹LP¯¸Lp¸}¸ËåªgÞ%ìC/ß%´õþý
+O
+CÌçÃm<iVôL2¤›I¶]îJ®Ñß=›‚
+
+Åo7l³› ‚¿@×ûaSŽt,[ÏbS¯TÜ‹€;zÿÿØÔË]±
+ B:r·pÚI‡“í[¶ì…M9òn]/¶²©Wjí¥ŽÖß ›zù
+×·×öÀ«Án!òr¿nH?´ìo<yaÍ¡9ÍÓ4žâ±Ã'FÛUòˆ{
+b¦„ɱ›ƒŽñ^œš‰F¶Iß
+%`5!†0j”É<K0jaç*ÜOÉ? ”mò
+
+endstream
+endobj
+1557 0 obj <<
+/Type /Page
+/Contents 1558 0 R
+/Resources 1556 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1482 0 R
+/Annots [ 1551 0 R 1552 0 R 1553 0 R 1554 0 R 1555 0 R ]
+>> endobj
+1551 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [216.321 653.286 314.552 662.196]
+/Subtype /Link
+/A << /S /GoTo /D (classstats__flags__e_a37c8b539cc437be55817a1f122698106) >>
+>> endobj
+1552 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [189.013 617.585 342.956 628.059]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gab0bd69c3ce378f4f7079276311e034c0) >>
+>> endobj
+1553 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [315.769 509.463 424.863 539.762]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gaccf71030e44454acab22210bb4a89d1b) >>
+>> endobj
+1554 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [159.388 358.908 268.482 369.382]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gaccf71030e44454acab22210bb4a89d1b) >>
+>> endobj
+1555 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [305.852 358.908 356.046 369.382]
+/Subtype /Link
+/A << /S /GoTo /D (kmp__stats_8h_source) >>
+>> endobj
+1559 0 obj <<
+/D [1557 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1528 0 obj <<
+/D [1557 0 R /XYZ 70.866 759.174 null]
+>> endobj
+550 0 obj <<
+/D [1557 0 R /XYZ 70.866 743.933 null]
+>> endobj
+1560 0 obj <<
+/D [1557 0 R /XYZ 70.866 602.417 null]
+>> endobj
+1527 0 obj <<
+/D [1557 0 R /XYZ 70.866 417.427 null]
+>> endobj
+554 0 obj <<
+/D [1557 0 R /XYZ 70.866 402.187 null]
+>> endobj
+1561 0 obj <<
+/D [1557 0 R /XYZ 70.866 343.74 null]
+>> endobj
+1534 0 obj <<
+/D [1557 0 R /XYZ 70.866 211.76 null]
+>> endobj
+558 0 obj <<
+/D [1557 0 R /XYZ 70.866 196.519 null]
+>> endobj
+1562 0 obj <<
+/D [1557 0 R /XYZ 70.866 138.073 null]
+>> endobj
+1556 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F107 725 0 R /F179 1097 0 R /F162 890 0 R /F99 691 0 R /F174 1021 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1578 0 obj <<
+/Length 2702
+/Filter /FlateDecode
+>>
+stream
+xÚÕ[[oÛF~÷¯ š‡J@4;÷K]ÀIœ4mgm] ) Z¢-ndR+Ñõæßï™ )ŽDÉ–EdÑ'ŽÈá¹|sæÌùf(œÜ&8ywòj|ò··F$)Y2¾IFZÊDŠ$IÆÓäó@ B†#ªôà²J«|Uå“•ÿý.­fÙ2/nýÏ›åâAyçü4~51Âp5ücüËÉÙøä?'Tã„4ª´FšòdrwòùœLáÙ/ FÌèäÁõ¼K¸`HpíyryòÏÜ6ŸHš°ŸÊ¶ý’ \;pù÷jyŸYÀYÓêÌ„ëŒ}·û±<Š”0uûbšÝäE6õ=¹l&*09ô|9q¢“´
+§å8¯ò2HJƒì9LPß’ûFyã¯ö•yxøõnqÕ 3š9%'Qas‹½¼³¹«Ö„
+Lâ »<ïÒ
+É…)Ú‹V ZXÒXë>r‰A ïC3%@55?Æ.%‘O`—vY~„^B'-v£-A:‚ÚÊ€Å@ì —PûÓ‹Rcëw+ÝI/ÔºµŒh`5:V»›^Âä⢽&±Þÿ/½0ñx/Ä…AŠuͤ.zÉú”k±écôÒÆ:U‡ÓËr±—X
+$(D•­ïµ>–XRbEA§&–LÐ@,MC,ËÅS)¥x&‡ã@ïÅwâpŒ
+ÆÔS#½»ãº>QûZ`ˠžÓ;Ó©›'Ðt4ÖiÏÌ?ZœWþ†-ƒºœ>­°TÆdì¤HÕLVÙìJ7 ßr†Àui¿çXeUxýô¦ªßÚ?ie÷Ö H{ ¹æ¸2|A ë/ܹ£ýt¢ô_œXG&ic}¹Ë  `¼eFB´emˆ´ k+–ÀC¼MóâùÜT²¿,7%¸ë£
+³‹œÂ[’ǃj‹ãÊ"…´°¢ˆ;yoJÌ.r*Ü7/}hUI.c­ÍÆP'EäP ë§@®)ý'DÅë¡r[9vÀ\ ßAÁl±‹ÍÁÞµ%@ñÃTøP­‘¢ªŸî¡aQðîÆ3&1¬ãÓ°¶²Øøz\·‰ –Ç€nO*±étÆšè Ð;é:“ x3íE©Ü•î¢ëÚr]Ò‹ZˆUAI¬v]çØ8Öƒ^üÛ²°Hoÿt½¡é;ɲAXô2€Ü0`c
+å]$¥µœGÅAôÉÓz;l³«­mög’dùH2 Â#Žá1ÇÉð$Ù@¾g=sbžB‘Ÿ§µ“!·•~:|, >Øù­ j¿„Gcçpµ“Û‡¢PøÑCþƒPÿuB"ª øl‰
+
+endstream
+endobj
+1577 0 obj <<
+/Type /Page
+/Contents 1578 0 R
+/Resources 1576 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1584 0 R
+/Annots [ 1564 0 R 1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1570 0 R 1582 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R ]
+>> endobj
+1564 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [296.571 542.33 431.093 552.912]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga6e4f12c6bec4068d72ef9e84516ad01d) >>
+>> endobj
+1565 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [319.46 501.857 473.403 515.805]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gab0bd69c3ce378f4f7079276311e034c0) >>
+>> endobj
+1566 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [272.42 471.877 406.942 482.459]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga6e4f12c6bec4068d72ef9e84516ad01d) >>
+>> endobj
+1567 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [84.558 459.921 196.162 470.504]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga62f4b6e3a4ba48c04b172b97df137839) >>
+>> endobj
+1568 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [319.46 302.874 473.403 316.822]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gab0bd69c3ce378f4f7079276311e034c0) >>
+>> endobj
+1569 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.892 273.001 245.838 283.476]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga6e4f12c6bec4068d72ef9e84516ad01d) >>
+>> endobj
+1570 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [496.012 273.001 525.406 283.476]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga8b26485fe6ad4f74b63e54c42fcfd875) >>
+>> endobj
+1582 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [69.87 261.046 207.378 271.521]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga8b26485fe6ad4f74b63e54c42fcfd875) >>
+>> endobj
+1571 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [242.237 261.046 399.184 271.521]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga6e4f12c6bec4068d72ef9e84516ad01d) >>
+>> endobj
+1572 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [245.408 249.091 402.355 259.566]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga6e4f12c6bec4068d72ef9e84516ad01d) >>
+>> endobj
+1573 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [69.87 237.028 231.793 247.611]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga8b26485fe6ad4f74b63e54c42fcfd875) >>
+>> endobj
+1574 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [289.836 91.936 398.93 105.884]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_gaccf71030e44454acab22210bb4a89d1b) >>
+>> endobj
+1579 0 obj <<
+/D [1577 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1535 0 obj <<
+/D [1577 0 R /XYZ 70.866 705.684 null]
+>> endobj
+562 0 obj <<
+/D [1577 0 R /XYZ 70.866 690.443 null]
+>> endobj
+1532 0 obj <<
+/D [1577 0 R /XYZ 70.866 612.912 null]
+>> endobj
+566 0 obj <<
+/D [1577 0 R /XYZ 70.866 597.671 null]
+>> endobj
+1580 0 obj <<
+/D [1577 0 R /XYZ 70.866 527.162 null]
+>> endobj
+1533 0 obj <<
+/D [1577 0 R /XYZ 70.866 413.821 null]
+>> endobj
+570 0 obj <<
+/D [1577 0 R /XYZ 70.866 398.581 null]
+>> endobj
+1581 0 obj <<
+/D [1577 0 R /XYZ 70.866 328.179 null]
+>> endobj
+1529 0 obj <<
+/D [1577 0 R /XYZ 70.866 202.884 null]
+>> endobj
+574 0 obj <<
+/D [1577 0 R /XYZ 70.866 187.643 null]
+>> endobj
+1583 0 obj <<
+/D [1577 0 R /XYZ 70.866 117.241 null]
+>> endobj
+1576 0 obj <<
+/Font << /F95 690 0 R /F162 890 0 R /F99 691 0 R /F46 685 0 R /F107 725 0 R /F179 1097 0 R /F11 878 0 R /F174 1021 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1587 0 obj <<
+/Length 664
+/Filter /FlateDecode
+>>
+stream
+xÚ•TKs›0¾ó+ÔSà`UI@ŽyNž¤‰;=$9f ’+pSÿûJ¬ðØž\zÒ²ûíî·/ú@]g³àûUÎQ†s!4[ ”àL”æ1Í*ô²,z›Ý¢„3ÌhbýíTW›FF“8Í ]nZ©ú¢¯µrààrü¨ÅDw1³ g1Ce¼¼TYÛ-"8É3ô9 [Äx‚9s9ôüÈ>O&¾à)(&#ÑŸ’CVóáÓ?]èe’$"¼›>Îg7ÓËùÙýÃùÝ+áD­´/õ~m@ó°-J££Á±ߺ• Ñ€)uåïQLÂF—îYáhÂiΖu¸Ïºi
+ µ:B¤—Bùp¨ßÖ0¡çœC[ß8åa%»ÞDÊÃMÙkã”Pš3v½^{͈w¬LÄIhËIXžÛáÚ´¢˜[‚µø70üªûåèë*†d¯„ĪVb°m³Þ€¹,ÔIúeDm;wAÙj3²X>€V^u8ǯj®l¦¯% »¢õŒÌIÇ#K oÀTiOÏ…¨Õj‹þÄ5¤ƒïžµÑJ¶xG&Å"öd.ŽZa}ì¦Vž‹ ½€×¹Œ÷µj×óÎ^WÙÙáåaIžä"Jìâ©JYí¸y>·QÊù{a`jiܸåÇÛÿÕéòÔ^îÿîøcØ޹ƒÁ9c‰…8p¾–Jš¢éŽÝ¹25Ïr B,üK(‰ŠÓ˜Ÿ²¾Ãjø¸Q½l^cî}ÖRM]‰–Qnåi’9F4¥8NèøC³ O<jŸ7·˜xÄ<mœª |_¿›Â5s×ãý~_h7Ž¿Û Õqÿ²^
+endstream
+endobj
+1586 0 obj <<
+/Type /Page
+/Contents 1587 0 R
+/Resources 1585 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1584 0 R
+/Annots [ 1575 0 R ]
+>> endobj
+1575 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [88.823 758.177 200.427 768.652]
+/Subtype /Link
+/A << /S /GoTo /D (group__STATS__GATHERING_ga62f4b6e3a4ba48c04b172b97df137839) >>
+>> endobj
+1588 0 obj <<
+/D [1586 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1585 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F99 691 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1595 0 obj <<
+/Length 2957
/Filter /FlateDecode
>>
stream
xÚ½\Ys7~ׯ˜Gªj‰
-(ù÷ÛÀ`8xÌa¿X9ì¯þú@7dš<&4ùñê‡Û«ïÞZ™b•âÉíC¢)1J%ÚQ,¹½O>Maôz
-ÚLn¯ Ì·_²ÕcþÆvÿò²Þàk:Ù]ÿqûs"'Rsî¿Ê­{÷êÍíÕŸW ߤ ; C ˆdñ|õéšÜãg?'”pk’Wÿäs"$
-NØ2ùpõû ZSÒ½t?ÂÕ b“ÕU(Fh}ŒRŠëP²\”ë`*_Ǩ€C‰–V9šL9%‚Bñv¿Zì²õj[—~~÷V¨ÊN3E´Ñ â«e.à@Ö¾›|šJ©&_ž_fÙjÇ!|èöqó6ô½Œ5™ÍðÁÅlOïpy³×l÷4»O_¶M™îá;*éQq“ì>]ífõÍ@ªØÄâÀ/p#¸.L}G)wO7V)ˆ5¬xf¹^Ì6éÃ5§“]Oã•…¡Nzò¸Ëî+ŸøEìr©5h&4QÀ»`¯Òkdé«—Y˜zÚN¹´Äp™L#VkŠi5Yù]dÒë r_Å·ÒÕ=ªï´Ž+Ê%¡º(ŠbgËl»« 5™­Öóe6/b…B×lrV'
-¨eDºm¯‚:r·Qª\¿á¨@-ª±TWEP‡“+æã:ªêècôŽU7H"q¯C°«d¥FääŒpeÚ“éª
-£¸®$£ö‚9tÝsÁ50N%aL×ì²sÙ/×®Á{Âù!°GÃç
-ƒÈ(ácü×öXxh.†YÂÊ’6OÓ±%X"O/ÀrBeV¢GÈKœG`þ¦0JpÂò=¢œbŒñâ¨MHS)Ä1w½FÔwXx””B ¿-´7-jNÀlYz_Ô Bc4Ç Â`4lôBFúÊ+º†)· Q/ÈO'_0HÒQr/=cØ!Øa•Œ\ï°k Çó*¬«8‘Wë°B@:
-°Î åð¯°pÎ+´wÖ²h޾ïz$½4oÐÈÉ–Ê+üX|Ã$,O;pJ,Œ±©À9Q¬eÍãþ
-ÚDì´ˆó,$#°€Ûsí„KX
-®t“ÞQ
-«¬<ŸÏÃj—Ù*@sMëÞæ¾RèU\«*î™ÅËË5?u— 6èç€l—µAq™à/×ñYGO­ ¥2Í1Ö‰>cw4 pÞYBtfa±Zr¢*K92vx2FßUáRÕQãswå.LjQ@1·0*ê ¯ó,–Œ$VŒ³ÁÆÅ&à‚€cõR^÷99—žoí²r €ƒDª¾Û\Ÿàédc›ÏLÀ5ÀéñŠu›Èư§x\VWïÔ|…—W³NMÀÝàä˜Ó3£x—XckÕk ÇG¦®¹®ÎŒ}ùœ;„»#EMË-¢³w¶teÔ¸X‘¹‹t½;6¬q­ £ÆAÆÒHÊr|Z£¨ìäÒñ©‰ÅÖ#ÍÄÆ&n\je]õ£ãÒ)·€T×fï \h¶c ßA¹ºpŒ±)Sè±\û)WÇSîTlkÊ ›†M‹¶aë
-W‚›†ÅŽy¢´t`—ìlø+M]Ö±–Á%N…?å7¬ÁD³.` L þþ{sä±)(w¹C~㱩¿mÁ‡õ¿‡ÉÈû
-Zt"¤Öò&#°À`½Áô8Ã/×u T\:üê‰%B ú ¿ºëß6!ŠÀBx É4Ðpî¸vñð‹iI”ì4ûê gBþ+¾º«Ý6À¨a7è†É– MaòÅ”3„î:ùê§AœU ¾ê૳Òmã¡ÉØ0t—ÑÞ¼BgDCðŸ\Ûcâ—m£Œ.çMµ+ªly¸¬†>/é"sÓbàr˜ÀdÅ;OsÊîünSš®Š?å\úÑÉ2½'µaŒ¼|#ï=Œ9uûU“sçúÿPüO
-ëvô×rÓ…ô3޼‚MW馼åU¬êí&Ë_ܤ‹üE±( Å+ßSû½äÅ` ÊÁÖOXë.ï@ªü×_ÑÿûíÐ}@n¸?¾ ã
-(ÿ2¬ì?ÔÔ–øÌ¡GñÞYý9ìæ/ÙçÍÜÕ‡«iÕkj7k?_ûçÑ?®š[üuH'
+(ù÷ÛÀ`8xÌa¿X#ÓúëÝiò˜ÐäÇ«n¯¾{kebˆUŠ'·‰¦Ä(•h D±äö>ù4‘„Áõ´™Ü^:™o¿d«Çüƒíþåe½Ág:Ù]ÿqûs"'Rs$î_Ö}zõæöêÏ+†Ò„8C ˆdñ|õéšÜãw?'”pk’W¿ò9‰ Gl™|¸úýŠ©)éÝ £:a@,c²ª…b„ÖÕ`”RÔCÉR(õ`*×ã«À‡-­r|h2å”
+9‹·ûÕb—­WÛ:ðó»·BUvš)¢N?±Zæî
+Æ+Š¡Lzò¸Ëî+ßx%v9Õk&4QÀ»ð^¥×ˆÒWO³Âbêa;åÒÃe2eŒX¬Q¦Õdåw‘I/7"ȽŠ¥«{ß+´Ž Ê%¡ºŠdgËl»«pj
+2[­çËl^
+®Ùä¬L
+ãTo˜ƒ2U#:¡Ì#ßTqV|} Î@”ÒvÄY0¥@GV¶
+À:ÊNè)pC8~6å‚©ËT@XH7énž-Óû<ܤÛÅ&{qQ¼ŠšpøA%MNðö)ݦù&<r@-C
+—!ý'»j]àÂK<r²_ìüf’Kô¢A!SQ¨ÈnE
+
+­ûgDù¼¥RŒÅQ s‡MCS·3;ÃTFñm)(=y*µcuayýÁ+Éyk‰¤¸‹ËªÛl…@ì›Îl«0 ðÇ\âz„JMp®"rc•Bí(L1kmëL×Q¹ª‹›Q˜ZF¤Ûö*Sî6W *—o8W –ÕPÕÕ9®CŒÂS&fÙ:WªÑÇè!É4jiDâ^‡VÉ5xÈáÊ´Ã!Ã-+©)ŒÍº’bÚ
+s
+躧Â5fœ¢Ã3]WØå4ærZ.]÷„óC¸Ž†Îat”ðÀ1ªk{,<4•a–°²PÍ“oLKäi,'ÔÈQ°=B^â<³2…Q‚½èàC¤ˆ—<m@šJy¹ë5"¾ã…¤@)âÛB{Ó¢æÌ–¥÷E *4FÃq * FæA/D¤¯§¢:L¹X¾ˆz™}:ù‚AŽ’{1èÃÁëº[Ɉ@}G`+ÖªÎÖÕ‘ˆ«u„±B†tÆ:/kŒx……s^¡½³–5vDrô}×ùè%yF†HÖ°T^·Çâ&ayÚ!€SbaŒMΉb-k÷ ²æá4ž¥ñ$9|ß@k¢]Lª
+ŽÑ­Ã -ô™ì†^c\94xë8J%™¹Ìÿ8z ¸Êd8[©ˆ±ìRÿãè5ZÂXs,éØˆþ'ÇÆXR¥xzÃ]N•B´¬á‰+˜”cðL2B¶ý>êö®
+®´Êí™øiÐõwðôgŒïORο]ƒ˜Ì7óçt—n®›Ä;qšÍoc]aI1Ó3]a,<¬ŒãF¡á:ÆÓ¹!âdA€‹ó”\³’¨n<\Ël‚ ÅêBÕ{C‘S,Ær Ïý8×;Ë’@On2ž‡®€6“õChF<…¶Å:oBdÙj¾,ùÓ}¶I»ÌwçÒ¶è†JAwÑ[¦s@²þ ÁøZáÁ\ ´>ú(F6$fÑ <{œ0}?¾qÛWÙþ¸\.¬zû´Iç÷ùóO7u4¤«Åz¿r®í±P4©vù+ÇíÞYî¶Õ0·«‡Y~`z…'$MOñ Ëq_”k´ÛöüáúñC Ê¾tæÝÓ~çKÒ
+Ág
+Uþ½bÂj}1:ËÝ6’†A`
+ÊoX+ÂÍ
+¨À<ú[íUž#MA¹ËòMým >¬ÿ=ŒFÞï
+§æÃhä¦gVùA£ ¿€â›Ò\4üêÉ8nû*ßo6üê®AË‚Ž„ÔÃZÞÃh¬7˜gøåº”ŠK‡_=yGPcý†_Ýåo›I`!< ƒhh8w\»xøÅ´$Jvš}õdGB…ýW}u»m<4€QÃnÐ £
+’±a
endstream
endobj
-1216 0 obj <<
+1594 0 obj <<
/Type /Page
-/Contents 1217 0 R
-/Resources 1215 0 R
+/Contents 1595 0 R
+/Resources 1593 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1204 0 R
-/Annots [ 1211 0 R 1212 0 R 1213 0 R 1214 0 R ]
+/Parent 1584 0 R
+/Annots [ 1589 0 R 1590 0 R 1591 0 R 1592 0 R ]
>> endobj
-1211 0 obj <<
+1589 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [139.601 704.693 262.19 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__TASKING_ga8b2a95073f7a4a81055899ee6a93ecee) >>
>> endobj
-1212 0 obj <<
+1590 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [266.646 704.693 295.555 715.275]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1213 0 obj <<
+1591 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [113.38 667.831 214.404 678.413]
/Subtype /Link
/A << /S /GoTo /D (group__TASKING_gab53273918f995639450c4dcbed02df88) >>
>> endobj
-1214 0 obj <<
+1592 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [217.781 667.831 246.69 678.413]
/Subtype /Link
/A << /S /GoTo /D (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) >>
>> endobj
-1218 0 obj <<
-/D [1216 0 R /XYZ 70.866 789.024 null]
+1596 0 obj <<
+/D [1594 0 R /XYZ 70.866 789.024 null]
>> endobj
-1219 0 obj <<
-/D [1216 0 R /XYZ 70.866 771.024 null]
+1597 0 obj <<
+/D [1594 0 R /XYZ 70.866 771.024 null]
>> endobj
-462 0 obj <<
-/D [1216 0 R /XYZ 70.866 771.024 null]
+578 0 obj <<
+/D [1594 0 R /XYZ 70.866 771.024 null]
>> endobj
-1220 0 obj <<
-/D [1216 0 R /XYZ 70.866 723.517 null]
+1598 0 obj <<
+/D [1594 0 R /XYZ 70.866 723.517 null]
>> endobj
-466 0 obj <<
-/D [1216 0 R /XYZ 70.866 641.74 null]
+582 0 obj <<
+/D [1594 0 R /XYZ 70.866 641.74 null]
>> endobj
-470 0 obj <<
-/D [1216 0 R /XYZ 70.866 582.116 null]
+586 0 obj <<
+/D [1594 0 R /XYZ 70.866 582.116 null]
>> endobj
-1221 0 obj <<
-/D [1216 0 R /XYZ 70.866 557.261 null]
+1599 0 obj <<
+/D [1594 0 R /XYZ 70.866 557.261 null]
>> endobj
-474 0 obj <<
-/D [1216 0 R /XYZ 70.866 557.261 null]
+590 0 obj <<
+/D [1594 0 R /XYZ 70.866 557.261 null]
>> endobj
-1222 0 obj <<
-/D [1216 0 R /XYZ 70.866 512.758 null]
+1600 0 obj <<
+/D [1594 0 R /XYZ 70.866 512.758 null]
>> endobj
-1223 0 obj <<
-/D [1216 0 R /XYZ 70.866 303.842 null]
+1601 0 obj <<
+/D [1594 0 R /XYZ 70.866 303.842 null]
>> endobj
-478 0 obj <<
-/D [1216 0 R /XYZ 70.866 288.602 null]
+594 0 obj <<
+/D [1594 0 R /XYZ 70.866 288.602 null]
>> endobj
-1224 0 obj <<
-/D [1216 0 R /XYZ 70.866 245.787 null]
+1602 0 obj <<
+/D [1594 0 R /XYZ 70.866 245.787 null]
>> endobj
-1215 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R /F177 852 0 R /F174 789 0 R >>
+1593 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R /F179 1097 0 R /F174 1021 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1227 0 obj <<
-/Length 303
+1605 0 obj <<
+/Length 498
/Filter /FlateDecode
>>
stream
-xÚ•QËNÃ0¼û+ö˜0ë·Ý#‚VT ^¹µ=´[EjˆRAÿ'Ž'Nûðxvfá rSë¹S`©ÓZ@q
-Š\P䌰ƒ"få‚¥M¯Å„ú­[ O˜×sÓWõtއj×mÃL†Ù%vvƒŒK:V.0ûºG€÷J wûIS|{
+xÚ•SËnÛ0¼ë+x¤€šÙåKRŽEë Aƒ>¢ž’d™¶Ȳ«GÛü}—"•¸E/=q—œ]ÎÎÀö ØMò¶L®Ö…a¹(¬U¬Ü± Dn-Ë
+),²r˸ô©¼eÊh¡QQݼ{wÚN­KW2Ëù»S=]7Vcsê<8y_&ß$,0|é™ç"—šÕÇäá Ø–ÎnUäìçŒ<2m”0ÚßѲûäK‘'i|è—È!c(Eh.y[ðB\ JW
+—A2«ˆºäm#Ì×Å2ßø#YæíÂÙ.¿³¼‰ð§¼Ä¿ž÷3Àukü’Kèµ
endstream
endobj
-1226 0 obj <<
+1604 0 obj <<
/Type /Page
-/Contents 1227 0 R
-/Resources 1225 0 R
+/Contents 1605 0 R
+/Resources 1603 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1204 0 R
+/Parent 1584 0 R
>> endobj
-1228 0 obj <<
-/D [1226 0 R /XYZ 70.866 789.024 null]
+1606 0 obj <<
+/D [1604 0 R /XYZ 70.866 789.024 null]
>> endobj
-1225 0 obj <<
-/Font << /F95 530 0 R /F99 531 0 R >>
+1607 0 obj <<
+/D [1604 0 R /XYZ 70.866 771.024 null]
+>> endobj
+598 0 obj <<
+/D [1604 0 R /XYZ 70.866 771.024 null]
+>> endobj
+1603 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1236 0 obj <<
-/Length 1035
+1615 0 obj <<
+/Length 1027
/Filter /FlateDecode
>>
stream
xÚ½VÛŽÛ6}÷Wè‹Ô,9”H)-
-´q´E‚4ñÛn Ƚ&V–\KN¶ýú /òZ²n/éóÒÌ™ ÏŠw ^ÎèðK 1¦ùy9ûq9ûæ'FeÀR’d‚Ëu )I…DJ‰,«à&|¾)v½ÚGs€4L¢÷Ë_&@€pš‚A¡Á<IHœ
- ¡qæ@o’Qlpƒ'+L3¹nzþ% X°7ÆxkÝ@¦á^u†7œ†"HBUE,ÌÙÅbÌäYL¸€ÿ$ó-¥¼¸ë>ŸŠ¹&áÿhòbfþ¯2—›Â,:‚—mÓõޝYvÊ{F2ɾš9_)rB/IbÜ*¶ëÚÃ~²ŠEz)ðxLz\üãê/T_è‡à„Fuå^ïeæ2é©å;O…åF¹îA³ëq"fÊþ°÷¯ûMáßV&}¯WªsÏ
-èz´vÝ–Vòˆ)Ɔ$¼Ê,Žm‹u½Ö`)sF»Ž†Cí_"_"ž„dCž"ô|†àgøJmWƒÒ/о¸*ÚŸ9³óáÂI¢ãq™š Ô‹åì÷ó´a8– iB’o¤r;»yOƒ
-_âÔGÁýh]·‘¡Qïf¿=^e'rx… u¤½[*Û”=ágϬP pN´bB“yœYµ‘¥¨»ÖÍá¯9ߺg¿¾z“ÿ¼xñz™?<<D§¢tæ€ÖóÚis´—úöÖ¡9ÒcëŽéS‰?•JSxsb«î"­\Ä*þáì<Çø2WM•[i2kQÔúOs©*ß¡¸0Šƒ«U}KŠìk_fS ž~ñ#rAX*Ny8P¾ÄÃw¢×EOàÒ¹èMóHBÑÝ;y~Y¥3õOÕîì26߆ýÔ~ˆÍ9Ò6d”{úâ'nÀº­ðèÕñÿÞH—1Ù1öHv¦œF€DÚIÇGÕ³øæ£!àˆ¶»¶s‡žB<ìÔVÏ˶v¬Ãp5V?¸ZVו‡ù¸Ñ寙# uúcG …¦èg9?z­M90*Óaw…ÞŸV nzã}–$®ûÆT|0»Õë|­·º«“Kòx=ŒW&ù™Ñ/¼‘í}Þ·¹um]½÷“ šðeùvÈ
+´Ù4h‹iâ·Ý@%zM¬,¹–”lûõ^¤µe;M/éóäðÌ…gEƒû€/tü%Óü¼\|¿Z|õ£2`)I2Á‚Õ&”¤B"¥DHVUp>ßû^¢%@ŠèÝê§C œ¦`Ph°L§#@]t;~Ó–ÃN5}Ñë¶¹
+
+çL+f4YÆ™Uû²u׺þo"œAâ5çk·öó«×ù7/~Yåѱ(9 õüˆvÚ\íÈ¥~«½54=vîšþ!•€²O¥ÒÞ¼£Xª{H+wb wvžãù2WM•[i2cQÔúó©*ߣ¸0Š«U}GŠì:eOˆÄ‘=©8&ÒÈÙoÏ©\W-Ÿ8çª5# Ewïä b¥Êä?—«³×Ô<þ†¾Ô~I-9ò.¤ ”{þá7‰nÀ¼­rèõôo´Ç£nûD7æ¤Ä)†DÚ/IO &Ù²øfÁñ°E»}Û¹ÛÏvj§—e[;Úàq5^V?ºZZÖ•‡ù°ÕåÖ™'è–ú)Iaäú}iâ'¯ÍД#e!,±p?ûB޳G摟ø %‰«¾1f8ºs¡®õN÷ã²:zå&}?å|òwF*ýÌ#Õ>ä}›[×Öåû0› QWÿ‚—î,
endstream
endobj
-1235 0 obj <<
+1614 0 obj <<
/Type /Page
-/Contents 1236 0 R
-/Resources 1234 0 R
+/Contents 1615 0 R
+/Resources 1613 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1204 0 R
-/Annots [ 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R ]
+/Parent 1584 0 R
+/Annots [ 1608 0 R 1609 0 R 1610 0 R 1611 0 R 1612 0 R ]
>> endobj
-1229 0 obj <<
+1608 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 466.552 185.517 476.821]
/Subtype /Link
/A << /S /GoTo /D (structident_a8a098c07080704af1d89e401a1b4d10f) >>
>> endobj
-1230 0 obj <<
+1609 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 452.082 159.559 462.665]
/Subtype /Link
/A << /S /GoTo /D (structident_afa1ec17df36c4bf1e36e97eab63953b9) >>
>> endobj
-1231 0 obj <<
+1610 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 437.828 185.517 448.096]
/Subtype /Link
/A << /S /GoTo /D (structident_a91db2d18476e0a527ba20e04ca2c3e74) >>
>> endobj
-1232 0 obj <<
+1611 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [138.63 423.465 185.517 433.734]
/Subtype /Link
/A << /S /GoTo /D (structident_ae29e80f6fc150f73c1790c8796bcfd9f) >>
>> endobj
-1233 0 obj <<
+1612 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [146.104 409.103 179.989 419.371]
/Subtype /Link
/A << /S /GoTo /D (structident_a8c2ccc106967f36d7191d59d4d5a65dc) >>
>> endobj
-1237 0 obj <<
-/D [1235 0 R /XYZ 70.866 789.024 null]
+1616 0 obj <<
+/D [1614 0 R /XYZ 70.866 789.024 null]
>> endobj
-482 0 obj <<
-/D [1235 0 R /XYZ 70.866 771.024 null]
+602 0 obj <<
+/D [1614 0 R /XYZ 70.866 771.024 null]
>> endobj
-734 0 obj <<
-/D [1235 0 R /XYZ 70.866 584.926 null]
+942 0 obj <<
+/D [1614 0 R /XYZ 70.866 584.926 null]
>> endobj
-486 0 obj <<
-/D [1235 0 R /XYZ 70.866 584.926 null]
+606 0 obj <<
+/D [1614 0 R /XYZ 70.866 584.926 null]
>> endobj
-1238 0 obj <<
-/D [1235 0 R /XYZ 70.866 486.68 null]
+1617 0 obj <<
+/D [1614 0 R /XYZ 70.866 486.68 null]
>> endobj
-490 0 obj <<
-/D [1235 0 R /XYZ 70.866 391.538 null]
+610 0 obj <<
+/D [1614 0 R /XYZ 70.866 391.538 null]
>> endobj
-494 0 obj <<
-/D [1235 0 R /XYZ 70.866 310.414 null]
+614 0 obj <<
+/D [1614 0 R /XYZ 70.866 310.414 null]
>> endobj
-1239 0 obj <<
-/D [1235 0 R /XYZ 70.866 284.787 null]
+1618 0 obj <<
+/D [1614 0 R /XYZ 70.866 284.787 null]
>> endobj
-498 0 obj <<
-/D [1235 0 R /XYZ 70.866 284.787 null]
+618 0 obj <<
+/D [1614 0 R /XYZ 70.866 284.787 null]
>> endobj
-1240 0 obj <<
-/D [1235 0 R /XYZ 70.866 204.903 null]
+1619 0 obj <<
+/D [1614 0 R /XYZ 70.866 204.903 null]
>> endobj
-502 0 obj <<
-/D [1235 0 R /XYZ 70.866 186.342 null]
+622 0 obj <<
+/D [1614 0 R /XYZ 70.866 186.342 null]
>> endobj
-1241 0 obj <<
-/D [1235 0 R /XYZ 70.866 68.979 null]
+1620 0 obj <<
+/D [1614 0 R /XYZ 70.866 68.979 null]
>> endobj
-1234 0 obj <<
-/Font << /F107 565 0 R /F160 682 0 R /F11 689 0 R /F46 525 0 R /F99 531 0 R >>
+1613 0 obj <<
+/Font << /F107 725 0 R /F162 890 0 R /F11 878 0 R /F46 685 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1246 0 obj <<
-/Length 723
+1631 0 obj <<
+/Length 1444
/Filter /FlateDecode
>>
stream
-xÚµ–KSÛ0Çïþ:ÚC#ô–œÞ
-…)ÓN_¹y(‰§~PÇòí»¶$ˆ!Ó&%=I¶v¥ÿîþô h‰ºŒÞ¢Ó‹T"ƒS¥8-&Ø(…tʰ¢h4GãX°äft…¸¢Øh~Ýß³|²^'¦M|^Í6…-›I“Uek½E?#
-¦ÑÇ)Á† 4+¢ñ As»BóÔ ûβ@Br,E»D޾G_#âeÌdÛm/š½C5H$A¶Ä3Ì“%„Ä?ŠÛ—Ê(Õ8Õ¢ócêOÊ 飬(#X)ÑW• g"fâlùk»¶u20ñï“BøP#ÈIfFöåÐnÅÓÓ ¡¶<”I,hŠL`%s)²åªqEžZ×nÖ ½ëe¥k/Nâ
-Â$nê„’xR¾uCkë½&Ó*¡2¾K˜Œm‡%5VPÑn¥s{M+³!çâγÒOB sjáÚÖ%÷ƒm¹Œñ
-»0{È<Ï,Î #·Qû ¢ŒÂ”òc°¢ŒÄ)Lõ*VŽ¡ÇÃÒÓÇ¥¬|Åj;Éó‡Cpñ/[F¼cQÕvŠÄ!‰ÿI‘Ü‹"J`yŠ`* gßë(:‚ž@Ѷ~8EëjSÏìXÜüš7nh^¹ö‘?`ÎuÁ©ý8;9ù÷ƒ'Ý™çDŽV6¨Ü¾$_ÊkV™¿N×ß
-k£¡
-²c¡“}͘ì[Rª§`{ƒ»®{©á¶?ä²oÀH×
+xÚÕXÛnã6}÷W苌­Þ)¹Eî¦YtÑEӬ߲A ÛŒ#T–RYNš¿ïP$eIV¼¹¸ú`ˆ–Èá™™3«
+ê™ë€ †7[dÁ—Ñ#ì`bD…š‡M°@ ±‡-A±ñ„`ŒÃ?×wûÈQ(V¼^Gå!d`¸5
+&¢Q˜.Á>Ói©7ºO¢ð^/àÄ >xãpb‰h$ºpH½£·éÉ—­Bâ$&”£˜Úëtu[Yϵ}n7€¼¥¹}ž Њã°*LJIþƒý´ÑnU2/ÆD„÷c*B]³ ÃŽ
+IàC½Ó©þŠ1ÍÓšAv‰Û8Ks'„blÅ}š%™ûhüËDˆn‘ղؾy`sÆQ´Íþ¦ÈˆCÅ1¨bD1õ&ªãJ}>WàY/É ç±R'Yöøº8ç†#náº(õóY$^Â"zduòx‹°‚T…E ʼy‰Ž
+Æm
+‘ η€9M$\ló*];ƒþ–ÎËÄœ&±¿S™þÎÖ$ì¿Wõ÷mü»Ž(@
endstream
endobj
-1245 0 obj <<
+1630 0 obj <<
/Type /Page
-/Contents 1246 0 R
-/Resources 1244 0 R
+/Contents 1631 0 R
+/Resources 1629 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1204 0 R
+/Parent 1584 0 R
+/Annots [ 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R ]
>> endobj
-1247 0 obj <<
-/D [1245 0 R /XYZ 70.866 789.024 null]
+1623 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.895 388.373 155.35 398.955]
+/Subtype /Link
+/A << /S /GoTo /D (classkmp__flag_af653ec27d16d63dab994e52ac6713aed) >>
>> endobj
-506 0 obj <<
-/D [1245 0 R /XYZ 70.866 771.024 null]
+1624 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [94.777 374.866 133.154 385.448]
+/Subtype /Link
+/A << /S /GoTo /D (group__WAIT__RELEASE_ga507a7197646f995b5529a68c1481e39b) >>
>> endobj
-1242 0 obj <<
-/D [1245 0 R /XYZ 70.866 716.891 null]
+1625 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.654 374.866 170.041 385.448]
+/Subtype /Link
+/A << /S /GoTo /D (classkmp__flag_a36961b6d49f84ab81365a9389613ea34) >>
>> endobj
-510 0 obj <<
-/D [1245 0 R /XYZ 70.866 701.65 null]
+1626 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.895 316.803 154.346 325.287]
+/Subtype /Link
+/A << /S /GoTo /D (classkmp__flag_a5d89de3bda829ab9be324007d915aa3b) >>
>> endobj
-1243 0 obj <<
-/D [1245 0 R /XYZ 70.866 641.743 null]
+1627 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [94.777 301.404 133.154 311.987]
+/Subtype /Link
+/A << /S /GoTo /D (group__WAIT__RELEASE_ga507a7197646f995b5529a68c1481e39b) >>
>> endobj
-514 0 obj <<
-/D [1245 0 R /XYZ 70.866 626.503 null]
+1628 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [133.654 301.404 138.139 311.987]
+/Subtype /Link
+/A << /S /GoTo /D (classkmp__flag_aebad8727c9520d1bb2b2219c94cb3c62) >>
>> endobj
-1244 0 obj <<
-/Font << /F95 530 0 R /F107 565 0 R /F46 525 0 R /F99 531 0 R >>
+1632 0 obj <<
+/D [1630 0 R /XYZ 70.866 789.024 null]
+>> endobj
+626 0 obj <<
+/D [1630 0 R /XYZ 70.866 771.024 null]
+>> endobj
+1621 0 obj <<
+/D [1630 0 R /XYZ 70.866 716.63 null]
+>> endobj
+630 0 obj <<
+/D [1630 0 R /XYZ 70.866 700.082 null]
+>> endobj
+1622 0 obj <<
+/D [1630 0 R /XYZ 70.866 639.914 null]
+>> endobj
+634 0 obj <<
+/D [1630 0 R /XYZ 70.866 623.367 null]
+>> endobj
+1002 0 obj <<
+/D [1630 0 R /XYZ 70.866 510.899 null]
+>> endobj
+638 0 obj <<
+/D [1630 0 R /XYZ 70.866 501.705 null]
+>> endobj
+1633 0 obj <<
+/D [1630 0 R /XYZ 70.866 407.752 null]
+>> endobj
+1634 0 obj <<
+/D [1630 0 R /XYZ 70.866 334.29 null]
+>> endobj
+642 0 obj <<
+/D [1630 0 R /XYZ 70.866 285.854 null]
+>> endobj
+1635 0 obj <<
+/D [1630 0 R /XYZ 70.866 234.071 null]
+>> endobj
+646 0 obj <<
+/D [1630 0 R /XYZ 70.866 182.333 null]
+>> endobj
+1636 0 obj <<
+/D [1630 0 R /XYZ 70.866 157.109 null]
+>> endobj
+650 0 obj <<
+/D [1630 0 R /XYZ 70.866 157.109 null]
+>> endobj
+1637 0 obj <<
+/D [1630 0 R /XYZ 70.866 68.979 null]
+>> endobj
+1629 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F46 685 0 R /F11 878 0 R /F162 890 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1299 0 obj <<
-/Length 788
+1647 0 obj <<
+/Length 1665
/Filter /FlateDecode
>>
stream
-xÚ͘]o›0†ïó+| ÒBmÁ¹¶VÝÕ´FÚÅ:Y.¸‰b˜õã×Ï¢–4HÇÇMŒœóè=¯Í±!X®fðx´°›_æÃÕìójvq‰ 0¶lH0XÝZd±Ðƒka›€U
-Å×BÖçUL#;ÐPYlîc37›L}Fx¢LTšÙŽªMÂYÖò­öÿ@×òÞ´¡i`ì»6Ba§Cõö`ЯÖDrùQœ‡ŠKoý5u¦x+ÍÞ¼´¿0ÅŠ«4‹ã¨t@“é¼öEöË´Jø,¬ýyM?º=˜Ž•¯Êu“†^{ ‘ÆLùz !–‚:µ…ý ù
+xÚíYMsÛ6½ëWpÒC¤ƒ|¤§íLZ;™¤u›Új/NFCK°Ì)E*"×ýõ]€
+I0™WñјÊhXVIUNßcÌ’ÁÃE9Uõ?fIYÖ·êF§Ö*Ÿ©Ñ‡ÉÛ€s†„d°Ÿ±&˜þïàl2ø8 ðOfÓ(BåÁl9¸ú€ƒ9|÷6ÀˆÅQpgV..Àׯ²àrðÛ
+ŠEH²&1Wiž¥¹ú`\n
+ª·°ºžŒiÄ‘Àn("œ1x¡ªÍ:/{í½xÅÖ!Îy0†+¦ÔFrkieÀµˆk&‰„Õl&u†ÌâS«hžVi‘×O%U}Õ1Õw¡åoqÓØ¥™ýNÑ݈ˆa’VÓµÊTR*ýÝ¢Úÿžø FRÄ&“830‰¶Œb–Oçjy­Ö5$§I•Ø»b¶Yª”D;ìeho¦a#Ê!êu"OF]º—«>(à^šùVã¸]’á­ hä{4AB‘4šðYú³¸íèDÿ¬˜õ1°Ã ìŽq«uú ðò)סà-Ìï|xX¤ye* ê·*ìÕ'kXÅZg'Y(·Ê±#µýjYÌSÍ5¯?_(Þ[&å˜uÝ®U27<Ɖ!ÔéÁz,›í¸S—›s¶Çë¦.új"‘¤Ý–à+±v‘m ÝŒö1Ú5ëV‡g¬ÛT¥ÅYËònuiU
+'Šê±Ú Åò8ÌØá˜?F»<ÅÊ‹|lU«uØ-Ÿš,Y±83n«¼:ZÇtÓ¤Çe˜uèÎ<"{ul–Ø2wà IJp主UöÛŸÎßM/'/'—Ó³?Î~™\ú¹\<‡µžz rSÏgG #ÙÁ"n†Ýæ½Ú©ª’43^ëWwzBKW^ÜuRн6O0ë=æý ÇûŒµ,í>%þŸO}?µÀ”eÄ-î—"èà2ä­_T¸>“ÙsÂkíúÖm—€Wë´¾¹T«ú††öŠ ·O¨8áÒEG·){gï©°ÏüºRùùöjÚÊ"ÃeIà,Ýÿuë¶€5 á/ |šÆôsz½NtY6gûö9ÿ´0ýì~a¨¼›â
endstream
endobj
-1298 0 obj <<
+1646 0 obj <<
/Type /Page
-/Contents 1299 0 R
-/Resources 1297 0 R
+/Contents 1647 0 R
+/Resources 1645 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1301 0 R
-/Annots [ 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R 1267 0 R 1268 0 R 1269 0 R 1270 0 R 1271 0 R 1272 0 R 1273 0 R 1274 0 R 1275 0 R 1276 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R 1294 0 R 1295 0 R 1296 0 R ]
+/Parent 1653 0 R
+/Annots [ 1640 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R ]
>> endobj
-1248 0 obj <<
+1640 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.079 290.082 207.394 300.35]
+/Subtype /Link
+/A << /S /GoTo /D (classstats__flags__e_a3f4cdfcd6be0d93ac771c0e37c61567f) >>
+>> endobj
+1641 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.079 263.549 186.467 272.318]
+/Subtype /Link
+/A << /S /GoTo /D (classstats__flags__e_ab89a43b134178cd06845c54ca4d80e7f) >>
+>> endobj
+1642 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.079 234.017 203.279 244.286]
+/Subtype /Link
+/A << /S /GoTo /D (classstats__flags__e_ac738a2dc47b270830803e943744f0d43) >>
+>> endobj
+1643 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.079 207.484 203.413 216.253]
+/Subtype /Link
+/A << /S /GoTo /D (classstats__flags__e_a0d979459c9a441d94294d52e0745399e) >>
+>> endobj
+1644 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.079 177.845 190.735 188.221]
+/Subtype /Link
+/A << /S /GoTo /D (classstats__flags__e_a37c8b539cc437be55817a1f122698106) >>
+>> endobj
+1648 0 obj <<
+/D [1646 0 R /XYZ 70.866 789.024 null]
+>> endobj
+654 0 obj <<
+/D [1646 0 R /XYZ 70.866 771.024 null]
+>> endobj
+658 0 obj <<
+/D [1646 0 R /XYZ 70.866 675.914 null]
+>> endobj
+1638 0 obj <<
+/D [1646 0 R /XYZ 70.866 650.919 null]
+>> endobj
+662 0 obj <<
+/D [1646 0 R /XYZ 70.866 650.919 null]
+>> endobj
+1639 0 obj <<
+/D [1646 0 R /XYZ 70.866 571.559 null]
+>> endobj
+666 0 obj <<
+/D [1646 0 R /XYZ 70.866 556.157 null]
+>> endobj
+1003 0 obj <<
+/D [1646 0 R /XYZ 70.866 427.376 null]
+>> endobj
+670 0 obj <<
+/D [1646 0 R /XYZ 70.866 418.84 null]
+>> endobj
+1649 0 obj <<
+/D [1646 0 R /XYZ 70.866 308.775 null]
+>> endobj
+1550 0 obj <<
+/D [1646 0 R /XYZ 70.866 308.775 null]
+>> endobj
+1650 0 obj <<
+/D [1646 0 R /XYZ 70.866 279.243 null]
+>> endobj
+1651 0 obj <<
+/D [1646 0 R /XYZ 70.866 251.211 null]
+>> endobj
+1652 0 obj <<
+/D [1646 0 R /XYZ 70.866 223.179 null]
+>> endobj
+1563 0 obj <<
+/D [1646 0 R /XYZ 70.866 196.752 null]
+>> endobj
+674 0 obj <<
+/D [1646 0 R /XYZ 70.866 148.627 null]
+>> endobj
+1645 0 obj <<
+/Font << /F95 690 0 R /F107 725 0 R /F11 878 0 R /F162 890 0 R /F46 685 0 R /F99 691 0 R /F174 1021 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1656 0 obj <<
+/Length 342
+/Filter /FlateDecode
+>>
+stream
+xÚ•’KSÂ0€ïý{lÄÍ;åèFFÇ½ãØ‘lË(ÿÞ´it¼xÊ&ùvóe„- ŒƒË$¸Å ‰•âl@#1JŽQ’5ÌB)¢E2®(1š»¼võj—VU4`Ú„×ûÕ1·EÖÙ¾hØà& ÞêPú]Òb˜€UÌk·7$<6ðÑ’9ɉÍ;˜Ovšx®+Ô™®ÑDIÚ¹aï;gL¶}ÌRªð-?¼TN²Š¨ Éëä/a©ïtûn*´SHb!I”«ØêmaË´¶kß<×±v•™¦ö঺©ðUC&‡BûÙ&bîK?¹-j»›3Ùå<lqÿØ\ÑÅÎ(ÖÜ4FTSÂ8í_qŽÈ;êÜ[:†õÌ󱨳ÜúÂwÙ²LÝ™Ó_Y6§þ'DÃÏÓ¶lñ»Ç_d¡‘Å
+endstream
+endobj
+1655 0 obj <<
+/Type /Page
+/Contents 1656 0 R
+/Resources 1654 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1653 0 R
+>> endobj
+1657 0 obj <<
+/D [1655 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1654 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F99 691 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1709 0 obj <<
+/Length 787
+/Filter /FlateDecode
+>>
+stream
+xÚÍ™]o›0†ïó+| ÒBŒ „ÜN[«îjZ‘vÑN– nâ…fýøõ3Hm
+NËÇMmQðyô¾ÇpŽÁ@p9ƒoG ¹å´.g_ƒÙâ†K€…¡@p–Ðò=O ®…°‚ÜW"b¦mæŸàÇÑš‹ Ǿµò<\.
+"S]x(ÿP.‘¿†bk.šãJªhÈ"5÷kSU“ëM!£Š¾9<I!""LÅŽÈMÆh”7òûÿW@WâÞÄÐH0r]¡ÐRý=XtàkL¢¹Â$-—JëÜúgª(T²Nš=´¿QI«Y^¤iRg@ ³ƒº›Öa%iÜúû ›ºu{H:Z?*Öm›Àî®aÄó”ÊpCn!D‚§ÑØ™ŠQ„ÂïBù4Ï/¦ä\žÊ§Ï‘ a]ETŒ‚ôžH~_¶OTLÉ7Áʘce“ÓFÕÛ¶ÃÁò§IÕ[fa­Ì’C½¨ôÔ’¤.™H.U½6ÂáéÀõ樣éè):¸ŽÒU›á¨±ȵ-oé×w,|h(‡ãeªÓil苎hºµ±çuŒ«îIV’ RÀkªÓÒ× “dËX4wBI£HŠ ’+NCðÖ“<KÎj‰iÌŸK‘TÉ®ºyǬ9•šj³¿¼qþºðþ¥“‹¿ êªÝ¶ó]=s•1ë+›Üî"ª ùfûÞ|9ªf¯¯ÝîžÍÕo¥‘6Ã)¬·*Ýû Wo‚yÚNV‘ˆúàNä5å¼C)Ýå¦~6¦†Ëë8¹£ñ4˜ñ)²¶æOÓøÝ‚‹–o$©¥øno&*Õ“×¹ßHõ¥ ©dµF…K]ò6a4úÓd—Ió-yàrC"–6oÂÀ´‘²4ß*EôOûWzL‡ºo8¤·ã÷`ö<ú
+endstream
+endobj
+1708 0 obj <<
+/Type /Page
+/Contents 1709 0 R
+/Resources 1707 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1653 0 R
+/Annots [ 1658 0 R 1659 0 R 1660 0 R 1661 0 R 1662 0 R 1663 0 R 1664 0 R 1665 0 R 1666 0 R 1667 0 R 1668 0 R 1669 0 R 1670 0 R 1671 0 R 1672 0 R 1673 0 R 1674 0 R 1675 0 R 1676 0 R 1677 0 R 1678 0 R 1679 0 R 1680 0 R 1681 0 R 1682 0 R 1683 0 R 1684 0 R 1685 0 R 1686 0 R 1687 0 R 1688 0 R 1689 0 R 1690 0 R 1691 0 R 1692 0 R 1693 0 R 1694 0 R 1695 0 R 1696 0 R 1697 0 R 1698 0 R 1699 0 R 1700 0 R 1701 0 R 1702 0 R 1703 0 R 1704 0 R 1705 0 R 1706 0 R ]
+>> endobj
+1658 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [158.566 640.144 170.529 650.619]
/Subtype /Link
-/A << /S /GoTo /D (page.33) >>
+/A << /S /GoTo /D (page.38) >>
>> endobj
-1249 0 obj <<
+1659 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [158.566 615.797 170.529 626.272]
/Subtype /Link
-/A << /S /GoTo /D (page.33) >>
+/A << /S /GoTo /D (page.38) >>
>> endobj
-1250 0 obj <<
+1660 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [158.566 591.45 170.529 601.924]
/Subtype /Link
-/A << /S /GoTo /D (page.33) >>
+/A << /S /GoTo /D (page.38) >>
>> endobj
-1251 0 obj <<
+1661 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [183.725 567.103 195.688 577.577]
/Subtype /Link
-/A << /S /GoTo /D (page.21) >>
+/A << /S /GoTo /D (page.24) >>
>> endobj
-1252 0 obj <<
+1662 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [170.482 543.316 182.445 553.23]
/Subtype /Link
-/A << /S /GoTo /D (page.24) >>
+/A << /S /GoTo /D (page.27) >>
>> endobj
-1253 0 obj <<
+1663 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [170.482 518.968 182.445 528.882]
/Subtype /Link
-/A << /S /GoTo /D (page.24) >>
+/A << /S /GoTo /D (page.27) >>
>> endobj
-1254 0 obj <<
+1664 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [205.19 494.061 217.153 504.329]
/Subtype /Link
-/A << /S /GoTo /D (page.37) >>
+/A << /S /GoTo /D (page.42) >>
>> endobj
-1255 0 obj <<
+1665 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 469.606 161.051 480.188]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1256 0 obj <<
+1666 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 445.258 161.051 455.841]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1257 0 obj <<
+1667 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 420.911 161.051 431.493]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1258 0 obj <<
+1668 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 396.564 161.051 407.146]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1259 0 obj <<
+1669 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 372.216 161.051 382.799]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1260 0 obj <<
+1670 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 347.869 161.051 358.451]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.32) >>
>> endobj
-1261 0 obj <<
+1671 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 323.522 161.051 334.104]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.32) >>
>> endobj
-1262 0 obj <<
+1672 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 299.174 161.051 309.757]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.32) >>
>> endobj
-1263 0 obj <<
+1673 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 274.827 161.051 285.409]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.32) >>
>> endobj
-1264 0 obj <<
+1674 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 250.48 161.051 261.062]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.32) >>
>> endobj
-1265 0 obj <<
+1675 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 226.132 161.051 236.715]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.33) >>
>> endobj
-1266 0 obj <<
+1676 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 201.785 161.051 212.367]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.33) >>
>> endobj
-1267 0 obj <<
+1677 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 177.438 161.051 188.02]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.33) >>
>> endobj
-1268 0 obj <<
+1678 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [183.725 153.198 195.688 163.673]
+/Rect [149.088 153.091 161.051 163.673]
/Subtype /Link
-/A << /S /GoTo /D (page.21) >>
+/A << /S /GoTo /D (page.33) >>
>> endobj
-1269 0 obj <<
+1679 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [158.566 128.851 170.529 139.325]
+/Rect [149.088 128.743 161.051 139.325]
/Subtype /Link
-/A << /S /GoTo /D (page.34) >>
+/A << /S /GoTo /D (page.33) >>
>> endobj
-1270 0 obj <<
+1680 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 104.396 161.051 114.978]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1271 0 obj <<
+1681 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.088 80.049 161.051 90.631]
/Subtype /Link
-/A << /S /GoTo /D (page.30) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1272 0 obj <<
+1682 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [380.841 652.21 392.804 662.793]
/Subtype /Link
-/A << /S /GoTo /D (page.30) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1273 0 obj <<
+1683 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [390.319 627.971 402.282 638.445]
+/Rect [415.478 627.971 427.441 638.445]
/Subtype /Link
-/A << /S /GoTo /D (page.34) >>
+/A << /S /GoTo /D (page.24) >>
>> endobj
-1274 0 obj <<
+1684 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [390.319 603.623 402.282 614.098]
/Subtype /Link
-/A << /S /GoTo /D (page.34) >>
+/A << /S /GoTo /D (page.39) >>
>> endobj
-1275 0 obj <<
+1685 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [395.698 579.276 407.661 589.751]
+/Rect [380.841 579.169 392.804 589.751]
/Subtype /Link
-/A << /S /GoTo /D (page.22) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1276 0 obj <<
+1686 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [380.841 554.821 392.804 565.403]
/Subtype /Link
-/A << /S /GoTo /D (page.30) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1277 0 obj <<
+1687 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [390.319 530.582 402.282 541.056]
+/Rect [380.841 530.474 392.804 541.056]
/Subtype /Link
/A << /S /GoTo /D (page.34) >>
>> endobj
-1278 0 obj <<
+1688 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 506.127 392.804 516.709]
+/Rect [390.319 506.234 402.282 516.709]
/Subtype /Link
-/A << /S /GoTo /D (page.30) >>
+/A << /S /GoTo /D (page.39) >>
>> endobj
-1279 0 obj <<
+1689 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 481.779 392.804 492.361]
+/Rect [390.319 481.887 402.282 492.361]
/Subtype /Link
-/A << /S /GoTo /D (page.30) >>
+/A << /S /GoTo /D (page.39) >>
>> endobj
-1280 0 obj <<
+1690 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 457.432 392.804 468.014]
+/Rect [395.698 457.54 407.661 468.014]
/Subtype /Link
-/A << /S /GoTo /D (page.31) >>
+/A << /S /GoTo /D (page.25) >>
>> endobj
-1281 0 obj <<
+1691 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [380.841 433.085 392.804 443.667]
/Subtype /Link
-/A << /S /GoTo /D (page.31) >>
+/A << /S /GoTo /D (page.35) >>
>> endobj
-1282 0 obj <<
+1692 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 408.737 392.804 419.32]
+/Rect [390.319 408.845 402.282 419.32]
/Subtype /Link
-/A << /S /GoTo /D (page.31) >>
+/A << /S /GoTo /D (page.39) >>
>> endobj
-1283 0 obj <<
+1693 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [395.698 384.498 407.661 394.972]
+/Rect [380.841 384.39 392.804 394.972]
/Subtype /Link
-/A << /S /GoTo /D (page.22) >>
+/A << /S /GoTo /D (page.35) >>
>> endobj
-1284 0 obj <<
+1694 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [395.698 360.15 407.661 370.625]
+/Rect [380.841 360.043 392.804 370.625]
/Subtype /Link
-/A << /S /GoTo /D (page.23) >>
+/A << /S /GoTo /D (page.35) >>
>> endobj
-1285 0 obj <<
+1695 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [402.235 336.363 414.198 346.278]
+/Rect [380.841 335.695 392.804 346.278]
/Subtype /Link
-/A << /S /GoTo /D (page.24) >>
+/A << /S /GoTo /D (page.35) >>
>> endobj
-1286 0 obj <<
+1696 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [402.235 312.016 414.198 321.93]
+/Rect [380.841 311.348 392.804 321.93]
/Subtype /Link
-/A << /S /GoTo /D (page.25) >>
+/A << /S /GoTo /D (page.36) >>
>> endobj
-1287 0 obj <<
+1697 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [402.235 287.669 414.198 297.583]
+/Rect [380.841 287.001 392.804 297.583]
/Subtype /Link
-/A << /S /GoTo /D (page.25) >>
+/A << /S /GoTo /D (page.36) >>
>> endobj
-1288 0 obj <<
+1698 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 262.653 392.804 273.236]
+/Rect [395.698 262.761 407.661 273.236]
/Subtype /Link
-/A << /S /GoTo /D (page.31) >>
+/A << /S /GoTo /D (page.25) >>
>> endobj
-1289 0 obj <<
+1699 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [414.241 238.414 426.204 248.682]
+/Rect [395.698 238.414 407.661 248.888]
/Subtype /Link
-/A << /S /GoTo /D (page.20) >>
+/A << /S /GoTo /D (page.26) >>
>> endobj
-1290 0 obj <<
+1700 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [389.602 213.959 401.564 224.335]
+/Rect [402.235 214.627 414.198 224.541]
/Subtype /Link
-/A << /S /GoTo /D (page.39) >>
+/A << /S /GoTo /D (page.27) >>
>> endobj
-1291 0 obj <<
+1701 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [389.602 189.611 401.564 199.987]
+/Rect [402.235 190.279 414.198 200.194]
/Subtype /Link
-/A << /S /GoTo /D (page.39) >>
+/A << /S /GoTo /D (page.28) >>
>> endobj
-1292 0 obj <<
+1702 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 165.264 392.804 175.846]
+/Rect [402.235 165.932 414.198 175.846]
/Subtype /Link
-/A << /S /GoTo /D (page.31) >>
+/A << /S /GoTo /D (page.28) >>
>> endobj
-1293 0 obj <<
+1703 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [395.698 141.024 407.661 151.499]
+/Rect [380.841 140.917 392.804 151.499]
/Subtype /Link
-/A << /S /GoTo /D (page.23) >>
+/A << /S /GoTo /D (page.36) >>
>> endobj
-1294 0 obj <<
+1704 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [395.698 116.677 407.661 127.152]
+/Rect [414.241 116.677 426.204 126.945]
/Subtype /Link
/A << /S /GoTo /D (page.23) >>
>> endobj
-1295 0 obj <<
+1705 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [390.319 92.33 402.282 102.804]
+/Rect [389.602 92.222 401.564 102.598]
/Subtype /Link
-/A << /S /GoTo /D (page.34) >>
+/A << /S /GoTo /D (page.49) >>
>> endobj
-1296 0 obj <<
+1706 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [390.319 67.983 402.282 78.457]
+/Rect [389.602 67.875 401.564 78.251]
/Subtype /Link
-/A << /S /GoTo /D (page.35) >>
+/A << /S /GoTo /D (page.49) >>
>> endobj
-1300 0 obj <<
-/D [1298 0 R /XYZ 70.866 789.024 null]
+1710 0 obj <<
+/D [1708 0 R /XYZ 70.866 789.024 null]
>> endobj
-1297 0 obj <<
-/Font << /F107 565 0 R /F46 525 0 R >>
+1707 0 obj <<
+/Font << /F107 725 0 R /F46 685 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1373 0 obj <<
-/Length 1157
+1776 0 obj <<
+/Length 1182
/Filter /FlateDecode
>>
stream
-xÚÍš]s›8†ïý+tif* л¤N3énÚ4qgw&é0› ,mÝ__ ä0ÆŽ?®Œ…xÏ£££#!Á@p18Þ~° `©6!?ª!À´±Jûàn¨ëÊ·ñG c¢"]ãÏ¥—ŸFçÿŠƒóñàÿâå ?Ï[–jax³ÁÝ7|~ï#€ªf[àGQstCSB/·ƒ/XeÒIA*\@9ÎÓ,öœ”&Ê 2†¿~A}'vÁ¡†4,È‘­ÚØ
-ª£P耪‘„ÿP7<ž–¾×LÃWŸ^µ§™]mM‘^x­;hǃyÜN\éC|@JT¡ô}xLtÇïÃYà%Q+Þk´íÈ`ü¼1²c›M͔ے”ùgI=­ÁºË¥¡ZC o(‹WÈòYk–ö<±jÖótê0á‚|¶•,Z![ „×áݶWÓ?›M£½Š,wo[§‚íö¬Å°jßáÝÑjëv·3Š72ªµ&¸­ŒV³V*ŽKlÓC®o3WNy\Zp™¿0•g~¹Ög]¦ÐÚ)óN‚¾rÍÙ€'ßž:;gÞ4‰Xð«8”ìš'µÆ­ˆ¦ Så6z|ʰø¬‚¨Ø$ºø„¨ÚºÎkª„È}Ÿ Êhò|Ø1yè–åňʽo¤)ò$lq…ð;h¿3ä¿GñJ)¢Kü¹d ï±AþœÓ²«kÑTNds"ÛÔ,A„L¤b ->ççQ²V•Ûàuð¢ÎMβ`&'IÁp8/Kнjy=ŠDÄÿœOŠ
-”Õ|Í}üDÈ?b
+xÚÍš]w¢8€ïý¹”s¶4 `îlk»™Ž®ÒÝ=§“Ã@ªl>v¶óë7!Øj+
+uTnCxóäýL"L
+_K~¡æN4¼!׋UDŽØŒ¹i+Q/ưF˜K¢ÄX¡QèE k MÆ#»%&ªÞ%icË@Fpš°ê…6*A¶T§.ò‘6ëv÷á–ö{4TíiCI¯Ò`œFyâ±Ý„$¬ØŸð¬$ °OQ3¯¿Öj 6T‘]9 nh­ÜÚNþDV*g¥;½«bWzTM¸TÓη¼¦}œªÞ/‹µtÊ—Ó©¤¸r³){^#˶‡$š—‹•›¡³­ØêF ½¼àýÙû|Ûo Þ’ö.£~ïüwê\ßôG‡$5WS¿ÖÃPM>/À8üÚEÛqÆÜ:Ã[‡Žž3n‡,™gÔ÷€gÖTŸˆ¬Ã§§:t¢Êû|Ür¤o
+wœœï.åÉþNÐÎdÔ›æá£hÛßÉw]ÊpNÝ<‹Z€1Éyö7ë†j¶8Gæ<I ”%~[ì%PÚiá¼äàZÉãøøŽRí%¿Æ0°ÇA"¨ Ð~]¥ÎŽ|A²W_©«’Ô›î5£4áðYqRææ³ì(!DVqêT¤Ã+©U%€P‹ïuï,¦já&o,,Þž *6‰.ÞTÀª¶®óž*!¥7\±%/‡ÄQX'A9+‹¿ZËS9¤Ë+D>`ã_Ëʰð!¡ñã:ÌØìäùÿ…ðf(¦Ê‰lNd›š%ˆ‰T¬¡Å[â©ìµÌmð>xÑg”‡Y0/Ï?ß’BÙ|O%[ŠÅhy} ãü÷4):°pE×\Çÿ‰ Gi
endstream
endobj
-1372 0 obj <<
+1775 0 obj <<
/Type /Page
-/Contents 1373 0 R
-/Resources 1371 0 R
+/Contents 1776 0 R
+/Resources 1774 0 R
/MediaBox [0 0 595.276 841.89]
-/Parent 1301 0 R
-/Annots [ 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R 1334 0 R 1335 0 R 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R 1342 0 R 1343 0 R 1344 0 R 1345 0 R 1346 0 R 1347 0 R 1348 0 R 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R 1359 0 R 1360 0 R 1361 0 R 1362 0 R 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R ]
+/Parent 1653 0 R
+/Annots [ 1711 0 R 1712 0 R 1713 0 R 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1720 0 R 1721 0 R 1722 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R 1729 0 R 1730 0 R 1731 0 R 1732 0 R 1733 0 R 1734 0 R 1735 0 R 1736 0 R 1737 0 R 1738 0 R 1739 0 R 1740 0 R 1741 0 R 1742 0 R 1743 0 R 1744 0 R 1745 0 R 1746 0 R 1747 0 R 1748 0 R 1749 0 R 1750 0 R 1751 0 R 1752 0 R 1753 0 R 1754 0 R 1755 0 R 1756 0 R 1757 0 R 1758 0 R 1759 0 R 1760 0 R 1761 0 R 1762 0 R 1763 0 R 1764 0 R 1765 0 R 1766 0 R 1767 0 R 1768 0 R 1769 0 R 1770 0 R 1771 0 R 1772 0 R 1773 0 R ]
>> endobj
-1302 0 obj <<
+1711 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [163.945 746.222 175.908 756.697]
+/Rect [149.088 746.115 161.051 756.697]
/Subtype /Link
-/A << /S /GoTo /D (page.23) >>
+/A << /S /GoTo /D (page.36) >>
>> endobj
-1303 0 obj <<
+1712 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 722.204 161.051 732.786]
+/Rect [163.945 722.312 175.908 732.786]
/Subtype /Link
-/A << /S /GoTo /D (page.32) >>
+/A << /S /GoTo /D (page.26) >>
>> endobj
-1304 0 obj <<
+1713 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.945 698.402 175.908 708.876]
+/Subtype /Link
+/A << /S /GoTo /D (page.26) >>
+>> endobj
+1714 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [205.19 698.402 217.153 708.67]
+/Rect [158.566 674.491 170.529 684.966]
+/Subtype /Link
+/A << /S /GoTo /D (page.39) >>
+>> endobj
+1715 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.566 650.581 170.529 661.055]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1716 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [163.945 626.671 175.908 637.145]
+/Subtype /Link
+/A << /S /GoTo /D (page.26) >>
+>> endobj
+1717 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.088 602.653 161.051 613.235]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+1718 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [149.088 578.742 161.051 589.324]
/Subtype /Link
/A << /S /GoTo /D (page.37) >>
>> endobj
-1305 0 obj <<
+1719 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [205.19 674.491 217.153 684.76]
+/Rect [149.088 554.832 161.051 565.414]
/Subtype /Link
-/A << /S /GoTo /D (page.38) >>
+/A << /S /GoTo /D (page.37) >>
>> endobj
-1306 0 obj <<
+1720 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [205.19 650.581 217.153 660.849]
+/Rect [149.088 530.922 161.051 541.504]
/Subtype /Link
-/A << /S /GoTo /D (page.38) >>
+/A << /S /GoTo /D (page.37) >>
>> endobj
-1307 0 obj <<
+1721 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [148.512 629.197 160.475 639.672]
+/Rect [149.088 507.011 161.051 517.593]
/Subtype /Link
-/A << /S /GoTo /D (page.11) >>
+/A << /S /GoTo /D (page.37) >>
>> endobj
-1308 0 obj <<
+1722 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [122.609 607.814 134.572 618.082]
+/Rect [205.19 483.209 217.153 493.477]
/Subtype /Link
-/A << /S /GoTo /D (page.18) >>
+/A << /S /GoTo /D (page.42) >>
>> endobj
-1309 0 obj <<
+1723 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [121.697 596.419 133.66 606.127]
+/Rect [205.19 459.298 217.153 469.566]
/Subtype /Link
-/A << /S /GoTo /D (page.19) >>
+/A << /S /GoTo /D (page.43) >>
>> endobj
-1310 0 obj <<
+1724 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [194.422 584.464 206.385 594.378]
+/Rect [205.19 435.388 217.153 445.656]
/Subtype /Link
-/A << /S /GoTo /D (page.18) >>
+/A << /S /GoTo /D (page.43) >>
>> endobj
-1311 0 obj <<
+1725 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [167.021 572.508 178.984 582.216]
+/Rect [148.512 414.004 160.475 424.479]
/Subtype /Link
-/A << /S /GoTo /D (page.18) >>
+/A << /S /GoTo /D (page.13) >>
>> endobj
-1312 0 obj <<
+1726 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [176.983 560.553 188.946 570.467]
+/Rect [122.609 392.621 134.572 402.889]
/Subtype /Link
-/A << /S /GoTo /D (page.18) >>
+/A << /S /GoTo /D (page.21) >>
>> endobj
-1313 0 obj <<
+1727 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [162.562 538.609 174.525 548.878]
+/Rect [121.697 381.226 133.66 390.934]
+/Subtype /Link
+/A << /S /GoTo /D (page.22) >>
+>> endobj
+1728 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [194.422 369.271 206.385 379.185]
+/Subtype /Link
+/A << /S /GoTo /D (page.21) >>
+>> endobj
+1729 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [167.021 357.315 178.984 367.023]
+/Subtype /Link
+/A << /S /GoTo /D (page.21) >>
+>> endobj
+1730 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [176.983 345.36 188.946 355.274]
+/Subtype /Link
+/A << /S /GoTo /D (page.21) >>
+>> endobj
+1731 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.562 323.416 174.525 333.685]
+/Subtype /Link
+/A << /S /GoTo /D (page.23) >>
+>> endobj
+1732 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [172.885 311.461 184.848 321.936]
+/Subtype /Link
+/A << /S /GoTo /D (page.23) >>
+>> endobj
+1733 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [192.001 278.122 203.964 288.597]
/Subtype /Link
/A << /S /GoTo /D (page.20) >>
>> endobj
-1314 0 obj <<
+1734 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [172.885 526.654 184.848 537.129]
+/Rect [192.001 254.212 203.964 264.686]
/Subtype /Link
/A << /S /GoTo /D (page.20) >>
>> endobj
-1315 0 obj <<
+1735 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [114.219 493.876 126.182 503.584]
+/Rect [192.001 230.302 203.964 240.776]
/Subtype /Link
-/A << /S /GoTo /D (page.41) >>
+/A << /S /GoTo /D (page.20) >>
>> endobj
-1316 0 obj <<
+1736 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [94.294 472.492 106.257 482.2]
+/Rect [192.001 206.391 203.964 216.866]
/Subtype /Link
-/A << /S /GoTo /D (page.41) >>
+/A << /S /GoTo /D (page.20) >>
>> endobj
-1317 0 obj <<
+1737 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [113.717 459.869 125.68 470.451]
+/Rect [114.219 183.041 126.182 192.749]
/Subtype /Link
-/A << /S /GoTo /D (page.41) >>
+/A << /S /GoTo /D (page.51) >>
>> endobj
-1318 0 obj <<
+1738 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [126.673 448.021 138.636 458.29]
+/Rect [131.156 149.034 143.119 159.617]
/Subtype /Link
-/A << /S /GoTo /D (page.41) >>
+/A << /S /GoTo /D (page.52) >>
>> endobj
-1319 0 obj <<
+1739 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.674 436.626 151.637 446.334]
+/Rect [131.156 125.124 143.119 135.706]
/Subtype /Link
-/A << /S /GoTo /D (page.41) >>
+/A << /S /GoTo /D (page.52) >>
>> endobj
-1320 0 obj <<
+1740 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.674 424.671 151.637 434.379]
+/Rect [94.294 104.408 106.257 114.116]
/Subtype /Link
-/A << /S /GoTo /D (page.42) >>
+/A << /S /GoTo /D (page.51) >>
>> endobj
-1321 0 obj <<
+1741 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [139.674 412.716 151.637 422.424]
+/Rect [113.717 91.785 125.68 102.367]
/Subtype /Link
-/A << /S /GoTo /D (page.42) >>
+/A << /S /GoTo /D (page.51) >>
>> endobj
-1322 0 obj <<
+1742 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [142.534 388.245 154.497 398.514]
+/Rect [126.673 79.938 138.636 90.206]
/Subtype /Link
-/A << /S /GoTo /D (page.19) >>
+/A << /S /GoTo /D (page.51) >>
>> endobj
-1323 0 obj <<
+1743 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [142.534 354.907 154.497 365.175]
+/Rect [139.674 68.543 151.637 78.251]
/Subtype /Link
-/A << /S /GoTo /D (page.18) >>
+/A << /S /GoTo /D (page.51) >>
>> endobj
-1324 0 obj <<
+1744 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [142.534 330.996 154.497 341.265]
+/Rect [371.427 758.738 383.39 768.446]
/Subtype /Link
-/A << /S /GoTo /D (page.18) >>
+/A << /S /GoTo /D (page.52) >>
>> endobj
-1325 0 obj <<
+1745 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [142.534 307.086 154.497 317.354]
+/Rect [371.427 746.783 383.39 756.491]
/Subtype /Link
-/A << /S /GoTo /D (page.18) >>
+/A << /S /GoTo /D (page.52) >>
>> endobj
-1326 0 obj <<
+1746 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 283.068 161.051 293.65]
+/Rect [374.287 722.312 386.25 732.58]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.22) >>
>> endobj
-1327 0 obj <<
+1747 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 259.158 161.051 269.74]
+/Rect [459.206 689.544 471.169 700.126]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.45) >>
>> endobj
-1328 0 obj <<
+1748 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 235.247 161.051 245.829]
+/Rect [459.206 665.633 471.169 676.216]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.45) >>
>> endobj
-1329 0 obj <<
+1749 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 211.337 161.051 221.919]
+/Rect [459.206 641.723 471.169 652.305]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.46) >>
>> endobj
-1330 0 obj <<
+1750 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 187.427 161.051 198.009]
+/Rect [374.287 617.92 386.25 628.189]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.21) >>
>> endobj
-1331 0 obj <<
+1751 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 163.516 161.051 174.098]
+/Rect [374.287 594.01 386.25 604.278]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.21) >>
>> endobj
-1332 0 obj <<
+1752 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 139.606 161.051 150.188]
+/Rect [374.287 570.1 386.25 580.368]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.21) >>
>> endobj
-1333 0 obj <<
+1753 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 115.696 161.051 126.278]
+/Rect [459.206 546.082 471.169 556.664]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.46) >>
>> endobj
-1334 0 obj <<
+1754 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 91.785 161.051 102.367]
+/Rect [459.206 522.171 471.169 532.753]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.47) >>
>> endobj
-1335 0 obj <<
+1755 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [149.088 67.875 161.051 78.457]
+/Rect [459.206 498.261 471.169 508.843]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.47) >>
>> endobj
-1336 0 obj <<
+1756 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 746.088 392.804 756.67]
+/Rect [380.841 474.351 392.804 484.933]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1337 0 obj <<
+1757 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 722.125 392.804 732.707]
+/Rect [380.841 450.44 392.804 461.022]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1338 0 obj <<
+1758 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 698.162 392.804 708.744]
+/Rect [380.841 426.53 392.804 437.112]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1339 0 obj <<
+1759 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 674.199 392.804 684.781]
+/Rect [380.841 402.62 392.804 413.202]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1340 0 obj <<
+1760 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 650.236 392.804 660.818]
+/Rect [380.841 378.709 392.804 389.291]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1341 0 obj <<
+1761 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 626.272 392.804 636.855]
+/Rect [380.841 354.799 392.804 365.381]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1342 0 obj <<
+1762 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 602.309 392.804 612.891]
+/Rect [380.841 330.889 392.804 341.471]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1343 0 obj <<
+1763 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 578.346 392.804 588.928]
+/Rect [380.841 306.978 392.804 317.56]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1344 0 obj <<
+1764 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 554.383 392.804 564.965]
+/Rect [380.841 283.068 392.804 293.65]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1345 0 obj <<
+1765 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 530.42 392.804 541.002]
+/Rect [380.841 259.158 392.804 269.74]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1346 0 obj <<
+1766 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [436.943 506.564 448.906 516.833]
+/Rect [380.841 235.247 392.804 245.829]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1347 0 obj <<
+1767 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [436.943 482.601 448.906 492.869]
+/Rect [380.841 211.337 392.804 221.919]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1348 0 obj <<
+1768 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [436.943 458.638 448.906 468.906]
+/Rect [380.841 187.427 392.804 198.009]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1349 0 obj <<
+1769 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [436.943 434.675 448.906 444.943]
+/Rect [380.841 163.516 392.804 174.098]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1350 0 obj <<
+1770 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [436.943 410.712 448.906 420.98]
+/Rect [380.841 139.606 392.804 150.188]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.31) >>
>> endobj
-1351 0 obj <<
+1771 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [436.943 386.749 448.906 397.017]
+/Rect [380.841 115.696 392.804 126.278]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1352 0 obj <<
+1772 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [395.698 362.785 407.661 373.26]
+/Rect [380.841 91.785 392.804 102.367]
/Subtype /Link
-/A << /S /GoTo /D (page.22) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1353 0 obj <<
+1773 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [375.773 340.401 387.736 350.876]
+/Rect [380.841 67.875 392.804 78.457]
/Subtype /Link
-/A << /S /GoTo /D (page.22) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1354 0 obj <<
+1777 0 obj <<
+/D [1775 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1774 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F99 691 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1874 0 obj <<
+/Length 1450
+/Filter /FlateDecode
+>>
+stream
+xÚÍZ[S£H~ϯàÑT­ØÝܧ¶¶jœ‰–3:ºw·J§(„6a%Àr×ùõÛ MB. IV_Iç;ß9}®€0€p>:5G'g†"袡ª’`> uU4‰*LW¸?ºøöyò×ø»ùEeIT4‰|5ÿ@ÑèÓÑÄý3‚ä!àòûº.êHœÅèþ;\òÙˆ’¡ /ùÊ… +L¦`¾0ý>UN²ZÃI…"(I=/"+qæV’Ú©ç ¶ýœ#4D)Â1„¢A4Ëÿ9–ÀQ¡rô<>Fš~4ÛÅÿ^0û%W£àϘ"·ç#á>_*öyÁ@WEÈë|²(Âñ›QVD
+Z—Öe
+ và–¢²Ô i4¼]Ž+·¤ÌõP{Ä3¯/hJ¾=qj7JçÄŒˆI¡ö¹ÎñÒÆÅ³§8\w×W7æiWÕæ°Æ×«ëÓõÝ7Ó:½¼þôµ Qi5È
+ì—w“`f·“éÄ´¦æGsÚ¦u‚™W>-5‡¥ã|š‡ÄÂçÃrï_g‡÷“ø@Øå–’ÎïåvÌ\ÇýP7¯’ ¨)’ @„-b¬…¤}¥•Ña®©€þ±½t ´Õ> PÁàÅŽ±›9x l€ëi.²ÔIo³¦;)j ú),ƒæÚ'éå¹ÌVÉ+%ï>TMbŽ!"-\ò¼Ìä}†/£9Ü7 Ö)c½xéÜrq”ôÄ®ßJ
+[š}êqåê¨z,'
+Ìl hQý
+endstream
+endobj
+1873 0 obj <<
+/Type /Page
+/Contents 1874 0 R
+/Resources 1872 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1653 0 R
+/Annots [ 1778 0 R 1779 0 R 1780 0 R 1781 0 R 1782 0 R 1783 0 R 1784 0 R 1785 0 R 1786 0 R 1787 0 R 1788 0 R 1789 0 R 1790 0 R 1791 0 R 1792 0 R 1793 0 R 1794 0 R 1795 0 R 1796 0 R 1797 0 R 1798 0 R 1799 0 R 1800 0 R 1801 0 R 1802 0 R 1803 0 R 1804 0 R 1805 0 R 1806 0 R 1807 0 R 1808 0 R 1809 0 R 1810 0 R 1811 0 R 1812 0 R 1813 0 R 1814 0 R 1815 0 R 1816 0 R 1817 0 R 1818 0 R 1819 0 R 1820 0 R 1821 0 R 1822 0 R 1823 0 R 1824 0 R 1825 0 R 1826 0 R 1827 0 R 1828 0 R 1829 0 R 1830 0 R 1831 0 R 1832 0 R 1833 0 R 1834 0 R 1835 0 R 1836 0 R 1837 0 R 1838 0 R 1839 0 R 1840 0 R 1841 0 R 1842 0 R 1843 0 R 1844 0 R 1845 0 R 1846 0 R 1847 0 R 1848 0 R 1849 0 R 1850 0 R 1851 0 R 1852 0 R 1853 0 R 1854 0 R 1855 0 R 1856 0 R 1857 0 R 1858 0 R 1859 0 R 1860 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1865 0 R 1866 0 R 1867 0 R 1868 0 R 1869 0 R 1870 0 R ]
+>> endobj
+1778 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [454.508 328.42 466.471 338.688]
+/Rect [149.088 746.075 161.051 756.657]
/Subtype /Link
-/A << /S /GoTo /D (page.22) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1355 0 obj <<
+1779 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [396.156 316.438 408.119 326.913]
+/Rect [149.088 722.086 161.051 732.668]
/Subtype /Link
-/A << /S /GoTo /D (page.22) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1356 0 obj <<
+1780 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [407.122 304.456 419.085 314.931]
+/Rect [107.243 698.096 119.206 708.472]
/Subtype /Link
-/A << /S /GoTo /D (page.23) >>
+/A << /S /GoTo /D (page.52) >>
>> endobj
-1357 0 obj <<
+1781 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [434.083 292.475 446.046 302.743]
+/Rect [129.175 686.102 141.137 696.478]
/Subtype /Link
-/A << /S /GoTo /D (page.23) >>
+/A << /S /GoTo /D (page.52) >>
>> endobj
-1358 0 obj <<
+1782 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [439.57 280.493 451.533 290.762]
+/Rect [106.239 674.775 118.202 684.483]
/Subtype /Link
-/A << /S /GoTo /D (page.23) >>
+/A << /S /GoTo /D (page.53) >>
>> endobj
-1359 0 obj <<
+1783 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [434.567 268.512 446.53 278.78]
+/Rect [97.273 662.78 109.236 672.488]
/Subtype /Link
-/A << /S /GoTo /D (page.23) >>
+/A << /S /GoTo /D (page.53) >>
>> endobj
-1360 0 obj <<
+1784 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [374.852 256.53 386.815 266.798]
+/Rect [137.678 650.118 149.641 660.7]
/Subtype /Link
-/A << /S /GoTo /D (page.22) >>
+/A << /S /GoTo /D (page.52) >>
>> endobj
-1361 0 obj <<
+1785 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [345.972 233.127 357.935 242.835]
+/Rect [205.19 626.236 217.153 636.504]
/Subtype /Link
/A << /S /GoTo /D (page.41) >>
>> endobj
-1362 0 obj <<
+1786 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [345.972 198.761 357.935 208.469]
+/Rect [205.19 602.247 217.153 612.515]
/Subtype /Link
/A << /S /GoTo /D (page.41) >>
>> endobj
-1363 0 obj <<
+1787 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [345.972 174.798 357.935 184.506]
+/Rect [205.19 578.257 217.153 588.526]
/Subtype /Link
-/A << /S /GoTo /D (page.42) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1364 0 obj <<
+1788 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [345.972 150.835 357.935 160.543]
+/Rect [205.19 554.268 217.153 564.536]
/Subtype /Link
-/A << /S /GoTo /D (page.42) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1365 0 obj <<
+1789 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [380.841 115.801 392.804 126.383]
+/Rect [205.19 530.279 217.153 540.547]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1366 0 obj <<
+1790 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [395.552 103.927 407.515 114.402]
+/Rect [205.19 506.29 217.153 516.558]
/Subtype /Link
-/A << /S /GoTo /D (page.21) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1367 0 obj <<
+1791 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [384.841 91.838 396.804 102.214]
+/Rect [163.945 482.3 175.908 492.775]
/Subtype /Link
-/A << /S /GoTo /D (page.21) >>
+/A << /S /GoTo /D (page.25) >>
>> endobj
-1368 0 obj <<
+1792 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [377.865 79.964 389.828 90.232]
+/Rect [131.156 447.582 143.119 458.165]
/Subtype /Link
-/A << /S /GoTo /D (page.21) >>
+/A << /S /GoTo /D (page.53) >>
>> endobj
-1369 0 obj <<
+1793 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [370.394 67.983 382.357 78.457]
+/Rect [144.02 425.075 155.983 435.549]
/Subtype /Link
-/A << /S /GoTo /D (page.33) >>
->> endobj
-1374 0 obj <<
-/D [1372 0 R /XYZ 70.866 789.024 null]
->> endobj
-1371 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F99 531 0 R >>
-/ProcSet [ /PDF /Text ]
->> endobj
-1452 0 obj <<
-/Length 997
-/Filter /FlateDecode
->>
-stream
-xÚµ™[›8Çßù~iÃÚæÞÇÕ´£VÛÝniWšVÈO‚ Óé|ûµ¹L“ÌCÌK ~çïããã{
-O“,½ªR=ªÒ媞 ÿS½ˆ–»¾ë~9!zØ~*møÊy?˜<KÈd6RêMiÖT„'9Á,‹Ý)j¨2zBmb_®CÕ,6cbŽá®Á\Ch¸sRh4 ʨìp?¼º”»–àp-îRÁΓ5Ò¬©®¼ÔÖ…PWÖ)­§'ʼF¤éœjÁ óþ¸ábÒŸ Ie ²R^¹€<RZŠ×#ë­­J(ÅHE*ÝS-JñÔHæ>ôò%–ñ­˜Ûö^¼lNñ:;N-»“e“î8³s~ØAvà9À "ï—uVĤåå²jxþ hßf)M—«~ÄžêËǽA¬µEˆ]Rë§°Kbá §%ËvÔ²ú¼%Iš[S§÷%럡1×Ðã3IJi—ºI›óË›S×è©’«¹q%RWãþb‰ ]º<'jèbÜè‰ùCE—åøçNw¼Àñœ³ñœÉ·q §Çs&׳}PzM­ §Ãf\Éúë»:ëo®hÒß §¿b8Þ!üFo¼áß­Œ¹n§·Ûøå4ÿŠ=¿ÿûwEÙÇO²¦BP$EJA(@¶ÆÆ³-y~0¼u,ÛïàñÏ-ãY1ìþ™íên‹š}I7Ü÷We·0xØw/Pvâjáâÿ•~Àp
-endstream
-endobj
-1451 0 obj <<
-/Type /Page
-/Contents 1452 0 R
-/Resources 1450 0 R
-/MediaBox [0 0 595.276 841.89]
-/Parent 1301 0 R
-/Annots [ 1370 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R 1419 0 R 1420 0 R 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R 1428 0 R 1429 0 R 1430 0 R 1431 0 R 1432 0 R 1433 0 R 1434 0 R 1435 0 R 1436 0 R 1437 0 R 1438 0 R 1439 0 R 1440 0 R 1441 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1446 0 R 1447 0 R 1448 0 R 1449 0 R ]
+/A << /S /GoTo /D (page.25) >>
>> endobj
-1370 0 obj <<
+1794 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [157.194 758.177 169.157 768.446]
+/Rect [222.755 413.08 234.718 423.348]
/Subtype /Link
-/A << /S /GoTo /D (page.33) >>
+/A << /S /GoTo /D (page.25) >>
>> endobj
-1375 0 obj <<
+1795 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [189.58 746.213 201.543 756.482]
+/Rect [164.403 401.085 176.366 411.56]
/Subtype /Link
-/A << /S /GoTo /D (page.33) >>
+/A << /S /GoTo /D (page.25) >>
>> endobj
-1376 0 obj <<
+1796 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [220.209 734.25 232.172 744.518]
+/Rect [175.369 389.091 187.332 399.565]
/Subtype /Link
-/A << /S /GoTo /D (page.33) >>
+/A << /S /GoTo /D (page.26) >>
>> endobj
-1377 0 obj <<
+1797 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [209.521 722.286 221.484 732.554]
+/Rect [202.33 377.096 214.293 387.364]
/Subtype /Link
-/A << /S /GoTo /D (page.34) >>
+/A << /S /GoTo /D (page.26) >>
>> endobj
-1378 0 obj <<
+1798 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [178.507 710.322 190.47 720.59]
+/Rect [207.817 365.101 219.78 375.37]
/Subtype /Link
-/A << /S /GoTo /D (page.34) >>
+/A << /S /GoTo /D (page.26) >>
>> endobj
-1379 0 obj <<
+1799 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [209.136 698.358 221.099 708.626]
+/Rect [202.814 353.107 214.777 363.375]
/Subtype /Link
-/A << /S /GoTo /D (page.34) >>
+/A << /S /GoTo /D (page.26) >>
>> endobj
-1380 0 obj <<
+1800 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [150.093 686.394 162.056 696.869]
+/Rect [143.099 341.112 155.062 351.38]
/Subtype /Link
-/A << /S /GoTo /D (page.34) >>
+/A << /S /GoTo /D (page.25) >>
>> endobj
-1381 0 obj <<
+1801 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [158.566 674.43 170.529 684.698]
+/Rect [114.219 317.683 126.182 327.391]
/Subtype /Link
-/A << /S /GoTo /D (page.34) >>
+/A << /S /GoTo /D (page.51) >>
>> endobj
-1382 0 obj <<
+1802 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [189.195 662.466 201.158 672.734]
+/Rect [114.219 283.073 126.182 292.781]
/Subtype /Link
-/A << /S /GoTo /D (page.35) >>
+/A << /S /GoTo /D (page.51) >>
>> endobj
-1383 0 obj <<
+1803 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [137.923 640.286 149.886 650.662]
+/Rect [114.219 259.084 126.182 268.792]
/Subtype /Link
-/A << /S /GoTo /D (page.39) >>
+/A << /S /GoTo /D (page.52) >>
>> endobj
-1384 0 obj <<
+1804 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [215.376 628.43 227.339 638.698]
+/Rect [114.219 235.094 126.182 244.802]
/Subtype /Link
-/A << /S /GoTo /D (page.39) >>
+/A << /S /GoTo /D (page.52) >>
>> endobj
-1385 0 obj <<
+1805 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [193.812 616.466 205.775 626.735]
+/Rect [149.088 199.816 161.051 210.398]
/Subtype /Link
-/A << /S /GoTo /D (page.39) >>
+/A << /S /GoTo /D (page.30) >>
>> endobj
-1386 0 obj <<
+1806 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [150.557 605.063 162.519 614.977]
+/Rect [163.799 187.929 175.762 198.404]
/Subtype /Link
/A << /S /GoTo /D (page.24) >>
>> endobj
-1387 0 obj <<
+1807 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [213.305 592.538 225.268 602.807]
+/Rect [153.088 175.827 165.051 186.203]
/Subtype /Link
/A << /S /GoTo /D (page.24) >>
>> endobj
-1388 0 obj <<
+1808 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [208.822 580.575 220.785 590.843]
+/Rect [146.112 163.94 158.075 174.208]
/Subtype /Link
/A << /S /GoTo /D (page.24) >>
>> endobj
-1389 0 obj <<
+1809 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [212.3 568.503 224.263 578.879]
+/Rect [207.528 151.838 219.491 162.42]
/Subtype /Link
-/A << /S /GoTo /D (page.24) >>
+/A << /S /GoTo /D (page.44) >>
>> endobj
-1390 0 obj <<
+1810 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [207.817 556.539 219.78 566.915]
+/Rect [186.451 140.511 198.414 150.425]
/Subtype /Link
-/A << /S /GoTo /D (page.25) >>
+/A << /S /GoTo /D (page.45) >>
>> endobj
-1391 0 obj <<
+1811 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [171.926 544.683 183.889 554.951]
+/Rect [185.456 128.516 197.419 138.43]
/Subtype /Link
-/A << /S /GoTo /D (page.25) >>
+/A << /S /GoTo /D (page.45) >>
>> endobj
-1392 0 obj <<
+1812 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [185.264 532.719 197.227 542.987]
+/Rect [182.972 116.522 194.935 126.436]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.47) >>
>> endobj
-1393 0 obj <<
+1813 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [176.642 520.755 188.605 531.023]
+/Rect [175.996 104.527 187.959 114.441]
/Subtype /Link
-/A << /S /GoTo /D (page.37) >>
+/A << /S /GoTo /D (page.47) >>
>> endobj
-1394 0 obj <<
+1814 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [217.286 508.791 229.249 519.059]
+/Rect [127.684 91.864 139.647 102.446]
/Subtype /Link
-/A << /S /GoTo /D (page.37) >>
+/A << /S /GoTo /D (page.53) >>
>> endobj
-1395 0 obj <<
+1815 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [218.272 496.72 230.235 507.096]
+/Rect [138.641 79.977 150.604 90.452]
/Subtype /Link
/A << /S /GoTo /D (page.38) >>
>> endobj
-1396 0 obj <<
+1816 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [236.984 484.756 248.947 495.132]
+/Rect [157.194 67.983 169.157 78.251]
/Subtype /Link
/A << /S /GoTo /D (page.38) >>
>> endobj
-1397 0 obj <<
+1817 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [140.616 472.899 152.579 483.168]
+/Rect [421.333 758.177 433.296 768.446]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.38) >>
>> endobj
-1398 0 obj <<
+1818 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [159.328 460.936 171.291 471.204]
+/Rect [451.962 746.196 463.925 756.464]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.38) >>
>> endobj
-1399 0 obj <<
+1819 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [136.133 448.972 148.095 459.24]
+/Rect [441.274 734.214 453.237 744.483]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.39) >>
>> endobj
-1400 0 obj <<
+1820 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [154.845 437.008 166.808 447.276]
+/Rect [410.26 722.233 422.223 732.501]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.39) >>
>> endobj
-1401 0 obj <<
+1821 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [136.635 425.044 148.598 435.312]
+/Rect [440.889 710.251 452.852 720.519]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.39) >>
>> endobj
-1402 0 obj <<
+1822 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [155.347 413.08 167.31 423.348]
+/Rect [381.846 698.27 393.809 708.744]
/Subtype /Link
-/A << /S /GoTo /D (page.36) >>
+/A << /S /GoTo /D (page.39) >>
>> endobj
-1403 0 obj <<
+1823 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [129.163 390.9 141.126 401.482]
+/Rect [390.319 686.288 402.282 696.556]
/Subtype /Link
-/A << /S /GoTo /D (page.26) >>
+/A << /S /GoTo /D (page.39) >>
>> endobj
-1404 0 obj <<
+1824 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [420.948 674.306 432.911 684.575]
+/Subtype /Link
+/A << /S /GoTo /D (page.40) >>
+>> endobj
+1825 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [362.909 639.833 374.872 650.415]
+/Subtype /Link
+/A << /S /GoTo /D (page.53) >>
+>> endobj
+1826 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [369.676 627.851 381.639 638.227]
+/Subtype /Link
+/A << /S /GoTo /D (page.49) >>
+>> endobj
+1827 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [447.129 615.977 459.092 626.246]
+/Subtype /Link
+/A << /S /GoTo /D (page.49) >>
+>> endobj
+1828 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [425.565 603.996 437.528 614.264]
+/Subtype /Link
+/A << /S /GoTo /D (page.49) >>
+>> endobj
+1829 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [156.692 379.044 168.655 389.312]
+/Rect [382.31 592.575 394.272 602.489]
/Subtype /Link
/A << /S /GoTo /D (page.27) >>
>> endobj
-1405 0 obj <<
+1830 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [190.961 367.08 202.924 377.555]
+/Rect [445.058 580.033 457.021 590.301]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.27) >>
>> endobj
-1406 0 obj <<
+1831 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [195.946 355.116 207.909 365.591]
+/Rect [440.575 568.051 452.537 578.319]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.27) >>
>> endobj
-1407 0 obj <<
+1832 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [190.961 343.152 202.924 353.627]
+/Rect [444.053 555.962 456.016 566.338]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.27) >>
>> endobj
-1408 0 obj <<
+1833 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [195.946 331.188 207.909 341.663]
+/Rect [439.57 543.98 451.533 554.356]
/Subtype /Link
/A << /S /GoTo /D (page.28) >>
>> endobj
-1409 0 obj <<
+1834 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [190.961 319.224 202.924 329.493]
+/Rect [403.679 532.106 415.642 542.375]
/Subtype /Link
/A << /S /GoTo /D (page.28) >>
>> endobj
-1410 0 obj <<
+1835 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [195.946 307.261 207.909 317.529]
+/Rect [417.017 520.125 428.98 530.393]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1411 0 obj <<
+1836 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [190.961 295.297 202.924 305.565]
+/Rect [408.395 508.143 420.358 518.411]
/Subtype /Link
-/A << /S /GoTo /D (page.28) >>
+/A << /S /GoTo /D (page.42) >>
>> endobj
-1412 0 obj <<
+1837 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [195.946 283.333 207.909 293.601]
+/Rect [449.039 496.162 461.002 506.43]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.42) >>
>> endobj
-1413 0 obj <<
+1838 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [196.179 271.369 208.142 281.637]
+/Rect [450.025 484.072 461.988 494.448]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.43) >>
>> endobj
-1414 0 obj <<
+1839 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [201.165 259.405 213.127 269.673]
+/Rect [468.737 472.091 480.7 482.467]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.43) >>
>> endobj
-1415 0 obj <<
+1840 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [196.179 247.441 208.142 257.709]
+/Rect [372.369 460.217 384.332 470.485]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1416 0 obj <<
+1841 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [201.165 235.477 213.127 245.745]
+/Rect [391.081 448.235 403.044 458.504]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1417 0 obj <<
+1842 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [176.633 223.513 188.596 233.782]
+/Rect [367.886 436.254 379.848 446.522]
/Subtype /Link
-/A << /S /GoTo /D (page.29) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1418 0 obj <<
+1843 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [178.498 211.549 190.461 221.818]
+/Rect [386.598 424.272 398.561 434.54]
/Subtype /Link
-/A << /S /GoTo /D (page.30) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1419 0 obj <<
+1844 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [181.995 199.585 193.958 209.854]
+/Rect [368.388 412.291 380.351 422.559]
/Subtype /Link
-/A << /S /GoTo /D (page.30) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1420 0 obj <<
+1845 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [174.517 187.514 186.48 197.89]
+/Rect [387.1 400.309 399.063 410.577]
/Subtype /Link
-/A << /S /GoTo /D (page.30) >>
+/A << /S /GoTo /D (page.41) >>
>> endobj
-1421 0 obj <<
+1846 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [183.707 175.658 195.67 186.132]
+/Rect [391.132 378.485 403.095 388.399]
/Subtype /Link
-/A << /S /GoTo /D (page.30) >>
+/A << /S /GoTo /D (page.50) >>
>> endobj
-1422 0 obj <<
+1847 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [193.678 163.694 205.64 174.168]
+/Rect [350.957 343.451 362.92 354.033]
/Subtype /Link
-/A << /S /GoTo /D (page.30) >>
+/A << /S /GoTo /D (page.20) >>
>> endobj
-1423 0 obj <<
+1848 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [350.957 331.47 362.92 342.052]
+/Subtype /Link
+/A << /S /GoTo /D (page.20) >>
+>> endobj
+1849 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [373.382 319.488 385.345 330.07]
+/Subtype /Link
+/A << /S /GoTo /D (page.20) >>
+>> endobj
+1850 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [403.829 307.614 415.791 318.089]
+/Subtype /Link
+/A << /S /GoTo /D (page.20) >>
+>> endobj
+1851 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [362.918 295.525 374.881 306.107]
+/Subtype /Link
+/A << /S /GoTo /D (page.20) >>
+>> endobj
+1852 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [360.916 283.543 372.879 294.125]
+/Subtype /Link
+/A << /S /GoTo /D (page.29) >>
+>> endobj
+1853 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [198.663 151.73 210.626 162.204]
+/Rect [388.445 271.669 400.408 281.938]
/Subtype /Link
/A << /S /GoTo /D (page.31) >>
>> endobj
-1424 0 obj <<
+1854 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [193.678 139.766 205.64 150.241]
+/Rect [422.714 259.688 434.677 270.162]
/Subtype /Link
/A << /S /GoTo /D (page.31) >>
>> endobj
-1425 0 obj <<
+1855 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [198.663 127.802 210.626 138.277]
+/Rect [427.699 247.706 439.662 258.181]
/Subtype /Link
/A << /S /GoTo /D (page.31) >>
>> endobj
-1426 0 obj <<
+1856 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [158.557 115.838 170.52 126.106]
+/Rect [422.714 235.725 434.677 246.199]
/Subtype /Link
/A << /S /GoTo /D (page.31) >>
>> endobj
-1427 0 obj <<
+1857 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [162.054 103.874 174.017 114.143]
+/Rect [427.699 223.743 439.662 234.218]
/Subtype /Link
/A << /S /GoTo /D (page.31) >>
>> endobj
-1428 0 obj <<
+1858 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [154.576 91.803 166.539 102.179]
+/Rect [422.714 211.761 434.677 222.03]
/Subtype /Link
/A << /S /GoTo /D (page.32) >>
>> endobj
-1429 0 obj <<
+1859 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [178.946 79.946 190.909 90.215]
+/Rect [427.699 199.78 439.662 210.048]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.32) >>
>> endobj
-1430 0 obj <<
+1860 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [217.644 67.983 229.607 78.251]
+/Rect [422.714 187.798 434.677 198.067]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.32) >>
>> endobj
-1431 0 obj <<
+1861 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [383.343 758.177 395.306 768.446]
+/Rect [427.699 175.817 439.662 186.085]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.32) >>
>> endobj
-1432 0 obj <<
+1862 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [431.51 746.115 443.473 756.491]
+/Rect [427.932 163.835 439.895 174.103]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.32) >>
>> endobj
-1433 0 obj <<
+1863 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [387.091 734.267 399.054 744.535]
+/Rect [432.918 151.854 444.88 162.122]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.33) >>
>> endobj
-1434 0 obj <<
+1864 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [401.285 722.312 413.248 732.58]
+/Rect [427.932 139.872 439.895 150.14]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.33) >>
>> endobj
-1435 0 obj <<
+1865 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [404.763 710.357 416.726 720.625]
+/Rect [432.918 127.89 444.88 138.159]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.33) >>
>> endobj
-1436 0 obj <<
+1866 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [386.822 698.402 398.785 708.67]
+/Rect [441.65 115.909 453.613 126.177]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.33) >>
>> endobj
-1437 0 obj <<
+1867 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [388.822 686.446 400.785 696.715]
+/Rect [444.367 103.927 456.33 114.402]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.33) >>
>> endobj
-1438 0 obj <<
+1868 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [383.845 674.491 395.808 684.76]
+/Rect [449.352 91.946 461.315 102.42]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1439 0 obj <<
+1869 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [387.593 662.536 399.556 672.804]
+/Rect [444.367 79.964 456.33 90.439]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1440 0 obj <<
+1870 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [387.324 650.581 399.287 660.849]
+/Rect [449.352 67.983 461.315 78.457]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1441 0 obj <<
+1875 0 obj <<
+/D [1873 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1872 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F11 878 0 R /F99 691 0 R >>
+/ProcSet [ /PDF /Text ]
+>> endobj
+1914 0 obj <<
+/Length 623
+/Filter /FlateDecode
+>>
+stream
+xÚµ—]o›0†ïù¾iñlƒ ôrjµÚg›‹Ii…(8)*FŒºüûÙ@¶dÝ„CÈMlìãÇ/çÇÖ
+…ÜVü8ÎÿÚ•ÔWUÅ1EÅ®ÀaøÌÓÅa†ž§,!c}Øç\ð:–<uZ¥èÚë:ë:÷¼ê:„õ-Â^×Ãì‚Ð ÏïžV: ˺{¸’ç„ök¾T\|úª_])
+•¢Ðw­ûï
++õýíöVûº©²!;›»FȬàøcöTÇúŽEö¶ioÚ¾Yê#÷s»n ¸8ð½òñ/l–k¥
+endstream
+endobj
+1913 0 obj <<
+/Type /Page
+/Contents 1914 0 R
+/Resources 1912 0 R
+/MediaBox [0 0 595.276 841.89]
+/Parent 1653 0 R
+/Annots [ 1871 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R 1893 0 R 1894 0 R 1895 0 R 1896 0 R 1897 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R 1906 0 R 1907 0 R 1908 0 R 1909 0 R 1910 0 R 1911 0 R ]
+>> endobj
+1871 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [389.324 638.626 401.287 648.894]
+/Rect [176.633 758.177 188.596 768.446]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1442 0 obj <<
+1876 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [384.841 626.671 396.804 636.939]
+/Rect [178.498 746.222 190.461 756.491]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1443 0 obj <<
+1877 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [394.04 614.715 406.003 625.19]
+/Rect [181.995 734.267 193.958 744.535]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.34) >>
>> endobj
-1444 0 obj <<
+1878 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [433.007 602.653 444.97 613.029]
+/Rect [174.517 722.204 186.48 732.58]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.35) >>
>> endobj
-1445 0 obj <<
+1879 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [388.589 590.805 400.552 601.073]
+/Rect [183.707 710.357 195.67 720.831]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.35) >>
>> endobj
-1446 0 obj <<
+1880 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [388.32 578.85 400.282 589.118]
+/Rect [193.678 698.402 205.64 708.876]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.35) >>
>> endobj
-1447 0 obj <<
+1881 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [412.241 566.895 424.204 577.163]
+/Rect [198.663 686.446 210.626 696.921]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.35) >>
>> endobj
-1448 0 obj <<
+1882 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [390.319 554.94 402.282 565.208]
+/Rect [193.678 674.491 205.64 684.966]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.36) >>
>> endobj
-1449 0 obj <<
+1883 0 obj <<
/Type /Annot
/Border[0 0 0]/H/I/C[1 0 0]
-/Rect [372.387 542.984 384.349 553.253]
+/Rect [198.663 662.536 210.626 673.011]
/Subtype /Link
-/A << /S /GoTo /D (page.27) >>
+/A << /S /GoTo /D (page.36) >>
>> endobj
-1453 0 obj <<
-/D [1451 0 R /XYZ 70.866 789.024 null]
+1884 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.557 650.581 170.52 660.849]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
>> endobj
-1450 0 obj <<
-/Font << /F95 530 0 R /F46 525 0 R /F99 531 0 R >>
+1885 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.054 638.626 174.017 648.894]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+1886 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [154.576 626.563 166.539 636.939]
+/Subtype /Link
+/A << /S /GoTo /D (page.36) >>
+>> endobj
+1887 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.415 614.715 215.378 624.984]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+1888 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.4 602.76 220.363 613.029]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+1889 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [203.415 590.805 215.378 601.073]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+1890 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [208.4 578.85 220.363 589.118]
+/Subtype /Link
+/A << /S /GoTo /D (page.37) >>
+>> endobj
+1891 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [178.946 566.895 190.909 577.163]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1892 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [217.644 554.94 229.607 565.208]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1893 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [151.59 542.984 163.553 553.253]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1894 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [199.757 530.922 211.72 541.297]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1895 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.338 519.074 167.301 529.342]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1896 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [169.532 507.119 181.495 517.387]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1897 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [173.011 495.164 184.973 505.432]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1898 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.069 483.209 167.032 493.477]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1899 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.069 471.253 169.032 481.522]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1900 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [152.092 459.298 164.055 469.566]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1901 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.84 447.343 167.803 457.611]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1902 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [155.571 435.388 167.534 445.656]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1903 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [157.571 423.433 169.534 433.701]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1904 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [153.088 411.478 165.051 421.746]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1905 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [162.287 399.522 174.25 409.997]
+/Subtype /Link
+/A << /S /GoTo /D (page.31) >>
+>> endobj
+1906 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [201.254 387.46 213.217 397.835]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1907 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.836 375.612 168.799 385.88]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1908 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [156.567 363.657 168.53 373.925]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1909 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [180.488 351.702 192.451 361.97]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1910 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [158.566 339.747 170.529 350.015]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1911 0 obj <<
+/Type /Annot
+/Border[0 0 0]/H/I/C[1 0 0]
+/Rect [140.634 327.791 152.596 338.06]
+/Subtype /Link
+/A << /S /GoTo /D (page.30) >>
+>> endobj
+1915 0 obj <<
+/D [1913 0 R /XYZ 70.866 789.024 null]
+>> endobj
+1912 0 obj <<
+/Font << /F95 690 0 R /F46 685 0 R /F99 691 0 R >>
/ProcSet [ /PDF /Text ]
>> endobj
-1455 0 obj
-[556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778]
+1526 0 obj
+[681 0 R /Fit]
endobj
-1456 0 obj
+1917 0 obj
[501 137 273 501 228 273 273 0 273 479 0 501 410 273 228 0 0 0 0 0 0 0 0 0 0 0 0 273 195 228 273 389 456 456 729 592 228 273 273 319 479 228 273 228 228 456 456 456 456 456 456 456 456 456 456 273 273 479 479 479 501 800 592 592 592 592 547 501 638 592 228 456 592 501 683 592 638 547 638 592 547 501 592 547 774 547 547 501 273 228 273 479 456 228 456 501 456 501 456 273 501 501 228 228 456 228 729 501 501 501 501 319 456 273 501 456 638 456 456 410]
endobj
-1457 0 obj
-[500 167 333 556 222 333 333 0 333 584 0 611 500 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 191 278 278 355 556 556 889 667 222 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500]
+1918 0 obj
+[611 167 333 611 278 333 333 0 333 584 0 611 500 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 238 278 333 474 556 556 889 722 278 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778]
endobj
-1458 0 obj
-[777.8 500 777.8]
+1919 0 obj
+[500 500 167 333 556 222 333 333 0 333 584 0 611 500 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 191 278 278 355 556 556 889 667 222 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500]
endobj
-1459 0 obj
+1920 0 obj
[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600]
endobj
-1460 0 obj
+1921 0 obj
+[777.8 500 777.8]
+endobj
+1922 0 obj
[501 501 137 273 501 228 273 273 0 273 479 0 501 410 273 228 0 0 0 0 0 0 0 0 0 0 0 0 273 195 228 273 389 456 456 729 592 228 273 273 319 479 228 273 228 228 456 456 456 456 456 456 456 456 456 456 273 273 479 479 479 501 800 592 592 592 592 547 501 638 592 228 456 592 501 683 592 638 547 638 592 547 501 592 547 774 547 547 501 273 228 273 479 456 228 456 501 456 501 456 273 501 501 228 228 456 228 729 501 501 501 501 319 456 273 501 456 638 456 456 410 319 230 319 479 0 0 0 228 456 410 820 456 456 273 820 547 273 820 0 0 0 0 0 0 410 410 287 456 820 273 820 456 273 774 0 0 547 0 273 456 456 456 456 230 456 273 604 303 456 479 273 604]
endobj
-1461 0 obj
-[500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.8 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8]
+1923 0 obj
+[500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.8 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500]
endobj
-1462 0 obj
-[333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 0 0 0 278 556 500 1000 556 556 333 1000 667 333 1000 0 0 0 0 0 0 500 500 350 556 1000 333 1000 556 333 944 0 0 667 0 333 556 556 556 556 280 556 333 737 370 556 584 333 737]
+1924 0 obj
+[611 167 333 611 278 333 333 0 333 584 0 611 500 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 238 278 333 474 556 556 889 722 278 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 333 333 584 584 584 611 975 722 722 722 722 667 611 778 722 278 556 722 611 833 722 778 667 778 722 667 611 722 667 944 667 667 611 333 278 333 584 556 278 556 611 556 611 556 333 611 611 278 278 556 278 889 611 611 611 611 389 556 333 611 556 778 556 556 500 389 280 389 584 0 0 0 278 556 500 1000 556 556 333 1000 667 333 1000 0 0 0 0 0 0 500 500 350 556 1000 333 1000 556 333 944 0 0 667 0 333 556 556 556 556 280 556 333 737 370 556 584 333 737]
endobj
-1463 0 obj
+1925 0 obj
[500 500 167 333 556 222 333 333 0 333 584 0 611 500 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 191 278 278 355 556 556 889 667 222 333 333 389 584 278 333 278 278 556 556 556 556 556 556 556 556 556 556 278 278 584 584 584 556 1015 667 667 722 722 667 611 778 722 278 500 667 556 833 722 778 667 778 722 667 611 722 667 944 667 667 611 278 278 278 469 556 222 556 556 500 556 556 278 556 556 222 222 500 222 833 556 556 556 556 333 500 278 556 500 722 500 500 500 334 260 334 584 0 0 0 222 556 333 1000 556 556 333 1000 667 333 1000 0 0 0 0 0 0 333 333 350 556 1000 333 1000 500 333 944 0 0 667 0 333 556 556 556 556 260 556 333 737 370 556 584 333 737]
endobj
-1464 0 obj <<
+1926 0 obj <<
/Length1 771
/Length2 1151
/Length3 0
@@ -6935,7 +9180,7 @@ xÚ­RkTבª¡¬òRIÕzX%róÔ
WS©_ æ¥uc†u¥ƒ}Çv]Ίù¸ÀzÏGáY*.yc¯¨j·/K<º5ªëÍ{/U;ªÐ†â¥Ñùª¶;É[WËêNîqÚÉ9¬É.îš[Ð<ká®-¿z<Y–)¯øvCÐ~~¦â¼„×<çGïÅEJÎ95T$®>”z_Ü‘ý"ø§ ÃF—<=g),x9¨é=ë_^,¾Ú)ºÝº—VÛ¥mª.-Ø+›[ã¶ñƒp—#íW…×]÷´·ó¾h§.#^½I8½Üã{cJ'¬Ûü8¼eM„mÁœ×ö6ºµ3óòD¥!]7wh’:n”åý†ÆÈ¨mUæpbòXAm³ðŇY>¹ÿå)Õü±‹â–¤ë=_®ÛÅeKbÑ“ŠJbU7ožmÓ³¬¨#ùUÔÚþÿÍé'»
endstream
endobj
-1465 0 obj <<
+1927 0 obj <<
/Type /FontDescriptor
/FontName /SYFPBV+CMMI10
/Flags 4
@@ -6947,30 +9192,29 @@ endobj
/StemV 72
/XHeight 431
/CharSet (/greater/less)
-/FontFile 1464 0 R
+/FontFile 1926 0 R
>> endobj
-1466 0 obj <<
-/Length1 795
-/Length2 907
+1928 0 obj <<
+/Length1 818
+/Length2 998
/Length3 0
-/Length 1454
+/Length 1559
/Filter /FlateDecode
>>
stream
-xÚ­’yPgÆñD¢í( ˆŠ|J¹’,RâQC
- u@”Ê!:£) „i˜"§hP¦ ]°Ö)þÛÙö}Ÿçû¾ß÷¼ŸùOo[¶
-)ðB¤‰¨”/ÁˆÅ(´)"wLˆæÇ¶@þIŠD) Ö“–€Dà˜X ˆBãáäYIò@ÍÜÜM.ó`ÉÔöÓ)}¡ÃT¬üÇKÂå2„
-Dà‰Êø!@‹¥ÈtÁ3QÈø¦Ah»9.\žõ?s=a“ù(Ã@ÿìž®¡Ï5™*@
-€(HbÃeä@F„8A™«= ÁR2*TFN%dJœîCtG@ †‰N€&ÆESsƒÉOµ¿¼µ³3®ˆ²µs¶NŽ$9&“ó#_N&›~XdvŸj!Jæ
-„OÑ4ãü ‡BO—þ%ÖUUeMoüAaŸF·Ê¯<ö *ˆñfœß¹F$ËïÏë,I¿kÖ°|Ã)â†q/5hägƒ‚’”Ü‹~Çâ•ÔVo#ebJæWï­-úÝïFìÎ:›Ô¹’UItå5³ÑŒ˜Å=Xt^Ðë¼Guçm{óB}+¯VkW05—uµ³–)µ=¦Ãåq§k6ñ‡µíp÷4’º¥X47/ ÇžS…‘ Ö;_°«›z;÷/L,öH­ P šY›lþç=єؕQ-¿…ë==2–7í¡G©4qVkëïªé¤eÄo½c²cÕƒ.û¿V<°æeŠèíö³‹_”×…>ßu½JþЫ»âB컋pØÙ²“&.ƒ".ÝÚôv—QZ u{i–ÿ«ü[w6ßZ
-|פádŒÿ¤Ç{8?ÅŽ+/Ë,I u¿txØ\¿5¿+^¢³Èø\ôÎÀ2Jšìö~~ZuwûêpèÀÕKÛÙL®÷_.Í=Ã+Œk[Px[êè\Sf5G®¯¢åôó˜Rî¾Àcò§®•XH5CÙï’Ô¦¯µ×¼ÒöW$ÎÊÊÈ?ÞQ5ääk,oú·ÖÚ¿^7PÇJÈæÌ?W1;:¥cÝe„Þp)‚-êDcÆf“ªAéöªÇ‹m
-ua±zÊÒnl|‹“ïªè¹x±VZ°1\Ÿqïx§6·­]âÚWê –Û”ú8hš/ìx‰Eà‹ª‘Ý''!ÚuÍÜûµÙȤ_ä¾ GF¥ Ï+f4«¿Nôê-Y]£ûæUÓÄÿDó{u¿jߣfªýaqå‰Êïï1{˜9:ÏŽÖV” žÈt¿É2Žø6³(JàWE5yãh·:kH»7l±¹—4ô¬[çø,ÊjœÕGÔŽ§Ø¿°«yÃü}nú‹PüLP™,,Þ«¿c#«1³¾øhÉëYFÕ߈Ô´ð«kv¤wYôÜïir}
-ª-zâÆÞ¢,ÞîÓüãêËÍfªüR¯F;ò®ÇJÛÙP ²k®OH'‚ª,[­.x4ø1«+Ô‡Ùœ—)!~Yjš­¡ÖTk§ÚwSWEt÷xyââÙœ%ÉØ÷ÑŽô‚oT{[#}O­í…®eo<¸)cYjP<j°Æ"@í›ÍáÅf+ÅlS…Ï6½'›“úö¼ y©öœ]G+Œ(\žý7GËj
+xÚ­’yPgÆÕD‚¢b•ËÈ”ÑH²H`‚õ€(ŠšD¤Z—ì&Y »°Y$Ax¡(Å^(*V¼Eè` Š*PPŒ@”p‚x÷ØnPk‹ÿvöŸ}Ÿ÷ùÞï7Ïû9;øK\½"õ%pÊâ@^@(’„B<
+õ@
+\!woÿSSùbjñÇ(©È`¥
+ÔQŠBÇ7Â .X"aÞë`ÓÆpj™&
+¼¯îÁúZÓ)‘˜„ñ8<DéïËßÊ!—ÍÇ¥‚áràÆ÷
+csP‡h^n8,P)aÕ¿dž‡Q&ÿ$äÆuÂtFùÛ0||õ:W7pxÐpä<=ùÚÿ¥1$‰âÔà{£#ýRË0z (ªF¥ŒF=!™¸&ãòÖ“ñósj5áš½­<ÝÝhZRC´þá
+Ë%®­ç††.K_ao–è²bÿŸ™?J²³zªìxj}š&”_Xp´b´ø{*ØÎ½¼i¤Õˆå¥™ñUùsr:­}гÒÒ3“‡ ãRï8\BOw—v›ìÙ:ecWÛøà1çÆ²q-io»>{fŃò@mŽpUl^œV,¸%v«”>¼`Ó¿¾a s^O›×½vDφš†×r³§§&ظ?ÂgćÀL86ð¶×ÇðH¦˜Æ¶‹þI—ëÛ$bó]—¼ÈÕù=Û×¢o
+^~äÚÙÊyWˆôÄrͬ ÉYÍx_¹Kv1›6©†5ßÛ³ùdFê¸}hØM“¢Öâ±aù ™`GC^J@~ûÜ-£úGôm¿ÞñBdyjêñ‰¶uNI&ñÒaÂg/›eŠ{éáßFïœHЙnÞQ“|w“G,kó™¹iû‘¾þ>o¦Ë­ÈêÆn·)¹Uá,žV³Ý.L3˜µ=:›e=`H3¯rjh›,`Y\s4g¨I¹~±Ÿ[ïX]dÝylÍ,ïbÇÄõ"m°»¥RàTÓÞòά$”sûoÍ&þj
endstream
endobj
-1467 0 obj <<
+1929 0 obj <<
/Type /FontDescriptor
-/FontName /VCDMTN+CMSY10
+/FontName /YNRGLS+CMSY10
/Flags 4
/FontBBox [-29 -960 1116 775]
/Ascent 750
@@ -6979,91 +9223,93 @@ endobj
/ItalicAngle -14
/StemV 85
/XHeight 431
-/CharSet (/asteriskmath/bar/logicaland)
-/FontFile 1466 0 R
+/CharSet (/asteriskmath/backslash/bar/logicaland)
+/FontFile 1928 0 R
>> endobj
-1468 0 obj <<
+1930 0 obj <<
/Length1 1612
-/Length2 17026
+/Length2 17475
/Length3 0
-/Length 17870
+/Length 18308
/Filter /FlateDecode
>>
stream
-xÚ¬·cx¥]Ó-§c[+Û¶“ŽmsÅFǶmÛ¶íŽÍŽ“ŽÍÓÏû}½gŸ?û|?Öuݳªæ¨Q5jÎû^dÄ
-ÊtB&vF¦âv¶ÎtLôŒÜ
-vNÎNÆŽ@{gÀ߬
-¢âÿæélaèüOn'à_7ÀÎìo¤‰±Ë?%ýË÷æ¯×Ùhëp6uwþ'—‘)Àèdomèñ7÷_0{Gà¿h¸8mÍÿ‹-ÀÑÔÜÐÑÄÚÔÉé/Ì_ìºó_uþ·ê íí­=þµÛî_Qÿ‹ÐÙÉÔÚŒ–‰ùoNc翹Ͷ° ÿ Š”­™€‰ñßvûÿés5uüWƒ(ÿ™ª¿$ Mìl­=
-@gc €™¡õßNýË®jkbêh ´5ý«è¿š  cbdüŸŠÐØÊöŸÖ³ýÛejkòŸäÿŠô/ê 2êZâ
-Â4ÿy§þ+Já¯öÎ*ö‰ýRdíLþ×â aa;w€'ÝßHÇÌÂ`ÿ›“‰Éûÿí_0Lÿµ–5tvº´ÿ–ÌÈô¯ÂÿÇï¿Vºÿ#fklgòϬ(;Úšü¯ÿeøÇmìâèøWÕø¿ÿÏõ¿ÝÔÔÝÔvmÙΘ'È2-3ݹ+wdJT{  |$ؾ´Q¥¨À¯Æ®×7-l—«Òà½6˜¾i†û³ÝcéÌþãàõáX¦5EoŠée>¾7 UÊy'Ía
-s‡U» lŸ%8š¡ÂÖom@pÿø8èîd!.X¨¨Ö¼‡GÝÑÔ’bïck
-¨|b«ûy¾Â%6OO­PölŸ.¹¤g¦%Œ. ±U2yÌ žPA¥ŸüÚE7ˆçG |zx_yyL”æ‹yÇŸ,BµêÒkÖÓót2ñü²7£©íD×y5ÝákÓèv«ïŽ•o+Á{uhcüqÙhó‰új§w‰XóñË{TŒ iÐè)€é{<DLs£œná<…œŠŠ•­÷Gø Ú†=íY~a^$³¯Ïoõ¤ò“@ò]RÕLß‘uÃÖÂv6_ÇQóŽòÑ,9O·'Ä>ܾ6M2}'ñͨ?£` Kž0WáÓ j†“ÙX…•g%#JØ6ª¬ÈÉÎV¬µ;LŒñÃ9Ú/Ç™Ö+q¼øÂ{§Ã
-yM…ɽn?“§¹^ÃÆáœ}½‚ˆ1ƒç¹P(<¹V<»“w<yú/° $H—É r¢&‰º ÓfðŠ1r±­‹õ[‚ypôHFê®<év+¿1½¨Ý-¬ý`üfæ/]$ãá*3 5©~ËÂ÷~·ö3í½\ª~Ý¡’"L1pµ£v¼Ë™Iäö„zE‰Puz›äÔË`:>B=†cWßXâdŠ*çå
-SF×NQÇÒ£Ì
-—‘p`}~‰öh‚oÞ%˜š›²«„)Žº°yÜcþêÐ`{zOÖ,Íæ6ùc–¯ìöP—*d»,B Gµ5
-~i{š˜Wu|Ø!°tKƒy1ç‹4?£Ó;Ï-·¤Ô[—IäÌÈ*_ƒÆ&…)_¸F§?Hf; fÊQ5×(0ºâûÌ;!š“ô~m†þ®œÆ
-…ó»4>?Øÿ«%³9…€ÐþP cêp|OÜÆMDOÒKçÙ÷ËôП¢yL:± ¥¢AžJ’û<šýcv3¥ìÏw*éÏ ¼ÿZZ<Ys·:þ¼5D‰N.»h)¤…ÉZ'¯Iɉå
-ö´[ѽƒn‚I;‰è_#QÝÒ?È ð[Ô‹e2ŸüÐéÈBÎu×.úÏõJÄ–ÖjCÂktÅ‹:ŸšûÕ˜q¸›fgˆó’®coéäIfM]Ý*×ÁôY?Xnü:y¿åßr\ØŽqÏ׃š‡‚:xþÝßí–jë°-˜
-☨QþP)HX0…÷£E §ÓÛh‰—zÛjgˆeÜ`.³d
-9º¡ˆS¼ÐOÒ>ÉÌM¥7ë²(?›u¦k†¨òGþ „³b®ØõõAÓæß©IR0Ù¸Ó–*öÐ覙{Å7öÆUxäÈ+4}öá¯æJ‡{§ì)h
-8¢CϵRD‚*a3;8^Ùdà‹„é×¥z
-š¥M³Vù€y*¬9Î,°…
-¨þÙóo“dS–ÎÎï[^cò®+uÜÚ’¦=‡±ôk¼Caei\ˆCeT…X‘Ä›×WÎþ/tô¬Ë‘wÓù—zK²†D{-Åàæx`’^ÍÏm@|¹A²¸\Ʀ–ÃÀð
-΀ÇQ—&+D}P6dWÖiWH½  âµ ¼˜Ö‹õ–ÕB¥x×0¸Üܹ›ž5nWÑøÁ5†bŠ¥ç(* ‡øµ';7×…zºˆ;U¯!5VÚ ç‡ÊÑÆ
-'óVéú
-^­ãîÅQ$ëa¨b½’)ù¤Ó}Ã…ÿÝ\ÓºàAút1÷þÞ°åÑT†s¿’˜ý>vJ‹+g®™ç9`_Kä
-@Ø×„±iO{pcÕ³„I$7°Ë–y´$˺ÊzIÚÂðZgï íé
-?ÙQÈkeVì̧¶±NÏJ#¬akÿ…âÔi¹úŽ3Ÿa~z¿ ñ4áÍúwH/«/ß—¶ÃQ™Öçî<üÏ3=x\°ô4Y¥¬ø#D%s¹bæŸÆ×n%ýV&ö\Ôd(
-UF蓑݈,ïŠ[ª¸ƒuB7É…øµ×}ã÷ˆJì¤êg‡È•Bù¥wRûÜЛ zKôÝÒÈ®h<“ã} ž¤ù¡N Ã8ðÃ?©78ÿ´ÆM‰ÊN¯¶üDÒ±ïZRiˆk¥jl˜hàfÛOx0 s+\§þñ²­¥ —”$íÜæTÁãsXÕÄ^o}…Ñ.†¯¤ý|ôjE‡ŒüCæ+PBÞlòMü4 䄦Ÿþƒ3ììׄNîA ³fš\j×pÙÓêJ§iñÒäþŒÊÛhsYè ‡•{Ô+âȹd?н@Cï)þù6÷f†*Ñ|2Óú c9ÜIo3ÿ¢©‰wN …°¤È$ò·. N^„gà“ÐŽõ¤ oÞ³RXƒ±ÆÄ( À–\
-$Ò.âÆU-‘<uï®ã\p7LÞB ç}&èè>ïÆ`tÌ.}ôÌÙ弞8
-Ká3*! ¯˜³áž“ˆ›ÃdX‘)A+Ô«¡cz&û³2ƒXK?âÚ ¢Ùб¥bÔÁ¸íáÍeMèwc[Þ
-ˆt;£ ¸Nëô•uøP›‡Ö»ŠB%{±:2BöÔR,î+JÃ!»åS×m5†Ì5PAø¹½ÄÎ;Æ%íUSÀp¶.®TmzÛû>&ÿ+-¤‰ ³Ýì°#ÙS·;`užžøû¦[!h•ÆËØ3“s˜ò/_ŒÃÍOm°DbC&Þ xYÜ=¢²ˆÌv5Jí8$,ËÑڴ†õYS'«ÀOVF(´j
-wøKüT¾@Ì7½od;:jt{-¹º‡,¼ß·ÍÑG9|}ºÉŽ[hy~£,”í^ÓÐ9ZýÁ΀~LoF& ºaËÿf,CŒ2N}ß{i-¶(1s8µÇ4ŠËLnh…3Œ rÐâO¤”w®"§laEáÿDcxÞvòõÛŸw‡0‘eÓ55Ådó#Ï,ß—{’.îÇØÎÉ -3ÞÞÔ÷\ÂóD–D%Dd„*'a (a™½ýfÑÂFDò7ÜŸ3}m&Þ„3sov•~®N¿ùQ°öÑuƒ1 e½ëãì˾‡ Tuæ•@ÃEsžkh•¢s|®¸šºë3÷6Ÿæzó)À‹RAu‚º$äT ¨ÁE:`»6øÌk <ƒ–1wÙUùÃ× ›´} åÿr,KT¼8ŠÓžŸ/ÞKM"³ÙÇ5ØwT$î5 }Zó÷¤èüU £ÿ3@ÜÝ
-²ZqáåöÛépêþ» §í£Ðm}tÃx´›—ÛI&LeúÚÑk¨´ß(æÏ+öåÍ¡¸¬o1è¬XÉ݃غFò—ƒ dˆ4HR“‡ªGÔG”Ñq|;3µèáþ:³HÓ}ðÖXß3%u¢Wé Y¥A<»½Îs-úa·“õl ÏÞ|ÜqOzz­ð´î{› à }ì7H,¬Áã‘e÷Ű«–í(<˜iþ¥(#(õH V Qo¾ {¶%Ûâ÷=X…Šusúí¬­ 'i à‚J£Ík'G –ùm.¹½†4ûJ )¨¹´_Y;ªûžSJ ¿UÈZzä ÞWGÒO—íIÁ¿+PMÆWuÀ*˜þ™žPñ§«ÄŠü‡Á}mv‚8(ÓÕëþƒNÍŸ—ÇLPxrûÈ  Nçïçå„E€{oPôÐZ‘üÜÙG³‰¾,Moâ÷k%³¿³¡96ÛÖà)m/u‹½tv/8ŠhMbâ^N¼áëÛH5çLÜ×’õ¹mÀ*DÉei¦ýèBq›ºŠ{´¦½1âëdáA. Ü24lâ¾É3Übz9Ÿ¡Òu’ÒQÊ—?,¶›*‚®gG!Ik}7ënÜLôÑã"rÛÚf'v1Ü4Û4Û-ßzšåì47¢–u‘¢v¨ÐJ Ùt>%"~Yf¬“¢S¨xteUø£…8wèBr}Þ4؆€H í1ÁÔ {ÉA¥šÐçNÖ óúâê[eÃŸŽ’v¤àÔÍê½µðE|_`Úvçß¿yç_cî§8ŠÛ^‡§i¢Ë½3p¨uóT„ÞõwÎra°YÙú”£Ö‘7®mà)Z:™¨€?ÅöCqˆ¨+
-¤ÛêQ”Ù”!E_1¸š‘ZøDµ!ÉóLù -Ý©7>ƒRî<bÓ"ú­8¶?²L®|»&¶‹ENœébHh¨cØLb¤d8 ~#îþùËBä·(ø[Mû Œüq—¼¶
-Ú×rpQ’„þ4Z”9TÕ£*åØÏîdÔ¦“ ¾g© KÍ]ßÇJI;k¢'÷]V„™Ä“¦l˜­Úêöà¬Sï`ª*?HK‡V'Ô—£ãú$G¢éöOö²,Rg]­µž†5"ÇíªF“°†LàÁAP&ÍHÐLâ¡Ó7>ÅYéŸnêÓSID’øg_ åW±Õß/„<c!B&0ÖmûE92\„µ0ƒíAE#êæñ}½³ø†{Ÿ†ª“=—rŠÙ·å6Ÿ ñNW=Å ç£<ÅF#?뵸x„ÍŽ®b½Urˆ‹˜„.“äæ˜„Zr‡ 1ÏðeŠqÆOäÙYYÉüEb!ψ’,i)EkB-–XáÛÈûQ_Ø‘G†-?I«#OÒµ-…ñjWJå¬ÔO¿˜tšáª)HSi5ðûm`ÙÇÍ—l$=¶übÖàíi»ÄA˜ëg±±ê˜T «ª‹~°5b> „ù2ñY@"Œêš¹}%êæ
-J¬e¾S¤ȪÁCãfP/ŸN>ª‚;• :[²2§X¯`g¿£?Ñz׋‹´kHöàW{HP7L‚¦Âä ÈË¢fˆ$೎òèÆ>çTuÒ5ÅFy`zÚ$§>Fׇ÷ëÀñß㯹›ò)i§µÏß1m§tÈLÏøæ~Ê$Åì4åá’-b• üùÅi
-štÖï5N†ú¢&¤K¨ß/<,3PÄsÙo5`ïÆwŒý|É%ÊaYàÞÉ!¡ZÆ»ÿM³åæ‹XT}är1 \ªðư8È=›“"•€$)ûÎoòPT×ö®
-
-QÐ
-KâÏ7z*P[¿ÁÙ¶M‹_”zUP!øA)jœ„ËÞ{¢õ)d0ì€|+×D¦â ØxþY=hé‹Ëã{èGƒÙ†kÚ¬qÔÿªß9¿9€÷­ÝÖ‰¢ ûì! Œ/ÀÒ€Æ(ýAi'Іè3CVUWX1ý5Ÿ#+À~„I|R´T\Ý®›šVJað#¶ðÒ¥nä&öbàÅL ;Þ“Šo³æ@‹H‘ì ¿ùÊó ÿxΆ¾k¥šQá(’A;4‰¥ˆh‚dœõÓÛúÀ<Ø[Ck†,Up\†…–¹ü–J5ÛgìÉÛNe³ã`¿´Ò¶ˆÎ$ß úî™×þçéYù`^k?·–å -m/¤ai¤:˜î^Xâ¶2p²Ûò}Eê H\3–Ý%í
-pA_86½´¢¨5ª?’‹Ëô‘ßMq‹b…¾Jwõµ€¶È3ÖÁÈG÷1û8F.›‡Õ"EcŽ  NI=W¢Î{$ .«ØTHáßI£p²öÄ
- Ž%²À"aPŽ Ž W•ÝÞóš4“
-“tÑ˰ؘš­< ý²õ‚ï
-zíû³éðê#Ñ`i‘•Åž}2EÒÙÈ|†«èÂòpåßUàeÖÒ×SU}/…ûLFߎ½›¯óýßÃwþ@ÚÀu”7ä>A™}ÀyøÈƒ„;˜ÜUÎN=|Ž¿¤oƒ.!¡±™À:{¥W­Y|-}U ­+˜Ù'F=Ünœ^ÖÒd.иÓgvÒŠ84°ärè³±ÏK*I¼Å¾ÓF–©m.ÅÇ
-ÂAõw°~õžtóC/ÛLí–¢¶„>c츶k¢ã³‘î³&BÙøÂ± Âg= ïÛØëMÚŽ˜sËéãݵ¿M,¸:jQ/
-+Ž3~Í{?'´× bø<š2 ¸]ªP z„Øu2>øÑ×99d¬{$Ç,œÈkÒtKW™œ­¼f²£òä©0 øZà=ýPŽ”ù%rzÀ…d!bÃ…1Z=Ì
-mw¤öSöù¨3Ɖ± ë3a›Kòç$¾g+ëé9¸«žd\¨–ã+¼tœ÷&¶<âPF³Ñ¦ÁÌKEQ´âÏv Ú#D¬$Ÿ?gÛ2,&œÍÕ¥AH]Ì]¤ôJ?¥'VД#HÙ| %ñ
-ïùÑ*^‡€uCáõ M =´ ªÑ.k”tâØ I²¥aIŠz~*ìÄo£¬rcEÊFõCöäC`óÜ3¢ÕT܃r0™“‡`Wró¿ùÎÀ°…¥I¦…º¯
-m#£û¿×‹¬§Í¸ÔrÛ{~cÔðƒ rù„<ß7¡ã
-Õ‰š¥…_¹4†`5Ñš7¨_^Ùˆ\©!Í'Ú-Kû´ãb!ú]4*Æ÷‚*Çw!™ª 8ø„ Èìi×ÄØ3h9s.Œºl|ƒ1ácÍ5+p§#=†C„ƒÇ]hμ8F¡—8î FS+2¨ø#mɉ´R±¤vOÃ?áÑ*™<érø`±jé‡7{Z«ßÏW•ú9åW~ˆƒ¬a3³¿^¢6W¤©Â$N-g`%ψoB ¶‹$
-dÞâèvêó&{cÛëÛùpHW›ãŠž~r=óo¦ï’Ù‰§œ‚ä7'¸WÍL¼ôå~TÄÆêID`„¦7š ³€9‡…
-ó©e:¦‘!í8¢¦_…Æ*8ݰ’¸EÛü½ƒûî-<XƒâõŸ·{dËDu(c½÷;HKÌãÃÑòc&0sôqsÒ«BŒ«˜¨ª“drYXÖïÔÍ-PTAêLU‚¬…íå˜oÒÍ{e…Uo :+ÔŽMéÊiæ ŽŠ
-fß
->Å ÚÙ¤²ÙŠsÚ]‰äúúÓ-˜÷úë”$è|ÎŒËJ˜7„ÆÛ~ðœJÀtúnÐQÉœërµCw-5fHftÜïetºLïv³ìQqo®à¤)µOg|tJÉ-…¢ª°,UÁ
-¬ñ#g+3èV*¼Ya´BÓ¸Á6“¬µR’Nþ¦Y’±÷¤‚g¯ú23ÒÈS/“*Ø  ]8º dnQéysFR̲€ÀÝ‹½qL8€œÜ½—Úàðo…C‡5”øzöÈGõ8hŸÍï2jì8(ê8û†kø—êH6Kw1ð¡KÌmQãå2ÝhHzv!®i“ùТÕDç¥[ÔjN^¾c Á·ëíн
-fB{—Ûé=÷"t’2§•Ú׊¨ÏþLpv|Ý ˆ»*V²Ã%fóç0'ùíµk"×ïÐÁ”8|ì§“<Eõ! íc-§NtnÆ:Df‚¬[Äs¹Å…Tªm|¸ÿûO~új<½7K–NQÓ÷#ޤkBúÔ‰”fï4YX·úVNˆ./¿fèN‡L…E&˜xüP}£´3¼\×7ÜG•}&³ÃUÇ–<½4‘ßו,àù͇¡¾ Á¿ü"3© ÝCWe^Jì
- <!rþ¢(YŒJÔª‘Þ΃ÛÓÔ~ÛÉ,a ßT8Ñiz›µ)°²˜k¨/EŠšm²~,ºýfQGÛµðµ}¥EVª‹•Çì×<6TÒ­ ëKá²
-'£èS¬§ÌÍ­n Ÿþø•áu`¬ÑBG_åE1פ~Èr}=„L'jR~®/Þ]…ü,Gl޶ P :Šb_¡}Ã`CRÃ€ç ¯]â¨B¿”髇“
-ekÀ{BÝq{^Ø¥-‚ŠqXîï`Æk D(dùÌóU„J=sö”t=¹¶T“ç~ã”,¹³ø<‰(Œ1«Ð™GŽe8*K™jâ]
-œM,z!0U˜òÊeZBi€½í|ÌW2 ]®ü[6¸Üeàf“Æ«ûBZWaN¬µKù¥gkxTm™înN>@÷ÐcZ¶¢¹Pe½%Ë—¤ò¥ÙOqÀwZh1–‡±%ó3ßû‘- ’»Ž`7^wˆ½¹Û
-s*`²öÇ Fr3ÁŸS§¨žÈ Þhø‰éýŽ+û°Ž;±~$ó)íNA3tuN|À¾í‚:…ç³—§Mn#”’ħ4Zæ,̯̂˰´äú·™b€ÁÙ è–ÕJ«à8T¡ª8†Å1bK¾/ÚPðϤ5ЊÚò6ÏH#7’Ìxqê×åy\…ÀÑ!ÖͬO»O“l†'­¼¼¨éJ h±—ö¯JžÔ4¬µ#©d r9·³¡¹·¹ò¶ýz1«''°ã0Îã,£'…Rçx‚kÁ
-êƒÐp9eŠ bÁ¿ÚÝÖù¼uÙo­ŸBõ0‚…ݦÎ_³R^8üp0Á Áª\m’S£ ‘_ã B¢tjºkÙ¾·GÃ×Í¡æ$¢½š|hº®ú›_)„…”‡oÎid¡]tþôdŸ)#]¯Ü~ân(`x†6šùÊE´m˜ Îȸ¼"N²¼/Y<Ñ×G{ÞE'Bb–",¿1LνNéMöšÎê‘[´®&—ì%öª
-þ¹éÛë³ÙCæP'÷Ù Éh Ù9–(Ù«Ã-3T±'pFF€ë=Ge:»#ÉÏAW;Rc÷™TmŸðG=!¶&!ùBlý¦jþX- ý[|~× Cseè¥ÈΜõ¿>¸ÀøBmç3@cBØF µH~ õÐWà3~ãlŸphˆ}äYRbž^} ¼”z~Û0„eiPðÇð˜u]ä¶Ì%} =8sù”ß<œùD$ì'ýìC”_k¦ñƒË¢¥‚Ú& ‘MùË
-! ˜ Ãp‘oòb«?GË‘žÇ{O#‹Œ\tä‚>ʪ·UgÿáñÌrš£ð@tŸhÀ7X3Ë–k\[]*Ó±FÑõ?j×AA$ÛïM,¿÷ðl¤>]³ôõòw«`ç!ËRÜ€x8öÆŸØwË2Ff—îˆ\K–.9Ï2#«íoîîc|#ÊBU}ÝÔÄ犧B÷Ñ‘¾EÙBÔÇ𙺓†i÷¢h Í&*„eÇÅQäœòPz@‡ó1 èÏ6mì¤a!×p48h‹{âW;.*/jjY¡Üü”¤Qsm²Cœ³3„zñ/A ³+$Êfñ5Ÿ™ZS‘"Âÿ•ð«°`Äÿ#šÑÔðË¢ ƒ'³÷š+ ’+ô­Ïôï§oxÀGÕ|ÑÓ—i Z?؈µ7Ê».]ÄÕ<5¯ c\yé{'Ö¶ÐTc¯•ægnuŠ”'ÜštÃý”¿Óã½ìƒ=ýUFÐåš%Xäñˆ÷®kVÞ »Ò¦OÅ!¨6cT¤ì0RÉYªÖ(‡•DÐŒ³pé~˜¯Žï1SÈ®ˆ«¼Usk™/ÚÛI˜¨é·îŠv•=,ñ–µ€{ðÈÆä~a)yšê¸¾„n¯Yïw®e%à±+ø¦ÞÆ›Y»kLIµ-9‘Hqúµ˜[tëºvÜœuSé[*ï‰oz,'„ÏÎw@O³»ÞœjóBèptâö¸¾µhüfû‘`Ÿø@÷í¨Žùçž üSÉŸç‹‚L©õ¦¬j35k0Š9ƒH¾3_ž@­±=XÐb_æÅ÷
-¦+hæ*ŸÒ‹ùIXÿÌyŽÑA¢
-íA}›wB´„!ÎQ-¸ö %Ó½Bz~€ì+’:ᑈ;>4:æŒmr7X΂"S,J9W{êbcs>T¹n;¿Ç}h ,·û)8 ‚'Y;–:¢Ï.Hì{^µðŒ¥NÊé¶.¸WœFuÌLÊ
-Pä)ä·¥Ê]¼/%åLmLK
- óëΙ ¡XB}ht6BåØZLrIT›ÜY?iÏ«&ê`TDÂì·hþ‰ý˜;æêIêwù&éóÙD1Zßš­/häs¬ ÒØX󆧕|áЫtÞ?HSô<KF‹¸Ü›š[•:&ªè«5†þ€¹}ûÁ¹[Ôyš[gNà“8žáUþÅÜzKn¹¦Û‰ß³³ñ;0~ÚWþ#ΙÑTØpØpêŒÌÀ‚Ã&v!<`¾U4H ÓåÇyøêO«d£K<„KãÎhMø+Š”XI+Õ†øÝÜEŸ½ÃÇšYöAJÕk™ÙÀ9u.æÝ_AÒVªk¯î _òØIbÈ\Ër…BŒ;QsÆ1‹=¶+ÄÕN/têܽ9?!A¶ŽiñRXv˜ñ9ÚpA}qÇ(¶t%£a>ô1 û*”‡üs®œÔ A¯¢º)XáòR…܌̰+ô–ÆEª’ä_c{\Gz¯Ò›ó©ÁŸŽŸñØ—ßy  ¸Ù„õ²õ34€'Ê¡ |£p+·:ÐZ—|ÙQ^·Í~˜gG|ŸV"kðUÊhr%ÁÒ5ŽÐ-Ì#ØG\Ý$®DÞHé: ú8°÷Œ“r³ºüÃéÍ–úo’Ëc“;ÂâOà>Ëž?Mo´K(û§ÐP—ã ·(&„ÈyÜiwAžÒZ»¦Ëjš¾K5ÿŽVwiˆÄÚö 4T»>×gnÍ"xM¢öc0C·NÁ‚r¦:ú UÃÈ;q?0EnêŒÈЇÀ!y}L%™\B’„;ޝÎdÒX^¸²3Ôî_´‹À±IK?Å`´Þò
-êÄ~즀®C*5×Éé¬Ë[ÌÄNëuJ@™E¶¬§âtÿ&_Ts&Ë¥\ʱV,‘@ñ(ûl<‹ªÿΚokƾ£Ñ2«ÚÌŽ9r«ãHU„:šçÖŠéuõå8]üL8Ã=ž,ÀæòÊáäú0p²;”/àš¡3YŠ
-fBíjÑ•ZO¶×f‹!ô&°œTó2¹3$‘ðlÔ%§-~kBRݘ*ç”Ú¤·åcžâÍ3 ì~P@ö&à2l|ÛŸõ”ÙêÉgR×'Bɳ:ëDJKK×ÝP Ó¤&ÃMP(GÎïõ¹N
- ÉÓãÛÏ´ŒÍܼ²òpÄËåù‚ þè(À§ü‰‡X~‚õPÌí»˜«Ô2Ø®S2™eú?yW4­+~e6W^6¤$J–[ïqPˆß]Oèð«f+šy ÅÖJˆ¦&¥è¹û¯jüÝêÈÒN"Ãp
-æ@4
+xÚ¬·ctf]·&ÛvîØ¶m;ëŽmÛ¶mÛ¶ÍJ*©•TlTÒõ¼oŸ>=Î×ߟîóc±×œs]óšóšk½)H”ÕDÌL€’ö® ,ŒÌ¼
+ähÍ
+ ÖPÕ¢¡££ÿOË?!
+fÿkñ†¨¨ƒ'À‡áï d`eãpþMÈÍÂâ÷Èö/–ÿ\+»:[ytÿ–ÌÌò¯ÂÿçóŸ+ýÿ#aoê`öϬ¨¹Û›ý¯ÿeøÇmêæìüWÕø¿ÿÇú_ƒzMá6×LùB­3s²\± ÆgÅu‡YÀÇÃ+ZÔK‹ë2#÷xjŒ>Â[çy?»¼ÖÎÿÉÒObÙR ¤¯ŠüÈh†ŠQw({¸èŽƒ™ *³.´b}®Wåw!t8™5÷gUT Ê? ç{Øœa®ŸiÉÜ‹1ÈŸ‘üM3š0{QZAÐKÎ/(SΞŸ¨F§&ÆÇn!‡Žðéò`)øÜ!)còñ…t4j|¢h ²Úðo»¯?‰µú}
+)ÈñÈ£íäß”-жì»å?R!³º…øSœ¥;jµ±n–çcøERæy–
+¾~¸QH¸`ó·Ì… ß-Ú‡,ä@7?‚ÝP»Dú4ÚÕÓ¾ !¬L,¨ôV4{t@Q03LD¹Õ"‰u:ºPxëmˆÊY?*ó"íÒFŸVµLz—l.äÍ
+ôsp”ÏÛ#~aþjã,1n½™“i»ÑQœ‘&+»Pñêñ¿ŠqÆ'Oªò„yb‰ÑÖ…¯Ë|`j­Ðèí_QNì/ëBî²Ä_ Í“ ÷çIAˆ$O$CÂ2YÉŽÐý:9Íöüi–Yó+ÈûW¸Û()ÜâJ 0ðЉ»ºˆÜVÄN»tŒ©‡²ú¾ýY›­!ž·*$®¡Ìé}bzi>7’?H +Ö ¼ç N¯Åžƒáhºðe…4Ày Òæ]wÚæu ÜIÜ.Ž¿7÷Þk:®Þ‰X%:ÖÍŠoAòj¹Á¤$€,f±mœõÄeü4´å¢äî”(+¥Ë?šûEY:Å?-àû‡½9Š´º1‡f'Êñj—Y „:ÃóçMØÏqÜíØÐY-Kjô< çè*²ý%CÚ—vÒ…†ïçòÉ[{HÆ(½%c½Pö/ÒG\mP‘[wv x—þ®Fú»¹H+6Gêõ¯”Q±÷t ä8{$8ß„Ô?q´}ÞàSÚæf¿R÷ÿ$+¿bd¥'Š« ·W5y…Ì›VGcœùÚÅ0JD¤~~|ŸÚx}J‘ˆÿÀKš)EK°é5h30ðq1óùr4§kèÁÐ{î
+tj÷
+y4õÅL(u–ã¿9u2Ë^µØÅ¢½9\!ÕÃ0cûMHP ˜<³|ðN…K|ûQŰÅt‘NICÃÎ1 õŠþÓ‘þž"“ ¤0†5ÀÿP+µê,„r\#G=`|˸£¤‹#Ày¢»j"WÑÇãio°ó›…¡‹ävìåØÊšìuÔÜ
+—¦qöcöLvIÍyù¸*Ž¥{4Jš« {æ. sÒX¾îëi¦íF"?è>æ¯1
+rÂ÷T±$ÑV¶Oû-Þœší=P´ÉqxÌÈ.ÔÝëÓ„ÿ¬ŒÖÁÕèˆEXû9G¯15æR±£Íºš†M^”ÝãWèQ€W^á§Ï"& ;þÈçO…&P Á¤½MH×î iÅêÔ@9k˜Ä
+Þb4rÉ>¿ñÃdu†uør—îô‚øë½ˆS\ÜöÐ1ÓÉKŒÒt´ÏÞRÒRªœ”évâF<„SwS 0¾Æcûäd) ZÚµÊäsž1(Â/ô7]”'K¬m7„G¹ÖëK–‰»þ²¬7ãòæeK„ñ“oáìèJçÎ^ß©5ÂÚ>[ÿX<û¸ÜqYù-ï™e
+“cQCxÒ&-k71E·M„ÌiXwl-}‹VÜžc·ígu:FŸrØjþ„Ykê^›YïÔÌ÷›FLÿ3Ó¸/xF6ÊgÌš,$y̓çÆüäzO±Ö’qØ7½à¢kÑÃI‚^emwfa9@â®]…d,QGisËV€®SÖuŒ!YLè‘j‘=¢¤pú<iÏ0XhäfƒŒ,öLOeíÙ‡ÊþOÐÆŒ“’6OVžÌš¢í^0ÇÙŽ¯âôà ÃÌi»ôTç?gñËl‚~OºTM`§ý>Õvz.1*TíçY*¼1L +%«'|‚ëªbî2kÂ_Ôjü7!äËlÅ‹›ù}1ÓN”lpqR-¢VŸÁ- ÖÏŽ+oêÖžDGô&‚§šAÜÒã¹//Ó—5"dW¥P•þˆƒç̆ü™Þ9zþ›B¾™çÚ¶rŒ÷Ò,™Åõæ³KH—Ž‘*ß $<fãóŒèÓ
+0C¾ž\ª¦ZN!Å£âÌz4ÊR›mH^Û4$RVr躸Iû‰,¿ýÃòËÈÄó(ÖpùFd2’þG–r:ƒŒY"žÔú,#«Øþίù
+t»á,ºÅÖÃðVäÄ:¼ìŽ§Šˆ­ßñ¸³ÙIÄ^dÈZUFÛ21M6ÉÖC“¦¯œÚh[çM¬°²9%N%BßÄD.‚Ejpå=˺IZ.¼RCíÒù</ì1r§=Ї˜<À˜Á:+2¦f‡û)½.»–}q“_±Ïˆa¿É8­û%ß/5uÊݼ_ Ÿ°¨:µuItÁ&0§eZwü`„Ƙ-d&¶ ñÔÈ ¿iÜÔcøL­GÙEˆÅúQDY¸j±=Š5pã)·b¢„¹…‰ü>Óп¸?Á k"õãÛDÌÎü1yûk“N¤Ìn5È›SÉð”½å˜t•â¬X9ÜHäQ>ˆª²£e ´þ-ì<&Ô`éå(²Îñ'»Ÿê—i³­/ŽŽU<6šx5Jš Djjžª‰;¶Ž?¸ð
+¹ooéᮚ¡m¯ñ¤éžíÉÜ{Ÿ¯Ýh/N»õ| W&«œäç
+Y?÷…±sÇ=Ó-.èæ#ÂÎ
+‚wC3l¨1±°ƒ"®Ý×q·=²DÄ¡±x*ž¿µÏMˆ¢M?îÑx½„Õs#ñ:Ž 3KÙò­=»©æò-ÁGVwqm%éÃ4ú×}ƒÑ œC4‚„4$°k ¨OF!|AAŒ¡8ü(FؘÝœúPÄ8u·ô “1&›¾-¾¼[!9´^KZS§„rî
+”þð
+¢
+Ö%ú.øTÆFiÕDyIð7Á!Ö`Ÿ5 ö–ÑÚR‰dͺå™#xZ+•˜ŸZÓñL%v›Gßv—æYvñR 9ZLöÙž]œ]MJßóU<Ó+…ieã™*â"]Åm7úE]î^2Ö3õbLoh&ê÷i|ƒ?µa¢¶@†ÖUß:±óeœßã®$b½Øòªºœ^ûhY§¥›§ßW¦ÎË€ Ž4Ý
+ß|Úî¯o>m³MAì\…‰÷TÖâ ó|ú€ôtsŽåS¾†Pª–$çÃ@v‚ê‰L¹ñZƒšÏ[!q‰ðô(©XÎtº^ ‰®)P(s„x´¾D[†f°{¹Xî>r­o«Ë¦J“W\ È&˜OìçA)?,ßã¢êà —÷ |ú¿ ÙuÉ `ŸŽ¿_NUq*?÷1н–õÔ
+7¢ÎÑŠiÚ_Ùq€ãI¡ÃZ¹ÄvtÁ_²®@s‹÷;«§€?ãÛþá°Ï/¥‡±3¥3TÜž²«pM¯_”÷îj }ð¡Ì˜õÛUNÕ ™¤û#¬~­½LÐ~ÿ¹tÜiqþ¨À$|³FËfȤÄåñQ½é"ßo#Cq­e~ƒ@µ¿4u-â·ªvŠ´'TPCBÔöÓHŠÇâgzÚO}úŒç­‹Xš>5hïò×bM=Ÿ YÝœÝÒÌ!Œ‘¥—!HM î¯Ã™»Kâ9ÇÖò0i71¦ê+'-Uí±i
+?¸›Y£»”
+EgË$b›šû£L|Hñ²ß„ø£[t±~(Îݯd¯]§šÐ§æ„ÅÌ
+lß{ì[ñ*î¤#jŒ|×°“~1Žk§fÔ :‰´‰ŸÈùÑ3±Gâý`¼+¢¹Ú¹€ƒa(HÌŒê1dukA·î: zõ¨+íýó'þI<BÉ·
+SåŒRü%NiѲ0"(¼þžP}­^¡4˜´rxãqÞaBHÞËPv’Î*(,ÚD¶!?s[!Òe!d†”àœë Á~8o)5¡…°£¶ŸüP;•‹k¦è·pvzDå·Öë<4Ô.»¦H¬ÐE ßœ‹Gš®æäÕÐ`à…¡mQíÀõ^þtÃåi_öI=xk<–ºNuÜy·å†PϽq/"®³›myå°är¯’bº‹Zzs¨™K6”ÉCl'8`ùú‚³©YÎ=Ù"f?g]eú!¬Ž=ç
+Ö}¥K‚¿+㪃šàÉB¼èÇÖØ\ÇüØ^Ã+rhIŽãMÖÚ‘¦Eû˜ÃÔý†#
+;ûmд(fQt×€ßpÆYÑ_¢Š×ß-Qûn ×£h#ýs@Z
+I´E›QÀ ÿ''OöQy
+þr¥óe1y…ÉWèúM_øî[eˆºÏQ"š®’Î ;DFâãÏtçãXB“NÌ9h¿vSaÓ¥xé©3aÎ8²¾£óaÇ–O™5Œ´aZËÈGÌ=Tù댒ƒÏóƒÉ\./ÍvРõ<T aNãù…{éÂìlØd
+sAk­+;l‰¼t$P?â¾Fq9ÈH—¹ôÆJߟgIç©Ù{ÍÍ·~µ("…VíbÐß«OYiò'XÄÖbTI4…‹¼;Mâ°OjUî}GÁa’‡šI[I)ߌD¬éˆÞ vú0ûvFSIF‡ña¸à~­¿b¨°Ø²jB¬bóf\;é|`H“•>t…ºh±àsg Ò`§¸X; F ô¦Né^0ÄHÚ-ßæzLò*û­?í™Õ•G+“.TBÏ(ý„¦;R«Oßžpô[©(+Ò_ÆÊ«†âÔ
+LšX³¾7€ûh:&xd±})'B‚Ì´G)iàÙ7w,m—®½g UñÄ~ùÜÍt Œ¤N  ¿TC“ˆ<„_çrDOƒ1.a«_ÈbmæÔjÔrá«1ó{¤ÕùN¤¶u"o•ç5pYþµ
+H˜C‚bO„l^”¼á8¬ÄcxÕÉÛ¨;A©jÿxôƼÌ1 ­ù³- “lx7&‹ó™ \}B=xNôI§œN¿ÃÆt*wRù¥øŠuRÅP;ŒMJœV~ßp²Í«
+kÌ'¿Ž/«{Òš"J͸SxôäšÜn{6¥Ü
+Åy[!C]™‡¸møK”I–Ÿú?عïÈn·mƒ3•,•j)RÁÞ¬¼„Å&!ºþÊÉNVZæ„f¤Á´¬g#Ê3îÉk7J­9
+&¹¯H J± r©í10\¼9&S‡È|ÎsÄK<®
+y$ƃd$ ¥noEB0“”/‚Ü[
+é |‘påœå¡¡8q,ßð—T=ù¹³‘‘çbÉᩉåYÍdDÕuX2<ØFFN;qÉa8;Ø7Z 5NªR†×ÛÆÚðé˶.ÔšA~xHÄb_Ù³åë±zuÄʽÆu$LCŽíˆlÔ=£2tÀ][~ñE¸„&t¡0Ò^A”(;ÅøÒÒÃçtfð½ï¼»…s€kjùc+šZdàá°—)ÖG’> g“ZI¼’C<5)-Ê8 § ‘³|Q o=Y‚˜ÑU_]ÏÈâûªœuèe%°Ô„1˜Q³')n4¬FL¬»’ÞÖ™ H“8!iœ}!a@@ù ÀÈ?¸Z›q|Õ>œ?Àüó¹
+qšuÏŸ; »Õ…SQƒäNb­pé9ž,;@iƒ~Ò•ØÕê*ù;r/ÊŽ]3 ݰ٘pls³|êAæ?¶b…Š´ ›CJÎÉ>ã‘yT—úÑ“þZÌžƒAD¼#¿¸®CuâÚ*z«yÒÇh‡zdÃAÍ— ˆsšaïÚ oPµ%~ôLLÖÁ­§ Ói<“^‡… ™ Ìfíƒd\Ì\Ò$hç^Z–¥ÁÉ’ûÇt"µX©ô"÷˜’Vˆ”(™0‘¸ÉvàÁ{¾‘VÝÊ–Uu_ #x|3ÞÌÙÔ='Y0âeÏ~0dl:êô±—sÆì°Ñ©óBÌ6Bå[bº!À‡”g–Ôú­ ‰_j®©ÁÓ}ËOhŸäõ®<.uR„â =)i]û¦Ó zö©¢'!Ði1&ŠúÉLÊÃ]%î;¾ãÁ'KM`ö©Æé°ludÌ$÷—QŒÔº§–#*¬ÎyfžM:s¥­ Wq…ôWFü™‹=Öˆ|`´û ·ØcÂÍø¢øÞõ¢ó1•×…úÆB íÚ\ïcH,)¾ ²U™âZÔߦ:K]ƲÀ¢‚(ªU ±ôúRãàTÊšžâÜdO£sßx¨§ŠÈbûn5”S•"‡`‹e“Þã~hHd䟸·RevatLXâ;lø¨Á{tÓ¥NB«Ã["cMhL¨/Òê=Ö?cè_øb°¶g&¢·¨•)ǽ:ÜW}hª .þçrîuÜ4Õ1V²IN8ùt“_G÷7‰ázf«¬w_Hªu*a½ ûÅNbD./ÝÛÚlR„³Ü5;¦L›ËصAUv)lr}«ÉñŽ >€1i#‚Þ+„'ÈÆ¯r™ÊØ]í:~¢±´Yåm‡gÁï…bU{§(òŠ „|–&%¡È­XB#ƒ üû€ÆKUÚ(»Q&˜ µ(íÚôzúó>»n‡„’Ù¢ Hb€Ò‡•ÑΈ›£Œ+°]õlX€V¹÷`ÞÑ
+Hw<fp­›å
++qˆ†|âï×Kto«>KÏ8–ñò'›¿«"›ÜÅðÓY>³o`!—…T»U«ý®j§ÒÁˆó°Hª®ÒJIMÿ-ì,ÈÓñÛën%˜ÞA¢¼Nã.p£.&<Ò:$U2m“’#‡{†×䎇 ðº&yæíE#Œkå!ùfüXh®µì˜Õóåo!ŠMÇM”‚v’…¥¢Ž£k:a¯n Ôª‚‚Ùø•Þ=Û¤Þ͇ËÃxógv¤ñ·Túc04ÁäúY‘Œè£oõ;²Æœ7&ñØTÒí,È'D|–}N»ùþ +ƒzª¨ö=Ž"µ¨Õg$® 拳_vÒ—«'*†dö|“–»n«‚°-ÚÎ’™ñRŽýSmSf‚âG1³¸D
+\¾Êþê ¦J¨Ùe«Õ™i‘½Z °È£”˜ìƒc·” Ñ>ms®*r`Ž‘MÄⲋ~tÛ$äï[À"^3èÝ”¥ý{y·*ó‰Ö¸ØqYà
+ZJJrN¢œ<ë±'õÙ¸ñá%0œhV
++_¼Lþ&ï·]h5{w˜Ù™µ@ÂS—9‚[÷Ä7tØËOÂî5»]?”q`N¥÷¹3™Þ¸v·&@„bibG‰ûTµ„tj@¾
+mÔ¦…`t¢ÖŠVâ{ùÔP„m†1x=™vw&Ÿ)¢Õ#A¯Æ«:°y‹,7ú»ƒ,OÝêŧ¼Û
+çó–Àp6(5-9ÿv—ÒÛ)Îr—á«}9$ØBiw*¼’«ª| ÁÅô©
+kµ]‹êˆöÈ8×̵ÎòF¼~ŽϲF4Iâ{7öF7a³þyIEô›&®¾0A7Šð,%N?*“ùЩ"…|dKÿúNÈàœï ¨Õ§ß 3ùFCƒäR©ÿåNH|êûk¤¿Û<±Ëž_yî/ýv ‡m¹½lK@”tÊ| a–.­ÂaÛauÅÇÛe»2žWp?Jè.ñÈ)rcïeñL%ˆíÏ£æî“Á¶O…êŒ-È›X'ñlÝÞOéò‘gžŒrÕ5© ó<®¬é9‹VD„×°!®¶St~ulZH4Ñ$ë6Ш
+(=ô°Ž(*A 5<Q2°û~IÏò¶æªPù®_§uÂQô ´¶¥šî”PpM”K-ìÖ¦™2 òÎh‡Xm‰Þ1¾AÌA]TK§!×xàõæ¡—=P44„¨
+†+ôh*ÐÕœ•;‹ÖFȯl
+«ÀçëAsÿ¬ËNLÙWüÇÇ“»Äuœƒ½3•¼?$ìËê˜ ÙI\»Jz‘˜‘5 um0;ÓŸïaP82׃ñ¨¥¼ç‘[éÔ;Š$f‡+ÓmSN›7¬):Ì4þÞ¿ÜͨNÉÜ*]œÀ}Ÿ!2G¼
+€)è\Ûí‘érw0…¨_
+KÝË„¡a÷¶qš¾1[Ig¤ N+‚9£¸’t[>~Z’'&ÂÛû3jZ¤Œº`»ôúÜMGœûøAMs¤FŒ$¨´î‰ý3Ô¥%dž÷õ³þôø ìˆÍ”à ?£Fµ³bÁµO­i-……[µ¿p4CFàxõöz®r'cÕ?Uæ^ÁĶÈ_¹–´çé­(}:€¦~Øy™Üf„|õÌÓTAhÚ£è_ØäT°§VUê¼gZòoO[e A[R0Œ[Ÿ™è¦%i<!Pé“To "Ø$z—¾,¢¼ávõlƒ÷y¿žŒ*lèàŸd)@Å¥ë\‘ûû:®_—‹ë£‰S—ð6µ`¢ÐŽ|ßyzXZy–/; ¸D™85M†j “BcŶӌŽl¨ÏmöëZü°á²8u»G6f™qzIK9ÇoÝòf*y›ã؉âÓYöš™ƒ¼äEÃÉIã¾Ò놷g//%¿=ù?¤‰„ÓÜ0f]ìl´—PÅ'¼ç×â¬hž3iø˜üÙPƒº2„z3gÁ
+Ë+0R”;J¼xƒ(ÙCŦ>Kàg´ ~¯zÒ6'š¶Ø¥_T!n¨á’ú½fp¶F ÉÜ{ˆÊa3Ë^ÍóѯŒÌ%HIvXÏ´yp3¹‘§Mè6ÏÔêVXþðŠÕa½6<»ˆâþÌÔnKî©Foœ6¦@_ýBÏÈ;qdf…ù¤}kûu#° œMÄåìÜ¡&Ù0W4ÂÑ™L˜´jtŸ¼r—u;戹_Þ^ÅNÏ¢i¥Qºû• [ëûý¹[úÀ ÒŸ‹þ†yU%9Ï,”ÙÃ+©¥¶+W¡ÚRqš<Š)|yºQÜË!ˆëŒ]ñYô½KjÀ4 bè`QZ¶\[ë)À͵ã¡ïIx€ò]üبõÎÙ×NÔ~ô¤ø,Iv4çÔl.ÊÃDZáts#ÅØ ¡´ïÖŸc9ÍþºÐ4{…˜Ò'åMFkÊ0Y¥–;×Fµu:"Ο"Ì?!þa÷Ç’yVÿN.’“†%Æ^¥ÍŠw cÚƒ9«¼Š(hÓÇX!ìù gmµÿ%}ÞXlËȤä[¤— j/k¥hÒ/ý sƒÁ.WJ]:ö
+—þÁDX¿ŸÚY:¿öŠtE ÕÁ+ct¢IÆÉó°ÕeF±º2ÁÄgMŸJÁd1ßY÷ty˜D±©BÍXþP•Ãlã˨•އÉ:J/ñ’.ÛÄ–4ޣɑ8V€Æs_eÓ3µ&Ü\Ý —‹L5Â[×Äîr:ĵmíP™4´f’gsñ¾ÇADn²Ã‚mš?†¬±ësŽŽ=“uÖíc\ÀɧvÉ6
+jfa†ú¿0ù~0êî,Lý44iñ‡u…(ÛÐ× »dÎ~^=ïS/TË&m~sŒýÁajž3Ó¹kÙ9:PMc­ŒLós "AG• ÿÍ•¢™oÞZ™_==eeçÇ‹D~:ϽHZ’Á{GÎlíÜïotY/!—ÂC®OùCîHFÒˆÜôXn$^/
+å1׿£=å#ª=”³Â®vSEû§EN£9ŠßgÙÖ£„BÄé¾U£ûÝÒ[1C¨ÞøØ’3Ú™ÍoöCVë¼QÝFçmª‚÷I7-ÍÃ7yå<§AÉÒý4õ'z‘j¹üzd¬¿Ïò«=z΢Í8I¤9©âN«T÷ ÜÚ%Ó^mÐ
+DNÓ^Z76ÄMA²¸®ÜZ0yIF2NÞ`’¿‹Æ"Ìb„Ÿ3ZöÕ¼cqÑYìŠjƈIhý¶jÞÓpÊ+¢„ÙðÆÎ*Ô²‘`ðbý:£`­™Ö´¡[Qㄸ¾ôX¹ëÒW§›ê™»—Ù0HÏg¤í'§ÈÃ¥CÌöõúã¤X#—‹좄U_Hr×g ž¤ÊÐ2¿Oò+¥^·­o' ÷å+)»oãRÿDŸAÔO.tˆ<­º˜5DÓ4ÑzÞÝš¥ú€rÝ÷kÔNtEƒX”bŸ™ž$ÛÇB!Æ`ІŠyeø¥¥ýo9âÕ³^QŽy½.ä‚p x){’·jÅjaj@ŸCÕü:ÑgŸÅV߯<¼ò@ÑÚp œÚ¯ZUD䃊\¥¢û¦õ¬ÊaiÒ" \Ôb<Y½Ÿ¼ ¡3UîÐú+Â$ºŽoXi¿‰ïúq3¹B¬ ×YŠæÏÄ5->±ïçc· cº‡ˆsÀ4¬5ž$È¿ž;°ìë¿l÷ìŽÕö4ÿ„©ŒZ K±JÉç•^sú¹÷¹ú†ÍÝX(
+ï*PaÔ‡Ä;£´¡GÆãÅ¡ž´6©ê lB ¨.®ÙqË*ÌbW}EÙ—M8¦’êÌ\Hã±éðÐ ̲>äÊ;—>Xõ†ËÀAQlÐÏNlªÔƒÞ®£Àë0Êh§ç‘pIU<í §“}·xõ”–fü[ç*BV,˜l¯)Î…ªÜ0gw"Õ&!ö»úB*¢j‡Å{˜´¦[‘$‘h
+7fOö¾B^ß8—·Qós,H(Pæ"T¶n¡%¾#%Œãp¶ç÷uKÂkœ.|ÝíP¡tçÇ敯¯ÁJjãý+6©^-Q¹ÁbZ8~úL`zg­ÈõêGb½J<!„G碱pŒYê7]ºY %øŒ:â_—‹Ý›0âxqªUºùš)p‡A'w “Ï‚ïTx#¬Âëé½=,Á!¼…n•@È]P~Öè(M/_cá£8±/o–Ÿ(áë :+¹‡Ø:YÓ”‡_ÍKeÞ£Ö]ëaÚ]£x>M
+URƒèzb´½:‚.†:bã©É††Çk·yê›ëèµ¢JÛ
+”оYÁWÔp-Dä —K'»?rqœ7…l¾ˆ(±ÄÍ<ƒ mÑ¿Cæœ(¹¤{(Ýê}þnŒ;¢ßËÅd§Ù¡]ªŠ3yOH–`È;>w¢ ü¶s›?¶ÙG‡Xòò…ÎÆ8¤­r¤¢!]!)}r.úmӛ‘µ—68{óÔ¹BS>øñõÁc){Ç´ì<
+’€
+ó>GÚ¡+¹Ûí«×»:ì{¥Ë#ƒÐ‚¦„йèý-e˜__¼·ºZKi¢-»×w%Ò
+¶-šˆä‡y“ÌÂåâºW¿wìþå¨Í…í˜Öõ‰¿TOþ0çpÓgIS£»D$J¹î”¹©'ägPtÏó(òí|bH‚ü¤Œ§þÐØç>A¹ÊJðŸO´ò½ ƒ¾º(Tðžž!ÖOèïngZ5¾Ìïªedå'4RMjI§V³Ýœ³ü˜ ºÀ=q¥Wñ• ³wvÎÛkçr¤§ßYzÚøÔ½}lù9혶†0ò©vÕ_ë.fº8‰Žµ"±ê>žÉùƒ-Ã,/A^­)&‘íMŽÅèf…Š)
+éÚOá]*AN4¶nZ ‚"oˆ<2^Hwµ)m6ÓÐ K ïü¡&ª‘’ 2NÕ8XñŒ_s ò0ÓÝ…AUòƒeóì~êE^ú‹çogÎv&,ìo¬·Áé¥KEp,í%°*ÊPúugvzŸ¿í„¢i·ë ÿ¤ 7âØú ƒ  GAÞ¼Ú‡­kH]W(ê½ðìõ`ç™ßæ?|àB0’œÇÀYpŠÇµ¤*¿ËÁªp‰}é Nn`õù„W$ í˦poïîÿþ–BTöÝjÈÝz‡çÀrèõɱ ¿Ô«cÁ¢“æ…‰×74kÖ¡Q…à‚Ì»ð¨Îǯº§¬,L ü³³Ok×èGÝà}±ØVÎÔì^4þÔ^‘âü,-+,.&‡•b
+2ÓK­1irX±áô ¦k¸ç-Ã
+9'ÛwûQ Z‚D»]xnØ/þ?PÃ¥ äªf(sèãÚŠC­I„
+Y
+ bx›ù:ý³g2ºÚéqÍ;Æ€4/pŸŒsçÃEžÁÐ…þL…^dÇþyöˆ_8±R]Ô–¬b ¿Õ[Ì
+jí˜/§³Ú-=Ä8j®õBãëÑšf{žŽ*ìwîf‹b£ÈÇ+MŸåNµäfD Ë:·KU"¬N– …I0_ãR¿aÊ”ÑãÁÞ“Î]'È0ŽÎí§„¤‰Þ5£cÙ,œâÌdn&¥ˆfÙºs¯/H"›ŸÙ¶LFÍü ‡î E °ÓXU×›Fãû•…uòSGðØÂv«±.+éúþEGǯ {£[Ú ªÎß÷À˜±<zFÖ"RÔ ’DuTé¼—cé‹ •ć–$sÐXòÊ 5DÇ?vª8WhsnÅþ‹ b±eŽ™ÆtN˜ðfþ§ã-UÔ|íõ‚as Ô´mþp!Ìò^ßú¹
endstream
endobj
-1469 0 obj <<
+1931 0 obj <<
/Type /FontDescriptor
-/FontName /LWZFPB+NimbusMonL-Regu
+/FontName /RHWGIY+NimbusMonL-Regu
/Flags 4
/FontBBox [-12 -237 650 811]
/Ascent 625
@@ -7072,65 +9318,63 @@ endobj
/ItalicAngle 0
/StemV 41
/XHeight 426
-/CharSet (/A/B/C/D/E/F/G/I/K/M/N/O/P/R/S/T/U/W/Y/a/ampersand/asterisk/b/braceleft/braceright/c/colon/comma/d/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/plus/q/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero)
-/FontFile 1468 0 R
+/CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/W/Y/a/ampersand/asterisk/b/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/eight/equal/exclam/f/five/four/g/greater/h/hyphen/i/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/percent/period/plus/q/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero)
+/FontFile 1930 0 R
>> endobj
-1470 0 obj <<
+1932 0 obj <<
/Length1 1608
-/Length2 11011
+/Length2 11240
/Length3 0
-/Length 11835
+/Length 12067
/Filter /FlateDecode
>>
stream
-xÚ­weT]Û’5nÁ5äww îîäàpðàî®Á=¸»www'¸;÷¾~ýz¼¯u÷=Æ^UµfͪYk½É¾*(Ó ƒ b G:&zFn€œ¹µ¡“ƒ² ÈÊðadC #¶8šƒlD Ü
-ºþÓó±ÓÁÜÔ@þñâ ´ÙZm? þÇ•@€£`bnË+hJʉ(ÅåTâ@ ½@ÁÉÐÊÜ cn´q
-ª;ª¸Ú~û:dAÆÿ¹ø CHäp§câ`б0r|6F
-)3þîÉX”€WT·¤Ô™Ïöš›DAÞmóÅh‰Ãvkòñð˜e:WÑÕN&Lk•Á}OýÓdcL’tý(_%|œ8¦ÚOÃ묾¥Gñ–uÓñyÞ&^Þ|o»GSÎùöõÄ ·HÅ^Ž5cîÉž‡m±rBBñÃ8,3 „z«ª[¯¯ æw/Ùd7|¸F
-†nD”YÙ¯úݕޓ,i°H*ûÆèß`ñMtwqž>ÓÉqª> æ.j„Tcf¦:[Õ]Ã×m·äF\>Œ¢÷Vg²\ˆ'ÕóýQÉ:þ9aµo¤Þ#íÊ|[=9±“ƒ˜d™>T޶M‰ý°…m2ο%Hp5œ€C®Ù²Dµ³³G-3Þ¿xƒ 7An§Õ>d)?07(.‚ø¨ÄÇs%`9Ë®ê·[Ü“MI?CÒAL¸† ³…pZÈ9U)Q³•õ‡/ÇDö(]ămcVÁüõ”h̶® P/ö½ÝNìüÐýÓ;5Þˆòܦw½«¾ž"O‹d±3õòV”Æê~mu!$:ýuµ¹Q™G³í>2N‚——©.n ¾—Ÿý¸LÖ†²Eûû/ª&@õYªÃÂê½çºl~mm~U1>ʘwëñBú;®ü¤äU¸ßM÷¿à¨C×ÐY<­W‹
-XN3<Äù¾+ÀŽ}kËRÐUΪÃ;$õ;[×µõIb%ùQ+<˜(ˆ¾ƒúdÜ~ RxšÌf„’Nšª‘3îú=çÍJ¿ÔŒ-
-VêW¢,«Io›|Ç´Ô–:â•Ræñðzne¡u[è –è,!_ojÌ#m¿±Ï*»7ðÙ™ôv7⮳û4°ÎäNFé§q¹5pZDi3ˆKˆÞYŠfÅê © #ݪdvðyM â5…Ž;)…VÊWJ¦›Þü%Ýã\’at ¯h½Ù«9‡h˜ÃÞG´Z±¦“å^ßõ5#èÂ1£ÓY°øþÏÏí7Ƀ Ç‹DútŸÚžŠL‘yxRR±“†Ä+9¶ò¾ï\øi¥º|[(Þ˜sg€š»ïSþsk^pÕE”¾;€‘7ºOª ÙQ{[B1…Ìb„)Uô›“,O‚V…XTÆ"½õ
-ÚŸÛ¹ÉÂÔK‘ýœ©\ØAªîýG Q§U>Æö3ñÌÀ÷.¢åHÌVÝE0u KÙ/)ø_®WPÒsËt‰caSq³l¬ûý0fø‹âå-ÞO¿(>Ôsƒë¿Êœ‰ˆµ±ð_. ©©p&¾|ß®›bôà’Ã&»ßG®¦¾ú“^XíÇ€m<™Þ˜wvœ’#
-åÔÃív#"ýìN¸”¢;“_x(+ƒ‰X=¥Ä»#3¾%3ÆO»Ã`
-Þe¢Côf¿Jˆ§!/i9CI‚s𣌼  ŒîŠn2y I®yp˜š«4ÏȘR”LàPj8¯`¯!£qÊФØ2,¾ÒD§ù·p…§8_¬5~íC\ÓE§?é± *Êj­ï¨¡xÎ+l\÷ˆñÒpAévî–¿0I&-vS˜6œöt…túeg¸>ªÜ×Eæ˜âùTñþæe*uJnkC›™ªŽoÁ\64A¢­!î ý˜óbšŽT ¤BQÁBÅ1t’MPI‡ðvOQ—}+¢„»º¡ÏÁúõ|'`eŒT Î-˜W¼ZK}GìU .[”Ðèý®9ÝúÅø4ÈaUå?9)§=ÎËÐ/»A+ÙôOñÌw¡C«HŒ¼cç™`׋8‹sH^ƒ+½V‘ãÎO—ùLkº8ÊùjðS£]’žÆ$–•“ù<èâe93-<¢>VaØdňPç>?2À”™¾A‹!¼z$øÚg!¦ò²GßœsÍ*…b¢¸-ç[F¹(ü­7¡ª2Ç>Ä|3ù‰õ0µ¥PkMk‘#L>‹²qLϦ-fhÇßaÓS“|K‹M ·áS9|ãŸD<#¨5È1@
-QÕq,RÛO>¦cB§Ü+ÆÈúÎ{ÖYH¸˜J'´.ø»„Q¼›h˜—…z4–xR+¢N‹Øï§]0>Ód} ·Lˆ9n”Øçpâàîé6ÒF'‰Ë­Uòa
-u†·né¼7G#ùP¿_Ñ*;F—/mžƒØQáv¹S¡8Û£888hÁ9½3ÖÎGÂòaøH
-,®Ú&´³ä¥ó‰TÇ”i ¬z;¼]Ôñëˆ<‡íô5¦».g˜?U¤yW¾vhˆ¢š ™u&¼C•ðÆüyfðKždÔÌ<®‡fGü“†}|ŒÒ
-ŠÓ!yÓœC’æºùn H¦Q(ê>%ÎÐ ª;¢HéÓu/ˆ¤tìEE™_Åó]ðlŽœtÌjÒšŸ7¼‡|!l~yœE?#?‰e’@#ÝõOñÒÿóç€÷È·QzØnf£G/¡N¢°›ƒµöëéJneH² &ùÁ4^j#/U
-ʲL†rë#RàeŽˆ4ærì
-œºüï[‘pwâJ§¯é*¼F™\ýµábˆ?{ì-cæô§¯»*«‘!êæáhSe†a¦}6þxýÂúS$–>m#‹|¿AÅÖ§*‘î71ª“M“v#9‚ÊfÓhA>öPNðìg ¾ÿS³2îè»±tlòâ…&ø`¥ŸÚÞRN˜ªÈ 5úœ÷‚ÙãAñ‚6=¥‘ ÕtáåFv=:¶WùÅÑØ±Îi ôßòl9ÇD!’Ìn3–†f=ë
-b¤Šw^âÀ[‰Ø@%†3 4Õᘆㆤ/÷ɾ`+ ßÛ $ý–œz»fÅÞÀÄjòñ˜„áùM>ê§é&*’Ùδ`ÌÂÖCÔæëÕ-ðA„œf[osuÖ¹—‡V£ô¢±Ž¦î€§Ý÷â,Î>‡:$Ûôh½à{ñXž­$7¨Ÿg\h¨ÀÈ×˲©7¯Ëh6D\äÒ³c뗖ݧ€£ï\7’b!õÖÍ/5¾Yô¬{kr¿lY7KN„c‘›n¡„-›Šo¢V{xø‡^…ˆõ}\‡V®)֓ޤF•ª+IíXë<»
-ê|–‹lžH õñ³{Ü¥£¡[ß*x–*Õh¢ÆÝÛ#ÙÒɬf# çw[˜_ ¤äS Ó!R³íÎBŸ>ˆS*B±I.DÑd\žôûTj÷2×€1ŠtgvüÓà|£ˆ4L8ž^ .x¾Ï´Ô°©NÏ´6 žm\®¥ÛÔÒ¬ DÎÌ`-¡•X|JyG`²3-ò›µ³ Ôü»Ô8¦¶ï¾ÑófòF‚Xïƒù6¸¸Ú%Í=›ÚˆÖ—N·áÁRªXS´ÇI"Ñ÷Ãnê¬àóÚeqסÝ"Ö"IÑOàA?z ¦¤N`„ì=/?ÙTo)¾hèÞYËR85dë\Ñn½ èZâ­\Ú×H›zçÊÔÌÆ à3zy0˜ºYöÔ!@˜>Ctîˆ _*ƒ
-;"ÕÓv©ÁŸ©$VšÆ |¥5µ9™xbó ‹¤jnÈ“ð C8Ð<Y™‹’*ê!Ô#ØÍ³s6&•,ãìŒÚ8‚ó¾Z F¶š*ý-`.
-G+™S¯Ö
-˜/œ¥éª\7À"¨Åwk—KåÐú!OäËì’žÀ™ÝÛ ÉD .ë8?ªþƈ‹k¼B[5oœ³êˆØCdžRª¯ò`±‘ëꉠó wqt'ŒgU3À<L»RSó¡ßvò
-¢½¯«½2ÉU”p˜ µ %®iö½ïý£«RO5__uóŽ^ —]“u¢àŸüÞ|¹ÕÑäÙŠ”Vô²S*2iÇVÎú‚Ðà
- ϱFï34ó«²jQŸzoôg–-oNèKô! ~dg‚ÏIÑTœ&IQAüpQ®óœKÃnóâ×w½08Z…
-±rÇ:Õ7GL‡š jól-ÃT´„NÔN+\x¸WL¥"q'pÓ—RL©G/‚Áœu‡ÆÛò3qÊ¿U%™ö®u‡Ûä«ú/¹‘‘87-#mI‘¸$½^…5ÀtúxÈø|ÁÈ‚|ø=ü¡”ü€rP ·±YgáqKš tìW„rx®n-2qÕ*ÈkPÕLt" †L²#0•õd=ìæu¯tº·ù–«‰¹”ÿ[yäuÓ›ŽÐNªÌ*k¦VÁqQ{9Õ@W‡Y|ðÅY»·ªøg®»ØäÈ™|Ë
-j˜_†hÍ¢0¿#;ú¼F¦ãâC¯× ëHa{"ôj+Âx¼µñúa˜dî¹Ht§gÜý@§
-ö"oìw²ñàã¸Ö¡mîV^Ñ^.4áŵü„Ìœïâf]¥!f
-—gI.¥s4äùuR݃§!šWÑéF¢0ÉÏuá7ÚcÇaï®QOºI±j¶Ù?@ä¹Öž¡
-f(Hرø„vG2Òôàd/d|'ªŒ`üݲ¯’§Þ¢  ™9‘Íîâ´OØR÷¹ì€q*}ÍÙc# ‹ l[â¸UÈo±<ʦ6L&BÒ¤Þco§Fϰ
- ´Ynë­øOÂ%~ýÒ!쨶ЇߤÆù‚87òé§tÖgzlþ¶/¡š1,ä׺ùA]J·eq¶Ÿ(ŽS$01mòº+R[;H™@ÞÀl™=»”2‡qÅSÿó‡àÁÁÉD7˜7|abàâZ¯0˜Îo)ËâÖªfƒÑQ¥•aÏ(V×V=Ÿ~H²Ë–¡AÎM‰.aЧÁ5P¡=@½|EÎä›è5gÝ–•ÂZø²fÝפ¹ßaP9•ëDå„y`貚x‡|tÒÊ+€kð-9–—xR­Åõ×Å¡<JJ³C½ÛM8¬»ZBv„D BBK± •³â$Gï ¥{Ñ1£À‚:¢¸ï¯eÕ^…Ãö–"c¦¬ŠÎ/JAJ; ŽkIƒçá¢'‰—•pM–îPbíóÖZs./QŒ¥óD»xLöINþÝi™¬1VhÎŒëÁ-ÔÙÈÌâU«LìW™çCº¸ƒ’óÂ)Ê:6ÒÊÍ#ˆf"y$í}2†îȬz~gÆ4OìÒX™ •ŠòÓãÃ×€ïä@D§qÑÂe<”5#àåý阣ÑÐ0ßDL¹jdü5YNlG°¬€žª–ŸU£ñNÌÓk¯ªÅ<ãˆ&âgŒ[/M`v¾°D=» ÓÇÜÊhž] \r T_Û… ¡eDá= ÀéE… E$¿íWi|þÉü:U¾*Næ¦8­—¸:z´+~;(!tòÐIÙFÄy·‰toÅ®ÛL¼êá¤:@¤…OD8¡ƒ=À¢*’?`³×Dúš6Ïë~ï5rºïÊçèþëQflêúw}¶!A#lrð¢SõwT°Ò€Á?{i,_ýþÈ$o§"¢dµ·O$vÌ8Ûas’OScbÿ°J74±!`Ç(¹&_%aª½Ä±4U÷xÇj˜BJ'D)´µ²Žú:yùfw›¯ÈÎîÂI1ñ»0É_¯ëÓ˜b: ²UI2yò.N,v—l /¶oþk…§ª¸
-“·ë»³†Àº<è±4.ÜrãŠà8Üx±š1dà°‹3-/Nò¦ŽÈL6äbnËg¤XŒì^¤LŠ#6ÂWèžô<Ù?@^suµ¹›ã`ˆ9§„P×W¬¶<ÿIlìçï\¯–‹*U÷¦ÐíÞÒÉo?ÚŽIŽc1õ;’ÔÞ*³É-x+VAxøÀ‰‹]õ@¨XÝ5ÅÕoå¬L(íÜ=V’Ç6é1)MBAExÒØ›å¼32ŸvQD®Ù/¸-ïÆ´N>%2‹—þ¥V±Q)»Za£þ6wK†þ”Õâ-ÕŸ„£Ë‡K~K¶Xyö¸1C4j?ièQÝ‚êgDQÂó³.g7õu[T&˘7©ùPÆ©éYççüðb8Œ=‡¨^ÙÐx•'/DÉXdEÞ]Òôo'Aúl_,œÓèqË¢?K–íª#RÖß8îæ-IjZŒÞ—¶ãaq‡WôU<z\_„„‹›¢ÜÊ3f¸”{—ƒ\ lF*ÒZìÃ7Õ$R­ŒÃbD¢÷1?M|ök’gd
-5{Ú+ [\ûÜà§…Z–¢¾ÁP‰¨áæšñvY4sRZÉåUÃ$%Øjzg[Œi{îã‘s‘¹!¶-…jlù=5ü¸=Ø6êx3Üøi©`½éâ½Fü"ÀŒNVtÏ€ØêÝ·ÈÉÞC"¿5÷ÚFµUÐ(Nò¥½"p{™ïsà]ÀŠñ’9¸6<lZ¶~È
-
-aÒJ dŒpí¸“7sòrÂ"›¯übÝëÅA[C.èD¸ïÓ@ˆ«ï'”\GŒœš5äøò¯r8à¢Ê,gw, õºèzLNpb[ã]ŽêñX‹Láï÷pÿÎ×rp·#S×uñ1pf©-H=$©>ùŠ58Øå¬›—]?œ í€1+ê1 ÖvtÊý³ž`U:Ù
-ŒØ;ëG(oú‹µ1ÄÂ×´²]tŸ¯mèe}¡ C[d¼£åQ‘õC0ë”Î.!ÓÚ¤¼©jÜô@RÑ3YãÃȰLþ›Îâ”i‹†ÇyKeæ¨C›pü° ¼è%ŸW×ÍÑ>;8«ÊÎóB¸ÿH¦Ò0‰¨‹8oRH”æ-yLn­›*ˆíúª¾éÊÔ×”‘‡Žü‡* åYž³’Ï+ÿºeì,
-ÈshìÛ6òkª¤9{)wúaqÜ‘žV!{½¤‹¦Zø›·ÖçÀøà ÜŒC«-â'úïÐ~i§¢ŽÏëÎ!ñKDLW¾=…‚vÞ¹¨s“׬ôÞ3³AíõEªBwµ‹íÝåõàyÅÙ̪s憈çtçŸ/ÍÜóWvÒ–gêH‚6
-_ˆæÚJ=•=mDÍÉŠÖd|ý«%ßéV¥ä‡ðm6ãÈIdN‘ˆòMÌ 
-ÕõlŒ^Í–èÅ•ú—‰0p«‘<­˜Tއd‹
-JQ¼WRÖ†¼ŸŸn™úg"ëÞo¥Ð*!ÐÇPó¡ÃðsúŽñË8œ)uEÍR0mVeÜÑ~b‡5ý•Ûšìu:«¡ÄvXÚ’Óœ‹th“–Ȇìy×Û’ü,ºÆ_q™¹²€˜e4¨s•\]{‘ó¹l‹*O­W˜3­ßüñO&kïpó–³ûXØ­e"m·Â,Zˆœ;ÓMòÑK6DÆïÁ·‡Çw¼"†‚%´Ì\Ü’ß¹ëð«6rf
-Ú•"#ïà}ÞoÝ¡ž”Ï‹evù†É;Çý=ëÏM€´^žZN‰mÉJn9ØLÍv¦y5Þ²„Ì(Æó¹ÏÜ~%*êÑio·§L ÷C²¾êù"Á”?®ò-Û—ß«ÞU›ä;çösâ6“¾@tspÓX¶TtSÓ p¡YÌÏÎßmTcSqï^Ù)X©Ðb…>~…ÁïAšm0››Äë˜6îšd˜®s½ üþ³3µ|‘=|ÿìÝ\øÉn 6¸Z.6ié
-cy •c^Ç¢ ß|öV¶suþŽ’ãG¨ÿD¶Èf=^8†¢’¿¾¯jXz._œ»oþy9›r‹ìŽ¥MbÞgJhËWjY›¶½åŽÖàŸÅT(½!®½‡ÑwèKäÓc0lF%*¸'Þe¿uhz‹hvœÓåÉŠï=U{Èïgƒ²´_\¹<Þø“Ž ßá?Y‰/ ÐùAÀD5Y Ì8!í,·>|_²FX¦»”„í -…„ÎÆ°w¡\IF×,è·Hls¸ ®:—SÖhGêUEWxxž½”&03iÝ:3eÈëÿ0y™òØ$éN±PêÑš5¸ª‹ BV ¿ÆQ’žÒzÉÞ¥éÃô8ßCìôÓiíßÚ13Ü¿,3ï(yg«ZRÏóîjéL¡ Nü‰ˆâ³ÔHÁÚ£ÖïCaØ{W{ó‚MøÊr⎅*Pf¨ÃÚ³ ²!|w—Ž3KŸ´¦éËýåaôÀùÆdžñìw¨C¨;ŸonnÐA¤ÍŸÕsØ‚’Uá#˜òœúFËæ
-iÙÒ´"Ì<yé1¬.K*Ù”³–‹ƒgrý
-+4ëMð1&}\/O㉥ŒL‡‚
-ßÌŒsvPg7ò¦¬/î—Õ¥4\¬ýyãâ»)X•¿âØþ,˜m WÁá¦å™\œ§‚Š?ÓX@õÿÙçCHtÕ±§î
+xÚ­weTÍ’5Ü ®www în‡ƒûÁ=î î<8ÁÝ-¸;wÿxß;wî¬ûͯ™ùñ¬õtUõ®]µ«{­¦"SQg3w4I;:¸2±1³ò”¬íÍÜÀê¦
+LâŽvæ€w#"•„ ÈÔÕÚÑAÒÔÄЙ$A@
+ áèäåbmiå
+ ÕTÓ¦c``ü—寀™×?=ï;ÁÖ–
+º®<ŒUêV†Ý £b”´cí(Ÿ³Y…õzܬZ»›£ªjFEϰÄã­.ðgwtîyX”·N¨þÀ”ÚXì6ôzÌêü£cêă»[šÞ¡þ¾Ž ˜®B†¬X*÷(Ô‘ÎY„"zšå>ÑfEl‰½•I¡]š´« 8?×9
+'9#rk,N”"®;$C2TD+Và»"±K²Îç4ªJ‰„ßADæûôÆÀ³
+,ää%ü|G¢½M΢«P\ö,
+HpçÌÁ,¡_ëlhÛNB”ˆ@ˆšè胑lV®xù> `ß³x<Û0w[.”ñØ}Ü–TX_S¤'™$CS´QJ ”?”kgMšfƒš Öº@§Úš–ãÃød;¡ÝÇ"˜ÛÖŠÖ•ÓüÁSÉÒŒ6«HfÜ]˜äÈ€CÑØ3‡Â…#²0ÜÁEyÄcRâÕ
+yË[Ð «ÁÊJw·«¿B¨ßjÉ‹º¸Åì­Éâ8—Où)t¬‘}ômÂn¨Ý÷É‹ý¦fzb;9Å6sèÆ|-Îý&ŽÅp¤ð¦ñåp.µnË"Ýöö.e¬,lÜxÿÂ,üµË­^û­òpðÜ Œ$òƒšÀ¥ˆí,·fÐNÍ׆ÜZæŠr’UD…M¢ý“bÞ©*ÙÚÍìc¡\ ÅÃLI_®õYë—Ò1§ú¢£ø·vg鳃@L¤7b{‚õ¹€Ÿ^ÆZòÂÉ-¾Ð¥îôK›1:+{u5ÅИÌW5ÖÀ
+ßf+Æ=TÜ$KCü8"ÿ —q…ìuu›ö·º&@ ýi:x~åÎoM1†Š¨®®°º”m, õh¾ó _yRî22èº{^XlÜ5tk•HÀèߢ‘ÛŒ
+_¶"»I Qh‹rÛ²Ò‰>ê…Vááàfny¾uKüŽô"©ÐhjÌ7c¯±Ï.ç~È“;åÍNÔmg÷IH½Å­‚Ú9n-òRkÈ´¤ÚF(Ÿ87³»<Ú!¥¸+ÓŠ$tÎ׳Úä+J½J42Z¶ëÞÂEã|ŠaLÿX£ÙË9p,ìAïFtÓŸ¥ÞÏk«,@˜â1àˆå,Db?ÞSûuêàüÑÂ
+&×Ç&z¾ ¡§Ã 1ÙªŸgõåS¡ºÛC­¡¿<Î,®ñgÁ1ŸÌlÌ¿Š8JËÅ…‹›R_üз0G'šåY$o“Ø/Yƒ£®s–AÝÜÙ¡7$Íë]ÖýðúMC°»f¨P+jÞ%µ&y"kCâw¹ž@Ê@¸ûRXhüÜ2*fꦧgâÑÎF¼EgG¬5ˆv§ä¢”ÍÕðæ%äPL×8`ÁÏÈ7&àûÄߺ}ïÇ;C¿:{ÁËîñ<TqÐÎr^¢ï>ùÚ¼†Ð29Ž%ãT4
+ÜAÅŽgÚØ–6lóÂÛ>’û±ëÐå–`H%%… ›ëo •è›!Qnˆœ[±»£çëÛoùíAž”ÊÎ/ìMβ¥É
+ÒDâJ¢RÑ.h—Õ7¸Ø1kdÏŽk½F$/üÓW1•髸L%KO“‡ìÝ ¯aÇåqབx$-ÄÊ)î£lJøIηïû[o+)£Ã_º0:#à‰è¾°Íÿ_rººƒ§£Çfi±0íñ£ˆG¢1å™jþ¤§á…$˜xšƒ-À(¸×æ:4‰è‚N8ôÔ93£Ü (ƒì„Г(‚§]]ܶ£æÙ«ÙË­ß;$BÌÞ¶üÕKsÄóñ`ê\MxâÖ—R!×ËJ‡ûœBÑÍ»`l°ƒªB@X<M¼ùS(˜BÏ>ZÖ×}ýÌGÛ¹sßqÜŸ7hçû[½æ6J8™’Ø¿S¯Mô&ß1P¼ÞôÉŽ_õóÖáÞ¢'—í'¶Çž”‹Ð8 ‹º‚W† ‹xi¾ÛÎtVK@ÚVÖS÷ø-MžáO¹‚ÙÞØì¡¼+–Bd¢½Ÿ…R¥ÆþÌYóè•ñ›´’;é§b£rÔEËyŸ\ˆÈð¢Â éå\5!'Ê$Ì'ä¶ÿÐë.žJ_q˜•St‚|ð³'ýZ3æy)AVl¡,N¥¾z0ÉÉ.² ›8æd‘?ËG­¥õ~pÔLg‚Ùuo"Ø9)|çÀtQ†ˆ°*?è‡ÛG$û¹Ýði¥¶' h«¾’rúÉK#wGg%‰&I°$NûÀ~
+€Bt?* ÛG€Jæë+šñb·Y˜P½9/²2¨‹zî0Cr<ÂE#Ï"£;Rl¾Cò!p«@_KkæKš² \Z÷eœUT ^†4‡–…†ØŒ/m#|‘i`óóÕF“Ñ>äUCLæ?=¶¡%Ù­?;jižò‹×|ãüu<Ѻݻ•Ï-R©ãK½U¦$̦ý¼ Ý
+œÍÖFÕûºH"\Ó<£_B+ß^ý-åO¨˜à²Òµ‰lØ+F£P&(Tbudü`rŸ-3QŠÄ5h*9è„ †þäW1!ÂíªroF•ñ×4ôí_ζƒ—Ç(•‘1ཿ
+JAö¯ÑëioK¿ˆ$äH‘
+œ«ºè1¶æ]õúF3QÚ–{‹£ Þ’íMª®Êu s‚ÜH}ä<Ho)Öæ[ƒÂ^à ¡RΦmÓ ph‹Úv"oøéRoêq‰ô6 ýÀEh<ŽC†%
+Û1aðÃ?h0ëƒ*.QJg^ÿÕDV4Ñ[*Èg£ õ[&¥Ù Eú×ãD eª±Žw‹NÔ?Zü¶{$˜ük÷te£›ìÅæ
+ušÁ0‚6Ëk÷§|ëÑ¿^0*ï®ØÍ;F—.žB¹Ñ€;|béP‚yÛTc“xxx!y¾¯žD6Â
+ƒ)‰•’¶#ÆíÎ! f°w14ZV ÑaµiöY);Í6ì¢Ç–»k †?dº2æ#êß@ÑG²{"õÁ`[èmšò‚SŽ›`PõÍO0ªÑgº¨&¾õârúr èÈù‰X
+¿˜ ?ùF–/¸¦J̦}c˜v<¦ÐŒø\Dz}Ó¶ÕÂdú³®t’×:èÖ„­œÇÒò–kd“$]uÒ/«4:6õUÊʲ…«Nû50Æk‡½úhÄŽÅ?:Ow(ÅØhû­ .\ùÈ> FŽÓ°á-ØA¶ŒfÛî5ôRš|QÓÃÐNŠsŸ
+|OcŸP¥³(`Pnû§™ÿù8<üÜøiØ~f½Ç(©^¶¸›‡³‘ìd9¯*,U‹ú–xš — ½Q. mIö»zëJÈE®¤é'¬¥øexmå_×N’‘>äUnd™‚À,¾þºHiäo=.¶qˆsÆÓW]UÕȨPõ¿áEÓC†a§×ý °K¤3§Q÷ ×éx#º 4e3ƒ&F r2®åFйœâZBl¨Çî?ÙB.'~Ó­J841÷‡‰O]8×…L¡ ÒÚ'XÌДü#`90o5$Ϻ_:¯ÏL £›.¾ då6bâÚðR^ ëœ& Åü¥Ì•{xD&Çî=ck¶nÕ³
+evv]ˆŽÔ𩉎b¶3ã+VqëzóÕÊ&ä bn3Ó—
+œ87ÊþHÄ£6Ý|°m*a½ŽYéVz‘`!7ôZ ޏL¦YK9”ªÕTQ:sÖûu†LZ–›ô³t˜ÎW¤ô~3}a0ß7¡­3ÀSŠnžH  r~Øab`ZÛ,x’/×i¢ÇßÝ¥Ø4Ȫa‰ föžÿ½B+¤¡ëˆJBϵ3 sr/C«jöKn>†áûÅŸþÀ*½³^öZÈ!VÉî<×ã.
+µ³qD¬~%¾,–Þ¶}ŽÚPŽXCL>çÈŽŸéL+I5OÚå¿!¦SØé›GA7•ûÖÖåfHÿnX ÑÒñ¾GD`Â…ÈÎZÓÕ© £Áižs°¨âç®d•ÕÇûýÙJ/ 褫Ñßá©r¸œ†žz±§ Ü‚¹êË[ôX;o‚ø+±œî{ ä(¹MFZ&n `q)„ŸÆ'Lå¿~s¯ i%-5ešÉt÷‰ ?k›§] TÍ7ÍùKÿ9É€U-)†ÔQÉ_î’&’[ó[§ÎZµâ¸Þ‰Fl¯¨¿A#‹{iêÓߪ¦‹;þÑK `ÑÀá¯bbÆM[£ýü,¦šš÷‰µ<‚¡šm'òGÕǸÛ;¦pÈ ”:9êè s;+ÃG^ä^+kNv ×Ǩy|ªSrðK›«BKô9VäœuBºrÑóZáRÛx_ïEBØúq‰UdÍ…P¹ãÓ¤å×¶˜G| B£Üƒr/V.®`Dï*’²øøÁ_Z÷"½Ó•É‚(Ú6÷œ yå~‘R9lÉd®]S»ïƒÙE09ÝÈ%¤™”%­¥q*J5Q3¹6aŒQ4 rf&ƒÓ«úøÈã^x'Y{ƒ® of+û
+ghËï'²P=lžSý–GC9„¦î?Ü/gÎt±¶›\ ¹@If‡t?sõ$¨¹$tóÙq•œdª•ôRzGÂM€6ë°Ì)s9“ÛQ_’ÃgÚ¸D ‹fn´+¹TÑxd9¶z·ÿ`M2ë½8¡„¿¼N[ \HíêMÍ“ÿ¼ÁX£ñ˜ æÐópèâ§:o2FÍ{ÒV€\ùu%Ìð1MÝ$g|ýf&Ô\KÕt¸§Ë Ç1(í eëäGBvY&Q!²R
+CýòiiãY…€§¹&OyÉó(aé&HRk Mm»ŽåtxÈÝ* ²˜*ý3¼2ûŠ;Z·ÜO2·fÅÖMµ(ø ?¼Ä*qÎàv)00[xBPèw"<>x93Óë™Æ^]ð&ù'«‰2ò±¸œbã‰Äd•‚CÅê¹ú\fŸÈ!½“0:7Ì èÕ™ìÜ)íwm±â­wÚR'­-Uf§yÑkáÜ‚d¸t¬ÚÅÆüðòTlE¾>®Äewîßy(O0Œ­º0}G¢Ï¥QóFlCÙ•m q(üØ(Ì—WdÃc YLDï×£ÁÛñƒ…­ˆ@yŠ^~^3ÐòßžgíV²ÛšÊãüªÔV⨸/ˆßúúØžæ•©5š\CÈwÂÌUÓPZ~»ô: ÷JxŠüà¼Õ6¬{_4Ϊ¾¿M½©&Ô2µc¤ÓÚ×? ñ´6àÜÙKõÈ “»–¤ÏÊ¡î˜u8˜—n{ƒ|C.¢*#À ˆˆ¿õËKÅBµrWÒ7%ÔâEq÷\wW”šnÕ¨Q—pe žßR kIsÈ"ˆz4me;ÔOÆ»½ ŽÒbaÆb2=‡ŸÕ¢…hï»’¾ÖiÅ-NýIºÿ*çcoá<1àŽ³ÖSFü°Èn«À<Jð\4øR=»qiÓÌ“)u]†¶PåÒ5ˆ þ]ü<àÙZÔõÜmå’³îr°M»Ï„®FCE†C?ŸwMâéÿý]¨Ú]îSÉx»öæï? .z~Ï9œ Ù”„Í­µ3›õêV­Ý¡æƤZd áÚ×?Zƒ×(ð¶o˱kœùÚ¥<ß„äpä#æL‚B‘MÖ[(¦ý
+rî›Ø4lR¬ ô?,~¾§0ÛþâÇ}Á™PšâqÔÉ 6ÅìSç²X‚™EúÈ@`
+Ù ,MÒ­„¸?ã²Üä®Ð¸,Óè~ROa¡à̸‰h‚E7&1õ –¥lÛ#¬Ê/IóŸÈÌÈÐ߆ÓÚ‚ÎÌ/
+MoDÉë$Ó¾m™°<ï…=ÚS3ú‰èD:·<&‘}hŸHÞ§{ˆ"´ô„ÉŸïv ¬6øXõþòi¨9ybe]9üÆ™)#ŸÅ Œ±cýIºð~¯É¯Ä;òg÷¦ ÆUæò.ÁŽúúg|ë*hMgaø×\OXHÕÇ¢Î(N|ŽéÊ…çè{s=-)á4rÔXôÇ០×CÅ[õJ/ÙtÑ´üˆ¥¶Uc{­_,wŒ,:dªlDåâ¡¡Ï2GNé>”дޏù!æE°&¶»¥[?Mt¨d®ýaÜò§"íDâ~}µ± ÑòºŠ*Àñ ÿ9–9Ö*Kù-8hFþŒÝyؼØXH ;†Ùµ¢}™6”ì›Ë6ŒÓ—Sù5ÐG;¢›—8=ú"Go¹¥ü†)Üaâ‘™)9°þUçuÎ ÍbP”#¬Ãa°{ðlï
+œ¯n-Ñ ì»Ên˜ýʉ¾?jÂ賓Ø@ýe¸}°ª½­ ßcº hÎr%œô ùcW"t
+øamÛP9(ªƒ6dì"tú‰^¿ØŠñ:>Éõœå±s”¢Þ •gðŽ(
+ðpÆæ:º¶†ÝÔ¬4٠Ͳk{Ru'äCB{á ]3Ê>dÖ'õTÜŠËÐäHè2…éÀ\BU ]¾(ƒ‘(8\
+^H9ª7Æôµß,ôñ2-™Óèsf
+O\¢¹ˆÛâ ¦f>Ñ*O ¡ :m]b+JèP¸³9ÚŠ|ßHë<§ÔžÊB¾@ÊŸ‚”Äb‡†áèhFõ)H—;A|Ø¡nÅAÍ Òø’q}KÙ&¦o¸ìê!NRwä³wlHE ܺ d]Õ³™ ‡ð)ÒT3útÔÃq«^~*Úµ
+_øÓÁJ³7àhM¥ÓAAuÊA*š·S=Ç~‚A¾h4€A•oìsc½ñ'$³9Öæ2wNâ<žu÷ÈBÁ}/iVæ¹ÇêßÖø.è0aè°6°Î|„ù‹ïQ¯ÝnBj÷°ÓJS_õµÑg¯ï‹.þ¨ù}¬üØ“©Â}¨»×Šd]-¼J¥XõE
+¿E~ ¬óìá…ÖÓÖ†­ov è"“|U¼[Ñ *
+Ý)Vƒå™§9d˜¦
+Æ/Ü@Χþ›ºÏ5ÑÝ^2;—Á—)5Ôª!éFñÐÒôÐ$q›K]‰K®Ü’ѸÅZê¸×ßj¶»s‚3|idm‡«Ñc0Âß4hò—¶bk~w=ÜaÏ  µÚ,l µå§tô¼NCÛÒß²íüÔ}t<,zÀØr3[NqRöwõZûàMmÝ´!·³ xÍ9)c~³õñ_vy âÔУI¹—’ÛPù¹rÓÀsƒª)ãò}ÁÐÜeìD{o/½UØ9)¡Nˆ/£d:“OßÕå¾Q»Æ5ÿ£ ĪÓiù¢'Ú%)¶Øã§õ²Êz-_Éê]¹õظ£ÇÑ/êL±yÞ¾îL/¢¯_YG–²òÑôŽŸR5ÂÙÍ;ßVsáËLY\t„hßäˆ×<òS©DM`¬^ŒãwáÆa–rZn8Jùáj­¶ö§Ìf¶iKO¾`[¾µýLoÚî¯Ö«qš‰d-'$ýãôìyÏx©Ô)ô’­Hc·¸ HšÈöVúÂäÇ(ÍóÅ]BY_BˆH¿†¹V†kH+HRUç ¦š`x`W5T½ì%—ûÔ÷·r’W%cÙ­xwÓßé*3“&~#¯fV›¸ aä'IÇ&¤ ùj»*ÎåèoöG¨˜0.¸ü‰P(o‡CÙE/[2oúýZÎ*bT„} f& #ëÜþŽ s+‹ùcë0‰,þ-ÈO%–Ú­ïèWÕ—æ!Vsš.ìâ©üpÙ[d*Ïu[UËée>¥9UªãE”?#“¥Ÿ†ÝÃ<æÖq‰¯R­]¯¼’Šû|v·
+)v?W*xîIÞ¤ÔÑDë‰tº¸aðŸÁb‹^Æ l蛫x} ”554 ‡È³µÿsöû´æó@G‰Ù§&Ò„jáÊî0Šø‚ËÔ|†=)Ì Ù̳.â_œÖd*MýŽ)WIb™óx–k®jtÿŒ ïÒ
endstream
endobj
-1471 0 obj <<
+1933 0 obj <<
/Type /FontDescriptor
-/FontName /XHFIVR+NimbusSanL-Bold
+/FontName /KYBICW+NimbusSanL-Bold
/Flags 4
/FontBBox [-173 -307 1003 949]
/Ascent 722
@@ -7139,74 +9383,66 @@ endobj
/ItalicAngle 0
/StemV 141
/XHeight 532
-/CharSet (/A/B/C/D/E/F/G/I/L/M/N/O/P/R/S/T/W/X/a/b/c/colon/d/e/eight/endash/f/five/four/g/h/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/r/registered/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero)
-/FontFile 1470 0 R
+/CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/V/W/X/a/b/c/colon/d/e/eight/endash/f/five/fl/four/g/h/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/r/registered/s/seven/six/slash/t/three/two/u/underscore/v/x/y/z/zero)
+/FontFile 1932 0 R
>> endobj
-1472 0 obj <<
+1934 0 obj <<
/Length1 1625
-/Length2 12198
+/Length2 12488
/Length3 0
-/Length 13041
+/Length 13333
/Filter /FlateDecode
>>
stream
-xÚ­teT]“%îîÎÅÝÝÝ‚»çâpq‡`A‚; îîî.!¸»;‚Ã÷›îžõMÿšéÏZÏ©]g×.9EE¦¢Î$f2Jƒ\™Ø˜YùJÖö¦n.ê&
-Lâ ;s ƒ9ààB ¢’pš¸Zƒ$M\ü
-ÈÅÕÅÌÙÚÑðUERú_:]­L\ÿÆv±þ€ ‹Os™Ûß”þÁ>h>PWk€+ÐÓõo,S ÀÜÚÅÑÎÄë#ö™£³õ?2Ü\¬,ÿK#Àhiâlntqù ùàþ[ÿÊðdoâèhçõÏmÐ?^ÿ©ÁÚÕhgÁŒÀÆþÓÌõ#¶¥µËßa‘s°
-6ÿ¿n™Ø[Ûyý7÷þÝQø/­éþ“s5ù(ˆ˜ƒåGSX™Yÿe´v‘¶öš«X»šY,Lì>ªõ]óC‰³µð£«ÿÀÄÆÊúo˜†•µ™­Ãßòsý ~,ÊSþѨt³(k©ªkbøïvë?ž*3àªáåø!îç¢2ÿÏÃ_qq'À‡‰ƒÀÄÁÊàýX»|<\~ÿMÈxØþë¬hâêlí ÐÿÈ›•íŸìÿ÷÷_'ƒ£‘r0™ÿuWó9ûOÃ_ØÌÍÙù£½ÿ<ý¬ÿãüÏÄž@3„å™@ˆMZFºk nÎЄ¤~_äÐWÇâz‚¼€*P÷—´ð-¾rã—ê¯Ì Süo­^ó'ޝ{Ÿè÷GzpìhºS€¹D~t½yèëÔí< ûA,†ÅÈé§ÚQ>—s
-›PzܬZûÛªj†E/0ÄSíÎp—÷tîyX”QüÍRëb±;ÐÀ0jòON©îÿÐ Œ v_C÷î2dÇÂS ¸C!SG8eŠèi–ûDÕšûÜ÷¼âÜ_ /cŠ×dºˆÔÃeOH'­ffþ¦-u¸X†£ã‰{‰oeæj!ïš åËkVR€û}ˆ¶ó)ýFæPõ…Üž#©2ß9öL'Á¹?©f=)—Y!AoÔœ¢%n³§ ¦{ðÆúqŸÜ4G ¯øëªC‡ƒžIGNžà¬J4^,¢.q:üŽdªÎ¶¨¹ï³²†4¾9ôW/V|Vcoâ®+–…'î÷Å·?ç|[L˜&Ešý×mÂDdçuüâú&o3«
-uÐ
-è±§(èòŠgqªnu„6›qÐ2O°Ó‰êˆ!rËËi†@‹´pzÔX2x­_ç€Yèós-/j½Øô,½’ÕF炸ßitb8 ®Ž0Á>©W˜–ÏR^o7É|ƒç²Étî÷ *RÂà©8€H{™6Ö×ÅÖ_Ó$÷’½£ø·W“R.¤æÛ¼Y6¢-°W¿èÃ÷™,!ËCê.A)Woòþ>ÚÔéÍB^ÒQš2Æ'óHŽUƒC±Ë
-»³«\Â;Ï´¤
-ÇTÞ7‘KZÑã⯾?_©*»Qbüý?³Ý͉›l£s½ „m¹xÔÃ3CœÉxU9Ÿiö6l9½4¬¦@ædhÞªB›I4Kôñ®xKSy:LöU½ÔŠÁX‚Ψ`k?“.Øe>–zÞøR¥xß]wö 9òÈ„n‚*|+U¸0ÖxG¶(BÎc>íDÉà“#›uvÛ¡Ñ¡„>«´îà
-mƒ2š60p‰ê)xKXÖ€rûŸìeô†Þ}ñâY
-L“_æ5¾Å?³õ#nÄ+K”vÛ5º«%‰ÑE%FwÍÔÞ0Âç&VÌGS°UƒûË(LýÔt‹í©WQ¿t þÊÀnÑ|º±Å¸õÙaóµê·BWó+f[ÖöõÐî WIfæAð3­iIãٌٲգ½Ûmaå ¬èÑtg}eí5<"‡ €T I¿7Ê™™Ú°¬›g¼SôËî² .~“;FG곡óû…m5‹¥¯6šlŽL?aÖ•*‚x€¿}±“žÁ¸2ÿMÉÝêÜX#-)Bü ­"xÕž“ac~߆\I¡O|ž,ñ;†¿bãs
-:\d3ë„Ü/ÒèAJ–2‹ ª¡rásñçS6›Eø=h,)óýWNuþã1Ê>›{Jÿ5›–-Ú#güw^R
-¬µ«¯žùf ˆÙìä„”­~Í¡Qû ?%WTúAB$—Gåõ3y“úù“fÝbœXóò`Ä6ãòžÉÍÕþ#Läázœ6Ó¢ïB˜ÃäÆ"¿JÛÚç^ѽPj}2•ctpIª0e½ºÂ0´åTIyS¸Â.µ ÅÛxïù¢ô@¥’n†XH}¡XÜáØá'®»jS¯?+ˆÒñn7ŒÍéov'­á<Â
-.}XN-w7’ŽºWÊwrR¹ óxÍuõüA]{ß UcˆLÆ€pàï½x‚"\1¾±ÅïÛ8,ò&}ÚJžnÀ: UºÍAïkFâþw_ äp®;TûºúXÔ­ì=Ù•»c]ù;ÃÀ;qÁ›ÊÏ¿Á HŒ^ä÷\D"žPµ¤£wQ¤ñ_¦Í,´¥¡\TTÀ’γ…WÎ*Õè¦ä»Á¼$jy­Ý̰Xä²4¶þÊ
-•t‚áæøÎŠ%•TŸt©ä£¼c
-¬bwà'bµxn¬*ž jÄ 77Nøs1Ñ€RLIýùbJÞÜ´E¿C¿õ³f*7kLµ[]DÙâ’>Ru°é³3oy¸0œpaºn>ªyê€g'î`\o†dŠÔaãȨܕцP7ú»èµØÖyØË² úÉÃ*–bS>ß"ÑnsñeÊ †šñ›íð^}Îyzì‹yذGSC„å…oŸq$‹ä/bç6ðGå>'nh¢~\±M«?Æ(O$~pyIâ3éFˆ£ÉvzöL=Àì•óÅ?òŠôúÂm_QÂú…¦®¥F~¾N•
-ŽC°Î:6èÏMnæöV×+ÜP=ê5ÞÕõ?`9Ë¡{ÁN¸Zöbáp«îÏ<± û²~žúê›í²¡h¯4ëxùCž
- ·‡>Daù–žírË”;¿Ï~7U‹5u ¶èAì/ + µ ~Ùo`ï¿–¶vxÕÃy‹Žüm9ämë»w;•8ž$µý.Ÿ”s‚¿{æ+ªÛ܂֮™çkÄw¸›JÈ,íC4=§
-ÚiÔÃ?¹wpû v¯šåæÖ{øJèuá2Kîê_ˆè G¿\V™¢Ú|¿óÏ ¾€oßSl2Æ5ŠÀùqzE§¢«ÏJÛÈñ¤_ÀÉeÈCüM²oÑ%˜C—³…áó´pÀA’kÆ$—V2°Ýé'
-ÄN2Œ.:yó½KýØ–úÆ»¢Òh}ÂC¥÷€½&ˤÅã·Ž™ ‡ÀðÅgœçóƒ“&¿žÍìO%9Q› þsE`è­éºÓ㟜LŸÀþl¿ŽÎ˜á@ât0F¸ã–êâ³Êéi̼>Œ¹?X)—'réÔ3ƒAaxWž»™ÅêÍZÆ=³(F[šÒK·~±þ
-†þʼÁå…c«‰uy¢¦(»¹ã¨ÂH
- qÛ{Û²1™i)éËW‚þP(!Ü(SOðì0eFŽlשê²
-ã¯IU<`¥ÐG1¡"E~K["bQ’%É=‰JLž…Ý
- \;¨G½½ÒuLÒØë|•u©\.á)¹ã-KCøÆáh;E~"‘Á¿ÜBŽ”M¼±1ýo*s7ð›$ÂP¢~Tž ~Wƒ¯œlîODK™ÞˆÿñIƒ¸ƒŠÅ“é›?¥ð ZèŒ}ÊœmòŽ^Ü¢öÆÏ)–wYZÙÚúCanÄ<iHÑ2ä"·šhé$ŒF¾›¯éPÚÚhâ÷áÚ‡–tzú¿(BH_:Öß&Ëü•À©ûFq1¤[¬1 èO°Àrskz„œë±½[ß%Ól®÷ƒQ™FÚvЖ%®OðkÛó_ !SùÊQŒ°¸ª¢9¯”Â=ñ£BTÜ,¿5Õó+HîuøèÑ{ü”;Úc[å· Þx×÷/*­sb¸öKÚ,zærY"L&Μ<·ùE š«_IyžÀÕBå/%Çë<ºrä˜1ûé>“sÞLXi\&ÿrÞÆAÍÇg‚h`&p´É˜„J™*…rfº~ÁÔ8D!™uY_0 ¢==a‰n:ÑÀ×j…Z'ËAd¼H³’®C™Q»»‡Ú…5Ø“îj
-JQì×ip1()äÍ@β?Axùð‚è¯ÅWéÙÊŠ%˜üÔ~$a¡()*Ê:Ä©ŠÀ£«Èë°b¯¸»ˆ™ÇÃANžñ€–b—Ì’~—%_±ÃÑ-ŠbŸ.»¼Mû¶X†ÍïaÑb±6où=‰,›¹íHñIxúrXÁ0‘êRHI±6÷¹:gbÑÃü…rª–g U;»™IáÛ£:¦ê«ïFCˆ{^Ÿg4jÏ)±6 ¡4q?ýL>ˆÝ×Ά­„ãÄûÆDm•H?¯Îƒ^”z¾@îd{òª¤Y°ÌP„i`rgJ{ª±ÑÃÿ´¨¿«a_mîy,ÒìKaêýaFõ˜÷bâx·nÑ«xM\gå‡9fŽ 1_;¡Dì,°*—Yþçk§qN›EàÁTc µ!Gz×<iC,¡~£S/‘ÑPE
-Ê%»VÓå¹c\‘&šî~í~EÅú¯}¼‡½;µ<‚Z¬4%
-RãÚtZËínå« !ø Ÿ wï‰S¥´²qüÏH(ܤfÜÞbØ(§¥ñ‚Ïm€9öíì‰äÐËMž¸+d×dcß’ö?³2ÿlm¼~to¤¢×u·"þYéAøÉD±›ûëØ@\åçž)£M9Ê»½í’tæ>er–á³<úœ•ôñžœÏ$:µ}ê‚QBü<2Ø#í²Š9pq¢lìóÄ?GH?×e:&Š!º±å¾û_wJE_Z¤èÈCÑîZž%UX2'Q§4" HßÎ ¾ÊûɶÝ+¨"ÓÒý> .xB(\bXj’ÙsgjÎøñm£®‘tÙ+4+ô†[¤õyˆë€»‰p}rwÀrS£ZGä0dÒºoSe9¨àjÀz"öV€˜âœfÒ ±Û+¥CÍ'ÜJ\,ÆÀŧPÏ#…ß Ì+Ö:¯œ¬ÅØ÷âex—w¨ÅX…?Œ&Xp»¥%´"ÒM$±ú
-©‹WV‚»±gú©×©*¬|Ï% Is¤׬Ô'@ôN,╹7‚ù!ñgOÛoÑÈà Å*°_Q ÍèÏŠŸÒx÷#œµ.÷Ó2âØë&æâfÑÃÏmÚDÈæUCn?_¹> ¹exÿ®Gγ7ýÄ—þš³ú< ç[C\¡ˆKÊkï R¾(=Dñ©¶oV@~b•Ä£ÈÀ'~)Tö½¢–“d E$úôÏL°Çªža„Š^°Ãa¨}5]uGñ£²zŸ,ÕbˆÍWuŠ@%ÏC@é†õaCzŸmÕï¶RÙöIi7׬†×ÜÕÒʾ>ªßR_£´Í×¶ëƒÇŸ'éÔw΀Ó'“™2ø¶ùê( úÆí„ö¦+ÐÓž‹¶š-¡BÓh­†åVO(óR­+Q¦~FP†t°ið'û'þev­æ ‰'i12âþ<ÛæÐfBèe0¹(–4N¯ø%$êŸ?Úã~¿Tš·iÈÊ\ù²@Ž£u„ŽGE7o\Ò|'ßRäULï9V­Û3Vì[%t²ÁX:QÇÅýÝPW*‰¥¾@p@~ŒcV¦uÒu? Äx‰ >t¥œ‚¦—©f$ŽìPÒþÍq;I6ƒtÚ;ÁtFok­-›0½7²ž´_ýÉ!ŽôòjõÖÐ
-*2¿MÚáî0±µiÖ5n º0ODï™PºÃCÈ`ÆÅýª±¦¸70<ÖÉe—<·ÜWû²J6¯ *$2ZÕ'Ñլʤhµx§ç‘Và*üë%¡º¿cUÕ¿Â-e×<D¼•‰ÝÔÙ:Iþ:!¢ø½LTj4„³©~8(K§Â…4ET½²ôÜC Ù/9=Ážúäb%WôNÝÀæÞä–g˵7/ØŸ˜¢ÀSaªÙi†&°E×ú‚Ýy¢‰&ܤ
-•9DܼÉË]ÙtFˆ-,¢ÇÐb¦RœþÞ uJëgÝ6¬Y  ÷ãtëEÎÆhíadTfô jñ÷p\äayHlï[–U"¶Æ?Ò2ÏîtnÛ
- ›¢õ´º›GF’7È){
-…-¶ñ ÉT^Í+ëfvs‹_ŒUdV©w_ÆÓßW.qhn뱿;B ã”Ç?IH[ñ)
-h¬…•ŽdU‹v:_"ôUO_Å »_=ñ3þü1÷Pâ C¬5å<n¹Ÿ]…ööô“TH‘Å¢;’v+HíÕÁ{Y‹)€Çù=f@‰*Qó–3ðʆ³Yj±‰þ}ÈòzF ƒ93`Ù€á}ºZ¼2ÝÆcèLd[ÑèÁCq§`²‘Y{^³©ïàꩊæÆ<íÛÉübµ]t5Ré™ BíéQ¾Óqƒkôh±»²iož¿‘ ‚ »Ç5¡"×*uk»¬¬ƒ mŸmÍš©t"_ ¡|
-7QhûׄOòûNm»–h×t~âR~?S~k!(Mspc0¬®®ðŸÌv’¹Õý¾æ ‰”\R#r)€±\…ÜÜ9•IO×d{gæ"e«I¬àâ÷#×Ï@8K°RÿÖåûàzÿ]b†±+šU˜ÛÁŸå›@b6Ö†uYp¨ÖmÞ)0•„Çê"Þ†çý‚Ã1m¤QÀ­¢­ÕõëðS…FEÌØ]ã7ÇyéÎãM7û‚a¢ Èd´#ÓÎ<bÔ¸L½PŒ¶a¨‰†žÄ¯Ÿ†ÅÛ¹šªàî…[•‚Ö‚Ú§6(Wl“Û7²سÂóåE ìdpmÁð ‡TËØÇj³i_h÷ö}r<X“NðµÏf¦7Íë½K’¤Œ‹&›* Î™-pÓ‚)ߨe*è4›âðG=Î,B36£Úê¦(”ýà»”qî˜_ôr~rl§xwMäé~)’…Ç“"jA§Wx釯%sh87ŸÄ“!“ª(ª_"&';ÐÓ&³)!‘mÿ2 3ß&¿ ÍÁìf Lê
-Gš¦8wì# SzµÝ-M³±K?¹’|ãEw¡YÃ^øü¦ßÖ§isœþ•
-êMUËXj÷˜%÷ÓöΛw+ÇÞ]έóA·$ {Œß¿0Z…ï÷—>ÇY Xt^ÐÛ­I+RQ´z Š~ÂBHKnúÉG´ä¾À©ÃC‰ùx9<
-p?™µ±ñ{ †‚AçÈ“î”|_drHcï¢äó ¦Â\K²NëÅá;ò’̈¼
-†E‡êê­Ë`ñé…¥FÙ2@R¥×0JÓ0(v¾`¶,Æž §°ŸZ.Ѩ†‡¾ûP¿8zÏ3@×÷—âZ½H\´dm¢ãM€Èí8×÷•ûó±<LH”ì^ÏíóëiÄ¤Ü Æær¬Ãú†ôÿtìC%ÓÑÔrOCäªdU¸J}5ߤä¯]/BqÛÿbqešT¡…‘² .ôª¡Bâг:nI7Á…)±þü{¡UƒÚè-U±8#vŒÉ+'SÁ•ÏP;êŒúpQ·蹇:IøhubcWª£QÄsÓ v¶ß„¸ ße[? aü5bx(Z­â˃À3,&ÖÛÇ 3wPªm¿m¾ œQ"w?¢OHÖ%4ˆ•6ÛØ&²Åšƒãõþ1fÜ>²BlÛ×aÁR¡D¯6¦ð Pù#{ï ¢Ž\ãlrp„.™}0 Rk1çèÄŒLûöJÖDZv_+äûv¤Êv‹è ™d8÷FNë“eéY¿õMÌŸ­%Ó ïEú§SOZ¼ÁÅ$ÿ÷,O÷œ_Šº|œW·œI1¤nô¡ÃH#Ô‰Ü{Ú¾”¨£*$´§&Ų}Þx¹Á<~+Ï0P×MßÝ–Pšd}ìV¯Ë€AÄü1[]Ñã§_cÍM™»)‚­]©?/€Éb̼9}{ ±%´EÍü¥â² Å+Š‚âi†Šô–ÀU_"‘G+’<(e¸kËXßg¹ƒ —ó¹=îKt}·Ÿîb|Vý¬=Æè“Ÿ™ÿ^Mç}ìëØ6g}ƒoB¸¶ê2VôÍó²…E¸ª1D‘?ÞQ¤ü£góH÷°›ý”·Ð^¿Qö"H~ŸËLˆˆì¼pN„‡êžžÓ:sü`i|g‘q’i—"þ‹À8‚JaMû›E¯nµ*¬Âb•´,m@°´DXùIC¢¾ÓR91aãgÁ¬4pŸ¤ ºÊi‰W:SǤTgäœÈAY b
-oÖ²hᯂäÒz„" ¹ÆY×Zn²ÅŒëƒ·kë ÜER«
-ñըƾ£0¡Þ½¦–|7ЬOý>.Y›A§Š8QƒH½ªÙãáF%劖ƒ]
-—»'®÷Fú×jä¢ó>ßã/Qaö>…’Ej-Ýq‚Sk‡‰¦Ø! sƒkùöÕ€Üß
- †Š¼^k§*f·fÔ¼ @yü‰×VE¬W©Œpx~-¨£jbË ¼šÇHÇOA¯à·îåa½äjo¶/Ñ߆çòŠ–AFï¾·œâS¨zuM(\&>Ãwúœêš.É /)üJš;~Õ­ˆ-ý§v›t+ZË›ÚòâøˆhVÆ€)EˆOÀ'A—1
-Þ€ù±›ØOli¶9™÷ù Åq"ºÎ ùüŸÄ|
-v˜½+U¯öÙª_¼³V‘ÖŠa4`9ªÏä€Z•"  õ—Bš+¨Î&5¦E˜òÁ+Dsv«ÃnÈñÆMÒ &f’bNM!í/¶6ýIŽÑ(Q{P«Š¥¢Zbõ‚«8h@¼Ç}Šïã§;¦ÏÀ2eÃ)F3?UFñ[ŸÂ1AU•}5ì'ïgo'Köuš»|{ íã’ÚS1øTì2vK'Óç_c=©…!ÉOK¹ÉæLXmï§ÄÊQGÔœù15ï8Jñ©¿ÌáX—á&ŸP‡×‡\G¢üyÃB°ÙG‘¥L\ÞÎO³‹üAhv>¿­+ C]'0BStÀÎmš+\)¢ÛFPk¬ƒè,âþ&ÊåïŽ'ÌÔû Ù|¿ÛñÍ`?g¬š½|ë.ÜùŠ![;2LN±:¡`ÁdÞgqû£»›ú—ú¤ìD~ ÍÑD¶M x6/Õª˜†ëjE„†SÆ¡<+Ñeމ¦kËy—¤ž¤è·ÕÒš^)QxªÆ? (ªÎ³4ŽBÍ %¨Êƒ‡Ÿ]+\y?k(?×…-v~ëÄÏÆuÜ·¨Kæ¹ÈíþyÓY×è¦s™ÕîßÒf“Š›¼Þ)§'\žn>ÚQþÂkÈ/H½Î@Eú”´pD©‹Ãq¥µKÉæsL¼@9“ÚE3Ô´ZÏöùw4Zí¥»ŠÊúr›cÉp²fDð‘OÈÕ>fˆü- É®<åUµgCaâ)w‚'a–ÂkU‚úù¢˜G’/ÎNÕH n$kŒpÝ)¯-Ûb±YN%š<Ä‚Ëê
-Á©Æùý„;¿úˆ¼8óz¤%É:îg¹åàÌ\$O§^'a1^ôõ¥cY7?ºº.jH-›ŠÞº‹ 6OÔè—G&ÒÞ&gÌ
-l®ÞòÐà“ “?-É¡GzËp°&p¿6'±ª´@õöáá¦fç -  e›v ½MI0é’Ék’ëЪ¯` VãôÇOz(¦ÃoxhÈaOÖj}…%~¾!+°cÉLÓßÊOÔpÒ$ø‘hòÆ­¶†jèuþz§Ü©”F#ð;=8åÛi2œ ¬ŸéÕe¬=}ñUxÐTžynðöQ9°áuá7)C«$
-_@S¶HÐðŠãóê{ýµ]µïöýñ\´ÍMêE,
-3YPÍO÷[æ“/¹dƒ"ŒY£|©m±¡„ü5Z>ß½e?Ûyþø¡Ø^ˆò·`fãývü™hQ£'R a‰| *-ÈÛô`ª‘ÏW^ÕÇŠ\Œæ(”-¤†K-øò°LŽ¼ÒØ6 >‡œ®#"Ó‹N¬ý!–^ùë/Q+QâÄ*"Ï/G]J¤?¦ƒô[øvQã¥p¼c<[Nï ¶RÆa5³Ç-_¯Ët]ÝCW‹×rƒˆèASÒüX€ã1“Ò UØoÊë$+™îÞ5rìweùåÐñ¡Î ¿êvð²Î»˜oídi
-Áåëy&åk†òþ]ær½Ÿ¢·¼ÝÐ Ì„?+P_xû#^ ¤ ñÂÈFDª ½5¡Õ¯5¸7ÊgÏ'ʾ!Îó_êéùfØ'±h͆Df´»©w4;õÀåŠ÷•šÅ
-Úýqoܺ-$ýâWHGÕ§›fEÛ.üçÝ8ãWtn â¨ÿ!ó‰ÍUª¥Öù¬ÁÄT½Â†Ë˜œè¤>m|ºëž~9f+‡îF¼d—ØïRø¦Hæ|d™cr•L¥3|UáÜå—"ÏÏärø—_ÈðÈbk¯ŒÈâB/ñúV¨›ËŸ=’8×Rì†2‡Ç""ËŸ–,)}8aZßѾ¨õAäD%*æ°5,ƒÃبùéÃcÜî=k³Kå‚&uz턊ֲÆÉÄYC,°Ç„ú1'0ZÏ>ÃGùàÍqš“_<OÝÁc`؇(UÞ† qÙ*/d„ž…¸­
-ŸüÑÚ5!FÒ¦cR‡?Åýõëã|¦ªWAaH{Žà ¿Á¤Á¯áؽdø³=ÄdÞw
- ¦ìÀRÏ 9…-8®yù´7U£¯^úm>?YXÔŒ®Ù¼¶\1Ðvø Ü/Íä«cRu¿Ÿø÷ Õü ¿'äþÃùkÙëºá%p‰Ñî7¹çÐ6õÿÊëÈ+
+xÚ­weT\m—%‚»;…»»»»wª háîî’àÜ]‚»»‡
+ÛÛz€ e°Ë{H
+u(iÐ,̨wû§Eüâ«0y® eþ>ÅÿÚê¹päðò[ž~w¤Ç–¦;t–GäKA×›¾NÝÎðÄbT‚œ~¬ã}>¯¸ ­Çͪµ»5¡¦nTü C<ÕÎáw~O@á–€Eyç€âgžZÝö£¶àè˜úëÁýÍÀèðÐ`÷åÇÞß„ ÙñðTnÐÈÔÑŽÙ„"zŸ*¼cˆFÞ÷=/8÷gè+˜âµYÎ" pÙ3$ÒI«„YYW´eög+ptÜ# ω­Ì\ßCÈ»æÃøò›•á®öѶåÓ¯eöÕžÉí8òª
+œÒhOt¾8õgâ"Õ®!0à#å1+~ÑR´$lötÒt÷^¹À¹÷ÉMóÔðJ³ÞôL:r
+ÏÕ¢‰b‘õ_g"nI¦êmŠ›û0«jI›ÃžpõâÅç4Oܶqųð$\EÝòýbÂ4-þÔÑÙ&LDvZÏ/ÞI oúúc À!1-È×ó=÷¨H­{Š‚Þ8¿d§úFGh#°-ë;¨ž*¯¢‚†`¼D §G%ƒ×:ú†n¿Ð9ßò¬Þ‹MÏ¢Ù+Yc|*ˆ›A£ÇIpq€  ¯QiV1Gy¹Õ$#ÏeåÔï T¢„ÁSµ“ö2m¬¯‹YI“üìÿµ–”r&½7ߨæÅ²k€½æ¯ßgºl ¬ðAwZ¥f“÷ê`S§÷ò²Žò” >™{úp<@¨ì Í.+ìÆ®zˆè<Ñ’H0‰cáýjÛ1[ô¼ðbCPlH—Èïs øÖWðAlÍñ~(­…ê–ã”eHi¡åWP{CŒÁ]»OÆ¢Q1¹}ðŠ%ö+§^¼¦evÍ.ÊŽ _,ü$]RQ”Žôk—A¶²"§,Qs´Õœ¿&®°\í®±DñÊë:ZbY+v\üŽÓgú…ªJ°%ÁÏÑ€ív^ÜX¸…Îõ2,þËÙ½žúèDƳÚéäSï÷M"Ç禀µ¨ýœÌO7jÍ%š%zƒxW½¤©<&ûªŸëÄ`,Á'T°u¤‹6CYÊ<®}¨R¼n/;û„xdÂ6Á•>Uª\?yG~Q„œÆÉoÇÈà“#›wvۢѡ„=©¶nã
+m3›60p_5R𖱬
+3?uÝ;êµCTÿ.aâ«¡‚
+/ È]ðJz³Üõù4+[½Å8ªùô(Óà1w(ÕÌxlÆÔø»©D
+®}¤/¡,ð¡¿`yæŽ(ó¹³'òŽhSÕàMHmkÞ¥ÄI#­2!böÆÙ³Œ}Û™åû@`Ų†!Ü®pŽÚÊzl¼)hRµÌ?µ&%Ð\¬$ø«Ìtb$UÍ{~’êîÓ~‚KXåÇŠÒ²]ÁÍbÿ¤ñ™vãõ‚ì¯Ç¬Þäô×@,Ø
+¦Uoü!¡.ÿt옕¼1Ý
+“vëÇÈeµYmÆV7ÒvÑØû¡¸kÕ2«¬în¦,ÈœÌ:ÛBaºî³)U[!Zk“wá>aÊ<z’ï-c-3}æ×]—gìˆKìÃlðS{bRËO ªÞ5Ð='Z¯yð|clq\[ê;jâTëi¾}ùÖÿ}=dvx—W\SÏöõTÊÄê×ƶâaÂÞ 3¨4PlD¤öUàKdÅ~ç©]ÀÕÒE'û†…ÛKZäõÜŽL–=ÈK)Â囦{ÁÈ(ñT)R…ìý¡{ržšÉÞóõ»o’Ie¬+§"ÍûŸN3ò B·wÉ©°Pÿ(i ×¾Ñn›æ9•eþ„Ñ»¾Îa|Fqüt×¥[†wÏøCáe?ùcó—‚rÇÖ‘í{ ú¡~U舖 “OŸ™Ä#J¿u¢iéݪIœ·?*ux«ÌGùfª7ã²øÐSz}ã¿ÎòE›(x³¦¿[}!pú Šœ€;
+?›ÞänÁ¯u†éAáÍ5N/õËT¡¦SJqŠ7ìÜa êr#µA˜D)PB×U¨¼ê¬ï2ð2&£Tê%0°*¼j^"Ï’2v7l„WIŠ£54ôqA
+ê"j›ã"±mÄT£k,? :)ˆ{9Ýb¶âkrƒÕpŽú³ «h<Æ%¦ì¿DïŽ~²ÒuÎk»3•†¡4ÓbEuKí óÐ(eÛÊ<Cí
+ÑŽ}» e4§¾œV +«
+Àž]©ËTºÛï±2"ô‰gz$%LÁ}°¥|,˜'—5J¨ÆU« 1ù£Ý›þ,|L¸³K9½߯Ös=ÃO¾ÁÑú¶ÂÃ@ýqü‡ÔŸÅf;Œp<ÿ|¾žšê—ë#À‰^tÓÕ"îAòjž"MW¥úèΗ^F¹E#šÓ6·&J IwÒ»ý',°çÓ‚Ùs_~zŒd;}e4yà¥?;ôÊ¥–B,$Ÿ–êŽÉ¨™ƒ±È=9ÜGÓa®Èåöà}uÖ©Æ¢ßË\Z’R§ôD?×CM2ô
+b˜ä ·ÖñРmàäÙüȾÑp3Ì+•PÝA!7%'Šnw‡ck%´aƒµ¢¦“½Yç2ïmdNO'õ(w¤óhMÖïÆÌhã”=Pð†]²’`Ø Bƒs I~Äö~ȲA„ä¢YvÚÉQtäÃ[8¾eú(|Œ>hœ6 ÐoœÏu`Dê2Ú´™)úîëIw;ÊæPÌ•fç04ÃÜF:ßÍ<ôsÜÛØ«£ GìJÐ}–¾>0“]&~!*U¼(Ô³æJzœÍ¨n!w³‡nì®
+q¹–F3ö“¼ýå ® “L9òuƒ 6Ãz¥€YØ¢ÔÌyËU]P¿+ÙéŸîû>Js…
+«÷G‹¹ƒP´h¸AX¸Ö‘®Ú—k¯ŸyY6¢Úh?ƒB©›Ç~xü¦…ç¹ÒPÓÁ>´gµ¼á(#8z Mæ,e•ÿÎV%lŠU·B‡¨ˆ¤Ž‚Ò íC‚a7ŠÞA-¡î@ŒÏ›á!{ÿ!å°ŒÔd˜žB2´Bß>qf3À!Ée 7 ÜÓékÜËʼn[åžSšÀ‡ ,ŽÄ×ÛnZÔ+á´Ú#„Tðõï0 }?ÓÁ·F£’NëòÞ)éFïÁZ”ÄïxEiðZÆóÞV¾íÃøP¯,L_‚r'w÷v³¤Ó“Û}Vòý»Y9횟¼<Dõ°¾i©Mðô:1¹8¬kJW0ÎZr†ÿB˜¯SÎÊ—µ¥ã •“˜©ÜéþåHøH½» b O ‡‰#/cáJWìžBpÕWÍüª†Ëîx´Eov÷…T ¿¶sŸû‡ë\Ú'ÿ¸ïx/|“÷wãÏ
+J±*#3þ„“¶u°Td<7ùz“›c*]|±-¾.Â3MŠ'ÎÙt :…
+Æ‚T jíxt¯¹ƒ”š§9|LؘÄaÖ„Ó#š$“óÍUî­¬<14pX7C3J·¹–Š–È‹ÃAç˲ÒUîpN\‘(RÑø 7Á=::ÉñHòrGµ±j?'´8Í\M•
+Jˆœƒ$ùÓ¿1{ŠHç­­ŠÅå°€ÖF.w×Ý[ôÑšR@µÍ(ȆDzÑðïC!S[kFhtš£1ÖEIðb_<o‚IM}%€»¹“$ƒG¦«ÌZ
+¨_´Ö߈­ýmf†_*·À-:¸K£ŸFšÖ'´ê;}£Oý¤L=ª¢ /OìW&Nø£$o®¯ÖËïç»êÍ!‚5mÈ>~0' "Iæ€ ‘ˆEä}nµ¾w'ŠdJŸ…d€pà>1¸ Ûª¤úá<ƒ¶Bôãá”`ã˜=%Œ=Ö,Ì­fjXHh÷µžGå¡|2'[Gº k»#UÇþ¡rŽì™7œcŒ1l€ŽÄä§óHa
+l L4°ìÜŽ ]”i½óc?-#e¦~&\ÆHŽ´ã'¤Å¢Ìµu )mŠ’Ã.¸tEçh~“ã ÑP¸…¡¯ç;ºm,%5>HÒᇱö å‹-Õø­ µßÕpU¯èbØÅ<°_aH>þq?ÏœfšÓ ^ïfZÜÔ¶þÖpÀÛ÷ƒÁÃ!f|¹WÏë£ç“~%Jf
+’¯zë#pv A ¹=Ãpøôd5ÕZÍtÉügŸÉG/¿ØšÇ²Ä<1h‹|=NrŽr’ܵîã¶Ä¨†I˜µ …ØÑ¬û†æÒãl2£à(ñnœî7ëQñ®äÏQ¤"žD2EMò¢íÎ>úÖŠ!­'I‹Žg èô«HÁd}yü£©F…£{gsÝ dBà•µéD‰näl|3ɨ¿hˆµ+G·.îpŒ­¢©|I?šçì`o­Vg1‚ñË®Ë;pùÌÃÁ0#[ÕrìuBÄ1a@|æµëjip¡€ÌÄT“)Õ½ ÔEY‰b4£yAG£P@HEaq"ænv6în%™É«¯–uZ# »VGòs÷¨X¾ 4Óƒ,°"{±Â³¦²™Ú¡
+é–¦TgA·™ãÖìêqeÉÃÓáÇÝ™xJá­Š¾Cì”Ï®›®®{‘.³ 1»(ö7épz°¤w™”y“® H[Gù™ðx-¡8Ñ Ð'¿À¤Kx{°Áƒ91^NU5ý“é}—"Äò•Ê*ng¯í€vx¦Ùr˜NyK»–ľ²üÐ ûöäÝ•>~‡·f”&ËȳÇ<øƒ ÐšgîÑ~¹íùõך™h_>W܈S½~M~•;aá¹BKD…û#.žÏþw“mÙc<b&ÂÄ ½I9kÔxìaó¬u9ùBÒs)4ÖÓz†ÝìÈ͘f“v!:XsÌS± És,Cÿ±Á¤ÉæŸIå§U/Äù¯ÝÚÁZ:! ¼ì»i\2H\F+¦š eŸÞº²»VÃwÓxd"u<—*Bág°û½À²‰¶Â<¶ÝâÑ«_*æÀS®X1j&ž¥ëÖÄV!CFWZÄ,ù§ô-~f"J8ÚiŽê#:AMW]êÙE—¯¾Óa+‡Vßyf{§½móPt}Hrs‰eüxbèÝɾ/¥3ÇÀ.¦Ê·“?Qx9æ!œSWbqNiJAUŒ’-kÇ|`½ùýäbqÈ‚6¨Í ôÀæ<Ø~D[¶nú^«Lq8°Û{fÈëán‡V
+$ebµ'¼øZjhNüy=VÇ¥Hj˜|*c)ÿÁ<–ÉÙükèzƒ$WÏNO0§t™½ f6ÅêJf*=Ïó²ºÍs×Ù”‘ñ•HñlÐ\JŽ÷Þ¶´ÊÿÕ†Zÿìð7—¡R¶€g}Yþ>ííÒªù²ØÃî5,CynÊÌíÁ¥ÃC%ZÚqêg!âóËÔOø¼òœJÙýZ‰Ö 5üÊêæ±G§µ«Mî·´A û97ZÚíP•=à[ ‹2Gê´Ì;ö04+ïÍå æ*FÁè(Ã"£ÌÃ…¶ž–ì³Öm ƒY™9%^D)J”åå)ë¤ÍºÏAm“¹œ#¤²Úât­ƒãÞoÒeGLòI<?¡OƒT/¬íÃHîRÈñ×·ÒxKÆ‹Þe•bhzPä‘l:Šøa•’£…x„íWáÓ§ÇÌÅ^ß?ÖõRJ@›Ør‘à\'ÆÁ<Í!Ÿ-íÐ˵!“t0`[&°ò~#•ØÄ-€ÏýLþg8šŸ@cÀl^óѶ5È[½ºrv<¦ß-¼»¼ºƒÑ5m¶§Á©~ÀE˜ýEgÞGwHøi@zë¼®Uµaç»%@Áarr
+)³¦Ê,
+ÊÊ&óeóÆõ¶Å…&f1#·XáΗ:û:ÕDé=âqïÏDvÚFº£ÁÏjn^¶˜~‚ÔÒX˜Ìtúí²Ô“Édéçš
+gÁ£
+2"ê¼01û§®¡ævËí@¨­?£üÛEW…чKÁ.µF¬³N{¤'Q¿Ñ0|¥¶vjΟ\gr˜ÎJÄØfe©Lñõð¿¦v)å@1´Ë~çå7ûŠBúʺŬq)4'=°[÷Hé÷@Ù"kÍúr{°´Xñ9ø³-Ñ ´wmI¡õI ¿¤qnÀ”ŲÝT‹I½àL[|ÚrI0k:åž&©œà½LÓŽî´Ÿ8mpŠ–Ïš‰yo9è²gE'Áè¦KnЫQ¼¤FO£W• ãEŸZÄ$䄨‡g·;~Ayʈ%b24Ô…j:âÁSÕòë~áB²U˜‹0™]q ”³¶T½ÓF{Yø
+}.Ëã qâ^}ðqÒ¸òL]¢cé}Uˆ7O£pîšÞQó'QhˆËÐÇô6óx’5Ó/%ËÎ:Bâˆ)ÎÐäcû4Nÿº ЯžÝfãÕ»js¯y 9Ÿ^ú&—†Þ'xv¹GÁ+äˆ<3òñÃ?cÅ•) ¯»G£Ä¥#vÄÓð4TNìêpßâ?Þ¤*;E FKüŸ+Àö¨Y­Z/KLÀL¿t?¿ƒú:mò\tÂï+âSFñDå´ÕÏ]&äünaBž°`µ3>ß2¼
+€ä°Ö‚Zcvgß…AãÌ_£òšÏ0ß¹W0oIk¤Z‹Ï‚ä¦ `ÚŦo¤QŸê˜7S×&zYYº”»¥<䉺ÓZ&éNüÆÓؾ¹¬·€]ÒùåÛôYEI-ìÁ£œ÷k²(i(C´ét x¹ª=zÍn ŸX+"~Ô•½<¯ÉuW‘—c⚉PcN÷Ž:b{-Š
+Èi!:f¨Úï_Tüc„ÔŠ£|Ö|2 u^o “ø 4ŠzKBÜÚŸ²ýf—Vìè¾­(ÙkJXµêï/1KÄÜ4Íâ=7¾›‡Úg:b+ù‘Ý%y# 'oy{{Ÿ!΃ౘ‰wÛ“g*SXÙw‡‘Òy¸¶õö‘€Ò½ x—+ÎüÌ[‹}c¸U2ÍêZÁ¨<(“k•3·
+{(ÕuêQuêFÆ.’S‚¾'cHúcNÖ÷Oà§fŽsž–£n& „ˆŠ ¨—º‘žØºg.0žM·<ãÁÑïó$6_÷$T…¶Ïsæ½j>$qñt6
+CrYÈ‹îöò¡õze§
+“á.R8ö}¥sü°|kmM2¨æöãJ˜žäv˜ÝË‹žókWFtW 3!¦¢°rÊ'¥õ¶˜áG²BeC0ÿL¢¥Þís”½j–œ.¡·Åebc°Ø!2+y‘) òwu_B›iv£ôÈ6ó«AÝî9d_
+µ=ì¸ýrŶ<è­ ñû
+ð~äœô¹J~“bžS÷e/©aÞ©1a™ãW¹ÒÈ©©âG]Zmþ“#¨/„A•ß™Ð4ž}õ"ï@c¿â2¡mEÐAˆ»Íƒ2æèoß ªç®.«6ˆ`[NCç‚ê'u_üÃI0Ê£ µhÏEEa‘ÃFù†¡37{8Àrؾ›ØOªgG"‘ãaE‹›;Kuçõc*<4Ô}r©
+›žáÊ›/Ÿ«Ôóêãƒ#âxíñúçxàÙ²Òš½PÈh¡®þˆ¡ÍóW™ÙŽ˜ì³"»Ók(Ï¿*Ù¬?UŸá†$…$oC,|có*•sPÑ5,ñ|Æ,Wø¿ KäMWË´Éé?Q12ý4ÔÊ7Ń;ö'6YÓ„»Æ]¿MgØv=dãô€Ý¬nžµÐfý‚/ j8ÇÎJÆC笜‚f:¯ÂL¡hxþÀÏñÖY.jÅŽ'Ñ„;‹³ˆ/¹¹¥p¾@ŒxXâî¸jC§x`Ä.û¸ÑÊmúmêžÖ¦á êÅïþÛ¯ñ±¯6£ ½¾¶áæN;æ}¥³±t¬C¹‚õyˆpÖ“>k©ŠeøF¯êHг!š§/Âþ°Ëd‘³GªœzvM%$a&°¿4– Ê6ú´Týjµaî® >àóK,9Ú XÄp ϪÙ^{š«XXÉ,y°i3b¾ a×GðáK–ùsþ ªÎvëìhëTøÃ4«ð_n­Àð;<ʈà‘@zkµW"Š;/mpYS0e$éŽs>Vd€Kg®lüó<ú :t$æO _¶éèá½CE‰Èœ޼Œ¶¢Ê¬8ÿ!†³šç×Þ·r«6ÆÊi©a‹vG—鮊^ߨé—èü]‰Øü–œE²¶qé3;ZoùxCÂ꯼x2ºbÆ\‚Ž­ÉâÎF˜£?VrÅì)H6â(ó.C=bÇooä,þ*_ã°gë”0¥¢Ì<ãf"•ëëœhvó¸‡ ›sNyû§·R0w¾ )Û â ÂJ¡­3Åù„¶Eßä<¥>
+Ÿ| hàÍðG‹òä+rsméæ`<VÓø¢[*¥ÈV‡àêÉ&[Qú-Ìñ±p±5Í=æûÿŒ¢³Ÿ¢Ä,Ç…VŽ.3‘ÎH–®;ªpøæ³¶¤ðö‚#BSÝâÉâ¸À§“Ï¿Cd¿>»`~òXwb25í[Èm…
+U¥,žCM©(¢“c`hP±†¹ß”ÇdyI2ۨij LÚçÙ¯/×™­cò _ç„þÝor§ó­ ÒªLñ˜nøFÆ)£ãT:D¶P€t>%œô‘ä<jò^‹å×x®{¢)qàÅN¯¼'j¤nž—æE÷4 0ºïtù[®óƒ«¹³ïÈÀœáb4×J@f~j %Êõä,f.›G³
+ø€±$&U£c*C>xŸŽÌôh¿©'TRRmÉ#wëÙ€£ÝZ‚Ã<é,0ªS[Ø !ù«a³êS..È%Õ_}°ë¼=Úkí´ŽwD ÞÀŸ\›ñS‡0¦±»3æ6 -¹{Œ,²>E|vÏ4`‡ƒ¢ N‹g<¼ ß¹¨Òt¬cà›Çñndá•»TY´Ñ.Š@kÌ"³UÉ Å:ìP}F?Õ÷Q±L¶7ûyΚ;r`lo+j’f›Ý kmGøÚôü“¼24¡ÛÅ4õf9Ž'›1¾©°jØøfIûü¸‹yŸL AïªçJ4¬j.4·9>—jÇÀ˜²“¹§Ñ°€8ÆLxö•/˜Î+ºT
+&ž&2N½Ï+Â|SÞÊìË`•‹CúWe‚Zá®\ů­5†h¥Jo‡q?‰;zôD¼~¢.Õ³0]¿Ñä3±·IÜõ1›—YGmKÛ5¾ ~¶Y肎ø,.ÕÜ#ž캅wmø’ߥRÉüÓN—Ÿ¢nƒHq]¸c¼¸%öq±K¾’’šs—»\<d¶òìÖ·¿±SÒı~TƒÝs"o©Ôl`KA§ßÞ¸®³¯Ýò ùéq(r#ÖÝÐû#*:Vm*zÚŠ^^j)Z.U«ÆWÒ\ÖFÕèÉÕç "=â²Cuh!ÆP¾¨bÌ1õª—Èy€ïÉê›W˜B±6wÔ(M²¯ðžj€ŒÖ<¾¡o>è÷ÛО,—厓¯åJ#‹ldÍkI¸$…l†—rZßR2QN\Q. ÑRÜnÍ Ë¶¡6"µe4jˆË°‚R¨ÞBÇ£­g5xÈRZ5t»QC»Õ¼aFùfƒâ€e¸ÍÈHTroÎ=Q“æ1£ÛScú[ngÛŸÕ ‹¢N\˜Ÿ×y?}¼,Š”tdLàGm¼XY4Y`YÍ$†”²UÞ:)=›s¿ÕK.¶ä:Fý=0}§SÙS!‰DT‡Y¶q)’,ŠÀÈÌ‚N±)jçQ:ÅÆô˜¶3èå+ÿbl°Î
+‡ŸQËF¶ZVtÑúŸÝŽÍ¢N”F"Æx¬mÐe1ã°ÇØG›Q»nx°Þ E1TšL“ÚçìDFh~µš”_œ‚ó×µU( ¶Í'öÎxÄx|ÄZ&h7pdÈ´«6ĉ՜#ÒŽ§£ãÚÖœöÔÕE3ë¿1ÃðUÑ·‰
endstream
endobj
-1473 0 obj <<
+1935 0 obj <<
/Type /FontDescriptor
-/FontName /OVQSWJ+NimbusSanL-BoldCond
+/FontName /OYQGMY+NimbusSanL-BoldCond
/Flags 4
/FontBBox [-139 -307 822 975]
/Ascent 722
@@ -7215,52 +9451,55 @@ endobj
/ItalicAngle 0
/StemV 114
/XHeight 532
-/CharSet (/A/B/C/D/E/F/I/K/L/M/N/O/P/R/S/T/U/W/X/a/b/c/colon/comma/d/e/eight/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/q/r/registered/s/seven/six/slash/t/three/two/u/v/w/x/y/z/zero)
-/FontFile 1472 0 R
+/CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/a/b/c/colon/comma/d/e/eight/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/q/r/registered/s/seven/six/slash/t/three/two/u/v/w/x/y/z/zero)
+/FontFile 1934 0 R
>> endobj
-1474 0 obj <<
+1936 0 obj <<
/Length1 1625
-/Length2 7184
+/Length2 8021
/Length3 0
-/Length 8010
+/Length 8852
/Filter /FlateDecode
>>
stream
-xÚ­TeX”í¶¦$¥A@¤Qº»¤»‡†˜º¥»»C¤‘Ni’nTDBú½÷¹¾³³Ì\ïZ÷Z÷Êg1Òiê¼¶Yƒ`Pä n.€ØÉÚ¡cU{!ƒØ(#­ €{€—‘Q²B‚aP9+$H`
-‚ß¡éj j` Š
-мï
-^ðr ¸¹¹Âü¼¾ÿ&æ"îÉêVH8Ø`ÂÅÁÅÅ ¸ÿÿÇï_’Ùßhä¡@˜Íï¥ÑAZAmî÷쟊ß0п_ö?ä?y€€¸Ÿga@ч”ôTd EvÿˆœIw'7z¨sñ{Ý‚¼€*X‡JÄšp¹åMu(GݘÈm³ç̾ó¯-¶íÁÎGæŽ$ÐqîSßg¬]yÄËL­‚ìÛAœæÅø©QÞ'Ój«Æ\úÛë#ZÚæE7˜Ôc­¼pì“ Ö€gnyd çÎ~ÀäÚhòDu($5ùûLñ{ç̽úû:¾=èÚzžÃ(ê†Ïô:À%뉤±^¹wT£~G‹ºñáY»ù¨BjðöÎhl™öö„ZHÀ–-Œ*éØãW&ýȆbIã/ÂeN»@r#~óTÙÌ“Ò Èû.k/rwÜOé™'7thV.ôAzaäžÌ>ü^XŒIŒH‡Ø77ªòéd¯æÑþÜåwÒ—ƒú§€W¶‘:%3íò϶¸ñŸPt­åìmXä¼ç ¦nÌ8}Hù³¯¿‚nI} 0'9õ»7àëñKÍF,HÎsô©Ë¥ŠøÀÁ¢ø^þy0u6úÆtvÄnÌöÌ%90‘Ž$:ìmÏ¥R0~Ÿ¸×èþò›ó5ÂbÌs
-êTyÏÁ”˜Wþœ!î¬.œË£ŠNÒô®OtCsXé=”qýq6‰Ï)£Ùz™ŠÂÑ®Ç?ˆnªH:L›oXðòÜÑ£b³:’S&N8Q§=ÍjL°J®ÈÑð;¿Ì¼`0xÔ“Yz
-•V¤94Û ¡¤¦²–—O1‹§)ºb‹'Õ(¤CZ0Û[ÁAº-,Úøçé¼ì·eëy’&»Ü‰í'Åtº¦ôÜÌh>®µV1Ý#бá‰z¢¤-¦èù™Û‹Õb$µMõãàÂ1æ¯/uA…¢¾iÙ9‚IàÊÌÌ[à¼Å{kŒš>G}±@ñèí+h—íð4Ñä%•'Ëjü3ìÜgƒC‰ÛGÝçã²ÑªÂÌÒÇÌ‹rÉWy2ZD ÷8_}©Ù
-“=]Œ^-Nœ^ûáu!Û›+/òý˜œóí’\ǤÁI‡×™äC…|axXeÀ‘7$KßNŒÉf/$…Æ$̓*“tAj#YwªeNMþô±ïÖÉp«4nê–Û Œ§R£ÀÏ ×*9Yµ2e³L²7øÂpÕ0å)ãsÝIþ¢²2XEÖìZ(£KƒwzŒBÙçY¸ß…ˆJÛg*øL-†Æ ÿJ^vš‘ÿŠœLÓ GŽÚ•‰»Â–§©{<œor¶z˜ .¹Mâ}üȪd²Àí†BîÎ(&«>“æTêýÁ]ˆog•’>QLb±®­ÅÇuÐŽñÛI \ÐÖŽÊBæ»åÑ 7… M<I’r#¶¤,ǾÙv9©¼æšl›BîZÕ#œôé#”JØ
-<`|ÙI5<ß#)™B„kï°ˆ|(?1üÈû Âà«X[‡Ð%3دÅÚ]¶k—rãÓ"lãc¡CŒ`z‘·XpÅ€e½:¥cn†JéWŒòqטyûC
-q9¡
-Lž Ko÷ÊŽ ·ä» ‡”Î+ b4IúQvqíÐÜeú©ÓÊíGWå§¡"2yZ:«•WÏ.€%ßw³*fzªèöÖ¶—)žûãcú?ˆÀéÆœÌÐý€ÞEXh:¨¨M\û&ÍJNalƒq’"†ÕW4ñmû´%`¨;eauì›êQ§»–iT.1 ­®Î‡’É[Þ€ ÷ÏŠ¡îPÝ¢ ôD¢} ë¶<j˜ ãàŸç~}h.äŽ>¨­s8‰«(¢ðMÆÆuíõ–ù®¼g‹KÝ]4arF¸ô\gEîej”¶ß‚«=F
-Ài ç>qË»Gòc[Oc××NïLW2v/–áݽj”õÎ>ÃXÖ3q«aEɺÅ„â>fO¤èŒ"®,èÊY‚ÎE(N¿G\¹XD²zÅéüÜ@¿´5¤âÌMá‹4TÖô+XLÍ“WæßŒ¢-¡×mÄ+óÜg-8~gw®}/»`Þj÷9&žè{-td~ËÉÑX‚EÁàúÍâq•ÓÐB²ÖÎf—WŠîœªÐRà uä·P…]…#Ö:!0\Ã$ôõäá§™\ž¥k×¶æ=üºã ƒ÷ kDC_Z½‚áw®4SÉt 1K×ÕÂäÙï‹DÊÈk'>½ï6Û4ñ4™êû?ÒR‚êF;ãûÉ묶|›á4i–zDNEre{³p7ª£;Îu3ýœ«Ù8·U®¡mXìóu¡zÁ~åR.` <+¹—Qaåå¸Ý\K5,”Õi”)Wò ×On:‰fݪb´-¹ë0©ê¦¼öµ¶PbèDï^4UN~I•`Ä®TŠa‹_ëyàƒuLi~ˆ¿—@°âE=ïG/Òw$û:-Þ›.eçdo´™K¯­o_&Ï¢/47ó}»Âï½FG$š‡Õ²OhNÿñ€Äê”\Ï?l”œýäɪQr
-{)Å& Ï¥upñÖêg†êJ4¦Ãôä$å×$Š]|}w?(Š·_x[¦”…UóÖºdeè±'“5Î…Ú<©!+Öùù—lºzò<<Ãõ ”V
-’3ë­y‡ZִЕ¦:)Lº¸
-s—jÜïÒàh—OQhÁÓ+»2ÄIöH)Àv`Ó¿Êd¥Äù¼gõB•½e@X
--ބ՝‹AZy¹ÎÉœö{lÔ'Èùª³øùäåðÆSÊG6&ƒ…ÂycûwD¦«’
-Ôî»Wƒy¢¾1öа’þˆoˆq’Ã3ÒvVUv‹(Ì’Û˜^ß^TÑ„‰ê‹VŒ}7h¨þš-ÀÎz'{%Tvõ.êyóª* çpu¢#ÑÇ
-§ìk6
-5
-Sm8óÉŒIœŠ‹DYùÇ+”î9e³åÅWO_†ñ쌄ç½toåeþ4.ä&A:š±ËKúTPÞïõõn/"S—B,Å«?¥9X,\â×Õ‘ËôyŠrÑ9ÒaÍP÷šŒ4„ä¦êmXp]U&>#»ý-´
-ã '"ƒo‹íœÏ¶{/ç5„A9®G'ÂÇ è`ó0jƒÊB;ý©™ Ë®}ˆ­Žñ1[ð÷£þW%jÐNÏâ6zqó½_`7)PO¨òfðã¥]õó»²âÓsê 9—ýdGaüçy-S‡¡Bš/¦7É»ñïêU(ªRL> ÖãÅ%
-4qqÖÆª6Ë éåßg8ÿ9I~@0i7ûØèj *t­6sX pÊ•òŠd¸´Çcµ"f-Þe O|Uý=55©žÎ­9÷]rcôBs“€7XÓË€ å¸ Ö1Ž[vjq<­–بè9â¦> #óèBTŸÆå3’"—æ ü)—e}‡õ·Ò“zŠCC!!‰&þòìBy’Œ‚o í2ØÅèv¸i=ŽË>T¸¥¤<›ùv´ ±˜ä Ë’õ‹ÂÁAü Eí;¬Ÿ:aeÃ#˜'–';â2ø®>»’P_¶³k¦ÙÐpÃrâž µ½èJÏW ±HvÝ[9OL¦¯Àü¶³Ñ†üYtÞgîhVï”ûÙCø°ÇáGO>c5M(¶OÈé
-I áe²Œ£TØ?’ …SPNÊ£ù‚qxgs»¸ÅÊÔwi 8à¶vr4$Ú4}€Š‚ír¯dùm4Î2–gPA*©õTäÁ©5š1üÚQ9ÕÉ#tAñ
-¶ß Diuñ[~“)7uᵬ£)$š%!³5êî lHLzƒ.˵§"Ù–Åa×»Ú{NÚ…½³¤¬O";ø º% ô®èÙΧºñ³QÉa%4½WÄé:úcs  I0¿â-Þæ]+•ÙRÌŸ’É»Uù:?¤wÌ?a;¾à¡š0­Hò­Ñ]ß@ì—ßXê²5Iݵë|˜?<ÍS’Vâ¹âÞÌ@Ëžð¸ošï[Чl¬ªX«§¸ý¶¯Íêìó’dQÞ¡QzQºÌTOÍ?÷D5&r[7÷¿ò°ÙÎØ9ƒÑ‰Ò…•=¹
-<Ë æíuf"ß”;q¾‡„÷YJ½ ͤ8g§YÛ•?.~æ¤Ú0²žÒu΋Œ•oÒO4ÃDC¾ КÍpF@‘V—JKõKŽeBuÙMǘ=¢=Uºu'“<§½µÜéŠfdýŸ¿˜|n±¬¦<@sè_b<Ññ_ÊiЧ}:ðÀÓÝûìa˜ÏH؆ÏÅ%­,i°à „T‹y>wÓM ™YFá¡m—,¼¨¦ým —ä¡0R·#ÊPÞoè½Ê'º“:Ön°F0Y«´!Ëv:‹jÌ©vû
-¤ ­‘–áUË‚
-:®üÆ<¾2òϘx’9ð0ÂL©ïv£³ëàk"O,yüC“
-Y#»jî,³Þ×ÕyN;ÖQJÍ.h¯¹žM1{8›/'úÌ-™5ü%û_n,Cê
-Æš¶áÆØ'熢¼'rëRe_/4/rlu¨}?M²¿ K6Ö¸ÉãÛê÷®ïÍ£¤âýJ×Hé^àÉ îÆX¶:¶1lhx^+fV—ãrZ틪Þ6dÉ15yÖ™{ü}ù•¤tôÎÈ­m™–Ó«ÂuecÓ|û¦èeƒv$σ°-~Ô¾Ò÷«´¶=fܯ!ž®2œ *zROƒ=@U*Tòþxˬ7Põ^T0ƒÐfÔ/êg‰^½Ñåaô³{Z¥þµ è>/ˆðî?°nyç¾QÝS‡Ô…åå²ýQ›eÂÌ>êhnQµ÷K¤ÈK)$C§;÷anÎsö¯Êª½©j˼ca; ¨våâF¡ìbb©}×H‚q߃6,Û¬@}F: {2ÃWõάx‚<ý7~áe¸N£}?£;™Ó0¾Ë?¥;ãë6ÛQës¤Í4¶ÿzôÞNhçI- ÎqE¯HZ•¾žÁͦlDK:‡w}·Û@e:!ñƒbµ‡ Š<º³w#߇êFƒB…mHä£hé³äÓ¡mÆÞ‰6
-OšXô¬—Ô¾œ R¶ g4ùGº[A9.–¥{>ˆ
-+±3ඃ<vÅãS‰òK¶Ú*ú Ü3XoÖZæ¾rVè£+µ+Gx
+xÚ­TeX”í¶¦A¤iº»A@$¤Sš†˜f¤¤»»[i¤»;i¤¤SBà ßÙ{Ÿë;û×9ûÇÌõ®u¯u¯|#­†6§´5Ĩ
+üwjújë
+¿ydd n
+bý{i´`ë‡=û§â7låƒ=Œ÷ÏÓ(ûòŸÝ€VØs3+ñ@ûÔŒ4D%IN߈œqW/j_´°Z§ ß·Ò*Zbþ«"ˆ«fLì®Ñ}úôöûK¶ŽgŽÌíÉÀƒ<Ê·ô¬ù„KLÍÂìþܦ…¸i»ú‘ž‡Sª+hFB<zßF4µL?ü kæ‡aþdõ¥wÍ÷}ÊpÅó¶J©Š!n!¨A"ª|÷c—)aûçsÏ`_oû1zçw
+öì˜GŒâ®h¸L¾ÎÙRFº%ž‘õzíMjF{gm¦£
+i}›«À±%VHô!•ˆ [0YòÛmݽØ=šâÇú[ü%n[?<bCAÓ4Ù¬Ã"$ÇêNmKâ7Ø_2²Ñ¢XÀyP¬éDÛ2罸=
+XcÔ#·y‘e”=û-‚yKŸ¤É Kþ}“VW6áÚ§Ûäé¿óâ>çAR¨ß×±”ß·³f‘óœÕŸüeÂíõD0'éfáh
+áÁnm4&lë°Ø:çÙ4xÅËÂÅï ®_U£Ïõxô$éã^õé2Æ“ßkÏR-°‹ £òLowÌ le`1ÐΰLh|§^Ô>𵉿ÓíÈÍm
+÷‹i“Œ«$0n
+89OZ~¯YÜUmD–pR',>‘Ôÿ±¡§I^±7s森ʡ'…ñh«Ö£`6Ï ¾3ÿhÒE)bfzÐDÃke7¤›œp•žjñ6‚J4?¬® ¾tR+ÒÂPË´·ˆ½‚ŸŸ N‹è½rbàÓPjIo-€y¤&&t®bö”«Ëå¯D¬ŠèÖÝ®åŒù0~ªC0y9X#P wqŽùŠÊ=M¬ç+7ePõÕ Â!„²ó'¯O!7v)·×ø2ŠÃÂ~MÕ¶Íî›ÙÛ‘_<³ôª‹#bv‚¼¹Ÿrr••¶÷ 'c1­lG>2QèÒfdûék|/xúÁ.Q¼å?×~M$ØÇm–ëo?úóʯñR¤S }ìÔ÷N)5˜5C¢©<kº%Fb!€ÑOØÈvè'p•£±LJ47%:¥[Fká&¼Ö._4ï}|nòHìd]æÖ’Wo&›Aû„H0×S±£À}É׳å:4[âø´¨6ÄþèY=Êì¡åÄÐ;!8ׯ¹€éÖÔ9RæI\‹úㅽ »Ž›1"¶> ÷×m*
+|Ó¯hI-"d¼¦XR
+ {O
+;ïÕ¤1tù‰Ýä †U ]ys@BO“t«V;×Poè©çJÎúKcà< c×¢ÄË
+Ua]C~öóUr0ÕyÄ~1ž­¶³‹)ûãÒðj?`Ô1ÖÓٮܟb˜i{ßR?ôòé¼gVä"SF½¼ÒCÇ܆M Û/µBÛvg_‡sÕÈæù»”™åf ¦ÆL7¨L9ä¶¼'5piçÀ÷"®fÜÝþ4(ø¼pD 5 |Îf\>(ŸL_Ókz³§Ó‰èûU%´™)¢YÙiþެ]‰·þb$8¼™c£ªS~~­Ž(Ú1îyè3ôØBIšM*•wÎL…g—Á9zãs­Hjñ¨šÞg€!»1ì] [Ñ@Ã9ï4Ô½òA Ó,IÒ³\˜óS™PF¯¤…ÆÄo¡ÞT!†²Õš»ÔOs*-RûsXÂŒ†ìºÉHì¯Ùe¹YkéneÈ HrÌ¿ üâW o±ˆe²ÈÊjlÝp1î@#†Â”åŽûGÀÞ_ˆz8îºÏQç"azóürÚ+«U™Ÿ¼Ý¡uþÈ×\÷IšÎÜA/г¸8“îÑÁRw*äŽýhû4ó23÷Ö¼«(ƒUdJ¨»ÆÉ†Úª¨«¾ÕÙÙÒÕf/;;“
+uíˉü=fŸKWHl4ñgÜ›âÙŒ\¤]ÌÏù¢®ÍnÑLj[ÜY
+a§ÑÉé:ÃêNj›`¿ˆÒ½¯è“AáëwÝqÙy\‹6›OYŠÎí(¹P¯­2”¡¯”Ã:×­Ô™¯Bß¨Ý eÐ8MVˆmígâqؽ¥J¨Tû8™Çê …¥Åb' Ó¯–úïJ¼=¡Ô%­ŽÍ0L&ð%Ê9ËóvòhôøXµl(ih,ÌÄ"¢45_ߌƒ ixéÜóŠÛj«bQB¶J9ªÃòe±]àð¶ÊÅäÿôÍ©–òÄê‚)ª\’çÝE$Ïí4©~’-ÿ²#¥0öÉ·OÒ8¸$‹u”wºu5æî nEó]ñ¼ó
+'­#…Ÿ¿Š÷rgžŽ TˆÊº¨är»Þø]lÉó!7@¾°ì?~5±Ÿšîc÷ ^¾Dhè•îkçɶP`]ë-ËwºhbªˆÑ+S\Áì0½u>äÌ]ÖwË¿S¹y–âb3É<¦7XáS¹±M%փܥÖžû²©ª'#[¸™ ~e¦·Ø¢‡Žƒ ÝA×Z¸|Â_Ïzt þF’דˆ ó¿-p{‘3S§r$¦ð ŽùÑ}Úªõ¡{yèþ-¤÷q·£ÆcªÍN÷ý ªB²Ó+‘Î`å§½¤k×§t_ï/#ùžõ &(®­}ó»@îdèX.mîŸ 4Zá\ ÿYýTi¥s0z3¸æ½î[ìÅ]&ÕS_h€Ô:D2Ûeß*e$äMçBŒ1îðMfxRªºó¦‡Ö¸å'¶mP¡é̉]Ãvï9ÿBXvg–•YèB ¼ìù›­Ï{”ŒÃ霙ªy{MƒÁoù<sógbmÓi³M)=t-Ó"„30œÆ_h®ŒE)Ú`$˜Z(i¢¶?çü’¼é¿‹É~G‰¯ñH’¾|¼,0ÔW‹žB
+/Ögu»ÇÕ¾Ý9"meÈÎfD-1(ü2\س%ÛµÜfÄ!§yª¦G%àbÈÖÃ*òâ+‹®ƒœ_ÿÏ­«³hâJ »0ìggöõ÷¤T:á6~d«»Þë‰Õ¬¢Ñ’f7Ö~Ô¹LE5¬®ìûÏf´*Œ§$˜¹%Ð+1F)m÷Ãæ1Ý?^¾pGÕ_ú€í®<ž HßXùœ6c&SۉS¾‚f…"ñDœ¤J¯ªGœy-
+
+¹ìŽÇ2~."[šLHÝW¡@L ·¨YÐÊxv#*O“½^©^܈‚¤0Õ î?Uª Úš
+ë ˜{‰ç«ÕsKñóôO° ]|îT$°´/Ç=»Rò ZE8ÔÝ,÷Z4¨ñkæXEá¿)—AbpZŸ?kg_á("Šœ8=^Ën^¶-;±jÓ›¢Œô¶=í´ b¤Œø ™È…¢Å½»Ø. ŽâÉk‚å\FÞ§¶vF¹8ÄåS¡t(xæóùéJø¼Ò–?Uʨ€U(=a£¾fâjN¡"˜¿uš™ T £UÑ!]§¨û’{}`ÚC··ì½ñ>p{×ÿò¥9W“ óK§eº ÊÖyb6*©V5Úô9pÖy%šµÒj
+"ÏŸoã/õ‡õ.¼¦RfWL­£<îÏÔÌJMµÞ9â/ò‚e:Á·ŒÖ,ÏЛd«^Èñ»´É¯ +ý\Ø´!cšGŸ¤Eu a¾ü3qŽøF¬0¥Tù×ë] Ù…Þ¾Ë×K¦n6<}:ì¯ûð†]7€U“¦¾QÒ±6£ ¡ül¶©‚¶i;·Œßõޱמ
+w¼vMËt^27lüvÖÍ#Ã<@²”¸v)]Jcþ58lMÖOP_.>H³Üzu¥ÑÛuÕAÚ=Ë,Qd®<‚»¾quNÜÄ`k¿·*a=*÷•¦fx?šì«…Cúô«ðóÚ常×ü’Q1"ŒV]'î¡vÕ=èxÆÍc˜« ‹û¬æ1eeE§W+]­{Z(ª¦í¶†Ž¯YYyYAÁ qúÛ$'9ò Z¦´œÙôxG–V¶QA¯²•þ¤‰Ð/RzµÈæCÒÈ¥Ðe§¢e"MICGœ–@K¨#'¸)¡Eú™j{¬È¨¹S±·®K8K¾“aê[·°€
+ȳϺÄ1Ÿ¤­a…f¢ZÔø$õN8n-(¶?:èú7¨9ÿR«¹ür-ÍE•ˆ¶Ã@TÆ0¤uÛ©4¾ ior¾ÙhE±±Û¾E¿9÷m‹rQãí¿5º¹)îØx,žWí+ ]×H=î‰õúCœþ¨9õóºfÕôc¹Žô‡û%A<Ü 0±­bÆùlbÏH7íkŒÀ“û2ô>‚×Ö[Šÿ°c²"eíÞOÝ; ÙK=‚ɳ”òxäWÓ@[ž@CèÄ÷XŽf‘
+µkäÊòõ’Â
+´KµI¶MµO¤Ž…ýæ_ô²M—èI+»aWwòªJ‹%‚µV?œè&[ãõ¥ßö㤹a»¼Ÿ ù¼ƒ2Ež9Äßredÿk´Úäòý‡,þä«…jŠ•ÜÎw:²ú¾B¬‡+•]Å‹ ÝNúÏn]fn`葇DÝñ¹> –{Á;ÜZšú(„Ç\_˜ù/"\a”xêZŘMF+(=Æ[M'dÕ~qû¹]#Ãý*ÄâP@'½xÀÎ) Û“ó,›n-p3z‚|>Ï»Ë' àµRS „Q^§öèŽÞ2¿±äÍU(Z%›yçlž4&WO¢`¹¶Ú>=úÑŽz†ë±ñQ,å>& äG=¯—ôáÃÆ8ê§gÁähdsúY½¯#Ô‡ŸýhøzœRµòŽüXGÝèÕ~kÁî°|“wºí±ÅŠãðÕ‰›³oKçÜeØ~fÐÛg‘(A4cšçã…™ð<¨>‡É¯L¶.;âÕ–ñk…yá[?—¨q¬vñ•ÈW⮤Fkît³Î
+u/uóLúuúw¹ë‰ùf'ºl`k2¯ †¤Yý¯ºš ›E¾îM,„ÑîV‹kaÕ&kð–¹ÀÉ Z¿uZÙFI½‘Ò9é27Ö†
+U qì¼CW·KmR-þ°{/‚ouƳ6²ö…k“YË­I 9ˆ°xýà„ò~£Žâ%ÂJ S¶–sB¾Ó Q¥ÆüÎÄ7"rÓPœ[x-yüæãŒ]ýb‰¶K[òÒîW’ª>˜%?(J'8tö,5¢PÞÀJùfœ
+Z µ¬lƒɉ-ˆD7q‹jb]¢Ê°óŒœz´êŒœþ}oÉÛ\£clðKUûõÝÀLÓ_ŒÛ,M¶ûÁðECà£Ïé ’K·@“#¨0"0|vÐÖÇÙ9“£µg~¤s©vÝàè铚«4ãåõ…ÕgÚ©¨}€†’dØŒßD@º2K/­½Aùœ!î`Î/·†yøP³wK°yù´&K..Lgø}ÛU¾˜1@H•DƒO€ë…„€ÍXp7†…ÅãZNbHFþ—FC#Ý[f”AN,DŠÝy¥LSCa=‘Á­^þm•­`ÍD8(bBtm„7íÜïÃ’5NRï?Ø®j •p˜ ’rá‰9¿ÇK«Ã`J
+XÙ½ÔïuÔ|FûöÓC!0{z˜öi°FZùÙ–‘ˆ`Z-´‰ÖÍÄ+75`æ°f9-žŸŒ$ý(äQ#Z`ýFry¥õ€ÔÉ9oÐLñh¹]´¦[M¾a€úɨ¸íS¥ƒrâÉT投Bß{$Ñ?'ÜofpºŒ{Ò˜— ”‡9} ³)
+Ok=¯,ß ÿ¬¶Ò 4a§¡w½H5h+ŽÖËadA~–Úß(šŠ¯Ú¦:4o”ñH\»âð*!’8ïÐRÚ3÷a k¥Ê9ÕV_ Žéêzûà]‘âæ»šºp²X“6Ý8ºåaJqò¸§1Ýû0{/è†leox32­t3S‡±²»ö‡’ˆ?kÁ¡Ï´–¸Ïäçè—F´RK)õÕT­ú.ÌäÔv¯†“PÚ¼åé…ÈxžÂ–ã©§§¦ ´õ.œ ,´&½}œË<6&³·Në«JñãŒÂJFÅÌG©Ô¾¬ˆeé§|†Žtc&’¿Bݾuù+g>Å<ÝÖí­ä˜å\\é…ÎÔ†*ªà°‘÷Wò&ù0ƒÁÀUlåpå³C!ÑT1ЇžÕª{¾®>~QåcÜßÕ»”!nŸ$`KA„½8!Wãâp®XA³8ܩРèqùÁúJ­èM| ò¶º©öÀÙ—!ñ
+g¼Þø‘JñLã¬+™¦‘¡‹~ÆWÉïŽf“(R Ùü€¶:ôŽÝû&³ûÝï[Á$ o;Ý·)¬à3×<ý&¼J%ßÁ+ž™3T÷Þ*%²ˆgÞå Û†Š6ájfªÞ/}„ÊfÙ#Oç¹÷Ó—]ǃeæÖzGs;ÇïfyðÞØëÞ} ¼³enrŒð¶3Æ݆çÔïAPžå³VåWZö=u=ŒoNû5ÄE%Mm¼‚ãäA‰M“–H2)’”x=—»Wê¤åG¿¸í–`4ëè"ÛdÙeO¯FõŠEô˜R¹w[íIZÄŒA¡þ2ÁíI4Ë5[TTB4׻ݓÁÚ]!S »Lz¦Ž=šïk›Z’¿òæ#¾5mK,žãá×åÜü‹‰ˆÊú-U’z64ê6ÎÊT«PWôb 5×ÓêN …îO4p)”~2g†º R…à'ðIµ@I¶ã
+E{Œá<^áe«5ÕôÄ;¢.ƒ®· …£”xˆÓB :†‘™ùjéžu­@[N?9¼bƒ!+ÞNÀžfiÏþûóŒ
endstream
endobj
-1475 0 obj <<
+1937 0 obj <<
/Type /FontDescriptor
-/FontName /AHKYLG+NimbusSanL-BoldItal
+/FontName /VMTBGM+NimbusSanL-BoldItal
/Flags 4
/FontBBox [-177 -309 1107 953]
/Ascent 722
@@ -7269,45 +9508,55 @@ endobj
/ItalicAngle -12
/StemV 145
/XHeight 532
-/CharSet (/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/underscore/w)
-/FontFile 1474 0 R
+/CharSet (/a/b/c/d/e/f/fl/four/g/h/i/k/l/m/n/o/p/r/s/six/t/three/two/u/underscore/w)
+/FontFile 1936 0 R
>> endobj
-1476 0 obj <<
+1938 0 obj <<
/Length1 1641
-/Length2 7309
+/Length2 7418
/Length3 0
-/Length 8142
+/Length 8257
/Filter /FlateDecode
>>
stream
-xÚ­vgX“k³.¤é-€(½ †Þ{ïB ’@Bï`èU:(
-‚T)Ò»Ò¥)ˆô& ÊA×Yß·¯uöù³÷÷#¹Þgî™{îyfÞ¹^^.c3aÒª‰D`„ÅEÄd†0/_´¡/¬Š„CÔˆ\ƒwIyyÕ|  ‰Pa ²
-À¸C®08 fdl£c¨àÓ2´
-û]ZäšK
-êãC£¯Ÿ04ÀÍ„À\ß €!Àp_Èo×vWäA(䵇×5vMfŒDcÐ`
-¸Îj¬®ù—NŒ;ó;7v ®×ž$Ø÷wI°kšk‚!Ð
-ø'ùÇë_`4î*B*.qŒ¹ÎíCŠþ„+ .ö—â‹úóƒúü¹ ¾ß3Ã-A"à
-NªïNëY`®Ù>ŸÕ@Ddõ¬Ž…q8|3ºá¼¶,ï'$Þ¤òMFÀ4C3ˆÅöqIô©ª²€»™Â;sœªÚ£_À
-˜Y~”üZ{(j
-Q³@eÜ£ãƒB]˽F_çè³Z7ZpLO¼éè èûå-o Á}¿<7Jg3q±¾ï$•xtü³sVoÛÞ¶´s|«6T/ß9M'áÙ—Áß–þIüflÑ:…ÛοV/á[ѱsN×çãZBšï"„²?vO}Ü”SÇ?)t
-ˆþx˜ý^õÍE*Æ}Úœa7\o‹¤À׫Úë½ÍÌë£<Ùžuèá¢ešJ }RH)­û°¨—‘?ø ë˜D4“#¼¬}ªèñ¬Zž­{ÑV°“£öhÁ‰ì’â™ë›Èl!ä6QޫݼÈ{Ñ2¦õL·ú¢Ùpx!Õ)”Û§‚·ÊæÙ0 S¡ÐrUy·hu‰ œHံqä/r¹"M3VIÿáói¦Ûɯ,™)c/ŸÏÜ5©P5¶ ¿=ÙVWØ”öuÈ‘®wç¨3÷Ûé÷GaeªZžüÓÉ Ëۦ߿½WÚ¯†A+“†¹]ÜV™9é>gÓ¥ëÞe©Ú° &{W«˜Ùè½ý™ˆcLê°á
-MÿÅx^þü+¬yCHŸŽòŒÉÄ­)Û|“Yå†
-DPCL•!ù]ÊjÕ®Ÿ}Ÿæ
-™2i 2¾èÍšýŽm&ƒ=áD%=Pt¯¶–qà,¼L°+•@c¬$ÿ(ÛAŽ”—>aÀ©K2RÁÂHÞ Ÿ“ñ‚öŸˆúœç‡“8<Ú‘Ò|)Âçw wXÑà¬<W›y€ 1©Õ¼_˜©ó‹ºäG³á [xép©‹qŽ"WݧΩQ¬¨ XŸDX>ï=‘¦Ìùñس€|cçÜ[Ö)ÆNñÕÅ}TpQœ@®‡fÊ6ŒS¡æ„÷¸}«ŸŽƒnÝã¸ÕÉd¿XÈÃÐdNå:™gK-”ON´Ñ‰9\•ÑÑ£ähz[ ßßÌïÔ²šž4ƒ^c²i­LDá·4¤ŠLY&NA†çFòºr¯<G9ì«è¯˜IhÉ4ÖÞMcg<§“”­.ZpVmG'±ÕˆX‘g_
-^< É_Î`Wm°TŽE9B €ÏÚÎ{¶ÆHtn[»RUÑZnoS8T±…fãEæ.Íj'çôåÙ&þĸhë¶îø¿éùNr0n%áŸ×Ïñkt¡› 9•sƒññ3PÂÅâsÆ/oŠåß”½‚Ó‡‰ÅOgãW>ò—ÅÁ´êf•-¡J汪 º(‡À÷ù|»`Ä $É$Çv°4œ·?×íl[Nªš÷ñýê¯OÊP¸áîr×_ŽM«2ËÞM%ÕÔB¢¾ Ó:Ø%¤)ß6 z]/ݦ6Ûsò8¡^?ô'‹™JQ™<nz¹p¼ž`lLŽà|8]ü¿a”äº_Åõ#àKQû²b_¾ÚžÊ®Êýª39¿[áeÌ&¹ð®‘ >;è¥/ÔÜAw}ˆÛ²gWbéûÉf S;w;gùþ§ѨØwˆ%ÿ/âaÒ:»7?É*bŽxB•ª}úˆø™¢ÜŸ!ø¦ä‹°”U&Ä>Q ß-hì¥Ó¬ÚÑÄ9Ø{îpUÜD(ÝYzú*ö¢¦m©°¨z­`Ý6ætëû±u*©¯‹™ÉÖf1*JÂm¡5ç`9¿ð¦*øîZXç9ɺþÄ–qrK(@rب…p¦¤¸–œRâæ;M)?ƒ –'ÌSù}…·kÁ}¶ù=tSÙvDˆûF&l˜TƒA7ÞÈ‚ñ¢y66Æ
-K¥]º|”÷)- ÆãUµ?‹?A]ôv°s²ÀÓ‘îƒn xÆšJÓÌ™üê(ø'Û¹büí|ň à×P§4B•{5îÒ6/1—¼¦þÂFµì*6ÊGÅvfQê¥ý¯I—¡R²áIˆâ]§ügCˆØü·+G°:'ÖùRg6Y®§ìf³I|Pày7ÍGßN^îiq—6®/÷»´´ãÜ)CÒ¼ÉunLãH·'íX¹ª2ÑwÒ™ÔáEË[8[kíôüôÏ5óëS¦½§ÙFI޾Ͷ6c‹ÅB<íw‰xœ½47öaÍØ*É&Cì£y–È,Œº4nƒBq;’@öàR×m|yŠqÃ÷…|éVñÒ %—á}ËýøáÆ×D'T¨ŠÖåϽ۟ÌĤَ‚B]™Iõ½žk
-m/ÒÄsØv°É
-ÇíèãH¶ëqwòÍ‹·â%öòCæ^5GßàÓÊÑ?Jq˜M4è_iÊ{º9jdT±6ª@¶f/Ø9D
-Â[-ûvIÎFľ]qËG$;“v–nÖçÙ[/¬ÜÛ ¬ÖØc›§_q³w#ç–¡…NøMë¨Øg¹´²A$ê¥+Ú:‘>„‡k5¾0Ó³R–ڵ쵷žOøÑQ,
-ò%¥‡mÒyæ–#É¥oxE”`µóe¿:~Ðg¡äãeÚ•—cí+T¶Õ¯ÑÒÃd£àruÏn²ûj6÷IÔŒÌ,\QñÔ„rëûtõZÿ͘¨­ŸCë:Ú‹„j‹²„äl«Vi­wîÞì.ñ=1{ ÙÊÏ]dr ¨ühœøÃk4i™ÓX×Òá½ñxRIØe­‡E‚¸lë6B‡†7Ãÿ2Œ‚¾•9ÌoVa0~EP~2ÿ+˜ßEjy±Í/Çj ¡àd™”+òj¹y§Û&Ký×Hé
-ÌŸ¬Ô¨"vï(Äu¾?ÎÆé’n«òþ!rö,J×lôÎ)®ÅœÒ°õîFc›(emÛÉC{£Î€‚ƒÁôàØö;ycÞiÜ3œ§lqJJX|Ø@–M.µJ«™SÝô{èqŠ÷úžkÝaeEû!p`z ÂUÿíìŽfíåóæü=luaÍ0¢¼¤1EsÁ)&{M:x1ºï0QvI.b¶MÏÂäáýµ²{™> 3ûÙ¸¯
-•Ün‰¾#ëò¡a–º3YEZwI3Æl9=ÇYcÝ/Õ‘½ Æ±TãVW B3¾àkìȸ‹VÅ¥_±i'è ir/ÇÏ{k”!!ñà!Øn>ÿN`Ö é–—lz[Œ ÊåR°ùcûçXefŽ
-Nè@¼þÃúèÖJœ_W¹j+ë°N3ëYazšGä/ùñWÉsž‚yF7WsDµ…jj‚·k¹ê×å Õ¦vŨüÙ/ÁáRóy‚ÊSÅê­åt¶Q?C`™îÇúÄš ÎÑ8ßóö$ÌëO ·?³>:)1u'–üúXAi 'ÇÌû]"Þ½Óˆ.Ÿ .aˆª<ÃM Fý¢lÈRpú¾¥zÉÎXw•àK/›Z±pôðä ‰q½&Á€¬wMë;¦%rݼLè“×Ãú:òƹAqº'&ÂV–çk]ÚËȇÇ7eP¬þŸ/‚*(;¥XÜ­«(6´„ÅŸ¢¯H¸ßs ù šß ~_·ÓR¤^ʤÐTù|ýd÷
+xÚ­weT\ë²-÷,h·àÁÝ=ÁÝé麱@  Np Ü‚ îînA‚KðG²ß9ûŽýîûsïùÑ=ÖW³jÖ¬¯jÕ‹žZM“Mµ
+ؘVPg€ý_€åc¥àߥÁع$a
+úG£3ôÑÃá{$SƒÂà0Kg°#ð˜UMFî/psøïÜ0ð# €Z=z¡–.¿Kúƒ=Ò<¢ps0€ƒÜá¿sY€
+
+àâüËtqüæ
+rþsAL¿g†ùQ„9
+±÷
+±#íñÝ!‡÷.éEк•)¤$>ÍìA3Kø¶zV†‚ÉŽ"týóÂÙZÜ$rhQ´™…ã:5~\ªÿ&n3icùɰ·Â
+þ[œªheå¾|&]?ÿr«É\ÃÒáe?ôÄ=T o»¾}d-õDì‘zAAü;$ÖíM`÷Îð]o<Þ½vûò‘½ÿU¾bóL|7.~’ÿtÜŒo6ÅsÖÛ²×ÕÉ=ü¥EØ8ßfNÖªXGvÝ9¢—Ñ[ËÎÏ‚p®g”8›Ÿ Œ¸Âl•á5ˆ\ µ'½†±‚î¹oˆ+ýEÌC\;$?;Ø­I†Ò-ŠöG
+uÏûüŠá®Ržͪ¥2ãO*“Òð%eaØË€ëÆ…‘·¢hI$OB· `—ø…š²•î¤Oü›rtk­|Ôd&‹ðØQ#òpÇ&¾–%4¶²‰‘¶Iƒu¨ *³j蓺}ž˵%÷*NÄírérÇYÖA&›¼±!JM³’¸Ïd—â@FítOÅ¢–ý<NaD݉kæŠ~ï yí)âµó·è+ʲ֓ þ5r¤< é¹é¦LéBBfï¬Ð]sKGçïê”4 Œ$ñÝqörÌSQh邎ÑQ„ÐYNAw? ÙXZJUo²+¥^ÎàyÀÞL ð›64ñï®oŽçЕÄ8`˧nL¶ûAå×
+Ô2Ç£óœÃÕ+>âRÎ3nã÷|¨›tœêSdŠÏóØMIîÜËuæ õV{p&ïÀ“BïUlgÒ‹p°æ`X Xï~Ù$7Ió÷È5á™j[ó(iM…1¼#Rg˜¢J2SÂ
+Q5u:ÝZPiÈ×}O1/LTˆz(œ06’—cé”e¯ ožcŸ3R—ù¤OŽX¦ÇŽL¶ôQ‚
+[ò¡Œ²X6dW”ö®8Í2ÎGž¿FåúXZ–Ê KGËfDY#9ë9úDëÙÒIVè—ü¥äqâ…[hêHõm à¼^üÊ£?—…æàZK£º9wõâÃÆµ=N*ÇÅ0A68ÞµŸY0ëåî'÷H#âT«fepê8æz{EnŸ7—99e÷“ÿì«1O¨tp¢$ÑÐìâbéÜÊã?¹¦Qòb޽£vãó»ûºt;-sn¡ÀóŠëè.êüy´¥³Ÿéce éT>/¾Yûiò›ø…µ³ê\t(NsiÄûÚ:'‡6&Ò]±…$©|Ô²øã3"Åél ·íOOÖH¯û㻼žž:¿\Kª¯Tm* ÁcwƒÁîsyk<Uë|ÌVTè°—vjk_ãŒ%^Þ鑘7k½|ñ°>UxBGIIâ®RÌ÷Pœ­ÞJ Î,Üö»cŠ\iÞ,_½¹œ«$Ë­B‘'ÔëCà!”B[ЀÒUµ¸D^ç׺/?3sÑÿzI²ì¨ÙÔq„</ƒÍO«œoÉ%ÍðöARŸö’Ûðô›
+œíB9Ir<§ã±Ç¶îZu“gËÈÆ=H&„6YŒ>yK
+sIË>„fyÀ–µP²¯°Í™ñÜÀ˜ÛV­BiKUÕ–¨&½Z>lÜØQ}H½ñFÁõ)a”uv¤—GíXøwå7˜_sÊ£¨:Ð~¶œå†µ_[õu(SòØDɈ€i¥±nEÉOÞøŽ$èŒ^”è
+^"×Ð,¿Ô“ÍØ¿°×Ë‘ŒÓ¨~«Ø/Ý$–¸&•Ë·
+Úè4*Ö²k}%²Û
+ŒCuû­–œ0‘%Åû‰U(íu´}¸—oC¹ßN‹–‹ïÓeBM{"µì¨$>v•aÈë' …¬Â&ÙÈ\y)ŸÐ×Ý92NŸ’‰gý2nÉVåHÅyF
+_(¹¼Â]=±f m™±þ¢uw‡_©5gðV×A~ú‘°·ùÉ
+š_§œ!¨¹ŽÁA¸Ë5B¹o<}‹ŒÑ¹>¬±¨/ÃaˆfºQ†t™é!@@Ù8ØiûŸRuà(cÂNÖ}ð©Ú¨žŸA/‰²¼ÎëÔ“$joV¿ˆŽLŠì\ö‚¶Á#µ‚ýʯ<î¾”û6|irn9AÍ>øÎïÓ“4²9 3QÈ0Qﲂ¥no%H ¼†Þ9¼Ø¼ÉÌA»µ½Ss(x^â—áÂÔóŠ;fÕ=Q¬$H­‚ûvåŽnwØg}‰ðyHULOÑ;Î[™›$‘—ÊwWܳśóF‡³ rÓœ?Vj÷:nà{ A”Õ#Êîj-šDÑÇ9"ÀP„=Ÿ[“7(åŸ&ÃHÖ|²Gx÷‡ 8Žd„Ý"Ô‹j°
+›Âw
+L ·ãí;Gða-qÄX›z u@ôº[³·wÈ1',HûGSeÇíuXâ»ýPáëNãùzOègÏz‹¥8Ý’ù×Ç^š’¡±ÅÕ½ÅD§ÎðâåØ£Ø‘hæµ'd_y +èçDk¥¬°qáR«áNªki»ó6•Tù¨%”}2¢“xl#ŸštŽT™÷IsuZðxCèÄŸørÞ¿û‰¢„TÄ´ÙÁÅÌ%¤¶ÙZ×|DÜâ<CÆ=¯]gÈW©Æa0d"îÎØÔï±e…µƒ6¬"Å6ô£–¤Œx=ú3ó¯Ù_CûnÕ¼v¿˜^°±Æj_àgã UºïVË…TÕÑbO⨂gr@V­×bÅz;èúÞ%¦™x­[5§Ï3Ö:‚"jŽ4k~¨<õL&3ò`DT!A_hU'f¼²|6R.‘í¤¸xê|PA&ß%º¹Q¥òNã'—ô bN,d×ì&{Г=9× 6 L”NvÔµ° ë=Êzb4Yâ>Ò€C¯™—Ô«M°<÷ Mž&5P¢â2á‚Ó©£
+h x5—¿ù¸Q®T ™èí”á¤Ü
+6c1Ø2£N‘m½y
+Ý6`ø]ìnr¶{Yþ¨ær§1B‚y—óšSï›f¤z|Fu³à™ Väª}¡­Ð’Ò!˜Ó…üä4?:cXÉÅuã<
+Ex7ŒSûøÖöÑj˵Pðê§òPÐu:ž"æPÀ|z'넎„oˆÄ\tM?½šhÑ5×Kôa†åt¥ƒÀ9Ôƒ[RVRLo AÍXb_ɺqá¯I`õOëßîë+¨³ï s|ŽýT:ú:ž¦yüÐÕfôµíhá¥ëxŶzZ™“rQ!µÑGÔ&O!‘>ǰæ+–å¬ìÁö»T­Ÿ_JÚÆ}ªFT«<è6ôoE(gIÑ
+–B·¾ic3(µ«(>_}(ìV s~üÜþ¹.c¡œ÷‡7«ak1õŠâ|š ÃXºîœ,u=—Ùf~\
+suz%Ýb6ê[ÊâBX1mûq™\§1(^¾½‹§™üO;挼ŸŠg±µ² ‹©eô}v~—¸B+·'³€á röŒòMùÒüo¨:Ë͉òÝ'dxÌ×ná•Ì÷/¼
+êÔn@äÏOŒÄžfðetß"‹« (óDTó:u4[…º…ÏCퟺbLÔ‡®V}v*t\C4áÙV7Ί¹?{î¯Õ,V °ÄPðøI†Aujœ|ï:iÜ\CüµïÿöéW'¿Ò…cJ˜1¶ÿøss®«üïí
+†¼|…ˆªÌÔnã×ÇŽbB«»µiO³ù™ÃwïKœYÄ:Á=v´2 FT»ù…Tà{Û—“yÄ;.lÞ¬ŠnBºyG‰[«:L®?Ø…Cø6çF:Dq%Oœz³Øfd²ö×ó©k2æÙl²M“Ÿ<”ße±lƘÞ
+#¸4Ÿïx¨_5óûòÄ¿ÌæÿDÆÞìg?´u¸Wrû0TûtGèSš– Nmrd,@%+²tR¿¼yà\R[¦‘¼–†Í…æHìï¨À¿Lw‚nžVž¨»‚6ÑÐ<òòç;vþ3xYÎ>;¦3™v®ýÓ}q.í8#ý²0?«Xñ(_-á]tsjyù7à вJÖ>gQb!y¯çKaD®çjg^ £¢]¦1·kˆ”öñ;ï¥"7bô{\n ₲둖"¢>à~ZN/
+çFS+tæÒÖ݉c4$vµ=…/ýÛI6Z×ñHK?T–¿©'ã+<ÂŽµp[_r#ªIr@+•yUˆQ¤§¿—ù;øT¸1ã£DokD ú7Å/¦xHOh\¶§+qg諟•O%Ψ ÃÆ¦+O?â–É’
+Q©m¼´^fâ\x@&ýÆ·×#GªÓ¢[LÂõ=¨Ü> þý,ñi/>„š&¿S }Îs™VæÇ"£¸«‚ƒªùë«Ñj¹ÏXžþŽy] g·Ð±Û=\0ùž]sx´Êà9¿mÓ ;­®ÿÓYøûêê ×ïÞyAÆ ZÙØáßOÐuÌ›ïi»›g䟘Y8(‡éU™ÿGÞŽ–
endstream
endobj
-1477 0 obj <<
+1939 0 obj <<
/Type /FontDescriptor
-/FontName /CJRNBA+NimbusSanL-BoldCondItal
+/FontName /GRJGEU+NimbusSanL-BoldCondItal
/Flags 4
/FontBBox [-143 -298 913 989]
/Ascent 722
@@ -7316,58 +9565,65 @@ endobj
/ItalicAngle -9
/StemV 120
/XHeight 532
-/CharSet (/a/b/c/comma/d/e/f/fl/g/h/i/k/l/m/n/o/p/period/r/s/t/u/v/w/y/z)
-/FontFile 1476 0 R
+/CharSet (/D/a/b/c/comma/d/e/f/fl/g/h/i/k/l/m/n/o/p/period/r/s/t/u/v/w/y/z)
+/FontFile 1938 0 R
>> endobj
-1478 0 obj <<
+1940 0 obj <<
/Length1 1166
-/Length2 11475
+/Length2 11520
/Length3 0
-/Length 12257
+/Length 12292
/Filter /FlateDecode
>>
stream
-xÚuveX[Ú-îÁ¥q îÜ‚»{Ó4Ü!8Á%8Á=hpw‚w îÎÍ9sgæ~3ß}êGí½Ö[¯¬½ê©¢¥TÕ`·t2Ê89BX8XÙÊ s7W 3GEu µàÈc†BK« ‚Øÿ‹þCH‚f“£”ä¯iãP28Ùì‚ìü‚<Öì\ÿ t TÁ 'o€*ÛƒÿPRNn@Gˆ†›³³=h©tur[
-ôYÿÜP|\ÍÜ
-OU]Æ]¶z3:ÛýCÕN+x4‹_ËæÔ SW³Çób{LÖМû@ô'—4]ô.2Gc;ë/t5îX?Ù¶¦$ÉŽ²?¹Û
-r§ÿåt-Rù1SÕ:!SG=Ê
-*â‚õ©[óW›¸r|bøZ8UÉgXǼ¡ÔeËWvÎEëà“:$ø*›Ñ[XôïbyÿϳÑ7”@ܪÆò ;Ú°#+ÓT<Ô“´a †£ó­zyÌêWŠž}ûÂkì ì¯æ²ÅI²ë°¹ “Å—3S/+¾>é‘Xç•Þ[²yc2½…Äþkä’7/ó -ï¶ÔaÑh|™akèõ¶œˆà³¢K¦œhº±òÌÛ+î–#Ú É¤P˜?Ž4D±ôõ‰X”ZЧªA@¯4:îéÃÄž§LCfËߨßv¼&vÖxAýB?q?‹¾œ$h’H&,¯ðáóÃwaãúöH£t[ŸÓyJÏ´¯–Ÿ½Cc…Rtÿ|@Ó\N(–ò9› ÿŽ$ÞVMã Ø9^M`Ðû~µšIŒ¯ŒÕ]×ùdŒ}2 ·wZ²ópóKðBE´‰‰ÑL·–KÛV,´,ì[(À†Þ/üµ Ù¨=Aؽ³ÞþVX¯¥v¹[4Ö}qmÊÁ–ñ“¨È$ÜfæU>ÙÏ]þ¨œñÄGÆ™‡Ëçˆñ¬è”`Ñʳ(yÁü,„g ·P¸ÈÙ’UêྥӆwOå$oˆ¬å€ÁÓó¹åaÓƒŸ›¨3‚n¿ç¡Ô xè=þ4Ãû’¹‹† ³Hã£vµé!*zß´â‚"ëDv11X›”•Ô­·Ù”\¾êHâûC”_ü½åbP‹¥<g3ÁdávßÂTCR›© EdýX ^Öî«M!MGÞlo{Çγ˜JŠCê ÷\¹Á•—+²ÂÜÔ u.)}ǼÈ‹¯ûï»îŸÖÞ–»¼‹oˆ÷
-ŒÅ ×ôÎ¥;NÒ˜¯Üç$.¾‡Zóà ÿ>Í5ÈhঅpiDÜÚªØ&Ž˜ÚÊ¡LM&‹ Q×}ðG¢a§"íÿÜZQ\—žO|)—G£«¶Üâ|qÄ`V¥ê¬°HJ!Q]Ú“îwYϤ÷š±ÖÄËuÑC®)^ÃÂåpVI“쟲jmpnB{DÝ`³ÂáW á§8Kšídl ¥}«G…]Z‡Ë…^šqN¶“ý¯{Ê›R Ö†ü»V¢è6ɼsQ/)‰­cóôÂâZѾÒ+Ú"4â^(jB¡ö|¯µ:ŽŽu
-ÿ0ÅÆÆÈ»Mn{$%A¶WwþN¾â·$5‹dë/ÃHý â,„º§EQJU¦#VϬùò÷Â*áôÒC°ÜDˆ•h"ª×F%ß+BV!¿íäÐUH ¦±­UÉ_}Ó| gsݲy§ÁAK”…ç]ƒO(yØó©8ݥߓԚÅIåÖD¬z{dŸÊ*$… >Ñ`˜jÓ5Ù[Ÿ†¿¬ù§i×ôÒí—sŠßTËO¾ù;º’yÉr+“{€Åpœ»ªxI4#µJGÇÖý\™NÊå?:%”¸½Ž[ÆNXE?+k¤ùvVþÍÀh!‡]U·ºåÈ—‹V¢4ùÄ`}r»Çå£fUZÖ0°Jñ£f„V›µÍÂ{Ú7£}Åß%TÊmDExuôØY~@uÎŽ'+V­»Œ—ë uܶ5÷Vaæâ¶§k¾Iâu<&†$Bq°ßU¶‰6ûÍêS©Ž›•òÎ]ÄFéVû„çÒ)e“Nœ4_—çÏÞ]÷`~)ª#<ÚKývƒŸv‘DÈ©³w&¸×r‚[ÉMÄ-á«xæ¤Å 4Ù}iþO“1–9z{hÚÛ2_5mE8%D–=ø„ê&£l1Ω@V‹lJNTЊ[)¢ÁŸgKNe%)L»ÉÍ
-þ4}ù)3-¢
-1]k_O¹ÐÞûm+mŽÄ ¯·@pæ40¢lÒÄ€7¼i÷\¿Þ¤ÖVRYŸüI윙cY’¶¹¹ÞÔpÌl.}ÀQX³1 ÔÏÎŽÞi‰¢Y«Êº€n-¨ çxÇùÒG“˜û–×Y´=eßOúhÒy‰r…II½—˜£„<]©8´âÛ´×¹j¡tè·6´
-÷[wËG_²°||¬õð+w!±—gаÄÛ`MsTÇpsY5НçÜUìI~ÏÝ9Œ ð·wŸÏøŒëßd¥°Ö™Cn âÓ_Å„ s0¥=Uº +/¼À³kÓ+)Ó“ŽÐ¬Åér«ò:~y[M9®šuãñ½-A­Ïš˜Çrhžš;£“Áñ£èz!-’|¬0ó"¨nêerùþÈk›ç«ÇÚíFê)™JÓ‚g¹9±_iÞóYEr‚P““ìÅ\ׄèÂÂàBX#Ñ^ùS#
- þËŸ RË ¸ÏÕqŠ&Ñ™3§à½@Háéë–¸ÆÕß•¹³ª¿Håî»Ó ÐAŒšÃï¿V×U~ÊÍ¢i½Ap‰¶Ç-Á·êݬžŒè`§æ­’ÓÝô°ŽÑ-Àªç*йÌ:Ñ陵(À±²ëÇpJ4Žm_1Jµ3v§ eg¥IW#4üîÖ¯?Vv#º¢7ºÊ0\*}wª ÙÙî»Ï¨‰4ñ]—Wó?”ngQö³’‘ùŸÿÑ)O°´ /–ø"‹“ F­C€jX*Ï'wÀgV Å §[M=!»ÂËß6Ç!FWX7˜ò¯ã
-ªéŽÞ]BßeþÐoÏ‹©lòPc(Úð Qݪš4;SÚ{Hø^
-/™îˆýÓU !pˆ—¦LÑ8¾ã[±i ߣ|a}3£Üž›1ªiMôeãyßxü÷œà2°Ñz¼Øf“ª„@wvKoI¿v^L¥PŒV=Wפ ÊjfV&ÄU亯þÂÇYC¼wãYt8a®´¡nµì¿„¤G ‘Së‘}
-H¾4“ ò‘"Š[7¨Ö]›ì9¶9ÆÏÌ|¨ãú=¿Ž[õªZOÚñ8—ÎǬO<Œ!ÞA"ð-œ913Dq˜ÍŠŠlv€öêÛóËz‹²' bÎ#©pœ~ÄݳçÏMÈÍøÝÔ½ù%ªþøÕE)‰ÒU[É6Ò³mêvZƒS—•¼ªì¾U4ã]Z7?.1Ôo9‘ Öô£¼Å³Ó©Ó[Ý–bWÊX‘{I‰Ú'gÉ“
-1&ÄÜ--¹ÓÌŒ‘tº-%&D~Èçd^<53s¶Z§.”P^˜`nȹÁ ÌÅŠ Y|-;¯ó£zêï£ÍŸGWžzÔhøÅåwË)™Jê4Ìaúú5þâ\ŽuÝÛPfæ„o•“àÑbÙ 4;‹§×w² nÈlGbR•Þñ³ªí܉¦’ç9½ìBšÌój…RZAŸMŠß}5«–G¡dHhø— ”
-¢™j<XZÀ9ãFà;»t–Ì/mxð‹ùÙ~—IØ^#h ,«©A-VPÏE¤Ãº/è‚§pªdv˜¦Vzͳ¿ôàQH|³ßŽ}z˜H1ÂâH‚„_B»”þP‰ï?³X¦§µ¶@'’OŸv(5øz>2PnrAéie­1/wÀø6)[Ñ­ÊÊRÁÕÙÊF„Å|Œk_ q±ß¶ëm:íƒó ]U'wÈú-.uVêp
-
-ºË?nè$‰‡Y´0*œRÑz+iߟd4ý¦|4}46%ÚíÞØ6L§ˆ?|/ˆ×|ÔÞ‚ÿ$.N´›ÞøQÞã=c²õ¹òðêÌQúJ,šm½rë~Š”œe=_™©/—ž"L©ˆ‡™ÉmGP ocuOUÈ^‰ÎK û¼*‹€C»–DM¤Q!sבvWãqäi&Ï#H¯&‚BcêM}±ƒ>ßAO@ÏK»ò\UˆÌYÆe6Î ­fÊýA¶Ý *Š’J‘½Ý c•‚+ùéŒiŒ‘·8x–(ÌgªaF#VHq.¦Tí·@o‰=qöHóIû`$z?{ÁšÓNœŽ7V1fV­p¹KOr€º#é]3ž¾êDÃ#és»=ÚÇïF›-1LˆàúÑÝÖ
-×ózŠ9’7¸ö3 %Ÿ;-IøsF0Í£ªâOí*:qì€LÃßü]|UºŠ Š0ëB¸)¥Ká3Ñ…æ]–ÅKɪªö…§´¥JJPh3)íð=H£K5F|ÌVUŒøà„â3©`™®¬?$.Y—Tù)–vá…ùÈpÅîÚÕMõÍý$¡ÐB Z ò¾Í/ãò$åbòJV=óTëž×݇ÎH¶ývÖÿEEQÊÿÒê:„θj&ã&ŸYNÓ»E·ñ „[?…ù›ôI)èuÖr ¯²0?Ûo»7C¹ÿ»¤Òo¼É´Â¹îœð¢.ä›Ñ¬wFø³m„Ëkr?¶ª¢ržx
-Îó^Ñ•¯LU.ÑgƒŠT`\yCbÀüdBDÜéKŸÅfãxä9´Ù5ë~WmÕÓXäù¦ÐaáÚr©M$»ü™ìbW*H±æØÆ@ 7Öή š®Â@ÕÐpàIçÁF–D¤TV~+X¯ ¹…XÝj…TVYÀ
-ËÍÖjA³[VNÊ©”wnºæ:ëR´è—¡ÔP<á÷ìÀ—®GgæyprÙü³2Gók/ÑJmÔ ºýõ`¨p©°Dטö䌈ljMº>>ßÚÇ? åpE_dõZ®˜†¶×¾”†–œ²[ƒ/E´'Qª YÖY|72ËpªìE@û÷(«ü9/†Ø³á›„^œEgõ*ô>­]èF„çÉ̘¦K´ÑŸ³>rÐp.Ç¢¸önmó‹C–á#4æçB¬¡+bM·¡ÊÚ¨C=§Í+ñx÷ÐRŠÛï¿ ¹¿ƒÐ Òm0äaq;¥?ãĹé{‰ÄHdñçc>#>÷Äåb¤u§B¹XJy–>¤Ã÷pjTå¼mM«Áð
-{¥*ìÄ|Æ1µÉ´†Ü=" Æç¨i¼òqì§ÿXûÉ‹L7Õç_§ºxÝÔúŸ'|õ8kö\i¸ÅüZ{‹ÿ˜tµû+(Yjמšyv¾„
-yÕ{›§‰/L¿cËG‚#<×~<|Êk°I‡Z¼³ºÖ¹úϧiÊôf¹/Úé‡ktyG/Fµ"2ðŠWð‘];k'CqD¸á •ƒ9Ü]O4µcžÒÚpG©½9—ßÉþ÷E™xšO‹:¬Y6{S€
-þ ]\ÈZ‘_@ù|Iø†…b,o;^úÿ&?±ø—ü(¢I­Åzåôq½ÏÍÌ. Ÿ ùPÐRhÄ*Œòßé\:úx(ø§ž?¢Å¼ôè·:M]Sç ›å»Z­s¤!!½Ükm2Bó¼¥# ¼hž±w&!ÃÁQeZYÆ„(^oÌIgS2«›1¶¸§.š*Ø™øÖgÒS-Ôð’s2ÁõìÍ< HðhN³ÙˆªD ºPþÝãé‚UóÊh¿`Þ*„Ú/ï|Rǘ‹pw\¿CבUP`¸ã©Xy<àøÆ™sÀì-j™~fužñÔ  ùÚ6ìB=êßüí(Šq5åbzŒ¨ <­j³¬C®ïýD¹D-ØÉZ {™6¶z£h©\÷›U‘jÓ.¥†šËïèsÁÅ8“ œþ©1â³ë•ÙiÓùNÕ¼_ é%™Ç_´ù ÑUÐN»¸SSJ˜ÞÖ'¡ý³;©æ’ZRž¢E]a)Ü(Ðß!êÜ‹2Ñ}ýdšcžä~ÍÊË-Ó¿^ O]Âúz)z¾™ê¯…yùAª'6BAÖ0B³e,f7Ý{c…ÑRSðiÒ¨¸í5‹65óX€ýbvˆÎL„‚°ÉâTöuû̾9‰ªÇ¼†Lb$&³6ðcpKJÞg­ÿ‡ 3¹_,Ðè ÚvàÊÀ£ÓëÌè|\ç;Ëê28ãÝwŽÍD¦n露‰Z–î©Gm^ŽCHw’kR½7ä\g}4ÐaHµ»FÏ&'ã6\´CÆ/ß‹ìƒç¨Ÿ:ÛÁ­\QŸŽ›M臎F}±à:tj•g¸ÖÎ;ÏÂ~Ér³ETÝêþPOf¬¡×_7žò.Û2ž¾Ð6cqi*eß!IÞš]r’À<GJu&í¢ËÐÕÄ2B ¡+ŽÅ.ÊÐ|öˆ½ðHØûÔ.\¯ŽF9>–c—a.
-áM¨£p‚kJxÛß“«ðš³óÜ™º)hÂÜ Õ(\Rb
-è‰rwòY²(v–)öGt¦2~QÀ)pÍÙ$Ü}c‘ê†BS¸”ïɧHò?ßYï{+Ú© à6bàØ4†°Àd!yYéÅ5øº( 5a}l¸‰˜:hºa)DO—Ã1&^{Ýa)uÔ -½’Ÿ@92h&š Ó6z†ž"—Çdiu*lÕ¢¦Áì­Ié¸hëd‹tЕÙÂäh®-Œ„:yG„rP…ß™ä(@ 9?ÎÅ!ÃD¤dŠÁÝ«àu¹6ãE¤“-ÜEµãªs`‘ôÌô/–ðPàZ¢2ù/gZš/Šj/æÉ4¼mžz<NÑ©}3¬ÛÂÍ,kU)×¾‘²¨£€(ÚŠóÞ8ùú³sÆzEË’B»Qf™=ÑCsØñ®úØÄá£èNàÝDtG_a‘÷zÎÒýä6å_
-ê-Ø ›¶pнDø]å]™.¦ßjðM‚Œá7Ÿjß÷V—ÅO
-›S›7?¬,ý¡¡5¸ê¢Fç5S‘fY ñ´qÁñ¹uF w=eí,t@•Q¸;tN?-zÐ öæŠÚ;cM„¤.šûàk¦ßNhÉÓËœÉò/o³Éäò£éì/¢þ&¯ b¯\Éùkå;²ínîyí½¶X/ÍzJ9°É}飑8Ê÷^°ndw òpR rñ²Ÿ<ÎTÝ>jâMŒrOù»ïîx¶„äŽÀšÌ÷P©>ò ”®_dqy /53›{ƒÙïEDur{)Oq%BK<‡€¯g¡…È’%‹ýö}=!»Ä %P=•{“UÄ’‰6Ás@´Öt—ÝV3)C¤Ì’hxR¥Ä&ÛtÒ6êð¥-Ë55ÏÁí¹ùE<]Äw­÷žmÕ…puv.,‘RÉ‹yRÁY«{$¥qüè2N&3$´°>½XcÉ‘ >¡ß½¿_ÂÌ—]¨sT‹~'Áª ÊÙµó»hÅíXLãˆÖÙÇŒ–ÂT<Ç©_¹E¬‰Šœ¶ƒDKvî×öŽß€"±d 3ßB¢Eˆ•MÒ|Á¾ˆúk°ÓÛMSÚ ÆT:wnîÀÑ q÷^> §ª‡—"¹òrjâ{ä,¶Þ–29þóS¢Ž»Þ8ûÀ‘Mo—¬þ7"iZNËê³&7ÞgI[:A7+ËW
-Š¢„Ù
-Zh`ܾårŒÄ ]“¢Üyãyzßq‹Cì[R¬·|ô]„&Ë…´½á%ó¿ ž:&b$SoŒ¶¢Òî)¥y‡óbj³w·‚0ˆ¹Ï
-gPm¬6ZGCD†ËÛMÝÑšÄ2Åø©%
-õø®øµó?l—a•ºL˜>UZWX¯ ÀúìíåâÇ~7ÚÓÅ)o¼œŽ8a”åøô©A¶ú"áöº¶æÇßîÃ'p#$sDZ–-Gmº?ï±Ý(K)Ì ï? ½T<B׫ #³ø¾ G9ì~Uvþ>…EÞVvC‰Ý¹¬¯¨@…Ü#öêcÇ$
-djøˆáB‘bñA<KÓ EseíÞû·å*T®UÂR˜XZD ül€cö”‚y§“Cí·¯ÔHÇ!&œ€‹Ws#<*ã0˜x¸œ5}Ñ«W[ö܇ä_¸Ê‘-ÜKÊ}Sd^V$Ù\î~ıó_îza¶’7P/àÖ3ª¨ý”8œ‡úÄÒÕíæþj£aÍ™Gà
-°‘³~NvÈôAǧJ©¸vô:t&#„–õX t0»~ 9:^Œ ^¡4ùñàØÓ»•á»>åÊ9(¢¸[¸°ïüc>£‰Þ¼ù8][9?ýõGEò‡&wˆf†wâݬdÈ)Ùfª@Ò‰ òQ°ì
-¤\R}º5üi«Ë›+_x,ÙÒ4eGdHFphéå“1"…Ñ$m‚zû/2úžqÞZaS#v{çC^:ù¾ÛWà$Ÿd­É/õ°>S¨®wé¶Ù@ðTlÏe‰±”r³RÞ÷˜/¦­Åz0®]ütÓ^·“,±Œ‹âo”ues
-û¡Õ´a£AëÕ0ªT–Ãgwc :(°ÉÊ·e5D)ý<oÔöUß!W¡¹–¿›/}BU•U…—ëywðê¥UP´ÜÒzò;ü™_`¼lù+^ÒU7®ëoä$~Ü$hnU(Ó@ Tqð8)³»dÍ+³±-akJÁbdœ¢ É”“+™Ïý‰G>' Ñ—ÉC­1öv 1§”°=($*Ë7w MØ¿wUœú>rÜãî&6·Áõ”í¸QTà7pn7Ä´ÿE9¬„éê—õ»Ã8Õîÿ¨¢]|ö†T1½Ý‘Û#/íK-Øžî%‹CC4Mñ!Ô®\$x6Ô·øŽg:dþš™#w éSw‚}ÏAN¥c6O\ôÏz¨Êw4¤¹)„¿cã<ÍoÔª¶*™B_fæXÀtÃiÀ/ IsŸªÂf}Þ?ð*În gæSû„Ô´û¡B!† bJ:P˜¨zö9¶ùA‰‡q³-‚0]C÷9X,ÊræÞÌ(>Ä#“k‘”`¦÷­üX]!3P9µàŒ2G ç…3œ„y©ÈÜhÃõ‘œ I3/y͘IƒÑó·H{Fnn…u™ãªåÁþ/£ÆéwÓVaáú4X˜xgÇŠˆ1Á¤«Ú:C_?yGÑiœÂé}@Èô ž
+xÚuscx¦KÚmlÛ¶ŽÑ±óƶÍNÒ±m'Û¶mÛöé½çÌÌùf¾s=?žªµîº±j‘‚2±­!@ÜÖÆ‰Ž‰ž‘›PÎÜÚÐÙQÙÀF†N `êLød3€!#S1w²üý‡q
+7°6·rÿ_üg àîÿÿä‘r2°27²1µú—LæŽâæn
+¶Žæ½dB:&6¦ÿàTÌÌ,m
+`cü%ÅlŒlÍmL •þ¸ÒÀÁø_À_´‘³ƒÃyþ¾ ?gÿ¹71ÿÓ
+e¼GÒ+‡eYŠËšûÀ™˜)ª0fÆ_¥*
+ƒ+ÅájÉ%ÜA‰‚Œ"ŽsN_Ç+Ç w E9}ÃØ‡‰•œ}"â>(yETþ¨AÆ/2¢b‹î‹÷¬ytl/‹_ž_ -¼HÅ…ñp)/iå£È 1?Ò)Êhš +ÝÕ8óB!­ Ûxþ„ZÙ¢¿°Ø/ Ïæ;"ãT{mˆ«QÊÁÝ9ÑÅüjVÖfòú{Ä.ŸMšEÇnv Ÿ0¢qÉì¨!r¥ÆÒ"~ $Ê Ö!f ;i¯i¸Š—ÍÁï¹kyVHUÉñz_†X­Þ´raAá¿OÚ%~»NVµ;¸þ—ÁŒ F‹©"ÎŽ
+kÓ“jÇ­šPì^ߺR„yC«÷Z¯›Û«yå‘r^÷5ƒä±mó yœÿ\/ Ž€çMAIÜE¢z'"ÓE j¿Õa,ƒSÕìR«K]¥×ífo\BÛõ˜ŽEŒ<‚©!š‘~^M‘õ—§ò|Cc¼HGÙ±äã1!éò9AE[>
+}7üÈò {ÓêQ[ÆÑk·3O!À¤XrÖÂÖ†­ +º;Ý.,r:®¶DnÌœÒkÎŒØÞ=øô! {Pç—c°Yó‰iùÍ ¸ð=¶P8ö0ô¾8jTo.›'QX‚‰~•W™ŽoâcìÇ×6ûš·J¦0è w‰+5ƒ#5ú¦©3JoÔêÞ4º…«ç2uÛ>õXòR $êN0bÌäH}wúÎ ‡ðiJóè8ô{ÿ¬†îù¼øˆðeò«w;òdH¦jœÏ`™“OmmÝ8]çûˆ
+Üîv@,3û£JÆZrÛËõªpFé°Q#•T°
+|QZÙc_ŒâHü˜Šç„Ÿ±ä:t—ïíL Tù9uÕ><uGÌ ÅÁpàñ=]Ìbê0H”‰Ñ·è6'Y¾Aò ÐeEoóŠYËýg*&âSö
+œè{én§Lþ__ý˜¯¼OzJºïY©!É‚ÌC†|}áã¼iÎ>*v«™ñŒqHš÷Rï0’$-Åri6^$ðâz]BiΊg9çG/TçЂ·àÀÙóI%‹O¡ù›‹Î™Wd§¬Y²ÿPÎÿŒŽ˜Zž<:Þ î÷\¶y6õÛÉrŽ36-&dbæ Ç6±Yy8N¹’µ.ðžŒ*ŽÓb„øõØ&Ïœ= ~Íaíe¥‡¥i"’И@<ÄXƒFk›·F0± _µ2ǸGž+ðv!#×hRЦK#þn¤šÕ7cFÚQŠ’ËÛÕþc 9¨æô·-"‘L¾Û¥Ç€XÌIdóN¹ö*d°Ÿu-ÎÃûÀŠçnÊ5ïI¼`nK4†ØÞ¢ƒ:,²™t@¼h/§ô Èúé:-/XÍy¡ŽQ÷ÞË>FX~ê›aŠû «?Ï$ÜÎÚVÀý¥å…¸!ê’wïvP%91TQª®ÎÙƒIÊÖî,í
+·.ŠÉ¡@À×‰ÍÆ‚AáÃ<‹¤|#ç#Òˆ
+o©³ŠÉÇËÓïX[NÉDâƒA:O•ù‘45±éd[Ц«Í|î)ä¬3'q½oéÚ4ÆgÈ¥/ûî“û›ìæ<s¨þß O
+/bUpEb׊Ö90ØŠÀ;xÎQ½â‰¹·ÔÞâ„Ò­ª¥æŸàè”^]"I›‹€c‹D=¯æC› „Ú~ãE9ìŸoðÇ2pi4Ým¤ã`È!õÔ6†¿é"_L^ï¿<¬r:cï "4“of“µñ¬ zp1Àðæ4¢qŽBë´Çòºt€[=òj´‘ÃÔ¬õðÿrYÞœ¶¶ òâç›ÛI¿ËÛ;àü™5eC5ûrû6‘‘È_y$Å—ñ®ì >ÿAéZ¼AØ¿rYþVŽûI_NÆ]¬½°6¢<·;Ëmä|¶´¤ÄFá67g€–˜~
+ÂHüm ²µ¢¨,5çV2—T]q­Åîæ”Ò JÁNzùpuIoªÏmµÆgÚf#;ËM/¾ŠÐo:ë«JÒߤ S­k=²
+§L'ÁUüÌXUƒƒOJNt,èÊX6ðÀ€yšp/aÙ÷¾·,®1‰RZksØ·{cð'ùžGì-Îê2[(ª Ù'…ŒÅDÆØŒ
+loSÉyÄ/û€PiŽ*ö=|‹SQa¼ÃÚkt©Š3:‘ÖUíp6Í
+±aPVlÈJ8>…{⦊  '„3KIø8?Ü ™¬W;dSüOïO§«…‰ÜËÀ€¢kÿëî¡7˜\äÅd”ž’¦xÅf¡oþR~›|&}½oe"¼ù^¤ú?Ȱ¬L/C?6}S~üî#?*gz¨–Yê—pB.¬”×^Ú¼
+F‘¢ËmÚƒ…þ´ðƒMI€°Ö7ÈSs1SóJHÓ•Ä æ`£(^ò4:¹¤YX¾Å޾nnm°!€iú~õ{Á[µ0‡D\Ú9µbO –¸cí¯RÔ a›+»]A‘¤\ÌJîø²1¿š:òøâðÆ2•|âõ<_H ÿèÒù?аÙpZæV!~À°Í·ÈÎ6·ÔôÁ®‰‘óæÑ¹dG1ÉÇÙ
+`H»ÖkÉÔs=¾ÈÓ[Ö•“I™š„Æo½–ùQ›Ý’Ú³òÕ`’ÃF
+BÍçÆn‹Ü€úÌ šŒø˜Õ¼}@ÅôíÓ‡TŠxIØ·ØÖ‘Ly‘ÆÝñôzBÞÑ?*G%ã·zxfÛXÁjF>.ÙRtÿù{6f³ ,9cL}§0ô'¤„•ûÕ
+9Y,GM+3Il:»NÊg~z¼SXÓÁ˜%EÆÜvÁ9ÎÔ:æU¡Èb”).ç˜ùÙ1’½22çÃH>!( 7—"5Ç Â‹Ï‘^;ÎTt’ð\ŒÀ‡,–ŸÅööÂóÒL <l YùÚóDÊHEZŽƒ0‰ºÕNß³½¾³¾²am+JšeÉIHàÑ~Œí÷‡PXj\-­`“£Fp)+ö~În¬pÆO:ª± ³±˜^Û7%±×+èxRd©Nñg 3 ¾)Õ±”©…Zù[ŽtHpZ_E™œt¾ÌM IÙSGY>2â/õ¥T¼_ÊrÓÜcÔõ“îœ×rP¯:œâCMõ
+Ý€jk\NT:Fî}õ ©AËVŽR§fHH£×®:ÁËïë‰ –É–ú~.@O¸¶(.ס…héµ,T¸Õ_xË1›‚RT°×ÛaùÄš\±§UàìføÎ­f‘¬w~âeƒª"¹Í…>Z¦Q dOñ¹¶W £¢?,™§[Bú•üÂ_ŠŽôvSu¿¸ÆÎ³>6Ó)wŠ&ÝhØ ‚¾)æßˆ£i)“API‰eÝ:øòé”~h‹ÌPE}ýªm™Ò‘Ù¨ ïèW‹ÞÍ©MV…R¥ëÉ^ß¹|ÐüØ®oÈ÷\r4%¯oS;™Ýƒo•8Än3¦âqc hGˆáUfs#m‡v´¨“ ¶]?Å{kJ°I¿UŒrå\sõd½@ÿ(7¥Cù™ß"aMëH"—ƒØ´éùé Ù“YœKrøÅ}å|}»oËúXõè1oRüs.1Õ§¥€;Ðs¨!"Ñöéúë~i~™y¢ÎYï7L¸?0ª …ÜD/úÜ/ÙÇŸBqæÜ¡
+®“­.Ö
+#­Z{S©P-m„wyý5Å.1|WŸ£Ùññ¦{"wC¨‡þ=;†Tb;ŒCB—àrºö´nƒr¬ ÝÈxkˆ@e ×ɧ‰’TÓ¿ŽÎÀRª·pšÞîlbI¬†>/~‰â°ÛÃÈ®ÃLÀóW¾ïýIÕŒ¯Fhð€S4ªxj8=÷óI9 ï
+–~Ì]ø&Ý Å:½Þ)-4uüL%ždãSÇ>¨©³ ;Ü–WOR°ÕÌDaï%!»Wx™ö3Îyè14úê?î{úØ£#
+ÔW¥µßë„€9 ï6PåG^fâ÷¦miX. èTX7u+,‡‚@‡Ÿq{U]¿]¾©Ÿu(E3𢪨È` ‚ñ3¸üÕäšÍ\ºõò-ÖrË a-£üçýàÓ/tÐ’4¯®î´/'Hú{»ÇËi1F…µ­¸òºÆÅ
+;Éd"³}ˆå›ÅŒ¾“<EæjéÂ%éoe[jeÙ)ÂX]YGy:­n|q7 ”ŠøÏ›}ð£tÉðJOÓGV_C¸¶ ]·{?h~qàKHÝã®çèÑWr¯rê(&ehVü.ãyd9‹ÅaØöVÜ¥M¬_Æ$ÏÃTªj:Z“ÎlŸ…Ϊp[ÊÕÔw³ƒÀ¼5Í×m2!ã5~ðô½à Ôa –™’ǺÏPÌ(8uù4Ìèw²áò#/þ`m`JÔæv”²×ù=’$M¾ÔéñôºÍQ£äwز–Jæ³%T{(,P‘ØûØÖ8€t¤ÐuÂãÖZqÖ˜Ó"ö—ìDyßÔ ÞýüU‹ô61Ñ¡ôm·8ȯ²‘Ny¥™`ñe#êÌæçWÞ¯þá²Ùû+ÄáPeX= }b³ØJq‰.¹m妫äDK
+øæ:àˆséhvÁÑÍyUZsö¡ã’åÒšâÛ~·3cÃyµìsSÆ
+µ€æ úGaóøÕzs·‘M›†oñôü’%] …‰¬•1"{Ͱ¶ž™‚B]NÖTz·]€ÿIpy_b«B&…±‚ÛŒ!)"æ˜çy!•-O÷’îVŸç(¦¥7òYC_°â¼³ö-6~‚ÙkNô»_|Ÿ23‹³å> kÉkí“­Ž P ÝïÃâœõuÂr<)<—T‘_iŽË)Æü›|™äÌ’ÕI‡Ú+9½ß[kqjÞáZjï~§ù®«é‘ð3‹ZÕöÏLÖšçiB}œâÕ +òéQrÓŸ>£"–æés 7KÛMð¡–¼ó
+´º8úf?Lj俬‰j¾5¡¨‰Þqb!\Ebe™“Qy‡T讳š[l&“‰T)þ‘1¸Rn½Á±FæÈÕ!f7\ Ðä8êcœ•İ+ɘswvÏ7ßhà Ñô³}}6ºÏ,ÿóQ”‘Ï-v]ÌŽ°–~bEÇQ«N¿Ãœ{ÆÀìv¯àyäù$p´&Àl":™öêãñêTT„13V › <;„m° ·ë¶’¨Ë¹©?e6(nš6ƒžÐ,•>KÖÔ RãêØ¹¾é2ýW
+ }3³/="—²Û"=á¡Ñ=xNÂ˜âø œK;Ú îÇîÉ´p1±\!y˜é=³u†rš.¥BÔ<B~®`[†Ñ‰¢È€±‹¨]…üô«éYvD— ,Ž×вɼºîã'¸løÝÖêxŸœ÷çE÷6Ag`Ì$ Òfƒ>ã¬^jn'd 6ŸÔ<?>:|e©í2Z#è `êpõÎ ÃjŠQ-ÚáˆÊô+”¡)B,ÞŒý£ªÞ‰¯!î^SÐâNz8aFRШ¶Åé+~³çÕ€¬ Ø>í±:hoÚ¢)ù
+0A[Æd"z]£e7n×k“ô`Û9Eú…«×E§ëøåèí÷’þ63™jKëë`R=»Î'R³èÏ;ÅBÌd¦‚wúHƒÔCE4-riéÅ}">d&qy}]Ø”]ªüb௒àæä>ÛÖL°Å µDp¿ï¨OAÞlŠ8½3Üs’,ú\ú4̺´Ó¯JoÂwELœG(@ÁW_UäES«­uâfö [åîÚJÔÇ,Y¬éœËÚ"Y´ý¬‘çfJÇìòfóo(²5»x’_Âðì`ûã¥Ý?¾K  vÝNû?¿EÝ©z-K0H*W„ŸS-T¸d[ÔsÄÚç"‚‡%FJ{I¦>?Ïx9°^4 äúáŠIZÈƖ߬zsJ„a/¼º„QPÚ|w%|P}h‡QÇiçËÔ *'ªÍn,ØÕ3Mt¥q\5kwðê‡cIË䥈MÍmÔ¨"C`&†-š"@¨„BT|/BšÊú噽 ÀÔ!o˜5Iº5Ž©¸C‰ÄØçª›‹P”AttYM†ï$œ Ãïê}#­ži4&^ÁDZ_`DBk˜r
+$PFgŠ
+™³8åÚcrÍÃ8²ce7(ÍBäAõ,IÞË)v{m³„fSÿžlm1g[ \^(ÂXèÂþBKˆYCðÝsFwTÄÁâldôŽ›°ùµÙÄDò7zzB̲:ò¦Àýô&$½÷k&.1­|¿ëJ§§QnÅ/™7¬áŸÇÈ-®H¨ä}ñ€L[{S–¯Òæh9lÕ¹G‘ÆQëe˜
+]ªß½õ$P@Ïø©è&Æ¢MõH‹¹#oƒQwIÛ*‘5èà±»V}›ÓOPó²0Æx
+ÌÂØíÃvZ8%æ¶1ƒ Q627´¯õDðס“\YnŸÎü”¹ „âpàtïÌV(<¤àŒNCEøáy8·ì±¢òÙåxeÖn(ï@œ&?4ü¬VVa€›äÛ¦¤z
+!:¢µtéüj[Ä”¬¬’̨±¾_‡.À´wÓLÓŸ)9»Rn©â#V¤Ùq2ê’O2¥©b‡pòŸºwpzÕÏÀÏI˜
+
+BéÊ™4ç,~ºÍkÐÏ
+ð5G^…Sg+p•`A‹­z÷ÆñÊör€¶âó£¿GNþø!®ß¤œüzÓ)EôÚíÂ0Ê¡à{˜/|<ÎP³K ž™p³yd´Z}/\]æ®-`ó0úf%M]ÖDÀùâ÷l#Ÿ œ,uñkÒú0ËÄ ß7SôôN+ëÁ!&Öä¾\¶ýÒ9}§FyÏ´ªÐxô° —Ýô¢2–⋹¾ºi±WBzTµh³÷‡% «!7~ôŒ;,“ƒÞ´ׯû,¥9 9F±¸‹{}ÂMõç²!ê,$iVDKtߎ³µ˘«%©™J\;CgÄøÐ"?'?ÎÊ¥Ù-öµ®kM{ôEßKÕ%2èDÆ>ugû‹Ü––iXØq’OZÏg“–ì÷¼vÝÓM¢#Â×|/hŸ8‰Â¼¯¥mòÏ]²€‘ÝdFfPº½ºL#*æÐ_Ò3ê,`r›JXÝ)íž .3H߀¨ã7—T.ÖZºzdÊè‰ê’%»&q
+>VYÁUÑDTÿûVJ¿²CæÎZS­K…ŸÕ"‹ »¶g©´-AÓ¹¹2ÔÎ÷6Äy܈¢¼š†Îª?Ó“R–å—ÅZ÷ÇIüÔ¿vðÆgªˆªP–º¤‡É¡±øõäxa-³œç>)Á„JÕ/€f ˆÐ¢½Âõ…~r¥L)'ë'u‘‚­—_|Jôá{e0t— tò“Îþ8]!U[ñLãÞTĈ=Qv» —ûÖÑÝzØsŸ°=V‰äKV6 eDñ~3-ôUWËsí·åxòžÔ¹„¾‡l‚¸°­KNŽþB.Øø ¢O¥Qæ„$•.ß©&æç‰ ·2õk¿¿yÀD–˜–‚|L¿~*%.ßã{ : qTˆ?È4ïS«Öl*ív‰õ3Šs‹pƒ­è1&4>³eÞ,
+ é.öh\íÎA™7¾(HßN])±ÔQ"ÝÚÀkŸbO;z"ç°—O/9¦O•OûŒ .ßž…¦# ÃèÑhËÐW$sUan€:$*DUŸ–G«|ïþžè4»ôÂûs‹Q¡4æ–SpõL&n¨ŸèË`D¹þ…«‹ÁÐ9”vœ-êÈmþÌÎÐÇ'¡—Çc'¢[/jRúe@¡¡J“ ^à”c´»#Ø4Ò¶kùwÙu`ŸÆ‚F4ˆ”§ŠÃnF éý¶Ç®q5‰RÓ«u©ŒÝÏ|ˆ×qpÍï“Ù—“k,°ŒR:¾ìé<c嚈æòo9RS¼bqñsYŽÕ+Zô“wc&ÔÔ¾¡Xº$f¦ü‡S­š¸£–?ͳ)Ï#"q]¹³kçé8D{9•¹"wš]­L°à~uŽ#»9/Ü»F
endstream
endobj
-1479 0 obj <<
+1941 0 obj <<
/Type /FontDescriptor
-/FontName /KXOITK+NimbusSanL-Regu
+/FontName /ZHOJYM+NimbusSanL-Regu
/Flags 4
/FontBBox [-174 -285 1001 953]
/Ascent 712
@@ -7376,39 +9632,57 @@ endobj
/ItalicAngle 0
/StemV 85
/XHeight 523
-/CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/a/ampersand/asterisk/b/braceleft/braceright/bracketleft/bracketright/bullet/c/colon/comma/copyright/d/e/eight/equal/exclam/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/q/question/quotedbl/quotedblright/quoteright/r/registered/s/semicolon/seven/six/slash/t/three/trademark/two/u/underscore/v/w/x/y/z/zero)
-/FontFile 1478 0 R
+/CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/a/ampersand/asterisk/b/braceleft/braceright/bracketleft/bracketright/bullet/c/colon/comma/copyright/d/e/eight/endash/equal/exclam/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/q/question/quotedbl/quotedblright/quoteright/r/registered/s/semicolon/seven/six/slash/t/three/trademark/two/u/underscore/v/w/x/y/z/zero)
+/FontFile 1940 0 R
>> endobj
-1480 0 obj <<
+1942 0 obj <<
/Length1 1199
-/Length2 5113
+/Length2 7889
/Length3 0
-/Length 5887
+/Length 8673
/Filter /FlateDecode
>>
stream
-xÚmsu\”kó>‹(% ‹Ô. "’J§Ô Ë..»¤ Ý" -’"²t·¢„ˆ”JI#-|WÏ{Þó{ÏÏÏóÇsßsÍ\3sÍÜ<œ†BJŽH{¨:‚ƒez0w{Œ§¡BGèÔ£…¶ƒq€„€‡Ç††Cÿè‚UPP;4 ‰PµCã|Œ\0@];P „€eÁÒ²â`Ü,ö·#% 4@ÁÜ‘~@(Š‚Ã8Hé€q‡"І8 êxê‰Ä  ž²@'\…Î TAzø¢`Î.h Èøž)¿€€à?ˆŒŒ ÐÞ÷o¨
-õ„9#€¼¸ƒŽôø• G¡E@Q¸Âù8Ù©9ÂпÚ‚\ÐhY';(Î&ìé$Œ€¢EøqŪ!Uî¿<¿ôS…¡ ¸Æ|Eþ¤¡éðÿ#äC8þnÏã!bŒ€=À@µTÿ€3þ±9CÑ@ °(X, „>
-ýëAü‡îßð_ìJg8(ýËóT‡ù@ `h—¿vço¹?P¨Òöë‰ãB$ ÿÂŒ\`n¨§'n(¿!(Âñ_IÕHGÂhˆÆ­¨Êñ¿†_°…Âéô{R¸Ø¿ïN0\‰P¨Ô03‰t¸æZÖr\£Äâ-ôuT¬KÒøðÃ!ˆ‡ã/ tê1º•±ˆüNÏU5r‘¯²$Ô%ÄHbQ‹—òv“QÆ
-“ÒІÓhF3~)§'{e‡ 4¾ îbNŽcÌÌ[SñíÕÜæ¬84ç‘W¡1Œ@^Ävl±²ú@Ÿ„…½¢¨’\u’_†þ4dK_xW–äý@«*Ø5$2“âN[ÃÛ¾; ßh+±4¶&»•)%½Ð
-ŠßiUÈ¢«Á¬|g 5 ®àê,(/Þj>W0òŠŸò•—}ú¬=²’fÛN|7PéË<3F­®ˆcå
-+
-ãÃP“ÎðÍiK9ÀK¾éÍïW$SÒÉÓÏ^"Ñhî(^®¢q¡«Ì5ÏÁ:´~ð²‹(èîä0 Rfüúp£ÐDzfçÞUŸl™!bçI,ªÝ«Å‹ÜÒvÓ&d_þé;ÕXIuÞ
-ã˜ÌT—š]-ë8½ç KÉ+Á?æ<×^ÍätÚú& 쮇Yõ~ðü85câ•ÛÜ2ÌñPõe-5ƒ¨Ü…­™¸ÙšBcF±â0c÷تún_Î ý·zõ#lÄÅÏBR"ÐgÒ±µäZþ[€™ Г™°yâÀ¾=Iüaž¢„é<ÆQÂVIµ#‹7…“ƒ‘êù'PÆUh¥áˆ¾r¢- É‚¥›_×3ÁÑ{NQF³ºŸ'é|YE÷™¯§·ÉÓ{ ^;w%-àb^?‹ âï0¯å<ô(ÿ¹™¥$ñÍòé°^UØ„•fÒí&);Ž—MûbÆgqè 0½ü
-)ÁËÇ‚äq± gLOµÉã3òx3N²!dâù½ã’óS¥Šj¦
-lË`%˜[UbüJ(W`aU´<q„õ[füƒþ>-Ýûºió£
-?0/ØÄ[ÃHàm¸?ÒÀv|!^‰÷éT Ô”q÷ö¹Æv¹±Kßàõ(BQ;+¢‰â[7ˆÐ{ éð|>ø«TCôEt%Nê]ŸUÉ×É‘¦5U§VÜ|~v{ÈjW‘J¢àÞ #ùe2·ãÉà>œ€ÁýG³uݳׯ™ ¥ÎKäT¹;Ýò¨ Ñ^Ç%s|)­ö
--¡~žÀÓ~[ŠÞ6³cgÚÌaj|ÝŽb:’¨Ž¢‹Ä>þšÎ¼Im±ö¾÷ãåNBcÉÕ£y¶êÍu³PbÊk¯b®dñØêY‚û7¢Sê—ܵòZ¬‚”ŒæÄo_~ÏŸ ÞÉÖ Ë̵£ ™q[¤Ñ œ2ŒØ¦¯é¨Nã3ìá&À×põà R gÇî÷˜Ë>jÅcl/Ò‘ ýX1Óò­»®‹c ¼5p°Äƒ…’SžÁ£—ÃáZRºKëÕñHˆŸ½8P}»cŒi95ÅÈÕŸ¦³9Ÿ+eü¬\ý§rÒ§žÒ…ÜMío4¾Ú>à°…?œ)öc8\šŸN
-öK FßLÌ$ŠûجÁ1.¤––DÓHØ 3ÅÁ1~Ð ÊÒEËš¹­¯èœ3½~;Œ¼J}®­6£ün*˜a¯øµ§8ý5g<D­m@s6ñ™¶.ß‹ËL…†Ê˜°‚¹¿Oxá)ppþCi‹‘FfàE`1±ª'³bÃEþÛçÕLÑø
-|†ˆ±H_šéÈ&w¬®¡ •M¦’0i6•˜Î{¯ºu>Fmpå|¸ÅfîZüN}êÙ!6jf5b~}y_6M•×Òa»µ Ú mÅ=lÞi­ÝRã¬ët½0™¾rFƒé«êFÅtÎr-á‘ÀÍ=_²ˆéÚŒ¶®µ,OZsñÔd-ú@IçI}о¯¢‰œÜÏï™F—/å[½p! ØÇ²¡cu?½o‹7Yk%ß©£Ïc@hYYIƒr&é(D4æJE-ׇˆDØk§ÚÓnïÖãŸöM‰ôÇœl·ÂFÑ÷_^A>h»®ÿ¦IÿÈ7á ‡W¤²MµTTAkÒw'û',’N悤ôC:1#ÉÔÐò“à ¸þA1Õ}/¹ÑüÕàž ÄÃÑösŽ˜»FW—²ºg%Î7˜MYº'=£ŠÊ<W°§‹§ΔaZòK'+D4ÉáJS ˜Wªàæ‰&<èü¶þŽ.ä
-°4r3‰“œ p~c¤Ò
-³<ø¹þƒäÂt°û‡£5Ä R‹ePçV–¸S€`Pbz»‹­ý± Û$7ˆX˜: hj³ož"©k?‡¢¬jÕo‰/ýEyvÇ›åÁVoª8¨IuÛ9—àIÓþÑÀغÝÇg½R›f~ó…L¥íÝ$Ë×w3Ýf[‰dÍm-Še²J @¶g¸öÞ@åMöoX›¾×Уº«õ‚HweE7\£føÃæb™äa£±•Ô„¸âù®² PîwoŽ‚V·Ö  FqP©ôIÀ¸ÓWšä¥‘÷méÖ'µ}—ÖL‚m–î?J´Yž®Ïúß{Ni¢«R+ŠEaû,‚ý3n®)ÏDDÙ²Í?ÑÁúÐJM,&“”’±ÅÄ%æ_ý¶£E0ϸ”uå°Ï‰¦ïŠmn–ä)ÀŒñU+3X)M@ÉQ˜t:Ä>¤Š5ã[ZÔ¦\OĨÌuµÛiv—ClR`ø©Û`äX¨Œ*ßbù…תõrµ¥ÔèGQ_FÍ“®èÓ„’«£5«Ìyuq OgØGVŠˆù5ⳉz]éxåü™(Oö¹û§¦¥´–>• ^#»sFlí1޶7âº_`B«yK…™!¯É‘]³SÛa)ºp|èb•S'ðÈ¢O$Ä›šº^{XÅ-NÓü:ãÁñ&¥u’+”zšëj½›GÆý<NŽ*ר¦†{“€¢£òþ$*69%x
-ƒùÑ»³=^Zô¬ûÎo¶p~kÉ {S"@ŶÔ3¾ü‘m2]~
+xÚmweXœÙÒ-îîN‡àÞ¸÷àîk qèÆÝƒ»'Á œ Á4¸»»C øÈÌ™3÷̧¼{תZUµªö¦{¡¦É&aéd’ur„²Ù9…
+rµ;>CÒNn G¨¦›³³=d©‚8¹¹Z€ B
+ÿ=3@ÊÉÙËlm0jkè2±°°þm
+
+
+̽þB
+uâàp¶2=ÛØ!VìŽ (Ós±2Ž–RN¿ h¿õ“»‚,žóâø7 í<}þ²;ZþÑž¥›3‡¶#ØÅ ¤ ýŸ€gÚß6kÀËÉÅ)È)
+ãØ9gYb IzÞ¾”W¿ü鋊}:Q©<Íp'Â
+í‘<V—ùƒ/)5>@”hƒ IîsWá{.‡ :weŽ~G»EÇ´»YxAo7µ:¿$ɶïá{ù3 ,Ï,Á!Dë™v×N÷6wTCÓc“àKÑÜ éh>Yú
+í¨ôd›šsã5•ÒÆÄÝ ëeçøý†ùìnS¯–óƒP£þ£ÈÂ÷·ó:î9ŸÛ†©}¥ë>ás½z4ÕãÑÛkJ+ßâ$éý¾'{þ5{h§^öã%baqpR8ô^ úª‚Ï 5Úü!cæ|è*¢Ãì0Ýᇸ¹<’Qø>™­èïg#dóï@${ JÍUÉxSr¤5C;1†žbÖQ «·Z‹Ê+3^\—d„©ml¢D¬XßïÇl‘ hÈîcp˜ºô?½¸ñ(ÿµñN‚wJ¾tS/ÍnÍØ.@ªÜ‹Tv+”²¥Ç`påo¦û4 üÁÈw¢ÀÕ ä(Ç ØÐ½ÿ‘P_‹[ï¶¿+$ûÙïª(ʨb¦¤ä…ò‚œ€éåç½Ù6'qžþFùK¦ƒ…Å@…¯æ?&k!dSÈì¶`FF«Gl~ÿœòøÙ“«Ÿ`,,Ý&\4pžÀÉN{«írLÅwïL“ÅR ÑÀ<~ér5w6™\èÀi¶(JÖÞœsÈ >,$Õ­ÖEÓ4#P2bu|è¨Q˜g"Šjñþ…Þ[sà–£ÇÉ@¦ÛWÄvT–4W«<c/²
+¤Kr.²áæ´OÎióòœ¨Ñúm@¸êºâ»ðô^FxïN¥«AÛü‘‘•tJÉêž{|‡Í‰ È)-ÕÉÌ¥÷"CFçâ8¼w$¨O‰´b$w'phoìሮ?×77“jò?‰®KÓvÛåᾇºß-3$t˜£Ñr[¬âvA·^Å9¡´_ØN—­êpØ|³É1´^E5x ÏZ|b>¦ˆ„ y'E<ÆÝè;’‡ÃYûL©¹‹ð“öZy¯¯eõgIp
+[±õƒ6ļMð"×g{È›S—Å\TtÙG )ÄxƒD[Ñ[}ùë5¼ë«˜´ù ¶Iæe"l€; ¦xÈ_G1o­dÈK~iÓÚVF>͋݅c:‰ž‚Ü3–÷P™ZЯzßdN››ìåqk/‡~¾ûÊ|ÿ-4àE9«'ûÝeVšmÁèžìµ‰}Ìãáq'CBz"û">ü и;–öÀ×™P)(ÂRå-Q*¥fEY•¹‹ÙC¯ž°ü:ÖÓ/] L,@ÐÇoÓ»þ(ôH)›¸‹ýaOE)à ˆ¿‘â2ø5ô:! þQ=×Ë[Æc¦àôf¹Q<oY ûM/0ÿôÓ¦rÌZmHÒF«Ý.Ýãuú~Ÿ#·
+/Ç£MY g“®¹f…]+ò£ÐW «Í=f’ÌiŒµÌ%q—KxN?òMªŒíĺ÷æÖ•qˆ—B½(°ø}<erkë‚á añmèÀ¥JBÞåàoHrß©ïÒ®Êë%Mr|_%Ã(ßÔlHƒhVkõZ`¨l*Â?Û±¨0^ök[m¬¨&¼‡š¨RùGž˜ô«ÁeV;RiË«e\Ý©Q~?¬0ÒG?Þ OFÒ“5%R(Ìÿ Îy5%B“¢,˜Âpþ+y­4BÕ|*üŠÌ^
+Í ¦éé@E"’6§¹Š+Š´ƒüz†¦ÓhàJ’MÚpBàÀ΃”œ—.¶L_j°ˆêrÏRNnŠd.Eðr¼çñŠ‘•é_Dè}-b;ÚAè§gí(E
+7½s©M=µNAÕ`á?ÿ6§B6æ¿ZjMª~¿¯ZéH2
+iì<~Ï\*—ëŽÚêБZsÒ–ÅÀÈÆe¨³"ã÷š-r:I2qŸ§ÀÝ.¹ÿôö Q¹Í7RÊõI=söm!éQ‚›tàŽ|#Ù¯Ëå¼# ±Uýl«…ÕKúÒ/WøVÈ8&”Ñ7ìÖØR(ûüä/^€'¾¨Z´‡Ã,Q¶å‡ÐÕQqÈ[žü¼Ý€Çi.;£ˆrL`ˆÉ<eØ-aɓͷ6Kú}½`2°v„”Ý2ö-YcûLŸ°šr‚‡4g “ùúÖ¹’àÝ”“Ã-I¸#;c+K=døÊ›{)ÎhЉùN
+yÁñýœ’Y?6¿§\yeÒ¼Ù?ëÏþ)¥h “þ:±wDgKñæ3f„Y'T(q¨x¢¥¢Æb Ó%;È\a9üº5ÙPijÄߺç>áÇÝ4ÿHXÒÅ+Ú[®_ûæ#¯n£úï–*†eídøA©>仨CBsv¶ù§qôêà"–Lâ6”Òˆ¯ºÄûnH
+P™³ágéó°ÙåÐ߬ñp "›7‘Œ¨O/yTâúœ8…ùö“UnÏìK;?V‹èö¡½<*ÜMd#o†§ F©T¿¤òv";Aè5—ìSá&¾ç›n¾xú%@œ~ÏY+½€Ÿƒ«ü¿_/ƒþzÖù¸Re!º®/°¬•ÍÔ Šåú4c2AJ¿}¹ ¬¢-}‘í3ËÒLd
+ÅÌèdOYM²¸n%14ÌõM—ð¼G´²>xG¯L×)µë{«×¶äM ŸNr7¿Žðå%+Oî™Ù íÒ ç N{À0…ÕÔëQf™A çNîtT½'“â õÎûbŸµÁÀy›y¦ÈÒy¿Øsuäó‘»âëê ¾…Í©üɽAø_{áhÅŽswçHźȊ%O]sw,qùlŽ”H7Uã—јŸªíUÍ\£ö·èèÞ(I{Ä·«¶é=ð 33ݨõã\9<%HÓs<®øµë10¡7eXAp«ˆ&O³`#×£¤Ù ÓUÛ‘‹¨Û}û}>R6†rÐR ¾±BWQÅÛÈ;åÓd9üFê»zµA-?L0(.w<‡{'¯„ЉýA7=I¡ôããÎ^8ö´úãȯàà©YÉk»Ø>9(×Áì‡6øtŒ÷Í
+iˆ‘5Ùå–¡I°-Ø9U¸Ì¢:œÌsyl‘‡$vÌ—m"Ûi'ÇAöL’bÇ‚èü‹s|AKꡃ궯BŸØˆAæ•|&"CåS«{ó<À <v%õaž|ì4ßGY…,„m†³È?4c§<Ï€kA‘Âú)ƒk+&IÙ´Ú æ)ÇYSþ*X64 sK;RKÎß²Üy½ñ2÷;Tô¶‘ãG…6Øù§}ëѤ‚­m¾Ó;ð…U ¾%=Gu¾µµH»á¹ŽýBÍHuŸÈ[½‹–çÞÅ\hNîýòõÂ
+\à× ¬®t·Ü¦㼌ök€¨TÈ»®kLØ>†²oi
+yêÉY$R~ÕúúxcÆý­²“^Û\ïMúKë̹´·¡TøTF¾üV›w µ@×R9ðSÕ<«¢S!;ê†nvÃGÛa´[IÒ˜N”…Çë´‘"IBÞP–œ1#Ú·­QµI©}#ÁšÕãt]£ò.çÝ4òÔѶëA1/Pæ’XsÙä5Z ïwa¿YÔ(³Ž®fÙóKÕê÷u,’µ¢ Ëû"ìûAΖmRgÚ†ôÀH^XGi=ÊìÆÙîòlx¢'‘HF½¯³Oà1©m£p°{k”Њu;×G¯%Þ Š- uÔÞ@
+mly“æëi”„KL+§Sœfߺ¶ Žò×Í#Wå÷ª¯¯£›ò<âD¼q¯ëGNiÙTÝDü"‚1c•£'É×…sfí¤ÀxÛï‹Æñs=Ϥ¹÷*ìá‚“ï`>ÅôíÁ§*ØÜʰ4„ó}‚Ù­rÄ~\É»ë“jéÜ׻LJ_tîçáéºã³ ki®øŠ21:—êéE³2G°áýZ'ÖC!¹Ü›–AÁÒiÖ+Ð\]ž±ƒ3ò ^l³/KÌO7.6GãQþ¥I™ç’ÀI¾·¯=c¾4lsÝâ;ŒóiÁw'~W¼®®Íjw-4¶«ùÂÕë2¤~o0ÍôT>+Á¢NÂ!L¾1ì:¯uœèê8‚÷ð‘…ƒiõ0§ÛF­Ýœù@z"AåÏÈZî†Mœ“>QPÒ0¿´…~ÖÕË;åßmsõºÖÃ{wV‚¤ æ¼VÝJuæ—Ë‘P$Ðf§DÞnH·(ùI“N|ð Ù/¸C̰&°æ&}Lùk’¸£µn ðú‚Z¨G:·ÄüU\ kXæê~”°º« ×±}ñ|b 0#/z £GŒŒª½·}¡‚šd1¤R.˜ÖÖƒzàãt â!‹h—]Áµ»*FY_¾î¡êÁë€æQ„ù ¯]+ÂÞ|›‹x¯”(–&Ê9ºŽ|\;&n¶ª°…["tn‰xÜ¥ùCyKm˜<ÔðÅ‹_Ñjðw6[2g¬TÉï¢Ýœât2~Ý )…î’
+üòk?4pßq>ëE ƒm Å{GÒÏÙK—Å`qf*W´•ªc)#‡/¨Žk«hHͽ{ÅËÑH3 ä†† > wí¥ð¼#þ¡ˆ·¾X3<“UrüQ¦O¬‚ð5UÝ«>ŽXú`ô'›Î/“×’íî[1·!~7ÆØ78YMFúöœÇ„
+†*œG†ñÛ>s²@ý†L§O¼¦YXÞQÑ^ë)Üný‚€\Ž>§\©‰ó9tÆ#ž@»•\ÆëŠ úh‚|˜,ƒ×B»ˆæE ÈsoE1üðÉi~â—Äöt`Øëéú×¼›ÖZeð2pìwôL½ðG¯Xb}Kž‡|}d¬¡¦ès¹q!1§»÷©#2¬UGkñ§ßzÑe¦ØÓ«€Mû´,`Ë„B!Å ‡=míW¹/«×\Ñ‹%ßMš1“….½y1ÊÛ{6 `%’vÄ¿@Y“¢÷¾¹öTŒà ëǘџ‡äOW³”+f4Y 6Ýô’ê>›[î=ÆÏݤë•ÊÇÞžý âøÀÿsò3ª9x¤Dλ®ÛöØëæ£Ä9kú£KñíÔ)90ø[Á@«§káu–x+šøñ¶0µÊ¡¢Ž +ÒlL¸³Ð{ù]* ,꺒‘9ED¦h{ [#IG>m»J½ê*ÿɆùÝmÛ¤3H¡–9“隦²1¦Úl㌹œD¼Î„û°RÅ·—ìÓ‘h3æ
+ØTÿô^iI“·ÁË¡âüVí!®L˜Pƒ<g°® &>qÇK‹V¦-Æ)ÙÎGÅ’<ž°íêÌÛeêÚRŒ¤„¤H´Z‘Œë4šöÇÇ4#*~ éÉÇf2Xó„Šõ¡ê2­ìŒ-ÆÍµæÔˆ,âïKz„E§½CRÆ€$hã‡|²N9¯ìt¢™`˜‘Ù¦×(iýªOý± m%ä!{ó¦M¨$ÓÒò„§‘,ΘÞZO‘e»´è=†ŸX´WÙ:Î6eÒ[æ¦ë,ƒÒ1à~8Š—<’Â)iT¤Öƒ¸jpj´i”5x#ˆó£_+bÐéb·ßøŒ#õ–f‹i>^âê[Jž¥ -SK/4Kh–aæ|µ º8Ì¥5^,1-07¸]”t‰´[k3qŽ}Ä6œT¾z웲¡÷QIœ_ÇQµ«ÛªcUàˆ·sa9îÛƒAp+4fü[‡ÌWZ¾Åh+Ü%V¹4õù·±Œ}?ӛީ¤@TË“ÂÄ j»®}«‰ÞŸ_<’¶O=ëUC˜>WiIcZ­(zñ¹v§HF{øØáAö ûâÈ•¹z•VY±z©·&z_‡JËL8HGS³m}œ"*Sb‘†×‹d~'+øu¢]öÑëæú˜ÜXádgBn²Õj—+8™_ÑüÍ!„ö¾LᢚĂ˦ÊÓðɤQÚÄtd­;Ñœòӧά„7ËE”áWéç„1ÓÉæKÈMçßLG~pèF¤ªÅaă*¥\•çúeGWLOu­$HƒÔÄHO$fu|öðL’÷‰@Jœ .ã-ùÒnV vLþsС¼½=[ú#
+»á~³'±rCÁ­¡6ZÑ<NóÃT·÷Š™
+é¢ìŒåë×[}ý•óV ž†ÆvµÏÇQÍq+ô½Menµ›‹ªˆL;UG´èaŽÜÁNâ²n­>•'}š<Ö¸e¥·xêøÇ·Å™m»Ý‹Ý¿Â$¨·¬l^Tfixúµúôëüäš½¸Úž_ú¡‹£|I´ûTçÇÍLc”5Å—äáMøA½Ü5È>“‘XäfHIªjIÊ«–€x­dXu¢1/’.üX ÇÒ¹/×A)zAù€½)]B%šÊØ:3U¦],
+£‚ÊVä}VúÖÇ#*'ú(!6
+ÿ+웃8öMWã|©òf2©Fã’e®µo‘Þ[_ü"ÎK ®íúØ.~Xõ
+Ø ÿ\Ð VØKµïØË[Ä@ ¾Ì.¯âî·á’Ñ ®lñÂIDbÔìä${Ò#}-Ø)I É0A›ÆºÂÛ}–Õ»üÇÝ׉W`¥Y‘x <€¾ƒR}ǦB–†¬ÒÕ$ÐR! ¦­aß4c6KÖít&p*±kÝ,Gß/ ¢é#0nþ¶=!f¼2‚CnEÖUt¤£,Ð4ÝŽçê)ü|¶6Ü”-çα yH_(íwØË»|²oN•åV~ÆÈ^h#†Xë
+¿ƒÂÌä˜ÞÛn\³+<L@fÔÙ™ÑÞÓïÅÅšBû^±$V–ü}t9›ŽÀÝŠþÇG”LÏÇé,Z¼x†y5ý©Ü¶Á/„i"÷¤—¸§wè¿j¯0wø·žŽÂ?ØÉ+íÙGœïêæòl8ÏH
+W¯—…pEKi$_ éú‚¥àÎãšÙ‚Uάãa«š67e„§î4ïÈæ\â‹îÎý/¼Šh²ÊXˆ Òðsò/ÌTÎ]ª}@-OjQ MW.3YHe¯|¿îOIf.ŒW)3û\´¨b&ƒ.}ü'?EÆÆ¨¹û,½tŠ=zŸf& Íëiým)é…šxÌ$M áá’àptZ guþý…³,¨Òmcò¨”_ÑÍ!^‹jÓ—ŸïôTHûÖ¥T¯‰û:IòpöÔL–'ºSVkÉœ^¥àxCš*ÄÂB±_Ë<ŽAddÜö«4øn;Ø\ÞŽÙ.æ @ûõaD¾é2MMû#uŠ‹…Ûf¥È"J†VCª ï§§”Jikv—»ÆÕ}6•Ppí•‹CÑr1ãÊòwש° %F1«þ!L©¡tÑl±JÑ”FB?¢ukª"ÏÚx×m”Mቋv!µ•S<Õhø’~4´é.
+ŒÒÉÁÀV)b¥?œßVÝû~WÉa¼øu<¿«ØXÂRSèv,'´|½˜Ó1¼4Ä8Y|s*{&Rãké§_'Ç0%+ñjñ ºä+ˆ­Þ¨Ú»À%Õ&*Pi;‰ttü«ºÎǺ?Þ⨹
endstream
endobj
-1481 0 obj <<
+1943 0 obj <<
/Type /FontDescriptor
-/FontName /TUTTFM+NimbusSanL-ReguItal
+/FontName /BBKPKI+NimbusSanL-ReguItal
/Flags 4
/FontBBox [-178 -284 1108 953]
/Ascent 712
@@ -7417,669 +9691,968 @@ endobj
/ItalicAngle -12
/StemV 88
/XHeight 523
-/CharSet (/a/b/c/d/e/f/fl/g/h/i/k/l/m/n/o/p/period/r/s/t/u/underscore/v/w/y/z)
-/FontFile 1480 0 R
+/CharSet (/A/C/D/E/F/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/a/b/c/comma/d/e/f/fi/fl/g/h/hyphen/i/k/l/m/n/o/p/parenleft/parenright/period/quotedbl/quoteright/r/s/t/u/underscore/v/w/x/y/z/zero)
+/FontFile 1942 0 R
>> endobj
-1454 0 obj <<
+1916 0 obj <<
/Type /Encoding
/Differences [2/fi/fl 33/exclam/quotedbl/numbersign 37/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question 65/A/B/C/D/E/F/G/H/I 75/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y 91/bracketleft 93/bracketright 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft 125/braceright 148/quotedblright/bullet/endash 153/trademark 169/copyright 174/registered]
>> endobj
-689 0 obj <<
+878 0 obj <<
/Type /Font
/Subtype /Type1
/BaseFont /SYFPBV+CMMI10
-/FontDescriptor 1465 0 R
+/FontDescriptor 1927 0 R
/FirstChar 60
/LastChar 62
-/Widths 1458 0 R
+/Widths 1921 0 R
>> endobj
-531 0 obj <<
+691 0 obj <<
/Type /Font
/Subtype /Type1
-/BaseFont /VCDMTN+CMSY10
-/FontDescriptor 1467 0 R
+/BaseFont /YNRGLS+CMSY10
+/FontDescriptor 1929 0 R
/FirstChar 3
-/LastChar 106
-/Widths 1461 0 R
+/LastChar 110
+/Widths 1923 0 R
>> endobj
-682 0 obj <<
+890 0 obj <<
/Type /Font
/Subtype /Type1
-/BaseFont /LWZFPB+NimbusMonL-Regu
-/FontDescriptor 1469 0 R
+/BaseFont /RHWGIY+NimbusMonL-Regu
+/FontDescriptor 1931 0 R
/FirstChar 33
/LastChar 125
-/Widths 1459 0 R
-/Encoding 1454 0 R
+/Widths 1920 0 R
+/Encoding 1916 0 R
>> endobj
-530 0 obj <<
+690 0 obj <<
/Type /Font
/Subtype /Type1
-/BaseFont /XHFIVR+NimbusSanL-Bold
-/FontDescriptor 1471 0 R
-/FirstChar 40
+/BaseFont /KYBICW+NimbusSanL-Bold
+/FontDescriptor 1933 0 R
+/FirstChar 3
/LastChar 174
-/Widths 1462 0 R
-/Encoding 1454 0 R
+/Widths 1924 0 R
+/Encoding 1916 0 R
>> endobj
-565 0 obj <<
+725 0 obj <<
/Type /Font
/Subtype /Type1
-/BaseFont /OVQSWJ+NimbusSanL-BoldCond
-/FontDescriptor 1473 0 R
+/BaseFont /OYQGMY+NimbusSanL-BoldCond
+/FontDescriptor 1935 0 R
/FirstChar 2
/LastChar 174
-/Widths 1460 0 R
-/Encoding 1454 0 R
+/Widths 1922 0 R
+/Encoding 1916 0 R
>> endobj
-1067 0 obj <<
+1063 0 obj <<
/Type /Font
/Subtype /Type1
-/BaseFont /AHKYLG+NimbusSanL-BoldItal
-/FontDescriptor 1475 0 R
-/FirstChar 95
+/BaseFont /VMTBGM+NimbusSanL-BoldItal
+/FontDescriptor 1937 0 R
+/FirstChar 3
/LastChar 119
-/Widths 1455 0 R
-/Encoding 1454 0 R
+/Widths 1918 0 R
+/Encoding 1916 0 R
>> endobj
-852 0 obj <<
+1097 0 obj <<
/Type /Font
/Subtype /Type1
-/BaseFont /CJRNBA+NimbusSanL-BoldCondItal
-/FontDescriptor 1477 0 R
+/BaseFont /GRJGEU+NimbusSanL-BoldCondItal
+/FontDescriptor 1939 0 R
/FirstChar 3
/LastChar 122
-/Widths 1456 0 R
-/Encoding 1454 0 R
+/Widths 1917 0 R
+/Encoding 1916 0 R
>> endobj
-525 0 obj <<
+685 0 obj <<
/Type /Font
/Subtype /Type1
-/BaseFont /KXOITK+NimbusSanL-Regu
-/FontDescriptor 1479 0 R
+/BaseFont /ZHOJYM+NimbusSanL-Regu
+/FontDescriptor 1941 0 R
/FirstChar 2
/LastChar 174
-/Widths 1463 0 R
-/Encoding 1454 0 R
+/Widths 1925 0 R
+/Encoding 1916 0 R
>> endobj
-789 0 obj <<
+1021 0 obj <<
/Type /Font
/Subtype /Type1
-/BaseFont /TUTTFM+NimbusSanL-ReguItal
-/FontDescriptor 1481 0 R
-/FirstChar 3
+/BaseFont /BBKPKI+NimbusSanL-ReguItal
+/FontDescriptor 1943 0 R
+/FirstChar 2
/LastChar 122
-/Widths 1457 0 R
-/Encoding 1454 0 R
+/Widths 1919 0 R
+/Encoding 1916 0 R
>> endobj
-526 0 obj <<
+686 0 obj <<
/Type /Pages
/Count 6
-/Parent 1482 0 R
-/Kids [521 0 R 528 0 R 563 0 R 608 0 R 651 0 R 673 0 R]
+/Parent 1944 0 R
+/Kids [681 0 R 688 0 R 723 0 R 768 0 R 811 0 R 854 0 R]
>> endobj
-684 0 obj <<
+879 0 obj <<
/Type /Pages
/Count 6
-/Parent 1482 0 R
-/Kids [677 0 R 686 0 R 698 0 R 721 0 R 740 0 R 744 0 R]
+/Parent 1944 0 R
+/Kids [876 0 R 881 0 R 885 0 R 893 0 R 904 0 R 928 0 R]
>> endobj
-761 0 obj <<
+951 0 obj <<
/Type /Pages
/Count 6
-/Parent 1482 0 R
-/Kids [758 0 R 763 0 R 769 0 R 773 0 R 777 0 R 784 0 R]
+/Parent 1944 0 R
+/Kids [948 0 R 953 0 R 970 0 R 974 0 R 984 0 R 988 0 R]
>> endobj
-801 0 obj <<
+1001 0 obj <<
/Type /Pages
/Count 6
-/Parent 1482 0 R
-/Kids [796 0 R 803 0 R 807 0 R 811 0 R 816 0 R 829 0 R]
+/Parent 1944 0 R
+/Kids [998 0 R 1005 0 R 1009 0 R 1016 0 R 1028 0 R 1034 0 R]
>> endobj
-843 0 obj <<
+1041 0 obj <<
/Type /Pages
/Count 6
-/Parent 1482 0 R
-/Kids [840 0 R 847 0 R 859 0 R 882 0 R 898 0 R 916 0 R]
+/Parent 1944 0 R
+/Kids [1038 0 R 1043 0 R 1048 0 R 1057 0 R 1075 0 R 1086 0 R]
>> endobj
-934 0 obj <<
+1099 0 obj <<
/Type /Pages
/Count 6
-/Parent 1482 0 R
-/Kids [929 0 R 1011 0 R 1064 0 R 1074 0 R 1085 0 R 1090 0 R]
+/Parent 1944 0 R
+/Kids [1092 0 R 1105 0 R 1128 0 R 1144 0 R 1162 0 R 1175 0 R]
>> endobj
-1107 0 obj <<
+1266 0 obj <<
/Type /Pages
/Count 6
-/Parent 1483 0 R
-/Kids [1102 0 R 1109 0 R 1133 0 R 1148 0 R 1156 0 R 1182 0 R]
+/Parent 1945 0 R
+/Kids [1261 0 R 1330 0 R 1345 0 R 1354 0 R 1364 0 R 1372 0 R]
>> endobj
-1204 0 obj <<
+1386 0 obj <<
/Type /Pages
/Count 6
-/Parent 1483 0 R
-/Kids [1199 0 R 1206 0 R 1216 0 R 1226 0 R 1235 0 R 1245 0 R]
+/Parent 1945 0 R
+/Kids [1379 0 R 1390 0 R 1400 0 R 1423 0 R 1438 0 R 1446 0 R]
>> endobj
-1301 0 obj <<
+1482 0 obj <<
/Type /Pages
-/Count 3
-/Parent 1483 0 R
-/Kids [1298 0 R 1372 0 R 1451 0 R]
+/Count 6
+/Parent 1945 0 R
+/Kids [1472 0 R 1490 0 R 1496 0 R 1519 0 R 1544 0 R 1557 0 R]
>> endobj
-1482 0 obj <<
+1584 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 1945 0 R
+/Kids [1577 0 R 1586 0 R 1594 0 R 1604 0 R 1614 0 R 1630 0 R]
+>> endobj
+1653 0 obj <<
+/Type /Pages
+/Count 6
+/Parent 1945 0 R
+/Kids [1646 0 R 1655 0 R 1708 0 R 1775 0 R 1873 0 R 1913 0 R]
+>> endobj
+1944 0 obj <<
/Type /Pages
/Count 36
-/Parent 1484 0 R
-/Kids [526 0 R 684 0 R 761 0 R 801 0 R 843 0 R 934 0 R]
+/Parent 1946 0 R
+/Kids [686 0 R 879 0 R 951 0 R 1001 0 R 1041 0 R 1099 0 R]
>> endobj
-1483 0 obj <<
+1945 0 obj <<
/Type /Pages
-/Count 15
-/Parent 1484 0 R
-/Kids [1107 0 R 1204 0 R 1301 0 R]
+/Count 30
+/Parent 1946 0 R
+/Kids [1266 0 R 1386 0 R 1482 0 R 1584 0 R 1653 0 R]
>> endobj
-1484 0 obj <<
+1946 0 obj <<
/Type /Pages
-/Count 51
-/Kids [1482 0 R 1483 0 R]
+/Count 66
+/Kids [1944 0 R 1945 0 R]
>> endobj
-1485 0 obj <<
+1947 0 obj <<
/Type /Outlines
/First 7 0 R
-/Last 518 0 R
-/Count 6
+/Last 678 0 R
+/Count 7
>> endobj
-518 0 obj <<
-/Title 519 0 R
+678 0 obj <<
+/Title 679 0 R
+/A 677 0 R
+/Parent 1947 0 R
+/Prev 603 0 R
+>> endobj
+675 0 obj <<
+/Title 676 0 R
+/A 673 0 R
+/Parent 671 0 R
+>> endobj
+671 0 obj <<
+/Title 672 0 R
+/A 669 0 R
+/Parent 603 0 R
+/Prev 639 0 R
+/First 675 0 R
+/Last 675 0 R
+/Count -1
+>> endobj
+667 0 obj <<
+/Title 668 0 R
+/A 665 0 R
+/Parent 659 0 R
+/Prev 663 0 R
+>> endobj
+663 0 obj <<
+/Title 664 0 R
+/A 661 0 R
+/Parent 659 0 R
+/Next 667 0 R
+>> endobj
+659 0 obj <<
+/Title 660 0 R
+/A 657 0 R
+/Parent 639 0 R
+/Prev 647 0 R
+/First 663 0 R
+/Last 667 0 R
+/Count -2
+>> endobj
+655 0 obj <<
+/Title 656 0 R
+/A 653 0 R
+/Parent 647 0 R
+/Prev 651 0 R
+>> endobj
+651 0 obj <<
+/Title 652 0 R
+/A 649 0 R
+/Parent 647 0 R
+/Next 655 0 R
+>> endobj
+647 0 obj <<
+/Title 648 0 R
+/A 645 0 R
+/Parent 639 0 R
+/Prev 643 0 R
+/Next 659 0 R
+/First 651 0 R
+/Last 655 0 R
+/Count -2
+>> endobj
+643 0 obj <<
+/Title 644 0 R
+/A 641 0 R
+/Parent 639 0 R
+/Next 647 0 R
+>> endobj
+639 0 obj <<
+/Title 640 0 R
+/A 637 0 R
+/Parent 603 0 R
+/Prev 607 0 R
+/Next 671 0 R
+/First 643 0 R
+/Last 659 0 R
+/Count -3
+>> endobj
+635 0 obj <<
+/Title 636 0 R
+/A 633 0 R
+/Parent 615 0 R
+/Prev 631 0 R
+>> endobj
+631 0 obj <<
+/Title 632 0 R
+/A 629 0 R
+/Parent 615 0 R
+/Prev 627 0 R
+/Next 635 0 R
+>> endobj
+627 0 obj <<
+/Title 628 0 R
+/A 625 0 R
+/Parent 615 0 R
+/Prev 623 0 R
+/Next 631 0 R
+>> endobj
+623 0 obj <<
+/Title 624 0 R
+/A 621 0 R
+/Parent 615 0 R
+/Prev 619 0 R
+/Next 627 0 R
+>> endobj
+619 0 obj <<
+/Title 620 0 R
+/A 617 0 R
+/Parent 615 0 R
+/Next 623 0 R
+>> endobj
+615 0 obj <<
+/Title 616 0 R
+/A 613 0 R
+/Parent 607 0 R
+/Prev 611 0 R
+/First 619 0 R
+/Last 635 0 R
+/Count -5
+>> endobj
+611 0 obj <<
+/Title 612 0 R
+/A 609 0 R
+/Parent 607 0 R
+/Next 615 0 R
+>> endobj
+607 0 obj <<
+/Title 608 0 R
+/A 605 0 R
+/Parent 603 0 R
+/Next 639 0 R
+/First 611 0 R
+/Last 615 0 R
+/Count -2
+>> endobj
+603 0 obj <<
+/Title 604 0 R
+/A 601 0 R
+/Parent 1947 0 R
+/Prev 79 0 R
+/Next 678 0 R
+/First 607 0 R
+/Last 671 0 R
+/Count -3
+>> endobj
+599 0 obj <<
+/Title 600 0 R
+/A 597 0 R
+/Parent 79 0 R
+/Prev 579 0 R
+>> endobj
+595 0 obj <<
+/Title 596 0 R
+/A 593 0 R
+/Parent 587 0 R
+/Prev 591 0 R
+>> endobj
+591 0 obj <<
+/Title 592 0 R
+/A 589 0 R
+/Parent 587 0 R
+/Next 595 0 R
+>> endobj
+587 0 obj <<
+/Title 588 0 R
+/A 585 0 R
+/Parent 579 0 R
+/Prev 583 0 R
+/First 591 0 R
+/Last 595 0 R
+/Count -2
+>> endobj
+583 0 obj <<
+/Title 584 0 R
+/A 581 0 R
+/Parent 579 0 R
+/Next 587 0 R
+>> endobj
+579 0 obj <<
+/Title 580 0 R
+/A 577 0 R
+/Parent 79 0 R
+/Prev 523 0 R
+/Next 599 0 R
+/First 583 0 R
+/Last 587 0 R
+/Count -2
+>> endobj
+575 0 obj <<
+/Title 576 0 R
+/A 573 0 R
+/Parent 535 0 R
+/Prev 571 0 R
+>> endobj
+571 0 obj <<
+/Title 572 0 R
+/A 569 0 R
+/Parent 535 0 R
+/Prev 567 0 R
+/Next 575 0 R
+>> endobj
+567 0 obj <<
+/Title 568 0 R
+/A 565 0 R
+/Parent 535 0 R
+/Prev 563 0 R
+/Next 571 0 R
+>> endobj
+563 0 obj <<
+/Title 564 0 R
+/A 561 0 R
+/Parent 535 0 R
+/Prev 559 0 R
+/Next 567 0 R
+>> endobj
+559 0 obj <<
+/Title 560 0 R
+/A 557 0 R
+/Parent 535 0 R
+/Prev 555 0 R
+/Next 563 0 R
+>> endobj
+555 0 obj <<
+/Title 556 0 R
+/A 553 0 R
+/Parent 535 0 R
+/Prev 551 0 R
+/Next 559 0 R
+>> endobj
+551 0 obj <<
+/Title 552 0 R
+/A 549 0 R
+/Parent 535 0 R
+/Prev 547 0 R
+/Next 555 0 R
+>> endobj
+547 0 obj <<
+/Title 548 0 R
+/A 545 0 R
+/Parent 535 0 R
+/Prev 543 0 R
+/Next 551 0 R
+>> endobj
+543 0 obj <<
+/Title 544 0 R
+/A 541 0 R
+/Parent 535 0 R
+/Prev 539 0 R
+/Next 547 0 R
+>> endobj
+539 0 obj <<
+/Title 540 0 R
+/A 537 0 R
+/Parent 535 0 R
+/Next 543 0 R
+>> endobj
+535 0 obj <<
+/Title 536 0 R
+/A 533 0 R
+/Parent 523 0 R
+/Prev 531 0 R
+/First 539 0 R
+/Last 575 0 R
+/Count -10
+>> endobj
+531 0 obj <<
+/Title 532 0 R
+/A 529 0 R
+/Parent 523 0 R
+/Prev 527 0 R
+/Next 535 0 R
+>> endobj
+527 0 obj <<
+/Title 528 0 R
+/A 525 0 R
+/Parent 523 0 R
+/Next 531 0 R
+>> endobj
+523 0 obj <<
+/Title 524 0 R
+/A 521 0 R
+/Parent 79 0 R
+/Prev 467 0 R
+/Next 579 0 R
+/First 527 0 R
+/Last 535 0 R
+/Count -3
+>> endobj
+519 0 obj <<
+/Title 520 0 R
/A 517 0 R
-/Parent 1485 0 R
-/Prev 483 0 R
+/Parent 503 0 R
+/Prev 515 0 R
>> endobj
515 0 obj <<
/Title 516 0 R
/A 513 0 R
-/Parent 495 0 R
+/Parent 503 0 R
/Prev 511 0 R
+/Next 519 0 R
>> endobj
511 0 obj <<
/Title 512 0 R
/A 509 0 R
-/Parent 495 0 R
+/Parent 503 0 R
/Prev 507 0 R
/Next 515 0 R
>> endobj
507 0 obj <<
/Title 508 0 R
/A 505 0 R
-/Parent 495 0 R
-/Prev 503 0 R
+/Parent 503 0 R
/Next 511 0 R
>> endobj
503 0 obj <<
/Title 504 0 R
/A 501 0 R
-/Parent 495 0 R
-/Prev 499 0 R
-/Next 507 0 R
+/Parent 467 0 R
+/Prev 475 0 R
+/First 507 0 R
+/Last 519 0 R
+/Count -4
>> endobj
499 0 obj <<
/Title 500 0 R
/A 497 0 R
-/Parent 495 0 R
-/Next 503 0 R
+/Parent 475 0 R
+/Prev 495 0 R
>> endobj
495 0 obj <<
/Title 496 0 R
/A 493 0 R
-/Parent 487 0 R
+/Parent 475 0 R
/Prev 491 0 R
-/First 499 0 R
-/Last 515 0 R
-/Count -5
+/Next 499 0 R
>> endobj
491 0 obj <<
/Title 492 0 R
/A 489 0 R
-/Parent 487 0 R
+/Parent 475 0 R
+/Prev 487 0 R
/Next 495 0 R
>> endobj
487 0 obj <<
/Title 488 0 R
/A 485 0 R
-/Parent 483 0 R
-/First 491 0 R
-/Last 495 0 R
-/Count -2
+/Parent 475 0 R
+/Prev 483 0 R
+/Next 491 0 R
>> endobj
483 0 obj <<
/Title 484 0 R
/A 481 0 R
-/Parent 1485 0 R
-/Prev 71 0 R
-/Next 518 0 R
-/First 487 0 R
-/Last 487 0 R
-/Count -1
+/Parent 475 0 R
+/Prev 479 0 R
+/Next 487 0 R
>> endobj
479 0 obj <<
/Title 480 0 R
/A 477 0 R
-/Parent 471 0 R
-/Prev 475 0 R
+/Parent 475 0 R
+/Next 483 0 R
>> endobj
475 0 obj <<
/Title 476 0 R
/A 473 0 R
-/Parent 471 0 R
-/Next 479 0 R
+/Parent 467 0 R
+/Prev 471 0 R
+/Next 503 0 R
+/First 479 0 R
+/Last 499 0 R
+/Count -6
>> endobj
471 0 obj <<
/Title 472 0 R
/A 469 0 R
-/Parent 463 0 R
-/Prev 467 0 R
-/First 475 0 R
-/Last 479 0 R
-/Count -2
+/Parent 467 0 R
+/Next 475 0 R
>> endobj
467 0 obj <<
/Title 468 0 R
/A 465 0 R
-/Parent 463 0 R
-/Next 471 0 R
+/Parent 79 0 R
+/Prev 419 0 R
+/Next 523 0 R
+/First 471 0 R
+/Last 503 0 R
+/Count -3
>> endobj
463 0 obj <<
/Title 464 0 R
/A 461 0 R
-/Parent 71 0 R
-/Prev 407 0 R
-/First 467 0 R
-/Last 471 0 R
-/Count -2
+/Parent 427 0 R
+/Prev 459 0 R
>> endobj
459 0 obj <<
/Title 460 0 R
/A 457 0 R
-/Parent 443 0 R
+/Parent 427 0 R
/Prev 455 0 R
+/Next 463 0 R
>> endobj
455 0 obj <<
/Title 456 0 R
/A 453 0 R
-/Parent 443 0 R
+/Parent 427 0 R
/Prev 451 0 R
/Next 459 0 R
>> endobj
451 0 obj <<
/Title 452 0 R
/A 449 0 R
-/Parent 443 0 R
+/Parent 427 0 R
/Prev 447 0 R
/Next 455 0 R
>> endobj
447 0 obj <<
/Title 448 0 R
/A 445 0 R
-/Parent 443 0 R
+/Parent 427 0 R
+/Prev 443 0 R
/Next 451 0 R
>> endobj
443 0 obj <<
/Title 444 0 R
/A 441 0 R
-/Parent 407 0 R
-/Prev 415 0 R
-/First 447 0 R
-/Last 459 0 R
-/Count -4
+/Parent 427 0 R
+/Prev 439 0 R
+/Next 447 0 R
>> endobj
439 0 obj <<
/Title 440 0 R
/A 437 0 R
-/Parent 415 0 R
+/Parent 427 0 R
/Prev 435 0 R
+/Next 443 0 R
>> endobj
435 0 obj <<
/Title 436 0 R
/A 433 0 R
-/Parent 415 0 R
+/Parent 427 0 R
/Prev 431 0 R
/Next 439 0 R
>> endobj
431 0 obj <<
/Title 432 0 R
/A 429 0 R
-/Parent 415 0 R
-/Prev 427 0 R
+/Parent 427 0 R
/Next 435 0 R
>> endobj
427 0 obj <<
/Title 428 0 R
/A 425 0 R
-/Parent 415 0 R
+/Parent 419 0 R
/Prev 423 0 R
-/Next 431 0 R
+/First 431 0 R
+/Last 463 0 R
+/Count -9
>> endobj
423 0 obj <<
/Title 424 0 R
/A 421 0 R
-/Parent 415 0 R
-/Prev 419 0 R
+/Parent 419 0 R
/Next 427 0 R
>> endobj
419 0 obj <<
/Title 420 0 R
/A 417 0 R
-/Parent 415 0 R
-/Next 423 0 R
+/Parent 79 0 R
+/Prev 263 0 R
+/Next 467 0 R
+/First 423 0 R
+/Last 427 0 R
+/Count -2
>> endobj
415 0 obj <<
/Title 416 0 R
/A 413 0 R
-/Parent 407 0 R
+/Parent 279 0 R
/Prev 411 0 R
-/Next 443 0 R
-/First 419 0 R
-/Last 439 0 R
-/Count -6
>> endobj
411 0 obj <<
/Title 412 0 R
/A 409 0 R
-/Parent 407 0 R
+/Parent 279 0 R
+/Prev 407 0 R
/Next 415 0 R
>> endobj
407 0 obj <<
/Title 408 0 R
/A 405 0 R
-/Parent 71 0 R
-/Prev 359 0 R
-/Next 463 0 R
-/First 411 0 R
-/Last 443 0 R
-/Count -3
+/Parent 279 0 R
+/Prev 403 0 R
+/Next 411 0 R
>> endobj
403 0 obj <<
/Title 404 0 R
/A 401 0 R
-/Parent 367 0 R
+/Parent 279 0 R
/Prev 399 0 R
+/Next 407 0 R
>> endobj
399 0 obj <<
/Title 400 0 R
/A 397 0 R
-/Parent 367 0 R
+/Parent 279 0 R
/Prev 395 0 R
/Next 403 0 R
>> endobj
395 0 obj <<
/Title 396 0 R
/A 393 0 R
-/Parent 367 0 R
+/Parent 279 0 R
/Prev 391 0 R
/Next 399 0 R
>> endobj
391 0 obj <<
/Title 392 0 R
/A 389 0 R
-/Parent 367 0 R
+/Parent 279 0 R
/Prev 387 0 R
/Next 395 0 R
>> endobj
387 0 obj <<
/Title 388 0 R
/A 385 0 R
-/Parent 367 0 R
+/Parent 279 0 R
/Prev 383 0 R
/Next 391 0 R
>> endobj
383 0 obj <<
/Title 384 0 R
/A 381 0 R
-/Parent 367 0 R
+/Parent 279 0 R
/Prev 379 0 R
/Next 387 0 R
>> endobj
379 0 obj <<
/Title 380 0 R
/A 377 0 R
-/Parent 367 0 R
+/Parent 279 0 R
/Prev 375 0 R
/Next 383 0 R
>> endobj
375 0 obj <<
/Title 376 0 R
/A 373 0 R
-/Parent 367 0 R
+/Parent 279 0 R
/Prev 371 0 R
/Next 379 0 R
>> endobj
371 0 obj <<
/Title 372 0 R
/A 369 0 R
-/Parent 367 0 R
+/Parent 279 0 R
+/Prev 367 0 R
/Next 375 0 R
>> endobj
367 0 obj <<
/Title 368 0 R
/A 365 0 R
-/Parent 359 0 R
+/Parent 279 0 R
/Prev 363 0 R
-/First 371 0 R
-/Last 403 0 R
-/Count -9
+/Next 371 0 R
>> endobj
363 0 obj <<
/Title 364 0 R
/A 361 0 R
-/Parent 359 0 R
+/Parent 279 0 R
+/Prev 359 0 R
/Next 367 0 R
>> endobj
359 0 obj <<
/Title 360 0 R
/A 357 0 R
-/Parent 71 0 R
-/Prev 239 0 R
-/Next 407 0 R
-/First 363 0 R
-/Last 367 0 R
-/Count -2
+/Parent 279 0 R
+/Prev 355 0 R
+/Next 363 0 R
>> endobj
355 0 obj <<
/Title 356 0 R
/A 353 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 351 0 R
+/Next 359 0 R
>> endobj
351 0 obj <<
/Title 352 0 R
/A 349 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 347 0 R
/Next 355 0 R
>> endobj
347 0 obj <<
/Title 348 0 R
/A 345 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 343 0 R
/Next 351 0 R
>> endobj
343 0 obj <<
/Title 344 0 R
/A 341 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 339 0 R
/Next 347 0 R
>> endobj
339 0 obj <<
/Title 340 0 R
/A 337 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 335 0 R
/Next 343 0 R
>> endobj
335 0 obj <<
/Title 336 0 R
/A 333 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 331 0 R
/Next 339 0 R
>> endobj
331 0 obj <<
/Title 332 0 R
/A 329 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 327 0 R
/Next 335 0 R
>> endobj
327 0 obj <<
/Title 328 0 R
/A 325 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 323 0 R
/Next 331 0 R
>> endobj
323 0 obj <<
/Title 324 0 R
/A 321 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 319 0 R
/Next 327 0 R
>> endobj
319 0 obj <<
/Title 320 0 R
/A 317 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 315 0 R
/Next 323 0 R
>> endobj
315 0 obj <<
/Title 316 0 R
/A 313 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 311 0 R
/Next 319 0 R
>> endobj
311 0 obj <<
/Title 312 0 R
/A 309 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 307 0 R
/Next 315 0 R
>> endobj
307 0 obj <<
/Title 308 0 R
/A 305 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 303 0 R
/Next 311 0 R
>> endobj
303 0 obj <<
/Title 304 0 R
/A 301 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 299 0 R
/Next 307 0 R
>> endobj
299 0 obj <<
/Title 300 0 R
/A 297 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 295 0 R
/Next 303 0 R
>> endobj
295 0 obj <<
/Title 296 0 R
/A 293 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 291 0 R
/Next 299 0 R
>> endobj
291 0 obj <<
/Title 292 0 R
/A 289 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 287 0 R
/Next 295 0 R
>> endobj
287 0 obj <<
/Title 288 0 R
/A 285 0 R
-/Parent 255 0 R
+/Parent 279 0 R
/Prev 283 0 R
/Next 291 0 R
>> endobj
283 0 obj <<
/Title 284 0 R
/A 281 0 R
-/Parent 255 0 R
-/Prev 279 0 R
+/Parent 279 0 R
/Next 287 0 R
>> endobj
279 0 obj <<
/Title 280 0 R
/A 277 0 R
-/Parent 255 0 R
-/Prev 275 0 R
-/Next 283 0 R
+/Parent 263 0 R
+/Prev 271 0 R
+/First 283 0 R
+/Last 415 0 R
+/Count -34
>> endobj
275 0 obj <<
/Title 276 0 R
/A 273 0 R
-/Parent 255 0 R
-/Prev 271 0 R
-/Next 279 0 R
+/Parent 271 0 R
>> endobj
271 0 obj <<
/Title 272 0 R
/A 269 0 R
-/Parent 255 0 R
+/Parent 263 0 R
/Prev 267 0 R
-/Next 275 0 R
+/Next 279 0 R
+/First 275 0 R
+/Last 275 0 R
+/Count -1
>> endobj
267 0 obj <<
/Title 268 0 R
/A 265 0 R
-/Parent 255 0 R
-/Prev 263 0 R
+/Parent 263 0 R
/Next 271 0 R
>> endobj
263 0 obj <<
/Title 264 0 R
/A 261 0 R
-/Parent 255 0 R
-/Prev 259 0 R
-/Next 267 0 R
+/Parent 79 0 R
+/Prev 231 0 R
+/Next 419 0 R
+/First 267 0 R
+/Last 279 0 R
+/Count -3
>> endobj
259 0 obj <<
/Title 260 0 R
/A 257 0 R
-/Parent 255 0 R
-/Next 263 0 R
+/Parent 239 0 R
+/Prev 255 0 R
>> endobj
255 0 obj <<
/Title 256 0 R
/A 253 0 R
/Parent 239 0 R
-/Prev 247 0 R
-/First 259 0 R
-/Last 355 0 R
-/Count -25
+/Prev 251 0 R
+/Next 259 0 R
>> endobj
251 0 obj <<
/Title 252 0 R
/A 249 0 R
-/Parent 247 0 R
+/Parent 239 0 R
+/Prev 247 0 R
+/Next 255 0 R
>> endobj
247 0 obj <<
/Title 248 0 R
/A 245 0 R
/Parent 239 0 R
/Prev 243 0 R
-/Next 255 0 R
-/First 251 0 R
-/Last 251 0 R
-/Count -1
+/Next 251 0 R
>> endobj
243 0 obj <<
/Title 244 0 R
@@ -8090,156 +10663,158 @@ endobj
239 0 obj <<
/Title 240 0 R
/A 237 0 R
-/Parent 71 0 R
-/Prev 207 0 R
-/Next 359 0 R
+/Parent 231 0 R
+/Prev 235 0 R
/First 243 0 R
-/Last 255 0 R
-/Count -3
+/Last 259 0 R
+/Count -5
>> endobj
235 0 obj <<
/Title 236 0 R
/A 233 0 R
-/Parent 215 0 R
-/Prev 231 0 R
+/Parent 231 0 R
+/Next 239 0 R
>> endobj
231 0 obj <<
/Title 232 0 R
/A 229 0 R
-/Parent 215 0 R
-/Prev 227 0 R
-/Next 235 0 R
+/Parent 79 0 R
+/Prev 187 0 R
+/Next 263 0 R
+/First 235 0 R
+/Last 239 0 R
+/Count -2
>> endobj
227 0 obj <<
/Title 228 0 R
/A 225 0 R
-/Parent 215 0 R
+/Parent 203 0 R
/Prev 223 0 R
-/Next 231 0 R
>> endobj
223 0 obj <<
/Title 224 0 R
/A 221 0 R
-/Parent 215 0 R
+/Parent 203 0 R
/Prev 219 0 R
/Next 227 0 R
>> endobj
219 0 obj <<
/Title 220 0 R
/A 217 0 R
-/Parent 215 0 R
+/Parent 203 0 R
+/Prev 215 0 R
/Next 223 0 R
>> endobj
215 0 obj <<
/Title 216 0 R
/A 213 0 R
-/Parent 207 0 R
+/Parent 203 0 R
/Prev 211 0 R
-/First 219 0 R
-/Last 235 0 R
-/Count -5
+/Next 219 0 R
>> endobj
211 0 obj <<
/Title 212 0 R
/A 209 0 R
-/Parent 207 0 R
+/Parent 203 0 R
+/Prev 207 0 R
/Next 215 0 R
>> endobj
207 0 obj <<
/Title 208 0 R
/A 205 0 R
-/Parent 71 0 R
-/Prev 163 0 R
-/Next 239 0 R
-/First 211 0 R
-/Last 215 0 R
-/Count -2
+/Parent 203 0 R
+/Next 211 0 R
>> endobj
203 0 obj <<
/Title 204 0 R
/A 201 0 R
-/Parent 179 0 R
-/Prev 199 0 R
+/Parent 187 0 R
+/Prev 195 0 R
+/First 207 0 R
+/Last 227 0 R
+/Count -6
>> endobj
199 0 obj <<
/Title 200 0 R
/A 197 0 R
-/Parent 179 0 R
-/Prev 195 0 R
-/Next 203 0 R
+/Parent 195 0 R
>> endobj
195 0 obj <<
/Title 196 0 R
/A 193 0 R
-/Parent 179 0 R
+/Parent 187 0 R
/Prev 191 0 R
-/Next 199 0 R
+/Next 203 0 R
+/First 199 0 R
+/Last 199 0 R
+/Count -1
>> endobj
191 0 obj <<
/Title 192 0 R
/A 189 0 R
-/Parent 179 0 R
-/Prev 187 0 R
+/Parent 187 0 R
/Next 195 0 R
>> endobj
187 0 obj <<
/Title 188 0 R
/A 185 0 R
-/Parent 179 0 R
-/Prev 183 0 R
-/Next 191 0 R
+/Parent 79 0 R
+/Prev 167 0 R
+/Next 231 0 R
+/First 191 0 R
+/Last 203 0 R
+/Count -3
>> endobj
183 0 obj <<
/Title 184 0 R
/A 181 0 R
-/Parent 179 0 R
-/Next 187 0 R
+/Parent 175 0 R
+/Prev 179 0 R
>> endobj
179 0 obj <<
/Title 180 0 R
/A 177 0 R
-/Parent 163 0 R
-/Prev 171 0 R
-/First 183 0 R
-/Last 203 0 R
-/Count -6
+/Parent 175 0 R
+/Next 183 0 R
>> endobj
175 0 obj <<
/Title 176 0 R
/A 173 0 R
-/Parent 171 0 R
+/Parent 167 0 R
+/Prev 171 0 R
+/First 179 0 R
+/Last 183 0 R
+/Count -2
>> endobj
171 0 obj <<
/Title 172 0 R
/A 169 0 R
-/Parent 163 0 R
-/Prev 167 0 R
-/Next 179 0 R
-/First 175 0 R
-/Last 175 0 R
-/Count -1
+/Parent 167 0 R
+/Next 175 0 R
>> endobj
167 0 obj <<
/Title 168 0 R
/A 165 0 R
-/Parent 163 0 R
-/Next 171 0 R
+/Parent 79 0 R
+/Prev 151 0 R
+/Next 187 0 R
+/First 171 0 R
+/Last 175 0 R
+/Count -2
>> endobj
163 0 obj <<
/Title 164 0 R
/A 161 0 R
-/Parent 71 0 R
-/Prev 143 0 R
-/Next 207 0 R
-/First 167 0 R
-/Last 179 0 R
-/Count -3
+/Parent 159 0 R
>> endobj
159 0 obj <<
/Title 160 0 R
/A 157 0 R
/Parent 151 0 R
/Prev 155 0 R
+/First 163 0 R
+/Last 163 0 R
+/Count -1
>> endobj
155 0 obj <<
/Title 156 0 R
@@ -8250,8 +10825,9 @@ endobj
151 0 obj <<
/Title 152 0 R
/A 149 0 R
-/Parent 143 0 R
-/Prev 147 0 R
+/Parent 79 0 R
+/Prev 107 0 R
+/Next 167 0 R
/First 155 0 R
/Last 159 0 R
/Count -2
@@ -8260,95 +10836,95 @@ endobj
/Title 148 0 R
/A 145 0 R
/Parent 143 0 R
-/Next 151 0 R
>> endobj
143 0 obj <<
/Title 144 0 R
/A 141 0 R
-/Parent 71 0 R
-/Prev 127 0 R
-/Next 163 0 R
+/Parent 107 0 R
+/Prev 115 0 R
/First 147 0 R
-/Last 151 0 R
-/Count -2
+/Last 147 0 R
+/Count -1
>> endobj
139 0 obj <<
/Title 140 0 R
/A 137 0 R
-/Parent 135 0 R
+/Parent 115 0 R
+/Prev 135 0 R
>> endobj
135 0 obj <<
/Title 136 0 R
/A 133 0 R
-/Parent 127 0 R
+/Parent 115 0 R
/Prev 131 0 R
-/First 139 0 R
-/Last 139 0 R
-/Count -1
+/Next 139 0 R
>> endobj
131 0 obj <<
/Title 132 0 R
/A 129 0 R
-/Parent 127 0 R
+/Parent 115 0 R
+/Prev 127 0 R
/Next 135 0 R
>> endobj
127 0 obj <<
/Title 128 0 R
/A 125 0 R
-/Parent 71 0 R
-/Prev 83 0 R
-/Next 143 0 R
-/First 131 0 R
-/Last 135 0 R
-/Count -2
+/Parent 115 0 R
+/Prev 123 0 R
+/Next 131 0 R
>> endobj
123 0 obj <<
/Title 124 0 R
/A 121 0 R
-/Parent 119 0 R
+/Parent 115 0 R
+/Prev 119 0 R
+/Next 127 0 R
>> endobj
119 0 obj <<
/Title 120 0 R
/A 117 0 R
-/Parent 83 0 R
-/Prev 91 0 R
-/First 123 0 R
-/Last 123 0 R
-/Count -1
+/Parent 115 0 R
+/Next 123 0 R
>> endobj
115 0 obj <<
/Title 116 0 R
/A 113 0 R
-/Parent 91 0 R
+/Parent 107 0 R
/Prev 111 0 R
+/Next 143 0 R
+/First 119 0 R
+/Last 139 0 R
+/Count -6
>> endobj
111 0 obj <<
/Title 112 0 R
/A 109 0 R
-/Parent 91 0 R
-/Prev 107 0 R
+/Parent 107 0 R
/Next 115 0 R
>> endobj
107 0 obj <<
/Title 108 0 R
/A 105 0 R
-/Parent 91 0 R
-/Prev 103 0 R
-/Next 111 0 R
+/Parent 79 0 R
+/Prev 91 0 R
+/Next 151 0 R
+/First 111 0 R
+/Last 143 0 R
+/Count -3
>> endobj
103 0 obj <<
/Title 104 0 R
/A 101 0 R
-/Parent 91 0 R
-/Prev 99 0 R
-/Next 107 0 R
+/Parent 99 0 R
>> endobj
99 0 obj <<
/Title 100 0 R
/A 97 0 R
/Parent 91 0 R
/Prev 95 0 R
-/Next 103 0 R
+/First 103 0 R
+/Last 103 0 R
+/Count -1
>> endobj
95 0 obj <<
/Title 96 0 R
@@ -8359,52 +10935,51 @@ endobj
91 0 obj <<
/Title 92 0 R
/A 89 0 R
-/Parent 83 0 R
-/Prev 87 0 R
-/Next 119 0 R
+/Parent 79 0 R
+/Prev 83 0 R
+/Next 107 0 R
/First 95 0 R
-/Last 115 0 R
-/Count -6
+/Last 99 0 R
+/Count -2
>> endobj
87 0 obj <<
/Title 88 0 R
/A 85 0 R
/Parent 83 0 R
-/Next 91 0 R
>> endobj
83 0 obj <<
/Title 84 0 R
/A 81 0 R
-/Parent 71 0 R
-/Prev 75 0 R
-/Next 127 0 R
+/Parent 79 0 R
+/Next 91 0 R
/First 87 0 R
-/Last 119 0 R
-/Count -3
+/Last 87 0 R
+/Count -1
>> endobj
79 0 obj <<
/Title 80 0 R
/A 77 0 R
-/Parent 75 0 R
+/Parent 1947 0 R
+/Prev 71 0 R
+/Next 603 0 R
+/First 83 0 R
+/Last 599 0 R
+/Count -13
>> endobj
75 0 obj <<
/Title 76 0 R
/A 73 0 R
/Parent 71 0 R
-/Next 83 0 R
-/First 79 0 R
-/Last 79 0 R
-/Count -1
>> endobj
71 0 obj <<
/Title 72 0 R
/A 69 0 R
-/Parent 1485 0 R
+/Parent 1947 0 R
/Prev 63 0 R
-/Next 483 0 R
+/Next 79 0 R
/First 75 0 R
-/Last 463 0 R
-/Count -10
+/Last 75 0 R
+/Count -1
>> endobj
67 0 obj <<
/Title 68 0 R
@@ -8414,7 +10989,7 @@ endobj
63 0 obj <<
/Title 64 0 R
/A 61 0 R
-/Parent 1485 0 R
+/Parent 1947 0 R
/Prev 55 0 R
/Next 71 0 R
/First 67 0 R
@@ -8429,7 +11004,7 @@ endobj
55 0 obj <<
/Title 56 0 R
/A 53 0 R
-/Parent 1485 0 R
+/Parent 1947 0 R
/Prev 7 0 R
/Next 63 0 R
/First 59 0 R
@@ -8517,1891 +11092,2463 @@ endobj
7 0 obj <<
/Title 8 0 R
/A 5 0 R
-/Parent 1485 0 R
+/Parent 1947 0 R
/Next 55 0 R
/First 11 0 R
/Last 47 0 R
/Count -7
>> endobj
-1486 0 obj <<
-/Names [(Doc-Start) 524 0 R (chapter*.1) 566 0 R (chapter.1) 6 0 R (chapter.2) 54 0 R (chapter.3) 62 0 R (chapter.4) 70 0 R]
+1948 0 obj <<
+/Names [(Doc-Start) 684 0 R (chapter*.1) 726 0 R (chapter.1) 6 0 R (chapter.2) 54 0 R (chapter.3) 62 0 R (chapter.4) 70 0 R]
/Limits [(Doc-Start) (chapter.4)]
>> endobj
-1487 0 obj <<
-/Names [(chapter.5) 482 0 R (group__ATOMIC__OPS) 731 0 R (group__BASIC__TYPES) 705 0 R (group__BASIC__TYPES_ga50e3ecb5eb8d70f437a84a8b2bc9e88f) 837 0 R (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) 838 0 R (group__BASIC__TYPES_ga7358cc60d0f006b36752a1795e6d5d93) 834 0 R]
-/Limits [(chapter.5) (group__BASIC__TYPES_ga7358cc60d0f006b36752a1795e6d5d93)]
+1949 0 obj <<
+/Names [(chapter.5) 78 0 R (chapter.6) 602 0 R (classkmp__flag) 1002 0 R (classkmp__flag_a36961b6d49f84ab81365a9389613ea34) 1637 0 R (classkmp__flag_a5d89de3bda829ab9be324007d915aa3b) 1638 0 R (classkmp__flag_aebad8727c9520d1bb2b2219c94cb3c62) 1639 0 R]
+/Limits [(chapter.5) (classkmp__flag_aebad8727c9520d1bb2b2219c94cb3c62)]
>> endobj
-1488 0 obj <<
-/Names [(group__BASIC__TYPES_ga744ef043bd848d5e338b4c72ef247adc) 833 0 R (group__BASIC__TYPES_ga951d8a0a41a4b285b3da9cabd7a99f85) 836 0 R (group__BASIC__TYPES_gaaffb56f3d5bd8803b41e9862e2aeb863) 835 0 R (group__BASIC__TYPES_gaf2f9e5d03f9f38651a3b8d5ef8635d44) 832 0 R (group__DEPRECATED) 706 0 R (group__DEPRECATED_ga27292e41af4c26e0bdf45b12b1f76d5a) 851 0 R]
+1950 0 obj <<
+/Names [(classkmp__flag_af653ec27d16d63dab994e52ac6713aed) 1636 0 R (classstats__flags__e) 1003 0 R (classstats__flags__e_a0d979459c9a441d94294d52e0745399e) 1652 0 R (classstats__flags__e_a37c8b539cc437be55817a1f122698106) 1563 0 R (classstats__flags__e_a3f4cdfcd6be0d93ac771c0e37c61567f) 1550 0 R (classstats__flags__e_ab89a43b134178cd06845c54ca4d80e7f) 1650 0 R]
+/Limits [(classkmp__flag_af653ec27d16d63dab994e52ac6713aed) (classstats__flags__e_ab89a43b134178cd06845c54ca4d80e7f)]
+>> endobj
+1951 0 obj <<
+/Names [(classstats__flags__e_ac738a2dc47b270830803e943744f0d43) 1651 0 R (group__ATOMIC__OPS) 938 0 R (group__BASIC__TYPES) 911 0 R (group__BASIC__TYPES_ga50e3ecb5eb8d70f437a84a8b2bc9e88f) 1083 0 R (group__BASIC__TYPES_ga690fda6b92f039a72db263c6b4394ddb) 1084 0 R (group__BASIC__TYPES_ga7358cc60d0f006b36752a1795e6d5d93) 1080 0 R]
+/Limits [(classstats__flags__e_ac738a2dc47b270830803e943744f0d43) (group__BASIC__TYPES_ga7358cc60d0f006b36752a1795e6d5d93)]
+>> endobj
+1952 0 obj <<
+/Names [(group__BASIC__TYPES_ga744ef043bd848d5e338b4c72ef247adc) 1079 0 R (group__BASIC__TYPES_ga951d8a0a41a4b285b3da9cabd7a99f85) 1082 0 R (group__BASIC__TYPES_gaaffb56f3d5bd8803b41e9862e2aeb863) 1081 0 R (group__BASIC__TYPES_gaf2f9e5d03f9f38651a3b8d5ef8635d44) 1078 0 R (group__DEPRECATED) 912 0 R (group__DEPRECATED_ga27292e41af4c26e0bdf45b12b1f76d5a) 1096 0 R]
/Limits [(group__BASIC__TYPES_ga744ef043bd848d5e338b4c72ef247adc) (group__DEPRECATED_ga27292e41af4c26e0bdf45b12b1f76d5a)]
>> endobj
-1489 0 obj <<
-/Names [(group__PARALLEL) 726 0 R (group__PARALLEL_ga1cab712d076ba1d2758b0c3bf5ffe38a) 895 0 R (group__PARALLEL_ga345b3a5866deefefc91ae1e8958f49f4) 893 0 R (group__PARALLEL_ga7b1ba1cc8d9d2fea8654bbb1e59f079e) 896 0 R (group__PARALLEL_gaae9462b03457d809faeb3e767a5b2283) 894 0 R (group__PARALLEL_gab49014fb4572e7d0f308fd9b1824daf7) 887 0 R]
+1953 0 obj <<
+/Names [(group__PARALLEL) 933 0 R (group__PARALLEL_ga1cab712d076ba1d2758b0c3bf5ffe38a) 1141 0 R (group__PARALLEL_ga345b3a5866deefefc91ae1e8958f49f4) 1139 0 R (group__PARALLEL_ga7b1ba1cc8d9d2fea8654bbb1e59f079e) 1142 0 R (group__PARALLEL_gaae9462b03457d809faeb3e767a5b2283) 1140 0 R (group__PARALLEL_gab49014fb4572e7d0f308fd9b1824daf7) 1133 0 R]
/Limits [(group__PARALLEL) (group__PARALLEL_gab49014fb4572e7d0f308fd9b1824daf7)]
>> endobj
-1490 0 obj <<
-/Names [(group__PARALLEL_gac2b7cc2fa78dde5381bcf00cfc48d124) 891 0 R (group__PARALLEL_gac341818e68b06d910111e4cf08bb54dd) 889 0 R (group__STARTUP__SHUTDOWN) 707 0 R (group__STARTUP__SHUTDOWN_ga53f4ef16321f42eeb3b8dd463b51f112) 732 0 R (group__STARTUP__SHUTDOWN_gacdedfb2c01fe256ad6c75507644bdfed) 733 0 R (group__SYNCHRONIZATION) 730 0 R]
-/Limits [(group__PARALLEL_gac2b7cc2fa78dde5381bcf00cfc48d124) (group__SYNCHRONIZATION)]
+1954 0 obj <<
+/Names [(group__PARALLEL_gac2b7cc2fa78dde5381bcf00cfc48d124) 1137 0 R (group__PARALLEL_gac341818e68b06d910111e4cf08bb54dd) 1135 0 R (group__STARTUP__SHUTDOWN) 913 0 R (group__STARTUP__SHUTDOWN_ga53f4ef16321f42eeb3b8dd463b51f112) 940 0 R (group__STARTUP__SHUTDOWN_gacdedfb2c01fe256ad6c75507644bdfed) 941 0 R (group__STATS__GATHERING) 939 0 R]
+/Limits [(group__PARALLEL_gac2b7cc2fa78dde5381bcf00cfc48d124) (group__STATS__GATHERING)]
>> endobj
-1491 0 obj <<
-/Names [(group__SYNCHRONIZATION_ga2cb95dd19b86bd1b925be9be29a17f85) 1143 0 R (group__SYNCHRONIZATION_ga2ead7ca8fe9886581c216ca8006ae3c9) 1146 0 R (group__SYNCHRONIZATION_ga35415691dad1e3430caa78c9d4b34cb3) 1144 0 R (group__SYNCHRONIZATION_ga5a51fa2c8f61d807895e377d6c732b16) 1141 0 R (group__SYNCHRONIZATION_ga5c40184c6babbe35c50d43a47573c5c5) 738 0 R (group__SYNCHRONIZATION_ga6a08af1c559012315e7e5be69f7fe608) 1145 0 R]
+1955 0 obj <<
+/Names [(group__STATS__GATHERING_ga49fb18e6ba9abac7dcf1f9a202741b66) 1525 0 R (group__STATS__GATHERING_ga568b0fdabf6bf808dcb3b42b97c7bc26) 1534 0 R (group__STATS__GATHERING_ga62f4b6e3a4ba48c04b172b97df137839) 1529 0 R (group__STATS__GATHERING_ga6e4f12c6bec4068d72ef9e84516ad01d) 1533 0 R (group__STATS__GATHERING_ga7691000a7864b475046ae62fcf0536ac) 1530 0 R (group__STATS__GATHERING_ga7fa64ec62947bf0b97f3f4778dd22196) 1531 0 R]
+/Limits [(group__STATS__GATHERING_ga49fb18e6ba9abac7dcf1f9a202741b66) (group__STATS__GATHERING_ga7fa64ec62947bf0b97f3f4778dd22196)]
+>> endobj
+1956 0 obj <<
+/Names [(group__STATS__GATHERING_ga8b26485fe6ad4f74b63e54c42fcfd875) 1532 0 R (group__STATS__GATHERING_gaa30e2155ac435335965e2e615c1eaea5) 1535 0 R (group__STATS__GATHERING_gab0bd69c3ce378f4f7079276311e034c0) 1528 0 R (group__STATS__GATHERING_gaccf71030e44454acab22210bb4a89d1b) 1527 0 R (group__STATS__GATHERING_sec_stats_env_vars) 1524 0 R (group__SYNCHRONIZATION) 937 0 R]
+/Limits [(group__STATS__GATHERING_ga8b26485fe6ad4f74b63e54c42fcfd875) (group__SYNCHRONIZATION)]
+>> endobj
+1957 0 obj <<
+/Names [(group__SYNCHRONIZATION_ga2cb95dd19b86bd1b925be9be29a17f85) 1433 0 R (group__SYNCHRONIZATION_ga2ead7ca8fe9886581c216ca8006ae3c9) 1436 0 R (group__SYNCHRONIZATION_ga35415691dad1e3430caa78c9d4b34cb3) 1434 0 R (group__SYNCHRONIZATION_ga5a51fa2c8f61d807895e377d6c732b16) 1431 0 R (group__SYNCHRONIZATION_ga5c40184c6babbe35c50d43a47573c5c5) 946 0 R (group__SYNCHRONIZATION_ga6a08af1c559012315e7e5be69f7fe608) 1435 0 R]
/Limits [(group__SYNCHRONIZATION_ga2cb95dd19b86bd1b925be9be29a17f85) (group__SYNCHRONIZATION_ga6a08af1c559012315e7e5be69f7fe608)]
>> endobj
-1492 0 obj <<
-/Names [(group__SYNCHRONIZATION_ga84b2ebeef737395dddd8ef446c071760) 1137 0 R (group__SYNCHRONIZATION_gacea2959cabb92c4a941087e524c5f3d5) 1139 0 R (group__SYNCHRONIZATION_gafc5438d4c4f01dcd347d9bfde27f68e1) 737 0 R (group__TASKING) 1219 0 R (group__TASKING_ga8b2a95073f7a4a81055899ee6a93ecee) 1221 0 R (group__TASKING_gab53273918f995639450c4dcbed02df88) 1223 0 R]
+1958 0 obj <<
+/Names [(group__SYNCHRONIZATION_ga84b2ebeef737395dddd8ef446c071760) 1427 0 R (group__SYNCHRONIZATION_gacea2959cabb92c4a941087e524c5f3d5) 1429 0 R (group__SYNCHRONIZATION_gafc5438d4c4f01dcd347d9bfde27f68e1) 945 0 R (group__TASKING) 1597 0 R (group__TASKING_ga8b2a95073f7a4a81055899ee6a93ecee) 1599 0 R (group__TASKING_gab53273918f995639450c4dcbed02df88) 1601 0 R]
/Limits [(group__SYNCHRONIZATION_ga84b2ebeef737395dddd8ef446c071760) (group__TASKING_gab53273918f995639450c4dcbed02df88)]
>> endobj
-1493 0 obj <<
-/Names [(group__THREADPRIVATE) 729 0 R (group__THREADPRIVATE_ga0c2f8074a8474eee42bc96a4bdc7679a) 1188 0 R (group__THREADPRIVATE_ga120efa08eb51f45664477d30eff31916) 1193 0 R (group__THREADPRIVATE_ga1453eca6136fd77e5de88ea0e78cc7a4) 1192 0 R (group__THREADPRIVATE_gab4aa3dff2b1b55b1abb002ef69c7efe7) 1194 0 R (group__THREADPRIVATE_gab6148c019e88c8853596bf5f516373b4) 1186 0 R]
+1959 0 obj <<
+/Names [(group__THREADPRIVATE) 936 0 R (group__THREADPRIVATE_ga0c2f8074a8474eee42bc96a4bdc7679a) 1478 0 R (group__THREADPRIVATE_ga120efa08eb51f45664477d30eff31916) 1484 0 R (group__THREADPRIVATE_ga1453eca6136fd77e5de88ea0e78cc7a4) 1483 0 R (group__THREADPRIVATE_gab4aa3dff2b1b55b1abb002ef69c7efe7) 1485 0 R (group__THREADPRIVATE_gab6148c019e88c8853596bf5f516373b4) 1476 0 R]
/Limits [(group__THREADPRIVATE) (group__THREADPRIVATE_gab6148c019e88c8853596bf5f516373b4)]
>> endobj
-1494 0 obj <<
-/Names [(group__THREADPRIVATE_gab7035b42d465074b31195534efb37e3b) 1191 0 R (group__THREADPRIVATE_gac1f868aef7d531d34b91eaa57e339f21) 1189 0 R (group__THREADPRIVATE_gad8268ac7d007fa1c3351da682c487c0f) 1190 0 R (group__THREADPRIVATE_gaec6e88892a1b0b62287df5173a7f0336) 1195 0 R (group__THREADPRIVATE_gaf9503cacabf6cf90ed34f2727fc480bc) 1187 0 R (group__THREAD__STATES) 727 0 R]
+1960 0 obj <<
+/Names [(group__THREADPRIVATE_gab7035b42d465074b31195534efb37e3b) 1481 0 R (group__THREADPRIVATE_gac1f868aef7d531d34b91eaa57e339f21) 1479 0 R (group__THREADPRIVATE_gad8268ac7d007fa1c3351da682c487c0f) 1480 0 R (group__THREADPRIVATE_gaec6e88892a1b0b62287df5173a7f0336) 1486 0 R (group__THREADPRIVATE_gaf9503cacabf6cf90ed34f2727fc480bc) 1477 0 R (group__THREAD__STATES) 934 0 R]
/Limits [(group__THREADPRIVATE_gab7035b42d465074b31195534efb37e3b) (group__THREAD__STATES)]
>> endobj
-1495 0 obj <<
-/Names [(group__THREAD__STATES_ga127cc7161bbef3ccd2446a9405973192) 924 0 R (group__THREAD__STATES_ga39488769ed881a75703495759c0f109f) 926 0 R (group__THREAD__STATES_ga5c4aad6e2e289283e9c58031f7c4e228) 927 0 R (group__THREAD__STATES_ga9a981e3dcd9264c2cf5bd8a8cc6f16af) 922 0 R (group__THREAD__STATES_gadcc691c6c7695988deba68a2de817a66) 920 0 R (group__WORK__SHARING) 728 0 R]
-/Limits [(group__THREAD__STATES_ga127cc7161bbef3ccd2446a9405973192) (group__WORK__SHARING)]
+1961 0 obj <<
+/Names [(group__THREAD__STATES_ga127cc7161bbef3ccd2446a9405973192) 1170 0 R (group__THREAD__STATES_ga39488769ed881a75703495759c0f109f) 1172 0 R (group__THREAD__STATES_ga5c4aad6e2e289283e9c58031f7c4e228) 1173 0 R (group__THREAD__STATES_ga9a981e3dcd9264c2cf5bd8a8cc6f16af) 1168 0 R (group__THREAD__STATES_gadcc691c6c7695988deba68a2de817a66) 1166 0 R (group__USER) 1607 0 R]
+/Limits [(group__THREAD__STATES_ga127cc7161bbef3ccd2446a9405973192) (group__USER)]
>> endobj
-1496 0 obj <<
-/Names [(group__WORK__SHARING_ga06dfab09153c455fcaa609e97846b0d5) 1040 0 R (group__WORK__SHARING_ga134f0e9d82a69403d9e167dbbf7ae731) 1042 0 R (group__WORK__SHARING_ga20f319fbf345661d19fc6bfd325231a5) 1058 0 R (group__WORK__SHARING_ga305bbe90a798fdc8347aa809978365f5) 1057 0 R (group__WORK__SHARING_ga4bec24e63a011cc0bfca98e79f3c0b93) 1045 0 R (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) 736 0 R]
-/Limits [(group__WORK__SHARING_ga06dfab09153c455fcaa609e97846b0d5) (group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b)]
+1962 0 obj <<
+/Names [(group__WAIT__RELEASE) 1060 0 R (group__WAIT__RELEASE_ga507a7197646f995b5529a68c1481e39b) 1061 0 R (group__WAIT__RELEASE_gga507a7197646f995b5529a68c1481e39ba8b02d824728fb546d43123b8b069ed04) 1064 0 R (group__WAIT__RELEASE_gga507a7197646f995b5529a68c1481e39ba9e8f1573ea73441426c6a6dda73b4e49) 1065 0 R (group__WAIT__RELEASE_gga507a7197646f995b5529a68c1481e39baa8e37e16d043d78e34da1d19387be5ba) 1062 0 R (group__WORK__SHARING) 935 0 R]
+/Limits [(group__WAIT__RELEASE) (group__WORK__SHARING)]
>> endobj
-1497 0 obj <<
-/Names [(group__WORK__SHARING_ga5f02c0e2081859da86664bfeaec6de62) 1052 0 R (group__WORK__SHARING_ga721f06c8017479ccc6cb46ae0552b597) 1037 0 R (group__WORK__SHARING_ga794e820b3c076c766cef93bb414908cc) 1043 0 R (group__WORK__SHARING_ga91d58a0a222e1f75e1d5d65b8ece3645) 1059 0 R (group__WORK__SHARING_ga9ef4cfec5c836de61180767240c7f380) 1049 0 R (group__WORK__SHARING_gaa290fe71698081e26ec234a234d2fdcc) 1038 0 R]
-/Limits [(group__WORK__SHARING_ga5f02c0e2081859da86664bfeaec6de62) (group__WORK__SHARING_gaa290fe71698081e26ec234a234d2fdcc)]
+1963 0 obj <<
+/Names [(group__WORK__SHARING_ga06dfab09153c455fcaa609e97846b0d5) 1291 0 R (group__WORK__SHARING_ga134f0e9d82a69403d9e167dbbf7ae731) 1293 0 R (group__WORK__SHARING_ga20f319fbf345661d19fc6bfd325231a5) 1310 0 R (group__WORK__SHARING_ga21ff57e990e07b43d08dfb4214d928c8) 1335 0 R (group__WORK__SHARING_ga305bbe90a798fdc8347aa809978365f5) 1309 0 R (group__WORK__SHARING_ga4bec24e63a011cc0bfca98e79f3c0b93) 1296 0 R]
+/Limits [(group__WORK__SHARING_ga06dfab09153c455fcaa609e97846b0d5) (group__WORK__SHARING_ga4bec24e63a011cc0bfca98e79f3c0b93)]
>> endobj
-1498 0 obj <<
-/Names [(group__WORK__SHARING_gaa7d615b194c12278b00841852b0dff2b) 1044 0 R (group__WORK__SHARING_gab1eac772e1ef6ddc3a8512c00a4e78be) 1051 0 R (group__WORK__SHARING_gab516cbd738ec072f4929faecbbc456f9) 1056 0 R (group__WORK__SHARING_gac9f8cad27477155b583b54848887997d) 1053 0 R (group__WORK__SHARING_gad49ead8c4196b726b6f04d4b1d53d01d) 1050 0 R (group__WORK__SHARING_gad99af80b23202044e80aaed7d711b9ac) 1055 0 R]
-/Limits [(group__WORK__SHARING_gaa7d615b194c12278b00841852b0dff2b) (group__WORK__SHARING_gad99af80b23202044e80aaed7d711b9ac)]
+1964 0 obj <<
+/Names [(group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) 944 0 R (group__WORK__SHARING_ga5d02abafbc1bf1f9c8d7f3d44ad85970) 1339 0 R (group__WORK__SHARING_ga5f02c0e2081859da86664bfeaec6de62) 1304 0 R (group__WORK__SHARING_ga7054a4ec6bf4a65dda00a0aab75db65f) 1334 0 R (group__WORK__SHARING_ga721f06c8017479ccc6cb46ae0552b597) 1288 0 R (group__WORK__SHARING_ga794e820b3c076c766cef93bb414908cc) 1294 0 R]
+/Limits [(group__WORK__SHARING_ga5671ff45051907f76cc3d214e1de854b) (group__WORK__SHARING_ga794e820b3c076c766cef93bb414908cc)]
>> endobj
-1499 0 obj <<
-/Names [(group__WORK__SHARING_gada4a8fc8b0a17d3109acdeaf2c9443ea) 1039 0 R (group__WORK__SHARING_gadcaf200537aaa0218a60c398438f81be) 1016 0 R (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) 735 0 R (group__WORK__SHARING_gaed75fbf8e655bc644d585a48e810bcfc) 1046 0 R (group__WORK__SHARING_gaf047657f8ff072f15174f03ff80b4882) 1048 0 R (group__WORK__SHARING_gaf293aeef6b6f673f2d824171d6ec20e3) 1054 0 R]
-/Limits [(group__WORK__SHARING_gada4a8fc8b0a17d3109acdeaf2c9443ea) (group__WORK__SHARING_gaf293aeef6b6f673f2d824171d6ec20e3)]
+1965 0 obj <<
+/Names [(group__WORK__SHARING_ga81091e3b6b3dfe02aab5e0a661f65433) 1340 0 R (group__WORK__SHARING_ga91d58a0a222e1f75e1d5d65b8ece3645) 1311 0 R (group__WORK__SHARING_ga99c820d33a0515e359a8f3414d3e9392) 1338 0 R (group__WORK__SHARING_ga9a4e5434d7a476580c6ef7ad2c776bb5) 1300 0 R (group__WORK__SHARING_ga9ef4cfec5c836de61180767240c7f380) 1301 0 R (group__WORK__SHARING_gaa290fe71698081e26ec234a234d2fdcc) 1289 0 R]
+/Limits [(group__WORK__SHARING_ga81091e3b6b3dfe02aab5e0a661f65433) (group__WORK__SHARING_gaa290fe71698081e26ec234a234d2fdcc)]
>> endobj
-1500 0 obj <<
-/Names [(group__WORK__SHARING_gafb31932f7af41b5db5e7d80b21926853) 1047 0 R (group__WORK__SHARING_gafc4e7d07089576fe946c42777ef191cc) 1041 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea14900e8333498e699db5038b413fa53a) 1031 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea1fd38bd33c374db6667332f011a980d9) 1034 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea270b6b98ec2f9ec4832f7a59b0a0d532) 1020 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea2816d8223370b9c78f554321cd308b53) 1032 0 R]
-/Limits [(group__WORK__SHARING_gafb31932f7af41b5db5e7d80b21926853) (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea2816d8223370b9c78f554321cd308b53)]
+1966 0 obj <<
+/Names [(group__WORK__SHARING_gaa7d615b194c12278b00841852b0dff2b) 1295 0 R (group__WORK__SHARING_gab1acaeaf1525bb1d998ba2110c268b24) 1333 0 R (group__WORK__SHARING_gab1eac772e1ef6ddc3a8512c00a4e78be) 1303 0 R (group__WORK__SHARING_gab516cbd738ec072f4929faecbbc456f9) 1308 0 R (group__WORK__SHARING_gac43752941984fb8fda7dc8f2a430f4cb) 1337 0 R (group__WORK__SHARING_gac7d4d8d2d7f5d33b5c2b33d89b3ec0af) 1336 0 R]
+/Limits [(group__WORK__SHARING_gaa7d615b194c12278b00841852b0dff2b) (group__WORK__SHARING_gac7d4d8d2d7f5d33b5c2b33d89b3ec0af)]
>> endobj
-1501 0 obj <<
-/Names [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea28ae6227a8117b9f39b797caf3211313) 1027 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea2a987351b9605b918693a17d4dd90772) 1018 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea317dd63053ef79e3b3cea2ce2b676b38) 1036 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea3dd2ff18afe8c14f3076694e52942ee5) 1033 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea4132f477daf882e74036a9062a97b7a3) 1028 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea52b66fc7ba82beb3d6fbdb82a6ef045d) 1019 0 R]
-/Limits [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea28ae6227a8117b9f39b797caf3211313) (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea52b66fc7ba82beb3d6fbdb82a6ef045d)]
+1967 0 obj <<
+/Names [(group__WORK__SHARING_gac9f8cad27477155b583b54848887997d) 1305 0 R (group__WORK__SHARING_gad49ead8c4196b726b6f04d4b1d53d01d) 1302 0 R (group__WORK__SHARING_gad99af80b23202044e80aaed7d711b9ac) 1307 0 R (group__WORK__SHARING_gada4a8fc8b0a17d3109acdeaf2c9443ea) 1290 0 R (group__WORK__SHARING_gadcaf200537aaa0218a60c398438f81be) 1267 0 R (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26) 943 0 R]
+/Limits [(group__WORK__SHARING_gac9f8cad27477155b583b54848887997d) (group__WORK__SHARING_gae991c61cbe8e2942fe1f757a65442b26)]
>> endobj
-1502 0 obj <<
-/Names [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea7d1b46242e62919d0c5af733553351c3) 1030 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea7ed3535e3c97c9c2ce299addd74b4a01) 1017 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea9a30ec9215efb0a584597aeda2c03e19) 1035 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea9a4a0dce1e919688bcd27411746b7ad8) 1023 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beaa0f903270046d7a28b002855648da9f1) 1024 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beab1e0332cc09c1f3ee029b9fcc1c40ba0) 1022 0 R]
-/Limits [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea7d1b46242e62919d0c5af733553351c3) (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beab1e0332cc09c1f3ee029b9fcc1c40ba0)]
+1968 0 obj <<
+/Names [(group__WORK__SHARING_gaed75fbf8e655bc644d585a48e810bcfc) 1297 0 R (group__WORK__SHARING_gaf047657f8ff072f15174f03ff80b4882) 1299 0 R (group__WORK__SHARING_gaf293aeef6b6f673f2d824171d6ec20e3) 1306 0 R (group__WORK__SHARING_gafb31932f7af41b5db5e7d80b21926853) 1298 0 R (group__WORK__SHARING_gafc4e7d07089576fe946c42777ef191cc) 1292 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea14900e8333498e699db5038b413fa53a) 1282 0 R]
+/Limits [(group__WORK__SHARING_gaed75fbf8e655bc644d585a48e810bcfc) (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea14900e8333498e699db5038b413fa53a)]
>> endobj
-1503 0 obj <<
-/Names [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beabbef146a7c8d44992e9c61bec2309348) 1026 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beac30b06c765f4623efb929a141ff9457e) 1029 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beadb87fc98ffc6440f53caa1f5d6606512) 1025 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beae4b8e84801f56fdb39472c45762bd051) 1021 0 R (index) 680 0 R (index_SEC_EXAMPLES) 724 0 R]
-/Limits [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beabbef146a7c8d44992e9c61bec2309348) (index_SEC_EXAMPLES)]
+1969 0 obj <<
+/Names [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea1fd38bd33c374db6667332f011a980d9) 1285 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea270b6b98ec2f9ec4832f7a59b0a0d532) 1271 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea2816d8223370b9c78f554321cd308b53) 1283 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea28ae6227a8117b9f39b797caf3211313) 1278 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea2a987351b9605b918693a17d4dd90772) 1269 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea317dd63053ef79e3b3cea2ce2b676b38) 1287 0 R]
+/Limits [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea1fd38bd33c374db6667332f011a980d9) (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea317dd63053ef79e3b3cea2ce2b676b38)]
>> endobj
-1504 0 obj <<
-/Names [(index_SEC_INTERFACES) 704 0 R (index_SEC_SEC_OT) 702 0 R (index_SEC_SEC_PT) 703 0 R (index_SEC_SHAREDVARS) 701 0 R (index_SEC_WORKSHARING_EXAMPLE) 725 0 R (index_sec_building) 683 0 R]
-/Limits [(index_SEC_INTERFACES) (index_sec_building)]
+1970 0 obj <<
+/Names [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea3dd2ff18afe8c14f3076694e52942ee5) 1284 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea4132f477daf882e74036a9062a97b7a3) 1279 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea52b66fc7ba82beb3d6fbdb82a6ef045d) 1270 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea7d1b46242e62919d0c5af733553351c3) 1281 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea7ed3535e3c97c9c2ce299addd74b4a01) 1268 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea9a30ec9215efb0a584597aeda2c03e19) 1286 0 R]
+/Limits [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea3dd2ff18afe8c14f3076694e52942ee5) (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea9a30ec9215efb0a584597aeda2c03e19)]
>> endobj
-1505 0 obj <<
-/Names [(index_sec_frontend) 691 0 R (index_sec_intro) 681 0 R (index_sec_outlining) 692 0 R (index_sec_supported) 690 0 R (page.1) 679 0 R (page.10) 775 0 R]
-/Limits [(index_sec_frontend) (page.10)]
+1971 0 obj <<
+/Names [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea9a4a0dce1e919688bcd27411746b7ad8) 1274 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beaa0f903270046d7a28b002855648da9f1) 1275 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beab1e0332cc09c1f3ee029b9fcc1c40ba0) 1273 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beabbef146a7c8d44992e9c61bec2309348) 1277 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beac30b06c765f4623efb929a141ff9457e) 1280 0 R (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beadb87fc98ffc6440f53caa1f5d6606512) 1276 0 R]
+/Limits [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81bea9a4a0dce1e919688bcd27411746b7ad8) (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beadb87fc98ffc6440f53caa1f5d6606512)]
>> endobj
-1506 0 obj <<
-/Names [(page.11) 779 0 R (page.12) 786 0 R (page.13) 798 0 R (page.14) 805 0 R (page.15) 809 0 R (page.16) 813 0 R]
-/Limits [(page.11) (page.16)]
+1972 0 obj <<
+/Names [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beae4b8e84801f56fdb39472c45762bd051) 1272 0 R (index) 888 0 R (index_SEC_EXAMPLES) 931 0 R (index_SEC_INTERFACES) 910 0 R (index_SEC_SEC_OT) 908 0 R (index_SEC_SEC_PT) 909 0 R]
+/Limits [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beae4b8e84801f56fdb39472c45762bd051) (index_SEC_SEC_PT)]
>> endobj
-1507 0 obj <<
-/Names [(page.17) 818 0 R (page.18) 831 0 R (page.19) 842 0 R (page.2) 688 0 R (page.20) 849 0 R (page.21) 861 0 R]
-/Limits [(page.17) (page.21)]
+1973 0 obj <<
+/Names [(index_SEC_SHAREDVARS) 907 0 R (index_SEC_WORKSHARING_EXAMPLE) 932 0 R (index_sec_building) 891 0 R (index_sec_frontend) 897 0 R (index_sec_intro) 889 0 R (index_sec_outlining) 898 0 R]
+/Limits [(index_SEC_SHAREDVARS) (index_sec_outlining)]
>> endobj
-1508 0 obj <<
-/Names [(page.22) 884 0 R (page.23) 900 0 R (page.24) 918 0 R (page.25) 931 0 R (page.26) 1013 0 R (page.27) 1066 0 R]
-/Limits [(page.22) (page.27)]
+1974 0 obj <<
+/Names [(index_sec_supported) 896 0 R (kmp__stats_8h_source) 1526 0 R (page.1) 887 0 R (page.10) 990 0 R (page.11) 1000 0 R (page.12) 1007 0 R]
+/Limits [(index_sec_supported) (page.12)]
>> endobj
-1509 0 obj <<
-/Names [(page.28) 1076 0 R (page.29) 1087 0 R (page.3) 700 0 R (page.30) 1092 0 R (page.31) 1104 0 R (page.32) 1111 0 R]
-/Limits [(page.28) (page.32)]
+1975 0 obj <<
+/Names [(page.13) 1011 0 R (page.14) 1018 0 R (page.15) 1030 0 R (page.16) 1036 0 R (page.17) 1040 0 R (page.18) 1045 0 R]
+/Limits [(page.13) (page.18)]
>> endobj
-1510 0 obj <<
-/Names [(page.33) 1135 0 R (page.34) 1150 0 R (page.35) 1158 0 R (page.36) 1184 0 R (page.37) 1201 0 R (page.38) 1208 0 R]
-/Limits [(page.33) (page.38)]
+1976 0 obj <<
+/Names [(page.19) 1050 0 R (page.2) 895 0 R (page.20) 1059 0 R (page.21) 1077 0 R (page.22) 1088 0 R (page.23) 1094 0 R]
+/Limits [(page.19) (page.23)]
>> endobj
-1511 0 obj <<
-/Names [(page.39) 1218 0 R (page.4) 723 0 R (page.40) 1228 0 R (page.41) 1237 0 R (page.42) 1247 0 R (page.43) 1300 0 R]
-/Limits [(page.39) (page.43)]
+1977 0 obj <<
+/Names [(page.24) 1107 0 R (page.25) 1130 0 R (page.26) 1146 0 R (page.27) 1164 0 R (page.28) 1177 0 R (page.29) 1263 0 R]
+/Limits [(page.24) (page.29)]
>> endobj
-1512 0 obj <<
-/Names [(page.44) 1374 0 R (page.45) 1453 0 R (page.5) 742 0 R (page.6) 746 0 R (page.7) 760 0 R (page.8) 765 0 R]
-/Limits [(page.44) (page.8)]
+1978 0 obj <<
+/Names [(page.3) 906 0 R (page.30) 1332 0 R (page.31) 1347 0 R (page.32) 1356 0 R (page.33) 1366 0 R (page.34) 1374 0 R]
+/Limits [(page.3) (page.34)]
>> endobj
-1513 0 obj <<
-/Names [(page.9) 771 0 R (section*.10) 862 0 R (section*.11) 885 0 R (section*.12) 886 0 R (section*.13) 919 0 R (section*.14) 1014 0 R]
-/Limits [(page.9) (section*.14)]
+1979 0 obj <<
+/Names [(page.35) 1381 0 R (page.36) 1392 0 R (page.37) 1402 0 R (page.38) 1425 0 R (page.39) 1440 0 R (page.4) 930 0 R]
+/Limits [(page.35) (page.4)]
>> endobj
-1514 0 obj <<
-/Names [(section*.15) 1015 0 R (section*.16) 1136 0 R (section*.17) 1185 0 R (section*.18) 1220 0 R (section*.19) 1238 0 R (section*.2) 787 0 R]
-/Limits [(section*.15) (section*.2)]
+1980 0 obj <<
+/Names [(page.40) 1448 0 R (page.41) 1474 0 R (page.42) 1492 0 R (page.43) 1498 0 R (page.44) 1521 0 R (page.45) 1546 0 R]
+/Limits [(page.40) (page.45)]
>> endobj
-1515 0 obj <<
-/Names [(section*.3) 790 0 R (section*.4) 792 0 R (section*.5) 799 0 R (section*.6) 800 0 R (section*.7) 814 0 R (section*.8) 819 0 R]
-/Limits [(section*.3) (section*.8)]
+1981 0 obj <<
+/Names [(page.46) 1559 0 R (page.47) 1579 0 R (page.48) 1588 0 R (page.49) 1596 0 R (page.5) 950 0 R (page.50) 1606 0 R]
+/Limits [(page.46) (page.50)]
>> endobj
-1516 0 obj <<
-/Names [(section*.9) 850 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.1.5) 26 0 R]
-/Limits [(section*.9) (section.1.5)]
+1982 0 obj <<
+/Names [(page.51) 1616 0 R (page.52) 1632 0 R (page.53) 1648 0 R (page.54) 1657 0 R (page.55) 1710 0 R (page.56) 1777 0 R]
+/Limits [(page.51) (page.56)]
>> endobj
-1517 0 obj <<
-/Names [(section.1.6) 42 0 R (section.1.7) 46 0 R (section.2.1) 58 0 R (section.3.1) 66 0 R (section.4.1) 74 0 R (section.4.10) 462 0 R]
-/Limits [(section.1.6) (section.4.10)]
+1983 0 obj <<
+/Names [(page.57) 1875 0 R (page.58) 1915 0 R (page.6) 955 0 R (page.7) 972 0 R (page.8) 976 0 R (page.9) 986 0 R]
+/Limits [(page.57) (page.9)]
>> endobj
-1518 0 obj <<
-/Names [(section.4.2) 82 0 R (section.4.3) 126 0 R (section.4.4) 142 0 R (section.4.5) 162 0 R (section.4.6) 206 0 R (section.4.7) 238 0 R]
-/Limits [(section.4.2) (section.4.7)]
+1984 0 obj <<
+/Names [(section*.10) 1108 0 R (section*.11) 1131 0 R (section*.12) 1132 0 R (section*.13) 1165 0 R (section*.14) 1264 0 R (section*.15) 1265 0 R]
+/Limits [(section*.10) (section*.15)]
>> endobj
-1519 0 obj <<
-/Names [(section.4.8) 358 0 R (section.4.9) 406 0 R (section.5.1) 486 0 R (structident) 734 0 R (structident_a8a098c07080704af1d89e401a1b4d10f) 1241 0 R (structident_a8c2ccc106967f36d7191d59d4d5a65dc) 1240 0 R]
-/Limits [(section.4.8) (structident_a8c2ccc106967f36d7191d59d4d5a65dc)]
+1985 0 obj <<
+/Names [(section*.16) 1426 0 R (section*.17) 1475 0 R (section*.18) 1522 0 R (section*.19) 1523 0 R (section*.2) 1019 0 R (section*.20) 1598 0 R]
+/Limits [(section*.16) (section*.20)]
>> endobj
-1520 0 obj <<
-/Names [(structident_a91db2d18476e0a527ba20e04ca2c3e74) 1242 0 R (structident_ae29e80f6fc150f73c1790c8796bcfd9f) 1243 0 R (structident_afa1ec17df36c4bf1e36e97eab63953b9) 1239 0 R (subsection.1.5.1) 30 0 R (subsection.1.7.1) 50 0 R (subsection.4.1.1) 78 0 R]
-/Limits [(structident_a91db2d18476e0a527ba20e04ca2c3e74) (subsection.4.1.1)]
+1986 0 obj <<
+/Names [(section*.21) 1617 0 R (section*.22) 1633 0 R (section*.23) 1634 0 R (section*.24) 1635 0 R (section*.25) 1649 0 R (section*.3) 1022 0 R]
+/Limits [(section*.21) (section*.3)]
>> endobj
-1521 0 obj <<
-/Names [(subsection.4.10.1) 466 0 R (subsection.4.10.2) 470 0 R (subsection.4.2.1) 86 0 R (subsection.4.2.2) 90 0 R (subsection.4.2.3) 118 0 R (subsection.4.3.1) 130 0 R]
-/Limits [(subsection.4.10.1) (subsection.4.3.1)]
+1987 0 obj <<
+/Names [(section*.4) 1024 0 R (section*.5) 1031 0 R (section*.6) 1032 0 R (section*.7) 1046 0 R (section*.8) 1051 0 R (section*.9) 1095 0 R]
+/Limits [(section*.4) (section*.9)]
>> endobj
-1522 0 obj <<
-/Names [(subsection.4.3.2) 134 0 R (subsection.4.4.1) 146 0 R (subsection.4.4.2) 150 0 R (subsection.4.5.1) 166 0 R (subsection.4.5.2) 170 0 R (subsection.4.5.3) 178 0 R]
-/Limits [(subsection.4.3.2) (subsection.4.5.3)]
+1988 0 obj <<
+/Names [(section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.1.5) 26 0 R (section.1.6) 42 0 R]
+/Limits [(section.1.1) (section.1.6)]
>> endobj
-1523 0 obj <<
-/Names [(subsection.4.6.1) 210 0 R (subsection.4.6.2) 214 0 R (subsection.4.7.1) 242 0 R (subsection.4.7.2) 246 0 R (subsection.4.7.3) 254 0 R (subsection.4.8.1) 362 0 R]
-/Limits [(subsection.4.6.1) (subsection.4.8.1)]
+1989 0 obj <<
+/Names [(section.1.7) 46 0 R (section.2.1) 58 0 R (section.3.1) 66 0 R (section.4.1) 74 0 R (section.5.1) 82 0 R (section.5.10) 466 0 R]
+/Limits [(section.1.7) (section.5.10)]
>> endobj
-1524 0 obj <<
-/Names [(subsection.4.8.2) 366 0 R (subsection.4.9.1) 410 0 R (subsection.4.9.2) 414 0 R (subsection.4.9.3) 442 0 R (subsection.5.1.1) 490 0 R (subsection.5.1.2) 494 0 R]
-/Limits [(subsection.4.8.2) (subsection.5.1.2)]
+1990 0 obj <<
+/Names [(section.5.11) 522 0 R (section.5.12) 578 0 R (section.5.13) 598 0 R (section.5.2) 90 0 R (section.5.3) 106 0 R (section.5.4) 150 0 R]
+/Limits [(section.5.11) (section.5.4)]
>> endobj
-1525 0 obj <<
-/Names [(subsubsection.1.5.1.1) 34 0 R (subsubsection.1.5.1.2) 38 0 R (subsubsection.4.10.2.1) 474 0 R (subsubsection.4.10.2.2) 478 0 R (subsubsection.4.2.2.1) 94 0 R (subsubsection.4.2.2.2) 98 0 R]
-/Limits [(subsubsection.1.5.1.1) (subsubsection.4.2.2.2)]
+1991 0 obj <<
+/Names [(section.5.5) 166 0 R (section.5.6) 186 0 R (section.5.7) 230 0 R (section.5.8) 262 0 R (section.5.9) 418 0 R (section.6.1) 606 0 R]
+/Limits [(section.5.5) (section.6.1)]
>> endobj
-1526 0 obj <<
-/Names [(subsubsection.4.2.2.3) 102 0 R (subsubsection.4.2.2.4) 106 0 R (subsubsection.4.2.2.5) 110 0 R (subsubsection.4.2.2.6) 114 0 R (subsubsection.4.2.3.1) 122 0 R (subsubsection.4.3.2.1) 138 0 R]
-/Limits [(subsubsection.4.2.2.3) (subsubsection.4.3.2.1)]
+1992 0 obj <<
+/Names [(section.6.2) 638 0 R (section.6.3) 670 0 R (structident) 942 0 R (structident_a8a098c07080704af1d89e401a1b4d10f) 1620 0 R (structident_a8c2ccc106967f36d7191d59d4d5a65dc) 1619 0 R (structident_a91db2d18476e0a527ba20e04ca2c3e74) 1621 0 R]
+/Limits [(section.6.2) (structident_a91db2d18476e0a527ba20e04ca2c3e74)]
>> endobj
-1527 0 obj <<
-/Names [(subsubsection.4.4.2.1) 154 0 R (subsubsection.4.4.2.2) 158 0 R (subsubsection.4.5.2.1) 174 0 R (subsubsection.4.5.3.1) 182 0 R (subsubsection.4.5.3.2) 186 0 R (subsubsection.4.5.3.3) 190 0 R]
-/Limits [(subsubsection.4.4.2.1) (subsubsection.4.5.3.3)]
+1993 0 obj <<
+/Names [(structident_ae29e80f6fc150f73c1790c8796bcfd9f) 1622 0 R (structident_afa1ec17df36c4bf1e36e97eab63953b9) 1618 0 R (subsection.1.5.1) 30 0 R (subsection.1.7.1) 50 0 R (subsection.5.1.1) 86 0 R (subsection.5.10.1) 470 0 R]
+/Limits [(structident_ae29e80f6fc150f73c1790c8796bcfd9f) (subsection.5.10.1)]
>> endobj
-1528 0 obj <<
-/Names [(subsubsection.4.5.3.4) 194 0 R (subsubsection.4.5.3.5) 198 0 R (subsubsection.4.5.3.6) 202 0 R (subsubsection.4.6.2.1) 218 0 R (subsubsection.4.6.2.2) 222 0 R (subsubsection.4.6.2.3) 226 0 R]
-/Limits [(subsubsection.4.5.3.4) (subsubsection.4.6.2.3)]
+1994 0 obj <<
+/Names [(subsection.5.10.2) 474 0 R (subsection.5.10.3) 502 0 R (subsection.5.11.1) 526 0 R (subsection.5.11.2) 530 0 R (subsection.5.11.3) 534 0 R (subsection.5.12.1) 582 0 R]
+/Limits [(subsection.5.10.2) (subsection.5.12.1)]
>> endobj
-1529 0 obj <<
-/Names [(subsubsection.4.6.2.4) 230 0 R (subsubsection.4.6.2.5) 234 0 R (subsubsection.4.7.2.1) 250 0 R (subsubsection.4.7.3.1) 258 0 R (subsubsection.4.7.3.10) 294 0 R (subsubsection.4.7.3.11) 298 0 R]
-/Limits [(subsubsection.4.6.2.4) (subsubsection.4.7.3.11)]
+1995 0 obj <<
+/Names [(subsection.5.12.2) 586 0 R (subsection.5.2.1) 94 0 R (subsection.5.2.2) 98 0 R (subsection.5.3.1) 110 0 R (subsection.5.3.2) 114 0 R (subsection.5.3.3) 142 0 R]
+/Limits [(subsection.5.12.2) (subsection.5.3.3)]
>> endobj
-1530 0 obj <<
-/Names [(subsubsection.4.7.3.12) 302 0 R (subsubsection.4.7.3.13) 306 0 R (subsubsection.4.7.3.14) 310 0 R (subsubsection.4.7.3.15) 314 0 R (subsubsection.4.7.3.16) 318 0 R (subsubsection.4.7.3.17) 322 0 R]
-/Limits [(subsubsection.4.7.3.12) (subsubsection.4.7.3.17)]
+1996 0 obj <<
+/Names [(subsection.5.4.1) 154 0 R (subsection.5.4.2) 158 0 R (subsection.5.5.1) 170 0 R (subsection.5.5.2) 174 0 R (subsection.5.6.1) 190 0 R (subsection.5.6.2) 194 0 R]
+/Limits [(subsection.5.4.1) (subsection.5.6.2)]
>> endobj
-1531 0 obj <<
-/Names [(subsubsection.4.7.3.18) 326 0 R (subsubsection.4.7.3.19) 330 0 R (subsubsection.4.7.3.2) 262 0 R (subsubsection.4.7.3.20) 334 0 R (subsubsection.4.7.3.21) 338 0 R (subsubsection.4.7.3.22) 342 0 R]
-/Limits [(subsubsection.4.7.3.18) (subsubsection.4.7.3.22)]
+1997 0 obj <<
+/Names [(subsection.5.6.3) 202 0 R (subsection.5.7.1) 234 0 R (subsection.5.7.2) 238 0 R (subsection.5.8.1) 266 0 R (subsection.5.8.2) 270 0 R (subsection.5.8.3) 278 0 R]
+/Limits [(subsection.5.6.3) (subsection.5.8.3)]
>> endobj
-1532 0 obj <<
-/Names [(subsubsection.4.7.3.23) 346 0 R (subsubsection.4.7.3.24) 350 0 R (subsubsection.4.7.3.25) 354 0 R (subsubsection.4.7.3.3) 266 0 R (subsubsection.4.7.3.4) 270 0 R (subsubsection.4.7.3.5) 274 0 R]
-/Limits [(subsubsection.4.7.3.23) (subsubsection.4.7.3.5)]
+1998 0 obj <<
+/Names [(subsection.5.9.1) 422 0 R (subsection.5.9.2) 426 0 R (subsection.6.1.1) 610 0 R (subsection.6.1.2) 614 0 R (subsection.6.2.1) 642 0 R (subsection.6.2.2) 646 0 R]
+/Limits [(subsection.5.9.1) (subsection.6.2.2)]
>> endobj
-1533 0 obj <<
-/Names [(subsubsection.4.7.3.6) 278 0 R (subsubsection.4.7.3.7) 282 0 R (subsubsection.4.7.3.8) 286 0 R (subsubsection.4.7.3.9) 290 0 R (subsubsection.4.8.2.1) 370 0 R (subsubsection.4.8.2.2) 374 0 R]
-/Limits [(subsubsection.4.7.3.6) (subsubsection.4.8.2.2)]
+1999 0 obj <<
+/Names [(subsection.6.2.3) 658 0 R (subsection.6.3.1) 674 0 R (subsubsection.1.5.1.1) 34 0 R (subsubsection.1.5.1.2) 38 0 R (subsubsection.5.10.2.1) 478 0 R (subsubsection.5.10.2.2) 482 0 R]
+/Limits [(subsection.6.2.3) (subsubsection.5.10.2.2)]
>> endobj
-1534 0 obj <<
-/Names [(subsubsection.4.8.2.3) 378 0 R (subsubsection.4.8.2.4) 382 0 R (subsubsection.4.8.2.5) 386 0 R (subsubsection.4.8.2.6) 390 0 R (subsubsection.4.8.2.7) 394 0 R (subsubsection.4.8.2.8) 398 0 R]
-/Limits [(subsubsection.4.8.2.3) (subsubsection.4.8.2.8)]
+2000 0 obj <<
+/Names [(subsubsection.5.10.2.3) 486 0 R (subsubsection.5.10.2.4) 490 0 R (subsubsection.5.10.2.5) 494 0 R (subsubsection.5.10.2.6) 498 0 R (subsubsection.5.10.3.1) 506 0 R (subsubsection.5.10.3.2) 510 0 R]
+/Limits [(subsubsection.5.10.2.3) (subsubsection.5.10.3.2)]
>> endobj
-1535 0 obj <<
-/Names [(subsubsection.4.8.2.9) 402 0 R (subsubsection.4.9.2.1) 418 0 R (subsubsection.4.9.2.2) 422 0 R (subsubsection.4.9.2.3) 426 0 R (subsubsection.4.9.2.4) 430 0 R (subsubsection.4.9.2.5) 434 0 R]
-/Limits [(subsubsection.4.8.2.9) (subsubsection.4.9.2.5)]
+2001 0 obj <<
+/Names [(subsubsection.5.10.3.3) 514 0 R (subsubsection.5.10.3.4) 518 0 R (subsubsection.5.11.3.1) 538 0 R (subsubsection.5.11.3.10) 574 0 R (subsubsection.5.11.3.2) 542 0 R (subsubsection.5.11.3.3) 546 0 R]
+/Limits [(subsubsection.5.10.3.3) (subsubsection.5.11.3.3)]
>> endobj
-1536 0 obj <<
-/Names [(subsubsection.4.9.2.6) 438 0 R (subsubsection.4.9.3.1) 446 0 R (subsubsection.4.9.3.2) 450 0 R (subsubsection.4.9.3.3) 454 0 R (subsubsection.4.9.3.4) 458 0 R (subsubsection.5.1.2.1) 498 0 R]
-/Limits [(subsubsection.4.9.2.6) (subsubsection.5.1.2.1)]
+2002 0 obj <<
+/Names [(subsubsection.5.11.3.4) 550 0 R (subsubsection.5.11.3.5) 554 0 R (subsubsection.5.11.3.6) 558 0 R (subsubsection.5.11.3.7) 562 0 R (subsubsection.5.11.3.8) 566 0 R (subsubsection.5.11.3.9) 570 0 R]
+/Limits [(subsubsection.5.11.3.4) (subsubsection.5.11.3.9)]
>> endobj
-1537 0 obj <<
-/Names [(subsubsection.5.1.2.2) 502 0 R (subsubsection.5.1.2.3) 506 0 R (subsubsection.5.1.2.4) 510 0 R (subsubsection.5.1.2.5) 514 0 R (table.4.1) 788 0 R (table.4.10) 902 0 R]
-/Limits [(subsubsection.5.1.2.2) (table.4.10)]
+2003 0 obj <<
+/Names [(subsubsection.5.12.2.1) 590 0 R (subsubsection.5.12.2.2) 594 0 R (subsubsection.5.2.2.1) 102 0 R (subsubsection.5.3.2.1) 118 0 R (subsubsection.5.3.2.2) 122 0 R (subsubsection.5.3.2.3) 126 0 R]
+/Limits [(subsubsection.5.12.2.1) (subsubsection.5.3.2.3)]
>> endobj
-1538 0 obj <<
-/Names [(table.4.11) 903 0 R (table.4.12) 904 0 R (table.4.13) 921 0 R (table.4.14) 923 0 R (table.4.15) 925 0 R (table.4.16) 932 0 R]
-/Limits [(table.4.11) (table.4.16)]
+2004 0 obj <<
+/Names [(subsubsection.5.3.2.4) 130 0 R (subsubsection.5.3.2.5) 134 0 R (subsubsection.5.3.2.6) 138 0 R (subsubsection.5.3.3.1) 146 0 R (subsubsection.5.4.2.1) 162 0 R (subsubsection.5.5.2.1) 178 0 R]
+/Limits [(subsubsection.5.3.2.4) (subsubsection.5.5.2.1)]
>> endobj
-1539 0 obj <<
-/Names [(table.4.17) 933 0 R (table.4.18) 1068 0 R (table.4.19) 1077 0 R (table.4.2) 791 0 R (table.4.20) 1078 0 R (table.4.21) 1088 0 R]
-/Limits [(table.4.17) (table.4.21)]
+2005 0 obj <<
+/Names [(subsubsection.5.5.2.2) 182 0 R (subsubsection.5.6.2.1) 198 0 R (subsubsection.5.6.3.1) 206 0 R (subsubsection.5.6.3.2) 210 0 R (subsubsection.5.6.3.3) 214 0 R (subsubsection.5.6.3.4) 218 0 R]
+/Limits [(subsubsection.5.5.2.2) (subsubsection.5.6.3.4)]
>> endobj
-1540 0 obj <<
-/Names [(table.4.22) 1093 0 R (table.4.23) 1094 0 R (table.4.24) 1095 0 R (table.4.25) 1096 0 R (table.4.26) 1097 0 R (table.4.27) 1105 0 R]
-/Limits [(table.4.22) (table.4.27)]
+2006 0 obj <<
+/Names [(subsubsection.5.6.3.5) 222 0 R (subsubsection.5.6.3.6) 226 0 R (subsubsection.5.7.2.1) 242 0 R (subsubsection.5.7.2.2) 246 0 R (subsubsection.5.7.2.3) 250 0 R (subsubsection.5.7.2.4) 254 0 R]
+/Limits [(subsubsection.5.6.3.5) (subsubsection.5.7.2.4)]
>> endobj
-1541 0 obj <<
-/Names [(table.4.28) 1106 0 R (table.4.29) 1112 0 R (table.4.3) 853 0 R (table.4.30) 1113 0 R (table.4.31) 1138 0 R (table.4.32) 1140 0 R]
-/Limits [(table.4.28) (table.4.32)]
+2007 0 obj <<
+/Names [(subsubsection.5.7.2.5) 258 0 R (subsubsection.5.8.2.1) 274 0 R (subsubsection.5.8.3.1) 282 0 R (subsubsection.5.8.3.10) 318 0 R (subsubsection.5.8.3.11) 322 0 R (subsubsection.5.8.3.12) 326 0 R]
+/Limits [(subsubsection.5.7.2.5) (subsubsection.5.8.3.12)]
>> endobj
-1542 0 obj <<
-/Names [(table.4.33) 1142 0 R (table.4.34) 1151 0 R (table.4.35) 1152 0 R (table.4.36) 1153 0 R (table.4.37) 1154 0 R (table.4.38) 1159 0 R]
-/Limits [(table.4.33) (table.4.38)]
+2008 0 obj <<
+/Names [(subsubsection.5.8.3.13) 330 0 R (subsubsection.5.8.3.14) 334 0 R (subsubsection.5.8.3.15) 338 0 R (subsubsection.5.8.3.16) 342 0 R (subsubsection.5.8.3.17) 346 0 R (subsubsection.5.8.3.18) 350 0 R]
+/Limits [(subsubsection.5.8.3.13) (subsubsection.5.8.3.18)]
>> endobj
-1543 0 obj <<
-/Names [(table.4.39) 1160 0 R (table.4.4) 863 0 R (table.4.40) 1202 0 R (table.4.41) 1203 0 R (table.4.42) 1209 0 R (table.4.43) 1210 0 R]
-/Limits [(table.4.39) (table.4.43)]
+2009 0 obj <<
+/Names [(subsubsection.5.8.3.19) 354 0 R (subsubsection.5.8.3.2) 286 0 R (subsubsection.5.8.3.20) 358 0 R (subsubsection.5.8.3.21) 362 0 R (subsubsection.5.8.3.22) 366 0 R (subsubsection.5.8.3.23) 370 0 R]
+/Limits [(subsubsection.5.8.3.19) (subsubsection.5.8.3.23)]
>> endobj
-1544 0 obj <<
-/Names [(table.4.44) 1222 0 R (table.4.45) 1224 0 R (table.4.5) 864 0 R (table.4.6) 888 0 R (table.4.7) 890 0 R (table.4.8) 892 0 R]
-/Limits [(table.4.44) (table.4.8)]
+2010 0 obj <<
+/Names [(subsubsection.5.8.3.24) 374 0 R (subsubsection.5.8.3.25) 378 0 R (subsubsection.5.8.3.26) 382 0 R (subsubsection.5.8.3.27) 386 0 R (subsubsection.5.8.3.28) 390 0 R (subsubsection.5.8.3.29) 394 0 R]
+/Limits [(subsubsection.5.8.3.24) (subsubsection.5.8.3.29)]
>> endobj
-1545 0 obj <<
-/Names [(table.4.9) 901 0 R]
-/Limits [(table.4.9) (table.4.9)]
+2011 0 obj <<
+/Names [(subsubsection.5.8.3.3) 290 0 R (subsubsection.5.8.3.30) 398 0 R (subsubsection.5.8.3.31) 402 0 R (subsubsection.5.8.3.32) 406 0 R (subsubsection.5.8.3.33) 410 0 R (subsubsection.5.8.3.34) 414 0 R]
+/Limits [(subsubsection.5.8.3.3) (subsubsection.5.8.3.34)]
>> endobj
-1546 0 obj <<
-/Kids [1486 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R]
-/Limits [(Doc-Start) (group__SYNCHRONIZATION_ga6a08af1c559012315e7e5be69f7fe608)]
+2012 0 obj <<
+/Names [(subsubsection.5.8.3.4) 294 0 R (subsubsection.5.8.3.5) 298 0 R (subsubsection.5.8.3.6) 302 0 R (subsubsection.5.8.3.7) 306 0 R (subsubsection.5.8.3.8) 310 0 R (subsubsection.5.8.3.9) 314 0 R]
+/Limits [(subsubsection.5.8.3.4) (subsubsection.5.8.3.9)]
>> endobj
-1547 0 obj <<
-/Kids [1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R]
-/Limits [(group__SYNCHRONIZATION_ga84b2ebeef737395dddd8ef446c071760) (group__WORK__SHARING_gaa290fe71698081e26ec234a234d2fdcc)]
+2013 0 obj <<
+/Names [(subsubsection.5.9.2.1) 430 0 R (subsubsection.5.9.2.2) 434 0 R (subsubsection.5.9.2.3) 438 0 R (subsubsection.5.9.2.4) 442 0 R (subsubsection.5.9.2.5) 446 0 R (subsubsection.5.9.2.6) 450 0 R]
+/Limits [(subsubsection.5.9.2.1) (subsubsection.5.9.2.6)]
>> endobj
-1548 0 obj <<
-/Kids [1498 0 R 1499 0 R 1500 0 R 1501 0 R 1502 0 R 1503 0 R]
-/Limits [(group__WORK__SHARING_gaa7d615b194c12278b00841852b0dff2b) (index_SEC_EXAMPLES)]
+2014 0 obj <<
+/Names [(subsubsection.5.9.2.7) 454 0 R (subsubsection.5.9.2.8) 458 0 R (subsubsection.5.9.2.9) 462 0 R (subsubsection.6.1.2.1) 618 0 R (subsubsection.6.1.2.2) 622 0 R (subsubsection.6.1.2.3) 626 0 R]
+/Limits [(subsubsection.5.9.2.7) (subsubsection.6.1.2.3)]
>> endobj
-1549 0 obj <<
-/Kids [1504 0 R 1505 0 R 1506 0 R 1507 0 R 1508 0 R 1509 0 R]
-/Limits [(index_SEC_INTERFACES) (page.32)]
+2015 0 obj <<
+/Names [(subsubsection.6.1.2.4) 630 0 R (subsubsection.6.1.2.5) 634 0 R (subsubsection.6.2.2.1) 650 0 R (subsubsection.6.2.2.2) 654 0 R (subsubsection.6.2.3.1) 662 0 R (subsubsection.6.2.3.2) 666 0 R]
+/Limits [(subsubsection.6.1.2.4) (subsubsection.6.2.3.2)]
>> endobj
-1550 0 obj <<
-/Kids [1510 0 R 1511 0 R 1512 0 R 1513 0 R 1514 0 R 1515 0 R]
-/Limits [(page.33) (section*.8)]
+2016 0 obj <<
+/Names [(table.5.1) 1020 0 R (table.5.10) 1148 0 R (table.5.11) 1149 0 R (table.5.12) 1150 0 R (table.5.13) 1167 0 R (table.5.14) 1169 0 R]
+/Limits [(table.5.1) (table.5.14)]
>> endobj
-1551 0 obj <<
-/Kids [1516 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R 1521 0 R]
-/Limits [(section*.9) (subsection.4.3.1)]
+2017 0 obj <<
+/Names [(table.5.15) 1171 0 R (table.5.16) 1178 0 R (table.5.17) 1179 0 R (table.5.18) 1348 0 R (table.5.19) 1349 0 R (table.5.2) 1023 0 R]
+/Limits [(table.5.15) (table.5.2)]
>> endobj
-1552 0 obj <<
-/Kids [1522 0 R 1523 0 R 1524 0 R 1525 0 R 1526 0 R 1527 0 R]
-/Limits [(subsection.4.3.2) (subsubsection.4.5.3.3)]
+2018 0 obj <<
+/Names [(table.5.20) 1357 0 R (table.5.21) 1358 0 R (table.5.22) 1367 0 R (table.5.23) 1375 0 R (table.5.24) 1376 0 R (table.5.25) 1382 0 R]
+/Limits [(table.5.20) (table.5.25)]
>> endobj
-1553 0 obj <<
-/Kids [1528 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R 1533 0 R]
-/Limits [(subsubsection.4.5.3.4) (subsubsection.4.8.2.2)]
+2019 0 obj <<
+/Names [(table.5.26) 1383 0 R (table.5.27) 1384 0 R (table.5.28) 1385 0 R (table.5.29) 1393 0 R (table.5.3) 1098 0 R (table.5.30) 1394 0 R]
+/Limits [(table.5.26) (table.5.30)]
>> endobj
-1554 0 obj <<
-/Kids [1534 0 R 1535 0 R 1536 0 R 1537 0 R 1538 0 R 1539 0 R]
-/Limits [(subsubsection.4.8.2.3) (table.4.21)]
+2020 0 obj <<
+/Names [(table.5.31) 1395 0 R (table.5.32) 1403 0 R (table.5.33) 1428 0 R (table.5.34) 1430 0 R (table.5.35) 1432 0 R (table.5.36) 1441 0 R]
+/Limits [(table.5.31) (table.5.36)]
>> endobj
-1555 0 obj <<
-/Kids [1540 0 R 1541 0 R 1542 0 R 1543 0 R 1544 0 R 1545 0 R]
-/Limits [(table.4.22) (table.4.9)]
+2021 0 obj <<
+/Names [(table.5.37) 1442 0 R (table.5.38) 1443 0 R (table.5.39) 1444 0 R (table.5.4) 1109 0 R (table.5.40) 1449 0 R (table.5.41) 1450 0 R]
+/Limits [(table.5.37) (table.5.41)]
>> endobj
-1556 0 obj <<
-/Kids [1546 0 R 1547 0 R 1548 0 R 1549 0 R 1550 0 R 1551 0 R]
-/Limits [(Doc-Start) (subsection.4.3.1)]
+2022 0 obj <<
+/Names [(table.5.42) 1493 0 R (table.5.43) 1494 0 R (table.5.44) 1499 0 R (table.5.45) 1500 0 R (table.5.46) 1547 0 R (table.5.47) 1548 0 R]
+/Limits [(table.5.42) (table.5.47)]
>> endobj
-1557 0 obj <<
-/Kids [1552 0 R 1553 0 R 1554 0 R 1555 0 R]
-/Limits [(subsection.4.3.2) (table.4.9)]
+2023 0 obj <<
+/Names [(table.5.48) 1549 0 R (table.5.49) 1560 0 R (table.5.5) 1110 0 R (table.5.50) 1561 0 R (table.5.51) 1562 0 R (table.5.52) 1580 0 R]
+/Limits [(table.5.48) (table.5.52)]
>> endobj
-1558 0 obj <<
-/Kids [1556 0 R 1557 0 R]
-/Limits [(Doc-Start) (table.4.9)]
+2024 0 obj <<
+/Names [(table.5.53) 1581 0 R (table.5.54) 1583 0 R (table.5.55) 1600 0 R (table.5.56) 1602 0 R (table.5.6) 1134 0 R (table.5.7) 1136 0 R]
+/Limits [(table.5.53) (table.5.7)]
>> endobj
-1559 0 obj <<
-/Dests 1558 0 R
+2025 0 obj <<
+/Names [(table.5.8) 1138 0 R (table.5.9) 1147 0 R]
+/Limits [(table.5.8) (table.5.9)]
>> endobj
-1560 0 obj <<
+2026 0 obj <<
+/Kids [1948 0 R 1949 0 R 1950 0 R 1951 0 R 1952 0 R 1953 0 R]
+/Limits [(Doc-Start) (group__PARALLEL_gab49014fb4572e7d0f308fd9b1824daf7)]
+>> endobj
+2027 0 obj <<
+/Kids [1954 0 R 1955 0 R 1956 0 R 1957 0 R 1958 0 R 1959 0 R]
+/Limits [(group__PARALLEL_gac2b7cc2fa78dde5381bcf00cfc48d124) (group__THREADPRIVATE_gab6148c019e88c8853596bf5f516373b4)]
+>> endobj
+2028 0 obj <<
+/Kids [1960 0 R 1961 0 R 1962 0 R 1963 0 R 1964 0 R 1965 0 R]
+/Limits [(group__THREADPRIVATE_gab7035b42d465074b31195534efb37e3b) (group__WORK__SHARING_gaa290fe71698081e26ec234a234d2fdcc)]
+>> endobj
+2029 0 obj <<
+/Kids [1966 0 R 1967 0 R 1968 0 R 1969 0 R 1970 0 R 1971 0 R]
+/Limits [(group__WORK__SHARING_gaa7d615b194c12278b00841852b0dff2b) (group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beadb87fc98ffc6440f53caa1f5d6606512)]
+>> endobj
+2030 0 obj <<
+/Kids [1972 0 R 1973 0 R 1974 0 R 1975 0 R 1976 0 R 1977 0 R]
+/Limits [(group__WORK__SHARING_ggadcaf200537aaa0218a60c398438f81beae4b8e84801f56fdb39472c45762bd051) (page.29)]
+>> endobj
+2031 0 obj <<
+/Kids [1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R]
+/Limits [(page.3) (page.9)]
+>> endobj
+2032 0 obj <<
+/Kids [1984 0 R 1985 0 R 1986 0 R 1987 0 R 1988 0 R 1989 0 R]
+/Limits [(section*.10) (section.5.10)]
+>> endobj
+2033 0 obj <<
+/Kids [1990 0 R 1991 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R]
+/Limits [(section.5.11) (subsection.5.3.3)]
+>> endobj
+2034 0 obj <<
+/Kids [1996 0 R 1997 0 R 1998 0 R 1999 0 R 2000 0 R 2001 0 R]
+/Limits [(subsection.5.4.1) (subsubsection.5.11.3.3)]
+>> endobj
+2035 0 obj <<
+/Kids [2002 0 R 2003 0 R 2004 0 R 2005 0 R 2006 0 R 2007 0 R]
+/Limits [(subsubsection.5.11.3.4) (subsubsection.5.8.3.12)]
+>> endobj
+2036 0 obj <<
+/Kids [2008 0 R 2009 0 R 2010 0 R 2011 0 R 2012 0 R 2013 0 R]
+/Limits [(subsubsection.5.8.3.13) (subsubsection.5.9.2.6)]
+>> endobj
+2037 0 obj <<
+/Kids [2014 0 R 2015 0 R 2016 0 R 2017 0 R 2018 0 R 2019 0 R]
+/Limits [(subsubsection.5.9.2.7) (table.5.30)]
+>> endobj
+2038 0 obj <<
+/Kids [2020 0 R 2021 0 R 2022 0 R 2023 0 R 2024 0 R 2025 0 R]
+/Limits [(table.5.31) (table.5.9)]
+>> endobj
+2039 0 obj <<
+/Kids [2026 0 R 2027 0 R 2028 0 R 2029 0 R 2030 0 R 2031 0 R]
+/Limits [(Doc-Start) (page.9)]
+>> endobj
+2040 0 obj <<
+/Kids [2032 0 R 2033 0 R 2034 0 R 2035 0 R 2036 0 R 2037 0 R]
+/Limits [(section*.10) (table.5.30)]
+>> endobj
+2041 0 obj <<
+/Kids [2038 0 R]
+/Limits [(table.5.31) (table.5.9)]
+>> endobj
+2042 0 obj <<
+/Kids [2039 0 R 2040 0 R 2041 0 R]
+/Limits [(Doc-Start) (table.5.9)]
+>> endobj
+2043 0 obj <<
+/Dests 2042 0 R
+>> endobj
+2044 0 obj <<
/Type /Catalog
-/Pages 1484 0 R
-/Outlines 1485 0 R
-/Names 1559 0 R
-/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /D >> 2 << /S /r >> 6 << /S /D >> ] >>
-/OpenAction 520 0 R
+/Pages 1946 0 R
+/Outlines 1947 0 R
+/Names 2043 0 R
+/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /D >> 2 << /S /r >> 8 << /S /D >> ] >>
+/OpenAction 680 0 R
>> endobj
-1561 0 obj <<
+2045 0 obj <<
/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords()
-/CreationDate (D:20131213120956-06'00')
-/ModDate (D:20131213120956-06'00')
+/CreationDate (D:20140926162550-05'00')
+/ModDate (D:20140926162550-05'00')
/Trapped /False
/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6)
>> endobj
xref
-0 1562
+0 2046
0000000001 65535 f
0000000002 00000 f
0000000003 00000 f
0000000004 00000 f
0000000000 00000 f
0000000015 00000 n
-0000056106 00000 n
-0000341420 00000 n
+0000072666 00000 n
+0000430855 00000 n
0000000060 00000 n
0000000304 00000 n
-0000056287 00000 n
-0000341348 00000 n
+0000072847 00000 n
+0000430783 00000 n
0000000351 00000 n
0000000438 00000 n
-0000056409 00000 n
-0000341262 00000 n
+0000072969 00000 n
+0000430697 00000 n
0000000486 00000 n
0000000619 00000 n
-0000059552 00000 n
-0000341176 00000 n
+0000076114 00000 n
+0000430611 00000 n
0000000667 00000 n
0000000873 00000 n
-0000059674 00000 n
-0000341090 00000 n
+0000076236 00000 n
+0000430525 00000 n
0000000921 00000 n
0000001181 00000 n
-0000059796 00000 n
-0000340967 00000 n
+0000076358 00000 n
+0000430402 00000 n
0000001229 00000 n
0000001301 00000 n
-0000063772 00000 n
-0000340869 00000 n
+0000080334 00000 n
+0000430304 00000 n
0000001354 00000 n
0000001522 00000 n
-0000063894 00000 n
-0000340795 00000 n
+0000080456 00000 n
+0000430230 00000 n
0000001580 00000 n
0000001695 00000 n
-0000064016 00000 n
-0000340721 00000 n
+0000080578 00000 n
+0000430156 00000 n
0000001753 00000 n
0000001863 00000 n
-0000064137 00000 n
-0000340635 00000 n
+0000080699 00000 n
+0000430070 00000 n
0000001911 00000 n
0000002031 00000 n
-0000069261 00000 n
-0000340525 00000 n
+0000086017 00000 n
+0000429960 00000 n
0000002079 00000 n
0000002146 00000 n
-0000069382 00000 n
-0000340464 00000 n
+0000086138 00000 n
+0000429899 00000 n
0000002199 00000 n
0000002332 00000 n
-0000073578 00000 n
-0000340339 00000 n
+0000091009 00000 n
+0000429774 00000 n
0000002378 00000 n
0000002468 00000 n
-0000073638 00000 n
-0000340278 00000 n
+0000091069 00000 n
+0000429713 00000 n
0000002516 00000 n
0000002578 00000 n
-0000075335 00000 n
-0000340152 00000 n
+0000093625 00000 n
+0000429587 00000 n
0000002624 00000 n
-0000002709 00000 n
-0000075395 00000 n
-0000340091 00000 n
-0000002757 00000 n
-0000002837 00000 n
-0000078366 00000 n
-0000339962 00000 n
-0000002883 00000 n
-0000003013 00000 n
-0000078487 00000 n
-0000339851 00000 n
-0000003061 00000 n
-0000003176 00000 n
-0000078547 00000 n
-0000339790 00000 n
-0000003229 00000 n
-0000003359 00000 n
-0000092831 00000 n
-0000339664 00000 n
-0000003407 00000 n
-0000003492 00000 n
-0000092891 00000 n
-0000339590 00000 n
-0000003545 00000 n
-0000003675 00000 n
-0000092951 00000 n
-0000339464 00000 n
-0000003728 00000 n
-0000003911 00000 n
-0000093072 00000 n
-0000339390 00000 n
-0000003969 00000 n
-0000004120 00000 n
-0000093193 00000 n
-0000339301 00000 n
-0000004178 00000 n
-0000004297 00000 n
-0000093314 00000 n
-0000339210 00000 n
-0000004356 00000 n
-0000004503 00000 n
-0000093436 00000 n
-0000339118 00000 n
-0000004562 00000 n
-0000004709 00000 n
-0000093558 00000 n
-0000339026 00000 n
-0000004768 00000 n
-0000004867 00000 n
-0000093679 00000 n
-0000338948 00000 n
-0000004926 00000 n
-0000005030 00000 n
-0000094563 00000 n
-0000338832 00000 n
-0000005084 00000 n
-0000005220 00000 n
-0000094685 00000 n
-0000338767 00000 n
-0000005279 00000 n
-0000005345 00000 n
-0000096654 00000 n
-0000338637 00000 n
-0000005394 00000 n
-0000005525 00000 n
-0000096776 00000 n
-0000338558 00000 n
+0000002744 00000 n
+0000093685 00000 n
+0000429526 00000 n
+0000002792 00000 n
+0000002897 00000 n
+0000096238 00000 n
+0000429400 00000 n
+0000002943 00000 n
+0000003028 00000 n
+0000096298 00000 n
+0000429339 00000 n
+0000003076 00000 n
+0000003156 00000 n
+0000099298 00000 n
+0000429210 00000 n
+0000003202 00000 n
+0000003332 00000 n
+0000099421 00000 n
+0000429099 00000 n
+0000003380 00000 n
+0000003495 00000 n
+0000099482 00000 n
+0000429038 00000 n
+0000003548 00000 n
+0000003678 00000 n
+0000112787 00000 n
+0000428913 00000 n
+0000003726 00000 n
+0000003871 00000 n
+0000112848 00000 n
+0000428839 00000 n
+0000003924 00000 n
+0000004054 00000 n
+0000112909 00000 n
+0000428725 00000 n
+0000004107 00000 n
+0000004291 00000 n
+0000113033 00000 n
+0000428661 00000 n
+0000004350 00000 n
+0000004426 00000 n
+0000116714 00000 n
+0000428531 00000 n
+0000004475 00000 n
+0000004561 00000 n
+0000116776 00000 n
+0000428452 00000 n
+0000004615 00000 n
+0000004746 00000 n
+0000116838 00000 n
+0000428320 00000 n
+0000004800 00000 n
+0000004984 00000 n
+0000116963 00000 n
+0000428241 00000 n
+0000005043 00000 n
+0000005195 00000 n
+0000117088 00000 n
+0000428148 00000 n
+0000005254 00000 n
+0000005373 00000 n
+0000117213 00000 n
+0000428055 00000 n
+0000005432 00000 n
0000005579 00000 n
-0000005710 00000 n
-0000096837 00000 n
-0000338440 00000 n
-0000005764 00000 n
-0000005905 00000 n
-0000096959 00000 n
-0000338375 00000 n
-0000005964 00000 n
-0000006092 00000 n
-0000099925 00000 n
-0000338244 00000 n
-0000006141 00000 n
-0000006275 00000 n
-0000100047 00000 n
-0000338165 00000 n
-0000006329 00000 n
-0000006460 00000 n
-0000100108 00000 n
-0000338047 00000 n
-0000006514 00000 n
+0000117338 00000 n
+0000427962 00000 n
+0000005638 00000 n
+0000005785 00000 n
+0000117463 00000 n
+0000427869 00000 n
+0000005844 00000 n
+0000005943 00000 n
+0000117587 00000 n
+0000427790 00000 n
+0000006002 00000 n
+0000006106 00000 n
+0000118477 00000 n
+0000427672 00000 n
+0000006160 00000 n
+0000006296 00000 n
+0000118602 00000 n
+0000427607 00000 n
+0000006355 00000 n
+0000006421 00000 n
+0000120574 00000 n
+0000427476 00000 n
+0000006470 00000 n
+0000006601 00000 n
+0000120699 00000 n
+0000427397 00000 n
0000006655 00000 n
-0000100230 00000 n
-0000337968 00000 n
-0000006714 00000 n
-0000006811 00000 n
-0000100413 00000 n
-0000337889 00000 n
-0000006870 00000 n
-0000006957 00000 n
-0000106637 00000 n
-0000337758 00000 n
-0000007006 00000 n
-0000007143 00000 n
-0000106819 00000 n
-0000337679 00000 n
-0000007197 00000 n
-0000007328 00000 n
-0000106880 00000 n
-0000337547 00000 n
-0000007382 00000 n
-0000007518 00000 n
-0000107002 00000 n
-0000337482 00000 n
-0000007577 00000 n
-0000007658 00000 n
-0000107124 00000 n
-0000337364 00000 n
-0000007712 00000 n
-0000007853 00000 n
-0000107244 00000 n
-0000337285 00000 n
-0000007912 00000 n
-0000008105 00000 n
-0000107425 00000 n
-0000337192 00000 n
-0000008164 00000 n
-0000008284 00000 n
-0000110537 00000 n
-0000337099 00000 n
-0000008343 00000 n
-0000008468 00000 n
-0000110720 00000 n
-0000337006 00000 n
-0000008527 00000 n
-0000008675 00000 n
-0000110903 00000 n
-0000336913 00000 n
+0000006786 00000 n
+0000120761 00000 n
+0000427279 00000 n
+0000006840 00000 n
+0000006981 00000 n
+0000120886 00000 n
+0000427214 00000 n
+0000007040 00000 n
+0000007168 00000 n
+0000123888 00000 n
+0000427083 00000 n
+0000007217 00000 n
+0000007351 00000 n
+0000124013 00000 n
+0000427004 00000 n
+0000007405 00000 n
+0000007536 00000 n
+0000124075 00000 n
+0000426886 00000 n
+0000007590 00000 n
+0000007731 00000 n
+0000124199 00000 n
+0000426807 00000 n
+0000007790 00000 n
+0000007887 00000 n
+0000124386 00000 n
+0000426728 00000 n
+0000007946 00000 n
+0000008033 00000 n
+0000130647 00000 n
+0000426597 00000 n
+0000008082 00000 n
+0000008219 00000 n
+0000130834 00000 n
+0000426518 00000 n
+0000008273 00000 n
+0000008404 00000 n
+0000130896 00000 n
+0000426386 00000 n
+0000008458 00000 n
+0000008594 00000 n
+0000131021 00000 n
+0000426321 00000 n
+0000008653 00000 n
0000008734 00000 n
-0000008892 00000 n
-0000111086 00000 n
-0000336834 00000 n
-0000008951 00000 n
-0000009121 00000 n
-0000115744 00000 n
-0000336703 00000 n
-0000009170 00000 n
-0000009291 00000 n
-0000115866 00000 n
-0000336624 00000 n
-0000009345 00000 n
-0000009476 00000 n
-0000115927 00000 n
-0000336506 00000 n
-0000009530 00000 n
-0000009671 00000 n
-0000116049 00000 n
-0000336427 00000 n
-0000009730 00000 n
-0000009893 00000 n
-0000116231 00000 n
-0000336334 00000 n
-0000009952 00000 n
-0000010110 00000 n
-0000116412 00000 n
-0000336241 00000 n
-0000010169 00000 n
-0000010337 00000 n
-0000118533 00000 n
-0000336148 00000 n
-0000010396 00000 n
-0000010559 00000 n
-0000118716 00000 n
-0000336069 00000 n
-0000010618 00000 n
-0000010748 00000 n
-0000137190 00000 n
-0000335938 00000 n
-0000010797 00000 n
-0000010888 00000 n
-0000140923 00000 n
-0000335859 00000 n
-0000010942 00000 n
-0000011073 00000 n
-0000140985 00000 n
-0000335727 00000 n
-0000011127 00000 n
-0000011311 00000 n
-0000141110 00000 n
-0000335662 00000 n
-0000011370 00000 n
-0000011451 00000 n
-0000142432 00000 n
-0000335543 00000 n
-0000011505 00000 n
-0000011646 00000 n
-0000142556 00000 n
-0000335464 00000 n
-0000011705 00000 n
-0000011817 00000 n
-0000146450 00000 n
-0000335371 00000 n
-0000011876 00000 n
-0000012029 00000 n
-0000146638 00000 n
-0000335278 00000 n
-0000012088 00000 n
-0000012246 00000 n
-0000146763 00000 n
-0000335185 00000 n
-0000012305 00000 n
-0000012458 00000 n
-0000146888 00000 n
-0000335092 00000 n
-0000012517 00000 n
-0000012675 00000 n
-0000147012 00000 n
-0000334999 00000 n
-0000012734 00000 n
-0000012887 00000 n
-0000147200 00000 n
-0000334906 00000 n
-0000012946 00000 n
-0000013104 00000 n
-0000151555 00000 n
-0000334813 00000 n
-0000013163 00000 n
-0000013316 00000 n
-0000151680 00000 n
-0000334720 00000 n
-0000013375 00000 n
-0000013533 00000 n
-0000151804 00000 n
-0000334627 00000 n
+0000131146 00000 n
+0000426203 00000 n
+0000008788 00000 n
+0000008929 00000 n
+0000131269 00000 n
+0000426124 00000 n
+0000008988 00000 n
+0000009181 00000 n
+0000131455 00000 n
+0000426031 00000 n
+0000009240 00000 n
+0000009360 00000 n
+0000134579 00000 n
+0000425938 00000 n
+0000009419 00000 n
+0000009544 00000 n
+0000134767 00000 n
+0000425845 00000 n
+0000009603 00000 n
+0000009751 00000 n
+0000134955 00000 n
+0000425752 00000 n
+0000009810 00000 n
+0000009968 00000 n
+0000135143 00000 n
+0000425673 00000 n
+0000010027 00000 n
+0000010197 00000 n
+0000139830 00000 n
+0000425542 00000 n
+0000010246 00000 n
+0000010367 00000 n
+0000139955 00000 n
+0000425463 00000 n
+0000010421 00000 n
+0000010552 00000 n
+0000140017 00000 n
+0000425345 00000 n
+0000010606 00000 n
+0000010747 00000 n
+0000140142 00000 n
+0000425266 00000 n
+0000010806 00000 n
+0000010969 00000 n
+0000140329 00000 n
+0000425173 00000 n
+0000011028 00000 n
+0000011186 00000 n
+0000140515 00000 n
+0000425080 00000 n
+0000011245 00000 n
+0000011413 00000 n
+0000142656 00000 n
+0000424987 00000 n
+0000011472 00000 n
+0000011635 00000 n
+0000142844 00000 n
+0000424908 00000 n
+0000011694 00000 n
+0000011824 00000 n
+0000162104 00000 n
+0000424777 00000 n
+0000011873 00000 n
+0000011964 00000 n
+0000168971 00000 n
+0000424698 00000 n
+0000012018 00000 n
+0000012149 00000 n
+0000169033 00000 n
+0000424566 00000 n
+0000012203 00000 n
+0000012387 00000 n
+0000169157 00000 n
+0000424501 00000 n
+0000012446 00000 n
+0000012527 00000 n
+0000173400 00000 n
+0000424382 00000 n
+0000012581 00000 n
+0000012722 00000 n
+0000173525 00000 n
+0000424303 00000 n
+0000012781 00000 n
+0000012893 00000 n
+0000173713 00000 n
+0000424210 00000 n
+0000012952 00000 n
+0000013105 00000 n
+0000173901 00000 n
+0000424117 00000 n
+0000013164 00000 n
+0000013322 00000 n
+0000174026 00000 n
+0000424024 00000 n
+0000013381 00000 n
+0000013534 00000 n
+0000174149 00000 n
+0000423931 00000 n
0000013593 00000 n
-0000013746 00000 n
-0000151992 00000 n
-0000334534 00000 n
-0000013806 00000 n
-0000013964 00000 n
-0000152117 00000 n
-0000334441 00000 n
-0000014024 00000 n
-0000014177 00000 n
-0000152241 00000 n
-0000334348 00000 n
-0000014237 00000 n
-0000014395 00000 n
-0000155083 00000 n
-0000334255 00000 n
-0000014455 00000 n
-0000014590 00000 n
-0000155270 00000 n
-0000334162 00000 n
-0000014650 00000 n
-0000014775 00000 n
-0000155458 00000 n
-0000334069 00000 n
-0000014835 00000 n
-0000014965 00000 n
-0000155646 00000 n
-0000333976 00000 n
-0000015025 00000 n
-0000015150 00000 n
-0000155834 00000 n
-0000333883 00000 n
-0000015210 00000 n
-0000015363 00000 n
-0000156021 00000 n
-0000333790 00000 n
-0000015423 00000 n
-0000015589 00000 n
-0000160192 00000 n
-0000333697 00000 n
-0000015649 00000 n
-0000015820 00000 n
-0000160317 00000 n
-0000333604 00000 n
-0000015880 00000 n
-0000016046 00000 n
-0000160441 00000 n
-0000333511 00000 n
-0000016106 00000 n
-0000016277 00000 n
-0000160566 00000 n
-0000333418 00000 n
-0000016337 00000 n
-0000016439 00000 n
-0000162530 00000 n
-0000333325 00000 n
-0000016499 00000 n
-0000016606 00000 n
-0000162717 00000 n
-0000333246 00000 n
-0000016666 00000 n
-0000016768 00000 n
-0000169233 00000 n
-0000333115 00000 n
-0000016817 00000 n
-0000016920 00000 n
-0000169358 00000 n
-0000333036 00000 n
-0000016974 00000 n
-0000017105 00000 n
-0000169420 00000 n
-0000332918 00000 n
-0000017159 00000 n
-0000017300 00000 n
-0000169545 00000 n
-0000332839 00000 n
-0000017359 00000 n
-0000017466 00000 n
-0000169732 00000 n
-0000332746 00000 n
-0000017525 00000 n
-0000017670 00000 n
-0000169918 00000 n
-0000332653 00000 n
-0000017729 00000 n
-0000017912 00000 n
-0000173165 00000 n
-0000332560 00000 n
-0000017971 00000 n
-0000018139 00000 n
-0000173353 00000 n
-0000332467 00000 n
-0000018198 00000 n
-0000018323 00000 n
-0000173540 00000 n
-0000332374 00000 n
-0000018382 00000 n
-0000018545 00000 n
-0000173727 00000 n
-0000332281 00000 n
-0000018604 00000 n
-0000018701 00000 n
-0000173914 00000 n
-0000332188 00000 n
-0000018760 00000 n
-0000018862 00000 n
-0000177001 00000 n
-0000332109 00000 n
-0000018921 00000 n
-0000019061 00000 n
-0000183602 00000 n
-0000331978 00000 n
-0000019110 00000 n
-0000019282 00000 n
-0000183727 00000 n
-0000331899 00000 n
-0000019336 00000 n
-0000019467 00000 n
-0000183789 00000 n
-0000331767 00000 n
-0000019521 00000 n
-0000019657 00000 n
-0000183913 00000 n
-0000331688 00000 n
-0000019716 00000 n
-0000019797 00000 n
-0000184038 00000 n
-0000331595 00000 n
-0000019856 00000 n
-0000019960 00000 n
-0000184163 00000 n
-0000331502 00000 n
-0000020019 00000 n
-0000020095 00000 n
-0000184287 00000 n
-0000331409 00000 n
-0000020154 00000 n
-0000020253 00000 n
-0000184411 00000 n
-0000331316 00000 n
-0000020312 00000 n
-0000020388 00000 n
-0000188964 00000 n
-0000331237 00000 n
-0000020447 00000 n
-0000020546 00000 n
-0000189026 00000 n
-0000331119 00000 n
-0000020600 00000 n
-0000020741 00000 n
-0000189151 00000 n
-0000331040 00000 n
-0000020800 00000 n
-0000020927 00000 n
-0000189338 00000 n
-0000330947 00000 n
-0000020986 00000 n
-0000021161 00000 n
-0000191800 00000 n
-0000330854 00000 n
-0000021220 00000 n
-0000021405 00000 n
-0000191988 00000 n
-0000330775 00000 n
-0000021464 00000 n
-0000021672 00000 n
-0000196383 00000 n
-0000330658 00000 n
-0000021722 00000 n
-0000021828 00000 n
-0000196508 00000 n
-0000330579 00000 n
-0000021883 00000 n
-0000022014 00000 n
-0000196569 00000 n
-0000330461 00000 n
-0000022069 00000 n
-0000022210 00000 n
-0000196694 00000 n
-0000330382 00000 n
-0000022270 00000 n
-0000022441 00000 n
-0000196882 00000 n
-0000330303 00000 n
-0000022501 00000 n
-0000022644 00000 n
-0000200106 00000 n
-0000330171 00000 n
-0000022691 00000 n
-0000022817 00000 n
-0000200230 00000 n
-0000330067 00000 n
-0000022866 00000 n
-0000023010 00000 n
-0000200354 00000 n
-0000329988 00000 n
-0000023064 00000 n
-0000023195 00000 n
-0000200416 00000 n
-0000329870 00000 n
-0000023249 00000 n
-0000023408 00000 n
-0000200541 00000 n
-0000329791 00000 n
-0000023467 00000 n
-0000023520 00000 n
-0000200666 00000 n
-0000329698 00000 n
-0000023579 00000 n
-0000023642 00000 n
-0000201908 00000 n
-0000329605 00000 n
-0000023701 00000 n
-0000023782 00000 n
-0000202033 00000 n
-0000329512 00000 n
-0000023841 00000 n
-0000023922 00000 n
-0000202157 00000 n
-0000329433 00000 n
-0000023981 00000 n
-0000024062 00000 n
-0000329353 00000 n
-0000024121 00000 n
-0000024174 00000 n
-0000024564 00000 n
-0000024744 00000 n
-0000024226 00000 n
-0000024683 00000 n
-0000327574 00000 n
-0000327924 00000 n
-0000026200 00000 n
-0000026081 00000 n
-0000024816 00000 n
-0000326863 00000 n
-0000326544 00000 n
-0000027820 00000 n
-0000027970 00000 n
-0000028123 00000 n
-0000028276 00000 n
-0000028429 00000 n
-0000028582 00000 n
-0000028735 00000 n
-0000028893 00000 n
-0000029057 00000 n
-0000029220 00000 n
-0000029373 00000 n
-0000029526 00000 n
-0000029683 00000 n
-0000029833 00000 n
-0000029986 00000 n
-0000030136 00000 n
-0000030288 00000 n
-0000030438 00000 n
-0000030591 00000 n
-0000030750 00000 n
-0000030903 00000 n
-0000031062 00000 n
-0000031221 00000 n
-0000031385 00000 n
-0000031548 00000 n
-0000031712 00000 n
-0000031876 00000 n
-0000032040 00000 n
-0000032200 00000 n
-0000034267 00000 n
-0000032417 00000 n
-0000027457 00000 n
-0000026298 00000 n
-0000327037 00000 n
-0000032356 00000 n
-0000034431 00000 n
-0000034583 00000 n
-0000034742 00000 n
-0000034901 00000 n
-0000035065 00000 n
-0000035218 00000 n
-0000035377 00000 n
-0000035536 00000 n
-0000035700 00000 n
-0000035862 00000 n
-0000036015 00000 n
-0000036174 00000 n
-0000036331 00000 n
-0000036495 00000 n
-0000036654 00000 n
-0000036818 00000 n
-0000036982 00000 n
-0000037146 00000 n
-0000037310 00000 n
-0000037474 00000 n
-0000037636 00000 n
-0000037789 00000 n
-0000037948 00000 n
-0000038107 00000 n
-0000038270 00000 n
-0000038434 00000 n
-0000038597 00000 n
-0000038761 00000 n
-0000038925 00000 n
-0000039077 00000 n
-0000039236 00000 n
-0000039394 00000 n
-0000039558 00000 n
-0000039716 00000 n
-0000039879 00000 n
-0000040043 00000 n
-0000040207 00000 n
-0000040371 00000 n
-0000040532 00000 n
-0000042431 00000 n
-0000040694 00000 n
-0000033816 00000 n
-0000032529 00000 n
-0000042595 00000 n
-0000042758 00000 n
-0000042922 00000 n
-0000043087 00000 n
-0000043252 00000 n
-0000043417 00000 n
-0000043582 00000 n
-0000043747 00000 n
-0000043912 00000 n
-0000044076 00000 n
-0000044241 00000 n
-0000044406 00000 n
-0000044570 00000 n
-0000044734 00000 n
-0000044898 00000 n
-0000045062 00000 n
-0000045227 00000 n
-0000045392 00000 n
-0000045557 00000 n
-0000045710 00000 n
-0000045867 00000 n
-0000046026 00000 n
-0000046190 00000 n
-0000046354 00000 n
-0000046517 00000 n
-0000046681 00000 n
-0000046845 00000 n
-0000047008 00000 n
-0000047172 00000 n
-0000047336 00000 n
-0000047500 00000 n
-0000047652 00000 n
-0000047811 00000 n
-0000047969 00000 n
-0000048133 00000 n
-0000048296 00000 n
-0000048458 00000 n
-0000048622 00000 n
-0000048783 00000 n
-0000050340 00000 n
-0000048945 00000 n
-0000041980 00000 n
-0000040792 00000 n
-0000050499 00000 n
-0000050662 00000 n
-0000050826 00000 n
-0000050990 00000 n
-0000051154 00000 n
+0000013751 00000 n
+0000178426 00000 n
+0000423838 00000 n
+0000013810 00000 n
+0000013963 00000 n
+0000178613 00000 n
+0000423745 00000 n
+0000014022 00000 n
+0000014180 00000 n
+0000178737 00000 n
+0000423652 00000 n
+0000014239 00000 n
+0000014392 00000 n
+0000178861 00000 n
+0000423559 00000 n
+0000014451 00000 n
+0000014609 00000 n
+0000178985 00000 n
+0000423466 00000 n
+0000014669 00000 n
+0000014822 00000 n
+0000183678 00000 n
+0000423373 00000 n
+0000014882 00000 n
+0000015040 00000 n
+0000183803 00000 n
+0000423280 00000 n
+0000015100 00000 n
+0000015253 00000 n
+0000183928 00000 n
+0000423187 00000 n
+0000015313 00000 n
+0000015471 00000 n
+0000184053 00000 n
+0000423094 00000 n
+0000015531 00000 n
+0000015712 00000 n
+0000184178 00000 n
+0000423001 00000 n
+0000015772 00000 n
+0000015966 00000 n
+0000188348 00000 n
+0000422908 00000 n
+0000016026 00000 n
+0000016225 00000 n
+0000188472 00000 n
+0000422815 00000 n
+0000016285 00000 n
+0000016479 00000 n
+0000188597 00000 n
+0000422722 00000 n
+0000016539 00000 n
+0000016738 00000 n
+0000188722 00000 n
+0000422629 00000 n
+0000016798 00000 n
+0000016933 00000 n
+0000188909 00000 n
+0000422536 00000 n
+0000016993 00000 n
+0000017118 00000 n
+0000192221 00000 n
+0000422443 00000 n
+0000017178 00000 n
+0000017308 00000 n
+0000192408 00000 n
+0000422350 00000 n
+0000017368 00000 n
+0000017493 00000 n
+0000192595 00000 n
+0000422257 00000 n
+0000017553 00000 n
+0000017706 00000 n
+0000192782 00000 n
+0000422164 00000 n
+0000017766 00000 n
+0000017932 00000 n
+0000192970 00000 n
+0000422071 00000 n
+0000017992 00000 n
+0000018163 00000 n
+0000196561 00000 n
+0000421978 00000 n
+0000018223 00000 n
+0000018389 00000 n
+0000196686 00000 n
+0000421885 00000 n
+0000018449 00000 n
+0000018620 00000 n
+0000196810 00000 n
+0000421792 00000 n
+0000018680 00000 n
+0000018782 00000 n
+0000196996 00000 n
+0000421699 00000 n
+0000018842 00000 n
+0000018949 00000 n
+0000197184 00000 n
+0000421606 00000 n
+0000019009 00000 n
+0000019111 00000 n
+0000201321 00000 n
+0000421513 00000 n
+0000019171 00000 n
+0000019342 00000 n
+0000201509 00000 n
+0000421420 00000 n
+0000019402 00000 n
+0000019578 00000 n
+0000201634 00000 n
+0000421327 00000 n
+0000019638 00000 n
+0000019809 00000 n
+0000201758 00000 n
+0000421248 00000 n
+0000019869 00000 n
+0000020045 00000 n
+0000208225 00000 n
+0000421117 00000 n
+0000020094 00000 n
+0000020197 00000 n
+0000208350 00000 n
+0000421038 00000 n
+0000020251 00000 n
+0000020382 00000 n
+0000208412 00000 n
+0000420920 00000 n
+0000020436 00000 n
+0000020577 00000 n
+0000208537 00000 n
+0000420841 00000 n
+0000020636 00000 n
+0000020743 00000 n
+0000208724 00000 n
+0000420748 00000 n
+0000020802 00000 n
+0000020947 00000 n
+0000208910 00000 n
+0000420655 00000 n
+0000021006 00000 n
+0000021189 00000 n
+0000212159 00000 n
+0000420562 00000 n
+0000021248 00000 n
+0000021416 00000 n
+0000212347 00000 n
+0000420469 00000 n
+0000021475 00000 n
+0000021600 00000 n
+0000212534 00000 n
+0000420376 00000 n
+0000021659 00000 n
+0000021822 00000 n
+0000212721 00000 n
+0000420283 00000 n
+0000021881 00000 n
+0000021978 00000 n
+0000212908 00000 n
+0000420190 00000 n
+0000022037 00000 n
+0000022139 00000 n
+0000215997 00000 n
+0000420111 00000 n
+0000022198 00000 n
+0000022338 00000 n
+0000222590 00000 n
+0000419980 00000 n
+0000022388 00000 n
+0000022560 00000 n
+0000222715 00000 n
+0000419901 00000 n
+0000022615 00000 n
+0000022746 00000 n
+0000222777 00000 n
+0000419769 00000 n
+0000022801 00000 n
+0000022937 00000 n
+0000222901 00000 n
+0000419690 00000 n
+0000022997 00000 n
+0000023078 00000 n
+0000223026 00000 n
+0000419597 00000 n
+0000023138 00000 n
+0000023242 00000 n
+0000223151 00000 n
+0000419504 00000 n
+0000023302 00000 n
+0000023378 00000 n
+0000223275 00000 n
+0000419411 00000 n
+0000023438 00000 n
+0000023537 00000 n
+0000223399 00000 n
+0000419318 00000 n
+0000023597 00000 n
+0000023673 00000 n
+0000227971 00000 n
+0000419239 00000 n
+0000023733 00000 n
+0000023832 00000 n
+0000228033 00000 n
+0000419121 00000 n
+0000023887 00000 n
+0000024028 00000 n
+0000228158 00000 n
+0000419042 00000 n
+0000024088 00000 n
+0000024215 00000 n
+0000228345 00000 n
+0000418949 00000 n
+0000024275 00000 n
+0000024450 00000 n
+0000230820 00000 n
+0000418856 00000 n
+0000024510 00000 n
+0000024695 00000 n
+0000231008 00000 n
+0000418777 00000 n
+0000024755 00000 n
+0000024963 00000 n
+0000237147 00000 n
+0000418646 00000 n
+0000025013 00000 n
+0000025205 00000 n
+0000237335 00000 n
+0000418567 00000 n
+0000025260 00000 n
+0000025391 00000 n
+0000237459 00000 n
+0000418474 00000 n
+0000025446 00000 n
+0000025582 00000 n
+0000241930 00000 n
+0000418355 00000 n
+0000025637 00000 n
+0000025821 00000 n
+0000242055 00000 n
+0000418276 00000 n
+0000025881 00000 n
+0000025990 00000 n
+0000242243 00000 n
+0000418183 00000 n
+0000026050 00000 n
+0000026159 00000 n
+0000242431 00000 n
+0000418090 00000 n
+0000026219 00000 n
+0000026348 00000 n
+0000246742 00000 n
+0000417997 00000 n
+0000026408 00000 n
+0000026575 00000 n
+0000246930 00000 n
+0000417904 00000 n
+0000026635 00000 n
+0000026754 00000 n
+0000247116 00000 n
+0000417811 00000 n
+0000026814 00000 n
+0000026928 00000 n
+0000252963 00000 n
+0000417718 00000 n
+0000026988 00000 n
+0000027097 00000 n
+0000253088 00000 n
+0000417625 00000 n
+0000027157 00000 n
+0000027314 00000 n
+0000253276 00000 n
+0000417532 00000 n
+0000027374 00000 n
+0000027526 00000 n
+0000253464 00000 n
+0000417453 00000 n
+0000027587 00000 n
+0000027691 00000 n
+0000259127 00000 n
+0000417322 00000 n
+0000027741 00000 n
+0000027847 00000 n
+0000259252 00000 n
+0000417243 00000 n
+0000027902 00000 n
+0000028033 00000 n
+0000259313 00000 n
+0000417125 00000 n
+0000028088 00000 n
+0000028229 00000 n
+0000259438 00000 n
+0000417046 00000 n
+0000028289 00000 n
+0000028460 00000 n
+0000259626 00000 n
+0000416967 00000 n
+0000028520 00000 n
+0000028663 00000 n
+0000260723 00000 n
+0000416889 00000 n
+0000028713 00000 n
+0000028857 00000 n
+0000263191 00000 n
+0000416757 00000 n
+0000028904 00000 n
+0000029030 00000 n
+0000263315 00000 n
+0000416639 00000 n
+0000029079 00000 n
+0000029223 00000 n
+0000263439 00000 n
+0000416560 00000 n
+0000029277 00000 n
+0000029408 00000 n
+0000263501 00000 n
+0000416442 00000 n
+0000029462 00000 n
+0000029621 00000 n
+0000263626 00000 n
+0000416363 00000 n
+0000029680 00000 n
+0000029733 00000 n
+0000263751 00000 n
+0000416270 00000 n
+0000029792 00000 n
+0000029855 00000 n
+0000266943 00000 n
+0000416177 00000 n
+0000029914 00000 n
+0000029995 00000 n
+0000267067 00000 n
+0000416084 00000 n
+0000030054 00000 n
+0000030135 00000 n
+0000267192 00000 n
+0000416005 00000 n
+0000030194 00000 n
+0000030275 00000 n
+0000267317 00000 n
+0000415873 00000 n
+0000030324 00000 n
+0000030560 00000 n
+0000267504 00000 n
+0000415794 00000 n
+0000030614 00000 n
+0000030745 00000 n
+0000267629 00000 n
+0000415662 00000 n
+0000030799 00000 n
+0000030978 00000 n
+0000267754 00000 n
+0000415583 00000 n
+0000031037 00000 n
+0000031080 00000 n
+0000270997 00000 n
+0000415504 00000 n
+0000031139 00000 n
+0000031210 00000 n
+0000271059 00000 n
+0000415386 00000 n
+0000031264 00000 n
+0000031423 00000 n
+0000271184 00000 n
+0000415307 00000 n
+0000031482 00000 n
+0000031525 00000 n
+0000271309 00000 n
+0000415228 00000 n
+0000031584 00000 n
+0000031617 00000 n
+0000271434 00000 n
+0000415110 00000 n
+0000031666 00000 n
+0000031851 00000 n
+0000271873 00000 n
+0000415045 00000 n
+0000031905 00000 n
+0000032036 00000 n
+0000414965 00000 n
+0000032090 00000 n
+0000032143 00000 n
+0000032534 00000 n
+0000032714 00000 n
+0000032195 00000 n
+0000032653 00000 n
+0000412872 00000 n
+0000413223 00000 n
+0000034172 00000 n
+0000034053 00000 n
+0000032786 00000 n
+0000412162 00000 n
+0000411843 00000 n
+0000035838 00000 n
+0000035988 00000 n
+0000036141 00000 n
+0000036293 00000 n
+0000036446 00000 n
+0000036599 00000 n
+0000036752 00000 n
+0000036910 00000 n
+0000037074 00000 n
+0000037237 00000 n
+0000037390 00000 n
+0000037543 00000 n
+0000037700 00000 n
+0000037850 00000 n
+0000038003 00000 n
+0000038152 00000 n
+0000038305 00000 n
+0000038455 00000 n
+0000038607 00000 n
+0000038757 00000 n
+0000038910 00000 n
+0000039069 00000 n
+0000039222 00000 n
+0000039381 00000 n
+0000039539 00000 n
+0000039703 00000 n
+0000039856 00000 n
+0000040015 00000 n
+0000040172 00000 n
+0000042281 00000 n
+0000040395 00000 n
+0000035475 00000 n
+0000034270 00000 n
+0000412335 00000 n
+0000040334 00000 n
+0000042444 00000 n
+0000042608 00000 n
+0000042772 00000 n
+0000042936 00000 n
+0000043097 00000 n
+0000043255 00000 n
+0000043419 00000 n
+0000043572 00000 n
+0000043731 00000 n
+0000043889 00000 n
+0000044053 00000 n
+0000044206 00000 n
+0000044364 00000 n
+0000044523 00000 n
+0000044687 00000 n
+0000044850 00000 n
+0000045003 00000 n
+0000045162 00000 n
+0000045318 00000 n
+0000045482 00000 n
+0000045639 00000 n
+0000045803 00000 n
+0000045967 00000 n
+0000046131 00000 n
+0000046294 00000 n
+0000046458 00000 n
+0000046622 00000 n
+0000046775 00000 n
+0000046934 00000 n
+0000047093 00000 n
+0000047257 00000 n
+0000047421 00000 n
+0000047585 00000 n
+0000047749 00000 n
+0000047913 00000 n
+0000048066 00000 n
+0000048225 00000 n
+0000048383 00000 n
+0000048544 00000 n
+0000050327 00000 n
+0000048701 00000 n
+0000041830 00000 n
+0000040507 00000 n
+0000050490 00000 n
+0000050653 00000 n
+0000050817 00000 n
+0000050980 00000 n
+0000051144 00000 n
0000051308 00000 n
-0000051468 00000 n
-0000051627 00000 n
-0000051792 00000 n
-0000051956 00000 n
-0000052106 00000 n
-0000052258 00000 n
-0000052417 00000 n
-0000052574 00000 n
-0000052738 00000 n
-0000052902 00000 n
-0000053066 00000 n
-0000053230 00000 n
-0000053394 00000 n
-0000053555 00000 n
-0000050049 00000 n
-0000049043 00000 n
-0000055881 00000 n
-0000056469 00000 n
-0000055742 00000 n
-0000053653 00000 n
-0000056045 00000 n
-0000056165 00000 n
-0000056226 00000 n
-0000326689 00000 n
-0000056347 00000 n
-0000328042 00000 n
-0000059856 00000 n
-0000059310 00000 n
-0000056595 00000 n
-0000059429 00000 n
-0000326399 00000 n
-0000059490 00000 n
-0000059612 00000 n
-0000059734 00000 n
-0000063168 00000 n
-0000063329 00000 n
-0000063486 00000 n
-0000066827 00000 n
-0000064197 00000 n
-0000063013 00000 n
-0000059995 00000 n
-0000063650 00000 n
-0000063711 00000 n
-0000063832 00000 n
-0000063954 00000 n
-0000064076 00000 n
-0000092770 00000 n
-0000096593 00000 n
-0000099864 00000 n
-0000066983 00000 n
-0000067146 00000 n
-0000067307 00000 n
-0000067469 00000 n
-0000067633 00000 n
-0000067793 00000 n
-0000067993 00000 n
-0000068194 00000 n
-0000068346 00000 n
-0000068543 00000 n
-0000068741 00000 n
-0000068940 00000 n
-0000069442 00000 n
-0000066592 00000 n
-0000064323 00000 n
-0000069139 00000 n
-0000069200 00000 n
-0000069321 00000 n
-0000106576 00000 n
-0000115683 00000 n
-0000137128 00000 n
-0000183540 00000 n
-0000169171 00000 n
-0000078426 00000 n
-0000100169 00000 n
-0000100352 00000 n
-0000200168 00000 n
-0000146950 00000 n
-0000151742 00000 n
-0000176939 00000 n
-0000173478 00000 n
-0000070363 00000 n
-0000070183 00000 n
-0000069568 00000 n
-0000070302 00000 n
-0000071042 00000 n
-0000070862 00000 n
-0000070462 00000 n
-0000070981 00000 n
-0000071976 00000 n
-0000072130 00000 n
-0000072284 00000 n
-0000072438 00000 n
-0000072592 00000 n
-0000072746 00000 n
-0000072900 00000 n
-0000073054 00000 n
-0000073208 00000 n
-0000073362 00000 n
-0000073698 00000 n
-0000071765 00000 n
-0000071127 00000 n
-0000073517 00000 n
-0000328160 00000 n
-0000074344 00000 n
-0000074164 00000 n
-0000073784 00000 n
-0000074283 00000 n
-0000074967 00000 n
-0000075120 00000 n
-0000075455 00000 n
-0000074820 00000 n
-0000074429 00000 n
-0000075274 00000 n
-0000076102 00000 n
-0000075922 00000 n
-0000075541 00000 n
-0000076041 00000 n
-0000078607 00000 n
-0000078186 00000 n
-0000076187 00000 n
-0000078305 00000 n
-0000081692 00000 n
-0000081845 00000 n
-0000081999 00000 n
-0000082518 00000 n
-0000081537 00000 n
-0000078746 00000 n
-0000082153 00000 n
-0000082214 00000 n
-0000082275 00000 n
-0000327747 00000 n
-0000082336 00000 n
-0000082397 00000 n
-0000082458 00000 n
-0000084048 00000 n
-0000084201 00000 n
-0000084537 00000 n
-0000083901 00000 n
-0000082671 00000 n
-0000084354 00000 n
-0000084415 00000 n
-0000084476 00000 n
-0000328278 00000 n
-0000085587 00000 n
-0000085407 00000 n
-0000084663 00000 n
-0000085526 00000 n
-0000086585 00000 n
-0000086405 00000 n
-0000085686 00000 n
-0000086524 00000 n
-0000087856 00000 n
-0000087619 00000 n
-0000086684 00000 n
-0000087738 00000 n
-0000087799 00000 n
-0000089376 00000 n
-0000089135 00000 n
-0000087982 00000 n
-0000089254 00000 n
-0000089315 00000 n
-0000091181 00000 n
-0000091334 00000 n
-0000091530 00000 n
-0000091727 00000 n
-0000091923 00000 n
-0000092120 00000 n
-0000092316 00000 n
-0000092512 00000 n
-0000093740 00000 n
-0000090986 00000 n
-0000089529 00000 n
-0000092709 00000 n
-0000093011 00000 n
-0000093132 00000 n
-0000093253 00000 n
-0000093375 00000 n
-0000093497 00000 n
-0000093618 00000 n
-0000094624 00000 n
-0000094746 00000 n
-0000094383 00000 n
-0000093852 00000 n
-0000094502 00000 n
-0000328396 00000 n
-0000096141 00000 n
-0000096335 00000 n
-0000097081 00000 n
-0000095994 00000 n
-0000094858 00000 n
-0000096532 00000 n
-0000096715 00000 n
-0000096898 00000 n
-0000327393 00000 n
-0000097020 00000 n
-0000099005 00000 n
-0000099207 00000 n
-0000099404 00000 n
-0000099606 00000 n
-0000100535 00000 n
-0000098842 00000 n
-0000097221 00000 n
-0000099803 00000 n
-0000099986 00000 n
-0000100291 00000 n
-0000100474 00000 n
-0000103411 00000 n
-0000103604 00000 n
-0000103797 00000 n
-0000103994 00000 n
-0000104186 00000 n
-0000104381 00000 n
-0000104573 00000 n
-0000104765 00000 n
-0000104961 00000 n
-0000105153 00000 n
-0000105350 00000 n
-0000105543 00000 n
-0000105736 00000 n
-0000105932 00000 n
-0000106125 00000 n
-0000106322 00000 n
-0000107547 00000 n
-0000103152 00000 n
-0000100689 00000 n
-0000106515 00000 n
-0000106698 00000 n
-0000106758 00000 n
-0000106941 00000 n
-0000107063 00000 n
-0000107185 00000 n
-0000107303 00000 n
-0000107364 00000 n
-0000107486 00000 n
-0000110842 00000 n
-0000110659 00000 n
-0000110476 00000 n
-0000111025 00000 n
-0000111207 00000 n
-0000110296 00000 n
-0000107701 00000 n
-0000110415 00000 n
-0000110598 00000 n
-0000110781 00000 n
-0000110964 00000 n
-0000111146 00000 n
-0000113651 00000 n
-0000113848 00000 n
-0000114045 00000 n
-0000114243 00000 n
-0000114440 00000 n
-0000114638 00000 n
-0000114834 00000 n
-0000115032 00000 n
-0000115229 00000 n
-0000115426 00000 n
-0000116534 00000 n
-0000113440 00000 n
-0000111361 00000 n
-0000115622 00000 n
-0000115805 00000 n
-0000115988 00000 n
-0000116110 00000 n
-0000116171 00000 n
-0000116291 00000 n
-0000116351 00000 n
-0000116473 00000 n
-0000118472 00000 n
-0000118655 00000 n
-0000118838 00000 n
-0000118292 00000 n
-0000116674 00000 n
-0000118411 00000 n
-0000118594 00000 n
+0000051472 00000 n
+0000051636 00000 n
+0000051800 00000 n
+0000051964 00000 n
+0000052129 00000 n
+0000052294 00000 n
+0000052458 00000 n
+0000052623 00000 n
+0000052787 00000 n
+0000052952 00000 n
+0000053117 00000 n
+0000053282 00000 n
+0000053447 00000 n
+0000053612 00000 n
+0000053775 00000 n
+0000053940 00000 n
+0000054105 00000 n
+0000054270 00000 n
+0000054434 00000 n
+0000054599 00000 n
+0000054763 00000 n
+0000054927 00000 n
+0000055092 00000 n
+0000055257 00000 n
+0000055422 00000 n
+0000055587 00000 n
+0000055752 00000 n
+0000055917 00000 n
+0000056070 00000 n
+0000056228 00000 n
+0000056387 00000 n
+0000056551 00000 n
+0000056712 00000 n
+0000058806 00000 n
+0000056874 00000 n
+0000049876 00000 n
+0000048799 00000 n
+0000058970 00000 n
+0000059133 00000 n
+0000059297 00000 n
+0000059460 00000 n
+0000059624 00000 n
+0000059788 00000 n
+0000059941 00000 n
+0000060101 00000 n
+0000060260 00000 n
+0000060424 00000 n
+0000060589 00000 n
+0000060752 00000 n
+0000060916 00000 n
+0000061081 00000 n
+0000061246 00000 n
+0000061406 00000 n
+0000061570 00000 n
+0000061735 00000 n
+0000061900 00000 n
+0000062065 00000 n
+0000062219 00000 n
+0000062379 00000 n
+0000062537 00000 n
+0000062697 00000 n
+0000062862 00000 n
+0000063027 00000 n
+0000063192 00000 n
+0000063357 00000 n
+0000063522 00000 n
+0000063686 00000 n
+0000063849 00000 n
+0000064014 00000 n
+0000064179 00000 n
+0000064345 00000 n
+0000064499 00000 n
+0000064658 00000 n
+0000064818 00000 n
+0000064983 00000 n
+0000065144 00000 n
+0000066656 00000 n
+0000065296 00000 n
+0000058355 00000 n
+0000056972 00000 n
+0000066806 00000 n
+0000066959 00000 n
+0000067118 00000 n
+0000067275 00000 n
+0000067439 00000 n
+0000067603 00000 n
+0000067767 00000 n
+0000067931 00000 n
+0000068095 00000 n
+0000068247 00000 n
+0000068406 00000 n
+0000068565 00000 n
+0000068729 00000 n
+0000068893 00000 n
+0000069049 00000 n
+0000069212 00000 n
+0000069375 00000 n
+0000069528 00000 n
+0000069687 00000 n
+0000069843 00000 n
+0000066365 00000 n
+0000065394 00000 n
+0000411698 00000 n
+0000413341 00000 n
+0000070173 00000 n
+0000070054 00000 n
+0000069954 00000 n
+0000072441 00000 n
+0000073029 00000 n
+0000072302 00000 n
+0000070214 00000 n
+0000072605 00000 n
+0000072725 00000 n
+0000072786 00000 n
+0000411988 00000 n
+0000072907 00000 n
+0000076418 00000 n
+0000075872 00000 n
+0000073155 00000 n
+0000075991 00000 n
+0000076052 00000 n
+0000076174 00000 n
+0000076296 00000 n
+0000079730 00000 n
+0000079891 00000 n
+0000080048 00000 n
+0000083420 00000 n
+0000080759 00000 n
+0000079575 00000 n
+0000076557 00000 n
+0000080212 00000 n
+0000080273 00000 n
+0000080394 00000 n
+0000080516 00000 n
+0000080638 00000 n
+0000116652 00000 n
+0000120512 00000 n
+0000123826 00000 n
+0000083576 00000 n
+0000083739 00000 n
+0000083900 00000 n
+0000084061 00000 n
+0000084225 00000 n
+0000084385 00000 n
+0000084550 00000 n
+0000084750 00000 n
+0000084951 00000 n
+0000085103 00000 n
+0000085300 00000 n
+0000085498 00000 n
+0000085697 00000 n
+0000086198 00000 n
+0000083177 00000 n
+0000080885 00000 n
+0000085895 00000 n
+0000085956 00000 n
+0000086077 00000 n
+0000130585 00000 n
+0000139768 00000 n
+0000162042 00000 n
+0000222528 00000 n
+0000208163 00000 n
+0000099359 00000 n
+0000237085 00000 n
+0000124137 00000 n
+0000124324 00000 n
+0000263253 00000 n
+0000178364 00000 n
+0000178923 00000 n
+0000215935 00000 n
+0000212472 00000 n
+0000087210 00000 n
+0000087030 00000 n
+0000086324 00000 n
+0000087149 00000 n
+0000413459 00000 n
+0000087891 00000 n
+0000087711 00000 n
+0000087309 00000 n
+0000087830 00000 n
+0000088943 00000 n
+0000089097 00000 n
+0000089251 00000 n
+0000089405 00000 n
+0000089559 00000 n
+0000089713 00000 n
+0000089867 00000 n
+0000090021 00000 n
+0000090175 00000 n
+0000090329 00000 n
+0000090483 00000 n
+0000090638 00000 n
+0000090793 00000 n
+0000091129 00000 n
+0000088708 00000 n
+0000087976 00000 n
+0000090948 00000 n
+0000091776 00000 n
+0000091596 00000 n
+0000091215 00000 n
+0000091715 00000 n
+0000092640 00000 n
+0000092794 00000 n
+0000092948 00000 n
+0000093102 00000 n
+0000093256 00000 n
+0000093410 00000 n
+0000093745 00000 n
+0000092461 00000 n
+0000091861 00000 n
+0000093564 00000 n
+0000094415 00000 n
+0000094235 00000 n
+0000093844 00000 n
+0000094354 00000 n
+0000095243 00000 n
+0000095396 00000 n
+0000095550 00000 n
+0000095706 00000 n
+0000095860 00000 n
+0000096022 00000 n
+0000096358 00000 n
+0000095063 00000 n
+0000094500 00000 n
+0000096176 00000 n
+0000413577 00000 n
+0000267254 00000 n
+0000271371 00000 n
+0000097026 00000 n
+0000096840 00000 n
+0000096457 00000 n
+0000096963 00000 n
+0000099543 00000 n
+0000099112 00000 n
+0000097112 00000 n
+0000099235 00000 n
+0000102636 00000 n
+0000102790 00000 n
+0000102945 00000 n
+0000103477 00000 n
+0000102474 00000 n
+0000099683 00000 n
+0000103100 00000 n
+0000103163 00000 n
+0000103226 00000 n
+0000413045 00000 n
+0000103289 00000 n
+0000103352 00000 n
+0000103415 00000 n
+0000105019 00000 n
+0000105173 00000 n
+0000105516 00000 n
+0000104866 00000 n
+0000103632 00000 n
+0000105327 00000 n
+0000105390 00000 n
+0000105453 00000 n
+0000106575 00000 n
+0000106389 00000 n
+0000105643 00000 n
+0000106512 00000 n
+0000107582 00000 n
+0000107396 00000 n
+0000106675 00000 n
+0000107519 00000 n
+0000413701 00000 n
+0000108863 00000 n
+0000108618 00000 n
+0000107682 00000 n
+0000108741 00000 n
+0000108804 00000 n
+0000110396 00000 n
+0000110147 00000 n
+0000108990 00000 n
+0000110270 00000 n
+0000110333 00000 n
+0000111767 00000 n
+0000111965 00000 n
+0000112197 00000 n
+0000112429 00000 n
+0000113284 00000 n
+0000111596 00000 n
+0000110551 00000 n
+0000112661 00000 n
+0000112724 00000 n
+0000112970 00000 n
+0000113095 00000 n
+0000412512 00000 n
+0000113158 00000 n
+0000113221 00000 n
+0000115053 00000 n
+0000115207 00000 n
+0000115404 00000 n
+0000115602 00000 n
+0000115799 00000 n
+0000115997 00000 n
+0000116194 00000 n
+0000116391 00000 n
+0000117649 00000 n
+0000114846 00000 n
+0000113412 00000 n
+0000116589 00000 n
+0000116900 00000 n
+0000117025 00000 n
+0000117150 00000 n
+0000117275 00000 n
+0000117400 00000 n
+0000117524 00000 n
+0000118539 00000 n
+0000118664 00000 n
+0000118291 00000 n
+0000117762 00000 n
+0000118414 00000 n
+0000120056 00000 n
+0000120251 00000 n
+0000121011 00000 n
+0000119903 00000 n
0000118777 00000 n
-0000328514 00000 n
-0000121606 00000 n
-0000121803 00000 n
-0000122034 00000 n
-0000122265 00000 n
-0000122497 00000 n
-0000122729 00000 n
-0000122960 00000 n
-0000123191 00000 n
-0000123423 00000 n
-0000123655 00000 n
-0000123885 00000 n
-0000124116 00000 n
-0000124347 00000 n
-0000124578 00000 n
-0000124809 00000 n
-0000125041 00000 n
-0000125273 00000 n
-0000125505 00000 n
-0000125736 00000 n
-0000125968 00000 n
-0000126200 00000 n
-0000126432 00000 n
-0000126627 00000 n
-0000126824 00000 n
-0000127022 00000 n
-0000127219 00000 n
-0000127417 00000 n
-0000127613 00000 n
-0000127811 00000 n
-0000128008 00000 n
-0000128206 00000 n
-0000128403 00000 n
-0000128601 00000 n
-0000128797 00000 n
-0000128994 00000 n
-0000129191 00000 n
-0000129389 00000 n
-0000129586 00000 n
-0000129784 00000 n
-0000129981 00000 n
-0000130179 00000 n
-0000130376 00000 n
-0000130574 00000 n
-0000130766 00000 n
-0000130961 00000 n
-0000131157 00000 n
-0000131355 00000 n
-0000131552 00000 n
-0000131750 00000 n
-0000131944 00000 n
-0000132141 00000 n
-0000132339 00000 n
-0000132536 00000 n
-0000132733 00000 n
-0000132931 00000 n
-0000133128 00000 n
-0000133325 00000 n
-0000133522 00000 n
-0000133719 00000 n
-0000133915 00000 n
-0000134113 00000 n
-0000134310 00000 n
-0000134508 00000 n
-0000134705 00000 n
-0000134903 00000 n
-0000135100 00000 n
-0000135299 00000 n
-0000135497 00000 n
-0000135696 00000 n
-0000135894 00000 n
-0000136088 00000 n
-0000136284 00000 n
-0000136483 00000 n
-0000136681 00000 n
-0000136872 00000 n
-0000137377 00000 n
-0000120862 00000 n
-0000118978 00000 n
-0000137065 00000 n
-0000137252 00000 n
-0000137314 00000 n
-0000141047 00000 n
-0000141172 00000 n
-0000141235 00000 n
-0000141298 00000 n
-0000141361 00000 n
-0000141424 00000 n
-0000141487 00000 n
-0000141550 00000 n
-0000141613 00000 n
-0000141676 00000 n
-0000141739 00000 n
-0000141802 00000 n
-0000141865 00000 n
-0000141928 00000 n
-0000141991 00000 n
-0000142054 00000 n
-0000142117 00000 n
-0000142180 00000 n
-0000142243 00000 n
-0000142306 00000 n
-0000142369 00000 n
-0000160503 00000 n
-0000155207 00000 n
-0000160691 00000 n
-0000155395 00000 n
-0000142494 00000 n
-0000152303 00000 n
-0000162654 00000 n
-0000155583 00000 n
-0000155771 00000 n
-0000147137 00000 n
-0000147262 00000 n
-0000151617 00000 n
-0000151929 00000 n
-0000152054 00000 n
-0000152179 00000 n
-0000146387 00000 n
-0000146700 00000 n
-0000146575 00000 n
-0000146825 00000 n
-0000155959 00000 n
-0000160129 00000 n
-0000160254 00000 n
-0000160378 00000 n
+0000120449 00000 n
+0000120636 00000 n
+0000120823 00000 n
+0000412690 00000 n
+0000120948 00000 n
+0000413826 00000 n
+0000122961 00000 n
+0000123164 00000 n
+0000123362 00000 n
+0000123565 00000 n
+0000124511 00000 n
+0000122790 00000 n
+0000121154 00000 n
+0000123763 00000 n
+0000123950 00000 n
+0000124261 00000 n
+0000124448 00000 n
+0000127402 00000 n
+0000127596 00000 n
+0000127790 00000 n
+0000127988 00000 n
+0000128181 00000 n
+0000128377 00000 n
+0000128570 00000 n
+0000128763 00000 n
+0000128960 00000 n
+0000129153 00000 n
+0000129351 00000 n
+0000129545 00000 n
+0000129739 00000 n
+0000129936 00000 n
+0000130130 00000 n
+0000130328 00000 n
+0000131580 00000 n
+0000127123 00000 n
+0000124668 00000 n
+0000130522 00000 n
+0000130709 00000 n
+0000130771 00000 n
+0000130958 00000 n
+0000131083 00000 n
+0000131208 00000 n
+0000131329 00000 n
+0000131392 00000 n
+0000131517 00000 n
+0000134892 00000 n
+0000134704 00000 n
+0000134516 00000 n
+0000135080 00000 n
+0000135267 00000 n
+0000134330 00000 n
+0000131737 00000 n
+0000134453 00000 n
+0000134641 00000 n
+0000134829 00000 n
+0000135017 00000 n
+0000135204 00000 n
+0000137724 00000 n
+0000137922 00000 n
+0000138120 00000 n
+0000138319 00000 n
+0000138517 00000 n
+0000138716 00000 n
+0000138913 00000 n
+0000139112 00000 n
+0000139310 00000 n
+0000139508 00000 n
+0000140640 00000 n
+0000137499 00000 n
+0000135424 00000 n
+0000139705 00000 n
+0000139892 00000 n
+0000140079 00000 n
+0000140204 00000 n
0000140267 00000 n
-0000140466 00000 n
-0000140663 00000 n
-0000142679 00000 n
-0000140106 00000 n
-0000137490 00000 n
-0000140860 00000 n
-0000327214 00000 n
-0000142617 00000 n
-0000145534 00000 n
-0000145732 00000 n
-0000145930 00000 n
-0000146128 00000 n
-0000147324 00000 n
-0000145364 00000 n
-0000142849 00000 n
-0000146324 00000 n
-0000146512 00000 n
-0000147074 00000 n
-0000150505 00000 n
-0000150703 00000 n
-0000150901 00000 n
-0000151098 00000 n
-0000151296 00000 n
-0000152365 00000 n
-0000150326 00000 n
-0000147479 00000 n
-0000151492 00000 n
-0000151866 00000 n
-0000156082 00000 n
-0000154898 00000 n
-0000152506 00000 n
-0000155020 00000 n
-0000155145 00000 n
-0000155332 00000 n
-0000155520 00000 n
-0000155708 00000 n
-0000155896 00000 n
-0000159409 00000 n
-0000159607 00000 n
-0000159805 00000 n
-0000160753 00000 n
-0000159247 00000 n
-0000156237 00000 n
-0000160003 00000 n
-0000160066 00000 n
-0000160628 00000 n
-0000328637 00000 n
-0000162841 00000 n
-0000162344 00000 n
-0000160908 00000 n
-0000162467 00000 n
-0000162592 00000 n
-0000162778 00000 n
-0000165528 00000 n
-0000165729 00000 n
-0000165926 00000 n
-0000166127 00000 n
-0000166324 00000 n
-0000166523 00000 n
-0000166720 00000 n
-0000166921 00000 n
-0000167119 00000 n
-0000167318 00000 n
-0000167515 00000 n
-0000167715 00000 n
-0000167913 00000 n
-0000168114 00000 n
-0000168312 00000 n
-0000168512 00000 n
+0000140390 00000 n
+0000140452 00000 n
+0000140577 00000 n
+0000142593 00000 n
+0000142781 00000 n
+0000142969 00000 n
+0000142407 00000 n
+0000140783 00000 n
+0000142530 00000 n
+0000142718 00000 n
+0000142906 00000 n
+0000145882 00000 n
+0000146080 00000 n
+0000146310 00000 n
+0000146540 00000 n
+0000146771 00000 n
+0000147002 00000 n
+0000147234 00000 n
+0000147466 00000 n
+0000147699 00000 n
+0000147932 00000 n
+0000148163 00000 n
+0000148395 00000 n
+0000148627 00000 n
+0000148859 00000 n
+0000149091 00000 n
+0000149324 00000 n
+0000149557 00000 n
+0000149790 00000 n
+0000150022 00000 n
+0000150255 00000 n
+0000150488 00000 n
+0000150721 00000 n
+0000150917 00000 n
+0000151115 00000 n
+0000151313 00000 n
+0000151510 00000 n
+0000151709 00000 n
+0000151906 00000 n
+0000152104 00000 n
+0000152301 00000 n
+0000152500 00000 n
+0000152698 00000 n
+0000152896 00000 n
+0000153092 00000 n
+0000153290 00000 n
+0000153488 00000 n
+0000153686 00000 n
+0000153883 00000 n
+0000154082 00000 n
+0000154280 00000 n
+0000154478 00000 n
+0000154675 00000 n
+0000154873 00000 n
+0000155068 00000 n
+0000155266 00000 n
+0000155465 00000 n
+0000155664 00000 n
+0000155862 00000 n
+0000156061 00000 n
+0000156256 00000 n
+0000156454 00000 n
+0000156653 00000 n
+0000156851 00000 n
+0000157049 00000 n
+0000157247 00000 n
+0000157445 00000 n
+0000157643 00000 n
+0000157842 00000 n
+0000158040 00000 n
+0000158238 00000 n
+0000158436 00000 n
+0000158634 00000 n
+0000158831 00000 n
+0000159029 00000 n
+0000159226 00000 n
+0000159425 00000 n
+0000159623 00000 n
+0000159821 00000 n
+0000160018 00000 n
+0000160217 00000 n
+0000160415 00000 n
+0000160613 00000 n
+0000160810 00000 n
+0000161004 00000 n
+0000161200 00000 n
+0000161398 00000 n
+0000161595 00000 n
+0000161786 00000 n
+0000165145 00000 n
+0000165342 00000 n
+0000162292 00000 n
+0000145045 00000 n
+0000143112 00000 n
+0000161979 00000 n
+0000162166 00000 n
+0000162229 00000 n
+0000413951 00000 n
+0000169094 00000 n
+0000169219 00000 n
+0000169282 00000 n
+0000169345 00000 n
+0000169408 00000 n
+0000169471 00000 n
+0000169533 00000 n
+0000169596 00000 n
+0000169659 00000 n
+0000169721 00000 n
+0000172712 00000 n
+0000172775 00000 n
+0000172838 00000 n
+0000172901 00000 n
+0000172963 00000 n
+0000173024 00000 n
+0000173086 00000 n
+0000173148 00000 n
+0000173211 00000 n
+0000173274 00000 n
+0000173337 00000 n
+0000196748 00000 n
+0000188847 00000 n
+0000196934 00000 n
+0000189033 00000 n
+0000173462 00000 n
+0000188659 00000 n
+0000197121 00000 n
+0000192345 00000 n
+0000192532 00000 n
+0000178550 00000 n
+0000178675 00000 n
+0000178798 00000 n
+0000183990 00000 n
+0000183615 00000 n
+0000183740 00000 n
+0000183865 00000 n
+0000173650 00000 n
+0000173963 00000 n
+0000173838 00000 n
+0000174088 00000 n
+0000192720 00000 n
+0000192907 00000 n
+0000196498 00000 n
+0000196623 00000 n
+0000165539 00000 n
+0000165737 00000 n
+0000165935 00000 n
+0000166133 00000 n
+0000166331 00000 n
+0000166529 00000 n
+0000166727 00000 n
+0000166926 00000 n
+0000167124 00000 n
+0000167321 00000 n
+0000167518 00000 n
+0000167717 00000 n
+0000167915 00000 n
+0000168113 00000 n
+0000168311 00000 n
+0000168510 00000 n
0000168709 00000 n
-0000168910 00000 n
-0000170041 00000 n
-0000165231 00000 n
-0000162996 00000 n
-0000169108 00000 n
-0000169295 00000 n
-0000169482 00000 n
-0000169607 00000 n
-0000169669 00000 n
-0000169793 00000 n
-0000169856 00000 n
-0000169978 00000 n
-0000173664 00000 n
-0000173102 00000 n
-0000173852 00000 n
-0000173290 00000 n
-0000173975 00000 n
-0000172916 00000 n
-0000170182 00000 n
-0000173039 00000 n
-0000173227 00000 n
-0000173415 00000 n
-0000173602 00000 n
-0000173789 00000 n
-0000177126 00000 n
-0000176690 00000 n
-0000174130 00000 n
-0000176813 00000 n
-0000176876 00000 n
-0000177063 00000 n
-0000179504 00000 n
-0000179702 00000 n
-0000179900 00000 n
-0000180099 00000 n
-0000180297 00000 n
-0000180495 00000 n
-0000180694 00000 n
-0000180893 00000 n
-0000181092 00000 n
-0000181290 00000 n
-0000181489 00000 n
-0000181686 00000 n
-0000181885 00000 n
-0000182084 00000 n
-0000182283 00000 n
-0000182482 00000 n
-0000182681 00000 n
-0000182880 00000 n
-0000183079 00000 n
-0000183278 00000 n
-0000184535 00000 n
-0000179189 00000 n
-0000177267 00000 n
-0000183477 00000 n
-0000183664 00000 n
-0000183850 00000 n
-0000183975 00000 n
-0000184100 00000 n
-0000184225 00000 n
-0000184349 00000 n
-0000184473 00000 n
-0000189088 00000 n
-0000191737 00000 n
-0000189275 00000 n
-0000191925 00000 n
-0000188505 00000 n
-0000188704 00000 n
-0000189463 00000 n
-0000188352 00000 n
-0000184662 00000 n
-0000188901 00000 n
-0000189213 00000 n
-0000189400 00000 n
-0000328762 00000 n
-0000192113 00000 n
-0000191551 00000 n
-0000189618 00000 n
-0000191674 00000 n
-0000191862 00000 n
-0000192050 00000 n
-0000195478 00000 n
-0000195670 00000 n
-0000195868 00000 n
-0000196060 00000 n
-0000197007 00000 n
-0000195307 00000 n
-0000192254 00000 n
-0000196257 00000 n
-0000196320 00000 n
-0000196445 00000 n
-0000196631 00000 n
-0000196756 00000 n
-0000196819 00000 n
-0000196944 00000 n
-0000197719 00000 n
-0000197533 00000 n
-0000197148 00000 n
-0000197656 00000 n
-0000199102 00000 n
-0000199290 00000 n
-0000199478 00000 n
-0000199666 00000 n
-0000199854 00000 n
-0000200790 00000 n
-0000198922 00000 n
-0000197805 00000 n
-0000200043 00000 n
-0000200292 00000 n
-0000200478 00000 n
-0000200603 00000 n
-0000200728 00000 n
-0000201970 00000 n
-0000202094 00000 n
-0000202219 00000 n
-0000201722 00000 n
-0000200917 00000 n
-0000201845 00000 n
-0000203778 00000 n
-0000203929 00000 n
-0000204080 00000 n
-0000204230 00000 n
-0000204381 00000 n
-0000204531 00000 n
-0000204682 00000 n
-0000204832 00000 n
-0000204983 00000 n
-0000205134 00000 n
-0000205285 00000 n
-0000205436 00000 n
-0000205587 00000 n
-0000205738 00000 n
-0000205889 00000 n
-0000206040 00000 n
-0000206191 00000 n
-0000206341 00000 n
-0000206492 00000 n
-0000206643 00000 n
-0000206793 00000 n
-0000206944 00000 n
-0000207095 00000 n
-0000207246 00000 n
-0000207395 00000 n
-0000207545 00000 n
-0000207696 00000 n
-0000207847 00000 n
-0000207998 00000 n
-0000208149 00000 n
-0000208300 00000 n
-0000208451 00000 n
-0000208602 00000 n
-0000208753 00000 n
-0000208904 00000 n
-0000209054 00000 n
-0000209205 00000 n
-0000209355 00000 n
-0000209506 00000 n
-0000209656 00000 n
-0000209807 00000 n
-0000209958 00000 n
-0000210109 00000 n
-0000210260 00000 n
-0000210411 00000 n
-0000210562 00000 n
-0000210713 00000 n
-0000210864 00000 n
-0000211013 00000 n
-0000211225 00000 n
-0000203202 00000 n
-0000202332 00000 n
-0000211162 00000 n
-0000328887 00000 n
-0000213298 00000 n
-0000213449 00000 n
-0000213600 00000 n
-0000213749 00000 n
-0000213898 00000 n
-0000214048 00000 n
-0000214199 00000 n
-0000214350 00000 n
-0000214500 00000 n
-0000214651 00000 n
-0000214802 00000 n
-0000214953 00000 n
-0000215104 00000 n
-0000215255 00000 n
-0000215406 00000 n
-0000215554 00000 n
-0000215704 00000 n
-0000215854 00000 n
-0000216005 00000 n
-0000216156 00000 n
-0000216307 00000 n
-0000216458 00000 n
-0000216609 00000 n
-0000216760 00000 n
-0000216911 00000 n
-0000217061 00000 n
-0000217211 00000 n
-0000217362 00000 n
-0000217513 00000 n
-0000217664 00000 n
-0000217815 00000 n
-0000217966 00000 n
-0000218117 00000 n
-0000218267 00000 n
-0000218416 00000 n
-0000218566 00000 n
-0000218717 00000 n
-0000218868 00000 n
-0000219019 00000 n
-0000219170 00000 n
-0000219321 00000 n
-0000219472 00000 n
-0000219623 00000 n
-0000219774 00000 n
-0000219924 00000 n
-0000220075 00000 n
-0000220226 00000 n
-0000220377 00000 n
-0000220528 00000 n
-0000220678 00000 n
-0000220829 00000 n
-0000220979 00000 n
-0000221130 00000 n
-0000221280 00000 n
-0000221431 00000 n
-0000221582 00000 n
-0000221733 00000 n
-0000221883 00000 n
-0000222032 00000 n
-0000222182 00000 n
-0000222333 00000 n
-0000222484 00000 n
-0000222635 00000 n
-0000222786 00000 n
-0000222937 00000 n
+0000169783 00000 n
+0000164839 00000 n
+0000162405 00000 n
+0000168908 00000 n
+0000184115 00000 n
+0000188286 00000 n
+0000188409 00000 n
+0000188534 00000 n
+0000201258 00000 n
+0000201446 00000 n
+0000201571 00000 n
+0000201696 00000 n
+0000172253 00000 n
+0000172451 00000 n
+0000177510 00000 n
+0000174210 00000 n
+0000172100 00000 n
+0000169925 00000 n
+0000172649 00000 n
+0000173587 00000 n
+0000173775 00000 n
+0000177708 00000 n
+0000177906 00000 n
+0000178103 00000 n
+0000179109 00000 n
+0000177339 00000 n
+0000174382 00000 n
+0000178301 00000 n
+0000178487 00000 n
+0000179047 00000 n
+0000182761 00000 n
+0000182959 00000 n
+0000183156 00000 n
+0000183354 00000 n
+0000184303 00000 n
+0000182590 00000 n
+0000179252 00000 n
+0000183552 00000 n
+0000184240 00000 n
+0000187633 00000 n
+0000187829 00000 n
+0000188026 00000 n
+0000189095 00000 n
+0000187471 00000 n
+0000184446 00000 n
+0000188223 00000 n
+0000188784 00000 n
+0000188970 00000 n
+0000195841 00000 n
+0000193031 00000 n
+0000192035 00000 n
+0000189252 00000 n
+0000192158 00000 n
+0000192283 00000 n
+0000192469 00000 n
+0000192657 00000 n
+0000192844 00000 n
+0000414076 00000 n
+0000196039 00000 n
+0000196237 00000 n
+0000197309 00000 n
+0000195679 00000 n
+0000193188 00000 n
+0000196435 00000 n
+0000196871 00000 n
+0000197058 00000 n
+0000197246 00000 n
+0000200605 00000 n
+0000200802 00000 n
+0000200999 00000 n
+0000201819 00000 n
+0000200443 00000 n
+0000197466 00000 n
+0000201195 00000 n
+0000201383 00000 n
+0000204520 00000 n
+0000204721 00000 n
+0000204918 00000 n
+0000205119 00000 n
+0000205316 00000 n
+0000205515 00000 n
+0000205712 00000 n
+0000205913 00000 n
+0000206111 00000 n
+0000206310 00000 n
+0000206507 00000 n
+0000206707 00000 n
+0000206905 00000 n
+0000207106 00000 n
+0000207304 00000 n
+0000207504 00000 n
+0000207701 00000 n
+0000207902 00000 n
+0000209033 00000 n
+0000204223 00000 n
+0000201976 00000 n
+0000208100 00000 n
+0000208287 00000 n
+0000208474 00000 n
+0000208599 00000 n
+0000208661 00000 n
+0000208785 00000 n
+0000208848 00000 n
+0000208970 00000 n
+0000212658 00000 n
+0000212096 00000 n
+0000212846 00000 n
+0000212284 00000 n
+0000212969 00000 n
+0000211910 00000 n
+0000209176 00000 n
+0000212033 00000 n
+0000212221 00000 n
+0000212409 00000 n
+0000212596 00000 n
+0000212783 00000 n
+0000216122 00000 n
+0000215686 00000 n
+0000213126 00000 n
+0000215809 00000 n
+0000215872 00000 n
+0000216059 00000 n
+0000218492 00000 n
+0000218690 00000 n
+0000218888 00000 n
+0000219087 00000 n
+0000219285 00000 n
+0000219483 00000 n
+0000219682 00000 n
+0000219881 00000 n
+0000220080 00000 n
+0000220278 00000 n
+0000220477 00000 n
+0000220674 00000 n
+0000220873 00000 n
+0000221072 00000 n
+0000221271 00000 n
+0000221470 00000 n
+0000221669 00000 n
+0000221868 00000 n
+0000222067 00000 n
+0000222266 00000 n
+0000223523 00000 n
+0000218177 00000 n
+0000216265 00000 n
+0000222465 00000 n
+0000222652 00000 n
+0000222838 00000 n
+0000222963 00000 n
0000223088 00000 n
-0000223238 00000 n
-0000223387 00000 n
-0000225596 00000 n
-0000223599 00000 n
-0000212551 00000 n
-0000211312 00000 n
-0000223536 00000 n
-0000225747 00000 n
-0000225897 00000 n
-0000226047 00000 n
-0000226198 00000 n
-0000226347 00000 n
-0000226498 00000 n
-0000226649 00000 n
-0000226799 00000 n
-0000226950 00000 n
-0000227101 00000 n
-0000227251 00000 n
-0000227402 00000 n
-0000227553 00000 n
-0000227704 00000 n
-0000227855 00000 n
-0000228004 00000 n
-0000228154 00000 n
-0000228305 00000 n
-0000228456 00000 n
-0000228607 00000 n
-0000228758 00000 n
-0000228908 00000 n
-0000229059 00000 n
-0000229210 00000 n
-0000229361 00000 n
-0000229511 00000 n
-0000229662 00000 n
-0000229813 00000 n
-0000229962 00000 n
-0000230111 00000 n
-0000230262 00000 n
-0000230412 00000 n
-0000230563 00000 n
-0000230714 00000 n
-0000230865 00000 n
-0000231016 00000 n
-0000231167 00000 n
-0000231318 00000 n
-0000231469 00000 n
-0000231620 00000 n
-0000231771 00000 n
-0000231922 00000 n
-0000232073 00000 n
-0000232224 00000 n
-0000232375 00000 n
-0000232526 00000 n
-0000232675 00000 n
-0000232825 00000 n
-0000232975 00000 n
-0000233125 00000 n
-0000233275 00000 n
-0000233426 00000 n
-0000233576 00000 n
-0000233727 00000 n
-0000233877 00000 n
-0000234026 00000 n
-0000234175 00000 n
-0000234326 00000 n
-0000234476 00000 n
-0000234627 00000 n
-0000234777 00000 n
-0000234928 00000 n
-0000235078 00000 n
-0000235229 00000 n
-0000235379 00000 n
-0000235530 00000 n
-0000235681 00000 n
-0000235832 00000 n
-0000235983 00000 n
-0000236132 00000 n
-0000236282 00000 n
-0000236433 00000 n
-0000236582 00000 n
-0000236733 00000 n
-0000236883 00000 n
-0000237097 00000 n
-0000224777 00000 n
-0000223698 00000 n
-0000237034 00000 n
-0000325865 00000 n
-0000237196 00000 n
-0000237316 00000 n
-0000237788 00000 n
-0000238261 00000 n
-0000238297 00000 n
-0000238689 00000 n
-0000239349 00000 n
-0000239950 00000 n
-0000240491 00000 n
-0000241157 00000 n
-0000242966 00000 n
-0000243201 00000 n
-0000244774 00000 n
-0000245024 00000 n
-0000263016 00000 n
-0000263546 00000 n
-0000275503 00000 n
-0000275939 00000 n
-0000289102 00000 n
-0000289557 00000 n
-0000297688 00000 n
-0000297976 00000 n
-0000306239 00000 n
-0000306540 00000 n
-0000318919 00000 n
-0000319554 00000 n
-0000325562 00000 n
-0000328985 00000 n
-0000329105 00000 n
-0000329204 00000 n
-0000329277 00000 n
-0000341530 00000 n
-0000341713 00000 n
-0000342099 00000 n
-0000342605 00000 n
-0000343050 00000 n
-0000343501 00000 n
-0000344077 00000 n
-0000344586 00000 n
-0000345076 00000 n
-0000345568 00000 n
-0000346059 00000 n
-0000346619 00000 n
-0000347180 00000 n
-0000347741 00000 n
-0000348301 00000 n
-0000349032 00000 n
-0000349865 00000 n
-0000350698 00000 n
-0000351303 00000 n
-0000351575 00000 n
-0000351799 00000 n
-0000351970 00000 n
-0000352140 00000 n
-0000352313 00000 n
-0000352488 00000 n
-0000352665 00000 n
-0000352840 00000 n
-0000353008 00000 n
-0000353202 00000 n
-0000353408 00000 n
-0000353603 00000 n
-0000353799 00000 n
-0000353999 00000 n
-0000354201 00000 n
-0000354508 00000 n
-0000354867 00000 n
-0000355111 00000 n
-0000355354 00000 n
-0000355597 00000 n
-0000355840 00000 n
-0000356121 00000 n
-0000356404 00000 n
-0000356687 00000 n
-0000356970 00000 n
-0000357256 00000 n
-0000357547 00000 n
-0000357837 00000 n
-0000358124 00000 n
-0000358407 00000 n
-0000358690 00000 n
-0000358973 00000 n
-0000359256 00000 n
-0000359505 00000 n
-0000359700 00000 n
-0000359898 00000 n
-0000360099 00000 n
-0000360298 00000 n
-0000360499 00000 n
-0000360698 00000 n
-0000360890 00000 n
-0000360977 00000 n
-0000361145 00000 n
-0000361359 00000 n
-0000361534 00000 n
-0000361663 00000 n
-0000361782 00000 n
-0000361910 00000 n
-0000362049 00000 n
-0000362193 00000 n
-0000362326 00000 n
-0000362447 00000 n
-0000362574 00000 n
-0000362683 00000 n
-0000362767 00000 n
-0000362807 00000 n
-0000363007 00000 n
+0000223213 00000 n
+0000223337 00000 n
+0000223461 00000 n
+0000414201 00000 n
+0000228095 00000 n
+0000230757 00000 n
+0000228282 00000 n
+0000230945 00000 n
+0000227512 00000 n
+0000227711 00000 n
+0000228470 00000 n
+0000227359 00000 n
+0000223650 00000 n
+0000227908 00000 n
+0000228220 00000 n
+0000228407 00000 n
+0000231133 00000 n
+0000230571 00000 n
+0000228627 00000 n
+0000230694 00000 n
+0000230882 00000 n
+0000231070 00000 n
+0000233715 00000 n
+0000233879 00000 n
+0000234080 00000 n
+0000234281 00000 n
+0000234444 00000 n
+0000234646 00000 n
+0000234845 00000 n
+0000235008 00000 n
+0000235209 00000 n
+0000235411 00000 n
+0000235613 00000 n
+0000235814 00000 n
+0000236015 00000 n
+0000236216 00000 n
+0000236416 00000 n
+0000236618 00000 n
+0000236820 00000 n
+0000237521 00000 n
+0000233427 00000 n
+0000231276 00000 n
+0000237022 00000 n
+0000237209 00000 n
+0000237272 00000 n
+0000237396 00000 n
+0000242368 00000 n
+0000316950 00000 n
+0000246867 00000 n
+0000246679 00000 n
+0000253401 00000 n
+0000242180 00000 n
+0000241992 00000 n
+0000253025 00000 n
+0000253213 00000 n
+0000247054 00000 n
+0000252900 00000 n
+0000240504 00000 n
+0000240706 00000 n
+0000240905 00000 n
+0000241105 00000 n
+0000241306 00000 n
+0000241503 00000 n
+0000241704 00000 n
+0000242556 00000 n
+0000240306 00000 n
+0000237676 00000 n
+0000241867 00000 n
+0000242117 00000 n
+0000242305 00000 n
+0000242493 00000 n
+0000271558 00000 n
+0000245648 00000 n
+0000245846 00000 n
+0000246048 00000 n
+0000246250 00000 n
+0000246452 00000 n
+0000247241 00000 n
+0000245468 00000 n
+0000242726 00000 n
+0000246616 00000 n
+0000246804 00000 n
+0000246992 00000 n
+0000247178 00000 n
+0000271810 00000 n
+0000250425 00000 n
+0000250626 00000 n
+0000250827 00000 n
+0000251028 00000 n
+0000251229 00000 n
+0000251430 00000 n
+0000251631 00000 n
+0000252033 00000 n
+0000252235 00000 n
+0000252437 00000 n
+0000252637 00000 n
+0000254649 00000 n
+0000253589 00000 n
+0000250182 00000 n
+0000247398 00000 n
+0000252837 00000 n
+0000253150 00000 n
+0000253338 00000 n
+0000251833 00000 n
+0000253526 00000 n
+0000414326 00000 n
+0000254913 00000 n
+0000254505 00000 n
+0000253759 00000 n
+0000254850 00000 n
+0000258222 00000 n
+0000258414 00000 n
+0000258612 00000 n
+0000258804 00000 n
+0000259751 00000 n
+0000258051 00000 n
+0000255012 00000 n
+0000259001 00000 n
+0000259064 00000 n
+0000259189 00000 n
+0000259375 00000 n
+0000259500 00000 n
+0000259563 00000 n
+0000259688 00000 n
+0000260785 00000 n
+0000260474 00000 n
+0000259894 00000 n
+0000260597 00000 n
+0000260660 00000 n
+0000262187 00000 n
+0000262375 00000 n
+0000262563 00000 n
+0000262751 00000 n
+0000262939 00000 n
+0000263875 00000 n
+0000262007 00000 n
+0000260898 00000 n
+0000263128 00000 n
+0000263377 00000 n
+0000263563 00000 n
+0000263688 00000 n
+0000263813 00000 n
+0000267005 00000 n
+0000267129 00000 n
+0000265717 00000 n
+0000265908 00000 n
+0000266106 00000 n
+0000266298 00000 n
+0000266490 00000 n
+0000266688 00000 n
+0000267878 00000 n
+0000265528 00000 n
+0000264002 00000 n
+0000266880 00000 n
+0000267379 00000 n
+0000267442 00000 n
+0000267566 00000 n
+0000267691 00000 n
+0000267816 00000 n
+0000271121 00000 n
+0000271246 00000 n
+0000269945 00000 n
+0000270142 00000 n
+0000270340 00000 n
+0000270538 00000 n
+0000270736 00000 n
+0000271935 00000 n
+0000269765 00000 n
+0000268018 00000 n
+0000270934 00000 n
+0000271495 00000 n
+0000271621 00000 n
+0000271684 00000 n
+0000271747 00000 n
+0000414451 00000 n
+0000272700 00000 n
+0000272514 00000 n
+0000272090 00000 n
+0000272637 00000 n
+0000274244 00000 n
+0000274395 00000 n
+0000274546 00000 n
+0000274696 00000 n
+0000274847 00000 n
+0000274997 00000 n
+0000275148 00000 n
+0000275298 00000 n
+0000275449 00000 n
+0000275600 00000 n
+0000275751 00000 n
+0000275902 00000 n
+0000276053 00000 n
+0000276204 00000 n
+0000276355 00000 n
+0000276506 00000 n
+0000276657 00000 n
+0000276807 00000 n
+0000276958 00000 n
+0000277109 00000 n
+0000277259 00000 n
+0000277410 00000 n
+0000277561 00000 n
+0000277712 00000 n
+0000277861 00000 n
+0000278011 00000 n
+0000278162 00000 n
+0000278313 00000 n
+0000278464 00000 n
+0000278615 00000 n
+0000278766 00000 n
+0000278917 00000 n
+0000279068 00000 n
+0000279218 00000 n
+0000279369 00000 n
+0000279519 00000 n
+0000279669 00000 n
+0000279820 00000 n
+0000279971 00000 n
+0000280121 00000 n
+0000280272 00000 n
+0000280423 00000 n
+0000280574 00000 n
+0000280725 00000 n
+0000280876 00000 n
+0000281027 00000 n
+0000281178 00000 n
+0000281329 00000 n
+0000281479 00000 n
+0000281691 00000 n
+0000273668 00000 n
+0000272799 00000 n
+0000281628 00000 n
+0000283744 00000 n
+0000283895 00000 n
+0000284046 00000 n
+0000284197 00000 n
+0000284348 00000 n
+0000284499 00000 n
+0000284650 00000 n
+0000284801 00000 n
+0000284952 00000 n
+0000285103 00000 n
+0000285254 00000 n
+0000285405 00000 n
+0000285555 00000 n
+0000285705 00000 n
+0000285855 00000 n
+0000286006 00000 n
+0000286157 00000 n
+0000286307 00000 n
+0000286458 00000 n
+0000286609 00000 n
+0000286759 00000 n
+0000286910 00000 n
+0000287061 00000 n
+0000287212 00000 n
+0000287363 00000 n
+0000287514 00000 n
+0000287665 00000 n
+0000287816 00000 n
+0000287967 00000 n
+0000288118 00000 n
+0000288268 00000 n
+0000288417 00000 n
+0000288566 00000 n
+0000288715 00000 n
+0000288865 00000 n
+0000289015 00000 n
+0000289164 00000 n
+0000289315 00000 n
+0000289466 00000 n
+0000289617 00000 n
+0000289766 00000 n
+0000289915 00000 n
+0000290063 00000 n
+0000290214 00000 n
+0000290365 00000 n
+0000290516 00000 n
+0000290667 00000 n
+0000290817 00000 n
+0000290967 00000 n
+0000291117 00000 n
+0000291268 00000 n
+0000291419 00000 n
+0000291570 00000 n
+0000291720 00000 n
+0000291870 00000 n
+0000292020 00000 n
+0000292171 00000 n
+0000292322 00000 n
+0000292473 00000 n
+0000292624 00000 n
+0000292775 00000 n
+0000292926 00000 n
+0000293076 00000 n
+0000293288 00000 n
+0000283042 00000 n
+0000281778 00000 n
+0000293225 00000 n
+0000295891 00000 n
+0000296042 00000 n
+0000296193 00000 n
+0000296344 00000 n
+0000296495 00000 n
+0000296646 00000 n
+0000296795 00000 n
+0000296944 00000 n
+0000297094 00000 n
+0000297244 00000 n
+0000297394 00000 n
+0000297544 00000 n
+0000297694 00000 n
+0000297843 00000 n
+0000297992 00000 n
+0000298143 00000 n
+0000298293 00000 n
+0000298443 00000 n
+0000298593 00000 n
+0000298744 00000 n
+0000298894 00000 n
+0000299043 00000 n
+0000299194 00000 n
+0000299344 00000 n
+0000299495 00000 n
+0000299646 00000 n
+0000299797 00000 n
+0000299948 00000 n
+0000300099 00000 n
+0000300250 00000 n
+0000300401 00000 n
+0000300551 00000 n
+0000300701 00000 n
+0000300852 00000 n
+0000301002 00000 n
+0000301153 00000 n
+0000301304 00000 n
+0000301454 00000 n
+0000301603 00000 n
+0000301752 00000 n
+0000301903 00000 n
+0000302054 00000 n
+0000302205 00000 n
+0000302355 00000 n
+0000302506 00000 n
+0000302656 00000 n
+0000302807 00000 n
+0000302958 00000 n
+0000303109 00000 n
+0000303260 00000 n
+0000303411 00000 n
+0000303562 00000 n
+0000303712 00000 n
+0000303863 00000 n
+0000304014 00000 n
+0000304165 00000 n
+0000304314 00000 n
+0000304465 00000 n
+0000304615 00000 n
+0000304766 00000 n
+0000304916 00000 n
+0000305067 00000 n
+0000305216 00000 n
+0000305367 00000 n
+0000305518 00000 n
+0000305669 00000 n
+0000305819 00000 n
+0000305970 00000 n
+0000306119 00000 n
+0000306270 00000 n
+0000306420 00000 n
+0000306569 00000 n
+0000306719 00000 n
+0000306870 00000 n
+0000307021 00000 n
+0000307172 00000 n
+0000307323 00000 n
+0000307474 00000 n
+0000307625 00000 n
+0000307776 00000 n
+0000307927 00000 n
+0000308077 00000 n
+0000308227 00000 n
+0000308378 00000 n
+0000308529 00000 n
+0000308680 00000 n
+0000308830 00000 n
+0000308980 00000 n
+0000309129 00000 n
+0000309279 00000 n
+0000309429 00000 n
+0000309578 00000 n
+0000309726 00000 n
+0000311223 00000 n
+0000309938 00000 n
+0000294919 00000 n
+0000293387 00000 n
+0000309875 00000 n
+0000311374 00000 n
+0000311525 00000 n
+0000311676 00000 n
+0000311825 00000 n
+0000311975 00000 n
+0000312125 00000 n
+0000312276 00000 n
+0000312426 00000 n
+0000312577 00000 n
+0000312727 00000 n
+0000312878 00000 n
+0000313029 00000 n
+0000313180 00000 n
+0000313328 00000 n
+0000313479 00000 n
+0000313627 00000 n
+0000313778 00000 n
+0000313928 00000 n
+0000314078 00000 n
+0000314228 00000 n
+0000314379 00000 n
+0000314530 00000 n
+0000314681 00000 n
+0000314832 00000 n
+0000314983 00000 n
+0000315134 00000 n
+0000315284 00000 n
+0000315435 00000 n
+0000315586 00000 n
+0000315737 00000 n
+0000315887 00000 n
+0000316037 00000 n
+0000316187 00000 n
+0000316337 00000 n
+0000316487 00000 n
+0000316638 00000 n
+0000316851 00000 n
+0000310755 00000 n
+0000310050 00000 n
+0000316788 00000 n
+0000411164 00000 n
+0000316983 00000 n
+0000317455 00000 n
+0000317915 00000 n
+0000318392 00000 n
+0000318784 00000 n
+0000318820 00000 n
+0000319480 00000 n
+0000320099 00000 n
+0000320760 00000 n
+0000321426 00000 n
+0000323235 00000 n
+0000323470 00000 n
+0000325148 00000 n
+0000325408 00000 n
+0000343838 00000 n
+0000344397 00000 n
+0000356586 00000 n
+0000357027 00000 n
+0000370482 00000 n
+0000370943 00000 n
+0000379916 00000 n
+0000380226 00000 n
+0000388604 00000 n
+0000388907 00000 n
+0000401321 00000 n
+0000401963 00000 n
+0000410757 00000 n
+0000414576 00000 n
+0000414699 00000 n
+0000414816 00000 n
+0000414889 00000 n
+0000430965 00000 n
+0000431148 00000 n
+0000431499 00000 n
+0000432006 00000 n
+0000432486 00000 n
+0000432997 00000 n
+0000433447 00000 n
+0000433902 00000 n
+0000434487 00000 n
+0000434983 00000 n
+0000435559 00000 n
+0000436068 00000 n
+0000436558 00000 n
+0000437050 00000 n
+0000437529 00000 n
+0000438051 00000 n
+0000438612 00000 n
+0000439172 00000 n
+0000439733 00000 n
+0000440294 00000 n
+0000440854 00000 n
+0000441483 00000 n
+0000442316 00000 n
+0000443149 00000 n
+0000443982 00000 n
+0000444367 00000 n
+0000444640 00000 n
+0000444850 00000 n
+0000445027 00000 n
+0000445202 00000 n
+0000445379 00000 n
+0000445553 00000 n
+0000445727 00000 n
+0000445904 00000 n
+0000446079 00000 n
+0000446256 00000 n
+0000446424 00000 n
+0000446633 00000 n
+0000446841 00000 n
+0000447048 00000 n
+0000447249 00000 n
+0000447446 00000 n
+0000447646 00000 n
+0000447852 00000 n
+0000448055 00000 n
+0000448397 00000 n
+0000448728 00000 n
+0000448979 00000 n
+0000449222 00000 n
+0000449465 00000 n
+0000449708 00000 n
+0000449951 00000 n
+0000450220 00000 n
+0000450511 00000 n
+0000450803 00000 n
+0000451094 00000 n
+0000451380 00000 n
+0000451663 00000 n
+0000451946 00000 n
+0000452229 00000 n
+0000452516 00000 n
+0000452807 00000 n
+0000453097 00000 n
+0000453388 00000 n
+0000453677 00000 n
+0000453960 00000 n
+0000454243 00000 n
+0000454526 00000 n
+0000454809 00000 n
+0000455008 00000 n
+0000455207 00000 n
+0000455408 00000 n
+0000455608 00000 n
+0000455809 00000 n
+0000456009 00000 n
+0000456210 00000 n
+0000456410 00000 n
+0000456608 00000 n
+0000456717 00000 n
+0000456878 00000 n
+0000457085 00000 n
+0000457297 00000 n
+0000457543 00000 n
+0000457741 00000 n
+0000457855 00000 n
+0000457980 00000 n
+0000458110 00000 n
+0000458250 00000 n
+0000458396 00000 n
+0000458541 00000 n
+0000458674 00000 n
+0000458795 00000 n
+0000458912 00000 n
+0000459035 00000 n
+0000459111 00000 n
+0000459204 00000 n
+0000459244 00000 n
+0000459444 00000 n
trailer
-<< /Size 1562
-/Root 1560 0 R
-/Info 1561 0 R
-/ID [<66BFFE03FB2447F25C17B2469142EE98> <66BFFE03FB2447F25C17B2469142EE98>] >>
+<< /Size 2046
+/Root 2044 0 R
+/Info 2045 0 R
+/ID [<A01D053E98362AF565CB6B2CCF75E852> <A01D053E98362AF565CB6B2CCF75E852>] >>
startxref
-363339
+459776
%%EOF
diff --git a/openmp/runtime/doc/doxygen/config b/openmp/runtime/doc/doxygen/config
index 48377cb86a1..8a512752455 100644
--- a/openmp/runtime/doc/doxygen/config
+++ b/openmp/runtime/doc/doxygen/config
@@ -1539,7 +1539,7 @@ INCLUDE_FILE_PATTERNS =
# undefined via #undef or recursively expanded use the := operator
# instead of the = operator.
-PREDEFINED = OMP_30_ENABLED=1, OMP_40_ENABLED=1
+PREDEFINED = OMP_30_ENABLED=1, OMP_40_ENABLED=1, KMP_STATS_ENABLED=1
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.
diff --git a/openmp/runtime/doc/doxygen/libomp_interface.h b/openmp/runtime/doc/doxygen/libomp_interface.h
index b4be75cd0a1..e0d39e64932 100644
--- a/openmp/runtime/doc/doxygen/libomp_interface.h
+++ b/openmp/runtime/doc/doxygen/libomp_interface.h
@@ -208,6 +208,7 @@ are documented in different modules.
- @ref THREADPRIVATE functions to support thread private data, copyin etc
- @ref SYNCHRONIZATION functions to support `omp critical`, `omp barrier`, `omp master`, reductions etc
- @ref ATOMIC_OPS functions to support atomic operations
+ - @ref STATS_GATHERING macros to support developer profiling of libiomp5
- Documentation on tasking has still to be written...
@section SEC_EXAMPLES Examples
@@ -319,8 +320,29 @@ These functions are used for implementing barriers.
@defgroup THREADPRIVATE Thread private data support
These functions support copyin/out and thread private data.
+@defgroup STATS_GATHERING Statistics Gathering from OMPTB
+These macros support profiling the libiomp5 library. Use --stats=on when building with build.pl to enable
+and then use the KMP_* macros to profile (through counts or clock ticks) libiomp5 during execution of an OpenMP program.
+
+@section sec_stats_env_vars Environment Variables
+
+This section describes the environment variables relevent to stats-gathering in libiomp5
+
+@code
+KMP_STATS_FILE
+@endcode
+This environment variable is set to an output filename that will be appended *NOT OVERWRITTEN* if it exists. If this environment variable is undefined, the statistics will be output to stderr
+
+@code
+KMP_STATS_THREADS
+@endcode
+This environment variable indicates to print thread-specific statistics as well as aggregate statistics. Each thread's statistics will be shown as well as the collective sum of all threads. The values "true", "on", "1", "yes" will all indicate to print per thread statistics.
+
@defgroup TASKING Tasking support
-These functions support are used to implement tasking constructs.
+These functions support tasking constructs.
+
+@defgroup USER User visible functions
+These functions can be called directly by the user, but are runtime library specific, rather than being OpenMP interfaces.
*/
diff --git a/openmp/runtime/src/defs.mk b/openmp/runtime/src/defs.mk
index 45ba2bde5b7..14a0e90ff80 100644
--- a/openmp/runtime/src/defs.mk
+++ b/openmp/runtime/src/defs.mk
@@ -1,6 +1,6 @@
# defs.mk
-# $Revision: 42061 $
-# $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+# $Revision: 42951 $
+# $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
#
#//===----------------------------------------------------------------------===//
diff --git a/openmp/runtime/src/dllexports b/openmp/runtime/src/dllexports
index 2c58f4c673f..a82b7af61f5 100644
--- a/openmp/runtime/src/dllexports
+++ b/openmp/runtime/src/dllexports
@@ -161,10 +161,8 @@
# Regular entry points
__kmp_wait_yield_4
__kmp_wait_yield_8
- __kmp_wait_sleep
__kmp_fork_call
__kmp_invoke_microtask
- __kmp_release
__kmp_launch_monitor
__kmp_launch_worker
__kmp_reap_monitor
@@ -192,6 +190,14 @@
_You_must_link_with_Microsoft_OpenMP_library DATA
%endif
+ __kmp_wait_32
+ __kmp_wait_64
+ __kmp_wait_oncore
+ __kmp_release_32
+ __kmp_release_64
+ __kmp_release_oncore
+
+
# VT_getthid 1
# vtgthid 2
@@ -360,6 +366,18 @@ kmpc_set_defaults 224
__kmpc_cancel 244
__kmpc_cancellationpoint 245
__kmpc_cancel_barrier 246
+ __kmpc_dist_for_static_init_4 247
+ __kmpc_dist_for_static_init_4u 248
+ __kmpc_dist_for_static_init_8 249
+ __kmpc_dist_for_static_init_8u 250
+ __kmpc_dist_dispatch_init_4 251
+ __kmpc_dist_dispatch_init_4u 252
+ __kmpc_dist_dispatch_init_8 253
+ __kmpc_dist_dispatch_init_8u 254
+ __kmpc_team_static_init_4 255
+ __kmpc_team_static_init_4u 256
+ __kmpc_team_static_init_8 257
+ __kmpc_team_static_init_8u 258
%endif # OMP_40
%endif
diff --git a/openmp/runtime/src/exports_so.txt b/openmp/runtime/src/exports_so.txt
index 9ace78fd549..0b16049dd12 100644
--- a/openmp/runtime/src/exports_so.txt
+++ b/openmp/runtime/src/exports_so.txt
@@ -40,6 +40,8 @@ VERSION {
__kmp_thread_pool;
__kmp_thread_pool_nth;
+ __kmp_reset_stats;
+
#if USE_ITT_BUILD
#
# ITT support.
@@ -64,8 +66,12 @@ VERSION {
__kmp_launch_worker;
__kmp_reap_monitor;
__kmp_reap_worker;
- __kmp_release;
- __kmp_wait_sleep;
+ __kmp_release_32;
+ __kmp_release_64;
+ __kmp_release_oncore;
+ __kmp_wait_32;
+ __kmp_wait_64;
+ __kmp_wait_oncore;
__kmp_wait_yield_4;
__kmp_wait_yield_8;
diff --git a/openmp/runtime/src/extractExternal.cpp b/openmp/runtime/src/extractExternal.cpp
index 3f15c8e306e..41f03a4a8b2 100644
--- a/openmp/runtime/src/extractExternal.cpp
+++ b/openmp/runtime/src/extractExternal.cpp
@@ -1,7 +1,7 @@
/*
* extractExternal.cpp
- * $Revision: 42181 $
- * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+ * $Revision: 43084 $
+ * $Date: 2014-04-15 09:15:14 -0500 (Tue, 15 Apr 2014) $
*/
diff --git a/openmp/runtime/src/i18n/en_US.txt b/openmp/runtime/src/i18n/en_US.txt
index e172d3e3084..c925ef97cce 100644
--- a/openmp/runtime/src/i18n/en_US.txt
+++ b/openmp/runtime/src/i18n/en_US.txt
@@ -1,6 +1,6 @@
# en_US.txt #
-# $Revision: 42659 $
-# $Date: 2013-09-12 09:22:48 -0500 (Thu, 12 Sep 2013) $
+# $Revision: 43419 $
+# $Date: 2014-08-27 14:59:52 -0500 (Wed, 27 Aug 2014) $
#
#//===----------------------------------------------------------------------===//
@@ -40,7 +40,7 @@ Language "English"
Country "USA"
LangId "1033"
Version "2"
-Revision "20130911"
+Revision "20140827"
@@ -290,7 +290,7 @@ ChangeThreadAffMaskError "Cannot change thread affinity mask."
ThreadsMigrate "%1$s: Threads may migrate across %2$d innermost levels of machine"
DecreaseToThreads "%1$s: decrease to %2$d threads"
IncreaseToThreads "%1$s: increase to %2$d threads"
-BoundToOSProcSet "%1$s: Internal thread %2$d bound to OS proc set %3$s"
+OBSOLETE "%1$s: Internal thread %2$d bound to OS proc set %3$s"
AffCapableUseCpuinfo "%1$s: Affinity capable, using cpuinfo file"
AffUseGlobCpuid "%1$s: Affinity capable, using global cpuid info"
AffCapableUseFlat "%1$s: Affinity capable, using default \"flat\" topology"
@@ -395,9 +395,17 @@ AffThrPlaceInvalid "%1$s: invalid value \"%2$s\", valid format is \"nC
AffThrPlaceUnsupported "KMP_PLACE_THREADS ignored: unsupported architecture."
AffThrPlaceManyCores "KMP_PLACE_THREADS ignored: too many cores requested."
SyntaxErrorUsing "%1$s: syntax error, using %2$s."
-AdaptiveNotSupported "%1$s: Adaptive locks are not supported; using queuing."
-EnvSyntaxError "%1$s: Invalid symbols found. Check the value \"%2$s\"."
-EnvSpacesNotAllowed "%1$s: Spaces between digits are not allowed \"%2$s\"."
+AdaptiveNotSupported "%1$s: Adaptive locks are not supported; using queuing."
+EnvSyntaxError "%1$s: Invalid symbols found. Check the value \"%2$s\"."
+EnvSpacesNotAllowed "%1$s: Spaces between digits are not allowed \"%2$s\"."
+BoundToOSProcSet "%1$s: pid %2$d thread %3$d bound to OS proc set %4$s"
+CnsLoopIncrIllegal "%1$s error: parallel loop increment and condition are inconsistent."
+NoGompCancellation "libgomp cancellation is not currently supported."
+AffThrPlaceNonUniform "KMP_PLACE_THREADS ignored: non-uniform topology."
+AffThrPlaceNonThreeLevel "KMP_PLACE_THREADS ignored: only three-level topology is supported."
+AffGranTopGroup "%1$s: granularity=%2$s is not supported with KMP_TOPOLOGY_METHOD=group. Using \"granularity=fine\"."
+AffGranGroupType "%1$s: granularity=group is not supported with KMP_AFFINITY=%2$s. Using \"granularity=core\"."
+
# --------------------------------------------------------------------------------------------------
-*- HINTS -*-
diff --git a/openmp/runtime/src/include/25/iomp.h.var b/openmp/runtime/src/include/25/iomp.h.var
index 79b24eca26e..a0af224c633 100644
--- a/openmp/runtime/src/include/25/iomp.h.var
+++ b/openmp/runtime/src/include/25/iomp.h.var
@@ -1,7 +1,7 @@
/*
* include/25/iomp.h.var
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/include/25/iomp_lib.h.var b/openmp/runtime/src/include/25/iomp_lib.h.var
index 644f012ace2..d6aa093ffaa 100644
--- a/openmp/runtime/src/include/25/iomp_lib.h.var
+++ b/openmp/runtime/src/include/25/iomp_lib.h.var
@@ -1,6 +1,6 @@
! include/25/iomp_lib.h.var
-! $Revision: 42061 $
-! $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+! $Revision: 42951 $
+! $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
!
!//===----------------------------------------------------------------------===//
diff --git a/openmp/runtime/src/include/25/omp.h.var b/openmp/runtime/src/include/25/omp.h.var
index 603f4744cf4..12f71a4d008 100644
--- a/openmp/runtime/src/include/25/omp.h.var
+++ b/openmp/runtime/src/include/25/omp.h.var
@@ -1,7 +1,7 @@
/*
* include/25/omp.h.var
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/include/25/omp_lib.f.var b/openmp/runtime/src/include/25/omp_lib.f.var
index a4622ea61a4..3ece259630b 100644
--- a/openmp/runtime/src/include/25/omp_lib.f.var
+++ b/openmp/runtime/src/include/25/omp_lib.f.var
@@ -1,6 +1,6 @@
! include/25/omp_lib.f.var
-! $Revision: 42181 $
-! $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+! $Revision: 42951 $
+! $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
!
!//===----------------------------------------------------------------------===//
@@ -314,7 +314,7 @@
!dec$ else
!***
-!*** On Windows* OS IA-32 architecture, the Fortran entry points have an
+!*** On Windows* OS IA-32 architecture, the Fortran entry points have an
!*** underscore prepended.
!***
diff --git a/openmp/runtime/src/include/25/omp_lib.f90.var b/openmp/runtime/src/include/25/omp_lib.f90.var
index 01bf725bf8e..0d86a98cea6 100644
--- a/openmp/runtime/src/include/25/omp_lib.f90.var
+++ b/openmp/runtime/src/include/25/omp_lib.f90.var
@@ -1,6 +1,6 @@
! include/25/omp_lib.f90.var
-! $Revision: 42061 $
-! $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+! $Revision: 42951 $
+! $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
!
!//===----------------------------------------------------------------------===//
diff --git a/openmp/runtime/src/include/25/omp_lib.h.var b/openmp/runtime/src/include/25/omp_lib.h.var
index d0527e05a49..4b93c98bc95 100644
--- a/openmp/runtime/src/include/25/omp_lib.h.var
+++ b/openmp/runtime/src/include/25/omp_lib.h.var
@@ -1,6 +1,6 @@
! include/25/omp_lib.h.var
-! $Revision: 42181 $
-! $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+! $Revision: 42951 $
+! $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
!
!//===----------------------------------------------------------------------===//
@@ -301,7 +301,7 @@
!dec$ else
!***
-!*** On Windows* OS IA-32 architecture, the Fortran entry points have an
+!*** On Windows* OS IA-32 architecture, the Fortran entry points have an
!*** underscore prepended.
!***
diff --git a/openmp/runtime/src/include/30/iomp.h.var b/openmp/runtime/src/include/30/iomp.h.var
index 0efa3d16ca5..f24901b8180 100644
--- a/openmp/runtime/src/include/30/iomp.h.var
+++ b/openmp/runtime/src/include/30/iomp.h.var
@@ -1,7 +1,7 @@
/*
* include/30/iomp.h.var
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/include/30/iomp_lib.h.var b/openmp/runtime/src/include/30/iomp_lib.h.var
index bf2a8e20c4f..7831073b2af 100644
--- a/openmp/runtime/src/include/30/iomp_lib.h.var
+++ b/openmp/runtime/src/include/30/iomp_lib.h.var
@@ -1,6 +1,6 @@
! include/30/iomp_lib.h.var
-! $Revision: 42061 $
-! $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+! $Revision: 42951 $
+! $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
!
!//===----------------------------------------------------------------------===//
diff --git a/openmp/runtime/src/include/30/omp.h.var b/openmp/runtime/src/include/30/omp.h.var
index 79c3400d0de..d6f6510d958 100644
--- a/openmp/runtime/src/include/30/omp.h.var
+++ b/openmp/runtime/src/include/30/omp.h.var
@@ -1,7 +1,7 @@
/*
* include/30/omp.h.var
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/include/30/omp_lib.f.var b/openmp/runtime/src/include/30/omp_lib.f.var
index c3c546b450c..04607f947f9 100644
--- a/openmp/runtime/src/include/30/omp_lib.f.var
+++ b/openmp/runtime/src/include/30/omp_lib.f.var
@@ -1,6 +1,6 @@
! include/30/omp_lib.f.var
-! $Revision: 42181 $
-! $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+! $Revision: 42951 $
+! $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
!
!//===----------------------------------------------------------------------===//
diff --git a/openmp/runtime/src/include/30/omp_lib.f90.var b/openmp/runtime/src/include/30/omp_lib.f90.var
index 666ddfd591e..87c2b7d6dd4 100644
--- a/openmp/runtime/src/include/30/omp_lib.f90.var
+++ b/openmp/runtime/src/include/30/omp_lib.f90.var
@@ -1,6 +1,6 @@
! include/30/omp_lib.f90.var
-! $Revision: 42061 $
-! $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+! $Revision: 42951 $
+! $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
!
!//===----------------------------------------------------------------------===//
diff --git a/openmp/runtime/src/include/30/omp_lib.h.var b/openmp/runtime/src/include/30/omp_lib.h.var
index b3e3fc77340..6643c93aeeb 100644
--- a/openmp/runtime/src/include/30/omp_lib.h.var
+++ b/openmp/runtime/src/include/30/omp_lib.h.var
@@ -1,6 +1,6 @@
! include/30/omp_lib.h.var
-! $Revision: 42181 $
-! $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+! $Revision: 42951 $
+! $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
!
!//===----------------------------------------------------------------------===//
diff --git a/openmp/runtime/src/include/40/iomp.h.var b/openmp/runtime/src/include/40/iomp.h.var
index 8aeb38c3bc2..adb7dcc5048 100644
--- a/openmp/runtime/src/include/40/iomp.h.var
+++ b/openmp/runtime/src/include/40/iomp.h.var
@@ -91,7 +91,7 @@
} kmp_cancel_kind_t;
extern int __KAI_KMPC_CONVENTION kmp_get_cancellation_status(kmp_cancel_kind_t);
-
+
# undef __KAI_KMPC_CONVENTION
/* Warning:
diff --git a/openmp/runtime/src/kmp.h b/openmp/runtime/src/kmp.h
index f5dd10f8baa..6daf9735601 100644
--- a/openmp/runtime/src/kmp.h
+++ b/openmp/runtime/src/kmp.h
@@ -1,8 +1,8 @@
/*! \file */
/*
* kmp.h -- KPTS runtime header file.
- * $Revision: 42816 $
- * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
*/
@@ -28,8 +28,6 @@
/* Defines for OpenMP 3.0 tasking and auto scheduling */
-#if OMP_30_ENABLED
-
# ifndef KMP_STATIC_STEAL_ENABLED
# define KMP_STATIC_STEAL_ENABLED 1
# endif
@@ -56,8 +54,6 @@
#define TASK_EXPLICIT 1
#define TASK_IMPLICIT 0
-#endif // OMP_30_ENABLED
-
#define KMP_CANCEL_THREADS
#define KMP_THREAD_ATTR
@@ -79,6 +75,10 @@
#include "kmp_os.h"
+#if KMP_STATS_ENABLED
+class kmp_stats_list;
+#endif
+
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
#include <xmmintrin.h>
#endif
@@ -125,6 +125,24 @@
#define USE_FAST_MEMORY 3
#endif
+#ifndef KMP_NESTED_HOT_TEAMS
+# define KMP_NESTED_HOT_TEAMS 0
+# define USE_NESTED_HOT_ARG(x)
+#else
+# if KMP_NESTED_HOT_TEAMS
+# if OMP_40_ENABLED
+# define USE_NESTED_HOT_ARG(x) ,x
+# else
+// Nested hot teams feature depends on omp 4.0, disable it for earlier versions
+# undef KMP_NESTED_HOT_TEAMS
+# define KMP_NESTED_HOT_TEAMS 0
+# define USE_NESTED_HOT_ARG(x)
+# endif
+# else
+# define USE_NESTED_HOT_ARG(x)
+# endif
+#endif
+
// Assume using BGET compare_exchange instruction instead of lock by default.
#ifndef USE_CMP_XCHG_FOR_BGET
#define USE_CMP_XCHG_FOR_BGET 1
@@ -459,15 +477,6 @@ typedef int PACKED_REDUCTION_METHOD_T;
/*
* Only Linux* OS and Windows* OS support thread affinity.
*/
-#if (KMP_OS_LINUX || KMP_OS_WINDOWS) && !KMP_OS_CNK && !KMP_ARCH_PPC64
-# define KMP_AFFINITY_SUPPORTED 1
-#elif KMP_OS_DARWIN || KMP_OS_FREEBSD || KMP_OS_CNK || KMP_ARCH_PPC64
-// affinity not supported
-# define KMP_AFFINITY_SUPPORTED 0
-#else
-# error "Unknown or unsupported OS"
-#endif
-
#if KMP_AFFINITY_SUPPORTED
extern size_t __kmp_affin_mask_size;
@@ -540,11 +549,14 @@ typedef unsigned char kmp_affin_mask_t;
# if KMP_ARCH_X86_64
+// GROUP_AFFINITY is already defined for _MSC_VER>=1600 (VS2010 and later).
+# if _MSC_VER < 1600
typedef struct GROUP_AFFINITY {
- KAFFINITY mask;
- WORD group;
- WORD reserved[3];
+ KAFFINITY Mask;
+ WORD Group;
+ WORD Reserved[3];
} GROUP_AFFINITY;
+# endif
typedef DWORD_PTR kmp_affin_mask_t;
@@ -798,7 +810,6 @@ extern unsigned int __kmp_place_core_offset;
#define __kmp_entry_gtid() __kmp_get_global_thread_id_reg()
#define __kmp_tid_from_gtid(gtid) ( KMP_DEBUG_ASSERT( (gtid) >= 0 ), \
- /*(__kmp_threads[ (gtid) ]->th.th_team_serialized) ? 0 : */ /* TODO remove this check, it is redundant */ \
__kmp_threads[ (gtid) ]->th.th_info.ds.ds_tid )
#define __kmp_get_tid() ( __kmp_tid_from_gtid( __kmp_get_gtid() ) )
@@ -865,6 +876,9 @@ extern unsigned int __kmp_place_core_offset;
#define KMP_MAX_STKOFFSET KMP_MAX_STKSIZE
#define KMP_DEFAULT_STKOFFSET KMP_MIN_STKOFFSET
+#define KMP_MIN_STKPADDING (0)
+#define KMP_MAX_STKPADDING (2 * 1024 * 1024)
+
#define KMP_MIN_MONITOR_WAKEUPS (1) /* min number of times monitor wakes up per second */
#define KMP_MAX_MONITOR_WAKEUPS (1000) /* maximum number of times monitor can wake up per second */
#define KMP_BLOCKTIME_MULTIPLIER (1000) /* number of blocktime units per second */
@@ -952,12 +966,14 @@ extern unsigned int __kmp_place_core_offset;
#elif KMP_OS_LINUX
# define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
# define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
-#elif KMP_OS_DARWIN || KMP_OS_FREEBSD
-/* TODO: tune for OS */
+#elif KMP_OS_DARWIN
+/* TODO: tune for KMP_OS_DARWIN */
+# define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
+# define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
+#elif KMP_OS_FREEBSD
+/* TODO: tune for KMP_OS_FREEBSD */
# define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
# define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
-#else
-# error "Unknown or unsupported OS"
#endif
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
@@ -968,12 +984,14 @@ struct kmp_cpuid {
kmp_uint32 edx;
};
extern void __kmp_x86_cpuid( int mode, int mode2, struct kmp_cpuid *p );
-# if KMP_MIC
+# if KMP_ARCH_X86
+ extern void __kmp_x86_pause( void );
+# elif KMP_MIC
static void __kmp_x86_pause( void ) { _mm_delay_32( 100 ); };
# else
- extern void __kmp_x86_pause( void );
+ static void __kmp_x86_pause( void ) { _mm_pause(); };
# endif
-# define KMP_CPU_PAUSE() __kmp_x86_pause()
+# define KMP_CPU_PAUSE() __kmp_x86_pause()
#elif KMP_ARCH_PPC64
# define KMP_PPC64_PRI_LOW() __asm__ volatile ("or 1, 1, 1")
# define KMP_PPC64_PRI_MED() __asm__ volatile ("or 2, 2, 2")
@@ -985,7 +1003,7 @@ extern void __kmp_x86_cpuid( int mode, int mode2, struct kmp_cpuid *p );
#define KMP_INIT_YIELD(count) { (count) = __kmp_yield_init; }
-#define KMP_YIELD(cond) { KMP_CPU_PAUSE(); __kmp_static_yield( (cond) ); }
+#define KMP_YIELD(cond) { KMP_CPU_PAUSE(); __kmp_yield( (cond) ); }
// Note the decrement of 2 in the following Macros. With KMP_LIBRARY=turnaround,
// there should be no yielding since the starting value from KMP_INIT_YIELD() is odd.
@@ -1533,6 +1551,9 @@ typedef struct kmp_disp {
dispatch_private_info_t *th_disp_buffer;
kmp_int32 th_disp_index;
void* dummy_padding[2]; // make it 64 bytes on Intel(R) 64
+#if KMP_USE_INTERNODE_ALIGNMENT
+ char more_padding[INTERNODE_CACHE_LINE];
+#endif
} kmp_disp_t;
/* ------------------------------------------------------------------------ */
@@ -1557,6 +1578,12 @@ typedef struct kmp_disp {
# error "Barrier unused bit must be smaller than barrier bump bit"
#endif
+// Constants for release barrier wait state: currently, hierarchical only
+#define KMP_BARRIER_NOT_WAITING 0 // Normal state; worker not in wait_sleep
+#define KMP_BARRIER_OWN_FLAG 1 // Normal state; worker waiting on own b_go flag in release
+#define KMP_BARRIER_PARENT_FLAG 2 // Special state; worker waiting on parent's b_go flag in release
+#define KMP_BARRIER_SWITCH_TO_OWN_FLAG 3 // Special state; tells worker to shift from parent to own b_go
+#define KMP_BARRIER_SWITCHING 4 // Special state; worker resets appropriate flag on wake-up
enum barrier_type {
bs_plain_barrier = 0, /* 0, All non-fork/join barriers (except reduction barriers if enabled) */
@@ -1576,16 +1603,58 @@ typedef enum kmp_bar_pat { /* Barrier communication patterns */
bp_linear_bar = 0, /* Single level (degenerate) tree */
bp_tree_bar = 1, /* Balanced tree with branching factor 2^n */
bp_hyper_bar = 2, /* Hypercube-embedded tree with min branching factor 2^n */
- bp_last_bar = 3 /* Placeholder to mark the end */
+ bp_hierarchical_bar = 3, /* Machine hierarchy tree */
+ bp_last_bar = 4 /* Placeholder to mark the end */
} kmp_bar_pat_e;
+# define KMP_BARRIER_ICV_PUSH 1
+
+/* Record for holding the values of the internal controls stack records */
+typedef struct kmp_internal_control {
+ int serial_nesting_level; /* corresponds to the value of the th_team_serialized field */
+ kmp_int8 nested; /* internal control for nested parallelism (per thread) */
+ kmp_int8 dynamic; /* internal control for dynamic adjustment of threads (per thread) */
+ kmp_int8 bt_set; /* internal control for whether blocktime is explicitly set */
+ int blocktime; /* internal control for blocktime */
+ int bt_intervals; /* internal control for blocktime intervals */
+ int nproc; /* internal control for #threads for next parallel region (per thread) */
+ int max_active_levels; /* internal control for max_active_levels */
+ kmp_r_sched_t sched; /* internal control for runtime schedule {sched,chunk} pair */
+#if OMP_40_ENABLED
+ kmp_proc_bind_t proc_bind; /* internal control for affinity */
+#endif // OMP_40_ENABLED
+ struct kmp_internal_control *next;
+} kmp_internal_control_t;
+
+static inline void
+copy_icvs( kmp_internal_control_t *dst, kmp_internal_control_t *src ) {
+ *dst = *src;
+}
+
/* Thread barrier needs volatile barrier fields */
typedef struct KMP_ALIGN_CACHE kmp_bstate {
- volatile kmp_uint b_arrived; /* STATE => task reached synch point. */
- #if (KMP_PERF_V19 == KMP_ON)
- KMP_ALIGN_CACHE
- #endif
- volatile kmp_uint b_go; /* STATE => task should proceed. */
+ // th_fixed_icvs is aligned by virtue of kmp_bstate being aligned (and all uses of it).
+ // It is not explicitly aligned below, because we *don't* want it to be padded -- instead,
+ // we fit b_go into the same cache line with th_fixed_icvs, enabling NGO cache lines
+ // stores in the hierarchical barrier.
+ kmp_internal_control_t th_fixed_icvs; // Initial ICVs for the thread
+ // Tuck b_go into end of th_fixed_icvs cache line, so it can be stored with same NGO store
+ volatile kmp_uint64 b_go; // STATE => task should proceed (hierarchical)
+ KMP_ALIGN_CACHE volatile kmp_uint64 b_arrived; // STATE => task reached synch point.
+ kmp_uint32 *skip_per_level;
+ kmp_uint32 my_level;
+ kmp_int32 parent_tid;
+ kmp_uint32 old_tid;
+ kmp_uint32 depth;
+ struct kmp_bstate *parent_bar;
+ kmp_team_t *team;
+ kmp_uint64 leaf_state;
+ kmp_uint32 nproc;
+ kmp_uint8 base_leaf_kids;
+ kmp_uint8 leaf_kids;
+ kmp_uint8 offset;
+ kmp_uint8 wait_flag;
+ kmp_uint8 use_oncore_barrier;
} kmp_bstate_t;
union KMP_ALIGN_CACHE kmp_barrier_union {
@@ -1698,7 +1767,6 @@ typedef union KMP_ALIGN_CACHE kmp_desc {
typedef struct kmp_local {
volatile int this_construct; /* count of single's encountered by thread */
- volatile int last_construct; /* cache for team's count used by old algorithm */
void *reduce_data;
#if KMP_USE_BGET
void *bget_data;
@@ -1721,151 +1789,54 @@ typedef struct kmp_local {
} kmp_local_t;
-/* Record for holding the values of the internal controls stack records */
-typedef struct KMP_ALIGN_CACHE kmp_internal_control {
- int serial_nesting_level; /* corresponds to the value of the th_team_serialized field */
- int nested; /* internal control for nested parallelism (per thread) */
- int dynamic; /* internal control for dynamic adjustment of threads (per thread) */
- int nproc; /* internal control for # of threads for next parallel region (per thread) */
- int blocktime; /* internal control for blocktime */
- int bt_intervals; /* internal control for blocktime intervals */
- int bt_set; /* internal control for whether blocktime is explicitly set */
-#if OMP_30_ENABLED
- int max_active_levels; /* internal control for max_active_levels */
- kmp_r_sched_t sched; /* internal control for runtime schedule {sched,chunk} pair */
-#endif // OMP_30_ENABLED
-#if OMP_40_ENABLED
- kmp_proc_bind_t proc_bind; /* internal control for affinity */
-#endif // OMP_40_ENABLED
- struct kmp_internal_control *next;
-
-} kmp_internal_control_t;
-
-#if OMP_30_ENABLED
-static inline void
-copy_icvs( kmp_internal_control_t *dst, kmp_internal_control_t *src ) {
- *dst = *src;
-}
-#endif // OMP_30_ENABLED
-
-#if OMP_30_ENABLED
-
- #define get__blocktime( xteam, xtid ) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.blocktime)
- #define get__bt_set( xteam, xtid ) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.bt_set)
- #define get__bt_intervals( xteam, xtid ) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.bt_intervals)
+#define get__blocktime( xteam, xtid ) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.blocktime)
+#define get__bt_set( xteam, xtid ) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.bt_set)
+#define get__bt_intervals( xteam, xtid ) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.bt_intervals)
- #define get__nested_2(xteam,xtid) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.nested)
- #define get__dynamic_2(xteam,xtid) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.dynamic)
- #define get__nproc_2(xteam,xtid) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.nproc)
- #define get__sched_2(xteam,xtid) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.sched)
+#define get__nested_2(xteam,xtid) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.nested)
+#define get__dynamic_2(xteam,xtid) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.dynamic)
+#define get__nproc_2(xteam,xtid) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.nproc)
+#define get__sched_2(xteam,xtid) ((xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.sched)
- #define set__blocktime_team( xteam, xtid, xval ) \
- ( ( (xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.blocktime ) = (xval) )
+#define set__blocktime_team( xteam, xtid, xval ) \
+ ( ( (xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.blocktime ) = (xval) )
- #define set__bt_intervals_team( xteam, xtid, xval ) \
- ( ( (xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.bt_intervals ) = (xval) )
+#define set__bt_intervals_team( xteam, xtid, xval ) \
+ ( ( (xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.bt_intervals ) = (xval) )
- #define set__bt_set_team( xteam, xtid, xval ) \
- ( ( (xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.bt_set ) = (xval) )
+#define set__bt_set_team( xteam, xtid, xval ) \
+ ( ( (xteam)->t.t_threads[(xtid)]->th.th_current_task->td_icvs.bt_set ) = (xval) )
+#define set__nested( xthread, xval ) \
+ ( ( (xthread)->th.th_current_task->td_icvs.nested ) = (xval) )
+#define get__nested( xthread ) \
+ ( ( (xthread)->th.th_current_task->td_icvs.nested ) ? (FTN_TRUE) : (FTN_FALSE) )
- #define set__nested( xthread, xval ) \
- ( ( (xthread)->th.th_serial_team->t.t_threads[0] ->th.th_current_task->td_icvs.nested ) = \
- ( (xthread)->th.th_team ->t.t_threads[((xthread)->th.th_info.ds.ds_tid)]->th.th_current_task->td_icvs.nested ) = \
- (xval) )
- #define get__nested( xthread ) \
- ( ( (xthread)->th.th_team ->t.t_threads[((xthread)->th.th_info.ds.ds_tid)]->th.th_current_task->td_icvs.nested ) \
- ? (FTN_TRUE) : (FTN_FALSE) )
+#define set__dynamic( xthread, xval ) \
+ ( ( (xthread)->th.th_current_task->td_icvs.dynamic ) = (xval) )
+#define get__dynamic( xthread ) \
+ ( ( (xthread)->th.th_current_task->td_icvs.dynamic ) ? (FTN_TRUE) : (FTN_FALSE) )
- #define set__dynamic( xthread, xval ) \
- ( ( (xthread)->th.th_serial_team->t.t_threads[0] ->th.th_current_task->td_icvs.dynamic ) = \
- ( (xthread)->th.th_team ->t.t_threads[((xthread)->th.th_info.ds.ds_tid)]->th.th_current_task->td_icvs.dynamic ) = \
- (xval) )
- #define get__dynamic( xthread ) \
- ( ( (xthread)->th.th_team ->t.t_threads[((xthread)->th.th_info.ds.ds_tid)]->th.th_current_task->td_icvs.dynamic ) \
- ? (FTN_TRUE) : (FTN_FALSE) )
+#define set__nproc( xthread, xval ) \
+ ( ( (xthread)->th.th_current_task->td_icvs.nproc ) = (xval) )
- #define set__nproc( xthread, xval ) \
- ( ( (xthread)->th.th_serial_team->t.t_threads[0] ->th.th_current_task->td_icvs.nproc ) = \
- ( (xthread)->th.th_team ->t.t_threads[((xthread)->th.th_info.ds.ds_tid)]->th.th_current_task->td_icvs.nproc ) = \
- (xval) )
+#define set__max_active_levels( xthread, xval ) \
+ ( ( (xthread)->th.th_current_task->td_icvs.max_active_levels ) = (xval) )
- #define set__nproc_p( xthread, xval ) \
- ( \
- ( (xthread)->th.th_team ->t.t_threads[((xthread)->th.th_info.ds.ds_tid)]->th.th_current_task->td_icvs.nproc ) = \
- (xval) )
-
- #define set__max_active_levels( xthread, xval ) \
- ( ( (xthread)->th.th_serial_team->t.t_threads[0] ->th.th_current_task->td_icvs.max_active_levels ) = \
- ( (xthread)->th.th_team ->t.t_threads[((xthread)->th.th_info.ds.ds_tid)]->th.th_current_task->td_icvs.max_active_levels ) = \
- (xval) )
-
- #define set__sched( xthread, xval ) \
- ( ( (xthread)->th.th_serial_team->t.t_threads[0] ->th.th_current_task->td_icvs.sched ) = \
- ( (xthread)->th.th_team ->t.t_threads[((xthread)->th.th_info.ds.ds_tid)]->th.th_current_task->td_icvs.sched ) = \
- (xval) )
+#define set__sched( xthread, xval ) \
+ ( ( (xthread)->th.th_current_task->td_icvs.sched ) = (xval) )
#if OMP_40_ENABLED
- #define set__proc_bind( xthread, xval ) \
- ( \
- ( (xthread)->th.th_team ->t.t_threads[((xthread)->th.th_info.ds.ds_tid)]->th.th_current_task->td_icvs.proc_bind ) = \
- (xval) )
-
- #define get__proc_bind( xthread ) \
- ( (xthread)->th.th_team ->t.t_threads[((xthread)->th.th_info.ds.ds_tid)]->th.th_current_task->td_icvs.proc_bind )
+#define set__proc_bind( xthread, xval ) \
+ ( ( (xthread)->th.th_current_task->td_icvs.proc_bind ) = (xval) )
+#define get__proc_bind( xthread ) \
+ ( (xthread)->th.th_current_task->td_icvs.proc_bind )
#endif /* OMP_40_ENABLED */
-#else
-
- #define get__blocktime( xteam, xtid ) ((xteam)->t.t_set_blocktime[ (xtid)])
- #define get__bt_set( xteam, xtid ) ((xteam)->t.t_set_bt_set[ (xtid)])
- #define get__bt_intervals( xteam, xtid ) ((xteam)->t.t_set_bt_intervals[(xtid)])
-
- #define set__nested( xthread, xval ) \
- ( ( (xthread)->th.th_serial_team->t.t_set_nested[0] ) = \
- ( (xthread)->th.th_team->t.t_set_nested[((xthread)->th.th_info.ds.ds_tid)] ) = \
- (xval) )
- #define get__nested( xthread ) \
- ( ( (xthread)->th.th_team->t.t_set_nested[((xthread)->th.th_info.ds.ds_tid)] ) \
- ? (FTN_TRUE) : (FTN_FALSE) )
-
- #define set__dynamic( xthread, xval ) \
- ( ( (xthread)->th.th_serial_team->t.t_set_dynamic[0] ) = \
- ( (xthread)->th.th_team->t.t_set_dynamic[((xthread)->th.th_info.ds.ds_tid)] ) = \
- (xval) )
- #define get__dynamic( xthread ) \
- ( ( (xthread)->th.th_team->t.t_set_dynamic[((xthread)->th.th_info.ds.ds_tid)] ) \
- ? (FTN_TRUE) : (FTN_FALSE) )
-
- #define set__nproc( xthread, xval ) \
- ( ( (xthread)->th.th_serial_team->t.t_set_nproc[0] ) = \
- ( (xthread)->th.th_team->t.t_set_nproc[((xthread)->th.th_info.ds.ds_tid)] ) = \
- (xval) )
-
- #define set__nproc_p( xthread, xval ) \
- ( ( (xthread)->th.th_team->t.t_set_nproc[((xthread)->th.th_info.ds.ds_tid)] ) = (xval) )
-
- #define set__blocktime_team( xteam, xtid, xval ) \
- ( ( (xteam)->t.t_set_blocktime[(xtid)] ) = (xval) )
- #define set__bt_intervals_team( xteam, xtid, xval ) \
- ( ( (xteam)->t.t_set_bt_intervals[(xtid)] ) = (xval) )
-
- #define set__bt_set_team( xteam, xtid, xval ) \
- ( ( (xteam)->t.t_set_bt_set[(xtid)] ) = (xval) )
-
- #define get__nested_2(xteam,xtid) ( (xteam)->t.t_set_nested[(xtid)] )
- #define get__dynamic_2(xteam,xtid) ( (xteam)->t.t_set_dynamic[(xtid)] )
- #define get__nproc_2(xteam,xtid) ( (xteam)->t.t_set_nproc[(xtid)] )
- #define get__sched_2(xteam,xtid) ( (xteam)->t.t_set_sched[(xtid)] )
-
-
-#endif
-
-#if OMP_30_ENABLED
/* ------------------------------------------------------------------------ */
// OpenMP tasking data structures
//
@@ -1931,7 +1902,7 @@ typedef struct kmp_dephash_entry kmp_dephash_entry_t;
typedef struct kmp_depend_info {
kmp_intptr_t base_addr;
- size_t len;
+ size_t len;
struct {
bool in:1;
bool out:1;
@@ -1947,13 +1918,13 @@ typedef struct kmp_base_depnode {
kmp_depnode_list_t * successors;
kmp_task_t * task;
- kmp_lock_t lock;
+ kmp_lock_t lock;
#if KMP_SUPPORT_GRAPH_OUTPUT
kmp_uint32 id;
#endif
- volatile kmp_int32 npredecessors;
+ volatile kmp_int32 npredecessors;
volatile kmp_int32 nrefs;
} kmp_base_depnode_t;
@@ -1965,8 +1936,8 @@ union KMP_ALIGN_CACHE kmp_depnode {
struct kmp_dephash_entry {
kmp_intptr_t addr;
- kmp_depnode_t * last_out;
- kmp_depnode_list_t * last_ins;
+ kmp_depnode_t * last_out;
+ kmp_depnode_list_t * last_ins;
kmp_dephash_entry_t * next_in_bucket;
};
@@ -2039,7 +2010,7 @@ struct kmp_taskdata { /* aligned during dynamic
ident_t * td_taskwait_ident;
kmp_uint32 td_taskwait_counter;
kmp_int32 td_taskwait_thread; /* gtid + 1 of thread encountered taskwait */
- kmp_internal_control_t td_icvs; /* Internal control variables for the task */
+ KMP_ALIGN_CACHE kmp_internal_control_t td_icvs; /* Internal control variables for the task */
volatile kmp_uint32 td_allocated_child_tasks; /* Child tasks (+ current task) not yet deallocated */
volatile kmp_uint32 td_incomplete_child_tasks; /* Child tasks not yet complete */
#if OMP_40_ENABLED
@@ -2060,7 +2031,7 @@ KMP_BUILD_ASSERT( sizeof(kmp_taskdata_t) % sizeof(void *) == 0 );
// Data for task team but per thread
typedef struct kmp_base_thread_data {
kmp_info_p * td_thr; // Pointer back to thread info
- // Used only in __kmp_execute_tasks, maybe not avail until task is queued?
+ // Used only in __kmp_execute_tasks_template, maybe not avail until task is queued?
kmp_bootstrap_lock_t td_deque_lock; // Lock for accessing deque
kmp_taskdata_t ** td_deque; // Deque of tasks encountered by td_thr, dynamically allocated
kmp_uint32 td_deque_head; // Head of deque (will wrap)
@@ -2099,6 +2070,10 @@ typedef struct kmp_base_task_team {
volatile kmp_uint32 tt_active; /* is the team still actively executing tasks */
KMP_ALIGN_CACHE
+#if KMP_USE_INTERNODE_ALIGNMENT
+ kmp_int32 tt_padme[INTERNODE_CACHE_LINE/sizeof(kmp_int32)];
+#endif
+
volatile kmp_uint32 tt_ref_ct; /* #threads accessing struct */
/* (not incl. master) */
kmp_int32 tt_state; /* alternating 0/1 for task team identification */
@@ -2111,8 +2086,6 @@ union KMP_ALIGN_CACHE kmp_task_team {
char tt_pad[ KMP_PAD(kmp_base_task_team_t, CACHE_LINE) ];
};
-#endif // OMP_30_ENABLED
-
#if ( USE_FAST_MEMORY == 3 ) || ( USE_FAST_MEMORY == 5 )
// Free lists keep same-size free memory slots for fast memory allocation routines
typedef struct kmp_free_list {
@@ -2121,6 +2094,20 @@ typedef struct kmp_free_list {
void *th_free_list_other; // Non-self free list (to be returned to owner's sync list)
} kmp_free_list_t;
#endif
+#if KMP_NESTED_HOT_TEAMS
+// Hot teams array keeps hot teams and their sizes for given thread.
+// Hot teams are not put in teams pool, and they don't put threads in threads pool.
+typedef struct kmp_hot_team_ptr {
+ kmp_team_p *hot_team; // pointer to hot_team of given nesting level
+ kmp_int32 hot_team_nth; // number of threads allocated for the hot_team
+} kmp_hot_team_ptr_t;
+#endif
+#if OMP_40_ENABLED
+typedef struct kmp_teams_size {
+ kmp_int32 nteams; // number of teams in a league
+ kmp_int32 nth; // number of threads in each team of the league
+} kmp_teams_size_t;
+#endif
/* ------------------------------------------------------------------------ */
// OpenMP thread data structures
@@ -2146,7 +2133,7 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
kmp_info_p *th_team_master; /* the team's master thread */
int th_team_serialized; /* team is serialized */
#if OMP_40_ENABLED
- microtask_t th_team_microtask; /* save entry address for teams construct */
+ microtask_t th_teams_microtask; /* save entry address for teams construct */
int th_teams_level; /* save initial level of teams construct */
/* it is 0 on device but may be any on host */
#endif
@@ -2158,21 +2145,21 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
int th_team_bt_intervals;
int th_team_bt_set;
- kmp_internal_control_t th_fixed_icvs; /* Initial ICVs for the thread */
-
#if KMP_AFFINITY_SUPPORTED
kmp_affin_mask_t *th_affin_mask; /* thread's current affinity mask */
#endif
-
/*
* The data set by the master at reinit, then R/W by the worker
*/
KMP_ALIGN_CACHE int th_set_nproc; /* if > 0, then only use this request for the next fork */
+#if KMP_NESTED_HOT_TEAMS
+ kmp_hot_team_ptr_t *th_hot_teams; /* array of hot teams */
+#endif
#if OMP_40_ENABLED
- int th_set_nth_teams; /* number of threads in parallel nested in teams construct */
kmp_proc_bind_t th_set_proc_bind; /* if != proc_bind_default, use request for next fork */
+ kmp_teams_size_t th_teams_size; /* number of teams/threads in teams construct */
# if KMP_AFFINITY_SUPPORTED
int th_current_place; /* place currently bound to */
int th_new_place; /* place to bind to in par reg */
@@ -2182,6 +2169,7 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
#endif
#if USE_ITT_BUILD
kmp_uint64 th_bar_arrive_time; /* arrival to barrier timestamp */
+ kmp_uint64 th_bar_min_time; /* minimum arrival time at the barrier */
kmp_uint64 th_frame_time; /* frame timestamp */
kmp_uint64 th_frame_time_serialized; /* frame timestamp in serialized parallel */
#endif /* USE_ITT_BUILD */
@@ -2200,24 +2188,18 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
volatile kmp_uint32 th_spin_here; /* thread-local location for spinning */
/* while awaiting queuing lock acquire */
- volatile kmp_uint32 *th_sleep_loc;
+ volatile void *th_sleep_loc; // this points at a kmp_flag<T>
-/*
- * Two variables used for consistency check - struct cons_header *th_cons and inte th_first moved below
- * from here in order to avoid performance regression
-*/
ident_t *th_ident;
unsigned th_x; // Random number generator data
unsigned th_a; // Random number generator data
-#if OMP_30_ENABLED
/*
* Tasking-related data for the thread
*/
kmp_task_team_t * th_task_team; // Task team struct
kmp_taskdata_t * th_current_task; // Innermost Task being executed
kmp_uint8 th_task_state; // alternating 0/1 for task team identification
-#endif // OMP_30_ENABLED
/*
* More stuff for keeping track of active/sleeping threads
@@ -2229,8 +2211,7 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
// 32 bits for TCR/TCW
- struct cons_header * th_cons;
- int th_first;
+ struct cons_header * th_cons; // used for consistency check
/*
* Add the syncronizing data which is cache aligned and padded.
@@ -2259,6 +2240,9 @@ typedef struct KMP_ALIGN_CACHE kmp_base_info {
kmp_itt_mark_t th_itt_mark_single;
// alignment ???
#endif /* USE_ITT_BUILD */
+#if KMP_STATS_ENABLED
+ kmp_stats_list* th_stats;
+#endif
} kmp_base_info_t;
typedef union KMP_ALIGN_CACHE kmp_info {
@@ -2291,154 +2275,89 @@ typedef int (*launch_t)( int gtid );
/* Minimum number of ARGV entries to malloc if necessary */
#define KMP_MIN_MALLOC_ARGV_ENTRIES 100
-#if KMP_MIC && OMP_30_ENABLED
-# define KMP_BARRIER_ICV_PULL 1
+// Set up how many argv pointers will fit in cache lines containing t_inline_argv. Historically, we
+// have supported at least 96 bytes. Using a larger value for more space between the master write/worker
+// read section and read/write by all section seems to buy more performance on EPCC PARALLEL.
+#if KMP_ARCH_X86 || KMP_ARCH_X86_64
+# define KMP_INLINE_ARGV_BYTES ( 4 * CACHE_LINE - ( ( 3 * KMP_PTR_SKIP + 2 * sizeof(int) + 2 * sizeof(kmp_int8) + sizeof(kmp_int16) + sizeof(kmp_uint32) ) % CACHE_LINE ) )
#else
-# define KMP_BARRIER_ICV_PULL 0
-#endif
-
-#if (KMP_PERF_V106 == KMP_ON)
-//
-// Set up how many argv pointers will fit in cache lines containing
-// *t_inline_argv. Historically, we have supported at least 96 bytes.
-//
-// Using a larger value for more space between the master write/worker read
-// section and read/write by all section seems to buy more performance
-// on EPCC PARALLEL.
-//
-//# define KMP_INLINE_ARGV_BYTES ( 2 * CACHE_LINE )
-# if KMP_BARRIER_ICV_PULL
-# define KMP_INLINE_ARGV_BYTES 192
-//# define KMP_INLINE_ARGV_BYTES ( 2 * CACHE_LINE - ( ( 5 * KMP_PTR_SKIP + 10 * sizeof(int) + sizeof(kmp_int64) ) % CACHE_LINE ) )
-# elif KMP_ARCH_X86 || KMP_ARCH_X86_64
-# define KMP_INLINE_ARGV_BYTES ( 4 * CACHE_LINE - ( ( 3 * KMP_PTR_SKIP + 2 * sizeof(int) + 2 * sizeof(kmp_int8) + sizeof(kmp_int16) + sizeof(kmp_uint32) ) % CACHE_LINE ) )
-# else
-# define KMP_INLINE_ARGV_BYTES ( 2 * CACHE_LINE - ( ( 3 * KMP_PTR_SKIP + 2 * sizeof(int) ) % CACHE_LINE ) )
-# endif
-# define KMP_INLINE_ARGV_ENTRIES (int)( KMP_INLINE_ARGV_BYTES / KMP_PTR_SKIP )
+# define KMP_INLINE_ARGV_BYTES ( 2 * CACHE_LINE - ( ( 3 * KMP_PTR_SKIP + 2 * sizeof(int) ) % CACHE_LINE ) )
#endif
+#define KMP_INLINE_ARGV_ENTRIES (int)( KMP_INLINE_ARGV_BYTES / KMP_PTR_SKIP )
typedef struct KMP_ALIGN_CACHE kmp_base_team {
-/*
- * Synchronization Data
- */
- KMP_ALIGN_CACHE kmp_ordered_team_t t_ordered;
+ // Synchronization Data ---------------------------------------------------------------------------------
+ KMP_ALIGN_CACHE kmp_ordered_team_t t_ordered;
kmp_balign_team_t t_bar[ bs_last_barrier ];
-
- /* count of single directive encountered by team */
- volatile int t_construct;
- kmp_lock_t t_single_lock; /* team specific lock */
-
-/*
- * Master only
- */
- KMP_ALIGN_CACHE int t_master_tid; /* tid of master in parent team */
- int t_master_this_cons; /* "this_construct" single counter of master in parent team */
- int t_master_last_cons; /* "last_construct" single counter of master in parent team */
- ident_t *t_ident; /* if volatile, have to change too much other crud to volatile too */
- kmp_team_p *t_parent; /* parent team */
- kmp_team_p *t_next_pool; /* next free team in the team pool */
- kmp_disp_t *t_dispatch; /* thread's dispatch data */
-#if OMP_30_ENABLED
- kmp_task_team_t *t_task_team; /* Task team struct */
-#endif /* OMP_30_ENABLED */
+ volatile int t_construct; // count of single directive encountered by team
+ kmp_lock_t t_single_lock; // team specific lock
+
+ // Master only -----------------------------------------------------------------------------------------
+ KMP_ALIGN_CACHE int t_master_tid; // tid of master in parent team
+ int t_master_this_cons; // "this_construct" single counter of master in parent team
+ ident_t *t_ident; // if volatile, have to change too much other crud to volatile too
+ kmp_team_p *t_parent; // parent team
+ kmp_team_p *t_next_pool; // next free team in the team pool
+ kmp_disp_t *t_dispatch; // thread's dispatch data
+ kmp_task_team_t *t_task_team; // Task team struct
#if OMP_40_ENABLED
- kmp_proc_bind_t t_proc_bind; /* bind type for par region */
+ kmp_proc_bind_t t_proc_bind; // bind type for par region
#endif // OMP_40_ENABLED
+#if USE_ITT_BUILD
+ kmp_uint64 t_region_time; // region begin timestamp
+#endif /* USE_ITT_BUILD */
-/*
- * Master write, workers read
- */
- KMP_ALIGN_CACHE
- void **t_argv;
+ // Master write, workers read --------------------------------------------------------------------------
+ KMP_ALIGN_CACHE void **t_argv;
int t_argc;
-#if (KMP_PERF_V106 == KMP_ON)
- /* swap cache lines for t_nproc and t_max_argc */
- int t_nproc; /* number of threads in team */
-#else
- int t_max_argc;
-#endif
+ int t_nproc; // number of threads in team
microtask_t t_pkfn;
- launch_t t_invoke; /* procedure to launch the microtask */
-
+ launch_t t_invoke; // procedure to launch the microtask
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
kmp_int8 t_fp_control_saved;
kmp_int8 t_pad2b;
- kmp_int16 t_x87_fpu_control_word; /* FP control regs */
+ kmp_int16 t_x87_fpu_control_word; // FP control regs
kmp_uint32 t_mxcsr;
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
-#if (KMP_PERF_V106 == KMP_ON)
void *t_inline_argv[ KMP_INLINE_ARGV_ENTRIES ];
-#endif
-#if (KMP_PERF_V19 == KMP_ON)
- KMP_ALIGN_CACHE
-#endif
- kmp_info_t **t_threads;
-#if (KMP_PERF_V106 == KMP_ON)
- /* swap cache lines for t_nproc and t_max_argc */
+ KMP_ALIGN_CACHE kmp_info_t **t_threads;
int t_max_argc;
-#else
- int t_nproc; /* number of threads in team */
-#endif
- int t_max_nproc; /* maximum threads this team can handle (this is dynamicly expandable) */
- int t_serialized; /* levels deep of serialized teams */
- dispatch_shared_info_t *t_disp_buffer; /* buffers for dispatch system */
+ int t_max_nproc; // maximum threads this team can handle (dynamicly expandable)
+ int t_serialized; // levels deep of serialized teams
+ dispatch_shared_info_t *t_disp_buffer; // buffers for dispatch system
int t_id; // team's id, assigned by debugger.
-#if OMP_30_ENABLED
- int t_level; /* nested parallel level */
- int t_active_level; /* nested active parallel level */
- kmp_r_sched_t t_sched; /* run-time schedule for the team */
-#endif // OMP_30_ENABLED
+ int t_level; // nested parallel level
+ int t_active_level; // nested active parallel level
+ kmp_r_sched_t t_sched; // run-time schedule for the team
#if OMP_40_ENABLED && KMP_AFFINITY_SUPPORTED
- int t_first_place; /* first & last place in */
- int t_last_place; /* parent thread's partition. */
- /* Restore these values to */
- /* master after par region. */
+ int t_first_place; // first & last place in parent thread's partition.
+ int t_last_place; // Restore these values to master after par region.
#endif // OMP_40_ENABLED && KMP_AFFINITY_SUPPORTED
#if KMP_MIC
- int t_size_changed; /* team size was changed?: 0 - no, 1 - yes, -1 - changed via omp_set_num_threads() call */
+ int t_size_changed; // team size was changed?: 0: no, 1: yes, -1: changed via omp_set_num_threads() call
#endif
-/*
- * Read/write by workers as well
- */
+ // Read/write by workers as well -----------------------------------------------------------------------
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
- // Using CACHE_LINE=64 reduces memory footprint,
- // but causes a big perf regression of epcc 'parallel' and 'barrier' on fxe256lin01.
- // This extra padding serves to fix the performance of epcc 'parallel' and 'barrier' when CACHE_LINE=64.
- // TODO: investigate more and get rid if this padding.
+ // Using CACHE_LINE=64 reduces memory footprint, but causes a big perf regression of epcc 'parallel'
+ // and 'barrier' on fxe256lin01. This extra padding serves to fix the performance of epcc 'parallel'
+ // and 'barrier' when CACHE_LINE=64. TODO: investigate more and get rid if this padding.
char dummy_padding[1024];
#endif
- KMP_ALIGN_CACHE
-#if OMP_30_ENABLED
- kmp_taskdata_t *t_implicit_task_taskdata; // Taskdata for the thread's implicit task
-#else
- // Internal control variables for current thread team
- // TODO Convert these fields to an array of kmp_internal_control_t which simplifies parameter passing
- // and also prevents performance degradation due to false sharing when all threads set a control var
- int *t_set_nproc; /* internal control for # of threads for next
- parallel region (per thread) */
- int *t_set_nested; /* internal control for nested parallelism (per thread) */
- int *t_set_dynamic; /* internal control for dynamic adjustment of threads (per thread) */
- int *t_set_blocktime; /* internal control for blocktime */
- int *t_set_bt_intervals; /* internal control for blocktime intervals */
- int *t_set_bt_set; /* internal control for whether blocktime is explicitly set */
-#endif // OMP_30_ENABLED
-
- kmp_internal_control_t *t_control_stack_top; /* internal control stack for additional nested teams.
- for SERIALIZED teams nested 2 or more levels deep */
+ KMP_ALIGN_CACHE kmp_taskdata_t *t_implicit_task_taskdata; // Taskdata for the thread's implicit task
+ kmp_internal_control_t *t_control_stack_top; // internal control stack for additional nested teams.
+ // for SERIALIZED teams nested 2 or more levels deep
#if OMP_40_ENABLED
- kmp_int32 t_cancel_request; /* typed flag to store request state of cancellation */
+ kmp_int32 t_cancel_request; // typed flag to store request state of cancellation
#endif
-
- int t_master_active;/* save on fork, restore on join */
- kmp_taskq_t t_taskq; /* this team's task queue */
- void *t_copypriv_data; /* team specific pointer to copyprivate data array */
+ int t_master_active; // save on fork, restore on join
+ kmp_taskq_t t_taskq; // this team's task queue
+ void *t_copypriv_data; // team specific pointer to copyprivate data array
kmp_uint32 t_copyin_counter;
#if USE_ITT_BUILD
- void *t_stack_id; /* team specific stack stitching id (for ittnotify) */
+ void *t_stack_id; // team specific stack stitching id (for ittnotify)
#endif /* USE_ITT_BUILD */
} kmp_base_team_t;
@@ -2543,6 +2462,7 @@ extern int __kmp_debug_count; /* Counter for number of lines printe
extern int __kmp_debug_buf_warn_chars; /* Keep track of char increase recommended in warnings */
/* end rotating debug buffer */
+#ifdef KMP_DEBUG
extern int __kmp_par_range; /* +1 => only go par for constructs in range */
#define KMP_PAR_RANGE_ROUTINE_LEN 1024
@@ -2551,6 +2471,7 @@ extern char __kmp_par_range_routine[KMP_PAR_RANGE_ROUTINE_LEN];
extern char __kmp_par_range_filename[KMP_PAR_RANGE_FILENAME_LEN];
extern int __kmp_par_range_lb;
extern int __kmp_par_range_ub;
+#endif
/* For printing out dynamic storage map for threads and teams */
extern int __kmp_storage_map; /* True means print storage map for threads and teams */
@@ -2607,14 +2528,13 @@ extern enum library_type __kmp_library;
extern enum sched_type __kmp_sched; /* default runtime scheduling */
extern enum sched_type __kmp_static; /* default static scheduling method */
extern enum sched_type __kmp_guided; /* default guided scheduling method */
-#if OMP_30_ENABLED
extern enum sched_type __kmp_auto; /* default auto scheduling method */
-#endif // OMP_30_ENABLED
extern int __kmp_chunk; /* default runtime chunk size */
extern size_t __kmp_stksize; /* stack size per thread */
extern size_t __kmp_monitor_stksize;/* stack size for monitor thread */
extern size_t __kmp_stkoffset; /* stack offset per thread */
+extern int __kmp_stkpadding; /* Should we pad root thread(s) stack */
extern size_t __kmp_malloc_pool_incr; /* incremental size of pool for kmp_malloc() */
extern int __kmp_env_chunk; /* was KMP_CHUNK specified? */
@@ -2629,7 +2549,7 @@ extern int __kmp_generate_warnings; /* should we issue warnings? */
extern int __kmp_reserve_warn; /* have we issued reserve_threads warning? */
#ifdef DEBUG_SUSPEND
-extern int __kmp_suspend_count; /* count inside __kmp_suspend() */
+extern int __kmp_suspend_count; /* count inside __kmp_suspend_template() */
#endif
extern kmp_uint32 __kmp_yield_init;
@@ -2693,9 +2613,11 @@ extern kmp_int16 __kmp_init_x87_fpu_control_word; /* init thread's FP control r
extern kmp_uint32 __kmp_init_mxcsr; /* init thread's mxscr */
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
-#if OMP_30_ENABLED
extern int __kmp_dflt_max_active_levels; /* max_active_levels for nested parallelism enabled by default a la OMP_MAX_ACTIVE_LEVELS */
-#endif // OMP_30_ENABLED
+#if KMP_NESTED_HOT_TEAMS
+extern int __kmp_hot_teams_mode;
+extern int __kmp_hot_teams_max_level;
+#endif
# if KMP_OS_LINUX
extern enum clock_function_type __kmp_clock_function;
@@ -2833,8 +2755,6 @@ static inline kmp_info_t * __kmp_entry_thread()
return __kmp_threads[gtid];
}
-#if OMP_30_ENABLED
-
extern void __kmp_set_max_active_levels( int gtid, int new_max_active_levels );
extern int __kmp_get_max_active_levels( int gtid );
extern int __kmp_get_ancestor_thread_num( int gtid, int level );
@@ -2842,8 +2762,6 @@ extern int __kmp_get_team_size( int gtid, int level );
extern void __kmp_set_schedule( int gtid, kmp_sched_t new_sched, int chunk );
extern void __kmp_get_schedule( int gtid, kmp_sched_t * sched, int * chunk );
-#endif // OMP_30_ENABLED
-
extern unsigned short __kmp_get_random( kmp_info_t * thread );
extern void __kmp_init_random( kmp_info_t * thread );
@@ -2888,8 +2806,6 @@ extern void __kmp_push_num_teams( ident_t *loc, int gtid, int num_teams, int num
#endif
extern void __kmp_yield( int cond );
-extern void __kmp_release( kmp_info_t *target_thr, volatile kmp_uint *spin,
- enum kmp_mem_fence_type fetchadd_fence );
extern void __kmpc_dispatch_init_4( ident_t *loc, kmp_int32 gtid,
enum sched_type schedule, kmp_int32 lb, kmp_int32 ub, kmp_int32 st,
@@ -2956,11 +2872,28 @@ extern kmp_uint32 __kmp_le_8( kmp_uint64 value, kmp_uint64 checker );
extern kmp_uint32 __kmp_wait_yield_4( kmp_uint32 volatile * spinner, kmp_uint32 checker, kmp_uint32 (*pred) (kmp_uint32, kmp_uint32), void * obj );
extern kmp_uint64 __kmp_wait_yield_8( kmp_uint64 volatile * spinner, kmp_uint64 checker, kmp_uint32 (*pred) (kmp_uint64, kmp_uint64), void * obj );
-extern void __kmp_wait_sleep( kmp_info_t *this_thr, volatile kmp_uint *spinner, kmp_uint checker, kmp_int final_spin
+class kmp_flag_32;
+class kmp_flag_64;
+class kmp_flag_oncore;
+extern void __kmp_wait_32(kmp_info_t *this_thr, kmp_flag_32 *flag, int final_spin
#if USE_ITT_BUILD
- , void * itt_sync_obj
-#endif /* USE_ITT_BUILD */
-);
+ , void * itt_sync_obj
+#endif
+ );
+extern void __kmp_release_32(kmp_flag_32 *flag);
+extern void __kmp_wait_64(kmp_info_t *this_thr, kmp_flag_64 *flag, int final_spin
+#if USE_ITT_BUILD
+ , void * itt_sync_obj
+#endif
+ );
+extern void __kmp_release_64(kmp_flag_64 *flag);
+extern void __kmp_wait_oncore(kmp_info_t *this_thr, kmp_flag_oncore *flag, int final_spin
+#if USE_ITT_BUILD
+ , void * itt_sync_obj
+#endif
+ );
+extern void __kmp_release_oncore(kmp_flag_oncore *flag);
+
extern void __kmp_infinite_loop( void );
extern void __kmp_cleanup( void );
@@ -3003,9 +2936,10 @@ extern int __kmp_aux_set_affinity_mask_proc(int proc, void **mask);
extern int __kmp_aux_unset_affinity_mask_proc(int proc, void **mask);
extern int __kmp_aux_get_affinity_mask_proc(int proc, void **mask);
extern void __kmp_balanced_affinity( int tid, int team_size );
-
#endif /* KMP_AFFINITY_SUPPORTED */
+extern void __kmp_get_hierarchy(kmp_uint32 nproc, kmp_bstate_t *thr_bar);
+
#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
extern int __kmp_futex_determine_capable( void );
@@ -3035,8 +2969,12 @@ extern void __kmp_reap_monitor( kmp_info_t *th );
extern void __kmp_reap_worker( kmp_info_t *th );
extern void __kmp_terminate_thread( int gtid );
-extern void __kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker );
-extern void __kmp_resume( int target_gtid, volatile kmp_uint *spinner );
+extern void __kmp_suspend_32( int th_gtid, kmp_flag_32 *flag );
+extern void __kmp_suspend_64( int th_gtid, kmp_flag_64 *flag );
+extern void __kmp_suspend_oncore( int th_gtid, kmp_flag_oncore *flag );
+extern void __kmp_resume_32( int target_gtid, kmp_flag_32 *flag );
+extern void __kmp_resume_64( int target_gtid, kmp_flag_64 *flag );
+extern void __kmp_resume_oncore( int target_gtid, kmp_flag_oncore *flag );
extern void __kmp_elapsed( double * );
extern void __kmp_elapsed_tick( double * );
@@ -3062,19 +3000,14 @@ extern kmp_info_t * __kmp_allocate_thread( kmp_root_t *root,
extern kmp_team_t * __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
kmp_proc_bind_t proc_bind,
kmp_internal_control_t *new_icvs,
- int argc );
-#elif OMP_30_ENABLED
-extern kmp_team_t * __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
- kmp_internal_control_t *new_icvs,
- int argc );
+ int argc USE_NESTED_HOT_ARG(kmp_info_t *thr) );
#else
extern kmp_team_t * __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
- int new_set_nproc, int new_set_dynamic, int new_set_nested,
- int new_set_blocktime, int new_bt_intervals, int new_bt_set,
- int argc );
-#endif // OMP_30_ENABLED
+ kmp_internal_control_t *new_icvs,
+ int argc USE_NESTED_HOT_ARG(kmp_info_t *thr) );
+#endif // OMP_40_ENABLED
extern void __kmp_free_thread( kmp_info_t * );
-extern void __kmp_free_team( kmp_root_t *, kmp_team_t * );
+extern void __kmp_free_team( kmp_root_t *, kmp_team_t * USE_NESTED_HOT_ARG(kmp_info_t *) );
extern kmp_team_t * __kmp_reap_team( kmp_team_t * );
/* ------------------------------------------------------------------------ */
@@ -3094,7 +3027,16 @@ extern int __kmp_barrier( enum barrier_type bt, int gtid, int is_split,
size_t reduce_size, void *reduce_data, void (*reduce)(void *, void *) );
extern void __kmp_end_split_barrier ( enum barrier_type bt, int gtid );
-extern int __kmp_fork_call( ident_t *loc, int gtid, int exec_master,
+/*!
+ * Tell the fork call which compiler generated the fork call, and therefore how to deal with the call.
+ */
+enum fork_context_e
+{
+ fork_context_gnu, /**< Called from GNU generated code, so must not invoke the microtask internally. */
+ fork_context_intel, /**< Called from Intel generated code. */
+ fork_context_last
+};
+extern int __kmp_fork_call( ident_t *loc, int gtid, enum fork_context_e fork_context,
kmp_int32 argc, microtask_t microtask, launch_t invoker,
/* TODO: revert workaround for Intel(R) 64 tracker #96 */
#if (KMP_ARCH_ARM || KMP_ARCH_X86_64) && KMP_OS_LINUX
@@ -3110,6 +3052,7 @@ extern void __kmp_join_call( ident_t *loc, int gtid
#endif
);
+extern void __kmp_serialized_parallel(ident_t *id, kmp_int32 gtid);
extern void __kmp_internal_fork( ident_t *id, int gtid, kmp_team_t *team );
extern void __kmp_internal_join( ident_t *id, int gtid, kmp_team_t *team );
extern int __kmp_invoke_task_func( int gtid );
@@ -3120,7 +3063,7 @@ extern void __kmp_run_after_invoked_task( int gtid, int tid, kmp_info_t *this_th
KMP_EXPORT int __kmpc_invoke_task_func( int gtid );
#if OMP_40_ENABLED
extern int __kmp_invoke_teams_master( int gtid );
-extern void __kmp_teams_master( microtask_t microtask, int gtid );
+extern void __kmp_teams_master( int gtid );
#endif
extern void __kmp_save_internal_controls( kmp_info_t * thread );
extern void __kmp_user_set_library (enum library_type arg);
@@ -3135,7 +3078,6 @@ void ompc_set_nested( int flag );
void ompc_set_dynamic( int flag );
void ompc_set_num_threads( int arg );
-#if OMP_30_ENABLED
extern void __kmp_push_current_task_to_thread( kmp_info_t *this_thr,
kmp_team_t *team, int tid );
extern void __kmp_pop_current_task_from_thread( kmp_info_t *this_thr );
@@ -3145,12 +3087,25 @@ extern kmp_task_t* __kmp_task_alloc( ident_t *loc_ref, kmp_int32 gtid,
extern void __kmp_init_implicit_task( ident_t *loc_ref, kmp_info_t *this_thr,
kmp_team_t *team, int tid, int set_curr_task );
-extern int __kmp_execute_tasks( kmp_info_t *thread, kmp_int32 gtid, volatile kmp_uint *spinner,
- kmp_uint checker, int final_spin, int *thread_finished,
+int __kmp_execute_tasks_32(kmp_info_t *thread, kmp_int32 gtid, kmp_flag_32 *flag, int final_spin,
+ int *thread_finished,
#if USE_ITT_BUILD
- void * itt_sync_obj,
+ void * itt_sync_obj,
#endif /* USE_ITT_BUILD */
- int c );
+ kmp_int32 is_constrained);
+int __kmp_execute_tasks_64(kmp_info_t *thread, kmp_int32 gtid, kmp_flag_64 *flag, int final_spin,
+ int *thread_finished,
+#if USE_ITT_BUILD
+ void * itt_sync_obj,
+#endif /* USE_ITT_BUILD */
+ kmp_int32 is_constrained);
+int __kmp_execute_tasks_oncore(kmp_info_t *thread, kmp_int32 gtid, kmp_flag_oncore *flag, int final_spin,
+ int *thread_finished,
+#if USE_ITT_BUILD
+ void * itt_sync_obj,
+#endif /* USE_ITT_BUILD */
+ kmp_int32 is_constrained);
+
extern void __kmp_reap_task_teams( void );
extern void __kmp_unref_task_team( kmp_task_team_t *task_team, kmp_info_t *thread );
extern void __kmp_wait_to_unref_task_teams( void );
@@ -3163,8 +3118,6 @@ extern void __kmp_task_team_wait ( kmp_info_t *this_thr, kmp_team_t *team
);
extern void __kmp_tasking_barrier( kmp_team_t *team, kmp_info_t *thread, int gtid );
-#endif // OMP_30_ENABLED
-
extern int __kmp_is_address_mapped( void *addr );
extern kmp_uint64 __kmp_hardware_timestamp(void);
@@ -3259,7 +3212,6 @@ KMP_EXPORT kmpc_thunk_t * __kmpc_task_buffer (ident_t *loc, kmp_int32 global_tid
/* ------------------------------------------------------------------------ */
-#if OMP_30_ENABLED
/*
* OMP 3.0 tasking interface routines
*/
@@ -3288,9 +3240,9 @@ void __kmpc_omp_task_complete( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t *tas
#endif // TASK_UNUSED
/* ------------------------------------------------------------------------ */
-#endif // OMP_30_ENABLED
#if OMP_40_ENABLED
+
KMP_EXPORT void __kmpc_taskgroup( ident_t * loc, int gtid );
KMP_EXPORT void __kmpc_end_taskgroup( ident_t * loc, int gtid );
@@ -3301,13 +3253,13 @@ KMP_EXPORT void __kmpc_omp_wait_deps ( ident_t *loc_ref, kmp_int32 gtid, kmp_int
kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list );
extern void __kmp_release_deps ( kmp_int32 gtid, kmp_taskdata_t *task );
-#endif
+extern kmp_int32 __kmp_omp_task( kmp_int32 gtid, kmp_task_t * new_task, bool serialize_immediate );
-#if OMP_40_ENABLED
KMP_EXPORT kmp_int32 __kmpc_cancel(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind);
KMP_EXPORT kmp_int32 __kmpc_cancellationpoint(ident_t* loc_ref, kmp_int32 gtid, kmp_int32 cncl_kind);
KMP_EXPORT kmp_int32 __kmpc_cancel_barrier(ident_t* loc_ref, kmp_int32 gtid);
KMP_EXPORT int __kmp_get_cancellation_status(int cancel_kind);
+
#endif
/*
@@ -3404,8 +3356,6 @@ kmp_threadprivate_insert( int gtid, void *pc_addr, void *data_addr, size_t pc_si
# define KMPC_CONVENTION
#endif
-#if OMP_30_ENABLED
-
#ifndef __OMP_H
typedef enum omp_sched_t {
omp_sched_static = 1,
@@ -3424,8 +3374,6 @@ KMP_EXPORT int KMPC_CONVENTION kmpc_set_affinity_mask_proc(int, kmp_affinity_ma
KMP_EXPORT int KMPC_CONVENTION kmpc_unset_affinity_mask_proc(int, kmp_affinity_mask_t *);
KMP_EXPORT int KMPC_CONVENTION kmpc_get_affinity_mask_proc(int, kmp_affinity_mask_t *);
-#endif // OMP_30_ENABLED
-
KMP_EXPORT void KMPC_CONVENTION kmpc_set_stacksize(int);
KMP_EXPORT void KMPC_CONVENTION kmpc_set_stacksize_s(size_t);
KMP_EXPORT void KMPC_CONVENTION kmpc_set_library(int);
diff --git a/openmp/runtime/src/kmp_affinity.cpp b/openmp/runtime/src/kmp_affinity.cpp
index 082ec9d6c73..d6821e0440f 100644
--- a/openmp/runtime/src/kmp_affinity.cpp
+++ b/openmp/runtime/src/kmp_affinity.cpp
@@ -1,7 +1,7 @@
/*
* kmp_affinity.cpp -- affinity management
- * $Revision: 42810 $
- * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
*/
@@ -19,7 +19,7 @@
#include "kmp_i18n.h"
#include "kmp_io.h"
#include "kmp_str.h"
-
+#include "kmp_wrapper_getpid.h"
#if KMP_AFFINITY_SUPPORTED
@@ -49,7 +49,7 @@ __kmp_affinity_print_mask(char *buf, int buf_len, kmp_affin_mask_t *mask)
return buf;
}
- sprintf(scan, "{%ld", i);
+ sprintf(scan, "{%ld", (long)i);
while (*scan != '\0') scan++;
i++;
for (; i < KMP_CPU_SETSIZE; i++) {
@@ -66,7 +66,7 @@ __kmp_affinity_print_mask(char *buf, int buf_len, kmp_affin_mask_t *mask)
if (end - scan < 15) {
break;
}
- sprintf(scan, ",%-ld", i);
+ sprintf(scan, ",%-ld", (long)i);
while (*scan != '\0') scan++;
}
if (i < KMP_CPU_SETSIZE) {
@@ -89,7 +89,6 @@ __kmp_affinity_entire_machine_mask(kmp_affin_mask_t *mask)
if (__kmp_num_proc_groups > 1) {
int group;
- struct GROUP_AFFINITY ga;
KMP_DEBUG_ASSERT(__kmp_GetActiveProcessorCount != NULL);
for (group = 0; group < __kmp_num_proc_groups; group++) {
int i;
@@ -315,6 +314,106 @@ __kmp_affinity_cmp_Address_child_num(const void *a, const void *b)
return 0;
}
+/** A structure for holding machine-specific hierarchy info to be computed once at init. */
+class hierarchy_info {
+public:
+ /** Typical levels are threads/core, cores/package or socket, packages/node, nodes/machine,
+ etc. We don't want to get specific with nomenclature */
+ static const kmp_uint32 maxLevels=7;
+
+ /** This is specifically the depth of the machine configuration hierarchy, in terms of the
+ number of levels along the longest path from root to any leaf. It corresponds to the
+ number of entries in numPerLevel if we exclude all but one trailing 1. */
+ kmp_uint32 depth;
+ kmp_uint32 base_depth;
+ kmp_uint32 base_num_threads;
+ bool uninitialized;
+
+ /** Level 0 corresponds to leaves. numPerLevel[i] is the number of children the parent of a
+ node at level i has. For example, if we have a machine with 4 packages, 4 cores/package
+ and 2 HT per core, then numPerLevel = {2, 4, 4, 1, 1}. All empty levels are set to 1. */
+ kmp_uint32 numPerLevel[maxLevels];
+ kmp_uint32 skipPerLevel[maxLevels];
+
+ void deriveLevels(AddrUnsPair *adr2os, int num_addrs) {
+ int hier_depth = adr2os[0].first.depth;
+ int level = 0;
+ for (int i=hier_depth-1; i>=0; --i) {
+ int max = -1;
+ for (int j=0; j<num_addrs; ++j) {
+ int next = adr2os[j].first.childNums[i];
+ if (next > max) max = next;
+ }
+ numPerLevel[level] = max+1;
+ ++level;
+ }
+ }
+
+ hierarchy_info() : depth(1), uninitialized(true) {}
+ void init(AddrUnsPair *adr2os, int num_addrs)
+ {
+ uninitialized = false;
+ for (kmp_uint32 i=0; i<maxLevels; ++i) { // init numPerLevel[*] to 1 item per level
+ numPerLevel[i] = 1;
+ skipPerLevel[i] = 1;
+ }
+
+ // Sort table by physical ID
+ if (adr2os) {
+ qsort(adr2os, num_addrs, sizeof(*adr2os), __kmp_affinity_cmp_Address_labels);
+ deriveLevels(adr2os, num_addrs);
+ }
+ else {
+ numPerLevel[0] = 4;
+ numPerLevel[1] = num_addrs/4;
+ if (num_addrs%4) numPerLevel[1]++;
+ }
+
+ base_num_threads = num_addrs;
+ for (int i=maxLevels-1; i>=0; --i) // count non-empty levels to get depth
+ if (numPerLevel[i] != 1 || depth > 1) // only count one top-level '1'
+ depth++;
+
+ kmp_uint32 branch = 4;
+ if (numPerLevel[0] == 1) branch = num_addrs/4;
+ if (branch<4) branch=4;
+ for (kmp_uint32 d=0; d<depth-1; ++d) { // optimize hierarchy width
+ while (numPerLevel[d] > branch || (d==0 && numPerLevel[d]>4)) { // max 4 on level 0!
+ if (numPerLevel[d] & 1) numPerLevel[d]++;
+ numPerLevel[d] = numPerLevel[d] >> 1;
+ if (numPerLevel[d+1] == 1) depth++;
+ numPerLevel[d+1] = numPerLevel[d+1] << 1;
+ }
+ if(numPerLevel[0] == 1) {
+ branch = branch >> 1;
+ if (branch<4) branch = 4;
+ }
+ }
+
+ for (kmp_uint32 i=1; i<depth; ++i)
+ skipPerLevel[i] = numPerLevel[i-1] * skipPerLevel[i-1];
+
+ base_depth = depth;
+ }
+};
+
+static hierarchy_info machine_hierarchy;
+
+void __kmp_get_hierarchy(kmp_uint32 nproc, kmp_bstate_t *thr_bar) {
+ if (machine_hierarchy.uninitialized)
+ machine_hierarchy.init(NULL, nproc);
+
+ if (nproc <= machine_hierarchy.base_num_threads)
+ machine_hierarchy.depth = machine_hierarchy.base_depth;
+ KMP_DEBUG_ASSERT(machine_hierarchy.depth > 0);
+ while (nproc > machine_hierarchy.skipPerLevel[machine_hierarchy.depth-1]) {
+ machine_hierarchy.depth++;
+ machine_hierarchy.skipPerLevel[machine_hierarchy.depth-1] = 2*machine_hierarchy.skipPerLevel[machine_hierarchy.depth-2];
+ }
+ thr_bar->depth = machine_hierarchy.depth;
+ thr_bar->base_leaf_kids = (kmp_uint8)machine_hierarchy.numPerLevel[0]-1;
+ thr_bar->skip_per_level = machine_hierarchy.skipPerLevel;
+}
//
// When sorting by labels, __kmp_affinity_assign_child_nums() must first be
@@ -1963,7 +2062,7 @@ __kmp_affinity_create_cpuinfo_map(AddrUnsPair **address2os, int *line,
// A newline has signalled the end of the processor record.
// Check that there aren't too many procs specified.
//
- if (num_avail == __kmp_xproc) {
+ if ((int)num_avail == __kmp_xproc) {
CLEANUP_THREAD_INFO;
*msg_id = kmp_i18n_str_TooManyEntries;
return -1;
@@ -2587,7 +2686,7 @@ static int nextNewMask;
#define ADD_MASK_OSID(_osId,_osId2Mask,_maxOsId) \
{ \
if (((_osId) > _maxOsId) || \
- (! KMP_CPU_ISSET((_osId), KMP_CPU_INDEX(_osId2Mask, (_osId))))) {\
+ (! KMP_CPU_ISSET((_osId), KMP_CPU_INDEX((_osId2Mask), (_osId))))) { \
if (__kmp_affinity_verbose || (__kmp_affinity_warnings \
&& (__kmp_affinity_type != affinity_none))) { \
KMP_WARNING(AffIgnoreInvalidProcID, _osId); \
@@ -3045,14 +3144,15 @@ __kmp_process_place(const char **scan, kmp_affin_mask_t *osId2Mask,
(*setSize)++;
}
*scan = next; // skip num
- }
+ }
else {
KMP_ASSERT2(0, "bad explicit places list");
}
}
-static void
+//static void
+void
__kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
unsigned int *out_numMasks, const char *placelist,
kmp_affin_mask_t *osId2Mask, int maxOsId)
@@ -3109,71 +3209,41 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
// valid follow sets are ',' ':' and EOL
//
SKIP_WS(scan);
+ int stride;
if (*scan == '\0' || *scan == ',') {
- int i;
- for (i = 0; i < count; i++) {
- int j;
- if (setSize == 0) {
- break;
- }
- ADD_MASK(tempMask);
- setSize = 0;
- for (j = __kmp_affin_mask_size * CHAR_BIT - 1; j > 0; j--) {
- //
- // Use a temp var in case macro is changed to evaluate
- // args multiple times.
- //
- if (KMP_CPU_ISSET(j - 1, tempMask)) {
- KMP_CPU_SET(j, tempMask);
- setSize++;
- }
- else {
- KMP_CPU_CLR(j, tempMask);
- }
+ stride = +1;
+ }
+ else {
+ KMP_ASSERT2(*scan == ':', "bad explicit places list");
+ scan++; // skip ':'
+
+ //
+ // Read stride parameter
+ //
+ int sign = +1;
+ for (;;) {
+ SKIP_WS(scan);
+ if (*scan == '+') {
+ scan++; // skip '+'
+ continue;
}
- for (; j >= 0; j--) {
- KMP_CPU_CLR(j, tempMask);
+ if (*scan == '-') {
+ sign *= -1;
+ scan++; // skip '-'
+ continue;
}
- }
- KMP_CPU_ZERO(tempMask);
- setSize = 0;
-
- if (*scan == '\0') {
break;
}
- scan++; // skip ','
- continue;
- }
-
- KMP_ASSERT2(*scan == ':', "bad explicit places list");
- scan++; // skip ':'
-
- //
- // Read stride parameter
- //
- int sign = +1;
- for (;;) {
SKIP_WS(scan);
- if (*scan == '+') {
- scan++; // skip '+'
- continue;
- }
- if (*scan == '-') {
- sign *= -1;
- scan++; // skip '-'
- continue;
- }
- break;
+ KMP_ASSERT2((*scan >= '0') && (*scan <= '9'),
+ "bad explicit places list");
+ next = scan;
+ SKIP_DIGITS(next);
+ stride = __kmp_str_to_int(scan, *next);
+ KMP_DEBUG_ASSERT(stride >= 0);
+ scan = next;
+ stride *= sign;
}
- SKIP_WS(scan);
- KMP_ASSERT2((*scan >= '0') && (*scan <= '9'),
- "bad explicit places list");
- next = scan;
- SKIP_DIGITS(next);
- int stride = __kmp_str_to_int(scan, *next);
- KMP_DEBUG_ASSERT(stride >= 0);
- scan = next;
- stride *= sign;
if (stride > 0) {
int i;
@@ -3185,13 +3255,21 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
ADD_MASK(tempMask);
setSize = 0;
for (j = __kmp_affin_mask_size * CHAR_BIT - 1; j >= stride; j--) {
- if (KMP_CPU_ISSET(j - stride, tempMask)) {
- KMP_CPU_SET(j, tempMask);
- setSize++;
+ if (! KMP_CPU_ISSET(j - stride, tempMask)) {
+ KMP_CPU_CLR(j, tempMask);
}
- else {
+ else if ((j > maxOsId) ||
+ (! KMP_CPU_ISSET(j, KMP_CPU_INDEX(osId2Mask, j)))) {
+ if (__kmp_affinity_verbose || (__kmp_affinity_warnings
+ && (__kmp_affinity_type != affinity_none))) {
+ KMP_WARNING(AffIgnoreInvalidProcID, j);
+ }
KMP_CPU_CLR(j, tempMask);
}
+ else {
+ KMP_CPU_SET(j, tempMask);
+ setSize++;
+ }
}
for (; j >= 0; j--) {
KMP_CPU_CLR(j, tempMask);
@@ -3201,23 +3279,31 @@ __kmp_affinity_process_placelist(kmp_affin_mask_t **out_masks,
else {
int i;
for (i = 0; i < count; i++) {
- unsigned j;
+ int j;
if (setSize == 0) {
break;
}
ADD_MASK(tempMask);
setSize = 0;
- for (j = 0; j < (__kmp_affin_mask_size * CHAR_BIT) + stride;
+ for (j = 0; j < ((int)__kmp_affin_mask_size * CHAR_BIT) + stride;
j++) {
- if (KMP_CPU_ISSET(j - stride, tempMask)) {
- KMP_CPU_SET(j, tempMask);
- setSize++;
+ if (! KMP_CPU_ISSET(j - stride, tempMask)) {
+ KMP_CPU_CLR(j, tempMask);
}
- else {
+ else if ((j > maxOsId) ||
+ (! KMP_CPU_ISSET(j, KMP_CPU_INDEX(osId2Mask, j)))) {
+ if (__kmp_affinity_verbose || (__kmp_affinity_warnings
+ && (__kmp_affinity_type != affinity_none))) {
+ KMP_WARNING(AffIgnoreInvalidProcID, j);
+ }
KMP_CPU_CLR(j, tempMask);
}
+ else {
+ KMP_CPU_SET(j, tempMask);
+ setSize++;
+ }
}
- for (; j < __kmp_affin_mask_size * CHAR_BIT; j++) {
+ for (; j < (int)__kmp_affin_mask_size * CHAR_BIT; j++) {
KMP_CPU_CLR(j, tempMask);
}
}
@@ -3270,9 +3356,13 @@ __kmp_apply_thread_places(AddrUnsPair **pAddr, int depth)
}
__kmp_place_num_cores = nCoresPerPkg; // use all available cores
}
- if ( !__kmp_affinity_uniform_topology() || depth != 3 ) {
- KMP_WARNING( AffThrPlaceUnsupported );
- return; // don't support non-uniform topology or not-3-level architecture
+ if ( !__kmp_affinity_uniform_topology() ) {
+ KMP_WARNING( AffThrPlaceNonUniform );
+ return; // don't support non-uniform topology
+ }
+ if ( depth != 3 ) {
+ KMP_WARNING( AffThrPlaceNonThreeLevel );
+ return; // don't support not-3-level topology
}
if ( __kmp_place_num_threads_per_core == 0 ) {
__kmp_place_num_threads_per_core = __kmp_nThreadsPerCore; // use all HW contexts
@@ -3400,18 +3490,14 @@ __kmp_aux_affinity_initialize(void)
}
if (depth < 0) {
- if ((msg_id != kmp_i18n_null)
- && (__kmp_affinity_verbose || (__kmp_affinity_warnings
- && (__kmp_affinity_type != affinity_none)))) {
-# if KMP_MIC
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity_verbose) {
+ if (msg_id != kmp_i18n_null) {
KMP_INFORM(AffInfoStrStr, "KMP_AFFINITY", __kmp_i18n_catgets(msg_id),
KMP_I18N_STR(DecodingLegacyAPIC));
}
-# else
- KMP_WARNING(AffInfoStrStr, "KMP_AFFINITY", __kmp_i18n_catgets(msg_id),
- KMP_I18N_STR(DecodingLegacyAPIC));
-# endif
+ else {
+ KMP_INFORM(AffInfoStr, "KMP_AFFINITY", KMP_I18N_STR(DecodingLegacyAPIC));
+ }
}
file_name = NULL;
@@ -3428,19 +3514,13 @@ __kmp_aux_affinity_initialize(void)
# if KMP_OS_LINUX
if (depth < 0) {
- if ((msg_id != kmp_i18n_null)
- && (__kmp_affinity_verbose || (__kmp_affinity_warnings
- && (__kmp_affinity_type != affinity_none)))) {
-# if KMP_MIC
- if (__kmp_affinity_verbose) {
+ if (__kmp_affinity_verbose) {
+ if (msg_id != kmp_i18n_null) {
KMP_INFORM(AffStrParseFilename, "KMP_AFFINITY", __kmp_i18n_catgets(msg_id), "/proc/cpuinfo");
}
-# else
- KMP_WARNING(AffStrParseFilename, "KMP_AFFINITY", __kmp_i18n_catgets(msg_id), "/proc/cpuinfo");
-# endif
- }
- else if (__kmp_affinity_verbose) {
- KMP_INFORM(AffParseFilename, "KMP_AFFINITY", "/proc/cpuinfo");
+ else {
+ KMP_INFORM(AffParseFilename, "KMP_AFFINITY", "/proc/cpuinfo");
+ }
}
FILE *f = fopen("/proc/cpuinfo", "r");
@@ -3461,20 +3541,32 @@ __kmp_aux_affinity_initialize(void)
# endif /* KMP_OS_LINUX */
+# if KMP_OS_WINDOWS && KMP_ARCH_X86_64
+
+ if ((depth < 0) && (__kmp_num_proc_groups > 1)) {
+ if (__kmp_affinity_verbose) {
+ KMP_INFORM(AffWindowsProcGroupMap, "KMP_AFFINITY");
+ }
+
+ depth = __kmp_affinity_create_proc_group_map(&address2os, &msg_id);
+ KMP_ASSERT(depth != 0);
+ }
+
+# endif /* KMP_OS_WINDOWS && KMP_ARCH_X86_64 */
+
if (depth < 0) {
- if (msg_id != kmp_i18n_null
- && (__kmp_affinity_verbose || (__kmp_affinity_warnings
- && (__kmp_affinity_type != affinity_none)))) {
+ if (__kmp_affinity_verbose && (msg_id != kmp_i18n_null)) {
if (file_name == NULL) {
- KMP_WARNING(UsingFlatOS, __kmp_i18n_catgets(msg_id));
+ KMP_INFORM(UsingFlatOS, __kmp_i18n_catgets(msg_id));
}
else if (line == 0) {
- KMP_WARNING(UsingFlatOSFile, file_name, __kmp_i18n_catgets(msg_id));
+ KMP_INFORM(UsingFlatOSFile, file_name, __kmp_i18n_catgets(msg_id));
}
else {
- KMP_WARNING(UsingFlatOSFileLine, file_name, line, __kmp_i18n_catgets(msg_id));
+ KMP_INFORM(UsingFlatOSFileLine, file_name, line, __kmp_i18n_catgets(msg_id));
}
}
+ // FIXME - print msg if msg_id = kmp_i18n_null ???
file_name = "";
depth = __kmp_affinity_create_flat_map(&address2os, &msg_id);
@@ -3508,7 +3600,6 @@ __kmp_aux_affinity_initialize(void)
KMP_ASSERT(address2os == NULL);
return;
}
-
if (depth < 0) {
KMP_ASSERT(msg_id != kmp_i18n_null);
KMP_FATAL(MsgExiting, __kmp_i18n_catgets(msg_id));
@@ -3526,7 +3617,6 @@ __kmp_aux_affinity_initialize(void)
KMP_ASSERT(address2os == NULL);
return;
}
-
if (depth < 0) {
KMP_ASSERT(msg_id != kmp_i18n_null);
KMP_FATAL(MsgExiting, __kmp_i18n_catgets(msg_id));
@@ -3597,23 +3687,9 @@ __kmp_aux_affinity_initialize(void)
depth = __kmp_affinity_create_proc_group_map(&address2os, &msg_id);
KMP_ASSERT(depth != 0);
-
if (depth < 0) {
- if ((msg_id != kmp_i18n_null)
- && (__kmp_affinity_verbose || (__kmp_affinity_warnings
- && (__kmp_affinity_type != affinity_none)))) {
- KMP_WARNING(UsingFlatOS, __kmp_i18n_catgets(msg_id));
- }
-
- depth = __kmp_affinity_create_flat_map(&address2os, &msg_id);
- if (depth == 0) {
- KMP_ASSERT(__kmp_affinity_type == affinity_none);
- KMP_ASSERT(address2os == NULL);
- return;
- }
- // should not fail
- KMP_ASSERT(depth > 0);
- KMP_ASSERT(address2os != NULL);
+ KMP_ASSERT(msg_id != kmp_i18n_null);
+ KMP_FATAL(MsgExiting, __kmp_i18n_catgets(msg_id));
}
}
@@ -3658,7 +3734,7 @@ __kmp_aux_affinity_initialize(void)
kmp_affin_mask_t *osId2Mask = __kmp_create_masks(&maxIndex, &numUnique,
address2os, __kmp_avail_proc);
if (__kmp_affinity_gran_levels == 0) {
- KMP_DEBUG_ASSERT(numUnique == __kmp_avail_proc);
+ KMP_DEBUG_ASSERT((int)numUnique == __kmp_avail_proc);
}
//
@@ -3852,6 +3928,7 @@ __kmp_aux_affinity_initialize(void)
}
__kmp_free(osId2Mask);
+ machine_hierarchy.init(address2os, __kmp_avail_proc);
}
@@ -3953,7 +4030,7 @@ __kmp_affinity_set_init_mask(int gtid, int isa_root)
}
# endif
KMP_ASSERT(fullMask != NULL);
- i = -1;
+ i = KMP_PLACE_ALL;
mask = fullMask;
}
else {
@@ -4020,7 +4097,8 @@ __kmp_affinity_set_init_mask(int gtid, int isa_root)
char buf[KMP_AFFIN_MASK_PRINT_LEN];
__kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN,
th->th.th_affin_mask);
- KMP_INFORM(BoundToOSProcSet, "KMP_AFFINITY", gtid, buf);
+ KMP_INFORM(BoundToOSProcSet, "KMP_AFFINITY", (kmp_int32)getpid(), gtid,
+ buf);
}
# if KMP_OS_WINDOWS
@@ -4058,14 +4136,14 @@ __kmp_affinity_set_place(int gtid)
// Check that the new place is within this thread's partition.
//
KMP_DEBUG_ASSERT(th->th.th_affin_mask != NULL);
- KMP_DEBUG_ASSERT(th->th.th_new_place >= 0);
- KMP_DEBUG_ASSERT((unsigned)th->th.th_new_place <= __kmp_affinity_num_masks);
+ KMP_ASSERT(th->th.th_new_place >= 0);
+ KMP_ASSERT((unsigned)th->th.th_new_place <= __kmp_affinity_num_masks);
if (th->th.th_first_place <= th->th.th_last_place) {
- KMP_DEBUG_ASSERT((th->th.th_new_place >= th->th.th_first_place)
+ KMP_ASSERT((th->th.th_new_place >= th->th.th_first_place)
&& (th->th.th_new_place <= th->th.th_last_place));
}
else {
- KMP_DEBUG_ASSERT((th->th.th_new_place <= th->th.th_first_place)
+ KMP_ASSERT((th->th.th_new_place <= th->th.th_first_place)
|| (th->th.th_new_place >= th->th.th_last_place));
}
@@ -4082,7 +4160,8 @@ __kmp_affinity_set_place(int gtid)
char buf[KMP_AFFIN_MASK_PRINT_LEN];
__kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN,
th->th.th_affin_mask);
- KMP_INFORM(BoundToOSProcSet, "OMP_PROC_BIND", gtid, buf);
+ KMP_INFORM(BoundToOSProcSet, "OMP_PROC_BIND", (kmp_int32)getpid(),
+ gtid, buf);
}
__kmp_set_system_affinity(th->th.th_affin_mask, TRUE);
}
@@ -4153,6 +4232,11 @@ __kmp_aux_set_affinity(void **mask)
th->th.th_new_place = KMP_PLACE_UNDEFINED;
th->th.th_first_place = 0;
th->th.th_last_place = __kmp_affinity_num_masks - 1;
+
+ //
+ // Turn off 4.0 affinity for the current tread at this parallel level.
+ //
+ th->th.th_current_task->td_icvs.proc_bind = proc_bind_false;
# endif
return retval;
@@ -4207,7 +4291,6 @@ __kmp_aux_get_affinity(void **mask)
}
-
int
__kmp_aux_set_affinity_mask_proc(int proc, void **mask)
{
@@ -4360,7 +4443,8 @@ void __kmp_balanced_affinity( int tid, int nthreads )
if (__kmp_affinity_verbose) {
char buf[KMP_AFFIN_MASK_PRINT_LEN];
__kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN, mask);
- KMP_INFORM(BoundToOSProcSet, "KMP_AFFINITY", tid, buf);
+ KMP_INFORM(BoundToOSProcSet, "KMP_AFFINITY", (kmp_int32)getpid(),
+ tid, buf);
}
__kmp_set_system_affinity( mask, TRUE );
} else { // Non-uniform topology
@@ -4535,7 +4619,8 @@ void __kmp_balanced_affinity( int tid, int nthreads )
if (__kmp_affinity_verbose) {
char buf[KMP_AFFIN_MASK_PRINT_LEN];
__kmp_affinity_print_mask(buf, KMP_AFFIN_MASK_PRINT_LEN, mask);
- KMP_INFORM(BoundToOSProcSet, "KMP_AFFINITY", tid, buf);
+ KMP_INFORM(BoundToOSProcSet, "KMP_AFFINITY", (kmp_int32)getpid(),
+ tid, buf);
}
__kmp_set_system_affinity( mask, TRUE );
}
@@ -4543,4 +4628,50 @@ void __kmp_balanced_affinity( int tid, int nthreads )
# endif /* KMP_MIC */
+#else
+ // affinity not supported
+
+kmp_uint32 mac_skipPerLevel[7];
+kmp_uint32 mac_depth;
+kmp_uint8 mac_leaf_kids;
+void __kmp_get_hierarchy(kmp_uint32 nproc, kmp_bstate_t *thr_bar) {
+ static int first = 1;
+ if (first) {
+ const kmp_uint32 maxLevels = 7;
+ kmp_uint32 numPerLevel[maxLevels];
+
+ for (kmp_uint32 i=0; i<maxLevels; ++i) { // init numPerLevel[*] to 1 item per level
+ numPerLevel[i] = 1;
+ mac_skipPerLevel[i] = 1;
+ }
+
+ mac_depth = 2;
+ numPerLevel[0] = nproc;
+
+ kmp_uint32 branch = 4;
+ if (numPerLevel[0] == 1) branch = nproc/4;
+ if (branch<4) branch=4;
+ for (kmp_uint32 d=0; d<mac_depth-1; ++d) { // optimize hierarchy width
+ while (numPerLevel[d] > branch || (d==0 && numPerLevel[d]>4)) { // max 4 on level 0!
+ if (numPerLevel[d] & 1) numPerLevel[d]++;
+ numPerLevel[d] = numPerLevel[d] >> 1;
+ if (numPerLevel[d+1] == 1) mac_depth++;
+ numPerLevel[d+1] = numPerLevel[d+1] << 1;
+ }
+ if(numPerLevel[0] == 1) {
+ branch = branch >> 1;
+ if (branch<4) branch = 4;
+ }
+ }
+
+ for (kmp_uint32 i=1; i<mac_depth; ++i)
+ mac_skipPerLevel[i] = numPerLevel[i-1] * mac_skipPerLevel[i-1];
+ mac_leaf_kids = (kmp_uint8)numPerLevel[0]-1;
+ first=0;
+ }
+ thr_bar->depth = mac_depth;
+ thr_bar->base_leaf_kids = mac_leaf_kids;
+ thr_bar->skip_per_level = mac_skipPerLevel;
+}
+
#endif // KMP_AFFINITY_SUPPORTED
diff --git a/openmp/runtime/src/kmp_alloc.c b/openmp/runtime/src/kmp_alloc.c
index 885754fd006..18f62365f74 100644
--- a/openmp/runtime/src/kmp_alloc.c
+++ b/openmp/runtime/src/kmp_alloc.c
@@ -1,7 +1,7 @@
/*
* kmp_alloc.c -- private/shared dyanmic memory allocation and management
- * $Revision: 42810 $
- * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+ * $Revision: 43450 $
+ * $Date: 2014-09-09 10:07:22 -0500 (Tue, 09 Sep 2014) $
*/
@@ -1228,7 +1228,7 @@ bpoold( kmp_info_t *th, void *buf, int dumpalloc, int dumpfree)
bufdump( th, (void *) (((char *) b) + sizeof(bhead_t)));
}
} else {
- char *lerr = "";
+ const char *lerr = "";
KMP_DEBUG_ASSERT(bs > 0);
if ((b->ql.blink->ql.flink != b) || (b->ql.flink->ql.blink != b)) {
@@ -1772,7 +1772,11 @@ ___kmp_free( void * ptr KMP_SRC_LOC_DECL )
#ifndef LEAK_MEMORY
KE_TRACE( 10, ( " free( %p )\n", descr.ptr_allocated ) );
+ # ifdef KMP_DEBUG
+ _free_src_loc( descr.ptr_allocated, _file_, _line_ );
+ # else
free_src_loc( descr.ptr_allocated KMP_SRC_LOC_PARM );
+ # endif
#endif
KMP_MB();
@@ -1790,7 +1794,7 @@ ___kmp_free( void * ptr KMP_SRC_LOC_DECL )
// Otherwise allocate normally using kmp_thread_malloc.
// AC: How to choose the limit? Just get 16 for now...
-static int const __kmp_free_list_limit = 16;
+#define KMP_FREE_LIST_LIMIT 16
// Always use 128 bytes for determining buckets for caching memory blocks
#define DCACHE_LINE 128
@@ -1932,7 +1936,7 @@ ___kmp_fast_free( kmp_info_t *this_thr, void * ptr KMP_SRC_LOC_DECL )
kmp_mem_descr_t * dsc = (kmp_mem_descr_t *)( (char*)head - sizeof(kmp_mem_descr_t) );
kmp_info_t * q_th = (kmp_info_t *)(dsc->ptr_aligned); // allocating thread, same for all queue nodes
size_t q_sz = dsc->size_allocated + 1; // new size in case we add current task
- if ( q_th == alloc_thr && q_sz <= __kmp_free_list_limit ) {
+ if ( q_th == alloc_thr && q_sz <= KMP_FREE_LIST_LIMIT ) {
// we can add current task to "other" list, no sync needed
*((void **)ptr) = head;
descr->size_allocated = q_sz;
diff --git a/openmp/runtime/src/kmp_atomic.c b/openmp/runtime/src/kmp_atomic.c
index 3e9c82f874f..6613c6da76c 100644
--- a/openmp/runtime/src/kmp_atomic.c
+++ b/openmp/runtime/src/kmp_atomic.c
@@ -1,7 +1,7 @@
/*
* kmp_atomic.c -- ATOMIC implementation routines
- * $Revision: 42810 $
- * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+ * $Revision: 43421 $
+ * $Date: 2014-08-28 08:56:10 -0500 (Thu, 28 Aug 2014) $
*/
@@ -690,7 +690,7 @@ RET_TYPE __kmpc_atomic_##TYPE_ID##_##OP_ID( ident_t *id_ref, int gtid, TYPE * lh
#endif /* KMP_GOMP_COMPAT */
#if KMP_MIC
-# define KMP_DO_PAUSE _mm_delay_32( 30 )
+# define KMP_DO_PAUSE _mm_delay_32( 1 )
#else
# define KMP_DO_PAUSE KMP_CPU_PAUSE()
#endif /* KMP_MIC */
@@ -700,14 +700,10 @@ RET_TYPE __kmpc_atomic_##TYPE_ID##_##OP_ID( ident_t *id_ref, int gtid, TYPE * lh
// TYPE - operands' type
// BITS - size in bits, used to distinguish low level calls
// OP - operator
-// Note: temp_val introduced in order to force the compiler to read
-// *lhs only once (w/o it the compiler reads *lhs twice)
#define OP_CMPXCHG(TYPE,BITS,OP) \
{ \
- TYPE KMP_ATOMIC_VOLATILE temp_val; \
TYPE old_value, new_value; \
- temp_val = *lhs; \
- old_value = temp_val; \
+ old_value = *(TYPE volatile *)lhs; \
new_value = old_value OP rhs; \
while ( ! KMP_COMPARE_AND_STORE_ACQ##BITS( (kmp_int##BITS *) lhs, \
*VOLATILE_CAST(kmp_int##BITS *) &old_value, \
@@ -715,8 +711,7 @@ RET_TYPE __kmpc_atomic_##TYPE_ID##_##OP_ID( ident_t *id_ref, int gtid, TYPE * lh
{ \
KMP_DO_PAUSE; \
\
- temp_val = *lhs; \
- old_value = temp_val; \
+ old_value = *(TYPE volatile *)lhs; \
new_value = old_value OP rhs; \
} \
}
@@ -765,13 +760,6 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) \
KMP_TEST_THEN_ADD##BITS( lhs, OP rhs ); \
}
// -------------------------------------------------------------------------
-#define ATOMIC_FLOAT_ADD(TYPE_ID,OP_ID,TYPE,BITS,OP,LCK_ID,MASK,GOMP_FLAG) \
-ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) \
- OP_GOMP_CRITICAL(OP##=,GOMP_FLAG) \
- /* OP used as a sign for subtraction: (lhs-rhs) --> (lhs+-rhs) */ \
- KMP_TEST_THEN_ADD_REAL##BITS( lhs, OP rhs ); \
-}
-// -------------------------------------------------------------------------
#define ATOMIC_CMPXCHG(TYPE_ID,OP_ID,TYPE,BITS,OP,LCK_ID,MASK,GOMP_FLAG) \
ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) \
OP_GOMP_CRITICAL(OP##=,GOMP_FLAG) \
@@ -803,17 +791,6 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) \
} \
}
// -------------------------------------------------------------------------
-#define ATOMIC_FLOAT_ADD(TYPE_ID,OP_ID,TYPE,BITS,OP,LCK_ID,MASK,GOMP_FLAG) \
-ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) \
- OP_GOMP_CRITICAL(OP##=,GOMP_FLAG) \
- if ( ! ( (kmp_uintptr_t) lhs & 0x##MASK) ) { \
- OP_CMPXCHG(TYPE,BITS,OP) /* aligned address */ \
- } else { \
- KMP_CHECK_GTID; \
- OP_CRITICAL(OP##=,LCK_ID) /* unaligned address - use critical */ \
- } \
-}
-// -------------------------------------------------------------------------
#define ATOMIC_CMPXCHG(TYPE_ID,OP_ID,TYPE,BITS,OP,LCK_ID,MASK,GOMP_FLAG) \
ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void) \
OP_GOMP_CRITICAL(OP##=,GOMP_FLAG) \
@@ -845,25 +822,15 @@ ATOMIC_BEGIN(TYPE_ID,OP_ID,TYPE,void)
ATOMIC_FIXED_ADD( fixed4, add, kmp_int32, 32, +, 4i, 3, 0 ) // __kmpc_atomic_fixed4_add
ATOMIC_FIXED_ADD( fixed4, sub, kmp_int32, 32, -, 4i, 3, 0 ) // __kmpc_atomic_fixed4_sub
-#if KMP_MIC
ATOMIC_CMPXCHG( float4, add, kmp_real32, 32, +, 4r, 3, KMP_ARCH_X86 ) // __kmpc_atomic_float4_add
ATOMIC_CMPXCHG( float4, sub, kmp_real32, 32, -, 4r, 3, KMP_ARCH_X86 ) // __kmpc_atomic_float4_sub
-#else
-ATOMIC_FLOAT_ADD( float4, add, kmp_real32, 32, +, 4r, 3, KMP_ARCH_X86 ) // __kmpc_atomic_float4_add
-ATOMIC_FLOAT_ADD( float4, sub, kmp_real32, 32, -, 4r, 3, KMP_ARCH_X86 ) // __kmpc_atomic_float4_sub
-#endif // KMP_MIC
// Routines for ATOMIC 8-byte operands addition and subtraction
ATOMIC_FIXED_ADD( fixed8, add, kmp_int64, 64, +, 8i, 7, KMP_ARCH_X86 ) // __kmpc_atomic_fixed8_add
ATOMIC_FIXED_ADD( fixed8, sub, kmp_int64, 64, -, 8i, 7, KMP_ARCH_X86 ) // __kmpc_atomic_fixed8_sub
-#if KMP_MIC
ATOMIC_CMPXCHG( float8, add, kmp_real64, 64, +, 8r, 7, KMP_ARCH_X86 ) // __kmpc_atomic_float8_add
ATOMIC_CMPXCHG( float8, sub, kmp_real64, 64, -, 8r, 7, KMP_ARCH_X86 ) // __kmpc_atomic_float8_sub
-#else
-ATOMIC_FLOAT_ADD( float8, add, kmp_real64, 64, +, 8r, 7, KMP_ARCH_X86 ) // __kmpc_atomic_float8_add
-ATOMIC_FLOAT_ADD( float8, sub, kmp_real64, 64, -, 8r, 7, KMP_ARCH_X86 ) // __kmpc_atomic_float8_sub
-#endif // KMP_MIC
// ------------------------------------------------------------------------
// Entries definition for integer operands
@@ -1867,35 +1834,16 @@ ATOMIC_BEGIN_CPT(TYPE_ID,OP_ID,TYPE,TYPE) \
return old_value; \
}
// -------------------------------------------------------------------------
-#define ATOMIC_FLOAT_ADD_CPT(TYPE_ID,OP_ID,TYPE,BITS,OP,GOMP_FLAG) \
-ATOMIC_BEGIN_CPT(TYPE_ID,OP_ID,TYPE,TYPE) \
- TYPE old_value, new_value; \
- OP_GOMP_CRITICAL_CPT(OP,GOMP_FLAG) \
- /* OP used as a sign for subtraction: (lhs-rhs) --> (lhs+-rhs) */ \
- old_value = KMP_TEST_THEN_ADD_REAL##BITS( lhs, OP rhs ); \
- if( flag ) { \
- return old_value OP rhs; \
- } else \
- return old_value; \
-}
-// -------------------------------------------------------------------------
ATOMIC_FIXED_ADD_CPT( fixed4, add_cpt, kmp_int32, 32, +, 0 ) // __kmpc_atomic_fixed4_add_cpt
ATOMIC_FIXED_ADD_CPT( fixed4, sub_cpt, kmp_int32, 32, -, 0 ) // __kmpc_atomic_fixed4_sub_cpt
ATOMIC_FIXED_ADD_CPT( fixed8, add_cpt, kmp_int64, 64, +, KMP_ARCH_X86 ) // __kmpc_atomic_fixed8_add_cpt
ATOMIC_FIXED_ADD_CPT( fixed8, sub_cpt, kmp_int64, 64, -, KMP_ARCH_X86 ) // __kmpc_atomic_fixed8_sub_cpt
-#if KMP_MIC
ATOMIC_CMPXCHG_CPT( float4, add_cpt, kmp_real32, 32, +, KMP_ARCH_X86 ) // __kmpc_atomic_float4_add_cpt
ATOMIC_CMPXCHG_CPT( float4, sub_cpt, kmp_real32, 32, -, KMP_ARCH_X86 ) // __kmpc_atomic_float4_sub_cpt
ATOMIC_CMPXCHG_CPT( float8, add_cpt, kmp_real64, 64, +, KMP_ARCH_X86 ) // __kmpc_atomic_float8_add_cpt
ATOMIC_CMPXCHG_CPT( float8, sub_cpt, kmp_real64, 64, -, KMP_ARCH_X86 ) // __kmpc_atomic_float8_sub_cpt
-#else
-ATOMIC_FLOAT_ADD_CPT( float4, add_cpt, kmp_real32, 32, +, KMP_ARCH_X86 ) // __kmpc_atomic_float4_add_cpt
-ATOMIC_FLOAT_ADD_CPT( float4, sub_cpt, kmp_real32, 32, -, KMP_ARCH_X86 ) // __kmpc_atomic_float4_sub_cpt
-ATOMIC_FLOAT_ADD_CPT( float8, add_cpt, kmp_real64, 64, +, KMP_ARCH_X86 ) // __kmpc_atomic_float8_add_cpt
-ATOMIC_FLOAT_ADD_CPT( float8, sub_cpt, kmp_real64, 64, -, KMP_ARCH_X86 ) // __kmpc_atomic_float8_sub_cpt
-#endif // KMP_MIC
// ------------------------------------------------------------------------
// Entries definition for integer operands
diff --git a/openmp/runtime/src/kmp_atomic.h b/openmp/runtime/src/kmp_atomic.h
index 361dce9aa79..68673dad8fb 100644
--- a/openmp/runtime/src/kmp_atomic.h
+++ b/openmp/runtime/src/kmp_atomic.h
@@ -1,7 +1,7 @@
/*
* kmp_atomic.h - ATOMIC header file
- * $Revision: 42810 $
- * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+ * $Revision: 43191 $
+ * $Date: 2014-05-27 07:44:11 -0500 (Tue, 27 May 2014) $
*/
@@ -33,7 +33,7 @@
#if defined( __cplusplus ) && ( KMP_OS_WINDOWS )
// create shortcuts for c99 complex types
- #ifdef _DEBUG
+ #if (_MSC_VER < 1600) && defined(_DEBUG)
// Workaround for the problem of _DebugHeapTag unresolved external.
// This problem prevented to use our static debug library for C tests
// compiled with /MDd option (the library itself built with /MTd),
diff --git a/openmp/runtime/src/kmp_barrier.cpp b/openmp/runtime/src/kmp_barrier.cpp
new file mode 100644
index 00000000000..cbd1edd9e7c
--- /dev/null
+++ b/openmp/runtime/src/kmp_barrier.cpp
@@ -0,0 +1,1607 @@
+/*
+ * kmp_barrier.cpp
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
+ */
+
+
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.txt for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#include "kmp.h"
+#include "kmp_wait_release.h"
+#include "kmp_stats.h"
+#include "kmp_itt.h"
+
+#if KMP_MIC
+#include <immintrin.h>
+#define USE_NGO_STORES 1
+#endif // KMP_MIC
+
+#if KMP_MIC && USE_NGO_STORES
+// ICV copying
+#define ngo_load(src) __m512d Vt = _mm512_load_pd((void *)(src))
+#define ngo_store_icvs(dst, src) _mm512_storenrngo_pd((void *)(dst), Vt)
+#define ngo_store_go(dst, src) _mm512_storenrngo_pd((void *)(dst), Vt)
+#define ngo_sync() __asm__ volatile ("lock; addl $0,0(%%rsp)" ::: "memory")
+#else
+#define ngo_load(src) ((void)0)
+#define ngo_store_icvs(dst, src) copy_icvs((dst), (src))
+#define ngo_store_go(dst, src) memcpy((dst), (src), CACHE_LINE)
+#define ngo_sync() ((void)0)
+#endif /* KMP_MIC && USE_NGO_STORES */
+
+void __kmp_print_structure(void); // Forward declaration
+
+// ---------------------------- Barrier Algorithms ----------------------------
+
+// Linear Barrier
+static void
+__kmp_linear_barrier_gather(enum barrier_type bt, kmp_info_t *this_thr, int gtid, int tid,
+ void (*reduce)(void *, void *)
+ USE_ITT_BUILD_ARG(void * itt_sync_obj) )
+{
+ KMP_TIME_BLOCK(KMP_linear_gather);
+ register kmp_team_t *team = this_thr->th.th_team;
+ register kmp_bstate_t *thr_bar = & this_thr->th.th_bar[bt].bb;
+ register kmp_info_t **other_threads = team->t.t_threads;
+
+ KA_TRACE(20, ("__kmp_linear_barrier_gather: T#%d(%d:%d) enter for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+ KMP_DEBUG_ASSERT(this_thr == other_threads[this_thr->th.th_info.ds.ds_tid]);
+
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ // Barrier imbalance - save arrive time to the thread
+ if(__kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3) {
+ this_thr->th.th_bar_arrive_time = this_thr->th.th_bar_min_time = __itt_get_timestamp();
+ }
+#endif
+ // We now perform a linear reduction to signal that all of the threads have arrived.
+ if (!KMP_MASTER_TID(tid)) {
+ KA_TRACE(20, ("__kmp_linear_barrier_gather: T#%d(%d:%d) releasing T#%d(%d:%d)"
+ "arrived(%p): %u => %u\n", gtid, team->t.t_id, tid,
+ __kmp_gtid_from_tid(0, team), team->t.t_id, 0, &thr_bar->b_arrived,
+ thr_bar->b_arrived, thr_bar->b_arrived + KMP_BARRIER_STATE_BUMP));
+ // Mark arrival to master thread
+ /* After performing this write, a worker thread may not assume that the team is valid
+ any more - it could be deallocated by the master thread at any time. */
+ kmp_flag_64 flag(&thr_bar->b_arrived, other_threads[0]);
+ flag.release();
+ } else {
+ register kmp_balign_team_t *team_bar = &team->t.t_bar[bt];
+ register int nproc = this_thr->th.th_team_nproc;
+ register int i;
+ // Don't have to worry about sleep bit here or atomic since team setting
+ register kmp_uint new_state = team_bar->b_arrived + KMP_BARRIER_STATE_BUMP;
+
+ // Collect all the worker team member threads.
+ for (i=1; i<nproc; ++i) {
+#if KMP_CACHE_MANAGE
+ // Prefetch next thread's arrived count
+ if (i+1 < nproc)
+ KMP_CACHE_PREFETCH(&other_threads[i+1]->th.th_bar[bt].bb.b_arrived);
+#endif /* KMP_CACHE_MANAGE */
+ KA_TRACE(20, ("__kmp_linear_barrier_gather: T#%d(%d:%d) wait T#%d(%d:%d) "
+ "arrived(%p) == %u\n", gtid, team->t.t_id, tid,
+ __kmp_gtid_from_tid(i, team), team->t.t_id, i,
+ &other_threads[i]->th.th_bar[bt].bb.b_arrived, new_state));
+
+ // Wait for worker thread to arrive
+ kmp_flag_64 flag(&other_threads[i]->th.th_bar[bt].bb.b_arrived, new_state);
+ flag.wait(this_thr, FALSE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ // Barrier imbalance - write min of the thread time and the other thread time to the thread.
+ if (__kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3) {
+ this_thr->th.th_bar_min_time = KMP_MIN(this_thr->th.th_bar_min_time,
+ other_threads[i]->th.th_bar_min_time);
+ }
+#endif
+ if (reduce) {
+ KA_TRACE(100, ("__kmp_linear_barrier_gather: T#%d(%d:%d) += T#%d(%d:%d)\n", gtid,
+ team->t.t_id, tid, __kmp_gtid_from_tid(i, team), team->t.t_id, i));
+ (*reduce)(this_thr->th.th_local.reduce_data,
+ other_threads[i]->th.th_local.reduce_data);
+ }
+ }
+ // Don't have to worry about sleep bit here or atomic since team setting
+ team_bar->b_arrived = new_state;
+ KA_TRACE(20, ("__kmp_linear_barrier_gather: T#%d(%d:%d) set team %d arrived(%p) = %u\n",
+ gtid, team->t.t_id, tid, team->t.t_id, &team_bar->b_arrived, new_state));
+ }
+ KA_TRACE(20, ("__kmp_linear_barrier_gather: T#%d(%d:%d) exit for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+}
+
+static void
+__kmp_linear_barrier_release(enum barrier_type bt, kmp_info_t *this_thr, int gtid, int tid,
+ int propagate_icvs
+ USE_ITT_BUILD_ARG(void *itt_sync_obj) )
+{
+ KMP_TIME_BLOCK(KMP_linear_release);
+ register kmp_bstate_t *thr_bar = &this_thr->th.th_bar[bt].bb;
+ register kmp_team_t *team;
+
+ if (KMP_MASTER_TID(tid)) {
+ register unsigned int i;
+ register kmp_uint32 nproc = this_thr->th.th_team_nproc;
+ register kmp_info_t **other_threads;
+
+ team = __kmp_threads[gtid]->th.th_team;
+ KMP_DEBUG_ASSERT(team != NULL);
+ other_threads = team->t.t_threads;
+
+ KA_TRACE(20, ("__kmp_linear_barrier_release: T#%d(%d:%d) master enter for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+
+ if (nproc > 1) {
+#if KMP_BARRIER_ICV_PUSH
+ KMP_START_EXPLICIT_TIMER(USER_icv_copy);
+ if (propagate_icvs) {
+ ngo_load(&team->t.t_implicit_task_taskdata[0].td_icvs);
+ for (i=1; i<nproc; ++i) {
+ __kmp_init_implicit_task(team->t.t_ident, team->t.t_threads[i], team, i, FALSE);
+ ngo_store_icvs(&team->t.t_implicit_task_taskdata[i].td_icvs,
+ &team->t.t_implicit_task_taskdata[0].td_icvs);
+ }
+ ngo_sync();
+ }
+ KMP_STOP_EXPLICIT_TIMER(USER_icv_copy);
+#endif // KMP_BARRIER_ICV_PUSH
+
+ // Now, release all of the worker threads
+ for (i=1; i<nproc; ++i) {
+#if KMP_CACHE_MANAGE
+ // Prefetch next thread's go flag
+ if (i+1 < nproc)
+ KMP_CACHE_PREFETCH(&other_threads[i+1]->th.th_bar[bt].bb.b_go);
+#endif /* KMP_CACHE_MANAGE */
+ KA_TRACE(20, ("__kmp_linear_barrier_release: T#%d(%d:%d) releasing T#%d(%d:%d) "
+ "go(%p): %u => %u\n", gtid, team->t.t_id, tid,
+ other_threads[i]->th.th_info.ds.ds_gtid, team->t.t_id, i,
+ &other_threads[i]->th.th_bar[bt].bb.b_go,
+ other_threads[i]->th.th_bar[bt].bb.b_go,
+ other_threads[i]->th.th_bar[bt].bb.b_go + KMP_BARRIER_STATE_BUMP));
+ kmp_flag_64 flag(&other_threads[i]->th.th_bar[bt].bb.b_go, other_threads[i]);
+ flag.release();
+ }
+ }
+ } else { // Wait for the MASTER thread to release us
+ KA_TRACE(20, ("__kmp_linear_barrier_release: T#%d wait go(%p) == %u\n",
+ gtid, &thr_bar->b_go, KMP_BARRIER_STATE_BUMP));
+ kmp_flag_64 flag(&thr_bar->b_go, KMP_BARRIER_STATE_BUMP);
+ flag.wait(this_thr, TRUE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ if ((__itt_sync_create_ptr && itt_sync_obj == NULL) || KMP_ITT_DEBUG) {
+ // In a fork barrier; cannot get the object reliably (or ITTNOTIFY is disabled)
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bs_forkjoin_barrier, 0, -1);
+ // Cancel wait on previous parallel region...
+ __kmp_itt_task_starting(itt_sync_obj);
+
+ if (bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done))
+ return;
+
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bs_forkjoin_barrier);
+ if (itt_sync_obj != NULL)
+ // Call prepare as early as possible for "new" barrier
+ __kmp_itt_task_finished(itt_sync_obj);
+ } else
+#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
+ // Early exit for reaping threads releasing forkjoin barrier
+ if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) )
+ return;
+ // The worker thread may now assume that the team is valid.
+#ifdef KMP_DEBUG
+ tid = __kmp_tid_from_gtid(gtid);
+ team = __kmp_threads[gtid]->th.th_team;
+#endif
+ KMP_DEBUG_ASSERT(team != NULL);
+ TCW_4(thr_bar->b_go, KMP_INIT_BARRIER_STATE);
+ KA_TRACE(20, ("__kmp_linear_barrier_release: T#%d(%d:%d) set go(%p) = %u\n",
+ gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE));
+ KMP_MB(); // Flush all pending memory write invalidates.
+ }
+ KA_TRACE(20, ("__kmp_linear_barrier_release: T#%d(%d:%d) exit for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+}
+
+// Tree barrier
+static void
+__kmp_tree_barrier_gather(enum barrier_type bt, kmp_info_t *this_thr, int gtid, int tid,
+ void (*reduce)(void *, void *)
+ USE_ITT_BUILD_ARG(void *itt_sync_obj) )
+{
+ KMP_TIME_BLOCK(KMP_tree_gather);
+ register kmp_team_t *team = this_thr->th.th_team;
+ register kmp_bstate_t *thr_bar = &this_thr->th.th_bar[bt].bb;
+ register kmp_info_t **other_threads = team->t.t_threads;
+ register kmp_uint32 nproc = this_thr->th.th_team_nproc;
+ register kmp_uint32 branch_bits = __kmp_barrier_gather_branch_bits[bt];
+ register kmp_uint32 branch_factor = 1 << branch_bits;
+ register kmp_uint32 child;
+ register kmp_uint32 child_tid;
+ register kmp_uint new_state;
+
+ KA_TRACE(20, ("__kmp_tree_barrier_gather: T#%d(%d:%d) enter for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+ KMP_DEBUG_ASSERT(this_thr == other_threads[this_thr->th.th_info.ds.ds_tid]);
+
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ // Barrier imbalance - save arrive time to the thread
+ if(__kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3) {
+ this_thr->th.th_bar_arrive_time = this_thr->th.th_bar_min_time = __itt_get_timestamp();
+ }
+#endif
+ // Perform tree gather to wait until all threads have arrived; reduce any required data as we go
+ child_tid = (tid << branch_bits) + 1;
+ if (child_tid < nproc) {
+ // Parent threads wait for all their children to arrive
+ new_state = team->t.t_bar[bt].b_arrived + KMP_BARRIER_STATE_BUMP;
+ child = 1;
+ do {
+ register kmp_info_t *child_thr = other_threads[child_tid];
+ register kmp_bstate_t *child_bar = &child_thr->th.th_bar[bt].bb;
+#if KMP_CACHE_MANAGE
+ // Prefetch next thread's arrived count
+ if (child+1 <= branch_factor && child_tid+1 < nproc)
+ KMP_CACHE_PREFETCH(&other_threads[child_tid+1]->th.th_bar[bt].bb.b_arrived);
+#endif /* KMP_CACHE_MANAGE */
+ KA_TRACE(20, ("__kmp_tree_barrier_gather: T#%d(%d:%d) wait T#%d(%d:%u) "
+ "arrived(%p) == %u\n", gtid, team->t.t_id, tid,
+ __kmp_gtid_from_tid(child_tid, team), team->t.t_id, child_tid,
+ &child_bar->b_arrived, new_state));
+ // Wait for child to arrive
+ kmp_flag_64 flag(&child_bar->b_arrived, new_state);
+ flag.wait(this_thr, FALSE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ // Barrier imbalance - write min of the thread time and a child time to the thread.
+ if (__kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3) {
+ this_thr->th.th_bar_min_time = KMP_MIN(this_thr->th.th_bar_min_time,
+ child_thr->th.th_bar_min_time);
+ }
+#endif
+ if (reduce) {
+ KA_TRACE(100, ("__kmp_tree_barrier_gather: T#%d(%d:%d) += T#%d(%d:%u)\n",
+ gtid, team->t.t_id, tid, __kmp_gtid_from_tid(child_tid, team),
+ team->t.t_id, child_tid));
+ (*reduce)(this_thr->th.th_local.reduce_data, child_thr->th.th_local.reduce_data);
+ }
+ child++;
+ child_tid++;
+ }
+ while (child <= branch_factor && child_tid < nproc);
+ }
+
+ if (!KMP_MASTER_TID(tid)) { // Worker threads
+ register kmp_int32 parent_tid = (tid - 1) >> branch_bits;
+
+ KA_TRACE(20, ("__kmp_tree_barrier_gather: T#%d(%d:%d) releasing T#%d(%d:%d) "
+ "arrived(%p): %u => %u\n", gtid, team->t.t_id, tid,
+ __kmp_gtid_from_tid(parent_tid, team), team->t.t_id, parent_tid,
+ &thr_bar->b_arrived, thr_bar->b_arrived,
+ thr_bar->b_arrived + KMP_BARRIER_STATE_BUMP));
+
+ // Mark arrival to parent thread
+ /* After performing this write, a worker thread may not assume that the team is valid
+ any more - it could be deallocated by the master thread at any time. */
+ kmp_flag_64 flag(&thr_bar->b_arrived, other_threads[parent_tid]);
+ flag.release();
+ } else {
+ // Need to update the team arrived pointer if we are the master thread
+ if (nproc > 1) // New value was already computed above
+ team->t.t_bar[bt].b_arrived = new_state;
+ else
+ team->t.t_bar[bt].b_arrived += KMP_BARRIER_STATE_BUMP;
+ KA_TRACE(20, ("__kmp_tree_barrier_gather: T#%d(%d:%d) set team %d arrived(%p) = %u\n",
+ gtid, team->t.t_id, tid, team->t.t_id,
+ &team->t.t_bar[bt].b_arrived, team->t.t_bar[bt].b_arrived));
+ }
+ KA_TRACE(20, ("__kmp_tree_barrier_gather: T#%d(%d:%d) exit for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+}
+
+static void
+__kmp_tree_barrier_release(enum barrier_type bt, kmp_info_t *this_thr, int gtid, int tid,
+ int propagate_icvs
+ USE_ITT_BUILD_ARG(void *itt_sync_obj) )
+{
+ KMP_TIME_BLOCK(KMP_tree_release);
+ register kmp_team_t *team;
+ register kmp_bstate_t *thr_bar = &this_thr->th.th_bar[bt].bb;
+ register kmp_uint32 nproc;
+ register kmp_uint32 branch_bits = __kmp_barrier_release_branch_bits[bt];
+ register kmp_uint32 branch_factor = 1 << branch_bits;
+ register kmp_uint32 child;
+ register kmp_uint32 child_tid;
+
+ // Perform a tree release for all of the threads that have been gathered
+ if (!KMP_MASTER_TID(tid)) { // Handle fork barrier workers who aren't part of a team yet
+ KA_TRACE(20, ("__kmp_tree_barrier_release: T#%d wait go(%p) == %u\n",
+ gtid, &thr_bar->b_go, KMP_BARRIER_STATE_BUMP));
+ // Wait for parent thread to release us
+ kmp_flag_64 flag(&thr_bar->b_go, KMP_BARRIER_STATE_BUMP);
+ flag.wait(this_thr, TRUE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ if ((__itt_sync_create_ptr && itt_sync_obj == NULL) || KMP_ITT_DEBUG) {
+ // In fork barrier where we could not get the object reliably (or ITTNOTIFY is disabled)
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bs_forkjoin_barrier, 0, -1);
+ // Cancel wait on previous parallel region...
+ __kmp_itt_task_starting(itt_sync_obj);
+
+ if (bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done))
+ return;
+
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bs_forkjoin_barrier);
+ if (itt_sync_obj != NULL)
+ // Call prepare as early as possible for "new" barrier
+ __kmp_itt_task_finished(itt_sync_obj);
+ } else
+#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
+ // Early exit for reaping threads releasing forkjoin barrier
+ if (bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done))
+ return;
+
+ // The worker thread may now assume that the team is valid.
+ team = __kmp_threads[gtid]->th.th_team;
+ KMP_DEBUG_ASSERT(team != NULL);
+ tid = __kmp_tid_from_gtid(gtid);
+
+ TCW_4(thr_bar->b_go, KMP_INIT_BARRIER_STATE);
+ KA_TRACE(20, ("__kmp_tree_barrier_release: T#%d(%d:%d) set go(%p) = %u\n",
+ gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE));
+ KMP_MB(); // Flush all pending memory write invalidates.
+ } else {
+ team = __kmp_threads[gtid]->th.th_team;
+ KMP_DEBUG_ASSERT(team != NULL);
+ KA_TRACE(20, ("__kmp_tree_barrier_release: T#%d(%d:%d) master enter for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+ }
+ nproc = this_thr->th.th_team_nproc;
+ child_tid = (tid << branch_bits) + 1;
+
+ if (child_tid < nproc) {
+ register kmp_info_t **other_threads = team->t.t_threads;
+ child = 1;
+ // Parent threads release all their children
+ do {
+ register kmp_info_t *child_thr = other_threads[child_tid];
+ register kmp_bstate_t *child_bar = &child_thr->th.th_bar[bt].bb;
+#if KMP_CACHE_MANAGE
+ // Prefetch next thread's go count
+ if (child+1 <= branch_factor && child_tid+1 < nproc)
+ KMP_CACHE_PREFETCH(&other_threads[child_tid+1]->th.th_bar[bt].bb.b_go);
+#endif /* KMP_CACHE_MANAGE */
+
+#if KMP_BARRIER_ICV_PUSH
+ KMP_START_EXPLICIT_TIMER(USER_icv_copy);
+ if (propagate_icvs) {
+ __kmp_init_implicit_task(team->t.t_ident, team->t.t_threads[child_tid],
+ team, child_tid, FALSE);
+ copy_icvs(&team->t.t_implicit_task_taskdata[child_tid].td_icvs,
+ &team->t.t_implicit_task_taskdata[0].td_icvs);
+ }
+ KMP_STOP_EXPLICIT_TIMER(USER_icv_copy);
+#endif // KMP_BARRIER_ICV_PUSH
+ KA_TRACE(20, ("__kmp_tree_barrier_release: T#%d(%d:%d) releasing T#%d(%d:%u)"
+ "go(%p): %u => %u\n", gtid, team->t.t_id, tid,
+ __kmp_gtid_from_tid(child_tid, team), team->t.t_id,
+ child_tid, &child_bar->b_go, child_bar->b_go,
+ child_bar->b_go + KMP_BARRIER_STATE_BUMP));
+ // Release child from barrier
+ kmp_flag_64 flag(&child_bar->b_go, child_thr);
+ flag.release();
+ child++;
+ child_tid++;
+ }
+ while (child <= branch_factor && child_tid < nproc);
+ }
+ KA_TRACE(20, ("__kmp_tree_barrier_release: T#%d(%d:%d) exit for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+}
+
+
+// Hyper Barrier
+static void
+__kmp_hyper_barrier_gather(enum barrier_type bt, kmp_info_t *this_thr, int gtid, int tid,
+ void (*reduce)(void *, void *)
+ USE_ITT_BUILD_ARG(void *itt_sync_obj) )
+{
+ KMP_TIME_BLOCK(KMP_hyper_gather);
+ register kmp_team_t *team = this_thr->th.th_team;
+ register kmp_bstate_t *thr_bar = &this_thr->th.th_bar[bt].bb;
+ register kmp_info_t **other_threads = team->t.t_threads;
+ register kmp_uint new_state = KMP_BARRIER_UNUSED_STATE;
+ register kmp_uint32 num_threads = this_thr->th.th_team_nproc;
+ register kmp_uint32 branch_bits = __kmp_barrier_gather_branch_bits[bt];
+ register kmp_uint32 branch_factor = 1 << branch_bits;
+ register kmp_uint32 offset;
+ register kmp_uint32 level;
+
+ KA_TRACE(20, ("__kmp_hyper_barrier_gather: T#%d(%d:%d) enter for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+
+ KMP_DEBUG_ASSERT(this_thr == other_threads[this_thr->th.th_info.ds.ds_tid]);
+
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ // Barrier imbalance - save arrive time to the thread
+ if(__kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3) {
+ this_thr->th.th_bar_arrive_time = this_thr->th.th_bar_min_time = __itt_get_timestamp();
+ }
+#endif
+ /* Perform a hypercube-embedded tree gather to wait until all of the threads have
+ arrived, and reduce any required data as we go. */
+ kmp_flag_64 p_flag(&thr_bar->b_arrived);
+ for (level=0, offset=1; offset<num_threads; level+=branch_bits, offset<<=branch_bits)
+ {
+ register kmp_uint32 child;
+ register kmp_uint32 child_tid;
+
+ if (((tid >> level) & (branch_factor - 1)) != 0) {
+ register kmp_int32 parent_tid = tid & ~((1 << (level + branch_bits)) -1);
+
+ KA_TRACE(20, ("__kmp_hyper_barrier_gather: T#%d(%d:%d) releasing T#%d(%d:%d) "
+ "arrived(%p): %u => %u\n", gtid, team->t.t_id, tid,
+ __kmp_gtid_from_tid(parent_tid, team), team->t.t_id, parent_tid,
+ &thr_bar->b_arrived, thr_bar->b_arrived,
+ thr_bar->b_arrived + KMP_BARRIER_STATE_BUMP));
+ // Mark arrival to parent thread
+ /* After performing this write (in the last iteration of the enclosing for loop),
+ a worker thread may not assume that the team is valid any more - it could be
+ deallocated by the master thread at any time. */
+ p_flag.set_waiter(other_threads[parent_tid]);
+ p_flag.release();
+ break;
+ }
+
+ // Parent threads wait for children to arrive
+ if (new_state == KMP_BARRIER_UNUSED_STATE)
+ new_state = team->t.t_bar[bt].b_arrived + KMP_BARRIER_STATE_BUMP;
+ for (child=1, child_tid=tid+(1 << level); child<branch_factor && child_tid<num_threads;
+ child++, child_tid+=(1 << level))
+ {
+ register kmp_info_t *child_thr = other_threads[child_tid];
+ register kmp_bstate_t *child_bar = &child_thr->th.th_bar[bt].bb;
+#if KMP_CACHE_MANAGE
+ register kmp_uint32 next_child_tid = child_tid + (1 << level);
+ // Prefetch next thread's arrived count
+ if (child+1 < branch_factor && next_child_tid < num_threads)
+ KMP_CACHE_PREFETCH(&other_threads[next_child_tid]->th.th_bar[bt].bb.b_arrived);
+#endif /* KMP_CACHE_MANAGE */
+ KA_TRACE(20, ("__kmp_hyper_barrier_gather: T#%d(%d:%d) wait T#%d(%d:%u) "
+ "arrived(%p) == %u\n", gtid, team->t.t_id, tid,
+ __kmp_gtid_from_tid(child_tid, team), team->t.t_id, child_tid,
+ &child_bar->b_arrived, new_state));
+ // Wait for child to arrive
+ kmp_flag_64 c_flag(&child_bar->b_arrived, new_state);
+ c_flag.wait(this_thr, FALSE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ // Barrier imbalance - write min of the thread time and a child time to the thread.
+ if (__kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3) {
+ this_thr->th.th_bar_min_time = KMP_MIN(this_thr->th.th_bar_min_time,
+ child_thr->th.th_bar_min_time);
+ }
+#endif
+ if (reduce) {
+ KA_TRACE(100, ("__kmp_hyper_barrier_gather: T#%d(%d:%d) += T#%d(%d:%u)\n",
+ gtid, team->t.t_id, tid, __kmp_gtid_from_tid(child_tid, team),
+ team->t.t_id, child_tid));
+ (*reduce)(this_thr->th.th_local.reduce_data, child_thr->th.th_local.reduce_data);
+ }
+ }
+ }
+
+ if (KMP_MASTER_TID(tid)) {
+ // Need to update the team arrived pointer if we are the master thread
+ if (new_state == KMP_BARRIER_UNUSED_STATE)
+ team->t.t_bar[bt].b_arrived += KMP_BARRIER_STATE_BUMP;
+ else
+ team->t.t_bar[bt].b_arrived = new_state;
+ KA_TRACE(20, ("__kmp_hyper_barrier_gather: T#%d(%d:%d) set team %d arrived(%p) = %u\n",
+ gtid, team->t.t_id, tid, team->t.t_id,
+ &team->t.t_bar[bt].b_arrived, team->t.t_bar[bt].b_arrived));
+ }
+ KA_TRACE(20, ("__kmp_hyper_barrier_gather: T#%d(%d:%d) exit for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+}
+
+// The reverse versions seem to beat the forward versions overall
+#define KMP_REVERSE_HYPER_BAR
+static void
+__kmp_hyper_barrier_release(enum barrier_type bt, kmp_info_t *this_thr, int gtid, int tid,
+ int propagate_icvs
+ USE_ITT_BUILD_ARG(void *itt_sync_obj) )
+{
+ KMP_TIME_BLOCK(KMP_hyper_release);
+ register kmp_team_t *team;
+ register kmp_bstate_t *thr_bar = & this_thr -> th.th_bar[ bt ].bb;
+ register kmp_info_t **other_threads;
+ register kmp_uint32 num_threads;
+ register kmp_uint32 branch_bits = __kmp_barrier_release_branch_bits[ bt ];
+ register kmp_uint32 branch_factor = 1 << branch_bits;
+ register kmp_uint32 child;
+ register kmp_uint32 child_tid;
+ register kmp_uint32 offset;
+ register kmp_uint32 level;
+
+ /* Perform a hypercube-embedded tree release for all of the threads that have been gathered.
+ If KMP_REVERSE_HYPER_BAR is defined (default) the threads are released in the reverse
+ order of the corresponding gather, otherwise threads are released in the same order. */
+ if (KMP_MASTER_TID(tid)) { // master
+ team = __kmp_threads[gtid]->th.th_team;
+ KMP_DEBUG_ASSERT(team != NULL);
+ KA_TRACE(20, ("__kmp_hyper_barrier_release: T#%d(%d:%d) master enter for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+#if KMP_BARRIER_ICV_PUSH
+ if (propagate_icvs) { // master already has ICVs in final destination; copy
+ copy_icvs(&thr_bar->th_fixed_icvs, &team->t.t_implicit_task_taskdata[tid].td_icvs);
+ }
+#endif
+ }
+ else { // Handle fork barrier workers who aren't part of a team yet
+ KA_TRACE(20, ("__kmp_hyper_barrier_release: T#%d wait go(%p) == %u\n",
+ gtid, &thr_bar->b_go, KMP_BARRIER_STATE_BUMP));
+ // Wait for parent thread to release us
+ kmp_flag_64 flag(&thr_bar->b_go, KMP_BARRIER_STATE_BUMP);
+ flag.wait(this_thr, TRUE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ if ((__itt_sync_create_ptr && itt_sync_obj == NULL) || KMP_ITT_DEBUG) {
+ // In fork barrier where we could not get the object reliably
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bs_forkjoin_barrier, 0, -1);
+ // Cancel wait on previous parallel region...
+ __kmp_itt_task_starting(itt_sync_obj);
+
+ if (bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done))
+ return;
+
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bs_forkjoin_barrier);
+ if (itt_sync_obj != NULL)
+ // Call prepare as early as possible for "new" barrier
+ __kmp_itt_task_finished(itt_sync_obj);
+ } else
+#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
+ // Early exit for reaping threads releasing forkjoin barrier
+ if (bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done))
+ return;
+
+ // The worker thread may now assume that the team is valid.
+ team = __kmp_threads[gtid]->th.th_team;
+ KMP_DEBUG_ASSERT(team != NULL);
+ tid = __kmp_tid_from_gtid(gtid);
+
+ TCW_4(thr_bar->b_go, KMP_INIT_BARRIER_STATE);
+ KA_TRACE(20, ("__kmp_hyper_barrier_release: T#%d(%d:%d) set go(%p) = %u\n",
+ gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE));
+ KMP_MB(); // Flush all pending memory write invalidates.
+ }
+ num_threads = this_thr->th.th_team_nproc;
+ other_threads = team->t.t_threads;
+
+#ifdef KMP_REVERSE_HYPER_BAR
+ // Count up to correct level for parent
+ for (level=0, offset=1; offset<num_threads && (((tid>>level) & (branch_factor-1)) == 0);
+ level+=branch_bits, offset<<=branch_bits);
+
+ // Now go down from there
+ for (level-=branch_bits, offset>>=branch_bits; offset != 0;
+ level-=branch_bits, offset>>=branch_bits)
+#else
+ // Go down the tree, level by level
+ for (level=0, offset=1; offset<num_threads; level+=branch_bits, offset<<=branch_bits)
+#endif // KMP_REVERSE_HYPER_BAR
+ {
+#ifdef KMP_REVERSE_HYPER_BAR
+ /* Now go in reverse order through the children, highest to lowest.
+ Initial setting of child is conservative here. */
+ child = num_threads >> ((level==0)?level:level-1);
+ for (child=(child<branch_factor-1) ? child : branch_factor-1, child_tid=tid+(child<<level);
+ child>=1; child--, child_tid-=(1<<level))
+#else
+ if (((tid >> level) & (branch_factor - 1)) != 0)
+ // No need to go lower than this, since this is the level parent would be notified
+ break;
+ // Iterate through children on this level of the tree
+ for (child=1, child_tid=tid+(1<<level); child<branch_factor && child_tid<num_threads;
+ child++, child_tid+=(1<<level))
+#endif // KMP_REVERSE_HYPER_BAR
+ {
+ if (child_tid >= num_threads) continue; // Child doesn't exist so keep going
+ else {
+ register kmp_info_t *child_thr = other_threads[child_tid];
+ register kmp_bstate_t *child_bar = &child_thr->th.th_bar[bt].bb;
+#if KMP_CACHE_MANAGE
+ register kmp_uint32 next_child_tid = child_tid - (1 << level);
+ // Prefetch next thread's go count
+# ifdef KMP_REVERSE_HYPER_BAR
+ if (child-1 >= 1 && next_child_tid < num_threads)
+# else
+ if (child+1 < branch_factor && next_child_tid < num_threads)
+# endif // KMP_REVERSE_HYPER_BAR
+ KMP_CACHE_PREFETCH(&other_threads[next_child_tid]->th.th_bar[bt].bb.b_go);
+#endif /* KMP_CACHE_MANAGE */
+
+#if KMP_BARRIER_ICV_PUSH
+ if (propagate_icvs) // push my fixed ICVs to my child
+ copy_icvs(&child_bar->th_fixed_icvs, &thr_bar->th_fixed_icvs);
+#endif // KMP_BARRIER_ICV_PUSH
+
+ KA_TRACE(20, ("__kmp_hyper_barrier_release: T#%d(%d:%d) releasing T#%d(%d:%u)"
+ "go(%p): %u => %u\n", gtid, team->t.t_id, tid,
+ __kmp_gtid_from_tid(child_tid, team), team->t.t_id,
+ child_tid, &child_bar->b_go, child_bar->b_go,
+ child_bar->b_go + KMP_BARRIER_STATE_BUMP));
+ // Release child from barrier
+ kmp_flag_64 flag(&child_bar->b_go, child_thr);
+ flag.release();
+ }
+ }
+ }
+#if KMP_BARRIER_ICV_PUSH
+ if (propagate_icvs && !KMP_MASTER_TID(tid)) { // copy ICVs locally to final dest
+ __kmp_init_implicit_task(team->t.t_ident, team->t.t_threads[tid], team, tid, FALSE);
+ copy_icvs(&team->t.t_implicit_task_taskdata[tid].td_icvs, &thr_bar->th_fixed_icvs);
+ }
+#endif
+ KA_TRACE(20, ("__kmp_hyper_barrier_release: T#%d(%d:%d) exit for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+}
+
+// Hierarchical Barrier
+
+// Initialize thread barrier data
+/* Initializes/re-initializes the hierarchical barrier data stored on a thread. Performs the
+ minimum amount of initialization required based on how the team has changed. Returns true if
+ leaf children will require both on-core and traditional wake-up mechanisms. For example, if the
+ team size increases, threads already in the team will respond to on-core wakeup on their parent
+ thread, but threads newly added to the team will only be listening on the their local b_go. */
+static bool
+__kmp_init_hierarchical_barrier_thread(enum barrier_type bt, kmp_bstate_t *thr_bar, kmp_uint32 nproc,
+ int gtid, int tid, kmp_team_t *team)
+{
+ // Checks to determine if (re-)initialization is needed
+ bool uninitialized = thr_bar->team == NULL;
+ bool team_changed = team != thr_bar->team;
+ bool team_sz_changed = nproc != thr_bar->nproc;
+ bool tid_changed = tid != thr_bar->old_tid;
+ bool retval = false;
+
+ if (uninitialized || team_sz_changed) {
+ __kmp_get_hierarchy(nproc, thr_bar);
+ }
+
+ if (uninitialized || team_sz_changed || tid_changed) {
+ thr_bar->my_level = thr_bar->depth-1; // default for master
+ thr_bar->parent_tid = -1; // default for master
+ if (!KMP_MASTER_TID(tid)) { // if not master, find parent thread in hierarchy
+ kmp_uint32 d=0;
+ while (d<thr_bar->depth) { // find parent based on level of thread in hierarchy, and note level
+ kmp_uint32 rem;
+ if (d == thr_bar->depth-2) { // reached level right below the master
+ thr_bar->parent_tid = 0;
+ thr_bar->my_level = d;
+ break;
+ }
+ else if ((rem = tid%thr_bar->skip_per_level[d+1]) != 0) { // TODO: can we make this op faster?
+ // thread is not a subtree root at next level, so this is max
+ thr_bar->parent_tid = tid - rem;
+ thr_bar->my_level = d;
+ break;
+ }
+ ++d;
+ }
+ }
+ thr_bar->offset = 7-(tid-thr_bar->parent_tid-1);
+ thr_bar->old_tid = tid;
+ thr_bar->wait_flag = KMP_BARRIER_NOT_WAITING;
+ }
+ if (uninitialized || team_changed || tid_changed) {
+ thr_bar->team = team;
+ thr_bar->parent_bar = &team->t.t_threads[thr_bar->parent_tid]->th.th_bar[bt].bb;
+ retval = true;
+ }
+ if (uninitialized || team_sz_changed || tid_changed) {
+ thr_bar->nproc = nproc;
+ thr_bar->leaf_kids = thr_bar->base_leaf_kids;
+ if (thr_bar->my_level == 0) thr_bar->leaf_kids=0;
+ if (thr_bar->leaf_kids && (kmp_uint32)tid+thr_bar->leaf_kids+1 > nproc)
+ thr_bar->leaf_kids = nproc - tid - 1;
+ thr_bar->leaf_state = 0;
+ for (int i=0; i<thr_bar->leaf_kids; ++i) ((char *)&(thr_bar->leaf_state))[7-i] = 1;
+ }
+ return retval;
+}
+
+static void
+__kmp_hierarchical_barrier_gather(enum barrier_type bt, kmp_info_t *this_thr,
+ int gtid, int tid, void (*reduce) (void *, void *)
+ USE_ITT_BUILD_ARG(void * itt_sync_obj) )
+{
+ KMP_TIME_BLOCK(KMP_hier_gather);
+ register kmp_team_t *team = this_thr->th.th_team;
+ register kmp_bstate_t *thr_bar = & this_thr->th.th_bar[bt].bb;
+ register kmp_uint32 nproc = this_thr->th.th_team_nproc;
+ register kmp_info_t **other_threads = team->t.t_threads;
+ register kmp_uint64 new_state;
+
+ if (this_thr->th.th_team->t.t_level == 1) thr_bar->use_oncore_barrier = 1;
+ else thr_bar->use_oncore_barrier = 0; // Do not use oncore barrier when nested
+
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_gather: T#%d(%d:%d) enter for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+ KMP_DEBUG_ASSERT(this_thr == other_threads[this_thr->th.th_info.ds.ds_tid]);
+
+ (void)__kmp_init_hierarchical_barrier_thread(bt, thr_bar, nproc, gtid, tid, team);
+
+ if (thr_bar->my_level) { // not a leaf (my_level==0 means leaf)
+ register kmp_int32 child_tid;
+ new_state = (kmp_uint64)team->t.t_bar[bt].b_arrived + KMP_BARRIER_STATE_BUMP;
+ if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME && thr_bar->use_oncore_barrier) {
+ if (thr_bar->leaf_kids) { // First, wait for leaf children to check-in on my b_arrived flag
+ kmp_uint64 leaf_state = KMP_MASTER_TID(tid) ? thr_bar->b_arrived | thr_bar->leaf_state : (kmp_uint64)team->t.t_bar[bt].b_arrived | thr_bar->leaf_state;
+ kmp_flag_64 flag(&thr_bar->b_arrived, leaf_state);
+ flag.wait(this_thr, FALSE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ if (reduce) {
+ for (child_tid=tid+1; child_tid<=tid+thr_bar->leaf_kids; ++child_tid) {
+ KA_TRACE(100, ("__kmp_hierarchical_barrier_gather: T#%d(%d:%d) += T#%d(%d:%d)\n",
+ gtid, team->t.t_id, tid, __kmp_gtid_from_tid(child_tid, team),
+ team->t.t_id, child_tid));
+ (*reduce)(this_thr->th.th_local.reduce_data, other_threads[child_tid]->th.th_local.reduce_data);
+ }
+ }
+ (void) KMP_TEST_THEN_AND64((volatile kmp_int64 *)&thr_bar->b_arrived, ~(thr_bar->leaf_state)); // clear leaf_state bits
+ }
+ // Next, wait for higher level children on each child's b_arrived flag
+ for (kmp_uint32 d=1; d<thr_bar->my_level; ++d) { // gather lowest level threads first, but skip 0
+ kmp_uint32 last = tid+thr_bar->skip_per_level[d+1], skip = thr_bar->skip_per_level[d];
+ if (last > nproc) last = nproc;
+ for (child_tid=tid+skip; child_tid<(int)last; child_tid+=skip) {
+ register kmp_info_t *child_thr = other_threads[child_tid];
+ register kmp_bstate_t *child_bar = &child_thr->th.th_bar[bt].bb;
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_gather: T#%d(%d:%d) wait T#%d(%d:%d) "
+ "arrived(%p) == %u\n",
+ gtid, team->t.t_id, tid, __kmp_gtid_from_tid(child_tid, team),
+ team->t.t_id, child_tid, &child_bar->b_arrived, new_state));
+ kmp_flag_64 flag(&child_bar->b_arrived, new_state);
+ flag.wait(this_thr, FALSE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ if (reduce) {
+ KA_TRACE(100, ("__kmp_hierarchical_barrier_gather: T#%d(%d:%d) += T#%d(%d:%d)\n",
+ gtid, team->t.t_id, tid, __kmp_gtid_from_tid(child_tid, team),
+ team->t.t_id, child_tid));
+ (*reduce)(this_thr->th.th_local.reduce_data, child_thr->th.th_local.reduce_data);
+ }
+ }
+ }
+ }
+ else { // Blocktime is not infinite
+ for (kmp_uint32 d=0; d<thr_bar->my_level; ++d) { // Gather lowest level threads first
+ kmp_uint32 last = tid+thr_bar->skip_per_level[d+1], skip = thr_bar->skip_per_level[d];
+ if (last > nproc) last = nproc;
+ for (child_tid=tid+skip; child_tid<(int)last; child_tid+=skip) {
+ register kmp_info_t *child_thr = other_threads[child_tid];
+ register kmp_bstate_t *child_bar = &child_thr->th.th_bar[bt].bb;
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_gather: T#%d(%d:%d) wait T#%d(%d:%d) "
+ "arrived(%p) == %u\n",
+ gtid, team->t.t_id, tid, __kmp_gtid_from_tid(child_tid, team),
+ team->t.t_id, child_tid, &child_bar->b_arrived, new_state));
+ kmp_flag_64 flag(&child_bar->b_arrived, new_state);
+ flag.wait(this_thr, FALSE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ if (reduce) {
+ KA_TRACE(100, ("__kmp_hierarchical_barrier_gather: T#%d(%d:%d) += T#%d(%d:%d)\n",
+ gtid, team->t.t_id, tid, __kmp_gtid_from_tid(child_tid, team),
+ team->t.t_id, child_tid));
+ (*reduce)(this_thr->th.th_local.reduce_data, child_thr->th.th_local.reduce_data);
+ }
+ }
+ }
+ }
+ }
+ // All subordinates are gathered; now release parent if not master thread
+
+ if (!KMP_MASTER_TID(tid)) { // worker threads release parent in hierarchy
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_gather: T#%d(%d:%d) releasing T#%d(%d:%d) "
+ "arrived(%p): %u => %u\n", gtid, team->t.t_id, tid,
+ __kmp_gtid_from_tid(thr_bar->parent_tid, team), team->t.t_id, thr_bar->parent_tid,
+ &thr_bar->b_arrived, thr_bar->b_arrived, thr_bar->b_arrived+KMP_BARRIER_STATE_BUMP));
+ /* Mark arrival to parent: After performing this write, a worker thread may not assume that
+ the team is valid any more - it could be deallocated by the master thread at any time. */
+ if (thr_bar->my_level || __kmp_dflt_blocktime != KMP_MAX_BLOCKTIME
+ || !thr_bar->use_oncore_barrier) { // Parent is waiting on my b_arrived flag; release it
+ kmp_flag_64 flag(&thr_bar->b_arrived, other_threads[thr_bar->parent_tid]);
+ flag.release();
+ }
+ else { // Leaf does special release on the "offset" bits of parent's b_arrived flag
+ thr_bar->b_arrived = (kmp_uint64)team->t.t_bar[bt].b_arrived + KMP_BARRIER_STATE_BUMP;
+ kmp_flag_oncore flag(&thr_bar->parent_bar->b_arrived, thr_bar->offset);
+ flag.set_waiter(other_threads[thr_bar->parent_tid]);
+ flag.release();
+ }
+ } else { // Master thread needs to update the team's b_arrived value
+ team->t.t_bar[bt].b_arrived = (kmp_uint32)new_state;
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_gather: T#%d(%d:%d) set team %d arrived(%p) = %u\n",
+ gtid, team->t.t_id, tid, team->t.t_id, &team->t.t_bar[bt].b_arrived, team->t.t_bar[bt].b_arrived));
+ }
+ // Is the team access below unsafe or just technically invalid?
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_gather: T#%d(%d:%d) exit for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+}
+
+static void
+__kmp_hierarchical_barrier_release(enum barrier_type bt, kmp_info_t *this_thr, int gtid, int tid,
+ int propagate_icvs
+ USE_ITT_BUILD_ARG(void * itt_sync_obj) )
+{
+ KMP_TIME_BLOCK(KMP_hier_release);
+ register kmp_team_t *team;
+ register kmp_bstate_t *thr_bar = &this_thr->th.th_bar[bt].bb;
+ register kmp_uint32 nproc;
+ bool team_change = false; // indicates on-core barrier shouldn't be used
+
+ if (KMP_MASTER_TID(tid)) {
+ team = __kmp_threads[gtid]->th.th_team;
+ KMP_DEBUG_ASSERT(team != NULL);
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_release: T#%d(%d:%d) master entered barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+ }
+ else { // Worker threads
+ // Wait for parent thread to release me
+ if (!thr_bar->use_oncore_barrier || __kmp_dflt_blocktime != KMP_MAX_BLOCKTIME
+ || thr_bar->my_level != 0 || thr_bar->team == NULL) {
+ // Use traditional method of waiting on my own b_go flag
+ thr_bar->wait_flag = KMP_BARRIER_OWN_FLAG;
+ kmp_flag_64 flag(&thr_bar->b_go, KMP_BARRIER_STATE_BUMP);
+ flag.wait(this_thr, TRUE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ TCW_8(thr_bar->b_go, KMP_INIT_BARRIER_STATE); // Reset my b_go flag for next time
+ }
+ else { // Thread barrier data is initialized, this is a leaf, blocktime is infinite, not nested
+ // Wait on my "offset" bits on parent's b_go flag
+ thr_bar->wait_flag = KMP_BARRIER_PARENT_FLAG;
+ kmp_flag_oncore flag(&thr_bar->parent_bar->b_go, KMP_BARRIER_STATE_BUMP, thr_bar->offset,
+ bt, this_thr
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ flag.wait(this_thr, TRUE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ if (thr_bar->wait_flag == KMP_BARRIER_SWITCHING) { // Thread was switched to own b_go
+ TCW_8(thr_bar->b_go, KMP_INIT_BARRIER_STATE); // Reset my b_go flag for next time
+ }
+ else { // Reset my bits on parent's b_go flag
+ ((char*)&(thr_bar->parent_bar->b_go))[thr_bar->offset] = 0;
+ }
+ }
+ thr_bar->wait_flag = KMP_BARRIER_NOT_WAITING;
+ // Early exit for reaping threads releasing forkjoin barrier
+ if (bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done))
+ return;
+ // The worker thread may now assume that the team is valid.
+ team = __kmp_threads[gtid]->th.th_team;
+ KMP_DEBUG_ASSERT(team != NULL);
+ tid = __kmp_tid_from_gtid(gtid);
+
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_release: T#%d(%d:%d) set go(%p) = %u\n",
+ gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE));
+ KMP_MB(); // Flush all pending memory write invalidates.
+ }
+
+ if (this_thr->th.th_team->t.t_level == 1) thr_bar->use_oncore_barrier = 1;
+ else thr_bar->use_oncore_barrier = 0;
+ nproc = this_thr->th.th_team_nproc;
+
+ // If the team size has increased, we still communicate with old leaves via oncore barrier.
+ unsigned short int old_leaf_kids = thr_bar->leaf_kids;
+ kmp_uint64 old_leaf_state = thr_bar->leaf_state;
+ team_change = __kmp_init_hierarchical_barrier_thread(bt, thr_bar, nproc, gtid, tid, team);
+ // But if the entire team changes, we won't use oncore barrier at all
+ if (team_change) old_leaf_kids = 0;
+
+#if KMP_BARRIER_ICV_PUSH
+ if (propagate_icvs) {
+ if (KMP_MASTER_TID(tid)) { // master already has copy in final destination; copy
+ copy_icvs(&thr_bar->th_fixed_icvs, &team->t.t_implicit_task_taskdata[tid].td_icvs);
+ }
+ else if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME && thr_bar->use_oncore_barrier) { // optimization for inf blocktime
+ if (!thr_bar->my_level) // I'm a leaf in the hierarchy (my_level==0)
+ // leaves (on-core children) pull parent's fixed ICVs directly to local ICV store
+ copy_icvs(&team->t.t_implicit_task_taskdata[tid].td_icvs,
+ &thr_bar->parent_bar->th_fixed_icvs);
+ // non-leaves will get ICVs piggybacked with b_go via NGO store
+ }
+ else { // blocktime is not infinite; pull ICVs from parent's fixed ICVs
+ if (thr_bar->my_level) // not a leaf; copy ICVs to my fixed ICVs child can access
+ copy_icvs(&thr_bar->th_fixed_icvs, &thr_bar->parent_bar->th_fixed_icvs);
+ else // leaves copy parent's fixed ICVs directly to local ICV store
+ copy_icvs(&team->t.t_implicit_task_taskdata[tid].td_icvs,
+ &thr_bar->parent_bar->th_fixed_icvs);
+ }
+ }
+#endif // KMP_BARRIER_ICV_PUSH
+
+ // Now, release my children
+ if (thr_bar->my_level) { // not a leaf
+ register kmp_int32 child_tid;
+ kmp_uint32 last;
+ if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME && thr_bar->use_oncore_barrier) {
+ if (KMP_MASTER_TID(tid)) { // do a flat release
+ // Set local b_go to bump children via NGO store of the cache line containing IVCs and b_go.
+ thr_bar->b_go = KMP_BARRIER_STATE_BUMP;
+ // Use ngo stores if available; b_go piggybacks in the last 8 bytes of the cache line
+ ngo_load(&thr_bar->th_fixed_icvs);
+ // This loops over all the threads skipping only the leaf nodes in the hierarchy
+ for (child_tid=thr_bar->skip_per_level[1]; child_tid<(int)nproc; child_tid+=thr_bar->skip_per_level[1]) {
+ register kmp_bstate_t *child_bar = &team->t.t_threads[child_tid]->th.th_bar[bt].bb;
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_release: T#%d(%d:%d) releasing T#%d(%d:%d)"
+ " go(%p): %u => %u\n",
+ gtid, team->t.t_id, tid, __kmp_gtid_from_tid(child_tid, team),
+ team->t.t_id, child_tid, &child_bar->b_go, child_bar->b_go,
+ child_bar->b_go + KMP_BARRIER_STATE_BUMP));
+ // Use ngo store (if available) to both store ICVs and release child via child's b_go
+ ngo_store_go(&child_bar->th_fixed_icvs, &thr_bar->th_fixed_icvs);
+ }
+ ngo_sync();
+ }
+ TCW_8(thr_bar->b_go, KMP_INIT_BARRIER_STATE); // Reset my b_go flag for next time
+ // Now, release leaf children
+ if (thr_bar->leaf_kids) { // if there are any
+ // We test team_change on the off-chance that the level 1 team changed.
+ if (team_change || old_leaf_kids < thr_bar->leaf_kids) { // some old leaf_kids, some new
+ if (old_leaf_kids) { // release old leaf kids
+ thr_bar->b_go |= old_leaf_state;
+ }
+ // Release new leaf kids
+ last = tid+thr_bar->skip_per_level[1];
+ if (last > nproc) last = nproc;
+ for (child_tid=tid+1+old_leaf_kids; child_tid<(int)last; ++child_tid) { // skip_per_level[0]=1
+ register kmp_info_t *child_thr = team->t.t_threads[child_tid];
+ register kmp_bstate_t *child_bar = &child_thr->th.th_bar[bt].bb;
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_release: T#%d(%d:%d) releasing"
+ " T#%d(%d:%d) go(%p): %u => %u\n",
+ gtid, team->t.t_id, tid, __kmp_gtid_from_tid(child_tid, team),
+ team->t.t_id, child_tid, &child_bar->b_go, child_bar->b_go,
+ child_bar->b_go + KMP_BARRIER_STATE_BUMP));
+ // Release child using child's b_go flag
+ kmp_flag_64 flag(&child_bar->b_go, child_thr);
+ flag.release();
+ }
+ }
+ else { // Release all children at once with leaf_state bits on my own b_go flag
+ thr_bar->b_go |= thr_bar->leaf_state;
+ }
+ }
+ }
+ else { // Blocktime is not infinite; do a simple hierarchical release
+ for (int d=thr_bar->my_level-1; d>=0; --d) { // Release highest level threads first
+ last = tid+thr_bar->skip_per_level[d+1];
+ kmp_uint32 skip = thr_bar->skip_per_level[d];
+ if (last > nproc) last = nproc;
+ for (child_tid=tid+skip; child_tid<(int)last; child_tid+=skip) {
+ register kmp_info_t *child_thr = team->t.t_threads[child_tid];
+ register kmp_bstate_t *child_bar = &child_thr->th.th_bar[bt].bb;
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_release: T#%d(%d:%d) releasing T#%d(%d:%d)"
+ " go(%p): %u => %u\n",
+ gtid, team->t.t_id, tid, __kmp_gtid_from_tid(child_tid, team),
+ team->t.t_id, child_tid, &child_bar->b_go, child_bar->b_go,
+ child_bar->b_go + KMP_BARRIER_STATE_BUMP));
+ // Release child using child's b_go flag
+ kmp_flag_64 flag(&child_bar->b_go, child_thr);
+ flag.release();
+ }
+ }
+ }
+#if KMP_BARRIER_ICV_PUSH
+ if (propagate_icvs && !KMP_MASTER_TID(tid)) // non-leaves copy ICVs from fixed ICVs to local dest
+ copy_icvs(&team->t.t_implicit_task_taskdata[tid].td_icvs, &thr_bar->th_fixed_icvs);
+#endif // KMP_BARRIER_ICV_PUSH
+ }
+ KA_TRACE(20, ("__kmp_hierarchical_barrier_release: T#%d(%d:%d) exit for barrier type %d\n",
+ gtid, team->t.t_id, tid, bt));
+}
+
+// ---------------------------- End of Barrier Algorithms ----------------------------
+
+// Internal function to do a barrier.
+/* If is_split is true, do a split barrier, otherwise, do a plain barrier
+ If reduce is non-NULL, do a split reduction barrier, otherwise, do a split barrier
+ Returns 0 if master thread, 1 if worker thread. */
+int
+__kmp_barrier(enum barrier_type bt, int gtid, int is_split, size_t reduce_size,
+ void *reduce_data, void (*reduce)(void *, void *))
+{
+ KMP_TIME_BLOCK(KMP_barrier);
+ register int tid = __kmp_tid_from_gtid(gtid);
+ register kmp_info_t *this_thr = __kmp_threads[gtid];
+ register kmp_team_t *team = this_thr->th.th_team;
+ register int status = 0;
+ ident_t *loc = __kmp_threads[gtid]->th.th_ident;
+
+ KA_TRACE(15, ("__kmp_barrier: T#%d(%d:%d) has arrived\n",
+ gtid, __kmp_team_from_gtid(gtid)->t.t_id, __kmp_tid_from_gtid(gtid)));
+
+ if (! team->t.t_serialized) {
+#if USE_ITT_BUILD
+ // This value will be used in itt notify events below.
+ void *itt_sync_obj = NULL;
+# if USE_ITT_NOTIFY
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG)
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bt, 1);
+# endif
+#endif /* USE_ITT_BUILD */
+ if (__kmp_tasking_mode == tskm_extra_barrier) {
+ __kmp_tasking_barrier(team, this_thr, gtid);
+ KA_TRACE(15, ("__kmp_barrier: T#%d(%d:%d) past tasking barrier\n",
+ gtid, __kmp_team_from_gtid(gtid)->t.t_id, __kmp_tid_from_gtid(gtid)));
+ }
+
+ /* Copy the blocktime info to the thread, where __kmp_wait_template() can access it when
+ the team struct is not guaranteed to exist. */
+ // See note about the corresponding code in __kmp_join_barrier() being performance-critical.
+ if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) {
+ this_thr->th.th_team_bt_intervals = team->t.t_implicit_task_taskdata[tid].td_icvs.bt_intervals;
+ this_thr->th.th_team_bt_set = team->t.t_implicit_task_taskdata[tid].td_icvs.bt_set;
+ }
+
+#if USE_ITT_BUILD
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG)
+ __kmp_itt_barrier_starting(gtid, itt_sync_obj);
+#endif /* USE_ITT_BUILD */
+
+ if (reduce != NULL) {
+ //KMP_DEBUG_ASSERT( is_split == TRUE ); // #C69956
+ this_thr->th.th_local.reduce_data = reduce_data;
+ }
+ switch (__kmp_barrier_gather_pattern[bt]) {
+ case bp_hyper_bar: {
+ KMP_ASSERT(__kmp_barrier_gather_branch_bits[bt]); // don't set branch bits to 0; use linear
+ __kmp_hyper_barrier_gather(bt, this_thr, gtid, tid, reduce
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ case bp_hierarchical_bar: {
+ __kmp_hierarchical_barrier_gather(bt, this_thr, gtid, tid, reduce
+ USE_ITT_BUILD_ARG(itt_sync_obj));
+ break;
+ }
+ case bp_tree_bar: {
+ KMP_ASSERT(__kmp_barrier_gather_branch_bits[bt]); // don't set branch bits to 0; use linear
+ __kmp_tree_barrier_gather(bt, this_thr, gtid, tid, reduce
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ default: {
+ __kmp_linear_barrier_gather(bt, this_thr, gtid, tid, reduce
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ }
+ }
+
+ KMP_MB();
+
+ if (KMP_MASTER_TID(tid)) {
+ status = 0;
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ __kmp_task_team_wait(this_thr, team
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ __kmp_task_team_setup(this_thr, team);
+ }
+
+
+#if USE_ITT_BUILD
+ /* TODO: In case of split reduction barrier, master thread may send acquired event early,
+ before the final summation into the shared variable is done (final summation can be a
+ long operation for array reductions). */
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG)
+ __kmp_itt_barrier_middle(gtid, itt_sync_obj);
+#endif /* USE_ITT_BUILD */
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ // Barrier - report frame end
+ if (__itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode) {
+ kmp_uint64 cur_time = __itt_get_timestamp();
+ kmp_info_t **other_threads = this_thr->th.th_team->t.t_threads;
+ int nproc = this_thr->th.th_team_nproc;
+ int i;
+ // Initialize with master's wait time
+ kmp_uint64 delta = cur_time - this_thr->th.th_bar_arrive_time;
+ switch(__kmp_forkjoin_frames_mode) {
+ case 1:
+ __kmp_itt_frame_submit(gtid, this_thr->th.th_frame_time, cur_time, 0, loc, nproc);
+ this_thr->th.th_frame_time = cur_time;
+ break;
+ case 2:
+ __kmp_itt_frame_submit(gtid, this_thr->th.th_bar_min_time, cur_time, 1, loc, nproc);
+ break;
+ case 3:
+ if( __itt_metadata_add_ptr ) {
+ for (i=1; i<nproc; ++i) {
+ delta += ( cur_time - other_threads[i]->th.th_bar_arrive_time );
+ }
+ __kmp_itt_metadata_imbalance(gtid, this_thr->th.th_frame_time, cur_time, delta, (kmp_uint64)( reduce != NULL));
+ }
+ __kmp_itt_frame_submit(gtid, this_thr->th.th_frame_time, cur_time, 0, loc, nproc);
+ this_thr->th.th_frame_time = cur_time;
+ break;
+ }
+ }
+#endif /* USE_ITT_BUILD */
+ } else {
+ status = 1;
+#if USE_ITT_BUILD
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG)
+ __kmp_itt_barrier_middle(gtid, itt_sync_obj);
+#endif /* USE_ITT_BUILD */
+ }
+ if (status == 1 || ! is_split) {
+ switch (__kmp_barrier_release_pattern[bt]) {
+ case bp_hyper_bar: {
+ KMP_ASSERT(__kmp_barrier_release_branch_bits[bt]);
+ __kmp_hyper_barrier_release(bt, this_thr, gtid, tid, FALSE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ case bp_hierarchical_bar: {
+ __kmp_hierarchical_barrier_release(bt, this_thr, gtid, tid, FALSE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ case bp_tree_bar: {
+ KMP_ASSERT(__kmp_barrier_release_branch_bits[bt]);
+ __kmp_tree_barrier_release(bt, this_thr, gtid, tid, FALSE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ default: {
+ __kmp_linear_barrier_release(bt, this_thr, gtid, tid, FALSE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ }
+ }
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ __kmp_task_team_sync(this_thr, team);
+ }
+ }
+
+#if USE_ITT_BUILD
+ /* GEH: TODO: Move this under if-condition above and also include in
+ __kmp_end_split_barrier(). This will more accurately represent the actual release time
+ of the threads for split barriers. */
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG)
+ __kmp_itt_barrier_finished(gtid, itt_sync_obj);
+#endif /* USE_ITT_BUILD */
+ } else { // Team is serialized.
+ status = 0;
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ // The task team should be NULL for serialized code (tasks will be executed immediately)
+ KMP_DEBUG_ASSERT(team->t.t_task_team == NULL);
+ KMP_DEBUG_ASSERT(this_thr->th.th_task_team == NULL);
+ }
+ }
+ KA_TRACE(15, ("__kmp_barrier: T#%d(%d:%d) is leaving with return value %d\n",
+ gtid, __kmp_team_from_gtid(gtid)->t.t_id, __kmp_tid_from_gtid(gtid), status));
+ return status;
+}
+
+
+void
+__kmp_end_split_barrier(enum barrier_type bt, int gtid)
+{
+ KMP_TIME_BLOCK(KMP_end_split_barrier);
+ int tid = __kmp_tid_from_gtid(gtid);
+ kmp_info_t *this_thr = __kmp_threads[gtid];
+ kmp_team_t *team = this_thr->th.th_team;
+
+ if (!team->t.t_serialized) {
+ if (KMP_MASTER_GTID(gtid)) {
+ switch (__kmp_barrier_release_pattern[bt]) {
+ case bp_hyper_bar: {
+ KMP_ASSERT(__kmp_barrier_release_branch_bits[bt]);
+ __kmp_hyper_barrier_release(bt, this_thr, gtid, tid, FALSE
+ USE_ITT_BUILD_ARG(NULL) );
+ break;
+ }
+ case bp_hierarchical_bar: {
+ __kmp_hierarchical_barrier_release(bt, this_thr, gtid, tid, FALSE
+ USE_ITT_BUILD_ARG(NULL));
+ break;
+ }
+ case bp_tree_bar: {
+ KMP_ASSERT(__kmp_barrier_release_branch_bits[bt]);
+ __kmp_tree_barrier_release(bt, this_thr, gtid, tid, FALSE
+ USE_ITT_BUILD_ARG(NULL) );
+ break;
+ }
+ default: {
+ __kmp_linear_barrier_release(bt, this_thr, gtid, tid, FALSE
+ USE_ITT_BUILD_ARG(NULL) );
+ }
+ }
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ __kmp_task_team_sync(this_thr, team);
+ } // if
+ }
+ }
+}
+
+
+void
+__kmp_join_barrier(int gtid)
+{
+ KMP_TIME_BLOCK(KMP_join_barrier);
+ register kmp_info_t *this_thr = __kmp_threads[gtid];
+ register kmp_team_t *team;
+ register kmp_uint nproc;
+ kmp_info_t *master_thread;
+ int tid;
+#ifdef KMP_DEBUG
+ int team_id;
+#endif /* KMP_DEBUG */
+#if USE_ITT_BUILD
+ void *itt_sync_obj = NULL;
+# if USE_ITT_NOTIFY
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG) // Don't call routine without need
+ // Get object created at fork_barrier
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bs_forkjoin_barrier);
+# endif
+#endif /* USE_ITT_BUILD */
+ KMP_MB();
+
+ // Get current info
+ team = this_thr->th.th_team;
+ nproc = this_thr->th.th_team_nproc;
+ KMP_DEBUG_ASSERT((int)nproc == team->t.t_nproc);
+ tid = __kmp_tid_from_gtid(gtid);
+#ifdef KMP_DEBUG
+ team_id = team->t.t_id;
+#endif /* KMP_DEBUG */
+ master_thread = this_thr->th.th_team_master;
+#ifdef KMP_DEBUG
+ if (master_thread != team->t.t_threads[0]) {
+ __kmp_print_structure();
+ }
+#endif /* KMP_DEBUG */
+ KMP_DEBUG_ASSERT(master_thread == team->t.t_threads[0]);
+ KMP_MB();
+
+ // Verify state
+ KMP_DEBUG_ASSERT(__kmp_threads && __kmp_threads[gtid]);
+ KMP_DEBUG_ASSERT(TCR_PTR(this_thr->th.th_team));
+ KMP_DEBUG_ASSERT(TCR_PTR(this_thr->th.th_root));
+ KMP_DEBUG_ASSERT(this_thr == team->t.t_threads[tid]);
+ KA_TRACE(10, ("__kmp_join_barrier: T#%d(%d:%d) arrived at join barrier\n", gtid, team_id, tid));
+
+ if (__kmp_tasking_mode == tskm_extra_barrier) {
+ __kmp_tasking_barrier(team, this_thr, gtid);
+ KA_TRACE(10, ("__kmp_join_barrier: T#%d(%d:%d) past taking barrier\n", gtid, team_id, tid));
+ }
+# ifdef KMP_DEBUG
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ KA_TRACE(20, ( "__kmp_join_barrier: T#%d, old team = %d, old task_team = %p, th_task_team = %p\n",
+ __kmp_gtid_from_thread(this_thr), team_id, team->t.t_task_team,
+ this_thr->th.th_task_team));
+ KMP_DEBUG_ASSERT(this_thr->th.th_task_team == team->t.t_task_team);
+ }
+# endif /* KMP_DEBUG */
+
+ /* Copy the blocktime info to the thread, where __kmp_wait_template() can access it when the
+ team struct is not guaranteed to exist. Doing these loads causes a cache miss slows
+ down EPCC parallel by 2x. As a workaround, we do not perform the copy if blocktime=infinite,
+ since the values are not used by __kmp_wait_template() in that case. */
+ if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) {
+ this_thr->th.th_team_bt_intervals = team->t.t_implicit_task_taskdata[tid].td_icvs.bt_intervals;
+ this_thr->th.th_team_bt_set = team->t.t_implicit_task_taskdata[tid].td_icvs.bt_set;
+ }
+
+#if USE_ITT_BUILD
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG)
+ __kmp_itt_barrier_starting(gtid, itt_sync_obj);
+#endif /* USE_ITT_BUILD */
+
+ switch (__kmp_barrier_gather_pattern[bs_forkjoin_barrier]) {
+ case bp_hyper_bar: {
+ KMP_ASSERT(__kmp_barrier_gather_branch_bits[bs_forkjoin_barrier]);
+ __kmp_hyper_barrier_gather(bs_forkjoin_barrier, this_thr, gtid, tid, NULL
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ case bp_hierarchical_bar: {
+ __kmp_hierarchical_barrier_gather(bs_forkjoin_barrier, this_thr, gtid, tid, NULL
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ case bp_tree_bar: {
+ KMP_ASSERT(__kmp_barrier_gather_branch_bits[bs_forkjoin_barrier]);
+ __kmp_tree_barrier_gather(bs_forkjoin_barrier, this_thr, gtid, tid, NULL
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ default: {
+ __kmp_linear_barrier_gather(bs_forkjoin_barrier, this_thr, gtid, tid, NULL
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ }
+ }
+
+ /* From this point on, the team data structure may be deallocated at any time by the
+ master thread - it is unsafe to reference it in any of the worker threads. Any per-team
+ data items that need to be referenced before the end of the barrier should be moved to
+ the kmp_task_team_t structs. */
+ if (KMP_MASTER_TID(tid)) {
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ // Master shouldn't call decrease_load(). // TODO: enable master threads.
+ // Master should have th_may_decrease_load == 0. // TODO: enable master threads.
+ __kmp_task_team_wait(this_thr, team
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ }
+#if USE_ITT_BUILD
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG)
+ __kmp_itt_barrier_middle(gtid, itt_sync_obj);
+#endif /* USE_ITT_BUILD */
+
+# if USE_ITT_BUILD && USE_ITT_NOTIFY
+ // Join barrier - report frame end
+ if (__itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode) {
+ kmp_uint64 cur_time = __itt_get_timestamp();
+ ident_t * loc = team->t.t_ident;
+ kmp_info_t **other_threads = this_thr->th.th_team->t.t_threads;
+ int nproc = this_thr->th.th_team_nproc;
+ int i;
+ // Initialize with master's wait time
+ kmp_uint64 delta = cur_time - this_thr->th.th_bar_arrive_time;
+ switch(__kmp_forkjoin_frames_mode) {
+ case 1:
+ __kmp_itt_frame_submit(gtid, this_thr->th.th_frame_time, cur_time, 0, loc, nproc);
+ break;
+ case 2:
+ __kmp_itt_frame_submit(gtid, this_thr->th.th_bar_min_time, cur_time, 1, loc, nproc);
+ break;
+ case 3:
+ if( __itt_metadata_add_ptr ) {
+ for (i=1; i<nproc; ++i) {
+ delta += ( cur_time - other_threads[i]->th.th_bar_arrive_time );
+ }
+ __kmp_itt_metadata_imbalance(gtid, this_thr->th.th_frame_time, cur_time, delta, 0);
+ }
+ __kmp_itt_frame_submit(gtid, this_thr->th.th_frame_time, cur_time, 0, loc, nproc);
+ this_thr->th.th_frame_time = cur_time;
+ break;
+ }
+ }
+# endif /* USE_ITT_BUILD */
+ }
+#if USE_ITT_BUILD
+ else {
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG)
+ __kmp_itt_barrier_middle(gtid, itt_sync_obj);
+ }
+#endif /* USE_ITT_BUILD */
+
+#if KMP_DEBUG
+ if (KMP_MASTER_TID(tid)) {
+ KA_TRACE(15, ("__kmp_join_barrier: T#%d(%d:%d) says all %d team threads arrived\n",
+ gtid, team_id, tid, nproc));
+ }
+#endif /* KMP_DEBUG */
+
+ // TODO now, mark worker threads as done so they may be disbanded
+ KMP_MB(); // Flush all pending memory write invalidates.
+ KA_TRACE(10, ("__kmp_join_barrier: T#%d(%d:%d) leaving\n", gtid, team_id, tid));
+}
+
+
+// TODO release worker threads' fork barriers as we are ready instead of all at once
+void
+__kmp_fork_barrier(int gtid, int tid)
+{
+ KMP_TIME_BLOCK(KMP_fork_barrier);
+ kmp_info_t *this_thr = __kmp_threads[gtid];
+ kmp_team_t *team = (tid == 0) ? this_thr->th.th_team : NULL;
+#if USE_ITT_BUILD
+ void * itt_sync_obj = NULL;
+#endif /* USE_ITT_BUILD */
+
+ KA_TRACE(10, ("__kmp_fork_barrier: T#%d(%d:%d) has arrived\n",
+ gtid, (team != NULL) ? team->t.t_id : -1, tid));
+
+ // th_team pointer only valid for master thread here
+ if (KMP_MASTER_TID(tid)) {
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG) {
+ // Create itt barrier object
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bs_forkjoin_barrier, 1);
+ __kmp_itt_barrier_middle(gtid, itt_sync_obj); // Call acquired/releasing
+ }
+#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
+
+#ifdef KMP_DEBUG
+ register kmp_info_t **other_threads = team->t.t_threads;
+ register int i;
+
+ // Verify state
+ KMP_MB();
+
+ for(i=1; i<team->t.t_nproc; ++i) {
+ KA_TRACE(500, ("__kmp_fork_barrier: T#%d(%d:0) checking T#%d(%d:%d) fork go == %u.\n",
+ gtid, team->t.t_id, other_threads[i]->th.th_info.ds.ds_gtid,
+ team->t.t_id, other_threads[i]->th.th_info.ds.ds_tid,
+ other_threads[i]->th.th_bar[bs_forkjoin_barrier].bb.b_go));
+ KMP_DEBUG_ASSERT((TCR_4(other_threads[i]->th.th_bar[bs_forkjoin_barrier].bb.b_go)
+ & ~(KMP_BARRIER_SLEEP_STATE))
+ == KMP_INIT_BARRIER_STATE);
+ KMP_DEBUG_ASSERT(other_threads[i]->th.th_team == team);
+ }
+#endif
+
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ __kmp_task_team_setup(this_thr, team);
+ }
+
+ /* The master thread may have changed its blocktime between the join barrier and the
+ fork barrier. Copy the blocktime info to the thread, where __kmp_wait_template() can
+ access it when the team struct is not guaranteed to exist. */
+ // See note about the corresponding code in __kmp_join_barrier() being performance-critical
+ if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) {
+ this_thr->th.th_team_bt_intervals = team->t.t_implicit_task_taskdata[tid].td_icvs.bt_intervals;
+ this_thr->th.th_team_bt_set = team->t.t_implicit_task_taskdata[tid].td_icvs.bt_set;
+ }
+ } // master
+
+ switch (__kmp_barrier_release_pattern[bs_forkjoin_barrier]) {
+ case bp_hyper_bar: {
+ KMP_ASSERT(__kmp_barrier_release_branch_bits[bs_forkjoin_barrier]);
+ __kmp_hyper_barrier_release(bs_forkjoin_barrier, this_thr, gtid, tid, TRUE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ case bp_hierarchical_bar: {
+ __kmp_hierarchical_barrier_release(bs_forkjoin_barrier, this_thr, gtid, tid, TRUE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ case bp_tree_bar: {
+ KMP_ASSERT(__kmp_barrier_release_branch_bits[bs_forkjoin_barrier]);
+ __kmp_tree_barrier_release(bs_forkjoin_barrier, this_thr, gtid, tid, TRUE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ break;
+ }
+ default: {
+ __kmp_linear_barrier_release(bs_forkjoin_barrier, this_thr, gtid, tid, TRUE
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+ }
+ }
+
+ // Early exit for reaping threads releasing forkjoin barrier
+ if (TCR_4(__kmp_global.g.g_done)) {
+ if (this_thr->th.th_task_team != NULL) {
+ if (KMP_MASTER_TID(tid)) {
+ TCW_PTR(this_thr->th.th_task_team, NULL);
+ }
+ else {
+ __kmp_unref_task_team(this_thr->th.th_task_team, this_thr);
+ }
+ }
+
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG) {
+ if (!KMP_MASTER_TID(tid)) {
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bs_forkjoin_barrier);
+ if (itt_sync_obj)
+ __kmp_itt_barrier_finished(gtid, itt_sync_obj);
+ }
+ }
+#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
+ KA_TRACE(10, ("__kmp_fork_barrier: T#%d is leaving early\n", gtid));
+ return;
+ }
+
+ /* We can now assume that a valid team structure has been allocated by the master and
+ propagated to all worker threads. The current thread, however, may not be part of the
+ team, so we can't blindly assume that the team pointer is non-null. */
+ team = (kmp_team_t *)TCR_PTR(this_thr->th.th_team);
+ KMP_DEBUG_ASSERT(team != NULL);
+ tid = __kmp_tid_from_gtid(gtid);
+
+
+#if KMP_BARRIER_ICV_PULL
+ /* Master thread's copy of the ICVs was set up on the implicit taskdata in
+ __kmp_reinitialize_team. __kmp_fork_call() assumes the master thread's implicit task has
+ this data before this function is called. We cannot modify __kmp_fork_call() to look at
+ the fixed ICVs in the master's thread struct, because it is not always the case that the
+ threads arrays have been allocated when __kmp_fork_call() is executed. */
+ KMP_START_EXPLICIT_TIMER(USER_icv_copy);
+ if (!KMP_MASTER_TID(tid)) { // master thread already has ICVs
+ // Copy the initial ICVs from the master's thread struct to the implicit task for this tid.
+ KA_TRACE(10, ("__kmp_fork_barrier: T#%d(%d) is PULLing ICVs\n", gtid, tid));
+ __kmp_init_implicit_task(team->t.t_ident, team->t.t_threads[tid], team, tid, FALSE);
+ copy_icvs(&team->t.t_implicit_task_taskdata[tid].td_icvs,
+ &team->t.t_threads[0]->th.th_bar[bs_forkjoin_barrier].bb.th_fixed_icvs);
+ }
+ KMP_STOP_EXPLICIT_TIMER(USER_icv_copy);
+#endif // KMP_BARRIER_ICV_PULL
+
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ __kmp_task_team_sync(this_thr, team);
+ }
+
+#if OMP_40_ENABLED && KMP_AFFINITY_SUPPORTED
+ kmp_proc_bind_t proc_bind = team->t.t_proc_bind;
+ if (proc_bind == proc_bind_intel) {
+#endif
+#if KMP_MIC
+ // Call dynamic affinity settings
+ if(__kmp_affinity_type == affinity_balanced && team->t.t_size_changed) {
+ __kmp_balanced_affinity(tid, team->t.t_nproc);
+ }
+#endif
+#if OMP_40_ENABLED && KMP_AFFINITY_SUPPORTED
+ }
+ else if ((proc_bind != proc_bind_false)
+ && (proc_bind != proc_bind_disabled)) {
+ if (this_thr->th.th_new_place == this_thr->th.th_current_place) {
+ KA_TRACE(100, ("__kmp_fork_barrier: T#%d already in correct place %d\n",
+ __kmp_gtid_from_thread(this_thr), this_thr->th.th_current_place));
+ }
+ else {
+ __kmp_affinity_set_place(gtid);
+ }
+ }
+#endif
+
+#if USE_ITT_BUILD && USE_ITT_NOTIFY
+ if (__itt_sync_create_ptr || KMP_ITT_DEBUG) {
+ if (!KMP_MASTER_TID(tid)) {
+ // Get correct barrier object
+ itt_sync_obj = __kmp_itt_barrier_object(gtid, bs_forkjoin_barrier);
+ __kmp_itt_barrier_finished(gtid, itt_sync_obj); // Workers call acquired
+ } // (prepare called inside barrier_release)
+ }
+#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
+ KA_TRACE(10, ("__kmp_fork_barrier: T#%d(%d:%d) is leaving\n", gtid, team->t.t_id, tid));
+}
+
+
+void
+__kmp_setup_icv_copy(kmp_team_t *team, int new_nproc, kmp_internal_control_t *new_icvs, ident_t *loc )
+{
+ KMP_TIME_BLOCK(KMP_setup_icv_copy);
+ int f;
+
+ KMP_DEBUG_ASSERT(team && new_nproc && new_icvs);
+ KMP_DEBUG_ASSERT((!TCR_4(__kmp_init_parallel)) || new_icvs->nproc);
+
+ /* Master thread's copy of the ICVs was set up on the implicit taskdata in
+ __kmp_reinitialize_team. __kmp_fork_call() assumes the master thread's implicit task has
+ this data before this function is called. */
+#if KMP_BARRIER_ICV_PULL
+ /* Copy ICVs to master's thread structure into th_fixed_icvs (which remains untouched), where
+ all of the worker threads can access them and make their own copies after the barrier. */
+ KMP_DEBUG_ASSERT(team->t.t_threads[0]); // The threads arrays should be allocated at this point
+ copy_icvs(&team->t.t_threads[0]->th.th_bar[bs_forkjoin_barrier].bb.th_fixed_icvs, new_icvs);
+ KF_TRACE(10, ("__kmp_setup_icv_copy: PULL: T#%d this_thread=%p team=%p\n",
+ 0, team->t.t_threads[0], team));
+#elif KMP_BARRIER_ICV_PUSH
+ // The ICVs will be propagated in the fork barrier, so nothing needs to be done here.
+ KF_TRACE(10, ("__kmp_setup_icv_copy: PUSH: T#%d this_thread=%p team=%p\n",
+ 0, team->t.t_threads[0], team));
+#else
+ // Copy the ICVs to each of the non-master threads. This takes O(nthreads) time.
+ ngo_load(new_icvs);
+ KMP_DEBUG_ASSERT(team->t.t_threads[0]); // The threads arrays should be allocated at this point
+ for (f=1; f<new_nproc; ++f) { // Skip the master thread
+ // TODO: GEH - pass in better source location info since usually NULL here
+ KF_TRACE(10, ("__kmp_setup_icv_copy: LINEAR: T#%d this_thread=%p team=%p\n",
+ f, team->t.t_threads[f], team));
+ __kmp_init_implicit_task(loc, team->t.t_threads[f], team, f, FALSE);
+ ngo_store_icvs(&team->t.t_implicit_task_taskdata[f].td_icvs, new_icvs);
+ KF_TRACE(10, ("__kmp_setup_icv_copy: LINEAR: T#%d this_thread=%p team=%p\n",
+ f, team->t.t_threads[f], team));
+ }
+ ngo_sync();
+#endif // KMP_BARRIER_ICV_PULL
+}
diff --git a/openmp/runtime/src/kmp_csupport.c b/openmp/runtime/src/kmp_csupport.c
index 780bd41cb78..af5c6144c2d 100644
--- a/openmp/runtime/src/kmp_csupport.c
+++ b/openmp/runtime/src/kmp_csupport.c
@@ -1,7 +1,7 @@
/*
* kmp_csupport.c -- kfront linkage support for OpenMP.
- * $Revision: 42826 $
- * $Date: 2013-11-20 03:39:45 -0600 (Wed, 20 Nov 2013) $
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
*/
@@ -20,6 +20,7 @@
#include "kmp_i18n.h"
#include "kmp_itt.h"
#include "kmp_error.h"
+#include "kmp_stats.h"
#define MAX_MESSAGE 512
@@ -35,7 +36,7 @@
* @param flags in for future use (currently ignored)
*
* Initialize the runtime library. This call is optional; if it is not made then
- * it will be implicilty called by attempts to use other library functions.
+ * it will be implicitly called by attempts to use other library functions.
*
*/
void
@@ -276,13 +277,18 @@ Do the actual fork and call the microtask in the relevant number of threads.
void
__kmpc_fork_call(ident_t *loc, kmp_int32 argc, kmpc_micro microtask, ...)
{
+ KMP_STOP_EXPLICIT_TIMER(OMP_serial);
+ KMP_COUNT_BLOCK(OMP_PARALLEL);
int gtid = __kmp_entry_gtid();
// maybe to save thr_state is enough here
{
va_list ap;
va_start( ap, microtask );
- __kmp_fork_call( loc, gtid, TRUE,
+#if INCLUDE_SSC_MARKS
+ SSC_MARK_FORKING();
+#endif
+ __kmp_fork_call( loc, gtid, fork_context_intel,
argc,
VOLATILE_CAST(microtask_t) microtask,
VOLATILE_CAST(launch_t) __kmp_invoke_task_func,
@@ -293,10 +299,14 @@ __kmpc_fork_call(ident_t *loc, kmp_int32 argc, kmpc_micro microtask, ...)
ap
#endif
);
+#if INCLUDE_SSC_MARKS
+ SSC_MARK_JOINING();
+#endif
__kmp_join_call( loc, gtid );
va_end( ap );
}
+ KMP_START_EXPLICIT_TIMER(OMP_serial);
}
#if OMP_40_ENABLED
@@ -337,17 +347,18 @@ __kmpc_fork_teams(ident_t *loc, kmp_int32 argc, kmpc_micro microtask, ...)
va_start( ap, microtask );
// remember teams entry point and nesting level
- this_thr->th.th_team_microtask = microtask;
+ this_thr->th.th_teams_microtask = microtask;
this_thr->th.th_teams_level = this_thr->th.th_team->t.t_level; // AC: can be >0 on host
// check if __kmpc_push_num_teams called, set default number of teams otherwise
- if ( this_thr->th.th_set_nth_teams == 0 ) {
+ if ( this_thr->th.th_teams_size.nteams == 0 ) {
__kmp_push_num_teams( loc, gtid, 0, 0 );
}
KMP_DEBUG_ASSERT(this_thr->th.th_set_nproc >= 1);
- KMP_DEBUG_ASSERT(this_thr->th.th_set_nth_teams >= 1);
+ KMP_DEBUG_ASSERT(this_thr->th.th_teams_size.nteams >= 1);
+ KMP_DEBUG_ASSERT(this_thr->th.th_teams_size.nth >= 1);
- __kmp_fork_call( loc, gtid, TRUE,
+ __kmp_fork_call( loc, gtid, fork_context_intel,
argc,
VOLATILE_CAST(microtask_t) __kmp_teams_master,
VOLATILE_CAST(launch_t) __kmp_invoke_teams_master,
@@ -358,9 +369,9 @@ __kmpc_fork_teams(ident_t *loc, kmp_int32 argc, kmpc_micro microtask, ...)
#endif
);
__kmp_join_call( loc, gtid );
- this_thr->th.th_team_microtask = NULL;
+ this_thr->th.th_teams_microtask = NULL;
this_thr->th.th_teams_level = 0;
-
+ *(kmp_int64*)(&this_thr->th.th_teams_size) = 0L;
va_end( ap );
}
#endif /* OMP_40_ENABLED */
@@ -393,252 +404,9 @@ when the condition is false.
void
__kmpc_serialized_parallel(ident_t *loc, kmp_int32 global_tid)
{
- kmp_info_t *this_thr;
- kmp_team_t *serial_team;
-
- KC_TRACE( 10, ("__kmpc_serialized_parallel: called by T#%d\n", global_tid ) );
-
- /* Skip all this code for autopar serialized loops since it results in
- unacceptable overhead */
- if( loc != NULL && (loc->flags & KMP_IDENT_AUTOPAR ) )
- return;
-
- if( ! TCR_4( __kmp_init_parallel ) )
- __kmp_parallel_initialize();
-
- this_thr = __kmp_threads[ global_tid ];
- serial_team = this_thr -> th.th_serial_team;
-
- /* utilize the serialized team held by this thread */
- KMP_DEBUG_ASSERT( serial_team );
- KMP_MB();
-
-#if OMP_30_ENABLED
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- KMP_DEBUG_ASSERT( this_thr -> th.th_task_team == this_thr -> th.th_team -> t.t_task_team );
- KMP_DEBUG_ASSERT( serial_team -> t.t_task_team == NULL );
- KA_TRACE( 20, ( "__kmpc_serialized_parallel: T#%d pushing task_team %p / team %p, new task_team = NULL\n",
- global_tid, this_thr -> th.th_task_team, this_thr -> th.th_team ) );
- this_thr -> th.th_task_team = NULL;
- }
-#endif // OMP_30_ENABLED
-
-#if OMP_40_ENABLED
- kmp_proc_bind_t proc_bind = this_thr->th.th_set_proc_bind;
- if ( this_thr->th.th_current_task->td_icvs.proc_bind == proc_bind_false ) {
- proc_bind = proc_bind_false;
- }
- else if ( proc_bind == proc_bind_default ) {
- //
- // No proc_bind clause was specified, so use the current value
- // of proc-bind-var for this parallel region.
- //
- proc_bind = this_thr->th.th_current_task->td_icvs.proc_bind;
- }
- //
- // Reset for next parallel region
- //
- this_thr->th.th_set_proc_bind = proc_bind_default;
-#endif /* OMP_3_ENABLED */
-
- if( this_thr -> th.th_team != serial_team ) {
-#if OMP_30_ENABLED
- // Nested level will be an index in the nested nthreads array
- int level = this_thr->th.th_team->t.t_level;
-#endif
- if( serial_team -> t.t_serialized ) {
- /* this serial team was already used
- * TODO increase performance by making this locks more specific */
- kmp_team_t *new_team;
- int tid = this_thr->th.th_info.ds.ds_tid;
-
- __kmp_acquire_bootstrap_lock( &__kmp_forkjoin_lock );
-
- new_team = __kmp_allocate_team(this_thr->th.th_root, 1, 1,
-#if OMP_40_ENABLED
- proc_bind,
-#endif
-#if OMP_30_ENABLED
- & this_thr->th.th_current_task->td_icvs,
-#else
- this_thr->th.th_team->t.t_set_nproc[tid],
- this_thr->th.th_team->t.t_set_dynamic[tid],
- this_thr->th.th_team->t.t_set_nested[tid],
- this_thr->th.th_team->t.t_set_blocktime[tid],
- this_thr->th.th_team->t.t_set_bt_intervals[tid],
- this_thr->th.th_team->t.t_set_bt_set[tid],
-#endif // OMP_30_ENABLED
- 0);
- __kmp_release_bootstrap_lock( &__kmp_forkjoin_lock );
- KMP_ASSERT( new_team );
-
- /* setup new serialized team and install it */
- new_team -> t.t_threads[0] = this_thr;
- new_team -> t.t_parent = this_thr -> th.th_team;
- serial_team = new_team;
- this_thr -> th.th_serial_team = serial_team;
-
- KF_TRACE( 10, ( "__kmpc_serialized_parallel: T#%d allocated new serial team %p\n",
- global_tid, serial_team ) );
-
-
- /* TODO the above breaks the requirement that if we run out of
- * resources, then we can still guarantee that serialized teams
- * are ok, since we may need to allocate a new one */
- } else {
- KF_TRACE( 10, ( "__kmpc_serialized_parallel: T#%d reusing cached serial team %p\n",
- global_tid, serial_team ) );
- }
-
- /* we have to initialize this serial team */
- KMP_DEBUG_ASSERT( serial_team->t.t_threads );
- KMP_DEBUG_ASSERT( serial_team->t.t_threads[0] == this_thr );
- KMP_DEBUG_ASSERT( this_thr->th.th_team != serial_team );
- serial_team -> t.t_ident = loc;
- serial_team -> t.t_serialized = 1;
- serial_team -> t.t_nproc = 1;
- serial_team -> t.t_parent = this_thr->th.th_team;
-#if OMP_30_ENABLED
- serial_team -> t.t_sched = this_thr->th.th_team->t.t_sched;
-#endif // OMP_30_ENABLED
- this_thr -> th.th_team = serial_team;
- serial_team -> t.t_master_tid = this_thr->th.th_info.ds.ds_tid;
-
-#if OMP_30_ENABLED
- KF_TRACE( 10, ( "__kmpc_serialized_parallel: T#d curtask=%p\n",
- global_tid, this_thr->th.th_current_task ) );
- KMP_ASSERT( this_thr->th.th_current_task->td_flags.executing == 1 );
- this_thr->th.th_current_task->td_flags.executing = 0;
-
- __kmp_push_current_task_to_thread( this_thr, serial_team, 0 );
-
- /* TODO: GEH: do the ICVs work for nested serialized teams? Don't we need an implicit task for
- each serialized task represented by team->t.t_serialized? */
- copy_icvs(
- & this_thr->th.th_current_task->td_icvs,
- & this_thr->th.th_current_task->td_parent->td_icvs );
-
- // Thread value exists in the nested nthreads array for the next nested level
- if ( __kmp_nested_nth.used && ( level + 1 < __kmp_nested_nth.used ) ) {
- this_thr->th.th_current_task->td_icvs.nproc = __kmp_nested_nth.nth[ level + 1 ];
- }
-
-#if OMP_40_ENABLED
- if ( __kmp_nested_proc_bind.used && ( level + 1 < __kmp_nested_proc_bind.used ) ) {
- this_thr->th.th_current_task->td_icvs.proc_bind
- = __kmp_nested_proc_bind.bind_types[ level + 1 ];
- }
-#endif /* OMP_40_ENABLED */
-
-#else /* pre-3.0 icv's */
- serial_team -> t.t_set_nproc[0] = serial_team->t.t_parent->
- t.t_set_nproc[serial_team->
- t.t_master_tid];
- serial_team -> t.t_set_dynamic[0] = serial_team->t.t_parent->
- t.t_set_dynamic[serial_team->
- t.t_master_tid];
- serial_team -> t.t_set_nested[0] = serial_team->t.t_parent->
- t.t_set_nested[serial_team->
- t.t_master_tid];
- serial_team -> t.t_set_blocktime[0] = serial_team->t.t_parent->
- t.t_set_blocktime[serial_team->
- t.t_master_tid];
- serial_team -> t.t_set_bt_intervals[0] = serial_team->t.t_parent->
- t.t_set_bt_intervals[serial_team->
- t.t_master_tid];
- serial_team -> t.t_set_bt_set[0] = serial_team->t.t_parent->
- t.t_set_bt_set[serial_team->
- t.t_master_tid];
-#endif // OMP_30_ENABLED
- this_thr -> th.th_info.ds.ds_tid = 0;
-
- /* set thread cache values */
- this_thr -> th.th_team_nproc = 1;
- this_thr -> th.th_team_master = this_thr;
- this_thr -> th.th_team_serialized = 1;
-
-#if OMP_30_ENABLED
- serial_team -> t.t_level = serial_team -> t.t_parent -> t.t_level + 1;
- serial_team -> t.t_active_level = serial_team -> t.t_parent -> t.t_active_level;
-#endif // OMP_30_ENABLED
-
-#if KMP_ARCH_X86 || KMP_ARCH_X86_64
- if ( __kmp_inherit_fp_control ) {
- __kmp_store_x87_fpu_control_word( &serial_team->t.t_x87_fpu_control_word );
- __kmp_store_mxcsr( &serial_team->t.t_mxcsr );
- serial_team->t.t_mxcsr &= KMP_X86_MXCSR_MASK;
- serial_team->t.t_fp_control_saved = TRUE;
- } else {
- serial_team->t.t_fp_control_saved = FALSE;
- }
-#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
- /* check if we need to allocate dispatch buffers stack */
- KMP_DEBUG_ASSERT(serial_team->t.t_dispatch);
- if ( !serial_team->t.t_dispatch->th_disp_buffer ) {
- serial_team->t.t_dispatch->th_disp_buffer = (dispatch_private_info_t *)
- __kmp_allocate( sizeof( dispatch_private_info_t ) );
- }
- this_thr -> th.th_dispatch = serial_team->t.t_dispatch;
-
- KMP_MB();
-
- } else {
- /* this serialized team is already being used,
- * that's fine, just add another nested level */
- KMP_DEBUG_ASSERT( this_thr->th.th_team == serial_team );
- KMP_DEBUG_ASSERT( serial_team -> t.t_threads );
- KMP_DEBUG_ASSERT( serial_team -> t.t_threads[0] == this_thr );
- ++ serial_team -> t.t_serialized;
- this_thr -> th.th_team_serialized = serial_team -> t.t_serialized;
-
-#if OMP_30_ENABLED
- // Nested level will be an index in the nested nthreads array
- int level = this_thr->th.th_team->t.t_level;
- // Thread value exists in the nested nthreads array for the next nested level
- if ( __kmp_nested_nth.used && ( level + 1 < __kmp_nested_nth.used ) ) {
- this_thr->th.th_current_task->td_icvs.nproc = __kmp_nested_nth.nth[ level + 1 ];
- }
- serial_team -> t.t_level++;
- KF_TRACE( 10, ( "__kmpc_serialized_parallel: T#%d increasing nesting level of serial team %p to %d\n",
- global_tid, serial_team, serial_team -> t.t_level ) );
-#else
- KF_TRACE( 10, ( "__kmpc_serialized_parallel: T#%d reusing team %p for nested serialized parallel region\n",
- global_tid, serial_team ) );
-#endif // OMP_30_ENABLED
-
- /* allocate/push dispatch buffers stack */
- KMP_DEBUG_ASSERT(serial_team->t.t_dispatch);
- {
- dispatch_private_info_t * disp_buffer = (dispatch_private_info_t *)
- __kmp_allocate( sizeof( dispatch_private_info_t ) );
- disp_buffer->next = serial_team->t.t_dispatch->th_disp_buffer;
- serial_team->t.t_dispatch->th_disp_buffer = disp_buffer;
- }
- this_thr -> th.th_dispatch = serial_team->t.t_dispatch;
-
- KMP_MB();
- }
-
- if ( __kmp_env_consistency_check )
- __kmp_push_parallel( global_tid, NULL );
-
-// t_level is not available in 2.5 build, so check for OMP_30_ENABLED
-#if USE_ITT_BUILD && OMP_30_ENABLED
- // Mark the start of the "parallel" region for VTune. Only use one of frame notification scheme at the moment.
- if ( ( __itt_frame_begin_v3_ptr && __kmp_forkjoin_frames && ! __kmp_forkjoin_frames_mode ) || KMP_ITT_DEBUG )
- {
- __kmp_itt_region_forking( global_tid, 1 );
- }
- if( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) && __itt_frame_submit_v3_ptr && __itt_get_timestamp_ptr )
- {
-#if USE_ITT_NOTIFY
- if( this_thr->th.th_team->t.t_level == 1 ) {
- this_thr->th.th_frame_time_serialized = __itt_get_timestamp();
- }
-#endif
- }
-#endif /* USE_ITT_BUILD */
-
+ __kmp_serialized_parallel(loc, global_tid); /* The implementation is now in kmp_runtime.c so that it can share static functions with
+ * kmp_fork_call since the tasks to be done are similar in each case.
+ */
}
/*!
@@ -680,26 +448,13 @@ __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid)
/* If necessary, pop the internal control stack values and replace the team values */
top = serial_team -> t.t_control_stack_top;
if ( top && top -> serial_nesting_level == serial_team -> t.t_serialized ) {
-#if OMP_30_ENABLED
- copy_icvs(
- &serial_team -> t.t_threads[0] -> th.th_current_task -> td_icvs,
- top );
-#else
- serial_team -> t.t_set_nproc[0] = top -> nproc;
- serial_team -> t.t_set_dynamic[0] = top -> dynamic;
- serial_team -> t.t_set_nested[0] = top -> nested;
- serial_team -> t.t_set_blocktime[0] = top -> blocktime;
- serial_team -> t.t_set_bt_intervals[0] = top -> bt_intervals;
- serial_team -> t.t_set_bt_set[0] = top -> bt_set;
-#endif // OMP_30_ENABLED
+ copy_icvs( &serial_team -> t.t_threads[0] -> th.th_current_task -> td_icvs, top );
serial_team -> t.t_control_stack_top = top -> next;
__kmp_free(top);
}
-#if OMP_30_ENABLED
//if( serial_team -> t.t_serialized > 1 )
serial_team -> t.t_level--;
-#endif // OMP_30_ENABLED
/* pop dispatch buffers stack */
KMP_DEBUG_ASSERT(serial_team->t.t_dispatch->th_disp_buffer);
@@ -735,7 +490,6 @@ __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid)
this_thr -> th.th_dispatch = & this_thr -> th.th_team ->
t.t_dispatch[ serial_team -> t.t_master_tid ];
-#if OMP_30_ENABLED
__kmp_pop_current_task_from_thread( this_thr );
KMP_ASSERT( this_thr -> th.th_current_task -> td_flags.executing == 0 );
@@ -752,32 +506,37 @@ __kmpc_end_serialized_parallel(ident_t *loc, kmp_int32 global_tid)
KA_TRACE( 20, ( "__kmpc_end_serialized_parallel: T#%d restoring task_team %p / team %p\n",
global_tid, this_thr -> th.th_task_team, this_thr -> th.th_team ) );
}
-#endif // OMP_30_ENABLED
-
- }
- else {
-
-#if OMP_30_ENABLED
+ } else {
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
KA_TRACE( 20, ( "__kmpc_end_serialized_parallel: T#%d decreasing nesting depth of serial team %p to %d\n",
global_tid, serial_team, serial_team -> t.t_serialized ) );
}
-#endif // OMP_30_ENABLED
-
}
-// t_level is not available in 2.5 build, so check for OMP_30_ENABLED
-#if USE_ITT_BUILD && OMP_30_ENABLED
+#if USE_ITT_BUILD
+ kmp_uint64 cur_time = 0;
+#if USE_ITT_NOTIFY
+ if( __itt_get_timestamp_ptr ) {
+ cur_time = __itt_get_timestamp();
+ }
+#endif /* USE_ITT_NOTIFY */
+ // Report the barrier
+ if( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) && __itt_frame_submit_v3_ptr ) {
+ if( this_thr->th.th_team->t.t_level == 0 ) {
+ __kmp_itt_frame_submit( global_tid, this_thr->th.th_frame_time_serialized, cur_time, 0, loc, this_thr->th.th_team_nproc, 0 );
+ }
+ }
// Mark the end of the "parallel" region for VTune. Only use one of frame notification scheme at the moment.
if ( ( __itt_frame_end_v3_ptr && __kmp_forkjoin_frames && ! __kmp_forkjoin_frames_mode ) || KMP_ITT_DEBUG )
{
this_thr->th.th_ident = loc;
__kmp_itt_region_joined( global_tid, 1 );
}
- if( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) && __itt_frame_submit_v3_ptr ) {
- if( this_thr->th.th_team->t.t_level == 0 ) {
- __kmp_itt_frame_submit( global_tid, this_thr->th.th_frame_time_serialized, __itt_timestamp_none, 0, loc );
- }
+ if ( ( __itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode == 3 ) || KMP_ITT_DEBUG )
+ {
+ this_thr->th.th_ident = loc;
+ // Since barrier frame for serialized region is equal to the region we use the same begin timestamp as for the barrier.
+ __kmp_itt_frame_submit( global_tid, serial_team->t.t_region_time, cur_time, 0, loc, this_thr->th.th_team_nproc, 2 );
}
#endif /* USE_ITT_BUILD */
@@ -805,55 +564,50 @@ __kmpc_flush(ident_t *loc, ...)
/* need explicit __mf() here since use volatile instead in library */
KMP_MB(); /* Flush all pending memory write invalidates. */
- // This is not an OMP 3.0 feature.
- // This macro is used here just not to let the change go to 10.1.
- // This change will go to the mainline first.
- #if OMP_30_ENABLED
- #if ( KMP_ARCH_X86 || KMP_ARCH_X86_64 )
- #if KMP_MIC
- // fence-style instructions do not exist, but lock; xaddl $0,(%rsp) can be used.
- // We shouldn't need it, though, since the ABI rules require that
- // * If the compiler generates NGO stores it also generates the fence
- // * If users hand-code NGO stores they should insert the fence
- // therefore no incomplete unordered stores should be visible.
- #else
- // C74404
- // This is to address non-temporal store instructions (sfence needed).
- // The clflush instruction is addressed either (mfence needed).
- // Probably the non-temporal load monvtdqa instruction should also be addressed.
- // mfence is a SSE2 instruction. Do not execute it if CPU is not SSE2.
- if ( ! __kmp_cpuinfo.initialized ) {
- __kmp_query_cpuid( & __kmp_cpuinfo );
- }; // if
- if ( ! __kmp_cpuinfo.sse2 ) {
- // CPU cannot execute SSE2 instructions.
- } else {
- #if KMP_COMPILER_ICC || KMP_COMPILER_MSVC
- _mm_mfence();
- #else
- __sync_synchronize();
- #endif // KMP_COMPILER_ICC
- }; // if
- #endif // KMP_MIC
- #elif KMP_ARCH_ARM
- // Nothing yet
- #elif KMP_ARCH_PPC64
- // Nothing needed here (we have a real MB above).
- #if KMP_OS_CNK
- // The flushing thread needs to yield here; this prevents a
- // busy-waiting thread from saturating the pipeline. flush is
- // often used in loops like this:
- // while (!flag) {
- // #pragma omp flush(flag)
- // }
- // and adding the yield here is good for at least a 10x speedup
- // when running >2 threads per core (on the NAS LU benchmark).
- __kmp_yield(TRUE);
- #endif
+ #if ( KMP_ARCH_X86 || KMP_ARCH_X86_64 )
+ #if KMP_MIC
+ // fence-style instructions do not exist, but lock; xaddl $0,(%rsp) can be used.
+ // We shouldn't need it, though, since the ABI rules require that
+ // * If the compiler generates NGO stores it also generates the fence
+ // * If users hand-code NGO stores they should insert the fence
+ // therefore no incomplete unordered stores should be visible.
#else
- #error Unknown or unsupported architecture
+ // C74404
+ // This is to address non-temporal store instructions (sfence needed).
+ // The clflush instruction is addressed either (mfence needed).
+ // Probably the non-temporal load monvtdqa instruction should also be addressed.
+ // mfence is a SSE2 instruction. Do not execute it if CPU is not SSE2.
+ if ( ! __kmp_cpuinfo.initialized ) {
+ __kmp_query_cpuid( & __kmp_cpuinfo );
+ }; // if
+ if ( ! __kmp_cpuinfo.sse2 ) {
+ // CPU cannot execute SSE2 instructions.
+ } else {
+ #if KMP_COMPILER_ICC || KMP_COMPILER_MSVC
+ _mm_mfence();
+ #else
+ __sync_synchronize();
+ #endif // KMP_COMPILER_ICC
+ }; // if
+ #endif // KMP_MIC
+ #elif KMP_ARCH_ARM
+ // Nothing yet
+ #elif KMP_ARCH_PPC64
+ // Nothing needed here (we have a real MB above).
+ #if KMP_OS_CNK
+ // The flushing thread needs to yield here; this prevents a
+ // busy-waiting thread from saturating the pipeline. flush is
+ // often used in loops like this:
+ // while (!flag) {
+ // #pragma omp flush(flag)
+ // }
+ // and adding the yield here is good for at least a 10x speedup
+ // when running >2 threads per core (on the NAS LU benchmark).
+ __kmp_yield(TRUE);
#endif
- #endif // OMP_30_ENABLED
+ #else
+ #error Unknown or unsupported architecture
+ #endif
}
@@ -871,6 +625,8 @@ Execute a barrier.
void
__kmpc_barrier(ident_t *loc, kmp_int32 global_tid)
{
+ KMP_COUNT_BLOCK(OMP_BARRIER);
+ KMP_TIME_BLOCK(OMP_barrier);
int explicit_barrier_flag;
KC_TRACE( 10, ("__kmpc_barrier: called T#%d\n", global_tid ) );
@@ -906,6 +662,7 @@ __kmpc_barrier(ident_t *loc, kmp_int32 global_tid)
kmp_int32
__kmpc_master(ident_t *loc, kmp_int32 global_tid)
{
+ KMP_COUNT_BLOCK(OMP_MASTER);
int status = 0;
KC_TRACE( 10, ("__kmpc_master: called T#%d\n", global_tid ) );
@@ -1014,11 +771,6 @@ __kmpc_end_ordered( ident_t * loc, kmp_int32 gtid )
__kmp_parallel_dxo( & gtid, & cid, loc );
}
-inline void
-__kmp_static_yield( int arg ) { // AC: needed in macro __kmp_acquire_user_lock_with_checks
- __kmp_yield( arg );
-}
-
static kmp_user_lock_p
__kmp_get_critical_section_ptr( kmp_critical_name * crit, ident_t const * loc, kmp_int32 gtid )
{
@@ -1082,6 +834,7 @@ This function blocks until the executing thread can enter the critical section.
*/
void
__kmpc_critical( ident_t * loc, kmp_int32 global_tid, kmp_critical_name * crit ) {
+ KMP_COUNT_BLOCK(OMP_CRITICAL);
kmp_user_lock_p lck;
@@ -1194,6 +947,9 @@ __kmpc_barrier_master(ident_t *loc, kmp_int32 global_tid)
if ( __kmp_env_consistency_check )
__kmp_check_barrier( global_tid, ct_barrier, loc );
+#if USE_ITT_NOTIFY
+ __kmp_threads[global_tid]->th.th_ident = loc;
+#endif
status = __kmp_barrier( bs_plain_barrier, global_tid, TRUE, 0, NULL, NULL );
return (status != 0) ? 0 : 1;
@@ -1243,6 +999,9 @@ __kmpc_barrier_master_nowait( ident_t * loc, kmp_int32 global_tid )
__kmp_check_barrier( global_tid, ct_barrier, loc );
}
+#if USE_ITT_NOTIFY
+ __kmp_threads[global_tid]->th.th_ident = loc;
+#endif
__kmp_barrier( bs_plain_barrier, global_tid, FALSE, 0, NULL, NULL );
ret = __kmpc_master (loc, global_tid);
@@ -1280,6 +1039,7 @@ introduce an explicit barrier if it is required.
kmp_int32
__kmpc_single(ident_t *loc, kmp_int32 global_tid)
{
+ KMP_COUNT_BLOCK(OMP_SINGLE);
kmp_int32 rc = __kmp_enter_single( global_tid, loc, TRUE );
return rc;
}
@@ -1353,8 +1113,6 @@ ompc_set_nested( int flag )
set__nested( thread, flag ? TRUE : FALSE );
}
-#if OMP_30_ENABLED
-
void
ompc_set_max_active_levels( int max_active_levels )
{
@@ -1384,8 +1142,6 @@ ompc_get_team_size( int level )
return __kmp_get_team_size( __kmp_entry_gtid(), level );
}
-#endif // OMP_30_ENABLED
-
void
kmpc_set_stacksize( int arg )
{
@@ -1427,8 +1183,6 @@ kmpc_set_defaults( char const * str )
__kmp_aux_set_defaults( str, strlen( str ) );
}
-#ifdef OMP_30_ENABLED
-
int
kmpc_set_affinity_mask_proc( int proc, void **mask )
{
@@ -1468,7 +1222,6 @@ kmpc_get_affinity_mask_proc( int proc, void **mask )
#endif
}
-#endif /* OMP_30_ENABLED */
/* -------------------------------------------------------------------------- */
/*!
@@ -1533,6 +1286,9 @@ __kmpc_copyprivate( ident_t *loc, kmp_int32 gtid, size_t cpy_size, void *cpy_dat
if (didit) *data_ptr = cpy_data;
/* This barrier is not a barrier region boundary */
+#if USE_ITT_NOTIFY
+ __kmp_threads[gtid]->th.th_ident = loc;
+#endif
__kmp_barrier( bs_plain_barrier, gtid, FALSE , 0, NULL, NULL );
if (! didit) (*cpy_func)( cpy_data, *data_ptr );
@@ -1540,6 +1296,9 @@ __kmpc_copyprivate( ident_t *loc, kmp_int32 gtid, size_t cpy_size, void *cpy_dat
/* Consider next barrier the user-visible barrier for barrier region boundaries */
/* Nesting checks are already handled by the single construct checks */
+#if USE_ITT_NOTIFY
+ __kmp_threads[gtid]->th.th_ident = loc; // TODO: check if it is needed (e.g. tasks can overwrite the location)
+#endif
__kmp_barrier( bs_plain_barrier, gtid, FALSE , 0, NULL, NULL );
}
@@ -1722,6 +1481,7 @@ __kmpc_destroy_nest_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
void
__kmpc_set_lock( ident_t * loc, kmp_int32 gtid, void ** user_lock ) {
+ KMP_COUNT_BLOCK(OMP_set_lock);
kmp_user_lock_p lck;
if ( ( __kmp_user_lock_kind == lk_tas )
@@ -1866,6 +1626,8 @@ __kmpc_unset_nest_lock( ident_t *loc, kmp_int32 gtid, void **user_lock )
int
__kmpc_test_lock( ident_t *loc, kmp_int32 gtid, void **user_lock )
{
+ KMP_COUNT_BLOCK(OMP_test_lock);
+ KMP_TIME_BLOCK(OMP_test_lock);
kmp_user_lock_p lck;
int rc;
@@ -2028,9 +1790,14 @@ __kmpc_reduce_nowait(
kmp_int32 num_vars, size_t reduce_size, void *reduce_data, void (*reduce_func)(void *lhs_data, void *rhs_data),
kmp_critical_name *lck ) {
+ KMP_COUNT_BLOCK(REDUCE_nowait);
int retval;
PACKED_REDUCTION_METHOD_T packed_reduction_method;
-
+#if OMP_40_ENABLED
+ kmp_team_t *team;
+ kmp_info_t *th;
+ int teams_swapped = 0, task_state;
+#endif
KA_TRACE( 10, ( "__kmpc_reduce_nowait() enter: called T#%d\n", global_tid ) );
// why do we need this initialization here at all?
@@ -2045,7 +1812,25 @@ __kmpc_reduce_nowait(
if ( __kmp_env_consistency_check )
__kmp_push_sync( global_tid, ct_reduce, loc, NULL );
- // it's better to check an assertion ASSERT( thr_state == THR_WORK_STATE )
+#if OMP_40_ENABLED
+ th = __kmp_thread_from_gtid(global_tid);
+ if( th->th.th_teams_microtask ) { // AC: check if we are inside the teams construct?
+ team = th->th.th_team;
+ if( team->t.t_level == th->th.th_teams_level ) {
+ // this is reduction at teams construct
+ KMP_DEBUG_ASSERT(!th->th.th_info.ds.ds_tid); // AC: check that tid == 0
+ // Let's swap teams temporarily for the reduction barrier
+ teams_swapped = 1;
+ th->th.th_info.ds.ds_tid = team->t.t_master_tid;
+ th->th.th_team = team->t.t_parent;
+ th->th.th_task_team = th->th.th_team->t.t_task_team;
+ th->th.th_team_nproc = th->th.th_team->t.t_nproc;
+ task_state = th->th.th_task_state;
+ if( th->th.th_task_team )
+ th->th.th_task_state = th->th.th_task_team->tt.tt_state;
+ }
+ }
+#endif // OMP_40_ENABLED
// packed_reduction_method value will be reused by __kmp_end_reduce* function, the value should be kept in a variable
// the variable should be either a construct-specific or thread-specific property, not a team specific property
@@ -2091,6 +1876,9 @@ __kmpc_reduce_nowait(
// this barrier should be invisible to a customer and to the thread profiler
// (it's neither a terminating barrier nor customer's code, it's used for an internal purpose)
+#if USE_ITT_NOTIFY
+ __kmp_threads[global_tid]->th.th_ident = loc;
+#endif
retval = __kmp_barrier( UNPACK_REDUCTION_BARRIER( packed_reduction_method ), global_tid, FALSE, reduce_size, reduce_data, reduce_func );
retval = ( retval != 0 ) ? ( 0 ) : ( 1 );
@@ -2108,7 +1896,16 @@ __kmpc_reduce_nowait(
KMP_ASSERT( 0 ); // "unexpected method"
}
-
+#if OMP_40_ENABLED
+ if( teams_swapped ) {
+ // Restore thread structure
+ th->th.th_info.ds.ds_tid = 0;
+ th->th.th_team = team;
+ th->th.th_task_team = team->t.t_task_team;
+ th->th.th_team_nproc = team->t.t_nproc;
+ th->th.th_task_state = task_state;
+ }
+#endif
KA_TRACE( 10, ( "__kmpc_reduce_nowait() exit: called T#%d: method %08x, returns %08x\n", global_tid, packed_reduction_method, retval ) );
return retval;
@@ -2187,6 +1984,7 @@ __kmpc_reduce(
void (*reduce_func)(void *lhs_data, void *rhs_data),
kmp_critical_name *lck )
{
+ KMP_COUNT_BLOCK(REDUCE_wait);
int retval;
PACKED_REDUCTION_METHOD_T packed_reduction_method;
@@ -2204,8 +2002,6 @@ __kmpc_reduce(
if ( __kmp_env_consistency_check )
__kmp_push_sync( global_tid, ct_reduce, loc, NULL );
- // it's better to check an assertion ASSERT( thr_state == THR_WORK_STATE )
-
packed_reduction_method = __kmp_determine_reduction_method( loc, global_tid, num_vars, reduce_size, reduce_data, reduce_func, lck );
__KMP_SET_REDUCTION_METHOD( global_tid, packed_reduction_method );
@@ -2228,6 +2024,9 @@ __kmpc_reduce(
//case tree_reduce_block:
// this barrier should be visible to a customer and to the thread profiler
// (it's a terminating barrier on constructs if NOWAIT not specified)
+#if USE_ITT_NOTIFY
+ __kmp_threads[global_tid]->th.th_ident = loc; // needed for correct notification of frames
+#endif
retval = __kmp_barrier( UNPACK_REDUCTION_BARRIER( packed_reduction_method ), global_tid, TRUE, reduce_size, reduce_data, reduce_func );
retval = ( retval != 0 ) ? ( 0 ) : ( 1 );
@@ -2277,6 +2076,9 @@ __kmpc_end_reduce( ident_t *loc, kmp_int32 global_tid, kmp_critical_name *lck )
__kmp_end_critical_section_reduce_block( loc, global_tid, lck );
// TODO: implicit barrier: should be exposed
+#if USE_ITT_NOTIFY
+ __kmp_threads[global_tid]->th.th_ident = loc;
+#endif
__kmp_barrier( bs_plain_barrier, global_tid, FALSE, 0, NULL, NULL );
} else if( packed_reduction_method == empty_reduce_block ) {
@@ -2284,11 +2086,17 @@ __kmpc_end_reduce( ident_t *loc, kmp_int32 global_tid, kmp_critical_name *lck )
// usage: if team size == 1, no synchronization is required ( Intel platforms only )
// TODO: implicit barrier: should be exposed
+#if USE_ITT_NOTIFY
+ __kmp_threads[global_tid]->th.th_ident = loc;
+#endif
__kmp_barrier( bs_plain_barrier, global_tid, FALSE, 0, NULL, NULL );
} else if( packed_reduction_method == atomic_reduce_block ) {
// TODO: implicit barrier: should be exposed
+#if USE_ITT_NOTIFY
+ __kmp_threads[global_tid]->th.th_ident = loc;
+#endif
__kmp_barrier( bs_plain_barrier, global_tid, FALSE, 0, NULL, NULL );
} else if( TEST_REDUCTION_METHOD( packed_reduction_method, tree_reduce_block ) ) {
@@ -2319,23 +2127,15 @@ __kmpc_end_reduce( ident_t *loc, kmp_int32 global_tid, kmp_critical_name *lck )
kmp_uint64
__kmpc_get_taskid() {
- #if OMP_30_ENABLED
-
- kmp_int32 gtid;
- kmp_info_t * thread;
-
- gtid = __kmp_get_gtid();
- if ( gtid < 0 ) {
- return 0;
- }; // if
- thread = __kmp_thread_from_gtid( gtid );
- return thread->th.th_current_task->td_task_id;
-
- #else
+ kmp_int32 gtid;
+ kmp_info_t * thread;
+ gtid = __kmp_get_gtid();
+ if ( gtid < 0 ) {
return 0;
-
- #endif
+ }; // if
+ thread = __kmp_thread_from_gtid( gtid );
+ return thread->th.th_current_task->td_task_id;
} // __kmpc_get_taskid
@@ -2343,25 +2143,17 @@ __kmpc_get_taskid() {
kmp_uint64
__kmpc_get_parent_taskid() {
- #if OMP_30_ENABLED
-
- kmp_int32 gtid;
- kmp_info_t * thread;
- kmp_taskdata_t * parent_task;
-
- gtid = __kmp_get_gtid();
- if ( gtid < 0 ) {
- return 0;
- }; // if
- thread = __kmp_thread_from_gtid( gtid );
- parent_task = thread->th.th_current_task->td_parent;
- return ( parent_task == NULL ? 0 : parent_task->td_task_id );
-
- #else
+ kmp_int32 gtid;
+ kmp_info_t * thread;
+ kmp_taskdata_t * parent_task;
+ gtid = __kmp_get_gtid();
+ if ( gtid < 0 ) {
return 0;
-
- #endif
+ }; // if
+ thread = __kmp_thread_from_gtid( gtid );
+ parent_task = thread->th.th_current_task->td_parent;
+ return ( parent_task == NULL ? 0 : parent_task->td_task_id );
} // __kmpc_get_parent_taskid
diff --git a/openmp/runtime/src/kmp_debug.c b/openmp/runtime/src/kmp_debug.c
index d4e4302bb41..ad049d1f25a 100644
--- a/openmp/runtime/src/kmp_debug.c
+++ b/openmp/runtime/src/kmp_debug.c
@@ -1,7 +1,7 @@
/*
* kmp_debug.c -- debug utilities for the Guide library
- * $Revision: 42150 $
- * $Date: 2013-03-15 15:40:38 -0500 (Fri, 15 Mar 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_debug.h b/openmp/runtime/src/kmp_debug.h
index ac706ff1ba1..f4288bf5ce2 100644
--- a/openmp/runtime/src/kmp_debug.h
+++ b/openmp/runtime/src/kmp_debug.h
@@ -1,7 +1,7 @@
/*
* kmp_debug.h -- debug / assertion code for Assure library
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_dispatch.cpp b/openmp/runtime/src/kmp_dispatch.cpp
index 02253053032..cc58f493a69 100644
--- a/openmp/runtime/src/kmp_dispatch.cpp
+++ b/openmp/runtime/src/kmp_dispatch.cpp
@@ -1,7 +1,7 @@
/*
* kmp_dispatch.cpp: dynamic scheduling - iteration initialization and dispatch.
- * $Revision: 42674 $
- * $Date: 2013-09-18 11:12:49 -0500 (Wed, 18 Sep 2013) $
+ * $Revision: 43457 $
+ * $Date: 2014-09-17 03:57:22 -0500 (Wed, 17 Sep 2014) $
*/
@@ -32,6 +32,7 @@
#include "kmp_itt.h"
#include "kmp_str.h"
#include "kmp_error.h"
+#include "kmp_stats.h"
#if KMP_OS_WINDOWS && KMP_ARCH_X86
#include <float.h>
#endif
@@ -39,6 +40,34 @@
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
+// template for type limits
+template< typename T >
+struct i_maxmin {
+ static const T mx;
+ static const T mn;
+};
+template<>
+struct i_maxmin< int > {
+ static const int mx = 0x7fffffff;
+ static const int mn = 0x80000000;
+};
+template<>
+struct i_maxmin< unsigned int > {
+ static const unsigned int mx = 0xffffffff;
+ static const unsigned int mn = 0x00000000;
+};
+template<>
+struct i_maxmin< long long > {
+ static const long long mx = 0x7fffffffffffffffLL;
+ static const long long mn = 0x8000000000000000LL;
+};
+template<>
+struct i_maxmin< unsigned long long > {
+ static const unsigned long long mx = 0xffffffffffffffffLL;
+ static const unsigned long long mn = 0x0000000000000000LL;
+};
+//-------------------------------------------------------------------------
+
#ifdef KMP_STATIC_STEAL_ENABLED
// replaces dispatch_private_info{32,64} structures and dispatch_private_info{32,64}_t types
@@ -148,22 +177,6 @@ struct dispatch_shared_info_template {
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
-static void
-__kmp_static_delay( int arg )
-{
- /* Work around weird code-gen bug that causes assert to trip */
- #if KMP_ARCH_X86_64 && KMP_OS_LINUX
- #else
- KMP_ASSERT( arg >= 0 );
- #endif
-}
-
-static void
-__kmp_static_yield( int arg )
-{
- __kmp_yield( arg );
-}
-
#undef USE_TEST_LOCKS
// test_then_add template (general template should NOT be used)
@@ -294,8 +307,6 @@ __kmp_wait_yield( volatile UT * spinner,
/* if ( TCR_4(__kmp_global.g.g_done) && __kmp_global.g.g_abort)
__kmp_abort_thread(); */
- __kmp_static_delay(TRUE);
-
// if we are oversubscribed,
// or have waited a bit (and KMP_LIBRARY=throughput, then yield
// pause is in the following code
@@ -589,6 +600,9 @@ __kmp_dispatch_init(
if ( ! TCR_4( __kmp_init_parallel ) )
__kmp_parallel_initialize();
+#if INCLUDE_SSC_MARKS
+ SSC_MARK_DISPATCH_INIT();
+#endif
#ifdef KMP_DEBUG
{
const char * buff;
@@ -606,6 +620,9 @@ __kmp_dispatch_init(
active = ! team -> t.t_serialized;
th->th.th_ident = loc;
+#if USE_ITT_BUILD
+ kmp_uint64 cur_chunk = chunk;
+#endif
if ( ! active ) {
pr = reinterpret_cast< dispatch_private_info_template< T >* >
( th -> th.th_dispatch -> th_disp_buffer ); /* top of the stack */
@@ -640,23 +657,16 @@ __kmp_dispatch_init(
schedule = __kmp_static;
} else {
if ( schedule == kmp_sch_runtime ) {
- #if OMP_30_ENABLED
- // Use the scheduling specified by OMP_SCHEDULE (or __kmp_sch_default if not specified)
- schedule = team -> t.t_sched.r_sched_type;
- // Detail the schedule if needed (global controls are differentiated appropriately)
- if ( schedule == kmp_sch_guided_chunked ) {
- schedule = __kmp_guided;
- } else if ( schedule == kmp_sch_static ) {
- schedule = __kmp_static;
- }
- // Use the chunk size specified by OMP_SCHEDULE (or default if not specified)
- chunk = team -> t.t_sched.chunk;
- #else
- kmp_r_sched_t r_sched = __kmp_get_schedule_global();
- // Use the scheduling specified by OMP_SCHEDULE and/or KMP_SCHEDULE or default
- schedule = r_sched.r_sched_type;
- chunk = r_sched.chunk;
- #endif
+ // Use the scheduling specified by OMP_SCHEDULE (or __kmp_sch_default if not specified)
+ schedule = team -> t.t_sched.r_sched_type;
+ // Detail the schedule if needed (global controls are differentiated appropriately)
+ if ( schedule == kmp_sch_guided_chunked ) {
+ schedule = __kmp_guided;
+ } else if ( schedule == kmp_sch_static ) {
+ schedule = __kmp_static;
+ }
+ // Use the chunk size specified by OMP_SCHEDULE (or default if not specified)
+ chunk = team -> t.t_sched.chunk;
#ifdef KMP_DEBUG
{
@@ -678,7 +688,6 @@ __kmp_dispatch_init(
}
}
- #if OMP_30_ENABLED
if ( schedule == kmp_sch_auto ) {
// mapping and differentiation: in the __kmp_do_serial_initialize()
schedule = __kmp_auto;
@@ -694,7 +703,6 @@ __kmp_dispatch_init(
}
#endif
}
- #endif // OMP_30_ENABLED
/* guided analytical not safe for too many threads */
if ( team->t.t_nproc > 1<<20 && schedule == kmp_sch_guided_analytical_chunked ) {
@@ -848,6 +856,12 @@ __kmp_dispatch_init(
break;
}
}
+#if USE_ITT_BUILD
+ // Calculate chunk for metadata report
+ if( __itt_metadata_add_ptr && __kmp_forkjoin_frames_mode == 3 ) {
+ cur_chunk = limit - init + 1;
+ }
+#endif
if ( st == 1 ) {
pr->u.p.lb = lb + init;
pr->u.p.ub = lb + limit;
@@ -1101,6 +1115,39 @@ __kmp_dispatch_init(
}; // if
#endif /* USE_ITT_BUILD */
}; // if
+
+#if USE_ITT_BUILD
+ // Report loop metadata
+ if( __itt_metadata_add_ptr && __kmp_forkjoin_frames_mode == 3 ) {
+ kmp_uint32 tid = __kmp_tid_from_gtid( gtid );
+ if (KMP_MASTER_TID(tid)) {
+ kmp_uint64 schedtype = 0;
+
+ switch ( schedule ) {
+ case kmp_sch_static_chunked:
+ case kmp_sch_static_balanced:// Chunk is calculated in the switch above
+ break;
+ case kmp_sch_static_greedy:
+ cur_chunk = pr->u.p.parm1;
+ break;
+ case kmp_sch_dynamic_chunked:
+ schedtype = 1;
+ break;
+ case kmp_sch_guided_iterative_chunked:
+ case kmp_sch_guided_analytical_chunked:
+ schedtype = 2;
+ break;
+ default:
+// Should we put this case under "static"?
+// case kmp_sch_static_steal:
+ schedtype = 3;
+ break;
+ }
+ __kmp_itt_metadata_loop(loc, schedtype, tc, cur_chunk);
+ }
+ }
+#endif /* USE_ITT_BUILD */
+
#ifdef KMP_DEBUG
{
const char * buff;
@@ -1302,6 +1349,7 @@ __kmp_dispatch_next(
kmp_info_t * th = __kmp_threads[ gtid ];
kmp_team_t * team = th -> th.th_team;
+ KMP_DEBUG_ASSERT( p_last && p_lb && p_ub && p_st ); // AC: these cannot be NULL
#ifdef KMP_DEBUG
{
const char * buff;
@@ -1323,9 +1371,10 @@ __kmp_dispatch_next(
if ( (status = (pr->u.p.tc != 0)) == 0 ) {
*p_lb = 0;
*p_ub = 0;
- if ( p_st != 0 ) {
+// if ( p_last != NULL )
+// *p_last = 0;
+ if ( p_st != NULL )
*p_st = 0;
- }
if ( __kmp_env_consistency_check ) {
if ( pr->pushed_ws != ct_none ) {
pr->pushed_ws = __kmp_pop_workshare( gtid, pr->pushed_ws, loc );
@@ -1346,7 +1395,10 @@ __kmp_dispatch_next(
if ( (status = (init <= trip)) == 0 ) {
*p_lb = 0;
*p_ub = 0;
- if ( p_st != 0 ) *p_st = 0;
+// if ( p_last != NULL )
+// *p_last = 0;
+ if ( p_st != NULL )
+ *p_st = 0;
if ( __kmp_env_consistency_check ) {
if ( pr->pushed_ws != ct_none ) {
pr->pushed_ws = __kmp_pop_workshare( gtid, pr->pushed_ws, loc );
@@ -1363,12 +1415,10 @@ __kmp_dispatch_next(
pr->u.p.last_upper = pr->u.p.ub;
#endif /* KMP_OS_WINDOWS */
}
- if ( p_last ) {
+ if ( p_last != NULL )
*p_last = last;
- }
- if ( p_st != 0 ) {
+ if ( p_st != NULL )
*p_st = incr;
- }
if ( incr == 1 ) {
*p_lb = start + init;
*p_ub = start + limit;
@@ -1395,19 +1445,15 @@ __kmp_dispatch_next(
} // if
} else {
pr->u.p.tc = 0;
-
*p_lb = pr->u.p.lb;
*p_ub = pr->u.p.ub;
#if KMP_OS_WINDOWS
pr->u.p.last_upper = *p_ub;
#endif /* KMP_OS_WINDOWS */
-
- if ( p_st != 0 ) {
- *p_st = pr->u.p.st;
- }
- if ( p_last ) {
+ if ( p_last != NULL )
*p_last = TRUE;
- }
+ if ( p_st != NULL )
+ *p_st = pr->u.p.st;
} // if
#ifdef KMP_DEBUG
{
@@ -1415,12 +1461,15 @@ __kmp_dispatch_next(
// create format specifiers before the debug output
buff = __kmp_str_format(
"__kmp_dispatch_next: T#%%d serialized case: p_lb:%%%s " \
- "p_ub:%%%s p_st:%%%s p_last:%%p returning:%%d\n",
+ "p_ub:%%%s p_st:%%%s p_last:%%p %%d returning:%%d\n",
traits_t< T >::spec, traits_t< T >::spec, traits_t< ST >::spec );
- KD_TRACE(10, ( buff, gtid, *p_lb, *p_ub, *p_st, p_last, status) );
+ KD_TRACE(10, ( buff, gtid, *p_lb, *p_ub, *p_st, p_last, *p_last, status) );
__kmp_str_free( &buff );
}
#endif
+#if INCLUDE_SSC_MARKS
+ SSC_MARK_DISPATCH_NEXT();
+#endif
return status;
} else {
kmp_int32 last = 0;
@@ -1572,7 +1621,7 @@ __kmp_dispatch_next(
if ( !status ) {
*p_lb = 0;
*p_ub = 0;
- if ( p_st != 0 ) *p_st = 0;
+ if ( p_st != NULL ) *p_st = 0;
} else {
start = pr->u.p.parm2;
init *= chunk;
@@ -1582,10 +1631,7 @@ __kmp_dispatch_next(
KMP_DEBUG_ASSERT(init <= trip);
if ( (last = (limit >= trip)) != 0 )
limit = trip;
- if ( p_last ) {
- *p_last = last;
- }
- if ( p_st != 0 ) *p_st = incr;
+ if ( p_st != NULL ) *p_st = incr;
if ( incr == 1 ) {
*p_lb = start + init;
@@ -1622,10 +1668,7 @@ __kmp_dispatch_next(
*p_lb = pr->u.p.lb;
*p_ub = pr->u.p.ub;
last = pr->u.p.parm1;
- if ( p_last ) {
- *p_last = last;
- }
- if ( p_st )
+ if ( p_st != NULL )
*p_st = pr->u.p.st;
} else { /* no iterations to do */
pr->u.p.lb = pr->u.p.ub + pr->u.p.st;
@@ -1665,10 +1708,7 @@ __kmp_dispatch_next(
if ( (last = (limit >= trip)) != 0 )
limit = trip;
- if ( p_last ) {
- *p_last = last;
- }
- if ( p_st != 0 ) *p_st = incr;
+ if ( p_st != NULL ) *p_st = incr;
pr->u.p.count += team->t.t_nproc;
@@ -1713,7 +1753,7 @@ __kmp_dispatch_next(
if ( (status = (init <= trip)) == 0 ) {
*p_lb = 0;
*p_ub = 0;
- if ( p_st != 0 ) *p_st = 0;
+ if ( p_st != NULL ) *p_st = 0;
} else {
start = pr->u.p.lb;
limit = chunk + init - 1;
@@ -1721,10 +1761,8 @@ __kmp_dispatch_next(
if ( (last = (limit >= trip)) != 0 )
limit = trip;
- if ( p_last ) {
- *p_last = last;
- }
- if ( p_st != 0 ) *p_st = incr;
+
+ if ( p_st != NULL ) *p_st = incr;
if ( incr == 1 ) {
*p_lb = start + init;
@@ -1801,8 +1839,6 @@ __kmp_dispatch_next(
incr = pr->u.p.st;
if ( p_st != NULL )
*p_st = incr;
- if ( p_last != NULL )
- *p_last = last;
*p_lb = start + init * incr;
*p_ub = start + limit * incr;
if ( pr->ordered ) {
@@ -1906,8 +1942,6 @@ __kmp_dispatch_next(
incr = pr->u.p.st;
if ( p_st != NULL )
*p_st = incr;
- if ( p_last != NULL )
- *p_last = last;
*p_lb = start + init * incr;
*p_ub = start + limit * incr;
if ( pr->ordered ) {
@@ -1951,7 +1985,7 @@ __kmp_dispatch_next(
if ( (status = ((T)index < parm3 && init <= trip)) == 0 ) {
*p_lb = 0;
*p_ub = 0;
- if ( p_st != 0 ) *p_st = 0;
+ if ( p_st != NULL ) *p_st = 0;
} else {
start = pr->u.p.lb;
limit = ( (index+1) * ( 2*parm2 - index*parm4 ) ) / 2 - 1;
@@ -1960,10 +1994,7 @@ __kmp_dispatch_next(
if ( (last = (limit >= trip)) != 0 )
limit = trip;
- if ( p_last != 0 ) {
- *p_last = last;
- }
- if ( p_st != 0 ) *p_st = incr;
+ if ( p_st != NULL ) *p_st = incr;
if ( incr == 1 ) {
*p_lb = start + init;
@@ -1991,6 +2022,17 @@ __kmp_dispatch_next(
} // if
} // case
break;
+ default:
+ {
+ status = 0; // to avoid complaints on uninitialized variable use
+ __kmp_msg(
+ kmp_ms_fatal, // Severity
+ KMP_MSG( UnknownSchedTypeDetected ), // Primary message
+ KMP_HNT( GetNewerLibrary ), // Hint
+ __kmp_msg_null // Variadic argument list terminator
+ );
+ }
+ break;
} // switch
} // if tc == 0;
@@ -2010,7 +2052,7 @@ __kmp_dispatch_next(
}
#endif
- if ( num_done == team->t.t_nproc-1 ) {
+ if ( (ST)num_done == team->t.t_nproc-1 ) {
/* NOTE: release this buffer to be reused */
KMP_MB(); /* Flush all pending memory write invalidates. */
@@ -2048,6 +2090,8 @@ __kmp_dispatch_next(
pr->u.p.last_upper = pr->u.p.ub;
}
#endif /* KMP_OS_WINDOWS */
+ if ( p_last != NULL && status != 0 )
+ *p_last = last;
} // if
#ifdef KMP_DEBUG
@@ -2062,9 +2106,129 @@ __kmp_dispatch_next(
__kmp_str_free( &buff );
}
#endif
+#if INCLUDE_SSC_MARKS
+ SSC_MARK_DISPATCH_NEXT();
+#endif
return status;
}
+template< typename T >
+static void
+__kmp_dist_get_bounds(
+ ident_t *loc,
+ kmp_int32 gtid,
+ kmp_int32 *plastiter,
+ T *plower,
+ T *pupper,
+ typename traits_t< T >::signed_t incr
+) {
+ KMP_COUNT_BLOCK(OMP_DISTR_FOR_dynamic);
+ typedef typename traits_t< T >::unsigned_t UT;
+ typedef typename traits_t< T >::signed_t ST;
+ register kmp_uint32 team_id;
+ register kmp_uint32 nteams;
+ register UT trip_count;
+ register kmp_team_t *team;
+ kmp_info_t * th;
+
+ KMP_DEBUG_ASSERT( plastiter && plower && pupper );
+ KE_TRACE( 10, ("__kmpc_dist_get_bounds called (%d)\n", gtid));
+ #ifdef KMP_DEBUG
+ {
+ const char * buff;
+ // create format specifiers before the debug output
+ buff = __kmp_str_format( "__kmpc_dist_get_bounds: T#%%d liter=%%d "\
+ "iter=(%%%s, %%%s, %%%s) signed?<%s>\n",
+ traits_t< T >::spec, traits_t< T >::spec, traits_t< ST >::spec,
+ traits_t< T >::spec );
+ KD_TRACE(100, ( buff, gtid, *plastiter, *plower, *pupper, incr ) );
+ __kmp_str_free( &buff );
+ }
+ #endif
+
+ if( __kmp_env_consistency_check ) {
+ if( incr == 0 ) {
+ __kmp_error_construct( kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo, loc );
+ }
+ if( incr > 0 ? (*pupper < *plower) : (*plower < *pupper) ) {
+ // The loop is illegal.
+ // Some zero-trip loops maintained by compiler, e.g.:
+ // for(i=10;i<0;++i) // lower >= upper - run-time check
+ // for(i=0;i>10;--i) // lower <= upper - run-time check
+ // for(i=0;i>10;++i) // incr > 0 - compile-time check
+ // for(i=10;i<0;--i) // incr < 0 - compile-time check
+ // Compiler does not check the following illegal loops:
+ // for(i=0;i<10;i+=incr) // where incr<0
+ // for(i=10;i>0;i-=incr) // where incr<0
+ __kmp_error_construct( kmp_i18n_msg_CnsLoopIncrIllegal, ct_pdo, loc );
+ }
+ }
+ th = __kmp_threads[gtid];
+ KMP_DEBUG_ASSERT(th->th.th_teams_microtask); // we are in the teams construct
+ team = th->th.th_team;
+ #if OMP_40_ENABLED
+ nteams = th->th.th_teams_size.nteams;
+ #endif
+ team_id = team->t.t_master_tid;
+ KMP_DEBUG_ASSERT(nteams == team->t.t_parent->t.t_nproc);
+
+ // compute global trip count
+ if( incr == 1 ) {
+ trip_count = *pupper - *plower + 1;
+ } else if(incr == -1) {
+ trip_count = *plower - *pupper + 1;
+ } else {
+ trip_count = (ST)(*pupper - *plower) / incr + 1; // cast to signed to cover incr<0 case
+ }
+ if( trip_count <= nteams ) {
+ KMP_DEBUG_ASSERT(
+ __kmp_static == kmp_sch_static_greedy || \
+ __kmp_static == kmp_sch_static_balanced
+ ); // Unknown static scheduling type.
+ // only some teams get single iteration, others get nothing
+ if( team_id < trip_count ) {
+ *pupper = *plower = *plower + team_id * incr;
+ } else {
+ *plower = *pupper + incr; // zero-trip loop
+ }
+ if( plastiter != NULL )
+ *plastiter = ( team_id == trip_count - 1 );
+ } else {
+ if( __kmp_static == kmp_sch_static_balanced ) {
+ register UT chunk = trip_count / nteams;
+ register UT extras = trip_count % nteams;
+ *plower += incr * ( team_id * chunk + ( team_id < extras ? team_id : extras ) );
+ *pupper = *plower + chunk * incr - ( team_id < extras ? 0 : incr );
+ if( plastiter != NULL )
+ *plastiter = ( team_id == nteams - 1 );
+ } else {
+ register T chunk_inc_count =
+ ( trip_count / nteams + ( ( trip_count % nteams ) ? 1 : 0) ) * incr;
+ register T upper = *pupper;
+ KMP_DEBUG_ASSERT( __kmp_static == kmp_sch_static_greedy );
+ // Unknown static scheduling type.
+ *plower += team_id * chunk_inc_count;
+ *pupper = *plower + chunk_inc_count - incr;
+ // Check/correct bounds if needed
+ if( incr > 0 ) {
+ if( *pupper < *plower )
+ *pupper = i_maxmin< T >::mx;
+ if( plastiter != NULL )
+ *plastiter = *plower <= upper && *pupper > upper - incr;
+ if( *pupper > upper )
+ *pupper = upper; // tracker C73258
+ } else {
+ if( *pupper > *plower )
+ *pupper = i_maxmin< T >::mn;
+ if( plastiter != NULL )
+ *plastiter = *plower >= upper && *pupper < upper - incr;
+ if( *pupper < upper )
+ *pupper = upper; // tracker C73258
+ }
+ }
+ }
+}
+
//-----------------------------------------------------------------------------------------
// Dispatch routines
// Transfer call to template< type T >
@@ -2091,6 +2255,7 @@ void
__kmpc_dispatch_init_4( ident_t *loc, kmp_int32 gtid, enum sched_type schedule,
kmp_int32 lb, kmp_int32 ub, kmp_int32 st, kmp_int32 chunk )
{
+ KMP_COUNT_BLOCK(OMP_FOR_dynamic);
KMP_DEBUG_ASSERT( __kmp_init_serial );
__kmp_dispatch_init< kmp_int32 >( loc, gtid, schedule, lb, ub, st, chunk, true );
}
@@ -2101,6 +2266,7 @@ void
__kmpc_dispatch_init_4u( ident_t *loc, kmp_int32 gtid, enum sched_type schedule,
kmp_uint32 lb, kmp_uint32 ub, kmp_int32 st, kmp_int32 chunk )
{
+ KMP_COUNT_BLOCK(OMP_FOR_dynamic);
KMP_DEBUG_ASSERT( __kmp_init_serial );
__kmp_dispatch_init< kmp_uint32 >( loc, gtid, schedule, lb, ub, st, chunk, true );
}
@@ -2113,6 +2279,7 @@ __kmpc_dispatch_init_8( ident_t *loc, kmp_int32 gtid, enum sched_type schedule,
kmp_int64 lb, kmp_int64 ub,
kmp_int64 st, kmp_int64 chunk )
{
+ KMP_COUNT_BLOCK(OMP_FOR_dynamic);
KMP_DEBUG_ASSERT( __kmp_init_serial );
__kmp_dispatch_init< kmp_int64 >( loc, gtid, schedule, lb, ub, st, chunk, true );
}
@@ -2125,11 +2292,61 @@ __kmpc_dispatch_init_8u( ident_t *loc, kmp_int32 gtid, enum sched_type schedule,
kmp_uint64 lb, kmp_uint64 ub,
kmp_int64 st, kmp_int64 chunk )
{
+ KMP_COUNT_BLOCK(OMP_FOR_dynamic);
KMP_DEBUG_ASSERT( __kmp_init_serial );
__kmp_dispatch_init< kmp_uint64 >( loc, gtid, schedule, lb, ub, st, chunk, true );
}
/*!
+See @ref __kmpc_dispatch_init_4
+
+Difference from __kmpc_dispatch_init set of functions is these functions
+are called for composite distribute parallel for construct. Thus before
+regular iterations dispatching we need to calc per-team iteration space.
+
+These functions are all identical apart from the types of the arguments.
+*/
+void
+__kmpc_dist_dispatch_init_4( ident_t *loc, kmp_int32 gtid, enum sched_type schedule,
+ kmp_int32 *p_last, kmp_int32 lb, kmp_int32 ub, kmp_int32 st, kmp_int32 chunk )
+{
+ KMP_COUNT_BLOCK(OMP_FOR_dynamic);
+ KMP_DEBUG_ASSERT( __kmp_init_serial );
+ __kmp_dist_get_bounds< kmp_int32 >( loc, gtid, p_last, &lb, &ub, st );
+ __kmp_dispatch_init< kmp_int32 >( loc, gtid, schedule, lb, ub, st, chunk, true );
+}
+
+void
+__kmpc_dist_dispatch_init_4u( ident_t *loc, kmp_int32 gtid, enum sched_type schedule,
+ kmp_int32 *p_last, kmp_uint32 lb, kmp_uint32 ub, kmp_int32 st, kmp_int32 chunk )
+{
+ KMP_COUNT_BLOCK(OMP_FOR_dynamic);
+ KMP_DEBUG_ASSERT( __kmp_init_serial );
+ __kmp_dist_get_bounds< kmp_uint32 >( loc, gtid, p_last, &lb, &ub, st );
+ __kmp_dispatch_init< kmp_uint32 >( loc, gtid, schedule, lb, ub, st, chunk, true );
+}
+
+void
+__kmpc_dist_dispatch_init_8( ident_t *loc, kmp_int32 gtid, enum sched_type schedule,
+ kmp_int32 *p_last, kmp_int64 lb, kmp_int64 ub, kmp_int64 st, kmp_int64 chunk )
+{
+ KMP_COUNT_BLOCK(OMP_FOR_dynamic);
+ KMP_DEBUG_ASSERT( __kmp_init_serial );
+ __kmp_dist_get_bounds< kmp_int64 >( loc, gtid, p_last, &lb, &ub, st );
+ __kmp_dispatch_init< kmp_int64 >( loc, gtid, schedule, lb, ub, st, chunk, true );
+}
+
+void
+__kmpc_dist_dispatch_init_8u( ident_t *loc, kmp_int32 gtid, enum sched_type schedule,
+ kmp_int32 *p_last, kmp_uint64 lb, kmp_uint64 ub, kmp_int64 st, kmp_int64 chunk )
+{
+ KMP_COUNT_BLOCK(OMP_FOR_dynamic);
+ KMP_DEBUG_ASSERT( __kmp_init_serial );
+ __kmp_dist_get_bounds< kmp_uint64 >( loc, gtid, p_last, &lb, &ub, st );
+ __kmp_dispatch_init< kmp_uint64 >( loc, gtid, schedule, lb, ub, st, chunk, true );
+}
+
+/*!
@param loc Source code location
@param gtid Global thread id
@param p_last Pointer to a flag set to one if this is the last chunk or zero otherwise
@@ -2284,8 +2501,6 @@ __kmp_wait_yield_4(volatile kmp_uint32 * spinner,
/* if ( TCR_4(__kmp_global.g.g_done) && __kmp_global.g.g_abort)
__kmp_abort_thread(); */
- __kmp_static_delay(TRUE);
-
/* if we have waited a bit, or are oversubscribed, yield */
/* pause is in the following code */
KMP_YIELD( TCR_4(__kmp_nth) > __kmp_avail_proc );
@@ -2320,8 +2535,6 @@ __kmp_wait_yield_8( volatile kmp_uint64 * spinner,
/* if ( TCR_4(__kmp_global.g.g_done) && __kmp_global.g.g_abort)
__kmp_abort_thread(); */
- __kmp_static_delay(TRUE);
-
// if we are oversubscribed,
// or have waited a bit (and KMP_LIBARRY=throughput, then yield
// pause is in the following code
diff --git a/openmp/runtime/src/kmp_environment.c b/openmp/runtime/src/kmp_environment.c
index 0be9dc90c6e..2d69ce71646 100644
--- a/openmp/runtime/src/kmp_environment.c
+++ b/openmp/runtime/src/kmp_environment.c
@@ -1,7 +1,7 @@
/*
* kmp_environment.c -- Handle environment variables OS-independently.
- * $Revision: 42263 $
- * $Date: 2013-04-04 11:03:19 -0500 (Thu, 04 Apr 2013) $
+ * $Revision: 43084 $
+ * $Date: 2014-04-15 09:15:14 -0500 (Tue, 15 Apr 2014) $
*/
diff --git a/openmp/runtime/src/kmp_environment.h b/openmp/runtime/src/kmp_environment.h
index 06c2ec40cd7..8655277de93 100644
--- a/openmp/runtime/src/kmp_environment.h
+++ b/openmp/runtime/src/kmp_environment.h
@@ -1,7 +1,7 @@
/*
* kmp_environment.h -- Handle environment varoiables OS-independently.
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_error.c b/openmp/runtime/src/kmp_error.c
index 99a1728f068..bb69b2e2eeb 100644
--- a/openmp/runtime/src/kmp_error.c
+++ b/openmp/runtime/src/kmp_error.c
@@ -1,7 +1,7 @@
/*
* kmp_error.c -- KPTS functions for error checking at runtime
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_error.h b/openmp/runtime/src/kmp_error.h
index f400b2a9b23..09817c88ae9 100644
--- a/openmp/runtime/src/kmp_error.h
+++ b/openmp/runtime/src/kmp_error.h
@@ -1,7 +1,7 @@
/*
* kmp_error.h -- PTS functions for error checking at runtime.
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_ftn_cdecl.c b/openmp/runtime/src/kmp_ftn_cdecl.c
index 135a7cb7eb3..e503e6b0eec 100644
--- a/openmp/runtime/src/kmp_ftn_cdecl.c
+++ b/openmp/runtime/src/kmp_ftn_cdecl.c
@@ -1,7 +1,7 @@
/*
* kmp_ftn_cdecl.c -- Fortran __cdecl linkage support for OpenMP.
- * $Revision: 42757 $
- * $Date: 2013-10-18 08:20:57 -0500 (Fri, 18 Oct 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_ftn_entry.h b/openmp/runtime/src/kmp_ftn_entry.h
index 280d76fe405..8263a657877 100644
--- a/openmp/runtime/src/kmp_ftn_entry.h
+++ b/openmp/runtime/src/kmp_ftn_entry.h
@@ -1,7 +1,7 @@
/*
* kmp_ftn_entry.h -- Fortran entry linkage support for OpenMP.
- * $Revision: 42798 $
- * $Date: 2013-10-30 16:39:54 -0500 (Wed, 30 Oct 2013) $
+ * $Revision: 43435 $
+ * $Date: 2014-09-04 15:16:08 -0500 (Thu, 04 Sep 2014) $
*/
@@ -217,8 +217,6 @@ FTN_GET_LIBRARY (void)
#endif
}
-#if OMP_30_ENABLED
-
int FTN_STDCALL
FTN_SET_AFFINITY( void **mask )
{
@@ -348,8 +346,6 @@ FTN_GET_AFFINITY_MASK_PROC( int KMP_DEREF proc, void **mask )
#endif
}
-#endif /* OMP_30_ENABLED */
-
/* ------------------------------------------------------------------------ */
@@ -391,12 +387,8 @@ xexpand(FTN_GET_MAX_THREADS)( void )
}
gtid = __kmp_entry_gtid();
thread = __kmp_threads[ gtid ];
- #if OMP_30_ENABLED
//return thread -> th.th_team -> t.t_current_task[ thread->th.th_info.ds.ds_tid ] -> icvs.nproc;
return thread -> th.th_current_task -> td_icvs.nproc;
- #else
- return thread -> th.th_team -> t.t_set_nproc[ thread->th.th_info.ds.ds_tid ];
- #endif
#endif
}
@@ -533,7 +525,7 @@ xexpand(FTN_IN_PARALLEL)( void )
#else
kmp_info_t *th = __kmp_entry_thread();
#if OMP_40_ENABLED
- if ( th->th.th_team_microtask ) {
+ if ( th->th.th_teams_microtask ) {
// AC: r_in_parallel does not work inside teams construct
// where real parallel is inactive, but all threads have same root,
// so setting it in one team affects other teams.
@@ -546,8 +538,6 @@ xexpand(FTN_IN_PARALLEL)( void )
#endif
}
-#if OMP_30_ENABLED
-
void FTN_STDCALL
xexpand(FTN_SET_SCHEDULE)( kmp_sched_t KMP_DEREF kind, int KMP_DEREF modifier )
{
@@ -667,8 +657,6 @@ xexpand(FTN_IN_FINAL)( void )
#endif
}
-#endif // OMP_30_ENABLED
-
#if OMP_40_ENABLED
@@ -689,7 +677,7 @@ xexpand(FTN_GET_NUM_TEAMS)( void )
return 1;
#else
kmp_info_t *thr = __kmp_entry_thread();
- if ( thr->th.th_team_microtask ) {
+ if ( thr->th.th_teams_microtask ) {
kmp_team_t *team = thr->th.th_team;
int tlevel = thr->th.th_teams_level;
int ii = team->t.t_level; // the level of the teams construct
@@ -728,7 +716,7 @@ xexpand(FTN_GET_TEAM_NUM)( void )
return 0;
#else
kmp_info_t *thr = __kmp_entry_thread();
- if ( thr->th.th_team_microtask ) {
+ if ( thr->th.th_teams_microtask ) {
kmp_team_t *team = thr->th.th_team;
int tlevel = thr->th.th_teams_level; // the level of the teams construct
int ii = team->t.t_level;
@@ -1048,19 +1036,19 @@ FTN_GET_CANCELLATION_STATUS(int cancel_kind) {
#endif // OMP_40_ENABLED
// GCC compatibility (versioned symbols)
-#if KMP_OS_LINUX
+#ifdef KMP_USE_VERSION_SYMBOLS
/*
These following sections create function aliases (dummy symbols) for the omp_* routines.
- These aliases will then be versioned according to how libgomp ``versions'' its
- symbols (OMP_1.0, OMP_2.0, OMP_3.0, ...) while also retaining the
+ These aliases will then be versioned according to how libgomp ``versions'' its
+ symbols (OMP_1.0, OMP_2.0, OMP_3.0, ...) while also retaining the
default version which libiomp5 uses: VERSION (defined in exports_so.txt)
- If you want to see the versioned symbols for libgomp.so.1 then just type:
+ If you want to see the versioned symbols for libgomp.so.1 then just type:
objdump -T /path/to/libgomp.so.1 | grep omp_
Example:
- Step 1) Create __kmp_api_omp_set_num_threads_10_alias
+ Step 1) Create __kmp_api_omp_set_num_threads_10_alias
which is alias of __kmp_api_omp_set_num_threads
Step 2) Set __kmp_api_omp_set_num_threads_10_alias to version: omp_set_num_threads@OMP_1.0
Step 2B) Set __kmp_api_omp_set_num_threads to default version : omp_set_num_threads@@VERSION
@@ -1092,7 +1080,6 @@ xaliasify(FTN_TEST_NEST_LOCK, 10);
xaliasify(FTN_GET_WTICK, 20);
xaliasify(FTN_GET_WTIME, 20);
-#if OMP_30_ENABLED
// OMP_3.0 aliases
xaliasify(FTN_SET_SCHEDULE, 30);
xaliasify(FTN_GET_SCHEDULE, 30);
@@ -1116,7 +1103,6 @@ xaliasify(FTN_TEST_NEST_LOCK, 30);
// OMP_3.1 aliases
xaliasify(FTN_IN_FINAL, 31);
-#endif /* OMP_30_ENABLED */
#if OMP_40_ENABLED
// OMP_4.0 aliases
@@ -1160,7 +1146,6 @@ xversionify(FTN_TEST_NEST_LOCK, 10, "OMP_1.0");
xversionify(FTN_GET_WTICK, 20, "OMP_2.0");
xversionify(FTN_GET_WTIME, 20, "OMP_2.0");
-#if OMP_30_ENABLED
// OMP_3.0 versioned symbols
xversionify(FTN_SET_SCHEDULE, 30, "OMP_3.0");
xversionify(FTN_GET_SCHEDULE, 30, "OMP_3.0");
@@ -1186,7 +1171,6 @@ xversionify(FTN_TEST_NEST_LOCK, 30, "OMP_3.0");
// OMP_3.1 versioned symbol
xversionify(FTN_IN_FINAL, 31, "OMP_3.1");
-#endif /* OMP_30_ENABLED */
#if OMP_40_ENABLED
// OMP_4.0 versioned symbols
@@ -1204,7 +1188,7 @@ xversionify(FTN_GET_CANCELLATION, 40, "OMP_4.0");
// OMP_5.0 versioned symbols
#endif
-#endif /* KMP_OS_LINUX */
+#endif // KMP_USE_VERSION_SYMBOLS
#ifdef __cplusplus
} //extern "C"
diff --git a/openmp/runtime/src/kmp_ftn_extra.c b/openmp/runtime/src/kmp_ftn_extra.c
index 6777e01ba98..f3e0aa55675 100644
--- a/openmp/runtime/src/kmp_ftn_extra.c
+++ b/openmp/runtime/src/kmp_ftn_extra.c
@@ -1,7 +1,7 @@
/*
* kmp_ftn_extra.c -- Fortran 'extra' linkage support for OpenMP.
- * $Revision: 42757 $
- * $Date: 2013-10-18 08:20:57 -0500 (Fri, 18 Oct 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_ftn_os.h b/openmp/runtime/src/kmp_ftn_os.h
index d78d846d136..4be6ae84820 100644
--- a/openmp/runtime/src/kmp_ftn_os.h
+++ b/openmp/runtime/src/kmp_ftn_os.h
@@ -1,7 +1,7 @@
/*
* kmp_ftn_os.h -- KPTS Fortran defines header file.
- * $Revision: 42745 $
- * $Date: 2013-10-14 17:02:04 -0500 (Mon, 14 Oct 2013) $
+ * $Revision: 43354 $
+ * $Date: 2014-07-22 17:15:02 -0500 (Tue, 22 Jul 2014) $
*/
@@ -472,14 +472,14 @@
#define KMP_API_NAME_GOMP_TASKGROUP_START GOMP_taskgroup_start
#define KMP_API_NAME_GOMP_TASKGROUP_END GOMP_taskgroup_end
/* Target functions should be taken care of by liboffload */
-//#define KMP_API_NAME_GOMP_TARGET GOMP_target
-//#define KMP_API_NAME_GOMP_TARGET_DATA GOMP_target_data
-//#define KMP_API_NAME_GOMP_TARGET_END_DATA GOMP_target_end_data
-//#define KMP_API_NAME_GOMP_TARGET_UPDATE GOMP_target_update
+#define KMP_API_NAME_GOMP_TARGET GOMP_target
+#define KMP_API_NAME_GOMP_TARGET_DATA GOMP_target_data
+#define KMP_API_NAME_GOMP_TARGET_END_DATA GOMP_target_end_data
+#define KMP_API_NAME_GOMP_TARGET_UPDATE GOMP_target_update
#define KMP_API_NAME_GOMP_TEAMS GOMP_teams
-#if KMP_OS_LINUX && !KMP_OS_CNK && !KMP_ARCH_PPC64
- #define xstr(x) str(x)
+#ifdef KMP_USE_VERSION_SYMBOLS
+ #define xstr(x) str(x)
#define str(x) #x
// If Linux, xexpand prepends __kmp_api_ to the real API name
@@ -494,7 +494,7 @@
__asm__(".symver " xstr(__kmp_api_##api_name##_##version_num##_alias) "," xstr(api_name) "@" version_str "\n\t"); \
__asm__(".symver " xstr(__kmp_api_##api_name) "," xstr(api_name) "@@" default_ver "\n\t")
-#else /* KMP_OS_LINUX */
+#else // KMP_USE_VERSION_SYMBOLS
#define xstr(x) /* Nothing */
#define str(x) /* Nothing */
@@ -508,7 +508,7 @@
#define xversionify(api_name, version_num, version_str) /* Nothing */
#define versionify(api_name, version_num, version_str, default_ver) /* Nothing */
-#endif /* KMP_OS_LINUX */
+#endif // KMP_USE_VERSION_SYMBOLS
#endif /* KMP_FTN_OS_H */
diff --git a/openmp/runtime/src/kmp_ftn_stdcall.c b/openmp/runtime/src/kmp_ftn_stdcall.c
index 671bc063f26..07c074816ab 100644
--- a/openmp/runtime/src/kmp_ftn_stdcall.c
+++ b/openmp/runtime/src/kmp_ftn_stdcall.c
@@ -1,7 +1,7 @@
/*
* kmp_ftn_stdcall.c -- Fortran __stdcall linkage support for OpenMP.
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_global.c b/openmp/runtime/src/kmp_global.c
index d3c31952d0f..5f188d03c5d 100644
--- a/openmp/runtime/src/kmp_global.c
+++ b/openmp/runtime/src/kmp_global.c
@@ -1,7 +1,7 @@
/*
* kmp_global.c -- KPTS global variables for runtime support library
- * $Revision: 42816 $
- * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
*/
@@ -25,6 +25,20 @@ kmp_key_t __kmp_gtid_threadprivate_key;
kmp_cpuinfo_t __kmp_cpuinfo = { 0 }; // Not initialized
+#if KMP_STATS_ENABLED
+#include "kmp_stats.h"
+// lock for modifying the global __kmp_stats_list
+kmp_tas_lock_t __kmp_stats_lock = KMP_TAS_LOCK_INITIALIZER(__kmp_stats_lock);
+
+// global list of per thread stats, the head is a sentinel node which accumulates all stats produced before __kmp_create_worker is called.
+kmp_stats_list __kmp_stats_list;
+
+// thread local pointer to stats node within list
+__thread kmp_stats_list* __kmp_stats_thread_ptr = &__kmp_stats_list;
+
+// gives reference tick for all events (considered the 0 tick)
+tsc_tick_count __kmp_stats_start_time;
+#endif
/* ----------------------------------------------------- */
/* INITIALIZATION VARIABLES */
@@ -53,6 +67,7 @@ unsigned int __kmp_next_wait = KMP_DEFAULT_NEXT_WAIT; /* susequent number of s
size_t __kmp_stksize = KMP_DEFAULT_STKSIZE;
size_t __kmp_monitor_stksize = 0; // auto adjust
size_t __kmp_stkoffset = KMP_DEFAULT_STKOFFSET;
+int __kmp_stkpadding = KMP_MIN_STKPADDING;
size_t __kmp_malloc_pool_incr = KMP_DEFAULT_MALLOC_POOL_INCR;
@@ -94,7 +109,7 @@ char const *__kmp_barrier_type_name [ bs_last_barrier ] =
, "reduction"
#endif // KMP_FAST_REDUCTION_BARRIER
};
-char const *__kmp_barrier_pattern_name [ bp_last_bar ] = { "linear", "tree", "hyper" };
+char const *__kmp_barrier_pattern_name [ bp_last_bar ] = { "linear", "tree", "hyper", "hierarchical" };
int __kmp_allThreadsSpecified = 0;
@@ -114,16 +129,17 @@ int __kmp_dflt_team_nth_ub = 0;
int __kmp_tp_capacity = 0;
int __kmp_tp_cached = 0;
int __kmp_dflt_nested = FALSE;
-#if OMP_30_ENABLED
int __kmp_dflt_max_active_levels = KMP_MAX_ACTIVE_LEVELS_LIMIT; /* max_active_levels limit */
-#endif // OMP_30_ENABLED
+#if KMP_NESTED_HOT_TEAMS
+int __kmp_hot_teams_mode = 0; /* 0 - free extra threads when reduced */
+ /* 1 - keep extra threads when reduced */
+int __kmp_hot_teams_max_level = 1; /* nesting level of hot teams */
+#endif
enum library_type __kmp_library = library_none;
enum sched_type __kmp_sched = kmp_sch_default; /* scheduling method for runtime scheduling */
enum sched_type __kmp_static = kmp_sch_static_greedy; /* default static scheduling method */
enum sched_type __kmp_guided = kmp_sch_guided_iterative_chunked; /* default guided scheduling method */
-#if OMP_30_ENABLED
enum sched_type __kmp_auto = kmp_sch_guided_analytical_chunked; /* default auto scheduling method */
-#endif // OMP_30_ENABLED
int __kmp_dflt_blocktime = KMP_DEFAULT_BLOCKTIME;
int __kmp_monitor_wakeups = KMP_MIN_MONITOR_WAKEUPS;
int __kmp_bt_intervals = KMP_INTERVALS_FROM_BLOCKTIME( KMP_DEFAULT_BLOCKTIME, KMP_MIN_MONITOR_WAKEUPS );
@@ -242,7 +258,6 @@ unsigned int __kmp_place_num_threads_per_core = 0;
unsigned int __kmp_place_core_offset = 0;
#endif
-#if OMP_30_ENABLED
kmp_tasking_mode_t __kmp_tasking_mode = tskm_task_teams;
/* This check ensures that the compiler is passing the correct data type
@@ -255,8 +270,6 @@ KMP_BUILD_ASSERT( sizeof(kmp_tasking_flags_t) == 4 );
kmp_int32 __kmp_task_stealing_constraint = 1; /* Constrain task stealing by default */
-#endif /* OMP_30_ENABLED */
-
#ifdef DEBUG_SUSPEND
int __kmp_suspend_count = 0;
#endif
@@ -364,6 +377,29 @@ kmp_global_t __kmp_global = {{ 0 }};
/* ----------------------------------------------- */
/* GLOBAL SYNCHRONIZATION LOCKS */
/* TODO verify the need for these locks and if they need to be global */
+
+#if KMP_USE_INTERNODE_ALIGNMENT
+/* Multinode systems have larger cache line granularity which can cause
+ * false sharing if the alignment is not large enough for these locks */
+KMP_ALIGN_CACHE_INTERNODE
+
+kmp_bootstrap_lock_t __kmp_initz_lock = KMP_BOOTSTRAP_LOCK_INITIALIZER( __kmp_initz_lock ); /* Control initializations */
+KMP_ALIGN_CACHE_INTERNODE
+kmp_bootstrap_lock_t __kmp_forkjoin_lock; /* control fork/join access */
+KMP_ALIGN_CACHE_INTERNODE
+kmp_bootstrap_lock_t __kmp_exit_lock; /* exit() is not always thread-safe */
+KMP_ALIGN_CACHE_INTERNODE
+kmp_bootstrap_lock_t __kmp_monitor_lock; /* control monitor thread creation */
+KMP_ALIGN_CACHE_INTERNODE
+kmp_bootstrap_lock_t __kmp_tp_cached_lock; /* used for the hack to allow threadprivate cache and __kmp_threads expansion to co-exist */
+
+KMP_ALIGN_CACHE_INTERNODE
+kmp_lock_t __kmp_global_lock; /* Control OS/global access */
+KMP_ALIGN_CACHE_INTERNODE
+kmp_queuing_lock_t __kmp_dispatch_lock; /* Control dispatch access */
+KMP_ALIGN_CACHE_INTERNODE
+kmp_lock_t __kmp_debug_lock; /* Control I/O access for KMP_DEBUG */
+#else
KMP_ALIGN_CACHE
kmp_bootstrap_lock_t __kmp_initz_lock = KMP_BOOTSTRAP_LOCK_INITIALIZER( __kmp_initz_lock ); /* Control initializations */
@@ -378,6 +414,7 @@ KMP_ALIGN(128)
kmp_queuing_lock_t __kmp_dispatch_lock; /* Control dispatch access */
KMP_ALIGN(128)
kmp_lock_t __kmp_debug_lock; /* Control I/O access for KMP_DEBUG */
+#endif
/* ----------------------------------------------- */
diff --git a/openmp/runtime/src/kmp_gsupport.c b/openmp/runtime/src/kmp_gsupport.c
index aa520249674..3cce67c742c 100644
--- a/openmp/runtime/src/kmp_gsupport.c
+++ b/openmp/runtime/src/kmp_gsupport.c
@@ -1,7 +1,7 @@
/*
* kmp_gsupport.c
- * $Revision: 42810 $
- * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
*/
@@ -244,7 +244,7 @@ xexpand(KMP_API_NAME_GOMP_ORDERED_END)(void)
// The parallel contruct
//
-#ifdef KMP_DEBUG
+#ifndef KMP_DEBUG
static
#endif /* KMP_DEBUG */
void
@@ -255,7 +255,7 @@ __kmp_GOMP_microtask_wrapper(int *gtid, int *npr, void (*task)(void *),
}
-#ifdef KMP_DEBUG
+#ifndef KMP_DEBUG
static
#endif /* KMP_DEBUG */
void
@@ -276,7 +276,7 @@ __kmp_GOMP_parallel_microtask_wrapper(int *gtid, int *npr,
}
-#ifdef KMP_DEBUG
+#ifndef KMP_DEBUG
static
#endif /* KMP_DEBUG */
void
@@ -287,7 +287,7 @@ __kmp_GOMP_fork_call(ident_t *loc, int gtid, microtask_t wrapper, int argc,...)
va_list ap;
va_start(ap, argc);
- rc = __kmp_fork_call(loc, gtid, FALSE, argc, wrapper, __kmp_invoke_task_func,
+ rc = __kmp_fork_call(loc, gtid, fork_context_gnu, argc, wrapper, __kmp_invoke_task_func,
#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
&ap
#else
@@ -563,7 +563,7 @@ xexpand(KMP_API_NAME_GOMP_LOOP_END_NOWAIT)(void)
status = KMP_DISPATCH_NEXT_ULL(&loc, gtid, NULL, \
(kmp_uint64 *)p_lb, (kmp_uint64 *)p_ub, (kmp_int64 *)&stride); \
if (status) { \
- KMP_DEBUG_ASSERT(stride == str2); \
+ KMP_DEBUG_ASSERT((long long)stride == str2); \
*p_ub += (str > 0) ? 1 : -1; \
} \
} \
@@ -666,9 +666,6 @@ PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED_START), kmp_s
PARALLEL_LOOP_START(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME_START), kmp_sch_runtime)
-#if OMP_30_ENABLED
-
-
/* */
//
// Tasking constructs
@@ -742,9 +739,6 @@ xexpand(KMP_API_NAME_GOMP_TASKWAIT)(void)
}
-#endif /* OMP_30_ENABLED */
-
-
/* */
//
// Sections worksharing constructs
@@ -861,9 +855,268 @@ xexpand(KMP_API_NAME_GOMP_SECTIONS_END_NOWAIT)(void)
void
xexpand(KMP_API_NAME_GOMP_TASKYIELD)(void)
{
+ KA_TRACE(20, ("GOMP_taskyield: T#%d\n", __kmp_get_gtid()))
+ return;
+}
+
+#if OMP_40_ENABLED // these are new GOMP_4.0 entry points
+
+void
+xexpand(KMP_API_NAME_GOMP_PARALLEL)(void (*task)(void *), void *data, unsigned num_threads, unsigned int flags)
+{
+ int gtid = __kmp_entry_gtid();
+ MKLOC(loc, "GOMP_parallel");
+ KA_TRACE(20, ("GOMP_parallel: T#%d\n", gtid));
+
+ if (__kmpc_ok_to_fork(&loc) && (num_threads != 1)) {
+ if (num_threads != 0) {
+ __kmp_push_num_threads(&loc, gtid, num_threads);
+ }
+ if(flags != 0) {
+ __kmp_push_proc_bind(&loc, gtid, (kmp_proc_bind_t)flags);
+ }
+ __kmp_GOMP_fork_call(&loc, gtid,
+ (microtask_t)__kmp_GOMP_microtask_wrapper, 2, task, data);
+ }
+ else {
+ __kmpc_serialized_parallel(&loc, gtid);
+ }
+ task(data);
+ xexpand(KMP_API_NAME_GOMP_PARALLEL_END)();
+}
+
+void
+xexpand(KMP_API_NAME_GOMP_PARALLEL_SECTIONS)(void (*task) (void *), void *data,
+ unsigned num_threads, unsigned count, unsigned flags)
+{
+ int gtid = __kmp_entry_gtid();
+ int last = FALSE;
+ MKLOC(loc, "GOMP_parallel_sections");
+ KA_TRACE(20, ("GOMP_parallel_sections: T#%d\n", gtid));
+
+ if (__kmpc_ok_to_fork(&loc) && (num_threads != 1)) {
+ if (num_threads != 0) {
+ __kmp_push_num_threads(&loc, gtid, num_threads);
+ }
+ if(flags != 0) {
+ __kmp_push_proc_bind(&loc, gtid, (kmp_proc_bind_t)flags);
+ }
+ __kmp_GOMP_fork_call(&loc, gtid,
+ (microtask_t)__kmp_GOMP_parallel_microtask_wrapper, 9, task, data,
+ num_threads, &loc, kmp_nm_dynamic_chunked, (kmp_int)1,
+ (kmp_int)count, (kmp_int)1, (kmp_int)1);
+ }
+ else {
+ __kmpc_serialized_parallel(&loc, gtid);
+ }
+
+ KMP_DISPATCH_INIT(&loc, gtid, kmp_nm_dynamic_chunked, 1, count, 1, 1, TRUE);
+
+ task(data);
+ xexpand(KMP_API_NAME_GOMP_PARALLEL_END)();
+ KA_TRACE(20, ("GOMP_parallel_sections exit: T#%d\n", gtid));
+}
+
+#define PARALLEL_LOOP(func, schedule) \
+ void func (void (*task) (void *), void *data, unsigned num_threads, \
+ long lb, long ub, long str, long chunk_sz, unsigned flags) \
+ { \
+ int gtid = __kmp_entry_gtid(); \
+ int last = FALSE; \
+ MKLOC(loc, #func); \
+ KA_TRACE(20, ( #func ": T#%d, lb 0x%lx, ub 0x%lx, str 0x%lx, chunk_sz 0x%lx\n", \
+ gtid, lb, ub, str, chunk_sz )); \
+ \
+ if (__kmpc_ok_to_fork(&loc) && (num_threads != 1)) { \
+ if (num_threads != 0) { \
+ __kmp_push_num_threads(&loc, gtid, num_threads); \
+ } \
+ if (flags != 0) { \
+ __kmp_push_proc_bind(&loc, gtid, (kmp_proc_bind_t)flags); \
+ } \
+ __kmp_GOMP_fork_call(&loc, gtid, \
+ (microtask_t)__kmp_GOMP_parallel_microtask_wrapper, 9, \
+ task, data, num_threads, &loc, (schedule), lb, \
+ (str > 0) ? (ub - 1) : (ub + 1), str, chunk_sz); \
+ } \
+ else { \
+ __kmpc_serialized_parallel(&loc, gtid); \
+ } \
+ \
+ KMP_DISPATCH_INIT(&loc, gtid, (schedule), lb, \
+ (str > 0) ? (ub - 1) : (ub + 1), str, chunk_sz, \
+ (schedule) != kmp_sch_static); \
+ task(data); \
+ xexpand(KMP_API_NAME_GOMP_PARALLEL_END)(); \
+ \
+ KA_TRACE(20, ( #func " exit: T#%d\n", gtid)); \
+ }
+
+PARALLEL_LOOP(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC), kmp_sch_static)
+PARALLEL_LOOP(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC), kmp_sch_dynamic_chunked)
+PARALLEL_LOOP(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED), kmp_sch_guided_chunked)
+PARALLEL_LOOP(xexpand(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME), kmp_sch_runtime)
+
+
+void
+xexpand(KMP_API_NAME_GOMP_TASKGROUP_START)(void)
+{
+ int gtid = __kmp_get_gtid();
+ MKLOC(loc, "GOMP_taskgroup_start");
+ KA_TRACE(20, ("GOMP_taskgroup_start: T#%d\n", gtid));
+
+ __kmpc_taskgroup(&loc, gtid);
+
+ return;
+}
+
+void
+xexpand(KMP_API_NAME_GOMP_TASKGROUP_END)(void)
+{
+ int gtid = __kmp_get_gtid();
+ MKLOC(loc, "GOMP_taskgroup_end");
+ KA_TRACE(20, ("GOMP_taskgroup_end: T#%d\n", gtid));
+
+ __kmpc_end_taskgroup(&loc, gtid);
+
+ return;
+}
+
+#ifndef KMP_DEBUG
+static
+#endif /* KMP_DEBUG */
+kmp_int32 __kmp_gomp_to_iomp_cancellation_kind(int gomp_kind) {
+ kmp_int32 cncl_kind = 0;
+ switch(gomp_kind) {
+ case 1:
+ cncl_kind = cancel_parallel;
+ break;
+ case 2:
+ cncl_kind = cancel_loop;
+ break;
+ case 4:
+ cncl_kind = cancel_sections;
+ break;
+ case 8:
+ cncl_kind = cancel_taskgroup;
+ break;
+ }
+ return cncl_kind;
+}
+
+bool
+xexpand(KMP_API_NAME_GOMP_CANCELLATION_POINT)(int which)
+{
+ if(__kmp_omp_cancellation) {
+ KMP_FATAL(NoGompCancellation);
+ }
+ int gtid = __kmp_get_gtid();
+ MKLOC(loc, "GOMP_cancellation_point");
+ KA_TRACE(20, ("GOMP_cancellation_point: T#%d\n", gtid));
+
+ kmp_int32 cncl_kind = __kmp_gomp_to_iomp_cancellation_kind(which);
+
+ return __kmpc_cancellationpoint(&loc, gtid, cncl_kind);
+}
+
+bool
+xexpand(KMP_API_NAME_GOMP_BARRIER_CANCEL)(void)
+{
+ if(__kmp_omp_cancellation) {
+ KMP_FATAL(NoGompCancellation);
+ }
+ KMP_FATAL(NoGompCancellation);
+ int gtid = __kmp_get_gtid();
+ MKLOC(loc, "GOMP_barrier_cancel");
+ KA_TRACE(20, ("GOMP_barrier_cancel: T#%d\n", gtid));
+
+ return __kmpc_cancel_barrier(&loc, gtid);
+}
+
+bool
+xexpand(KMP_API_NAME_GOMP_CANCEL)(int which, bool do_cancel)
+{
+ if(__kmp_omp_cancellation) {
+ KMP_FATAL(NoGompCancellation);
+ } else {
+ return FALSE;
+ }
+
+ int gtid = __kmp_get_gtid();
+ MKLOC(loc, "GOMP_cancel");
+ KA_TRACE(20, ("GOMP_cancel: T#%d\n", gtid));
+ kmp_int32 cncl_kind = __kmp_gomp_to_iomp_cancellation_kind(which);
+
+ if(do_cancel == FALSE) {
+ return xexpand(KMP_API_NAME_GOMP_CANCELLATION_POINT)(which);
+ } else {
+ return __kmpc_cancel(&loc, gtid, cncl_kind);
+ }
}
+bool
+xexpand(KMP_API_NAME_GOMP_SECTIONS_END_CANCEL)(void)
+{
+ if(__kmp_omp_cancellation) {
+ KMP_FATAL(NoGompCancellation);
+ }
+ int gtid = __kmp_get_gtid();
+ MKLOC(loc, "GOMP_sections_end_cancel");
+ KA_TRACE(20, ("GOMP_sections_end_cancel: T#%d\n", gtid));
+
+ return __kmpc_cancel_barrier(&loc, gtid);
+}
+
+bool
+xexpand(KMP_API_NAME_GOMP_LOOP_END_CANCEL)(void)
+{
+ if(__kmp_omp_cancellation) {
+ KMP_FATAL(NoGompCancellation);
+ }
+ int gtid = __kmp_get_gtid();
+ MKLOC(loc, "GOMP_loop_end_cancel");
+ KA_TRACE(20, ("GOMP_loop_end_cancel: T#%d\n", gtid));
+
+ return __kmpc_cancel_barrier(&loc, gtid);
+}
+
+// All target functions are empty as of 2014-05-29
+void
+xexpand(KMP_API_NAME_GOMP_TARGET)(int device, void (*fn) (void *), const void *openmp_target,
+ size_t mapnum, void **hostaddrs, size_t *sizes, unsigned char *kinds)
+{
+ return;
+}
+
+void
+xexpand(KMP_API_NAME_GOMP_TARGET_DATA)(int device, const void *openmp_target, size_t mapnum,
+ void **hostaddrs, size_t *sizes, unsigned char *kinds)
+{
+ return;
+}
+
+void
+xexpand(KMP_API_NAME_GOMP_TARGET_END_DATA)(void)
+{
+ return;
+}
+
+void
+xexpand(KMP_API_NAME_GOMP_TARGET_UPDATE)(int device, const void *openmp_target, size_t mapnum,
+ void **hostaddrs, size_t *sizes, unsigned char *kinds)
+{
+ return;
+}
+
+void
+xexpand(KMP_API_NAME_GOMP_TEAMS)(unsigned int num_teams, unsigned int thread_limit)
+{
+ return;
+}
+#endif // OMP_40_ENABLED
+
+
/*
The following sections of code create aliases for the GOMP_* functions,
then create versioned symbols using the assembler directive .symver.
@@ -871,7 +1124,7 @@ xexpand(KMP_API_NAME_GOMP_TASKYIELD)(void)
xaliasify and xversionify are defined in kmp_ftn_os.h
*/
-#if KMP_OS_LINUX
+#ifdef KMP_USE_VERSION_SYMBOLS
// GOMP_1.0 aliases
xaliasify(KMP_API_NAME_GOMP_ATOMIC_END, 10);
@@ -917,10 +1170,8 @@ xaliasify(KMP_API_NAME_GOMP_SINGLE_COPY_START, 10);
xaliasify(KMP_API_NAME_GOMP_SINGLE_START, 10);
// GOMP_2.0 aliases
-#if OMP_30_ENABLED
xaliasify(KMP_API_NAME_GOMP_TASK, 20);
xaliasify(KMP_API_NAME_GOMP_TASKWAIT, 20);
-#endif
xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT, 20);
xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START, 20);
xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT, 20);
@@ -942,9 +1193,27 @@ xaliasify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START, 20);
xaliasify(KMP_API_NAME_GOMP_TASKYIELD, 30);
// GOMP_4.0 aliases
-/* TODO: add GOMP_4.0 aliases when corresponding
- GOMP_* functions are implemented
-*/
+// The GOMP_parallel* entry points below aren't OpenMP 4.0 related.
+#if OMP_40_ENABLED
+xaliasify(KMP_API_NAME_GOMP_PARALLEL, 40);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_SECTIONS, 40);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC, 40);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED, 40);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME, 40);
+xaliasify(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC, 40);
+xaliasify(KMP_API_NAME_GOMP_TASKGROUP_START, 40);
+xaliasify(KMP_API_NAME_GOMP_TASKGROUP_END, 40);
+xaliasify(KMP_API_NAME_GOMP_BARRIER_CANCEL, 40);
+xaliasify(KMP_API_NAME_GOMP_CANCEL, 40);
+xaliasify(KMP_API_NAME_GOMP_CANCELLATION_POINT, 40);
+xaliasify(KMP_API_NAME_GOMP_LOOP_END_CANCEL, 40);
+xaliasify(KMP_API_NAME_GOMP_SECTIONS_END_CANCEL, 40);
+xaliasify(KMP_API_NAME_GOMP_TARGET, 40);
+xaliasify(KMP_API_NAME_GOMP_TARGET_DATA, 40);
+xaliasify(KMP_API_NAME_GOMP_TARGET_END_DATA, 40);
+xaliasify(KMP_API_NAME_GOMP_TARGET_UPDATE, 40);
+xaliasify(KMP_API_NAME_GOMP_TEAMS, 40);
+#endif
// GOMP_1.0 versioned symbols
xversionify(KMP_API_NAME_GOMP_ATOMIC_END, 10, "GOMP_1.0");
@@ -990,10 +1259,8 @@ xversionify(KMP_API_NAME_GOMP_SINGLE_COPY_START, 10, "GOMP_1.0");
xversionify(KMP_API_NAME_GOMP_SINGLE_START, 10, "GOMP_1.0");
// GOMP_2.0 versioned symbols
-#if OMP_30_ENABLED
xversionify(KMP_API_NAME_GOMP_TASK, 20, "GOMP_2.0");
xversionify(KMP_API_NAME_GOMP_TASKWAIT, 20, "GOMP_2.0");
-#endif
xversionify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_NEXT, 20, "GOMP_2.0");
xversionify(KMP_API_NAME_GOMP_LOOP_ULL_DYNAMIC_START, 20, "GOMP_2.0");
xversionify(KMP_API_NAME_GOMP_LOOP_ULL_GUIDED_NEXT, 20, "GOMP_2.0");
@@ -1015,11 +1282,28 @@ xversionify(KMP_API_NAME_GOMP_LOOP_ULL_STATIC_START, 20, "GOMP_2.0");
xversionify(KMP_API_NAME_GOMP_TASKYIELD, 30, "GOMP_3.0");
// GOMP_4.0 versioned symbols
-/* TODO: add GOMP_4.0 versioned symbols when corresponding
- GOMP_* functions are implemented
-*/
+#if OMP_40_ENABLED
+xversionify(KMP_API_NAME_GOMP_PARALLEL, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_SECTIONS, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_DYNAMIC, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_GUIDED, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_RUNTIME, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_PARALLEL_LOOP_STATIC, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_TASKGROUP_START, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_TASKGROUP_END, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_BARRIER_CANCEL, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_CANCEL, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_CANCELLATION_POINT, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_LOOP_END_CANCEL, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_SECTIONS_END_CANCEL, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_TARGET, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_TARGET_DATA, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_TARGET_END_DATA, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_TARGET_UPDATE, 40, "GOMP_4.0");
+xversionify(KMP_API_NAME_GOMP_TEAMS, 40, "GOMP_4.0");
+#endif
-#endif /* KMP_OS_LINUX */
+#endif // KMP_USE_VERSION_SYMBOLS
#ifdef __cplusplus
} //extern "C"
diff --git a/openmp/runtime/src/kmp_i18n.c b/openmp/runtime/src/kmp_i18n.c
index d50102ae839..b26d5e714ab 100644
--- a/openmp/runtime/src/kmp_i18n.c
+++ b/openmp/runtime/src/kmp_i18n.c
@@ -1,7 +1,7 @@
/*
* kmp_i18n.c
- * $Revision: 42810 $
- * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+ * $Revision: 43084 $
+ * $Date: 2014-04-15 09:15:14 -0500 (Tue, 15 Apr 2014) $
*/
@@ -815,7 +815,7 @@ sys_error(
// not issue warning if strerror_r() returns `int' instead of expected `char *'.
message = __kmp_str_format( "%s", err_msg );
- #else // OS X*, FreeBSD etc.
+ #else // OS X*, FreeBSD* etc.
// XSI version of strerror_r.
diff --git a/openmp/runtime/src/kmp_i18n.h b/openmp/runtime/src/kmp_i18n.h
index fea8de42648..deb464e19eb 100644
--- a/openmp/runtime/src/kmp_i18n.h
+++ b/openmp/runtime/src/kmp_i18n.h
@@ -1,7 +1,7 @@
/*
* kmp_i18n.h
- * $Revision: 42810 $
- * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_import.c b/openmp/runtime/src/kmp_import.c
index d549a2f0a9f..95e8211d2df 100644
--- a/openmp/runtime/src/kmp_import.c
+++ b/openmp/runtime/src/kmp_import.c
@@ -1,7 +1,7 @@
/*
* kmp_import.c
- * $Revision: 42286 $
- * $Date: 2013-04-18 10:53:26 -0500 (Thu, 18 Apr 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_io.c b/openmp/runtime/src/kmp_io.c
index 23b60816317..03966345744 100644
--- a/openmp/runtime/src/kmp_io.c
+++ b/openmp/runtime/src/kmp_io.c
@@ -1,7 +1,7 @@
/*
* kmp_io.c -- RTL IO
- * $Revision: 42150 $
- * $Date: 2013-03-15 15:40:38 -0500 (Fri, 15 Mar 2013) $
+ * $Revision: 43236 $
+ * $Date: 2014-06-04 16:42:35 -0500 (Wed, 04 Jun 2014) $
*/
@@ -171,7 +171,7 @@ __kmp_vprintf( enum kmp_io __kmp_io, char const * format, va_list ap )
int chars = 0;
#ifdef KMP_DEBUG_PIDS
- chars = sprintf( db, "pid=%d: ", getpid() );
+ chars = sprintf( db, "pid=%d: ", (kmp_int32)getpid() );
#endif
chars += vsprintf( db, format, ap );
@@ -200,7 +200,8 @@ __kmp_vprintf( enum kmp_io __kmp_io, char const * format, va_list ap )
#if KMP_OS_WINDOWS
DWORD count;
#ifdef KMP_DEBUG_PIDS
- __kmp_str_buf_print( &__kmp_console_buf, "pid=%d: ", getpid() );
+ __kmp_str_buf_print( &__kmp_console_buf, "pid=%d: ",
+ (kmp_int32)getpid() );
#endif
__kmp_str_buf_vprint( &__kmp_console_buf, format, ap );
WriteFile(
@@ -213,7 +214,7 @@ __kmp_vprintf( enum kmp_io __kmp_io, char const * format, va_list ap )
__kmp_str_buf_clear( &__kmp_console_buf );
#else
#ifdef KMP_DEBUG_PIDS
- fprintf( __kmp_stderr, "pid=%d: ", getpid() );
+ fprintf( __kmp_stderr, "pid=%d: ", (kmp_int32)getpid() );
#endif
vfprintf( __kmp_stderr, format, ap );
fflush( __kmp_stderr );
diff --git a/openmp/runtime/src/kmp_io.h b/openmp/runtime/src/kmp_io.h
index a81f459ba1b..26db4dad5cc 100644
--- a/openmp/runtime/src/kmp_io.h
+++ b/openmp/runtime/src/kmp_io.h
@@ -1,7 +1,7 @@
/*
* kmp_io.h -- RTL IO header file.
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_itt.c b/openmp/runtime/src/kmp_itt.c
index b2ebb04b1eb..bff97f8680a 100644
--- a/openmp/runtime/src/kmp_itt.c
+++ b/openmp/runtime/src/kmp_itt.c
@@ -1,8 +1,8 @@
#if USE_ITT_BUILD
/*
* kmp_itt.c -- ITT Notify interface.
- * $Revision: 42489 $
- * $Date: 2013-07-08 11:00:09 -0500 (Mon, 08 Jul 2013) $
+ * $Revision: 43457 $
+ * $Date: 2014-09-17 03:57:22 -0500 (Wed, 17 Sep 2014) $
*/
@@ -25,8 +25,13 @@
#if USE_ITT_NOTIFY
- kmp_int32 __kmp_frame_domain_count = 0;
- __itt_domain* __kmp_itt_domains[KMP_MAX_FRAME_DOMAINS];
+ kmp_int32 __kmp_barrier_domain_count;
+ kmp_int32 __kmp_region_domain_count;
+ __itt_domain* __kmp_itt_barrier_domains[KMP_MAX_FRAME_DOMAINS];
+ __itt_domain* __kmp_itt_region_domains[KMP_MAX_FRAME_DOMAINS];
+ __itt_domain* __kmp_itt_imbalance_domains[KMP_MAX_FRAME_DOMAINS];
+ kmp_int32 __kmp_itt_region_team_size[KMP_MAX_FRAME_DOMAINS];
+ __itt_domain * metadata_domain = NULL;
#include "kmp_version.h"
#include "kmp_i18n.h"
diff --git a/openmp/runtime/src/kmp_itt.h b/openmp/runtime/src/kmp_itt.h
index 0ee79b6fe5d..c5ddbc645c2 100644
--- a/openmp/runtime/src/kmp_itt.h
+++ b/openmp/runtime/src/kmp_itt.h
@@ -1,8 +1,8 @@
#if USE_ITT_BUILD
/*
* kmp_itt.h -- ITT Notify interface.
- * $Revision: 42829 $
- * $Date: 2013-11-21 05:44:01 -0600 (Thu, 21 Nov 2013) $
+ * $Revision: 43457 $
+ * $Date: 2014-09-17 03:57:22 -0500 (Wed, 17 Sep 2014) $
*/
@@ -55,12 +55,20 @@ void __kmp_itt_destroy();
// __kmp_itt_xxxed() function should be called after action.
// --- Parallel region reporting ---
-__kmp_inline void __kmp_itt_region_forking( int gtid, int serialized = 0 ); // Master only, before forking threads.
+__kmp_inline void __kmp_itt_region_forking( int gtid, int team_size, int barriers, int serialized = 0 ); // Master only, before forking threads.
__kmp_inline void __kmp_itt_region_joined( int gtid, int serialized = 0 ); // Master only, after joining threads.
// (*) Note: A thread may execute tasks after this point, though.
// --- Frame reporting ---
-__kmp_inline void __kmp_itt_frame_submit( int gtid, __itt_timestamp begin, __itt_timestamp end, int imbalance, ident_t *loc );
+// region = 0 - no regions, region = 1 - parallel, region = 2 - serialized parallel
+__kmp_inline void __kmp_itt_frame_submit( int gtid, __itt_timestamp begin, __itt_timestamp end, int imbalance, ident_t *loc, int team_size, int region = 0 );
+
+// --- Metadata reporting ---
+// begin/end - begin/end timestamps of a barrier frame, imbalance - aggregated wait time value, reduction -if this is a reduction barrier
+__kmp_inline void __kmp_itt_metadata_imbalance( int gtid, kmp_uint64 begin, kmp_uint64 end, kmp_uint64 imbalance, kmp_uint64 reduction );
+// sched_type: 0 - static, 1 - dynamic, 2 - guided, 3 - custom (all others); iterations - loop trip count, chunk - chunk size
+__kmp_inline void __kmp_itt_metadata_loop( ident_t * loc, kmp_uint64 sched_type, kmp_uint64 iterations, kmp_uint64 chunk );
+__kmp_inline void __kmp_itt_metadata_single();
// --- Barrier reporting ---
__kmp_inline void * __kmp_itt_barrier_object( int gtid, int bt, int set_name = 0, int delta = 0 );
@@ -135,8 +143,12 @@ __kmp_inline void __kmp_itt_stack_callee_leave(__itt_caller);
#if (INCLUDE_SSC_MARKS && KMP_OS_LINUX && KMP_ARCH_X86_64)
// Portable (at least for gcc and icc) code to insert the necessary instructions
// to set %ebx and execute the unlikely no-op.
- # define INSERT_SSC_MARK(tag) \
- __asm__ __volatile__ ("movl %0, %%ebx; .byte 0x64, 0x67, 0x90 " ::"i"(tag):"%ebx")
+ #if defined( __INTEL_COMPILER )
+ # define INSERT_SSC_MARK(tag) __SSC_MARK(tag)
+ #else
+ # define INSERT_SSC_MARK(tag) \
+ __asm__ __volatile__ ("movl %0, %%ebx; .byte 0x64, 0x67, 0x90 " ::"i"(tag):"%ebx")
+ #endif
#else
# define INSERT_SSC_MARK(tag) ((void)0)
#endif
@@ -150,6 +162,18 @@ __kmp_inline void __kmp_itt_stack_callee_leave(__itt_caller);
#define SSC_MARK_SPIN_START() INSERT_SSC_MARK(0x4376)
#define SSC_MARK_SPIN_END() INSERT_SSC_MARK(0x4377)
+ // Markers for architecture simulation.
+ // FORKING : Before the master thread forks.
+ // JOINING : At the start of the join.
+ // INVOKING : Before the threads invoke microtasks.
+ // DISPATCH_INIT: At the start of dynamically scheduled loop.
+ // DISPATCH_NEXT: After claming next iteration of dynamically scheduled loop.
+ #define SSC_MARK_FORKING() INSERT_SSC_MARK(0xd693)
+ #define SSC_MARK_JOINING() INSERT_SSC_MARK(0xd694)
+ #define SSC_MARK_INVOKING() INSERT_SSC_MARK(0xd695)
+ #define SSC_MARK_DISPATCH_INIT() INSERT_SSC_MARK(0xd696)
+ #define SSC_MARK_DISPATCH_NEXT() INSERT_SSC_MARK(0xd697)
+
// The object is an address that associates a specific set of the prepare, acquire, release,
// and cancel operations.
@@ -227,8 +251,14 @@ __kmp_inline void __kmp_itt_stack_callee_leave(__itt_caller);
const int KMP_MAX_FRAME_DOMAINS = 512; // Maximum number of frame domains to use (maps to
// different OpenMP regions in the user source code).
- extern kmp_int32 __kmp_frame_domain_count;
- extern __itt_domain* __kmp_itt_domains[KMP_MAX_FRAME_DOMAINS];
+ extern kmp_int32 __kmp_barrier_domain_count;
+ extern kmp_int32 __kmp_region_domain_count;
+ extern __itt_domain* __kmp_itt_barrier_domains[KMP_MAX_FRAME_DOMAINS];
+ extern __itt_domain* __kmp_itt_region_domains[KMP_MAX_FRAME_DOMAINS];
+ extern __itt_domain* __kmp_itt_imbalance_domains[KMP_MAX_FRAME_DOMAINS];
+ extern kmp_int32 __kmp_itt_region_team_size[KMP_MAX_FRAME_DOMAINS];
+ extern __itt_domain * metadata_domain;
+
#else
// Null definitions of the synchronization tracing functions.
diff --git a/openmp/runtime/src/kmp_itt.inl b/openmp/runtime/src/kmp_itt.inl
index 56953d02b7a..70aafcce7d1 100644
--- a/openmp/runtime/src/kmp_itt.inl
+++ b/openmp/runtime/src/kmp_itt.inl
@@ -1,8 +1,8 @@
#if USE_ITT_BUILD
/*
* kmp_itt.inl -- Inline functions of ITT Notify.
- * $Revision: 42866 $
- * $Date: 2013-12-10 15:15:58 -0600 (Tue, 10 Dec 2013) $
+ * $Revision: 43457 $
+ * $Date: 2014-09-17 03:57:22 -0500 (Wed, 17 Sep 2014) $
*/
@@ -63,6 +63,8 @@
#endif
#endif
+static kmp_bootstrap_lock_t metadata_lock = KMP_BOOTSTRAP_LOCK_INITIALIZER( metadata_lock );
+
/*
------------------------------------------------------------------------------------------------
Parallel region reporting.
@@ -89,12 +91,10 @@
// -------------------------------------------------------------------------------------------------
LINKAGE void
-__kmp_itt_region_forking( int gtid, int serialized ) {
+__kmp_itt_region_forking( int gtid, int team_size, int barriers, int serialized ) {
#if USE_ITT_NOTIFY
kmp_team_t * team = __kmp_team_from_gtid( gtid );
-#if OMP_30_ENABLED
if (team->t.t_active_level + serialized > 1)
-#endif
{
// The frame notifications are only supported for the outermost teams.
return;
@@ -105,40 +105,81 @@ __kmp_itt_region_forking( int gtid, int serialized ) {
// Assume that reserved_2 contains zero initially. Since zero is special
// value here, store the index into domain array increased by 1.
if (loc->reserved_2 == 0) {
- if (__kmp_frame_domain_count < KMP_MAX_FRAME_DOMAINS) {
- int frm = KMP_TEST_THEN_INC32( & __kmp_frame_domain_count ); // get "old" value
+ if (__kmp_region_domain_count < KMP_MAX_FRAME_DOMAINS) {
+ int frm = KMP_TEST_THEN_INC32( & __kmp_region_domain_count ); // get "old" value
if (frm >= KMP_MAX_FRAME_DOMAINS) {
- KMP_TEST_THEN_DEC32( & __kmp_frame_domain_count ); // revert the count
+ KMP_TEST_THEN_DEC32( & __kmp_region_domain_count ); // revert the count
return; // loc->reserved_2 is still 0
}
//if (!KMP_COMPARE_AND_STORE_ACQ32( &loc->reserved_2, 0, frm + 1 )) {
// frm = loc->reserved_2 - 1; // get value saved by other thread for same loc
//} // AC: this block is to replace next unsynchronized line
- loc->reserved_2 = frm + 1; // save "new" value
+
+ // We need to save indexes for both region and barrier frames. We'll use loc->reserved_2
+ // field but put region index to the low two bytes and barrier indexes to the high
+ // two bytes. It is OK because KMP_MAX_FRAME_DOMAINS = 512.
+ loc->reserved_2 |= (frm + 1); // save "new" value
// Transform compiler-generated region location into the format
// that the tools more or less standardized on:
// "<func>$omp$parallel@[file:]<line>[:<col>]"
const char * buff = NULL;
kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
- buff = __kmp_str_format("%s$omp$parallel@%s:%d:%d",
- str_loc.func, str_loc.file,
+ buff = __kmp_str_format("%s$omp$parallel:%d@%s:%d:%d",
+ str_loc.func, team_size, str_loc.file,
str_loc.line, str_loc.col);
+
+ __itt_suppress_push(__itt_suppress_memory_errors);
+ __kmp_itt_region_domains[ frm ] = __itt_domain_create( buff );
+ __itt_suppress_pop();
+
+ __kmp_str_free( &buff );
+ if( barriers ) {
+ if (__kmp_barrier_domain_count < KMP_MAX_FRAME_DOMAINS) {
+ int frm = KMP_TEST_THEN_INC32( & __kmp_barrier_domain_count ); // get "old" value
+ if (frm >= KMP_MAX_FRAME_DOMAINS) {
+ KMP_TEST_THEN_DEC32( & __kmp_barrier_domain_count ); // revert the count
+ return; // loc->reserved_2 is still 0
+ }
+ const char * buff = NULL;
+ buff = __kmp_str_format("%s$omp$barrier@%s:%d",
+ str_loc.func, str_loc.file, str_loc.col);
+ __itt_suppress_push(__itt_suppress_memory_errors);
+ __kmp_itt_barrier_domains[ frm ] = __itt_domain_create( buff );
+ __itt_suppress_pop();
+ __kmp_str_free( &buff );
+ // Save the barrier frame index to the high two bytes.
+ loc->reserved_2 |= (frm + 1) << 16;
+ }
+ }
__kmp_str_loc_free( &str_loc );
+ __itt_frame_begin_v3(__kmp_itt_region_domains[ frm ], NULL);
+ }
+ } else { // Region domain exists for this location
+ // Check if team size was changed. Then create new region domain for this location
+ int frm = (loc->reserved_2 & 0x0000FFFF) - 1;
+ if( __kmp_itt_region_team_size[frm] != team_size ) {
+ const char * buff = NULL;
+ kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
+ buff = __kmp_str_format("%s$omp$parallel:%d@%s:%d:%d",
+ str_loc.func, team_size, str_loc.file,
+ str_loc.line, str_loc.col);
__itt_suppress_push(__itt_suppress_memory_errors);
- __kmp_itt_domains[ frm ] = __itt_domain_create( buff );
+ __kmp_itt_region_domains[ frm ] = __itt_domain_create( buff );
__itt_suppress_pop();
__kmp_str_free( &buff );
- __itt_frame_begin_v3(__kmp_itt_domains[ frm ], NULL);
+ __kmp_str_loc_free( &str_loc );
+ __kmp_itt_region_team_size[frm] = team_size;
+ __itt_frame_begin_v3(__kmp_itt_region_domains[frm], NULL);
+ } else { // Team size was not changed. Use existing domain.
+ __itt_frame_begin_v3(__kmp_itt_region_domains[frm], NULL);
}
- } else { // if it is not 0 then it should be <= KMP_MAX_FRAME_DOMAINS
- __itt_frame_begin_v3(__kmp_itt_domains[loc->reserved_2 - 1], NULL);
}
KMP_ITT_DEBUG_LOCK();
- KMP_ITT_DEBUG_PRINT( "[frm beg] gtid=%d, idx=%d, serialized:%d, loc:%p\n",
- gtid, loc->reserved_2 - 1, serialized, loc );
+ KMP_ITT_DEBUG_PRINT( "[frm beg] gtid=%d, idx=%x, serialized:%d, loc:%p\n",
+ gtid, loc->reserved_2, serialized, loc );
}
#endif
} // __kmp_itt_region_forking
@@ -146,51 +187,208 @@ __kmp_itt_region_forking( int gtid, int serialized ) {
// -------------------------------------------------------------------------------------------------
LINKAGE void
-__kmp_itt_frame_submit( int gtid, __itt_timestamp begin, __itt_timestamp end, int imbalance, ident_t * loc ) {
+__kmp_itt_frame_submit( int gtid, __itt_timestamp begin, __itt_timestamp end, int imbalance, ident_t * loc, int team_size, int region ) {
#if USE_ITT_NOTIFY
+ if( region ) {
+ kmp_team_t * team = __kmp_team_from_gtid( gtid );
+ int serialized = ( region == 2 ? 1 : 0 );
+ if (team->t.t_active_level + serialized > 1)
+ {
+ // The frame notifications are only supported for the outermost teams.
+ return;
+ }
+ //Check region domain has not been created before. It's index is saved in the low two bytes.
+ if ((loc->reserved_2 & 0x0000FFFF) == 0) {
+ if (__kmp_region_domain_count < KMP_MAX_FRAME_DOMAINS) {
+ int frm = KMP_TEST_THEN_INC32( & __kmp_region_domain_count ); // get "old" value
+ if (frm >= KMP_MAX_FRAME_DOMAINS) {
+ KMP_TEST_THEN_DEC32( & __kmp_region_domain_count ); // revert the count
+ return; // loc->reserved_2 is still 0
+ }
+
+ // We need to save indexes for both region and barrier frames. We'll use loc->reserved_2
+ // field but put region index to the low two bytes and barrier indexes to the high
+ // two bytes. It is OK because KMP_MAX_FRAME_DOMAINS = 512.
+ loc->reserved_2 |= (frm + 1); // save "new" value
+
+ // Transform compiler-generated region location into the format
+ // that the tools more or less standardized on:
+ // "<func>$omp$parallel:team_size@[file:]<line>[:<col>]"
+ const char * buff = NULL;
+ kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
+ buff = __kmp_str_format("%s$omp$parallel:%d@%s:%d:%d",
+ str_loc.func, team_size, str_loc.file,
+ str_loc.line, str_loc.col);
+
+ __itt_suppress_push(__itt_suppress_memory_errors);
+ __kmp_itt_region_domains[ frm ] = __itt_domain_create( buff );
+ __itt_suppress_pop();
+
+ __kmp_str_free( &buff );
+ __kmp_str_loc_free( &str_loc );
+ __kmp_itt_region_team_size[frm] = team_size;
+ __itt_frame_submit_v3(__kmp_itt_region_domains[ frm ], NULL, begin, end );
+ }
+ } else { // Region domain exists for this location
+ // Check if team size was changed. Then create new region domain for this location
+ int frm = (loc->reserved_2 & 0x0000FFFF) - 1;
+ if( __kmp_itt_region_team_size[frm] != team_size ) {
+ const char * buff = NULL;
+ kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
+ buff = __kmp_str_format("%s$omp$parallel:%d@%s:%d:%d",
+ str_loc.func, team_size, str_loc.file,
+ str_loc.line, str_loc.col);
+
+ __itt_suppress_push(__itt_suppress_memory_errors);
+ __kmp_itt_region_domains[ frm ] = __itt_domain_create( buff );
+ __itt_suppress_pop();
+
+ __kmp_str_free( &buff );
+ __kmp_str_loc_free( &str_loc );
+ __kmp_itt_region_team_size[frm] = team_size;
+ __itt_frame_submit_v3(__kmp_itt_region_domains[ frm ], NULL, begin, end );
+ } else { // Team size was not changed. Use existing domain.
+ __itt_frame_submit_v3(__kmp_itt_region_domains[ frm ], NULL, begin, end );
+ }
+ }
+ KMP_ITT_DEBUG_LOCK();
+ KMP_ITT_DEBUG_PRINT( "[reg sub] gtid=%d, idx=%x, region:%d, loc:%p, beg:%llu, end:%llu\n",
+ gtid, loc->reserved_2, region, loc, begin, end );
+ return;
+ } else { // called for barrier reporting
if (loc) {
- if (loc->reserved_2 == 0) {
- if (__kmp_frame_domain_count < KMP_MAX_FRAME_DOMAINS) {
- int frm = KMP_TEST_THEN_INC32( & __kmp_frame_domain_count ); // get "old" value
+ if ((loc->reserved_2 & 0xFFFF0000) == 0) {
+ if (__kmp_barrier_domain_count < KMP_MAX_FRAME_DOMAINS) {
+ int frm = KMP_TEST_THEN_INC32( & __kmp_barrier_domain_count ); // get "old" value
if (frm >= KMP_MAX_FRAME_DOMAINS) {
- KMP_TEST_THEN_DEC32( & __kmp_frame_domain_count ); // revert the count
+ KMP_TEST_THEN_DEC32( & __kmp_barrier_domain_count ); // revert the count
return; // loc->reserved_2 is still 0
}
- // Should it be synchronized? See the comment in __kmp_itt_region_forking
- loc->reserved_2 = frm + 1; // save "new" value
+ // Save the barrier frame index to the high two bytes.
+ loc->reserved_2 |= (frm + 1) << 16; // save "new" value
// Transform compiler-generated region location into the format
// that the tools more or less standardized on:
// "<func>$omp$frame@[file:]<line>[:<col>]"
- const char * buff = NULL;
kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
if( imbalance ) {
- buff = __kmp_str_format("%s$omp$barrier-imbalance@%s:%d",
- str_loc.func, str_loc.file, str_loc.col);
+ const char * buff_imb = NULL;
+ buff_imb = __kmp_str_format("%s$omp$barrier-imbalance:%d@%s:%d",
+ str_loc.func, team_size, str_loc.file, str_loc.col);
+ __itt_suppress_push(__itt_suppress_memory_errors);
+ __kmp_itt_imbalance_domains[ frm ] = __itt_domain_create( buff_imb );
+ __itt_suppress_pop();
+ __itt_frame_submit_v3(__kmp_itt_imbalance_domains[ frm ], NULL, begin, end );
+ __kmp_str_free( &buff_imb );
} else {
+ const char * buff = NULL;
buff = __kmp_str_format("%s$omp$barrier@%s:%d",
str_loc.func, str_loc.file, str_loc.col);
+ __itt_suppress_push(__itt_suppress_memory_errors);
+ __kmp_itt_barrier_domains[ frm ] = __itt_domain_create( buff );
+ __itt_suppress_pop();
+ __itt_frame_submit_v3(__kmp_itt_barrier_domains[ frm ], NULL, begin, end );
+ __kmp_str_free( &buff );
}
__kmp_str_loc_free( &str_loc );
-
- __itt_suppress_push(__itt_suppress_memory_errors);
- __kmp_itt_domains[ frm ] = __itt_domain_create( buff );
- __itt_suppress_pop();
-
- __kmp_str_free( &buff );
- __itt_frame_submit_v3(__kmp_itt_domains[ frm ], NULL, begin, end );
}
} else { // if it is not 0 then it should be <= KMP_MAX_FRAME_DOMAINS
- __itt_frame_submit_v3(__kmp_itt_domains[loc->reserved_2 - 1], NULL, begin, end );
+ if( imbalance ) {
+ __itt_frame_submit_v3(__kmp_itt_imbalance_domains[ (loc->reserved_2 >> 16) - 1 ], NULL, begin, end );
+ } else {
+ __itt_frame_submit_v3(__kmp_itt_barrier_domains[(loc->reserved_2 >> 16) - 1], NULL, begin, end );
+ }
}
+ KMP_ITT_DEBUG_LOCK();
+ KMP_ITT_DEBUG_PRINT( "[frm sub] gtid=%d, idx=%x, loc:%p, beg:%llu, end:%llu\n",
+ gtid, loc->reserved_2, loc, begin, end );
+ }
}
-
#endif
} // __kmp_itt_frame_submit
// -------------------------------------------------------------------------------------------------
LINKAGE void
+__kmp_itt_metadata_imbalance( int gtid, kmp_uint64 begin, kmp_uint64 end, kmp_uint64 imbalance, kmp_uint64 reduction ) {
+#if USE_ITT_NOTIFY
+ if( metadata_domain == NULL) {
+ __kmp_acquire_bootstrap_lock( & metadata_lock );
+ if( metadata_domain == NULL) {
+ __itt_suppress_push(__itt_suppress_memory_errors);
+ metadata_domain = __itt_domain_create( "OMP Metadata" );
+ __itt_suppress_pop();
+ }
+ __kmp_release_bootstrap_lock( & metadata_lock );
+ }
+
+ __itt_string_handle * string_handle = __itt_string_handle_create( "omp_metadata_imbalance");
+
+ kmp_uint64 imbalance_data[ 4 ];
+ imbalance_data[ 0 ] = begin;
+ imbalance_data[ 1 ] = end;
+ imbalance_data[ 2 ] = imbalance;
+ imbalance_data[ 3 ] = reduction;
+
+ __itt_metadata_add(metadata_domain, __itt_null, string_handle, __itt_metadata_u64, 4, imbalance_data);
+#endif
+} // __kmp_itt_metadata_imbalance
+
+// -------------------------------------------------------------------------------------------------
+
+LINKAGE void
+__kmp_itt_metadata_loop( ident_t * loc, kmp_uint64 sched_type, kmp_uint64 iterations, kmp_uint64 chunk ) {
+#if USE_ITT_NOTIFY
+ if( metadata_domain == NULL) {
+ __kmp_acquire_bootstrap_lock( & metadata_lock );
+ if( metadata_domain == NULL) {
+ __itt_suppress_push(__itt_suppress_memory_errors);
+ metadata_domain = __itt_domain_create( "OMP Metadata" );
+ __itt_suppress_pop();
+ }
+ __kmp_release_bootstrap_lock( & metadata_lock );
+ }
+
+ __itt_string_handle * string_handle = __itt_string_handle_create( "omp_metadata_loop");
+ kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
+
+ kmp_uint64 loop_data[ 5 ];
+ loop_data[ 0 ] = str_loc.line;
+ loop_data[ 1 ] = str_loc.col;
+ loop_data[ 2 ] = sched_type;
+ loop_data[ 3 ] = iterations;
+ loop_data[ 4 ] = chunk;
+
+ __kmp_str_loc_free( &str_loc );
+
+ __itt_metadata_add(metadata_domain, __itt_null, string_handle, __itt_metadata_u64, 5, loop_data);
+#endif
+} // __kmp_itt_metadata_loop
+
+// -------------------------------------------------------------------------------------------------
+
+LINKAGE void
+__kmp_itt_metadata_single( ) {
+#if USE_ITT_NOTIFY
+ if( metadata_domain == NULL) {
+ __kmp_acquire_bootstrap_lock( & metadata_lock );
+ if( metadata_domain == NULL) {
+ __itt_suppress_push(__itt_suppress_memory_errors);
+ metadata_domain = __itt_domain_create( "OMP Metadata" );
+ __itt_suppress_pop();
+ }
+ __kmp_release_bootstrap_lock( & metadata_lock );
+ }
+
+ __itt_string_handle * string_handle = __itt_string_handle_create( "omp_metadata_single");
+
+ __itt_metadata_add(metadata_domain, __itt_null, string_handle, __itt_metadata_u64, 0, NULL);
+#endif
+} // __kmp_itt_metadata_single
+
+// -------------------------------------------------------------------------------------------------
+
+LINKAGE void
__kmp_itt_region_starting( int gtid ) {
#if USE_ITT_NOTIFY
#endif
@@ -210,19 +408,21 @@ LINKAGE void
__kmp_itt_region_joined( int gtid, int serialized ) {
#if USE_ITT_NOTIFY
kmp_team_t * team = __kmp_team_from_gtid( gtid );
-#if OMP_30_ENABLED
if (team->t.t_active_level + serialized > 1)
-#endif
{
// The frame notifications are only supported for the outermost teams.
return;
}
ident_t * loc = __kmp_thread_from_gtid( gtid )->th.th_ident;
- if (loc && loc->reserved_2 && loc->reserved_2 <= KMP_MAX_FRAME_DOMAINS) {
- KMP_ITT_DEBUG_LOCK();
- __itt_frame_end_v3(__kmp_itt_domains[loc->reserved_2 - 1], NULL);
- KMP_ITT_DEBUG_PRINT( "[frm end] gtid=%d, idx=%d, serialized:%d, loc:%p\n",
- gtid, loc->reserved_2 - 1, serialized, loc );
+ if (loc && loc->reserved_2)
+ {
+ int frm = (loc->reserved_2 & 0x0000FFFF) - 1;
+ if(frm < KMP_MAX_FRAME_DOMAINS) {
+ KMP_ITT_DEBUG_LOCK();
+ __itt_frame_end_v3(__kmp_itt_region_domains[frm], NULL);
+ KMP_ITT_DEBUG_PRINT( "[frm end] gtid=%d, idx=%x, serialized:%d, loc:%p\n",
+ gtid, loc->reserved_2, serialized, loc );
+ }
}
#endif
} // __kmp_itt_region_joined
@@ -409,8 +609,6 @@ __kmp_itt_barrier_finished( int gtid, void * object ) {
#endif
} // __kmp_itt_barrier_finished
-#if OMP_30_ENABLED
-
/*
------------------------------------------------------------------------------------------------
Taskwait reporting.
@@ -507,8 +705,6 @@ __kmp_itt_task_finished(
// -------------------------------------------------------------------------------------------------
-#endif /* OMP_30_ENABLED */
-
/*
------------------------------------------------------------------------------------------------
Lock reporting.
@@ -757,7 +953,11 @@ __kmp_itt_thread_name( int gtid ) {
if ( __itt_thr_name_set_ptr ) {
kmp_str_buf_t name;
__kmp_str_buf_init( & name );
- __kmp_str_buf_print( & name, "OMP Worker Thread #%d", gtid );
+ if( KMP_MASTER_GTID(gtid) ) {
+ __kmp_str_buf_print( & name, "OMP Master Thread #%d", gtid );
+ } else {
+ __kmp_str_buf_print( & name, "OMP Worker Thread #%d", gtid );
+ }
KMP_ITT_DEBUG_LOCK();
__itt_thr_name_set( name.str, name.used );
KMP_ITT_DEBUG_PRINT( "[thr nam] name( \"%s\")\n", name.str );
diff --git a/openmp/runtime/src/kmp_lock.cpp b/openmp/runtime/src/kmp_lock.cpp
index 4c924635ecd..679d7e935c5 100644
--- a/openmp/runtime/src/kmp_lock.cpp
+++ b/openmp/runtime/src/kmp_lock.cpp
@@ -1,7 +1,7 @@
/*
* kmp_lock.cpp -- lock-related functions
- * $Revision: 42810 $
- * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+ * $Revision: 43389 $
+ * $Date: 2014-08-11 10:54:01 -0500 (Mon, 11 Aug 2014) $
*/
@@ -39,29 +39,6 @@
# endif
#endif
-
-#ifndef KMP_DEBUG
-# define __kmp_static_delay( arg ) /* nothing to do */
-#else
-
-static void
-__kmp_static_delay( int arg )
-{
-/* Work around weird code-gen bug that causes assert to trip */
-# if KMP_ARCH_X86_64 && KMP_OS_LINUX
- KMP_ASSERT( arg != 0 );
-# else
- KMP_ASSERT( arg >= 0 );
-# endif
-}
-#endif /* KMP_DEBUG */
-
-static void
-__kmp_static_yield( int arg )
-{
- __kmp_yield( arg );
-}
-
/* Implement spin locks for internal library use. */
/* The algorithm implemented is Lamport's bakery lock [1974]. */
@@ -163,15 +140,13 @@ __kmp_acquire_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid )
static void
__kmp_acquire_tas_lock_with_checks( kmp_tas_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_lock";
- if ( ( sizeof ( kmp_tas_lock_t ) <= OMP_LOCK_T_SIZE )
- && __kmp_is_tas_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( ( gtid >= 0 ) && ( __kmp_get_tas_lock_owner( lck ) == gtid ) ) {
- KMP_FATAL( LockIsAlreadyOwned, func );
- }
+ char const * const func = "omp_set_lock";
+ if ( ( sizeof ( kmp_tas_lock_t ) <= OMP_LOCK_T_SIZE )
+ && __kmp_is_tas_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( ( gtid >= 0 ) && ( __kmp_get_tas_lock_owner( lck ) == gtid ) ) {
+ KMP_FATAL( LockIsAlreadyOwned, func );
}
__kmp_acquire_tas_lock( lck, gtid );
}
@@ -190,12 +165,10 @@ __kmp_test_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid )
static int
__kmp_test_tas_lock_with_checks( kmp_tas_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_lock";
- if ( ( sizeof ( kmp_tas_lock_t ) <= OMP_LOCK_T_SIZE )
- && __kmp_is_tas_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
+ char const * const func = "omp_test_lock";
+ if ( ( sizeof ( kmp_tas_lock_t ) <= OMP_LOCK_T_SIZE )
+ && __kmp_is_tas_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
}
return __kmp_test_tas_lock( lck, gtid );
}
@@ -217,20 +190,18 @@ __kmp_release_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid )
static void
__kmp_release_tas_lock_with_checks( kmp_tas_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( ( sizeof ( kmp_tas_lock_t ) <= OMP_LOCK_T_SIZE )
- && __kmp_is_tas_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_tas_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( ( gtid >= 0 ) && ( __kmp_get_tas_lock_owner( lck ) >= 0 )
- && ( __kmp_get_tas_lock_owner( lck ) != gtid ) ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
+ char const * const func = "omp_unset_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( ( sizeof ( kmp_tas_lock_t ) <= OMP_LOCK_T_SIZE )
+ && __kmp_is_tas_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( __kmp_get_tas_lock_owner( lck ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
+ }
+ if ( ( gtid >= 0 ) && ( __kmp_get_tas_lock_owner( lck ) >= 0 )
+ && ( __kmp_get_tas_lock_owner( lck ) != gtid ) ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
}
__kmp_release_tas_lock( lck, gtid );
}
@@ -256,15 +227,13 @@ __kmp_destroy_tas_lock( kmp_tas_lock_t *lck )
static void
__kmp_destroy_tas_lock_with_checks( kmp_tas_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_lock";
- if ( ( sizeof ( kmp_tas_lock_t ) <= OMP_LOCK_T_SIZE )
- && __kmp_is_tas_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_tas_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_lock";
+ if ( ( sizeof ( kmp_tas_lock_t ) <= OMP_LOCK_T_SIZE )
+ && __kmp_is_tas_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( __kmp_get_tas_lock_owner( lck ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_tas_lock( lck );
}
@@ -291,11 +260,9 @@ __kmp_acquire_nested_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid )
static void
__kmp_acquire_nested_tas_lock_with_checks( kmp_tas_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_nest_lock";
- if ( ! __kmp_is_tas_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
+ char const * const func = "omp_set_nest_lock";
+ if ( ! __kmp_is_tas_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
}
__kmp_acquire_nested_tas_lock( lck, gtid );
}
@@ -323,11 +290,9 @@ __kmp_test_nested_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid )
static int
__kmp_test_nested_tas_lock_with_checks( kmp_tas_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_nest_lock";
- if ( ! __kmp_is_tas_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
+ char const * const func = "omp_test_nest_lock";
+ if ( ! __kmp_is_tas_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
}
return __kmp_test_nested_tas_lock( lck, gtid );
}
@@ -346,18 +311,16 @@ __kmp_release_nested_tas_lock( kmp_tas_lock_t *lck, kmp_int32 gtid )
static void
__kmp_release_nested_tas_lock_with_checks( kmp_tas_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_nest_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( ! __kmp_is_tas_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
- if ( __kmp_get_tas_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( __kmp_get_tas_lock_owner( lck ) != gtid ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
+ char const * const func = "omp_unset_nest_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( ! __kmp_is_tas_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
+ }
+ if ( __kmp_get_tas_lock_owner( lck ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
+ }
+ if ( __kmp_get_tas_lock_owner( lck ) != gtid ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
}
__kmp_release_nested_tas_lock( lck, gtid );
}
@@ -385,14 +348,12 @@ __kmp_destroy_nested_tas_lock( kmp_tas_lock_t *lck )
static void
__kmp_destroy_nested_tas_lock_with_checks( kmp_tas_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_nest_lock";
- if ( ! __kmp_is_tas_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
- if ( __kmp_get_tas_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_nest_lock";
+ if ( ! __kmp_is_tas_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
+ }
+ if ( __kmp_get_tas_lock_owner( lck ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_nested_tas_lock( lck );
}
@@ -506,15 +467,13 @@ __kmp_acquire_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid )
static void
__kmp_acquire_futex_lock_with_checks( kmp_futex_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_lock";
- if ( ( sizeof ( kmp_futex_lock_t ) <= OMP_LOCK_T_SIZE )
- && __kmp_is_futex_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( ( gtid >= 0 ) && ( __kmp_get_futex_lock_owner( lck ) == gtid ) ) {
- KMP_FATAL( LockIsAlreadyOwned, func );
- }
+ char const * const func = "omp_set_lock";
+ if ( ( sizeof ( kmp_futex_lock_t ) <= OMP_LOCK_T_SIZE )
+ && __kmp_is_futex_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( ( gtid >= 0 ) && ( __kmp_get_futex_lock_owner( lck ) == gtid ) ) {
+ KMP_FATAL( LockIsAlreadyOwned, func );
}
__kmp_acquire_futex_lock( lck, gtid );
}
@@ -532,12 +491,10 @@ __kmp_test_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid )
static int
__kmp_test_futex_lock_with_checks( kmp_futex_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_lock";
- if ( ( sizeof ( kmp_futex_lock_t ) <= OMP_LOCK_T_SIZE )
- && __kmp_is_futex_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
+ char const * const func = "omp_test_lock";
+ if ( ( sizeof ( kmp_futex_lock_t ) <= OMP_LOCK_T_SIZE )
+ && __kmp_is_futex_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
}
return __kmp_test_futex_lock( lck, gtid );
}
@@ -575,20 +532,18 @@ __kmp_release_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid )
static void
__kmp_release_futex_lock_with_checks( kmp_futex_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( ( sizeof ( kmp_futex_lock_t ) <= OMP_LOCK_T_SIZE )
- && __kmp_is_futex_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_futex_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( ( gtid >= 0 ) && ( __kmp_get_futex_lock_owner( lck ) >= 0 )
- && ( __kmp_get_futex_lock_owner( lck ) != gtid ) ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
+ char const * const func = "omp_unset_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( ( sizeof ( kmp_futex_lock_t ) <= OMP_LOCK_T_SIZE )
+ && __kmp_is_futex_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( __kmp_get_futex_lock_owner( lck ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
+ }
+ if ( ( gtid >= 0 ) && ( __kmp_get_futex_lock_owner( lck ) >= 0 )
+ && ( __kmp_get_futex_lock_owner( lck ) != gtid ) ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
}
__kmp_release_futex_lock( lck, gtid );
}
@@ -614,15 +569,13 @@ __kmp_destroy_futex_lock( kmp_futex_lock_t *lck )
static void
__kmp_destroy_futex_lock_with_checks( kmp_futex_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_lock";
- if ( ( sizeof ( kmp_futex_lock_t ) <= OMP_LOCK_T_SIZE )
- && __kmp_is_futex_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_futex_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_lock";
+ if ( ( sizeof ( kmp_futex_lock_t ) <= OMP_LOCK_T_SIZE )
+ && __kmp_is_futex_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( __kmp_get_futex_lock_owner( lck ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_futex_lock( lck );
}
@@ -649,11 +602,9 @@ __kmp_acquire_nested_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid )
static void
__kmp_acquire_nested_futex_lock_with_checks( kmp_futex_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_nest_lock";
- if ( ! __kmp_is_futex_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
+ char const * const func = "omp_set_nest_lock";
+ if ( ! __kmp_is_futex_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
}
__kmp_acquire_nested_futex_lock( lck, gtid );
}
@@ -681,11 +632,9 @@ __kmp_test_nested_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid )
static int
__kmp_test_nested_futex_lock_with_checks( kmp_futex_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_nest_lock";
- if ( ! __kmp_is_futex_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
+ char const * const func = "omp_test_nest_lock";
+ if ( ! __kmp_is_futex_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
}
return __kmp_test_nested_futex_lock( lck, gtid );
}
@@ -704,18 +653,16 @@ __kmp_release_nested_futex_lock( kmp_futex_lock_t *lck, kmp_int32 gtid )
static void
__kmp_release_nested_futex_lock_with_checks( kmp_futex_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_nest_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( ! __kmp_is_futex_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
- if ( __kmp_get_futex_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( __kmp_get_futex_lock_owner( lck ) != gtid ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
+ char const * const func = "omp_unset_nest_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( ! __kmp_is_futex_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
+ }
+ if ( __kmp_get_futex_lock_owner( lck ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
+ }
+ if ( __kmp_get_futex_lock_owner( lck ) != gtid ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
}
__kmp_release_nested_futex_lock( lck, gtid );
}
@@ -743,14 +690,12 @@ __kmp_destroy_nested_futex_lock( kmp_futex_lock_t *lck )
static void
__kmp_destroy_nested_futex_lock_with_checks( kmp_futex_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_nest_lock";
- if ( ! __kmp_is_futex_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
- if ( __kmp_get_futex_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_nest_lock";
+ if ( ! __kmp_is_futex_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
+ }
+ if ( __kmp_get_futex_lock_owner( lck ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_nested_futex_lock( lck );
}
@@ -781,9 +726,7 @@ __kmp_bakery_check(kmp_uint value, kmp_uint checker)
if (value == checker) {
return TRUE;
}
- for (pause = checker - value; pause != 0; --pause) {
- __kmp_static_delay(TRUE);
- }
+ for (pause = checker - value; pause != 0; --pause);
return FALSE;
}
@@ -818,24 +761,20 @@ __kmp_acquire_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid )
static void
__kmp_acquire_ticket_lock_with_checks( kmp_ticket_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_ticket_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( ( gtid >= 0 ) && ( __kmp_get_ticket_lock_owner( lck ) == gtid ) ) {
- KMP_FATAL( LockIsAlreadyOwned, func );
- }
+ char const * const func = "omp_set_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_ticket_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( ( gtid >= 0 ) && ( __kmp_get_ticket_lock_owner( lck ) == gtid ) ) {
+ KMP_FATAL( LockIsAlreadyOwned, func );
}
__kmp_acquire_ticket_lock( lck, gtid );
- if ( __kmp_env_consistency_check ) {
- lck->lk.owner_id = gtid + 1;
- }
+ lck->lk.owner_id = gtid + 1;
}
int
@@ -856,19 +795,17 @@ __kmp_test_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid )
static int
__kmp_test_ticket_lock_with_checks( kmp_ticket_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_ticket_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
+ char const * const func = "omp_test_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_ticket_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
}
int retval = __kmp_test_ticket_lock( lck, gtid );
- if ( __kmp_env_consistency_check && retval ) {
+ if ( retval ) {
lck->lk.owner_id = gtid + 1;
}
return retval;
@@ -895,24 +832,22 @@ __kmp_release_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid )
static void
__kmp_release_ticket_lock_with_checks( kmp_ticket_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_ticket_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_ticket_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( ( gtid >= 0 ) && ( __kmp_get_ticket_lock_owner( lck ) >= 0 )
- && ( __kmp_get_ticket_lock_owner( lck ) != gtid ) ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
- lck->lk.owner_id = 0;
+ char const * const func = "omp_unset_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_ticket_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
}
+ if ( __kmp_get_ticket_lock_owner( lck ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
+ }
+ if ( ( gtid >= 0 ) && ( __kmp_get_ticket_lock_owner( lck ) >= 0 )
+ && ( __kmp_get_ticket_lock_owner( lck ) != gtid ) ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
+ }
+ lck->lk.owner_id = 0;
__kmp_release_ticket_lock( lck, gtid );
}
@@ -947,17 +882,15 @@ __kmp_destroy_ticket_lock( kmp_ticket_lock_t *lck )
static void
__kmp_destroy_ticket_lock_with_checks( kmp_ticket_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_ticket_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_ticket_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_ticket_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( __kmp_get_ticket_lock_owner( lck ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_ticket_lock( lck );
}
@@ -987,14 +920,12 @@ __kmp_acquire_nested_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid )
static void
__kmp_acquire_nested_ticket_lock_with_checks( kmp_ticket_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_nest_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_ticket_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
+ char const * const func = "omp_set_nest_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_ticket_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
}
__kmp_acquire_nested_ticket_lock( lck, gtid );
}
@@ -1025,14 +956,12 @@ static int
__kmp_test_nested_ticket_lock_with_checks( kmp_ticket_lock_t *lck,
kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_nest_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_ticket_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
+ char const * const func = "omp_test_nest_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_ticket_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
}
return __kmp_test_nested_ticket_lock( lck, gtid );
}
@@ -1053,21 +982,19 @@ __kmp_release_nested_ticket_lock( kmp_ticket_lock_t *lck, kmp_int32 gtid )
static void
__kmp_release_nested_ticket_lock_with_checks( kmp_ticket_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_nest_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_ticket_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
- if ( __kmp_get_ticket_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( __kmp_get_ticket_lock_owner( lck ) != gtid ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
+ char const * const func = "omp_unset_nest_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_ticket_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
+ }
+ if ( __kmp_get_ticket_lock_owner( lck ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
+ }
+ if ( __kmp_get_ticket_lock_owner( lck ) != gtid ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
}
__kmp_release_nested_ticket_lock( lck, gtid );
}
@@ -1095,17 +1022,15 @@ __kmp_destroy_nested_ticket_lock( kmp_ticket_lock_t *lck )
static void
__kmp_destroy_nested_ticket_lock_with_checks( kmp_ticket_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_nest_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_ticket_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
- if ( __kmp_get_ticket_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_nest_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_ticket_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
+ }
+ if ( __kmp_get_ticket_lock_owner( lck ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_nested_ticket_lock( lck );
}
@@ -1443,24 +1368,20 @@ static void
__kmp_acquire_queuing_lock_with_checks( kmp_queuing_lock_t *lck,
kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_queuing_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) == gtid ) {
- KMP_FATAL( LockIsAlreadyOwned, func );
- }
+ char const * const func = "omp_set_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_queuing_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( lck ) == gtid ) {
+ KMP_FATAL( LockIsAlreadyOwned, func );
}
__kmp_acquire_queuing_lock( lck, gtid );
- if ( __kmp_env_consistency_check ) {
- lck->lk.owner_id = gtid + 1;
- }
+ lck->lk.owner_id = gtid + 1;
}
int
@@ -1500,19 +1421,17 @@ __kmp_test_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid )
static int
__kmp_test_queuing_lock_with_checks( kmp_queuing_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_queuing_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
+ char const * const func = "omp_test_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_queuing_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
}
int retval = __kmp_test_queuing_lock( lck, gtid );
- if ( __kmp_env_consistency_check && retval ) {
+ if ( retval ) {
lck->lk.owner_id = gtid + 1;
}
return retval;
@@ -1655,23 +1574,21 @@ static void
__kmp_release_queuing_lock_with_checks( kmp_queuing_lock_t *lck,
kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_queuing_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) != gtid ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
- lck->lk.owner_id = 0;
+ char const * const func = "omp_unset_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_queuing_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( lck ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( lck ) != gtid ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
}
+ lck->lk.owner_id = 0;
__kmp_release_queuing_lock( lck, gtid );
}
@@ -1712,17 +1629,15 @@ __kmp_destroy_queuing_lock( kmp_queuing_lock_t *lck )
static void
__kmp_destroy_queuing_lock_with_checks( kmp_queuing_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_queuing_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_queuing_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( lck ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_queuing_lock( lck );
}
@@ -1752,14 +1667,12 @@ __kmp_acquire_nested_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid )
static void
__kmp_acquire_nested_queuing_lock_with_checks( kmp_queuing_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_nest_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_queuing_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
+ char const * const func = "omp_set_nest_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_queuing_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
}
__kmp_acquire_nested_queuing_lock( lck, gtid );
}
@@ -1790,14 +1703,12 @@ static int
__kmp_test_nested_queuing_lock_with_checks( kmp_queuing_lock_t *lck,
kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_nest_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_queuing_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
+ char const * const func = "omp_test_nest_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_queuing_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
}
return __kmp_test_nested_queuing_lock( lck, gtid );
}
@@ -1818,21 +1729,19 @@ __kmp_release_nested_queuing_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid )
static void
__kmp_release_nested_queuing_lock_with_checks( kmp_queuing_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_nest_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_queuing_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) != gtid ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
+ char const * const func = "omp_unset_nest_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_queuing_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( lck ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( lck ) != gtid ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
}
__kmp_release_nested_queuing_lock( lck, gtid );
}
@@ -1860,17 +1769,15 @@ __kmp_destroy_nested_queuing_lock( kmp_queuing_lock_t *lck )
static void
__kmp_destroy_nested_queuing_lock_with_checks( kmp_queuing_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_nest_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_queuing_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_nest_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_queuing_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( lck ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_nested_queuing_lock( lck );
}
@@ -2032,7 +1939,7 @@ static __inline void _xend()
static kmp_adaptive_lock_statistics_t destroyedStats;
// To hold the list of live locks.
-static kmp_adaptive_lock_t liveLocks;
+static kmp_adaptive_lock_info_t liveLocks;
// A lock so we can safely update the list of locks.
static kmp_bootstrap_lock_t chain_lock;
@@ -2041,7 +1948,7 @@ static kmp_bootstrap_lock_t chain_lock;
void
__kmp_init_speculative_stats()
{
- kmp_adaptive_lock *lck = &liveLocks;
+ kmp_adaptive_lock_info_t *lck = &liveLocks;
memset( ( void * ) & ( lck->stats ), 0, sizeof( lck->stats ) );
lck->stats.next = lck;
@@ -2056,7 +1963,7 @@ __kmp_init_speculative_stats()
// Insert the lock into the circular list
static void
-__kmp_remember_lock( kmp_adaptive_lock * lck )
+__kmp_remember_lock( kmp_adaptive_lock_info_t * lck )
{
__kmp_acquire_bootstrap_lock( &chain_lock );
@@ -2073,27 +1980,27 @@ __kmp_remember_lock( kmp_adaptive_lock * lck )
}
static void
-__kmp_forget_lock( kmp_adaptive_lock * lck )
+__kmp_forget_lock( kmp_adaptive_lock_info_t * lck )
{
KMP_ASSERT( lck->stats.next->stats.prev == lck );
KMP_ASSERT( lck->stats.prev->stats.next == lck );
- kmp_adaptive_lock * n = lck->stats.next;
- kmp_adaptive_lock * p = lck->stats.prev;
+ kmp_adaptive_lock_info_t * n = lck->stats.next;
+ kmp_adaptive_lock_info_t * p = lck->stats.prev;
n->stats.prev = p;
p->stats.next = n;
}
static void
-__kmp_zero_speculative_stats( kmp_adaptive_lock * lck )
+__kmp_zero_speculative_stats( kmp_adaptive_lock_info_t * lck )
{
memset( ( void * )&lck->stats, 0, sizeof( lck->stats ) );
__kmp_remember_lock( lck );
}
static void
-__kmp_add_stats( kmp_adaptive_lock_statistics_t * t, kmp_adaptive_lock_t * lck )
+__kmp_add_stats( kmp_adaptive_lock_statistics_t * t, kmp_adaptive_lock_info_t * lck )
{
kmp_adaptive_lock_statistics_t volatile *s = &lck->stats;
@@ -2106,7 +2013,7 @@ __kmp_add_stats( kmp_adaptive_lock_statistics_t * t, kmp_adaptive_lock_t * lck )
}
static void
-__kmp_accumulate_speculative_stats( kmp_adaptive_lock * lck)
+__kmp_accumulate_speculative_stats( kmp_adaptive_lock_info_t * lck)
{
kmp_adaptive_lock_statistics_t *t = &destroyedStats;
@@ -2132,7 +2039,8 @@ FILE * __kmp_open_stats_file()
size_t buffLen = strlen( __kmp_speculative_statsfile ) + 20;
char buffer[buffLen];
- snprintf (&buffer[0], buffLen, __kmp_speculative_statsfile, getpid());
+ snprintf (&buffer[0], buffLen, __kmp_speculative_statsfile,
+ (kmp_int32)getpid());
FILE * result = fopen(&buffer[0], "w");
// Maybe we should issue a warning here...
@@ -2148,7 +2056,7 @@ __kmp_print_speculative_stats()
FILE * statsFile = __kmp_open_stats_file();
kmp_adaptive_lock_statistics_t total = destroyedStats;
- kmp_adaptive_lock *lck;
+ kmp_adaptive_lock_info_t *lck;
for (lck = liveLocks.stats.next; lck != &liveLocks; lck = lck->stats.next) {
__kmp_add_stats( &total, lck );
@@ -2210,7 +2118,7 @@ __kmp_is_unlocked_queuing_lock( kmp_queuing_lock_t *lck )
// Functions for manipulating the badness
static __inline void
-__kmp_update_badness_after_success( kmp_queuing_lock_t *lck )
+__kmp_update_badness_after_success( kmp_adaptive_lock_t *lck )
{
// Reset the badness to zero so we eagerly try to speculate again
lck->lk.adaptive.badness = 0;
@@ -2219,7 +2127,7 @@ __kmp_update_badness_after_success( kmp_queuing_lock_t *lck )
// Create a bit mask with one more set bit.
static __inline void
-__kmp_step_badness( kmp_queuing_lock_t *lck )
+__kmp_step_badness( kmp_adaptive_lock_t *lck )
{
kmp_uint32 newBadness = ( lck->lk.adaptive.badness << 1 ) | 1;
if ( newBadness > lck->lk.adaptive.max_badness) {
@@ -2231,7 +2139,7 @@ __kmp_step_badness( kmp_queuing_lock_t *lck )
// Check whether speculation should be attempted.
static __inline int
-__kmp_should_speculate( kmp_queuing_lock_t *lck, kmp_int32 gtid )
+__kmp_should_speculate( kmp_adaptive_lock_t *lck, kmp_int32 gtid )
{
kmp_uint32 badness = lck->lk.adaptive.badness;
kmp_uint32 attempts= lck->lk.adaptive.acquire_attempts;
@@ -2243,7 +2151,7 @@ __kmp_should_speculate( kmp_queuing_lock_t *lck, kmp_int32 gtid )
// Does not back off to the non-speculative lock.
//
static int
-__kmp_test_adaptive_lock_only( kmp_queuing_lock_t * lck, kmp_int32 gtid )
+__kmp_test_adaptive_lock_only( kmp_adaptive_lock_t * lck, kmp_int32 gtid )
{
int retries = lck->lk.adaptive.max_soft_retries;
@@ -2264,7 +2172,7 @@ __kmp_test_adaptive_lock_only( kmp_queuing_lock_t * lck, kmp_int32 gtid )
* and now. This also gets the lock cache line into our read-set,
* which we need so that we'll abort if anyone later claims it for real.
*/
- if (! __kmp_is_unlocked_queuing_lock( lck ) )
+ if (! __kmp_is_unlocked_queuing_lock( GET_QLK_PTR(lck) ) )
{
// Lock is now visibly acquired, so someone beat us to it.
// Abort the transaction so we'll restart from _xbegin with the
@@ -2299,7 +2207,7 @@ __kmp_test_adaptive_lock_only( kmp_queuing_lock_t * lck, kmp_int32 gtid )
// if the speculative lock cannot be acquired.
// We can succeed speculatively, non-speculatively, or fail.
static int
-__kmp_test_adaptive_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid )
+__kmp_test_adaptive_lock( kmp_adaptive_lock_t *lck, kmp_int32 gtid )
{
// First try to acquire the lock speculatively
if ( __kmp_should_speculate( lck, gtid ) && __kmp_test_adaptive_lock_only( lck, gtid ) )
@@ -2310,7 +2218,7 @@ __kmp_test_adaptive_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid )
lck->lk.adaptive.acquire_attempts++;
// Use base, non-speculative lock.
- if ( __kmp_test_queuing_lock( lck, gtid ) )
+ if ( __kmp_test_queuing_lock( GET_QLK_PTR(lck), gtid ) )
{
KMP_INC_STAT(lck,nonSpeculativeAcquires);
return 1; // Lock is acquired (non-speculatively)
@@ -2322,19 +2230,17 @@ __kmp_test_adaptive_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid )
}
static int
-__kmp_test_adaptive_lock_with_checks( kmp_queuing_lock_t *lck, kmp_int32 gtid )
+__kmp_test_adaptive_lock_with_checks( kmp_adaptive_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
+ char const * const func = "omp_test_lock";
+ if ( lck->lk.qlk.initialized != GET_QLK_PTR(lck) ) {
+ KMP_FATAL( LockIsUninitialized, func );
}
int retval = __kmp_test_adaptive_lock( lck, gtid );
- if ( __kmp_env_consistency_check && retval ) {
- lck->lk.owner_id = gtid + 1;
+ if ( retval ) {
+ lck->lk.qlk.owner_id = gtid + 1;
}
return retval;
}
@@ -2354,11 +2260,11 @@ __kmp_test_adaptive_lock_with_checks( kmp_queuing_lock_t *lck, kmp_int32 gtid )
// is no longer fair. However OpenMP makes no guarantee that its
// locks are fair, so this isn't a real problem.
static void
-__kmp_acquire_adaptive_lock( kmp_queuing_lock_t * lck, kmp_int32 gtid )
+__kmp_acquire_adaptive_lock( kmp_adaptive_lock_t * lck, kmp_int32 gtid )
{
if ( __kmp_should_speculate( lck, gtid ) )
{
- if ( __kmp_is_unlocked_queuing_lock( lck ) )
+ if ( __kmp_is_unlocked_queuing_lock( GET_QLK_PTR(lck) ) )
{
if ( __kmp_test_adaptive_lock_only( lck , gtid ) )
return;
@@ -2372,7 +2278,7 @@ __kmp_acquire_adaptive_lock( kmp_queuing_lock_t * lck, kmp_int32 gtid )
// All other threads will also see the same result for
// shouldSpeculate, so will be doing the same if they
// try to claim the lock from now on.
- while ( ! __kmp_is_unlocked_queuing_lock( lck ) )
+ while ( ! __kmp_is_unlocked_queuing_lock( GET_QLK_PTR(lck) ) )
{
KMP_INC_STAT(lck,lemmingYields);
__kmp_yield (TRUE);
@@ -2387,35 +2293,31 @@ __kmp_acquire_adaptive_lock( kmp_queuing_lock_t * lck, kmp_int32 gtid )
// Count the non-speculative acquire attempt
lck->lk.adaptive.acquire_attempts++;
- __kmp_acquire_queuing_lock_timed_template<FALSE>( lck, gtid );
+ __kmp_acquire_queuing_lock_timed_template<FALSE>( GET_QLK_PTR(lck), gtid );
// We have acquired the base lock, so count that.
KMP_INC_STAT(lck,nonSpeculativeAcquires );
}
static void
-__kmp_acquire_adaptive_lock_with_checks( kmp_queuing_lock_t *lck, kmp_int32 gtid )
+__kmp_acquire_adaptive_lock_with_checks( kmp_adaptive_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) == gtid ) {
- KMP_FATAL( LockIsAlreadyOwned, func );
- }
+ char const * const func = "omp_set_lock";
+ if ( lck->lk.qlk.initialized != GET_QLK_PTR(lck) ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( GET_QLK_PTR(lck) ) == gtid ) {
+ KMP_FATAL( LockIsAlreadyOwned, func );
}
__kmp_acquire_adaptive_lock( lck, gtid );
- if ( __kmp_env_consistency_check ) {
- lck->lk.owner_id = gtid + 1;
- }
+ lck->lk.qlk.owner_id = gtid + 1;
}
static void
-__kmp_release_adaptive_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid )
+__kmp_release_adaptive_lock( kmp_adaptive_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_is_unlocked_queuing_lock( lck ) )
+ if ( __kmp_is_unlocked_queuing_lock( GET_QLK_PTR(lck) ) )
{ // If the lock doesn't look claimed we must be speculating.
// (Or the user's code is buggy and they're releasing without locking;
// if we had XTEST we'd be able to check that case...)
@@ -2425,34 +2327,32 @@ __kmp_release_adaptive_lock( kmp_queuing_lock_t *lck, kmp_int32 gtid )
else
{ // Since the lock *is* visibly locked we're not speculating,
// so should use the underlying lock's release scheme.
- __kmp_release_queuing_lock( lck, gtid );
+ __kmp_release_queuing_lock( GET_QLK_PTR(lck), gtid );
}
}
static void
-__kmp_release_adaptive_lock_with_checks( kmp_queuing_lock_t *lck, kmp_int32 gtid )
+__kmp_release_adaptive_lock_with_checks( kmp_adaptive_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) != gtid ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
- lck->lk.owner_id = 0;
+ char const * const func = "omp_unset_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( lck->lk.qlk.initialized != GET_QLK_PTR(lck) ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( GET_QLK_PTR(lck) ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( GET_QLK_PTR(lck) ) != gtid ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
}
+ lck->lk.qlk.owner_id = 0;
__kmp_release_adaptive_lock( lck, gtid );
}
static void
-__kmp_init_adaptive_lock( kmp_queuing_lock_t *lck )
+__kmp_init_adaptive_lock( kmp_adaptive_lock_t *lck )
{
- __kmp_init_queuing_lock( lck );
+ __kmp_init_queuing_lock( GET_QLK_PTR(lck) );
lck->lk.adaptive.badness = 0;
lck->lk.adaptive.acquire_attempts = 0; //nonSpeculativeAcquireAttempts = 0;
lck->lk.adaptive.max_soft_retries = __kmp_adaptive_backoff_params.max_soft_retries;
@@ -2464,32 +2364,30 @@ __kmp_init_adaptive_lock( kmp_queuing_lock_t *lck )
}
static void
-__kmp_init_adaptive_lock_with_checks( kmp_queuing_lock_t * lck )
+__kmp_init_adaptive_lock_with_checks( kmp_adaptive_lock_t * lck )
{
__kmp_init_adaptive_lock( lck );
}
static void
-__kmp_destroy_adaptive_lock( kmp_queuing_lock_t *lck )
+__kmp_destroy_adaptive_lock( kmp_adaptive_lock_t *lck )
{
#if KMP_DEBUG_ADAPTIVE_LOCKS
__kmp_accumulate_speculative_stats( &lck->lk.adaptive );
#endif
- __kmp_destroy_queuing_lock (lck);
+ __kmp_destroy_queuing_lock (GET_QLK_PTR(lck));
// Nothing needed for the speculative part.
}
static void
-__kmp_destroy_adaptive_lock_with_checks( kmp_queuing_lock_t *lck )
+__kmp_destroy_adaptive_lock_with_checks( kmp_adaptive_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_get_queuing_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_lock";
+ if ( lck->lk.qlk.initialized != GET_QLK_PTR(lck) ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_get_queuing_lock_owner( GET_QLK_PTR(lck) ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_adaptive_lock( lck );
}
@@ -2544,9 +2442,6 @@ __kmp_acquire_drdpa_lock_timed_template( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
KMP_FSYNC_PREPARE(lck);
KMP_INIT_YIELD(spins);
while (TCR_8(polls[ticket & mask]).poll < ticket) { // volatile load
- __kmp_static_delay(TRUE);
-
- //
// If we are oversubscribed,
// or have waited a bit (and KMP_LIBRARY=turnaround), then yield.
// CPU Pause is in the macros for yield.
@@ -2691,24 +2586,20 @@ __kmp_acquire_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
static void
__kmp_acquire_drdpa_lock_with_checks( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_drdpa_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( ( gtid >= 0 ) && ( __kmp_get_drdpa_lock_owner( lck ) == gtid ) ) {
- KMP_FATAL( LockIsAlreadyOwned, func );
- }
+ char const * const func = "omp_set_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_drdpa_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( ( gtid >= 0 ) && ( __kmp_get_drdpa_lock_owner( lck ) == gtid ) ) {
+ KMP_FATAL( LockIsAlreadyOwned, func );
}
__kmp_acquire_drdpa_lock( lck, gtid );
- if ( __kmp_env_consistency_check ) {
- lck->lk.owner_id = gtid + 1;
- }
+ lck->lk.owner_id = gtid + 1;
}
int
@@ -2750,19 +2641,17 @@ __kmp_test_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
static int
__kmp_test_drdpa_lock_with_checks( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_drdpa_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
+ char const * const func = "omp_test_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_drdpa_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
}
int retval = __kmp_test_drdpa_lock( lck, gtid );
- if ( __kmp_env_consistency_check && retval ) {
+ if ( retval ) {
lck->lk.owner_id = gtid + 1;
}
return retval;
@@ -2790,24 +2679,22 @@ __kmp_release_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
static void
__kmp_release_drdpa_lock_with_checks( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_drdpa_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_drdpa_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( ( gtid >= 0 ) && ( __kmp_get_drdpa_lock_owner( lck ) >= 0 )
- && ( __kmp_get_drdpa_lock_owner( lck ) != gtid ) ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
- lck->lk.owner_id = 0;
+ char const * const func = "omp_unset_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_drdpa_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( __kmp_get_drdpa_lock_owner( lck ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
}
+ if ( ( gtid >= 0 ) && ( __kmp_get_drdpa_lock_owner( lck ) >= 0 )
+ && ( __kmp_get_drdpa_lock_owner( lck ) != gtid ) ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
+ }
+ lck->lk.owner_id = 0;
__kmp_release_drdpa_lock( lck, gtid );
}
@@ -2861,17 +2748,15 @@ __kmp_destroy_drdpa_lock( kmp_drdpa_lock_t *lck )
static void
__kmp_destroy_drdpa_lock_with_checks( kmp_drdpa_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( __kmp_is_drdpa_lock_nestable( lck ) ) {
- KMP_FATAL( LockNestableUsedAsSimple, func );
- }
- if ( __kmp_get_drdpa_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( __kmp_is_drdpa_lock_nestable( lck ) ) {
+ KMP_FATAL( LockNestableUsedAsSimple, func );
+ }
+ if ( __kmp_get_drdpa_lock_owner( lck ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_drdpa_lock( lck );
}
@@ -2901,14 +2786,12 @@ __kmp_acquire_nested_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
static void
__kmp_acquire_nested_drdpa_lock_with_checks( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_set_nest_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_drdpa_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
+ char const * const func = "omp_set_nest_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_drdpa_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
}
__kmp_acquire_nested_drdpa_lock( lck, gtid );
}
@@ -2938,14 +2821,12 @@ __kmp_test_nested_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
static int
__kmp_test_nested_drdpa_lock_with_checks( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_test_nest_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_drdpa_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
+ char const * const func = "omp_test_nest_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_drdpa_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
}
return __kmp_test_nested_drdpa_lock( lck, gtid );
}
@@ -2966,21 +2847,19 @@ __kmp_release_nested_drdpa_lock( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
static void
__kmp_release_nested_drdpa_lock_with_checks( kmp_drdpa_lock_t *lck, kmp_int32 gtid )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_unset_nest_lock";
- KMP_MB(); /* in case another processor initialized lock */
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_drdpa_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
- if ( __kmp_get_drdpa_lock_owner( lck ) == -1 ) {
- KMP_FATAL( LockUnsettingFree, func );
- }
- if ( __kmp_get_drdpa_lock_owner( lck ) != gtid ) {
- KMP_FATAL( LockUnsettingSetByAnother, func );
- }
+ char const * const func = "omp_unset_nest_lock";
+ KMP_MB(); /* in case another processor initialized lock */
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_drdpa_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
+ }
+ if ( __kmp_get_drdpa_lock_owner( lck ) == -1 ) {
+ KMP_FATAL( LockUnsettingFree, func );
+ }
+ if ( __kmp_get_drdpa_lock_owner( lck ) != gtid ) {
+ KMP_FATAL( LockUnsettingSetByAnother, func );
}
__kmp_release_nested_drdpa_lock( lck, gtid );
}
@@ -3008,17 +2887,15 @@ __kmp_destroy_nested_drdpa_lock( kmp_drdpa_lock_t *lck )
static void
__kmp_destroy_nested_drdpa_lock_with_checks( kmp_drdpa_lock_t *lck )
{
- if ( __kmp_env_consistency_check ) {
- char const * const func = "omp_destroy_nest_lock";
- if ( lck->lk.initialized != lck ) {
- KMP_FATAL( LockIsUninitialized, func );
- }
- if ( ! __kmp_is_drdpa_lock_nestable( lck ) ) {
- KMP_FATAL( LockSimpleUsedAsNestable, func );
- }
- if ( __kmp_get_drdpa_lock_owner( lck ) != -1 ) {
- KMP_FATAL( LockStillOwned, func );
- }
+ char const * const func = "omp_destroy_nest_lock";
+ if ( lck->lk.initialized != lck ) {
+ KMP_FATAL( LockIsUninitialized, func );
+ }
+ if ( ! __kmp_is_drdpa_lock_nestable( lck ) ) {
+ KMP_FATAL( LockSimpleUsedAsNestable, func );
+ }
+ if ( __kmp_get_drdpa_lock_owner( lck ) != -1 ) {
+ KMP_FATAL( LockStillOwned, func );
}
__kmp_destroy_nested_drdpa_lock( lck );
}
@@ -3106,50 +2983,19 @@ void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind )
( kmp_int32 ( * )( kmp_user_lock_p ) )
( &__kmp_get_tas_lock_owner );
- __kmp_acquire_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_tas_lock_with_checks );
-
- __kmp_test_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_tas_lock_with_checks );
-
- __kmp_release_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_tas_lock_with_checks );
-
- __kmp_init_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_tas_lock_with_checks );
+ if ( __kmp_env_consistency_check ) {
+ KMP_BIND_USER_LOCK_WITH_CHECKS(tas);
+ KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(tas);
+ }
+ else {
+ KMP_BIND_USER_LOCK(tas);
+ KMP_BIND_NESTED_USER_LOCK(tas);
+ }
__kmp_destroy_user_lock_ =
( void ( * )( kmp_user_lock_p ) )
( &__kmp_destroy_tas_lock );
- __kmp_destroy_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_tas_lock_with_checks );
-
- __kmp_acquire_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_nested_tas_lock_with_checks );
-
- __kmp_test_nested_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_nested_tas_lock_with_checks );
-
- __kmp_release_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_nested_tas_lock_with_checks );
-
- __kmp_init_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_nested_tas_lock_with_checks );
-
- __kmp_destroy_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_nested_tas_lock_with_checks );
-
__kmp_is_user_lock_initialized_ =
( int ( * )( kmp_user_lock_p ) ) NULL;
@@ -3177,50 +3023,19 @@ void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind )
( kmp_int32 ( * )( kmp_user_lock_p ) )
( &__kmp_get_futex_lock_owner );
- __kmp_acquire_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_futex_lock_with_checks );
-
- __kmp_test_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_futex_lock_with_checks );
-
- __kmp_release_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_futex_lock_with_checks );
-
- __kmp_init_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_futex_lock_with_checks );
+ if ( __kmp_env_consistency_check ) {
+ KMP_BIND_USER_LOCK_WITH_CHECKS(futex);
+ KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(futex);
+ }
+ else {
+ KMP_BIND_USER_LOCK(futex);
+ KMP_BIND_NESTED_USER_LOCK(futex);
+ }
__kmp_destroy_user_lock_ =
( void ( * )( kmp_user_lock_p ) )
( &__kmp_destroy_futex_lock );
- __kmp_destroy_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_futex_lock_with_checks );
-
- __kmp_acquire_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_nested_futex_lock_with_checks );
-
- __kmp_test_nested_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_nested_futex_lock_with_checks );
-
- __kmp_release_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_nested_futex_lock_with_checks );
-
- __kmp_init_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_nested_futex_lock_with_checks );
-
- __kmp_destroy_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_nested_futex_lock_with_checks );
-
__kmp_is_user_lock_initialized_ =
( int ( * )( kmp_user_lock_p ) ) NULL;
@@ -3248,50 +3063,19 @@ void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind )
( kmp_int32 ( * )( kmp_user_lock_p ) )
( &__kmp_get_ticket_lock_owner );
- __kmp_acquire_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_ticket_lock_with_checks );
-
- __kmp_test_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_ticket_lock_with_checks );
-
- __kmp_release_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_ticket_lock_with_checks );
-
- __kmp_init_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_ticket_lock_with_checks );
+ if ( __kmp_env_consistency_check ) {
+ KMP_BIND_USER_LOCK_WITH_CHECKS(ticket);
+ KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(ticket);
+ }
+ else {
+ KMP_BIND_USER_LOCK(ticket);
+ KMP_BIND_NESTED_USER_LOCK(ticket);
+ }
__kmp_destroy_user_lock_ =
( void ( * )( kmp_user_lock_p ) )
( &__kmp_destroy_ticket_lock );
- __kmp_destroy_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_ticket_lock_with_checks );
-
- __kmp_acquire_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_nested_ticket_lock_with_checks );
-
- __kmp_test_nested_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_nested_ticket_lock_with_checks );
-
- __kmp_release_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_nested_ticket_lock_with_checks );
-
- __kmp_init_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_nested_ticket_lock_with_checks );
-
- __kmp_destroy_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_nested_ticket_lock_with_checks );
-
__kmp_is_user_lock_initialized_ =
( int ( * )( kmp_user_lock_p ) )
( &__kmp_is_ticket_lock_initialized );
@@ -3322,50 +3106,19 @@ void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind )
( kmp_int32 ( * )( kmp_user_lock_p ) )
( &__kmp_get_queuing_lock_owner );
- __kmp_acquire_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_queuing_lock_with_checks );
-
- __kmp_test_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_queuing_lock_with_checks );
-
- __kmp_release_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_queuing_lock_with_checks );
-
- __kmp_init_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_queuing_lock_with_checks );
+ if ( __kmp_env_consistency_check ) {
+ KMP_BIND_USER_LOCK_WITH_CHECKS(queuing);
+ KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(queuing);
+ }
+ else {
+ KMP_BIND_USER_LOCK(queuing);
+ KMP_BIND_NESTED_USER_LOCK(queuing);
+ }
__kmp_destroy_user_lock_ =
( void ( * )( kmp_user_lock_p ) )
( &__kmp_destroy_queuing_lock );
- __kmp_destroy_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_queuing_lock_with_checks );
-
- __kmp_acquire_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_nested_queuing_lock_with_checks );
-
- __kmp_test_nested_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_nested_queuing_lock_with_checks );
-
- __kmp_release_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_nested_queuing_lock_with_checks );
-
- __kmp_init_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_nested_queuing_lock_with_checks );
-
- __kmp_destroy_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_nested_queuing_lock_with_checks );
-
__kmp_is_user_lock_initialized_ =
( int ( * )( kmp_user_lock_p ) )
( &__kmp_is_queuing_lock_initialized );
@@ -3390,32 +3143,19 @@ void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind )
#if KMP_USE_ADAPTIVE_LOCKS
case lk_adaptive: {
- __kmp_base_user_lock_size = sizeof( kmp_base_queuing_lock_t );
- __kmp_user_lock_size = sizeof( kmp_queuing_lock_t );
+ __kmp_base_user_lock_size = sizeof( kmp_base_adaptive_lock_t );
+ __kmp_user_lock_size = sizeof( kmp_adaptive_lock_t );
__kmp_get_user_lock_owner_ =
( kmp_int32 ( * )( kmp_user_lock_p ) )
( &__kmp_get_queuing_lock_owner );
- __kmp_acquire_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_adaptive_lock_with_checks );
-
- __kmp_test_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_adaptive_lock_with_checks );
-
- __kmp_release_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_adaptive_lock_with_checks );
-
- __kmp_init_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_adaptive_lock_with_checks );
-
- __kmp_destroy_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_adaptive_lock_with_checks );
+ if ( __kmp_env_consistency_check ) {
+ KMP_BIND_USER_LOCK_WITH_CHECKS(adaptive);
+ }
+ else {
+ KMP_BIND_USER_LOCK(adaptive);
+ }
__kmp_destroy_user_lock_ =
( void ( * )( kmp_user_lock_p ) )
@@ -3453,50 +3193,19 @@ void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind )
( kmp_int32 ( * )( kmp_user_lock_p ) )
( &__kmp_get_drdpa_lock_owner );
- __kmp_acquire_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_drdpa_lock_with_checks );
-
- __kmp_test_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_drdpa_lock_with_checks );
-
- __kmp_release_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_drdpa_lock_with_checks );
-
- __kmp_init_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_drdpa_lock_with_checks );
+ if ( __kmp_env_consistency_check ) {
+ KMP_BIND_USER_LOCK_WITH_CHECKS(drdpa);
+ KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(drdpa);
+ }
+ else {
+ KMP_BIND_USER_LOCK(drdpa);
+ KMP_BIND_NESTED_USER_LOCK(drdpa);
+ }
__kmp_destroy_user_lock_ =
( void ( * )( kmp_user_lock_p ) )
( &__kmp_destroy_drdpa_lock );
- __kmp_destroy_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_drdpa_lock_with_checks );
-
- __kmp_acquire_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_acquire_nested_drdpa_lock_with_checks );
-
- __kmp_test_nested_user_lock_with_checks_ =
- ( int ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_test_nested_drdpa_lock_with_checks );
-
- __kmp_release_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p, kmp_int32 ) )
- ( &__kmp_release_nested_drdpa_lock_with_checks );
-
- __kmp_init_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_init_nested_drdpa_lock_with_checks );
-
- __kmp_destroy_nested_user_lock_with_checks_ =
- ( void ( * )( kmp_user_lock_p ) )
- ( &__kmp_destroy_nested_drdpa_lock_with_checks );
-
__kmp_is_user_lock_initialized_ =
( int ( * )( kmp_user_lock_p ) )
( &__kmp_is_drdpa_lock_initialized );
diff --git a/openmp/runtime/src/kmp_lock.h b/openmp/runtime/src/kmp_lock.h
index c5ce83823c0..31a93f56cde 100644
--- a/openmp/runtime/src/kmp_lock.h
+++ b/openmp/runtime/src/kmp_lock.h
@@ -1,7 +1,7 @@
/*
* kmp_lock.h -- lock header file
- * $Revision: 42810 $
- * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
*/
@@ -280,16 +280,16 @@ extern void __kmp_destroy_nested_ticket_lock( kmp_ticket_lock_t *lck );
#if KMP_USE_ADAPTIVE_LOCKS
-struct kmp_adaptive_lock;
+struct kmp_adaptive_lock_info;
-typedef struct kmp_adaptive_lock kmp_adaptive_lock_t;
+typedef struct kmp_adaptive_lock_info kmp_adaptive_lock_info_t;
#if KMP_DEBUG_ADAPTIVE_LOCKS
struct kmp_adaptive_lock_statistics {
/* So we can get stats from locks that haven't been destroyed. */
- kmp_adaptive_lock_t * next;
- kmp_adaptive_lock_t * prev;
+ kmp_adaptive_lock_info_t * next;
+ kmp_adaptive_lock_info_t * prev;
/* Other statistics */
kmp_uint32 successfulSpeculations;
@@ -307,7 +307,7 @@ extern void __kmp_init_speculative_stats();
#endif // KMP_DEBUG_ADAPTIVE_LOCKS
-struct kmp_adaptive_lock
+struct kmp_adaptive_lock_info
{
/* Values used for adaptivity.
* Although these are accessed from multiple threads we don't access them atomically,
@@ -348,10 +348,6 @@ struct kmp_base_queuing_lock {
kmp_int32 depth_locked; // depth locked, for nested locks only
kmp_lock_flags_t flags; // lock specifics, e.g. critical section lock
-#if KMP_USE_ADAPTIVE_LOCKS
- KMP_ALIGN(CACHE_LINE)
- kmp_adaptive_lock_t adaptive; // Information for the speculative adaptive lock
-#endif
};
typedef struct kmp_base_queuing_lock kmp_base_queuing_lock_t;
@@ -379,6 +375,30 @@ extern void __kmp_release_nested_queuing_lock( kmp_queuing_lock_t *lck, kmp_int3
extern void __kmp_init_nested_queuing_lock( kmp_queuing_lock_t *lck );
extern void __kmp_destroy_nested_queuing_lock( kmp_queuing_lock_t *lck );
+#if KMP_USE_ADAPTIVE_LOCKS
+
+// ----------------------------------------------------------------------------
+// Adaptive locks.
+// ----------------------------------------------------------------------------
+struct kmp_base_adaptive_lock {
+ kmp_base_queuing_lock qlk;
+ KMP_ALIGN(CACHE_LINE)
+ kmp_adaptive_lock_info_t adaptive; // Information for the speculative adaptive lock
+};
+
+typedef struct kmp_base_adaptive_lock kmp_base_adaptive_lock_t;
+
+union KMP_ALIGN_CACHE kmp_adaptive_lock {
+ kmp_base_adaptive_lock_t lk;
+ kmp_lock_pool_t pool;
+ double lk_align;
+ char lk_pad[ KMP_PAD(kmp_base_adaptive_lock_t, CACHE_LINE) ];
+};
+typedef union kmp_adaptive_lock kmp_adaptive_lock_t;
+
+# define GET_QLK_PTR(l) ((kmp_queuing_lock_t *) & (l)->lk.qlk)
+
+#endif // KMP_USE_ADAPTIVE_LOCKS
// ----------------------------------------------------------------------------
// DRDPA ticket locks.
@@ -913,7 +933,26 @@ __kmp_set_user_lock_flags( kmp_user_lock_p lck, kmp_lock_flags_t flags )
//
extern void __kmp_set_user_lock_vptrs( kmp_lock_kind_t user_lock_kind );
+//
+// Macros for binding user lock functions.
+//
+#define KMP_BIND_USER_LOCK_TEMPLATE(nest, kind, suffix) { \
+ __kmp_acquire##nest##user_lock_with_checks_ = ( void (*)( kmp_user_lock_p, kmp_int32 ) ) \
+ __kmp_acquire##nest##kind##_##suffix; \
+ __kmp_release##nest##user_lock_with_checks_ = ( void (*)( kmp_user_lock_p, kmp_int32 ) ) \
+ __kmp_release##nest##kind##_##suffix; \
+ __kmp_test##nest##user_lock_with_checks_ = ( int (*)( kmp_user_lock_p, kmp_int32 ) ) \
+ __kmp_test##nest##kind##_##suffix; \
+ __kmp_init##nest##user_lock_with_checks_ = ( void (*)( kmp_user_lock_p ) ) \
+ __kmp_init##nest##kind##_##suffix; \
+ __kmp_destroy##nest##user_lock_with_checks_ = ( void (*)( kmp_user_lock_p ) ) \
+ __kmp_destroy##nest##kind##_##suffix; \
+}
+#define KMP_BIND_USER_LOCK(kind) KMP_BIND_USER_LOCK_TEMPLATE(_, kind, lock)
+#define KMP_BIND_USER_LOCK_WITH_CHECKS(kind) KMP_BIND_USER_LOCK_TEMPLATE(_, kind, lock_with_checks)
+#define KMP_BIND_NESTED_USER_LOCK(kind) KMP_BIND_USER_LOCK_TEMPLATE(_nested_, kind, lock)
+#define KMP_BIND_NESTED_USER_LOCK_WITH_CHECKS(kind) KMP_BIND_USER_LOCK_TEMPLATE(_nested_, kind, lock_with_checks)
// ----------------------------------------------------------------------------
// User lock table & lock allocation
diff --git a/openmp/runtime/src/kmp_omp.h b/openmp/runtime/src/kmp_omp.h
index 667dbc9773c..e663739d462 100644
--- a/openmp/runtime/src/kmp_omp.h
+++ b/openmp/runtime/src/kmp_omp.h
@@ -1,8 +1,8 @@
/*
* kmp_omp.h -- OpenMP definition for kmp_omp_struct_info_t.
* This is for information about runtime library structures.
- * $Revision: 42105 $
- * $Date: 2013-03-11 14:51:34 -0500 (Mon, 11 Mar 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_os.h b/openmp/runtime/src/kmp_os.h
index 489f8f7a323..c65caf8ac4e 100644
--- a/openmp/runtime/src/kmp_os.h
+++ b/openmp/runtime/src/kmp_os.h
@@ -1,7 +1,7 @@
/*
* kmp_os.h -- KPTS runtime header file.
- * $Revision: 42820 $
- * $Date: 2013-11-13 16:53:44 -0600 (Wed, 13 Nov 2013) $
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
*/
@@ -69,7 +69,7 @@
#define KMP_OS_LINUX 0
#define KMP_OS_FREEBSD 0
#define KMP_OS_DARWIN 0
-#define KMP_OS_WINDOWS 0
+#define KMP_OS_WINDOWS 0
#define KMP_OS_CNK 0
#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */
@@ -116,6 +116,12 @@
# define KMP_OS_UNIX 1
#endif
+#if (KMP_OS_LINUX || KMP_OS_WINDOWS) && !KMP_OS_CNK && !KMP_ARCH_PPC64
+# define KMP_AFFINITY_SUPPORTED 1
+#else
+# define KMP_AFFINITY_SUPPORTED 0
+#endif
+
#if KMP_OS_WINDOWS
# if defined _M_AMD64
# undef KMP_ARCH_X86_64
@@ -356,6 +362,8 @@ typedef double kmp_real64;
extern "C" {
#endif // __cplusplus
+#define INTERNODE_CACHE_LINE 4096 /* for multi-node systems */
+
/* Define the default size of the cache line */
#ifndef CACHE_LINE
#define CACHE_LINE 128 /* cache line size in bytes */
@@ -366,16 +374,6 @@ extern "C" {
#endif
#endif /* CACHE_LINE */
-/* SGI's cache padding improvements using align decl specs (Ver 19) */
-#if !defined KMP_PERF_V19
-# define KMP_PERF_V19 KMP_ON
-#endif
-
-/* SGI's improvements for inline argv (Ver 106) */
-#if !defined KMP_PERF_V106
-# define KMP_PERF_V106 KMP_ON
-#endif
-
#define KMP_CACHE_PREFETCH(ADDR) /* nothing */
/* Temporary note: if performance testing of this passes, we can remove
@@ -383,10 +381,12 @@ extern "C" {
#if KMP_OS_UNIX && defined(__GNUC__)
# define KMP_DO_ALIGN(bytes) __attribute__((aligned(bytes)))
# define KMP_ALIGN_CACHE __attribute__((aligned(CACHE_LINE)))
+# define KMP_ALIGN_CACHE_INTERNODE __attribute__((aligned(INTERNODE_CACHE_LINE)))
# define KMP_ALIGN(bytes) __attribute__((aligned(bytes)))
#else
# define KMP_DO_ALIGN(bytes) __declspec( align(bytes) )
# define KMP_ALIGN_CACHE __declspec( align(CACHE_LINE) )
+# define KMP_ALIGN_CACHE_INTERNODE __declspec( align(INTERNODE_CACHE_LINE) )
# define KMP_ALIGN(bytes) __declspec( align(bytes) )
#endif
@@ -525,7 +525,7 @@ extern kmp_real64 __kmp_xchg_real64( volatile kmp_real64 *p, kmp_real64 v );
# define KMP_XCHG_REAL64(p, v) __kmp_xchg_real64( (p), (v) );
-#elif (KMP_ASM_INTRINS && (KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_DARWIN)) || !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
+#elif (KMP_ASM_INTRINS && KMP_OS_UNIX) || !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
/* cast p to correct type so that proper intrinsic will be used */
# define KMP_TEST_THEN_INC32(p) __sync_fetch_and_add( (kmp_int32 *)(p), 1 )
@@ -654,17 +654,6 @@ extern kmp_real64 __kmp_xchg_real64( volatile kmp_real64 *p, kmp_real64 v );
#endif /* KMP_ASM_INTRINS */
-# if !KMP_MIC
-//
-// no routines for floating addition on MIC
-// no intrinsic support for floating addition on UNIX
-//
-extern kmp_real32 __kmp_test_then_add_real32 ( volatile kmp_real32 *p, kmp_real32 v );
-extern kmp_real64 __kmp_test_then_add_real64 ( volatile kmp_real64 *p, kmp_real64 v );
-# define KMP_TEST_THEN_ADD_REAL32(p, v) __kmp_test_then_add_real32( (p), (v) )
-# define KMP_TEST_THEN_ADD_REAL64(p, v) __kmp_test_then_add_real64( (p), (v) )
-# endif
-
/* ------------- relaxed consistency memory model stuff ------------------ */
diff --git a/openmp/runtime/src/kmp_runtime.c b/openmp/runtime/src/kmp_runtime.c
index c31b5614395..e6755181958 100644
--- a/openmp/runtime/src/kmp_runtime.c
+++ b/openmp/runtime/src/kmp_runtime.c
@@ -1,7 +1,7 @@
/*
* kmp_runtime.c -- KPTS runtime support library
- * $Revision: 42839 $
- * $Date: 2013-11-24 13:01:00 -0600 (Sun, 24 Nov 2013) $
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
*/
@@ -25,26 +25,13 @@
#include "kmp_i18n.h"
#include "kmp_io.h"
#include "kmp_error.h"
+#include "kmp_stats.h"
+#include "kmp_wait_release.h"
/* these are temporary issues to be dealt with */
#define KMP_USE_PRCTL 0
#define KMP_USE_POOLED_ALLOC 0
-#if KMP_MIC
-#include <immintrin.h>
-#define USE_NGO_STORES 1
-#endif // KMP_MIC
-
-#if KMP_MIC && USE_NGO_STORES
-#define load_icvs(src) __m512d Vt_icvs = _mm512_load_pd((void *)(src))
-#define store_icvs(dst, src) _mm512_storenrngo_pd((void *)(dst), Vt_icvs)
-#define sync_icvs() __asm__ volatile ("lock; addl $0,0(%%rsp)" ::: "memory")
-#else
-#define load_icvs(src) ((void)0)
-#define store_icvs(dst, src) copy_icvs((dst), (src))
-#define sync_icvs() ((void)0)
-#endif /* KMP_MIC && USE_NGO_STORES */
-
#if KMP_OS_WINDOWS
#include <process.h>
#endif
@@ -57,34 +44,12 @@ char const __kmp_version_alt_comp[] = KMP_VERSION_PREFIX "alternative compiler s
char const __kmp_version_omp_api[] = KMP_VERSION_PREFIX "API version: "
#if OMP_40_ENABLED
"4.0 (201307)";
-#elif OMP_30_ENABLED
- "3.1 (201107)";
#else
- "2.5 (200505)";
+ "3.1 (201107)";
#endif
#ifdef KMP_DEBUG
-
char const __kmp_version_lock[] = KMP_VERSION_PREFIX "lock type: run time selectable";
-
-char const __kmp_version_perf_v19[] = KMP_VERSION_PREFIX "perf v19: "
-#if KMP_PERF_V19 == KMP_ON
- "on";
-#elif KMP_PERF_V19 == KMP_OFF
- "off";
-#else
- #error "Must specify KMP_PERF_V19 option"
-#endif
-
-char const __kmp_version_perf_v106[] = KMP_VERSION_PREFIX "perf v106: "
-#if KMP_PERF_V106 == KMP_ON
- "on";
-#elif KMP_PERF_V106 == KMP_OFF
- "off";
-#else
- #error "Must specify KMP_PERF_V106 option"
-#endif
-
#endif /* KMP_DEBUG */
@@ -103,19 +68,12 @@ kmp_info_t __kmp_monitor;
void __kmp_cleanup( void );
static void __kmp_initialize_info( kmp_info_t *, kmp_team_t *, int tid, int gtid );
-static void __kmp_initialize_team(
- kmp_team_t * team,
- int new_nproc,
- #if OMP_30_ENABLED
- kmp_internal_control_t * new_icvs,
- ident_t * loc
- #else
- int new_set_nproc, int new_set_dynamic, int new_set_nested,
- int new_set_blocktime, int new_bt_intervals, int new_bt_set
- #endif // OMP_30_ENABLED
-);
+static void __kmp_initialize_team( kmp_team_t * team, int new_nproc, kmp_internal_control_t * new_icvs, ident_t * loc );
static void __kmp_partition_places( kmp_team_t *team );
static void __kmp_do_serial_initialize( void );
+void __kmp_fork_barrier( int gtid, int tid );
+void __kmp_join_barrier( int gtid );
+void __kmp_setup_icv_copy( kmp_team_t *team, int new_nproc, kmp_internal_control_t * new_icvs, ident_t *loc );
#ifdef USE_LOAD_BALANCE
@@ -189,8 +147,8 @@ __kmp_get_global_thread_id( )
kmp_info_t *thr = (kmp_info_t *)TCR_SYNC_PTR(other_threads[i]);
if( !thr ) continue;
- stack_size = (size_t)TCR_PTR(thr -> th.th_info.ds.ds_stacksize);
- stack_base = (char *)TCR_PTR(thr -> th.th_info.ds.ds_stackbase);
+ stack_size = (size_t)TCR_PTR(thr->th.th_info.ds.ds_stacksize);
+ stack_base = (char *)TCR_PTR(thr->th.th_info.ds.ds_stackbase);
/* stack grows down -- search through all of the active threads */
@@ -221,7 +179,7 @@ __kmp_get_global_thread_id( )
KMP_FATAL( StackOverflow, i );
}
- stack_base = (char *) other_threads[i] -> th.th_info.ds.ds_stackbase;
+ stack_base = (char *) other_threads[i]->th.th_info.ds.ds_stackbase;
if( stack_addr > stack_base ) {
TCW_PTR(other_threads[i]->th.th_info.ds.ds_stackbase, stack_addr);
TCW_PTR(other_threads[i]->th.th_info.ds.ds_stacksize,
@@ -232,10 +190,10 @@ __kmp_get_global_thread_id( )
/* Reprint stack bounds for ubermaster since they have been refined */
if ( __kmp_storage_map ) {
- char *stack_end = (char *) other_threads[i] -> th.th_info.ds.ds_stackbase;
- char *stack_beg = stack_end - other_threads[i] -> th.th_info.ds.ds_stacksize;
+ char *stack_end = (char *) other_threads[i]->th.th_info.ds.ds_stackbase;
+ char *stack_beg = stack_end - other_threads[i]->th.th_info.ds.ds_stacksize;
__kmp_print_storage_map_gtid( i, stack_beg, stack_end,
- other_threads[i] -> th.th_info.ds.ds_stacksize,
+ other_threads[i]->th.th_info.ds.ds_stacksize,
"th_%d stack (refinement)", i );
}
return i;
@@ -294,8 +252,8 @@ __kmp_check_stack_overlap( kmp_info_t *th )
KA_TRACE(10,("__kmp_check_stack_overlap: called\n"));
if ( __kmp_storage_map ) {
- stack_end = (char *) th -> th.th_info.ds.ds_stackbase;
- stack_beg = stack_end - th -> th.th_info.ds.ds_stacksize;
+ stack_end = (char *) th->th.th_info.ds.ds_stackbase;
+ stack_beg = stack_end - th->th.th_info.ds.ds_stacksize;
gtid = __kmp_gtid_from_thread( th );
@@ -315,8 +273,8 @@ __kmp_check_stack_overlap( kmp_info_t *th )
{
KA_TRACE(10,("__kmp_check_stack_overlap: performing extensive checking\n"));
if ( stack_beg == NULL ) {
- stack_end = (char *) th -> th.th_info.ds.ds_stackbase;
- stack_beg = stack_end - th -> th.th_info.ds.ds_stacksize;
+ stack_end = (char *) th->th.th_info.ds.ds_stackbase;
+ stack_beg = stack_end - th->th.th_info.ds.ds_stacksize;
}
for( f=0 ; f < __kmp_threads_capacity ; f++ ) {
@@ -347,279 +305,6 @@ __kmp_check_stack_overlap( kmp_info_t *th )
/* ------------------------------------------------------------------------ */
-#ifndef KMP_DEBUG
-# define __kmp_static_delay( arg ) /* nothing to do */
-#else
-
-static void
-__kmp_static_delay( int arg )
-{
-/* Work around weird code-gen bug that causes assert to trip */
-# if KMP_ARCH_X86_64 && KMP_OS_LINUX
- KMP_ASSERT( arg != 0 );
-# else
- KMP_ASSERT( arg >= 0 );
-# endif
-}
-#endif /* KMP_DEBUG */
-
-static void
-__kmp_static_yield( int arg )
-{
- __kmp_yield( arg );
-}
-
-/*
- * Spin wait loop that first does pause, then yield, then sleep.
- * Wait until spinner is equal to checker to exit.
- *
- * A thread that calls __kmp_wait_sleep must make certain that another thread
- * calls __kmp_release to wake it back up up to prevent deadlocks!
- */
-
-void
-__kmp_wait_sleep( kmp_info_t *this_thr,
- volatile kmp_uint *spinner,
- kmp_uint checker,
- int final_spin
- USE_ITT_BUILD_ARG (void * itt_sync_obj)
-)
-{
- /* note: we may not belong to a team at this point */
- register volatile kmp_uint *spin = spinner;
- register kmp_uint check = checker;
- register kmp_uint32 spins;
- register kmp_uint32 hibernate;
- int th_gtid, th_tid;
-#if OMP_30_ENABLED
- int flag = FALSE;
-#endif /* OMP_30_ENABLED */
-
- KMP_FSYNC_SPIN_INIT( spin, NULL );
- if( TCR_4(*spin) == check ) {
- KMP_FSYNC_SPIN_ACQUIRED( spin );
- return;
- }
-
- th_gtid = this_thr->th.th_info.ds.ds_gtid;
-
- KA_TRACE( 20, ("__kmp_wait_sleep: T#%d waiting for spin(%p) == %d\n",
- th_gtid,
- spin, check ) );
-
- /* setup for waiting */
- KMP_INIT_YIELD( spins );
-
- if ( __kmp_dflt_blocktime != KMP_MAX_BLOCKTIME ) {
- //
- // The worker threads cannot rely on the team struct existing at this
- // point. Use the bt values cached in the thread struct instead.
- //
- #ifdef KMP_ADJUST_BLOCKTIME
- if ( __kmp_zero_bt && ! this_thr->th.th_team_bt_set ) {
- /* force immediate suspend if not set by user and more threads than available procs */
- hibernate = 0;
- } else {
- hibernate = this_thr->th.th_team_bt_intervals;
- }
- #else
- hibernate = this_thr->th.th_team_bt_intervals;
- #endif /* KMP_ADJUST_BLOCKTIME */
-
- //
- // If the blocktime is nonzero, we want to make sure that we spin
- // wait for the entirety of the specified #intervals, plus up to
- // one interval more. This increment make certain that this thread
- // doesn't go to sleep too soon.
- //
- if ( hibernate != 0 ) {
- hibernate++;
- }
-
- //
- // Add in the current time value.
- //
- hibernate += TCR_4( __kmp_global.g.g_time.dt.t_value );
-
- KF_TRACE( 20, ("__kmp_wait_sleep: T#%d now=%d, hibernate=%d, intervals=%d\n",
- th_gtid, __kmp_global.g.g_time.dt.t_value, hibernate,
- hibernate - __kmp_global.g.g_time.dt.t_value ));
- }
-
- KMP_MB();
-
- /* main wait spin loop */
- while( TCR_4(*spin) != check ) {
- int in_pool;
-
-#if OMP_30_ENABLED
- //
- // If the task team is NULL, it means one of things:
- // 1) A newly-created thread is first being released by
- // __kmp_fork_barrier(), and its task team has not been set up
- // yet.
- // 2) All tasks have been executed to completion, this thread has
- // decremented the task team's ref ct and possibly deallocated
- // it, and should no longer reference it.
- // 3) Tasking is off for this region. This could be because we
- // are in a serialized region (perhaps the outer one), or else
- // tasking was manually disabled (KMP_TASKING=0).
- //
- kmp_task_team_t * task_team = NULL;
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- task_team = this_thr->th.th_task_team;
- if ( task_team != NULL ) {
- if ( ! TCR_SYNC_4( task_team->tt.tt_active ) ) {
- KMP_DEBUG_ASSERT( ! KMP_MASTER_TID( this_thr->th.th_info.ds.ds_tid ) );
- __kmp_unref_task_team( task_team, this_thr );
- } else if ( KMP_TASKING_ENABLED( task_team, this_thr->th.th_task_state ) ) {
- __kmp_execute_tasks( this_thr, th_gtid, spin, check, final_spin, &flag
- USE_ITT_BUILD_ARG( itt_sync_obj ), 0);
- }
- }; // if
- }; // if
-#endif /* OMP_30_ENABLED */
-
- KMP_FSYNC_SPIN_PREPARE( spin );
- if( TCR_4(__kmp_global.g.g_done) ) {
- if( __kmp_global.g.g_abort )
- __kmp_abort_thread( );
- break;
- }
-
- __kmp_static_delay( 1 );
-
- /* if we are oversubscribed,
- or have waited a bit (and KMP_LIBRARY=throughput), then yield */
- KMP_YIELD( TCR_4(__kmp_nth) > __kmp_avail_proc );
- // TODO: Should it be number of cores instead of thread contexts? Like:
- // KMP_YIELD( TCR_4(__kmp_nth) > __kmp_ncores );
- // Need performance improvement data to make the change...
- KMP_YIELD_SPIN( spins );
-
- //
- // Check if this thread was transferred from a team
- // to the thread pool (or vice-versa) while spinning.
- //
- in_pool = !!TCR_4(this_thr->th.th_in_pool);
- if ( in_pool != !!this_thr->th.th_active_in_pool ) {
- if ( in_pool ) {
- //
- // recently transferred from team to pool
- //
- KMP_TEST_THEN_INC32(
- (kmp_int32 *) &__kmp_thread_pool_active_nth );
- this_thr->th.th_active_in_pool = TRUE;
-
- //
- // Here, we cannot assert that
- //
- // KMP_DEBUG_ASSERT( TCR_4(__kmp_thread_pool_active_nth)
- // <= __kmp_thread_pool_nth );
- //
- // __kmp_thread_pool_nth is inc/dec'd by the master thread
- // while the fork/join lock is held, whereas
- // __kmp_thread_pool_active_nth is inc/dec'd asynchronously
- // by the workers. The two can get out of sync for brief
- // periods of time.
- //
- }
- else {
- //
- // recently transferred from pool to team
- //
- KMP_TEST_THEN_DEC32(
- (kmp_int32 *) &__kmp_thread_pool_active_nth );
- KMP_DEBUG_ASSERT( TCR_4(__kmp_thread_pool_active_nth) >= 0 );
- this_thr->th.th_active_in_pool = FALSE;
- }
- }
-
-#if OMP_30_ENABLED
- // Don't suspend if there is a likelihood of new tasks being spawned.
- if ( ( task_team != NULL ) && TCR_4(task_team->tt.tt_found_tasks) ) {
- continue;
- }
-#endif /* OMP_30_ENABLED */
-
- /* Don't suspend if KMP_BLOCKTIME is set to "infinite" */
- if ( __kmp_dflt_blocktime == KMP_MAX_BLOCKTIME ) {
- continue;
- }
-
- /* if we have waited a bit more, fall asleep */
- if ( TCR_4( __kmp_global.g.g_time.dt.t_value ) < hibernate ) {
- continue;
- }
-
- KF_TRACE( 50, ("__kmp_wait_sleep: T#%d suspend time reached\n", th_gtid ) );
-
- __kmp_suspend( th_gtid, spin, check );
-
- if( TCR_4( __kmp_global.g.g_done ) && __kmp_global.g.g_abort ) {
- __kmp_abort_thread( );
- }
-
- /* TODO */
- /* if thread is done with work and timesout, disband/free */
- }
-
- KMP_FSYNC_SPIN_ACQUIRED( spin );
-}
-
-
-/*
- * Release the thread specified by target_thr from waiting by setting the location
- * specified by spin and resume the thread if indicated by the sleep parameter.
- *
- * A thread that calls __kmp_wait_sleep must call this function to wake up the
- * potentially sleeping thread and prevent deadlocks!
- */
-
-void
-__kmp_release( kmp_info_t *target_thr, volatile kmp_uint *spin,
- enum kmp_mem_fence_type fetchadd_fence )
-{
- kmp_uint old_spin;
- #ifdef KMP_DEBUG
- int target_gtid = target_thr->th.th_info.ds.ds_gtid;
- int gtid = TCR_4(__kmp_init_gtid) ? __kmp_get_gtid() : -1;
- #endif
-
- KF_TRACE( 20, ( "__kmp_release: T#%d releasing T#%d spin(%p) fence_type(%d)\n",
- gtid, target_gtid, spin, fetchadd_fence ));
-
- KMP_DEBUG_ASSERT( spin );
-
- KMP_DEBUG_ASSERT( fetchadd_fence == kmp_acquire_fence ||
- fetchadd_fence == kmp_release_fence );
-
- KMP_FSYNC_RELEASING( spin );
-
- old_spin = ( fetchadd_fence == kmp_acquire_fence )
- ? KMP_TEST_THEN_ADD4_ACQ32( (volatile kmp_int32 *) spin )
- : KMP_TEST_THEN_ADD4_32( (volatile kmp_int32 *) spin );
-
- KF_TRACE( 100, ( "__kmp_release: T#%d old spin(%p)=%d, set new spin=%d\n",
- gtid, spin, old_spin, *spin ) );
-
- if ( __kmp_dflt_blocktime != KMP_MAX_BLOCKTIME ) {
- /* Only need to check sleep stuff if infinite block time not set */
- if ( old_spin & KMP_BARRIER_SLEEP_STATE ) {
- #ifndef KMP_DEBUG
- int target_gtid = target_thr->th.th_info.ds.ds_gtid;
- #endif
- /* wake up thread if needed */
- KF_TRACE( 50, ( "__kmp_release: T#%d waking up thread T#%d since sleep spin(%p) set\n",
- gtid, target_gtid, spin ));
- __kmp_resume( target_gtid, spin );
- } else {
- KF_TRACE( 50, ( "__kmp_release: T#%d don't wake up thread T#%d since sleep spin(%p) not set\n",
- gtid, target_gtid, spin ));
- }
- }
-}
-
/* ------------------------------------------------------------------------ */
void
@@ -848,13 +533,11 @@ __kmp_print_team_storage_map( const char *header, kmp_team_t *team, int team_id,
__kmp_print_storage_map_gtid( -1, &team->t.t_set_bt_set[0], &team->t.t_set_bt_set[num_thr],
sizeof(int) * num_thr, "%s_%d.t_set_nested", header, team_id );
-#if OMP_30_ENABLED
//__kmp_print_storage_map_gtid( -1, &team->t.t_set_max_active_levels[0], &team->t.t_set_max_active_levels[num_thr],
// sizeof(int) * num_thr, "%s_%d.t_set_max_active_levels", header, team_id );
__kmp_print_storage_map_gtid( -1, &team->t.t_set_sched[0], &team->t.t_set_sched[num_thr],
sizeof(kmp_r_sched_t) * num_thr, "%s_%d.t_set_sched", header, team_id );
-#endif // OMP_30_ENABLED
#if OMP_40_ENABLED
__kmp_print_storage_map_gtid( -1, &team->t.t_set_proc_bind[0], &team->t.t_set_proc_bind[num_thr],
sizeof(kmp_proc_bind_t) * num_thr, "%s_%d.t_set_proc_bind", header, team_id );
@@ -953,7 +636,7 @@ DllMain( HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpReserved ) {
// the problem of unreleased forkjoin lock as described below.
// A worker thread can take the forkjoin lock
- // in __kmp_suspend()->__kmp_rml_decrease_load_before_sleep().
+ // in __kmp_suspend_template()->__kmp_rml_decrease_load_before_sleep().
// The problem comes up if that worker thread becomes dead
// before it releases the forkjoin lock.
// The forkjoin lock remains taken, while the thread
@@ -1034,15 +717,15 @@ __kmp_parallel_deo( int *gtid_ref, int *cid_ref, ident_t *loc_ref )
#endif /* BUILD_PARALLEL_ORDERED */
if( __kmp_env_consistency_check ) {
- if( __kmp_threads[gtid] -> th.th_root -> r.r_active )
+ if( __kmp_threads[gtid]->th.th_root->r.r_active )
__kmp_push_sync( gtid, ct_ordered_in_parallel, loc_ref, NULL );
}
#ifdef BUILD_PARALLEL_ORDERED
- if( !team -> t.t_serialized ) {
+ if( !team->t.t_serialized ) {
kmp_uint32 spins;
KMP_MB();
- KMP_WAIT_YIELD(&team -> t.t_ordered.dt.t_value, __kmp_tid_from_gtid( gtid ), KMP_EQ, NULL);
+ KMP_WAIT_YIELD(&team->t.t_ordered.dt.t_value, __kmp_tid_from_gtid( gtid ), KMP_EQ, NULL);
KMP_MB();
}
#endif /* BUILD_PARALLEL_ORDERED */
@@ -1062,16 +745,16 @@ __kmp_parallel_dxo( int *gtid_ref, int *cid_ref, ident_t *loc_ref )
#endif /* BUILD_PARALLEL_ORDERED */
if( __kmp_env_consistency_check ) {
- if( __kmp_threads[gtid] -> th.th_root -> r.r_active )
+ if( __kmp_threads[gtid]->th.th_root->r.r_active )
__kmp_pop_sync( gtid, ct_ordered_in_parallel, loc_ref );
}
#ifdef BUILD_PARALLEL_ORDERED
- if ( ! team -> t.t_serialized ) {
+ if ( ! team->t.t_serialized ) {
KMP_MB(); /* Flush all pending memory write invalidates. */
/* use the tid of the next thread in this team */
/* TODO repleace with general release procedure */
- team -> t.t_ordered.dt.t_value = ((tid + 1) % team->t.t_nproc );
+ team->t.t_ordered.dt.t_value = ((tid + 1) % team->t.t_nproc );
KMP_MB(); /* Flush all pending memory write invalidates. */
}
@@ -1097,12 +780,12 @@ __kmp_enter_single( int gtid, ident_t *id_ref, int push_ws )
__kmp_parallel_initialize();
th = __kmp_threads[ gtid ];
- team = th -> th.th_team;
+ team = th->th.th_team;
status = 0;
th->th.th_ident = id_ref;
- if ( team -> t.t_serialized ) {
+ if ( team->t.t_serialized ) {
status = 1;
} else {
kmp_int32 old_this = th->th.th_local.this_construct;
@@ -1112,7 +795,7 @@ __kmp_enter_single( int gtid, ident_t *id_ref, int push_ws )
single block
*/
/* TODO: Should this be acquire or release? */
- status = KMP_COMPARE_AND_STORE_ACQ32(&team -> t.t_construct, old_this,
+ status = KMP_COMPARE_AND_STORE_ACQ32(&team->t.t_construct, old_this,
th->th.th_local.this_construct);
}
@@ -1127,6 +810,10 @@ __kmp_enter_single( int gtid, ident_t *id_ref, int push_ws )
if ( status ) {
__kmp_itt_single_start( gtid );
}
+ if( __itt_metadata_add_ptr && __kmp_forkjoin_frames_mode == 3 ) {
+ __kmp_itt_metadata_single();
+ }
+
#endif /* USE_ITT_BUILD */
return status;
}
@@ -1142,987 +829,6 @@ __kmp_exit_single( int gtid )
}
-/* ------------------------------------------------------------------------ */
-/* ------------------------------------------------------------------------ */
-
-static void
-__kmp_linear_barrier_gather( enum barrier_type bt,
- kmp_info_t *this_thr,
- int gtid,
- int tid,
- void (*reduce)(void *, void *)
- USE_ITT_BUILD_ARG(void * itt_sync_obj)
- )
-{
- register kmp_team_t *team = this_thr -> th.th_team;
- register kmp_bstate_t *thr_bar = & this_thr -> th.th_bar[ bt ].bb;
- register kmp_info_t **other_threads = team -> t.t_threads;
-
- KA_TRACE( 20, ("__kmp_linear_barrier_gather: T#%d(%d:%d) enter for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-
- KMP_DEBUG_ASSERT( this_thr == other_threads[this_thr->th.th_info.ds.ds_tid] );
-
- /*
- * We now perform a linear reduction to signal that all
- * of the threads have arrived.
- *
- * Collect all the worker team member threads.
- */
- if ( ! KMP_MASTER_TID( tid )) {
-
- KA_TRACE( 20, ( "__kmp_linear_barrier_gather: T#%d(%d:%d) releasing T#%d(%d:%d)"
- "arrived(%p): %u => %u\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( 0, team ), team->t.t_id, 0,
- &thr_bar -> b_arrived, thr_bar -> b_arrived,
- thr_bar -> b_arrived + KMP_BARRIER_STATE_BUMP
- ) );
-
- /* mark arrival to master thread */
- //
- // After performing this write, a worker thread may not assume that
- // the team is valid any more - it could be deallocated by the master
- // thread at any time.
- //
- __kmp_release( other_threads[0], &thr_bar -> b_arrived, kmp_release_fence );
-
- } else {
- register kmp_balign_team_t *team_bar = & team -> t.t_bar[ bt ];
- register int nproc = this_thr -> th.th_team_nproc;
- register int i;
- /* Don't have to worry about sleep bit here or atomic since team setting */
- register kmp_uint new_state = team_bar -> b_arrived + KMP_BARRIER_STATE_BUMP;
-
- /* Collect all the worker team member threads. */
- for (i = 1; i < nproc; i++) {
-#if KMP_CACHE_MANAGE
- /* prefetch next thread's arrived count */
- if ( i+1 < nproc )
- KMP_CACHE_PREFETCH( &other_threads[ i+1 ] -> th.th_bar[ bt ].bb.b_arrived );
-#endif /* KMP_CACHE_MANAGE */
- KA_TRACE( 20, ( "__kmp_linear_barrier_gather: T#%d(%d:%d) wait T#%d(%d:%d) "
- "arrived(%p) == %u\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( i, team ), team->t.t_id, i,
- &other_threads[i] -> th.th_bar[ bt ].bb.b_arrived,
- new_state ) );
-
- /* wait for worker thread to arrive */
- __kmp_wait_sleep( this_thr,
- & other_threads[ i ] -> th.th_bar[ bt ].bb.b_arrived,
- new_state, FALSE
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
-
- if (reduce) {
-
- KA_TRACE( 100, ( "__kmp_linear_barrier_gather: T#%d(%d:%d) += T#%d(%d:%d)\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( i, team ), team->t.t_id, i ) );
-
- (*reduce)( this_thr -> th.th_local.reduce_data,
- other_threads[ i ] -> th.th_local.reduce_data );
-
- }
-
- }
-
- /* Don't have to worry about sleep bit here or atomic since team setting */
- team_bar -> b_arrived = new_state;
- KA_TRACE( 20, ( "__kmp_linear_barrier_gather: T#%d(%d:%d) set team %d "
- "arrived(%p) = %u\n",
- gtid, team->t.t_id, tid, team->t.t_id,
- &team_bar -> b_arrived, new_state ) );
- }
-
- KA_TRACE( 20, ( "__kmp_linear_barrier_gather: T#%d(%d:%d) exit for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-}
-
-
-static void
-__kmp_tree_barrier_gather( enum barrier_type bt,
- kmp_info_t *this_thr,
- int gtid,
- int tid,
- void (*reduce) (void *, void *)
- USE_ITT_BUILD_ARG( void * itt_sync_obj )
- )
-{
- register kmp_team_t *team = this_thr -> th.th_team;
- register kmp_bstate_t *thr_bar = & this_thr -> th.th_bar[ bt ].bb;
- register kmp_info_t **other_threads = team -> t.t_threads;
- register kmp_uint32 nproc = this_thr -> th.th_team_nproc;
- register kmp_uint32 branch_bits = __kmp_barrier_gather_branch_bits[ bt ];
- register kmp_uint32 branch_factor = 1 << branch_bits ;
- register kmp_uint32 child;
- register kmp_uint32 child_tid;
- register kmp_uint new_state;
-
- KA_TRACE( 20, ( "__kmp_tree_barrier_gather: T#%d(%d:%d) enter for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-
- KMP_DEBUG_ASSERT( this_thr == other_threads[this_thr->th.th_info.ds.ds_tid] );
-
- /*
- * We now perform a tree gather to wait until all
- * of the threads have arrived, and reduce any required data
- * as we go.
- */
-
- child_tid = (tid << branch_bits) + 1;
-
- if ( child_tid < nproc ) {
-
- /* parent threads wait for all their children to arrive */
- new_state = team -> t.t_bar[ bt ].b_arrived + KMP_BARRIER_STATE_BUMP;
- child = 1;
-
- do {
- register kmp_info_t *child_thr = other_threads[ child_tid ];
- register kmp_bstate_t *child_bar = & child_thr -> th.th_bar[ bt ].bb;
-#if KMP_CACHE_MANAGE
- /* prefetch next thread's arrived count */
- if ( child+1 <= branch_factor && child_tid+1 < nproc )
- KMP_CACHE_PREFETCH( &other_threads[ child_tid+1 ] -> th.th_bar[ bt ].bb.b_arrived );
-#endif /* KMP_CACHE_MANAGE */
- KA_TRACE( 20, ( "__kmp_tree_barrier_gather: T#%d(%d:%d) wait T#%d(%d:%u) "
- "arrived(%p) == %u\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( child_tid, team ), team->t.t_id, child_tid,
- &child_bar -> b_arrived, new_state ) );
-
- /* wait for child to arrive */
- __kmp_wait_sleep( this_thr, &child_bar -> b_arrived, new_state, FALSE
- USE_ITT_BUILD_ARG( itt_sync_obj)
- );
-
- if (reduce) {
-
- KA_TRACE( 100, ( "__kmp_tree_barrier_gather: T#%d(%d:%d) += T#%d(%d:%u)\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( child_tid, team ), team->t.t_id,
- child_tid ) );
-
- (*reduce)( this_thr -> th.th_local.reduce_data,
- child_thr -> th.th_local.reduce_data );
-
- }
-
- child++;
- child_tid++;
- }
- while ( child <= branch_factor && child_tid < nproc );
- }
-
- if ( !KMP_MASTER_TID(tid) ) {
- /* worker threads */
- register kmp_int32 parent_tid = (tid - 1) >> branch_bits;
-
- KA_TRACE( 20, ( "__kmp_tree_barrier_gather: T#%d(%d:%d) releasing T#%d(%d:%d) "
- "arrived(%p): %u => %u\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( parent_tid, team ), team->t.t_id, parent_tid,
- &thr_bar -> b_arrived, thr_bar -> b_arrived,
- thr_bar -> b_arrived + KMP_BARRIER_STATE_BUMP
- ) );
-
- /* mark arrival to parent thread */
- //
- // After performing this write, a worker thread may not assume that
- // the team is valid any more - it could be deallocated by the master
- // thread at any time.
- //
- __kmp_release( other_threads[parent_tid], &thr_bar -> b_arrived, kmp_release_fence );
-
- } else {
- /* Need to update the team arrived pointer if we are the master thread */
-
- if ( nproc > 1 )
- /* New value was already computed above */
- team -> t.t_bar[ bt ].b_arrived = new_state;
- else
- team -> t.t_bar[ bt ].b_arrived += KMP_BARRIER_STATE_BUMP;
-
- KA_TRACE( 20, ( "__kmp_tree_barrier_gather: T#%d(%d:%d) set team %d arrived(%p) = %u\n",
- gtid, team->t.t_id, tid, team->t.t_id,
- &team->t.t_bar[bt].b_arrived, team->t.t_bar[bt].b_arrived ) );
- }
-
- KA_TRACE( 20, ( "__kmp_tree_barrier_gather: T#%d(%d:%d) exit for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-}
-
-
-static void
-__kmp_hyper_barrier_gather( enum barrier_type bt,
- kmp_info_t *this_thr,
- int gtid,
- int tid,
- void (*reduce) (void *, void *)
- USE_ITT_BUILD_ARG (void * itt_sync_obj)
- )
-{
- register kmp_team_t *team = this_thr -> th.th_team;
- register kmp_bstate_t *thr_bar = & this_thr -> th.th_bar[ bt ].bb;
- register kmp_info_t **other_threads = team -> t.t_threads;
- register kmp_uint new_state = KMP_BARRIER_UNUSED_STATE;
- register kmp_uint32 num_threads = this_thr -> th.th_team_nproc;
- register kmp_uint32 branch_bits = __kmp_barrier_gather_branch_bits[ bt ];
- register kmp_uint32 branch_factor = 1 << branch_bits ;
- register kmp_uint32 offset;
- register kmp_uint32 level;
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_gather: T#%d(%d:%d) enter for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-
- KMP_DEBUG_ASSERT( this_thr == other_threads[this_thr->th.th_info.ds.ds_tid] );
-
-#if USE_ITT_BUILD && USE_ITT_NOTIFY
- // Barrier imbalance - save arrive time to the thread
- if( __kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3 ) {
- this_thr->th.th_bar_arrive_time = __itt_get_timestamp();
- }
-#endif
- /*
- * We now perform a hypercube-embedded tree gather to wait until all
- * of the threads have arrived, and reduce any required data
- * as we go.
- */
-
- for ( level=0, offset =1;
- offset < num_threads;
- level += branch_bits, offset <<= branch_bits )
- {
- register kmp_uint32 child;
- register kmp_uint32 child_tid;
-
- if ( ((tid >> level) & (branch_factor - 1)) != 0 ) {
- register kmp_int32 parent_tid = tid & ~( (1 << (level + branch_bits)) -1 );
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_gather: T#%d(%d:%d) releasing T#%d(%d:%d) "
- "arrived(%p): %u => %u\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( parent_tid, team ), team->t.t_id, parent_tid,
- &thr_bar -> b_arrived, thr_bar -> b_arrived,
- thr_bar -> b_arrived + KMP_BARRIER_STATE_BUMP
- ) );
-
- /* mark arrival to parent thread */
- //
- // After performing this write (in the last iteration of the
- // enclosing for loop), a worker thread may not assume that the
- // team is valid any more - it could be deallocated by the master
- // thread at any time.
- //
- __kmp_release( other_threads[parent_tid], &thr_bar -> b_arrived, kmp_release_fence );
- break;
- }
-
- /* parent threads wait for children to arrive */
-
- if (new_state == KMP_BARRIER_UNUSED_STATE)
- new_state = team -> t.t_bar[ bt ].b_arrived + KMP_BARRIER_STATE_BUMP;
-
- for ( child = 1, child_tid = tid + (1 << level);
- child < branch_factor && child_tid < num_threads;
- child++, child_tid += (1 << level) )
- {
- register kmp_info_t *child_thr = other_threads[ child_tid ];
- register kmp_bstate_t *child_bar = & child_thr -> th.th_bar[ bt ].bb;
-#if KMP_CACHE_MANAGE
- register kmp_uint32 next_child_tid = child_tid + (1 << level);
- /* prefetch next thread's arrived count */
- if ( child+1 < branch_factor && next_child_tid < num_threads )
- KMP_CACHE_PREFETCH( &other_threads[ next_child_tid ] -> th.th_bar[ bt ].bb.b_arrived );
-#endif /* KMP_CACHE_MANAGE */
- KA_TRACE( 20, ( "__kmp_hyper_barrier_gather: T#%d(%d:%d) wait T#%d(%d:%u) "
- "arrived(%p) == %u\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( child_tid, team ), team->t.t_id, child_tid,
- &child_bar -> b_arrived, new_state ) );
-
- /* wait for child to arrive */
- __kmp_wait_sleep( this_thr, &child_bar -> b_arrived, new_state, FALSE
- USE_ITT_BUILD_ARG (itt_sync_obj)
- );
-
-#if USE_ITT_BUILD
- // Barrier imbalance - write min of the thread time and a child time to the thread.
- if( __kmp_forkjoin_frames_mode == 2 || __kmp_forkjoin_frames_mode == 3 ) {
- this_thr->th.th_bar_arrive_time = KMP_MIN( this_thr->th.th_bar_arrive_time, child_thr->th.th_bar_arrive_time );
- }
-#endif
- if (reduce) {
-
- KA_TRACE( 100, ( "__kmp_hyper_barrier_gather: T#%d(%d:%d) += T#%d(%d:%u)\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( child_tid, team ), team->t.t_id,
- child_tid ) );
-
- (*reduce)( this_thr -> th.th_local.reduce_data,
- child_thr -> th.th_local.reduce_data );
-
- }
- }
- }
-
-
- if ( KMP_MASTER_TID(tid) ) {
- /* Need to update the team arrived pointer if we are the master thread */
-
- if (new_state == KMP_BARRIER_UNUSED_STATE)
- team -> t.t_bar[ bt ].b_arrived += KMP_BARRIER_STATE_BUMP;
- else
- team -> t.t_bar[ bt ].b_arrived = new_state;
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_gather: T#%d(%d:%d) set team %d arrived(%p) = %u\n",
- gtid, team->t.t_id, tid, team->t.t_id,
- &team->t.t_bar[bt].b_arrived, team->t.t_bar[bt].b_arrived ) );
- }
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_gather: T#%d(%d:%d) exit for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-
-}
-
-static void
-__kmp_linear_barrier_release( enum barrier_type bt,
- kmp_info_t *this_thr,
- int gtid,
- int tid,
- int propagate_icvs
- USE_ITT_BUILD_ARG(void * itt_sync_obj)
- )
-{
- register kmp_bstate_t *thr_bar = &this_thr -> th.th_bar[ bt ].bb;
- register kmp_team_t *team;
-
- if (KMP_MASTER_TID( tid )) {
- register unsigned int i;
- register kmp_uint32 nproc = this_thr -> th.th_team_nproc;
- register kmp_info_t **other_threads;
-
- team = __kmp_threads[ gtid ]-> th.th_team;
- KMP_DEBUG_ASSERT( team != NULL );
- other_threads = team -> t.t_threads;
-
- KA_TRACE( 20, ( "__kmp_linear_barrier_release: T#%d(%d:%d) master enter for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-
- if (nproc > 1) {
-#if KMP_BARRIER_ICV_PUSH
- if ( propagate_icvs ) {
- load_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs);
- for (i = 1; i < nproc; i++) {
- __kmp_init_implicit_task( team->t.t_ident,
- team->t.t_threads[i], team, i, FALSE );
- store_icvs(&team->t.t_implicit_task_taskdata[i].td_icvs, &team->t.t_implicit_task_taskdata[0].td_icvs);
- }
- sync_icvs();
- }
-#endif // KMP_BARRIER_ICV_PUSH
-
- /* Now, release all of the worker threads */
- for (i = 1; i < nproc; i++) {
-#if KMP_CACHE_MANAGE
- /* prefetch next thread's go flag */
- if( i+1 < nproc )
- KMP_CACHE_PREFETCH( &other_threads[ i+1 ]-> th.th_bar[ bt ].bb.b_go );
-#endif /* KMP_CACHE_MANAGE */
- KA_TRACE( 20, ( "__kmp_linear_barrier_release: T#%d(%d:%d) releasing T#%d(%d:%d) "
- "go(%p): %u => %u\n",
- gtid, team->t.t_id, tid,
- other_threads[i]->th.th_info.ds.ds_gtid, team->t.t_id, i,
- &other_threads[i]->th.th_bar[bt].bb.b_go,
- other_threads[i]->th.th_bar[bt].bb.b_go,
- other_threads[i]->th.th_bar[bt].bb.b_go + KMP_BARRIER_STATE_BUMP
- ) );
-
- __kmp_release( other_threads[ i ],
- &other_threads[ i ]-> th.th_bar[ bt ].bb.b_go, kmp_acquire_fence );
- }
- }
- } else {
- /* Wait for the MASTER thread to release us */
-
- KA_TRACE( 20, ( "__kmp_linear_barrier_release: T#%d wait go(%p) == %u\n",
- gtid, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP ) );
-
- __kmp_wait_sleep( this_thr, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP, TRUE
- USE_ITT_BUILD_ARG(itt_sync_obj)
- );
-
-#if USE_ITT_BUILD && OMP_30_ENABLED && USE_ITT_NOTIFY
- if ( ( __itt_sync_create_ptr && itt_sync_obj == NULL ) || KMP_ITT_DEBUG ) {
- // we are on a fork barrier where we could not get the object reliably (or ITTNOTIFY is disabled)
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier, 0, -1 );
- // cancel wait on previous parallel region...
- __kmp_itt_task_starting( itt_sync_obj );
-
- if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) )
- return;
-
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier );
- if ( itt_sync_obj != NULL )
- __kmp_itt_task_finished( itt_sync_obj ); // call prepare as early as possible for "new" barrier
-
- } else
-#endif /* USE_ITT_BUILD && OMP_30_ENABLED && USE_ITT_NOTIFY */
- //
- // early exit for reaping threads releasing forkjoin barrier
- //
- if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) )
- return;
-
- //
- // The worker thread may now assume that the team is valid.
- //
-#if USE_ITT_BUILD && !OMP_30_ENABLED && USE_ITT_NOTIFY
- // libguide only code (cannot use *itt_task* routines)
- if ( ( __itt_sync_create_ptr && itt_sync_obj == NULL ) || KMP_ITT_DEBUG ) {
- // we are on a fork barrier where we could not get the object reliably
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier );
- __kmp_itt_barrier_starting( gtid, itt_sync_obj ); // no need to call releasing, but we have paired calls...
- }
-#endif /* USE_ITT_BUILD && !OMP_30_ENABLED && USE_ITT_NOTIFY */
- #ifdef KMP_DEBUG
- tid = __kmp_tid_from_gtid( gtid );
- team = __kmp_threads[ gtid ]-> th.th_team;
- #endif
- KMP_DEBUG_ASSERT( team != NULL );
-
- TCW_4(thr_bar->b_go, KMP_INIT_BARRIER_STATE);
- KA_TRACE( 20, ("__kmp_linear_barrier_release: T#%d(%d:%d) set go(%p) = %u\n",
- gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE ) );
-
- KMP_MB(); /* Flush all pending memory write invalidates. */
- }
-
- KA_TRACE( 20, ( "__kmp_linear_barrier_release: T#%d(%d:%d) exit for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-}
-
-
-static void
-__kmp_tree_barrier_release( enum barrier_type bt,
- kmp_info_t *this_thr,
- int gtid,
- int tid,
- int propagate_icvs
- USE_ITT_BUILD_ARG(void * itt_sync_obj)
- )
-{
- /* handle fork barrier workers who aren't part of a team yet */
- register kmp_team_t *team;
- register kmp_bstate_t *thr_bar = & this_thr -> th.th_bar[ bt ].bb;
- register kmp_uint32 nproc;
- register kmp_uint32 branch_bits = __kmp_barrier_release_branch_bits[ bt ];
- register kmp_uint32 branch_factor = 1 << branch_bits ;
- register kmp_uint32 child;
- register kmp_uint32 child_tid;
-
- /*
- * We now perform a tree release for all
- * of the threads that have been gathered
- */
-
- if ( ! KMP_MASTER_TID( tid )) {
- /* worker threads */
-
- KA_TRACE( 20, ( "__kmp_tree_barrier_release: T#%d wait go(%p) == %u\n",
- gtid, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP ) );
-
- /* wait for parent thread to release us */
- __kmp_wait_sleep( this_thr, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP, TRUE
- USE_ITT_BUILD_ARG(itt_sync_obj)
- );
-
-#if USE_ITT_BUILD && OMP_30_ENABLED && USE_ITT_NOTIFY
- if ( ( __itt_sync_create_ptr && itt_sync_obj == NULL ) || KMP_ITT_DEBUG ) {
- // we are on a fork barrier where we could not get the object reliably (or ITTNOTIFY is disabled)
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier, 0, -1 );
- // cancel wait on previous parallel region...
- __kmp_itt_task_starting( itt_sync_obj );
-
- if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) )
- return;
-
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier );
- if ( itt_sync_obj != NULL )
- __kmp_itt_task_finished( itt_sync_obj ); // call prepare as early as possible for "new" barrier
-
- } else
-#endif /* USE_ITT_BUILD && OMP_30_ENABLED && USE_ITT_NOTIFY */
- //
- // early exit for reaping threads releasing forkjoin barrier
- //
- if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) )
- return;
-
- //
- // The worker thread may now assume that the team is valid.
- //
-#if USE_ITT_BUILD && !OMP_30_ENABLED && USE_ITT_NOTIFY
- // libguide only code (cannot use *itt_task* routines)
- if ( ( __itt_sync_create_ptr && itt_sync_obj == NULL ) || KMP_ITT_DEBUG ) {
- // we are on a fork barrier where we could not get the object reliably
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier );
- __kmp_itt_barrier_starting( gtid, itt_sync_obj ); // no need to call releasing, but we have paired calls...
- }
-#endif /* USE_ITT_BUILD && !OMP_30_ENABLED && USE_ITT_NOTIFY */
- team = __kmp_threads[ gtid ]-> th.th_team;
- KMP_DEBUG_ASSERT( team != NULL );
- tid = __kmp_tid_from_gtid( gtid );
-
- TCW_4(thr_bar->b_go, KMP_INIT_BARRIER_STATE);
- KA_TRACE( 20, ( "__kmp_tree_barrier_release: T#%d(%d:%d) set go(%p) = %u\n",
- gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE ) );
-
- KMP_MB(); /* Flush all pending memory write invalidates. */
-
- } else {
- team = __kmp_threads[ gtid ]-> th.th_team;
- KMP_DEBUG_ASSERT( team != NULL );
-
- KA_TRACE( 20, ( "__kmp_tree_barrier_release: T#%d(%d:%d) master enter for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
- }
-
- nproc = this_thr -> th.th_team_nproc;
- child_tid = ( tid << branch_bits ) + 1;
-
- if ( child_tid < nproc ) {
- register kmp_info_t **other_threads = team -> t.t_threads;
- child = 1;
- /* parent threads release all their children */
-
- do {
- register kmp_info_t *child_thr = other_threads[ child_tid ];
- register kmp_bstate_t *child_bar = & child_thr -> th.th_bar[ bt ].bb;
-#if KMP_CACHE_MANAGE
- /* prefetch next thread's go count */
- if ( child+1 <= branch_factor && child_tid+1 < nproc )
- KMP_CACHE_PREFETCH( &other_threads[ child_tid+1 ] -> th.th_bar[ bt ].bb.b_go );
-#endif /* KMP_CACHE_MANAGE */
-
-#if KMP_BARRIER_ICV_PUSH
- if ( propagate_icvs ) {
- __kmp_init_implicit_task( team->t.t_ident,
- team->t.t_threads[child_tid], team, child_tid, FALSE );
- load_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs);
- store_icvs(&team->t.t_implicit_task_taskdata[child_tid].td_icvs, &team->t.t_implicit_task_taskdata[0].td_icvs);
- sync_icvs();
- }
-#endif // KMP_BARRIER_ICV_PUSH
-
- KA_TRACE( 20, ( "__kmp_tree_barrier_release: T#%d(%d:%d) releasing T#%d(%d:%u)"
- "go(%p): %u => %u\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( child_tid, team ), team->t.t_id,
- child_tid, &child_bar -> b_go, child_bar -> b_go,
- child_bar -> b_go + KMP_BARRIER_STATE_BUMP ) );
-
- /* release child from barrier */
- __kmp_release( child_thr, &child_bar -> b_go, kmp_acquire_fence );
-
- child++;
- child_tid++;
- }
- while ( child <= branch_factor && child_tid < nproc );
- }
-
- KA_TRACE( 20, ( "__kmp_tree_barrier_release: T#%d(%d:%d) exit for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-}
-
-/* The reverse versions seem to beat the forward versions overall */
-#define KMP_REVERSE_HYPER_BAR
-static void
-__kmp_hyper_barrier_release( enum barrier_type bt,
- kmp_info_t *this_thr,
- int gtid,
- int tid,
- int propagate_icvs
- USE_ITT_BUILD_ARG(void * itt_sync_obj)
- )
-{
- /* handle fork barrier workers who aren't part of a team yet */
- register kmp_team_t *team;
- register kmp_bstate_t *thr_bar = & this_thr -> th.th_bar[ bt ].bb;
- register kmp_info_t **other_threads;
- register kmp_uint32 num_threads;
- register kmp_uint32 branch_bits = __kmp_barrier_release_branch_bits[ bt ];
- register kmp_uint32 branch_factor = 1 << branch_bits;
- register kmp_uint32 child;
- register kmp_uint32 child_tid;
- register kmp_uint32 offset;
- register kmp_uint32 level;
-
- /* Perform a hypercube-embedded tree release for all of the threads
- that have been gathered. If KMP_REVERSE_HYPER_BAR is defined (default)
- the threads are released in the reverse order of the corresponding gather,
- otherwise threads are released in the same order. */
-
- if ( ! KMP_MASTER_TID( tid )) {
- /* worker threads */
- KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d wait go(%p) == %u\n",
- gtid, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP ) );
-
- /* wait for parent thread to release us */
- __kmp_wait_sleep( this_thr, &thr_bar -> b_go, KMP_BARRIER_STATE_BUMP, TRUE
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
-
-#if USE_ITT_BUILD && OMP_30_ENABLED && USE_ITT_NOTIFY
- if ( ( __itt_sync_create_ptr && itt_sync_obj == NULL ) || KMP_ITT_DEBUG ) {
- // we are on a fork barrier where we could not get the object reliably
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier, 0, -1 );
- // cancel wait on previous parallel region...
- __kmp_itt_task_starting( itt_sync_obj );
-
- if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) )
- return;
-
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier );
- if ( itt_sync_obj != NULL )
- __kmp_itt_task_finished( itt_sync_obj ); // call prepare as early as possible for "new" barrier
-
- } else
-#endif /* USE_ITT_BUILD && OMP_30_ENABLED && USE_ITT_NOTIFY */
- //
- // early exit for reaping threads releasing forkjoin barrier
- //
- if ( bt == bs_forkjoin_barrier && TCR_4(__kmp_global.g.g_done) )
- return;
-
- //
- // The worker thread may now assume that the team is valid.
- //
-#if USE_ITT_BUILD && !OMP_30_ENABLED && USE_ITT_NOTIFY
- // libguide only code (cannot use *itt_task* routines)
- if ( ( __itt_sync_create_ptr && itt_sync_obj == NULL ) || KMP_ITT_DEBUG ) {
- // we are on a fork barrier where we could not get the object reliably
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier );
- __kmp_itt_barrier_starting( gtid, itt_sync_obj ); // no need to call releasing, but we have paired calls...
- }
-#endif /* USE_ITT_BUILD && !OMP_30_ENABLED && USE_ITT_NOTIFY */
- team = __kmp_threads[ gtid ]-> th.th_team;
- KMP_DEBUG_ASSERT( team != NULL );
- tid = __kmp_tid_from_gtid( gtid );
-
- TCW_4(thr_bar->b_go, KMP_INIT_BARRIER_STATE);
- KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) set go(%p) = %u\n",
- gtid, team->t.t_id, tid, &thr_bar->b_go, KMP_INIT_BARRIER_STATE ) );
-
- KMP_MB(); /* Flush all pending memory write invalidates. */
-
- } else { /* KMP_MASTER_TID(tid) */
- team = __kmp_threads[ gtid ]-> th.th_team;
- KMP_DEBUG_ASSERT( team != NULL );
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) master enter for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
- }
-
- num_threads = this_thr -> th.th_team_nproc;
- other_threads = team -> t.t_threads;
-
-#ifdef KMP_REVERSE_HYPER_BAR
- /* count up to correct level for parent */
- for ( level = 0, offset = 1;
- offset < num_threads && (((tid >> level) & (branch_factor-1)) == 0);
- level += branch_bits, offset <<= branch_bits );
-
- /* now go down from there */
- for ( level -= branch_bits, offset >>= branch_bits;
- offset != 0;
- level -= branch_bits, offset >>= branch_bits )
-#else
- /* Go down the tree, level by level */
- for ( level = 0, offset = 1;
- offset < num_threads;
- level += branch_bits, offset <<= branch_bits )
-#endif // KMP_REVERSE_HYPER_BAR
- {
-#ifdef KMP_REVERSE_HYPER_BAR
- /* Now go in reverse order through the children, highest to lowest.
- Initial setting of child is conservative here. */
- child = num_threads >> ((level==0)?level:level-1);
- for ( child = (child < branch_factor-1) ? child : branch_factor-1,
- child_tid = tid + (child << level);
- child >= 1;
- child--, child_tid -= (1 << level) )
-#else
- if (((tid >> level) & (branch_factor - 1)) != 0)
- /* No need to go any lower than this, since this is the level
- parent would be notified */
- break;
-
- /* iterate through children on this level of the tree */
- for ( child = 1, child_tid = tid + (1 << level);
- child < branch_factor && child_tid < num_threads;
- child++, child_tid += (1 << level) )
-#endif // KMP_REVERSE_HYPER_BAR
- {
- if ( child_tid >= num_threads ) continue; /* child doesn't exist so keep going */
- else {
- register kmp_info_t *child_thr = other_threads[ child_tid ];
- register kmp_bstate_t *child_bar = & child_thr -> th.th_bar[ bt ].bb;
-#if KMP_CACHE_MANAGE
- register kmp_uint32 next_child_tid = child_tid - (1 << level);
- /* prefetch next thread's go count */
-#ifdef KMP_REVERSE_HYPER_BAR
- if ( child-1 >= 1 && next_child_tid < num_threads )
-#else
- if ( child+1 < branch_factor && next_child_tid < num_threads )
-#endif // KMP_REVERSE_HYPER_BAR
- KMP_CACHE_PREFETCH( &other_threads[ next_child_tid ]->th.th_bar[ bt ].bb.b_go );
-#endif /* KMP_CACHE_MANAGE */
-
-#if KMP_BARRIER_ICV_PUSH
- if ( propagate_icvs ) {
- KMP_DEBUG_ASSERT( team != NULL );
- __kmp_init_implicit_task( team->t.t_ident,
- team->t.t_threads[child_tid], team, child_tid, FALSE );
- load_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs);
- store_icvs(&team->t.t_implicit_task_taskdata[child_tid].td_icvs, &team->t.t_implicit_task_taskdata[0].td_icvs);
- sync_icvs();
- }
-#endif // KMP_BARRIER_ICV_PUSH
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) releasing T#%d(%d:%u)"
- "go(%p): %u => %u\n",
- gtid, team->t.t_id, tid,
- __kmp_gtid_from_tid( child_tid, team ), team->t.t_id,
- child_tid, &child_bar -> b_go, child_bar -> b_go,
- child_bar -> b_go + KMP_BARRIER_STATE_BUMP ) );
-
- /* release child from barrier */
- __kmp_release( child_thr, &child_bar -> b_go, kmp_acquire_fence );
- }
- }
- }
-
- KA_TRACE( 20, ( "__kmp_hyper_barrier_release: T#%d(%d:%d) exit for barrier type %d\n",
- gtid, team->t.t_id, tid, bt ) );
-}
-
-/*
- * Internal function to do a barrier.
- * If is_split is true, do a split barrier, otherwise, do a plain barrier
- * If reduce is non-NULL, do a split reduction barrier, otherwise, do a split barrier
- * Returns 0 if master thread, 1 if worker thread.
- */
-int
-__kmp_barrier( enum barrier_type bt, int gtid, int is_split,
- size_t reduce_size, void *reduce_data, void (*reduce)(void *, void *) )
-{
- register int tid = __kmp_tid_from_gtid( gtid );
- register kmp_info_t *this_thr = __kmp_threads[ gtid ];
- register kmp_team_t *team = this_thr -> th.th_team;
- register int status = 0;
-
- ident_t * tmp_loc = __kmp_threads[ gtid ]->th.th_ident;
-
- KA_TRACE( 15, ( "__kmp_barrier: T#%d(%d:%d) has arrived\n",
- gtid, __kmp_team_from_gtid(gtid)->t.t_id, __kmp_tid_from_gtid(gtid) ) );
-
- if ( ! team->t.t_serialized ) {
-#if USE_ITT_BUILD
- // This value will be used in itt notify events below.
- void * itt_sync_obj = NULL;
- #if USE_ITT_NOTIFY
- if ( __itt_sync_create_ptr || KMP_ITT_DEBUG )
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bt, 1 );
- #endif
-#endif /* USE_ITT_BUILD */
- #if OMP_30_ENABLED
- if ( __kmp_tasking_mode == tskm_extra_barrier ) {
- __kmp_tasking_barrier( team, this_thr, gtid );
- KA_TRACE( 15, ( "__kmp_barrier: T#%d(%d:%d) past tasking barrier\n",
- gtid, __kmp_team_from_gtid(gtid)->t.t_id, __kmp_tid_from_gtid(gtid) ) );
- }
- #endif /* OMP_30_ENABLED */
-
- //
- // Copy the blocktime info to the thread, where __kmp_wait_sleep()
- // can access it when the team struct is not guaranteed to exist.
- //
- // See the note about the corresponding code in __kmp_join_barrier()
- // being performance-critical.
- //
- if ( __kmp_dflt_blocktime != KMP_MAX_BLOCKTIME ) {
- #if OMP_30_ENABLED
- this_thr -> th.th_team_bt_intervals = team -> t.t_implicit_task_taskdata[tid].td_icvs.bt_intervals;
- this_thr -> th.th_team_bt_set = team -> t.t_implicit_task_taskdata[tid].td_icvs.bt_set;
- #else
- this_thr -> th.th_team_bt_intervals = team -> t.t_set_bt_intervals[tid];
- this_thr -> th.th_team_bt_set= team -> t.t_set_bt_set[tid];
- #endif // OMP_30_ENABLED
- }
-
-#if USE_ITT_BUILD
- if ( __itt_sync_create_ptr || KMP_ITT_DEBUG )
- __kmp_itt_barrier_starting( gtid, itt_sync_obj );
-#endif /* USE_ITT_BUILD */
-
- if ( reduce != NULL ) {
- //KMP_DEBUG_ASSERT( is_split == TRUE ); // #C69956
- this_thr -> th.th_local.reduce_data = reduce_data;
- }
- if ( __kmp_barrier_gather_pattern[ bt ] == bp_linear_bar || __kmp_barrier_gather_branch_bits[ bt ] == 0 ) {
- __kmp_linear_barrier_gather( bt, this_thr, gtid, tid, reduce
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- } else if ( __kmp_barrier_gather_pattern[ bt ] == bp_tree_bar ) {
- __kmp_tree_barrier_gather( bt, this_thr, gtid, tid, reduce
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- } else {
- __kmp_hyper_barrier_gather( bt, this_thr, gtid, tid, reduce
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- }; // if
-
-#if USE_ITT_BUILD
- // TODO: In case of split reduction barrier, master thread may send acquired event early,
- // before the final summation into the shared variable is done (final summation can be a
- // long operation for array reductions).
- if ( __itt_sync_create_ptr || KMP_ITT_DEBUG )
- __kmp_itt_barrier_middle( gtid, itt_sync_obj );
-#endif /* USE_ITT_BUILD */
-
- KMP_MB();
-
- if ( KMP_MASTER_TID( tid ) ) {
- status = 0;
-
- #if OMP_30_ENABLED
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- __kmp_task_team_wait( this_thr, team
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- __kmp_task_team_setup( this_thr, team );
- }
- #endif /* OMP_30_ENABLED */
-
-
-#if USE_ITT_BUILD && USE_ITT_NOTIFY
- // Barrier - report frame end
- if( __itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode ) {
- kmp_uint64 tmp = __itt_get_timestamp();
- switch( __kmp_forkjoin_frames_mode ) {
- case 1:
- __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, tmp_loc );
- this_thr->th.th_frame_time = tmp;
- break;
- case 2:
- __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, tmp_loc );
- break;
- case 3:
- __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, tmp_loc );
- __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, tmp_loc );
- this_thr->th.th_frame_time = tmp;
- break;
- }
- }
-#endif /* USE_ITT_BUILD */
- } else {
- status = 1;
- }
- if ( status == 1 || ! is_split ) {
- if ( __kmp_barrier_release_pattern[ bt ] == bp_linear_bar || __kmp_barrier_release_branch_bits[ bt ] == 0 ) {
- __kmp_linear_barrier_release( bt, this_thr, gtid, tid, FALSE
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- } else if ( __kmp_barrier_release_pattern[ bt ] == bp_tree_bar ) {
- __kmp_tree_barrier_release( bt, this_thr, gtid, tid, FALSE
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- } else {
- __kmp_hyper_barrier_release( bt, this_thr, gtid, tid, FALSE
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- }
- #if OMP_30_ENABLED
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- __kmp_task_team_sync( this_thr, team );
- }
- #endif /* OMP_30_ENABLED */
- }
-
-#if USE_ITT_BUILD
- // GEH: TODO: Move this under if-condition above and also include in __kmp_end_split_barrier().
- // This will more accurately represent the actual release time of the threads for split barriers.
- if ( __itt_sync_create_ptr || KMP_ITT_DEBUG )
- __kmp_itt_barrier_finished( gtid, itt_sync_obj );
-#endif /* USE_ITT_BUILD */
-
- } else { // Team is serialized.
-
- status = 0;
-
- #if OMP_30_ENABLED
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- //
- // The task team should be NULL for serialized code.
- // (tasks will be executed immediately).
- //
- KMP_DEBUG_ASSERT( team->t.t_task_team == NULL );
- KMP_DEBUG_ASSERT( this_thr->th.th_task_team == NULL );
- }
- #endif /* OMP_30_ENABLED */
- }
-
- KA_TRACE( 15, ( "__kmp_barrier: T#%d(%d:%d) is leaving with return value %d\n",
- gtid, __kmp_team_from_gtid(gtid)->t.t_id, __kmp_tid_from_gtid(gtid),
- status ) );
- return status;
-}
-
-
-void
-__kmp_end_split_barrier( enum barrier_type bt, int gtid )
-{
- int tid = __kmp_tid_from_gtid( gtid );
- kmp_info_t *this_thr = __kmp_threads[ gtid ];
- kmp_team_t *team = this_thr -> th.th_team;
-
- if( ! team -> t.t_serialized ) {
- if( KMP_MASTER_GTID( gtid ) ) {
- if ( __kmp_barrier_release_pattern[ bt ] == bp_linear_bar || __kmp_barrier_release_branch_bits[ bt ] == 0 ) {
- __kmp_linear_barrier_release( bt, this_thr, gtid, tid, FALSE
-#if USE_ITT_BUILD
- , NULL
-#endif /* USE_ITT_BUILD */
- );
- } else if ( __kmp_barrier_release_pattern[ bt ] == bp_tree_bar ) {
- __kmp_tree_barrier_release( bt, this_thr, gtid, tid, FALSE
-#if USE_ITT_BUILD
- , NULL
-#endif /* USE_ITT_BUILD */
- );
- } else {
- __kmp_hyper_barrier_release( bt, this_thr, gtid, tid, FALSE
-#if USE_ITT_BUILD
- , NULL
-#endif /* USE_ITT_BUILD */
- );
- }; // if
- #if OMP_30_ENABLED
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- __kmp_task_team_sync( this_thr, team );
- }; // if
- #endif /* OMP_30_ENABLED */
- }
- }
-}
-
-/* ------------------------------------------------------------------------ */
-/* ------------------------------------------------------------------------ */
-
/*
* determine if we can go parallel or must use a serialized parallel region and
* how many threads we can use
@@ -2331,45 +1037,83 @@ __kmp_fork_team_threads( kmp_root_t *root, kmp_team_t *team,
kmp_info_t *master_th, int master_gtid )
{
int i;
+ int use_hot_team;
KA_TRACE( 10, ("__kmp_fork_team_threads: new_nprocs = %d\n", team->t.t_nproc ) );
KMP_DEBUG_ASSERT( master_gtid == __kmp_get_gtid() );
KMP_MB();
/* first, let's setup the master thread */
- master_th -> th.th_info.ds.ds_tid = 0;
- master_th -> th.th_team = team;
- master_th -> th.th_team_nproc = team -> t.t_nproc;
- master_th -> th.th_team_master = master_th;
- master_th -> th.th_team_serialized = FALSE;
- master_th -> th.th_dispatch = & team -> t.t_dispatch[ 0 ];
+ master_th->th.th_info.ds.ds_tid = 0;
+ master_th->th.th_team = team;
+ master_th->th.th_team_nproc = team->t.t_nproc;
+ master_th->th.th_team_master = master_th;
+ master_th->th.th_team_serialized = FALSE;
+ master_th->th.th_dispatch = & team->t.t_dispatch[ 0 ];
/* make sure we are not the optimized hot team */
- if ( team != root->r.r_hot_team ) {
+#if KMP_NESTED_HOT_TEAMS
+ use_hot_team = 0;
+ kmp_hot_team_ptr_t *hot_teams = master_th->th.th_hot_teams;
+ if( hot_teams ) { // hot teams array is not allocated if KMP_HOT_TEAMS_MAX_LEVEL=0
+ int level = team->t.t_active_level - 1; // index in array of hot teams
+ if( master_th->th.th_teams_microtask ) { // are we inside the teams?
+ if( master_th->th.th_teams_size.nteams > 1 ) {
+ ++level; // level was not increased in teams construct for team_of_masters
+ }
+ if( team->t.t_pkfn != (microtask_t)__kmp_teams_master &&
+ master_th->th.th_teams_level == team->t.t_level ) {
+ ++level; // level was not increased in teams construct for team_of_workers before the parallel
+ } // team->t.t_level will be increased inside parallel
+ }
+ if( level < __kmp_hot_teams_max_level ) {
+ if( hot_teams[level].hot_team ) {
+ // hot team has already been allocated for given level
+ KMP_DEBUG_ASSERT(hot_teams[level].hot_team == team);
+ use_hot_team = 1; // the team is ready to use
+ } else {
+ use_hot_team = 0; // AC: threads are not allocated yet
+ hot_teams[level].hot_team = team; // remember new hot team
+ hot_teams[level].hot_team_nth = team->t.t_nproc;
+ }
+ } else {
+ use_hot_team = 0;
+ }
+ }
+#else
+ use_hot_team = team == root->r.r_hot_team;
+#endif
+ if ( !use_hot_team ) {
/* install the master thread */
- team -> t.t_threads[ 0 ] = master_th;
+ team->t.t_threads[ 0 ] = master_th;
__kmp_initialize_info( master_th, team, 0, master_gtid );
/* now, install the worker threads */
for ( i=1 ; i < team->t.t_nproc ; i++ ) {
/* fork or reallocate a new thread and install it in team */
- team -> t.t_threads[ i ] = __kmp_allocate_thread( root, team, i );
- KMP_DEBUG_ASSERT( team->t.t_threads[i] );
- KMP_DEBUG_ASSERT( team->t.t_threads[i]->th.th_team == team );
+ kmp_info_t *thr = __kmp_allocate_thread( root, team, i );
+ team->t.t_threads[ i ] = thr;
+ KMP_DEBUG_ASSERT( thr );
+ KMP_DEBUG_ASSERT( thr->th.th_team == team );
/* align team and thread arrived states */
KA_TRACE( 20, ("__kmp_fork_team_threads: T#%d(%d:%d) init arrived T#%d(%d:%d) join =%u, plain=%u\n",
__kmp_gtid_from_tid( 0, team ), team->t.t_id, 0,
__kmp_gtid_from_tid( i, team ), team->t.t_id, i,
team->t.t_bar[ bs_forkjoin_barrier ].b_arrived,
team->t.t_bar[ bs_plain_barrier ].b_arrived ) );
-
+#if OMP_40_ENABLED
+ thr->th.th_teams_microtask = master_th->th.th_teams_microtask;
+ thr->th.th_teams_level = master_th->th.th_teams_level;
+ thr->th.th_teams_size = master_th->th.th_teams_size;
+#endif
{ // Initialize threads' barrier data.
int b;
kmp_balign_t * balign = team->t.t_threads[ i ]->th.th_bar;
for ( b = 0; b < bs_last_barrier; ++ b ) {
balign[ b ].bb.b_arrived = team->t.t_bar[ b ].b_arrived;
+ KMP_DEBUG_ASSERT(balign[b].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
}; // for b
}
}
@@ -2383,19 +1127,289 @@ __kmp_fork_team_threads( kmp_root_t *root, kmp_team_t *team,
KMP_MB();
}
+#if KMP_ARCH_X86 || KMP_ARCH_X86_64
+//
+// Propagate any changes to the floating point control registers out to the team
+// We try to avoid unnecessary writes to the relevant cache line in the team structure,
+// so we don't make changes unless they are needed.
+//
+inline static void
+propagateFPControl(kmp_team_t * team)
+{
+ if ( __kmp_inherit_fp_control ) {
+ kmp_int16 x87_fpu_control_word;
+ kmp_uint32 mxcsr;
+
+ // Get master values of FPU control flags (both X87 and vector)
+ __kmp_store_x87_fpu_control_word( &x87_fpu_control_word );
+ __kmp_store_mxcsr( &mxcsr );
+ mxcsr &= KMP_X86_MXCSR_MASK;
+
+ // There is no point looking at t_fp_control_saved here.
+ // If it is TRUE, we still have to update the values if they are different from those we now have.
+ // If it is FALSE we didn't save anything yet, but our objective is the same. We have to ensure
+ // that the values in the team are the same as those we have.
+ // So, this code achieves what we need whether or not t_fp_control_saved is true.
+ // By checking whether the value needs updating we avoid unnecessary writes that would put the
+ // cache-line into a written state, causing all threads in the team to have to read it again.
+ if ( team->t.t_x87_fpu_control_word != x87_fpu_control_word ) {
+ team->t.t_x87_fpu_control_word = x87_fpu_control_word;
+ }
+ if ( team->t.t_mxcsr != mxcsr ) {
+ team->t.t_mxcsr = mxcsr;
+ }
+ // Although we don't use this value, other code in the runtime wants to know whether it should restore them.
+ // So we must ensure it is correct.
+ if (!team->t.t_fp_control_saved) {
+ team->t.t_fp_control_saved = TRUE;
+ }
+ }
+ else {
+ // Similarly here. Don't write to this cache-line in the team structure unless we have to.
+ if (team->t.t_fp_control_saved)
+ team->t.t_fp_control_saved = FALSE;
+ }
+}
+
+// Do the opposite, setting the hardware registers to the updated values from the team.
+inline static void
+updateHWFPControl(kmp_team_t * team)
+{
+ if ( __kmp_inherit_fp_control && team->t.t_fp_control_saved ) {
+ //
+ // Only reset the fp control regs if they have been changed in the team.
+ // the parallel region that we are exiting.
+ //
+ kmp_int16 x87_fpu_control_word;
+ kmp_uint32 mxcsr;
+ __kmp_store_x87_fpu_control_word( &x87_fpu_control_word );
+ __kmp_store_mxcsr( &mxcsr );
+ mxcsr &= KMP_X86_MXCSR_MASK;
+
+ if ( team->t.t_x87_fpu_control_word != x87_fpu_control_word ) {
+ __kmp_clear_x87_fpu_status_word();
+ __kmp_load_x87_fpu_control_word( &team->t.t_x87_fpu_control_word );
+ }
+
+ if ( team->t.t_mxcsr != mxcsr ) {
+ __kmp_load_mxcsr( &team->t.t_mxcsr );
+ }
+ }
+}
+#else
+# define propagateFPControl(x) ((void)0)
+# define updateHWFPControl(x) ((void)0)
+#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
+
static void
__kmp_alloc_argv_entries( int argc, kmp_team_t *team, int realloc ); // forward declaration
-static void
-__kmp_setup_icv_copy( kmp_team_t *team, int new_nproc,
-#if OMP_30_ENABLED
- kmp_internal_control_t * new_icvs,
- ident_t * loc
-#else
- int new_set_nproc, int new_set_dynamic, int new_set_nested,
- int new_set_blocktime, int new_bt_intervals, int new_bt_set
-#endif // OMP_30_ENABLED
- ); // forward declaration
+/*
+ * Run a parallel region that has been serialized, so runs only in a team of the single master thread.
+ */
+void
+__kmp_serialized_parallel(ident_t *loc, kmp_int32 global_tid)
+{
+ kmp_info_t *this_thr;
+ kmp_team_t *serial_team;
+
+ KC_TRACE( 10, ("__kmpc_serialized_parallel: called by T#%d\n", global_tid ) );
+
+ /* Skip all this code for autopar serialized loops since it results in
+ unacceptable overhead */
+ if( loc != NULL && (loc->flags & KMP_IDENT_AUTOPAR ) )
+ return;
+
+ if( ! TCR_4( __kmp_init_parallel ) )
+ __kmp_parallel_initialize();
+
+ this_thr = __kmp_threads[ global_tid ];
+ serial_team = this_thr->th.th_serial_team;
+
+ /* utilize the serialized team held by this thread */
+ KMP_DEBUG_ASSERT( serial_team );
+ KMP_MB();
+
+ if ( __kmp_tasking_mode != tskm_immediate_exec ) {
+ KMP_DEBUG_ASSERT( this_thr->th.th_task_team == this_thr->th.th_team->t.t_task_team );
+ KMP_DEBUG_ASSERT( serial_team->t.t_task_team == NULL );
+ KA_TRACE( 20, ( "__kmpc_serialized_parallel: T#%d pushing task_team %p / team %p, new task_team = NULL\n",
+ global_tid, this_thr->th.th_task_team, this_thr->th.th_team ) );
+ this_thr->th.th_task_team = NULL;
+ }
+
+#if OMP_40_ENABLED
+ kmp_proc_bind_t proc_bind = this_thr->th.th_set_proc_bind;
+ if ( this_thr->th.th_current_task->td_icvs.proc_bind == proc_bind_false ) {
+ proc_bind = proc_bind_false;
+ }
+ else if ( proc_bind == proc_bind_default ) {
+ //
+ // No proc_bind clause was specified, so use the current value
+ // of proc-bind-var for this parallel region.
+ //
+ proc_bind = this_thr->th.th_current_task->td_icvs.proc_bind;
+ }
+ //
+ // Reset for next parallel region
+ //
+ this_thr->th.th_set_proc_bind = proc_bind_default;
+#endif /* OMP_40_ENABLED */
+
+ if( this_thr->th.th_team != serial_team ) {
+ // Nested level will be an index in the nested nthreads array
+ int level = this_thr->th.th_team->t.t_level;
+
+ if( serial_team->t.t_serialized ) {
+ /* this serial team was already used
+ * TODO increase performance by making this locks more specific */
+ kmp_team_t *new_team;
+ int tid = this_thr->th.th_info.ds.ds_tid;
+
+ __kmp_acquire_bootstrap_lock( &__kmp_forkjoin_lock );
+
+ new_team = __kmp_allocate_team(this_thr->th.th_root, 1, 1,
+#if OMP_40_ENABLED
+ proc_bind,
+#endif
+ & this_thr->th.th_current_task->td_icvs,
+ 0 USE_NESTED_HOT_ARG(NULL) );
+ __kmp_release_bootstrap_lock( &__kmp_forkjoin_lock );
+ KMP_ASSERT( new_team );
+
+ /* setup new serialized team and install it */
+ new_team->t.t_threads[0] = this_thr;
+ new_team->t.t_parent = this_thr->th.th_team;
+ serial_team = new_team;
+ this_thr->th.th_serial_team = serial_team;
+
+ KF_TRACE( 10, ( "__kmpc_serialized_parallel: T#%d allocated new serial team %p\n",
+ global_tid, serial_team ) );
+
+
+ /* TODO the above breaks the requirement that if we run out of
+ * resources, then we can still guarantee that serialized teams
+ * are ok, since we may need to allocate a new one */
+ } else {
+ KF_TRACE( 10, ( "__kmpc_serialized_parallel: T#%d reusing cached serial team %p\n",
+ global_tid, serial_team ) );
+ }
+
+ /* we have to initialize this serial team */
+ KMP_DEBUG_ASSERT( serial_team->t.t_threads );
+ KMP_DEBUG_ASSERT( serial_team->t.t_threads[0] == this_thr );
+ KMP_DEBUG_ASSERT( this_thr->th.th_team != serial_team );
+ serial_team->t.t_ident = loc;
+ serial_team->t.t_serialized = 1;
+ serial_team->t.t_nproc = 1;
+ serial_team->t.t_parent = this_thr->th.th_team;
+ serial_team->t.t_sched = this_thr->th.th_team->t.t_sched;
+ this_thr->th.th_team = serial_team;
+ serial_team->t.t_master_tid = this_thr->th.th_info.ds.ds_tid;
+
+ KF_TRACE( 10, ( "__kmpc_serialized_parallel: T#d curtask=%p\n",
+ global_tid, this_thr->th.th_current_task ) );
+ KMP_ASSERT( this_thr->th.th_current_task->td_flags.executing == 1 );
+ this_thr->th.th_current_task->td_flags.executing = 0;
+
+ __kmp_push_current_task_to_thread( this_thr, serial_team, 0 );
+
+ /* TODO: GEH: do the ICVs work for nested serialized teams? Don't we need an implicit task for
+ each serialized task represented by team->t.t_serialized? */
+ copy_icvs(
+ & this_thr->th.th_current_task->td_icvs,
+ & this_thr->th.th_current_task->td_parent->td_icvs );
+
+ // Thread value exists in the nested nthreads array for the next nested level
+ if ( __kmp_nested_nth.used && ( level + 1 < __kmp_nested_nth.used ) ) {
+ this_thr->th.th_current_task->td_icvs.nproc = __kmp_nested_nth.nth[ level + 1 ];
+ }
+
+#if OMP_40_ENABLED
+ if ( __kmp_nested_proc_bind.used && ( level + 1 < __kmp_nested_proc_bind.used ) ) {
+ this_thr->th.th_current_task->td_icvs.proc_bind
+ = __kmp_nested_proc_bind.bind_types[ level + 1 ];
+ }
+#endif /* OMP_40_ENABLED */
+
+ this_thr->th.th_info.ds.ds_tid = 0;
+
+ /* set thread cache values */
+ this_thr->th.th_team_nproc = 1;
+ this_thr->th.th_team_master = this_thr;
+ this_thr->th.th_team_serialized = 1;
+
+ serial_team->t.t_level = serial_team->t.t_parent->t.t_level + 1;
+ serial_team->t.t_active_level = serial_team->t.t_parent->t.t_active_level;
+
+ propagateFPControl (serial_team);
+
+ /* check if we need to allocate dispatch buffers stack */
+ KMP_DEBUG_ASSERT(serial_team->t.t_dispatch);
+ if ( !serial_team->t.t_dispatch->th_disp_buffer ) {
+ serial_team->t.t_dispatch->th_disp_buffer = (dispatch_private_info_t *)
+ __kmp_allocate( sizeof( dispatch_private_info_t ) );
+ }
+ this_thr->th.th_dispatch = serial_team->t.t_dispatch;
+
+ KMP_MB();
+
+ } else {
+ /* this serialized team is already being used,
+ * that's fine, just add another nested level */
+ KMP_DEBUG_ASSERT( this_thr->th.th_team == serial_team );
+ KMP_DEBUG_ASSERT( serial_team->t.t_threads );
+ KMP_DEBUG_ASSERT( serial_team->t.t_threads[0] == this_thr );
+ ++ serial_team->t.t_serialized;
+ this_thr->th.th_team_serialized = serial_team->t.t_serialized;
+
+ // Nested level will be an index in the nested nthreads array
+ int level = this_thr->th.th_team->t.t_level;
+ // Thread value exists in the nested nthreads array for the next nested level
+ if ( __kmp_nested_nth.used && ( level + 1 < __kmp_nested_nth.used ) ) {
+ this_thr->th.th_current_task->td_icvs.nproc = __kmp_nested_nth.nth[ level + 1 ];
+ }
+ serial_team->t.t_level++;
+ KF_TRACE( 10, ( "__kmpc_serialized_parallel: T#%d increasing nesting level of serial team %p to %d\n",
+ global_tid, serial_team, serial_team->t.t_level ) );
+
+ /* allocate/push dispatch buffers stack */
+ KMP_DEBUG_ASSERT(serial_team->t.t_dispatch);
+ {
+ dispatch_private_info_t * disp_buffer = (dispatch_private_info_t *)
+ __kmp_allocate( sizeof( dispatch_private_info_t ) );
+ disp_buffer->next = serial_team->t.t_dispatch->th_disp_buffer;
+ serial_team->t.t_dispatch->th_disp_buffer = disp_buffer;
+ }
+ this_thr->th.th_dispatch = serial_team->t.t_dispatch;
+
+ KMP_MB();
+ }
+
+ if ( __kmp_env_consistency_check )
+ __kmp_push_parallel( global_tid, NULL );
+
+#if USE_ITT_BUILD
+ // Mark the start of the "parallel" region for VTune. Only use one of frame notification scheme at the moment
+ if ( ( __itt_frame_begin_v3_ptr && __kmp_forkjoin_frames && ! __kmp_forkjoin_frames_mode ) || KMP_ITT_DEBUG )
+ {
+ this_thr->th.th_ident = loc;
+ // 0 - no barriers; 1 - serialized parallel
+ __kmp_itt_region_forking( global_tid, this_thr->th.th_team_nproc, 0, 1 );
+ }
+ // Save the start of the "parallel" region for VTune. This is the join barrier begin at the same time.
+ if( ( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) &&
+ __itt_frame_submit_v3_ptr && __itt_get_timestamp_ptr ) || KMP_ITT_DEBUG )
+ {
+ this_thr->th.th_ident = loc;
+#if USE_ITT_NOTIFY
+ if( this_thr->th.th_team->t.t_level == 1 ) {
+ serial_team->t.t_region_time = this_thr->th.th_frame_time_serialized = __itt_get_timestamp();
+ }
+#endif
+ }
+#endif /* USE_ITT_BUILD */
+}
/* most of the work for a fork */
/* return true if we really went parallel, false if serialized */
@@ -2403,9 +1417,7 @@ int
__kmp_fork_call(
ident_t * loc,
int gtid,
- int exec_master, // 0 - GNU native code, master doesn't invoke microtask
- // 1 - Intel code, master invokes microtask
- // 2 - MS native code, use special invoker
+ enum fork_context_e call_context, // Intel, GNU, ...
kmp_int32 argc,
microtask_t microtask,
launch_t invoker,
@@ -2421,7 +1433,6 @@ __kmp_fork_call(
int i;
int master_tid;
int master_this_cons;
- int master_last_cons;
kmp_team_t *team;
kmp_team_t *parent_team;
kmp_info_t *master_th;
@@ -2431,38 +1442,59 @@ __kmp_fork_call(
int master_set_numthreads;
int level;
#if OMP_40_ENABLED
+ int active_level;
int teams_level;
#endif
+#if KMP_NESTED_HOT_TEAMS
+ kmp_hot_team_ptr_t **p_hot_teams;
+#endif
+ { // KMP_TIME_BLOCK
+ KMP_TIME_BLOCK(KMP_fork_call);
KA_TRACE( 20, ("__kmp_fork_call: enter T#%d\n", gtid ));
+ if ( __kmp_stkpadding > 0 && __kmp_root[gtid] != NULL ) {
+ /* Some systems prefer the stack for the root thread(s) to start with */
+ /* some gap from the parent stack to prevent false sharing. */
+ void *dummy = alloca(__kmp_stkpadding);
+ /* These 2 lines below are so this does not get optimized out */
+ if ( __kmp_stkpadding > KMP_MAX_STKPADDING )
+ __kmp_stkpadding += (short)((kmp_int64)dummy);
+ }
/* initialize if needed */
- KMP_DEBUG_ASSERT( __kmp_init_serial );
+ KMP_DEBUG_ASSERT( __kmp_init_serial ); // AC: potentially unsafe, not in sync with shutdown
if( ! TCR_4(__kmp_init_parallel) )
__kmp_parallel_initialize();
/* setup current data */
- master_th = __kmp_threads[ gtid ];
- parent_team = master_th -> th.th_team;
- master_tid = master_th -> th.th_info.ds.ds_tid;
- master_this_cons = master_th -> th.th_local.this_construct;
- master_last_cons = master_th -> th.th_local.last_construct;
- root = master_th -> th.th_root;
- master_active = root -> r.r_active;
- master_set_numthreads = master_th -> th.th_set_nproc;
-#if OMP_30_ENABLED
+ master_th = __kmp_threads[ gtid ]; // AC: potentially unsafe, not in sync with shutdown
+ parent_team = master_th->th.th_team;
+ master_tid = master_th->th.th_info.ds.ds_tid;
+ master_this_cons = master_th->th.th_local.this_construct;
+ root = master_th->th.th_root;
+ master_active = root->r.r_active;
+ master_set_numthreads = master_th->th.th_set_nproc;
// Nested level will be an index in the nested nthreads array
level = parent_team->t.t_level;
-#endif // OMP_30_ENABLED
#if OMP_40_ENABLED
+ active_level = parent_team->t.t_active_level; // is used to launch non-serial teams even if nested is not allowed
teams_level = master_th->th.th_teams_level; // needed to check nesting inside the teams
#endif
+#if KMP_NESTED_HOT_TEAMS
+ p_hot_teams = &master_th->th.th_hot_teams;
+ if( *p_hot_teams == NULL && __kmp_hot_teams_max_level > 0 ) {
+ *p_hot_teams = (kmp_hot_team_ptr_t*)__kmp_allocate(
+ sizeof(kmp_hot_team_ptr_t) * __kmp_hot_teams_max_level);
+ (*p_hot_teams)[0].hot_team = root->r.r_hot_team;
+ (*p_hot_teams)[0].hot_team_nth = 1; // it is either actual or not needed (when active_level > 0)
+ }
+#endif
master_th->th.th_ident = loc;
#if OMP_40_ENABLED
- if ( master_th->th.th_team_microtask &&
+ if ( master_th->th.th_teams_microtask &&
ap && microtask != (microtask_t)__kmp_teams_master && level == teams_level ) {
// AC: This is start of parallel that is nested inside teams construct.
// The team is actual (hot), all workers are ready at the fork barrier.
@@ -2484,6 +1516,7 @@ __kmp_fork_call(
KMP_DEBUG_ASSERT( parent_team->t.t_serialized > 1 );
parent_team->t.t_serialized--; // AC: need this in order enquiry functions
// work correctly, will restore at join time
+ KMP_TIME_BLOCK(OMP_work);
__kmp_invoke_microtask( microtask, gtid, 0, argc, parent_team->t.t_argv );
return TRUE;
}
@@ -2495,7 +1528,7 @@ __kmp_fork_call(
/* Change number of threads in the team if requested */
if ( master_set_numthreads ) { // The parallel has num_threads clause
- if ( master_set_numthreads < master_th->th.th_set_nth_teams ) {
+ if ( master_set_numthreads < master_th->th.th_teams_size.nth ) {
// AC: only can reduce the number of threads dynamically, cannot increase
kmp_info_t **other_threads = parent_team->t.t_threads;
parent_team->t.t_nproc = master_set_numthreads;
@@ -2516,8 +1549,11 @@ __kmp_fork_call(
KA_TRACE( 20, ("__kmp_fork_call: T#%d(%d:0) invoke microtask = %p\n",
gtid, parent_team->t.t_id, parent_team->t.t_pkfn ) );
- if (! parent_team->t.t_invoke( gtid )) {
- KMP_ASSERT2( 0, "cannot invoke microtask for MASTER thread" );
+ {
+ KMP_TIME_BLOCK(OMP_work);
+ if (! parent_team->t.t_invoke( gtid )) {
+ KMP_ASSERT2( 0, "cannot invoke microtask for MASTER thread" );
+ }
}
KA_TRACE( 20, ("__kmp_fork_call: T#%d(%d:0) done microtask = %p\n",
gtid, parent_team->t.t_id, parent_team->t.t_pkfn ) );
@@ -2526,43 +1562,37 @@ __kmp_fork_call(
KA_TRACE( 20, ("__kmp_fork_call: parallel exit T#%d\n", gtid ));
return TRUE;
- }
+ } // Parallel closely nested in teams construct
#endif /* OMP_40_ENABLED */
-#if OMP_30_ENABLED && KMP_DEBUG
+#if KMP_DEBUG
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
KMP_DEBUG_ASSERT( master_th->th.th_task_team == parent_team->t.t_task_team );
}
-#endif // OMP_30_ENABLED
+#endif
/* determine how many new threads we can use */
__kmp_acquire_bootstrap_lock( &__kmp_forkjoin_lock );
-#if OMP_30_ENABLED
if ( parent_team->t.t_active_level >= master_th->th.th_current_task->td_icvs.max_active_levels ) {
nthreads = 1;
- }
- else
-#endif // OMP_30_ENABLED
-
- {
+ } else {
nthreads = master_set_numthreads ?
- master_set_numthreads : get__nproc_2( parent_team, master_tid );
- nthreads = __kmp_reserve_threads( root, parent_team, master_tid, nthreads
+ master_set_numthreads : get__nproc_2( parent_team, master_tid ); // TODO: get nproc directly from current task
+ nthreads = __kmp_reserve_threads(root, parent_team, master_tid, nthreads
#if OMP_40_ENABLED
- // AC: If we execute teams from parallel region (on host), then teams
- // should be created but each can only have 1 thread if nesting is disabled.
- // If teams called from serial region, then teams and their threads
- // should be created regardless of the nesting setting.
- ,( ( ap == NULL && teams_level == 0 ) ||
- ( ap && teams_level > 0 && teams_level == level ) )
+/* AC: If we execute teams from parallel region (on host), then teams should be created
+ but each can only have 1 thread if nesting is disabled. If teams called from serial region,
+ then teams and their threads should be created regardless of the nesting setting. */
+ , ((ap==NULL && active_level==0) ||
+ (ap && teams_level>0 && teams_level==level))
#endif /* OMP_40_ENABLED */
- );
+ );
}
KMP_DEBUG_ASSERT( nthreads > 0 );
/* If we temporarily changed the set number of threads then restore it now */
- master_th -> th.th_set_nproc = 0;
+ master_th->th.th_set_nproc = 0;
/* create a serialized parallel region? */
@@ -2579,19 +1609,18 @@ __kmp_fork_call(
__kmpc_serialized_parallel(loc, gtid);
- if ( exec_master == 0 ) {
- // we were called from GNU native code
- KA_TRACE( 20, ("__kmp_fork_call: T#%d serial exit\n", gtid ));
- return FALSE;
- } else if ( exec_master == 1 ) {
+ if ( call_context == fork_context_intel ) {
/* TODO this sucks, use the compiler itself to pass args! :) */
- master_th -> th.th_serial_team -> t.t_ident = loc;
+ master_th->th.th_serial_team->t.t_ident = loc;
#if OMP_40_ENABLED
if ( !ap ) {
// revert change made in __kmpc_serialized_parallel()
- master_th -> th.th_serial_team -> t.t_level--;
+ master_th->th.th_serial_team->t.t_level--;
// Get args from parent team for teams construct
- __kmp_invoke_microtask( microtask, gtid, 0, argc, parent_team->t.t_argv );
+ {
+ KMP_TIME_BLOCK(OMP_work);
+ __kmp_invoke_microtask( microtask, gtid, 0, argc, parent_team->t.t_argv );
+ }
} else if ( microtask == (microtask_t)__kmp_teams_master ) {
KMP_DEBUG_ASSERT( master_th->th.th_team == master_th->th.th_serial_team );
team = master_th->th.th_team;
@@ -2602,12 +1631,12 @@ __kmp_fork_call(
argv = (void**) team->t.t_argv;
if ( ap ) {
for( i=argc-1; i >= 0; --i )
- /* TODO: revert workaround for Intel(R) 64 tracker #96 */
- #if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
+// TODO: revert workaround for Intel(R) 64 tracker #96
+# if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
*argv++ = va_arg( *ap, void * );
- #else
+# else
*argv++ = va_arg( ap, void * );
- #endif
+# endif
} else {
for( i=0; i < argc; ++i )
// Get args from parent team for teams construct
@@ -2617,127 +1646,109 @@ __kmp_fork_call(
// because initial code in teams should have level=0
team->t.t_level--;
// AC: call special invoker for outer "parallel" of the teams construct
- invoker(gtid);
+ {
+ KMP_TIME_BLOCK(OMP_work);
+ invoker(gtid);
+ }
} else {
#endif /* OMP_40_ENABLED */
argv = args;
for( i=argc-1; i >= 0; --i )
- /* TODO: revert workaround for Intel(R) 64 tracker #96 */
- #if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
+// TODO: revert workaround for Intel(R) 64 tracker #96
+#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
*argv++ = va_arg( *ap, void * );
- #else
+#else
*argv++ = va_arg( ap, void * );
- #endif
+#endif
KMP_MB();
- __kmp_invoke_microtask( microtask, gtid, 0, argc, args );
+ {
+ KMP_TIME_BLOCK(OMP_work);
+ __kmp_invoke_microtask( microtask, gtid, 0, argc, args );
+ }
#if OMP_40_ENABLED
}
#endif /* OMP_40_ENABLED */
}
+ else if ( call_context == fork_context_gnu ) {
+ // we were called from GNU native code
+ KA_TRACE( 20, ("__kmp_fork_call: T#%d serial exit\n", gtid ));
+ return FALSE;
+ }
else {
- KMP_ASSERT2( exec_master <= 1, "__kmp_fork_call: unknown parameter exec_master" );
+ KMP_ASSERT2( call_context < fork_context_last, "__kmp_fork_call: unknown fork_context parameter" );
}
- KA_TRACE( 20, ("__kmp_fork_call: T#%d serial exit\n", gtid ));
+ KA_TRACE( 20, ("__kmp_fork_call: T#%d serial exit\n", gtid ));
KMP_MB();
return FALSE;
}
-#if OMP_30_ENABLED
// GEH: only modify the executing flag in the case when not serialized
// serialized case is handled in kmpc_serialized_parallel
KF_TRACE( 10, ( "__kmp_fork_call: parent_team_aclevel=%d, master_th=%p, curtask=%p, curtask_max_aclevel=%d\n",
- parent_team->t.t_active_level, master_th, master_th->th.th_current_task,
- master_th->th.th_current_task->td_icvs.max_active_levels ) );
+ parent_team->t.t_active_level, master_th, master_th->th.th_current_task,
+ master_th->th.th_current_task->td_icvs.max_active_levels ) );
// TODO: GEH - cannot do this assertion because root thread not set up as executing
// KMP_ASSERT( master_th->th.th_current_task->td_flags.executing == 1 );
master_th->th.th_current_task->td_flags.executing = 0;
-#endif
#if OMP_40_ENABLED
- if ( !master_th->th.th_team_microtask || level > teams_level )
+ if ( !master_th->th.th_teams_microtask || level > teams_level )
#endif /* OMP_40_ENABLED */
{
/* Increment our nested depth level */
KMP_TEST_THEN_INC32( (kmp_int32*) &root->r.r_in_parallel );
}
-#if OMP_30_ENABLED
- //
// See if we need to make a copy of the ICVs.
- //
int nthreads_icv = master_th->th.th_current_task->td_icvs.nproc;
- if ( ( level + 1 < __kmp_nested_nth.used ) &&
- ( __kmp_nested_nth.nth[level + 1] != nthreads_icv ) ) {
- nthreads_icv = __kmp_nested_nth.nth[level + 1];
+ if ((level+1 < __kmp_nested_nth.used) && (__kmp_nested_nth.nth[level+1] != nthreads_icv)) {
+ nthreads_icv = __kmp_nested_nth.nth[level+1];
}
else {
nthreads_icv = 0; // don't update
}
#if OMP_40_ENABLED
- //
// Figure out the proc_bind_policy for the new team.
- //
kmp_proc_bind_t proc_bind = master_th->th.th_set_proc_bind;
- kmp_proc_bind_t proc_bind_icv; // proc_bind_default means don't update
-
+ kmp_proc_bind_t proc_bind_icv = proc_bind_default; // proc_bind_default means don't update
if ( master_th->th.th_current_task->td_icvs.proc_bind == proc_bind_false ) {
proc_bind = proc_bind_false;
- proc_bind_icv = proc_bind_default;
}
else {
- proc_bind_icv = master_th->th.th_current_task->td_icvs.proc_bind;
- if ( proc_bind == proc_bind_default ) {
- //
- // No proc_bind clause was specified, so use the current value
- // of proc-bind-var for this parallel region.
- //
- proc_bind = proc_bind_icv;
- }
- else {
- //
- // The proc_bind policy was specified explicitly on the parallel
- // clause. This overrides the proc-bind-var for this parallel
- // region, but does not change proc-bind-var.
- //
+ if (proc_bind == proc_bind_default) {
+ // No proc_bind clause specified; use current proc-bind-var for this parallel region
+ proc_bind = master_th->th.th_current_task->td_icvs.proc_bind;
}
-
- //
+ /* else: The proc_bind policy was specified explicitly on parallel clause. This
+ overrides proc-bind-var for this parallel region, but does not change proc-bind-var. */
// Figure the value of proc-bind-var for the child threads.
- //
- if ( ( level + 1 < __kmp_nested_proc_bind.used )
- && ( __kmp_nested_proc_bind.bind_types[level + 1] != proc_bind_icv ) ) {
- proc_bind_icv = __kmp_nested_proc_bind.bind_types[level + 1];
- }
- else {
- proc_bind_icv = proc_bind_default;
+ if ((level+1 < __kmp_nested_proc_bind.used)
+ && (__kmp_nested_proc_bind.bind_types[level+1] != master_th->th.th_current_task->td_icvs.proc_bind)) {
+ proc_bind_icv = __kmp_nested_proc_bind.bind_types[level+1];
}
}
- //
// Reset for next parallel region
- //
master_th->th.th_set_proc_bind = proc_bind_default;
#endif /* OMP_40_ENABLED */
- if ( ( nthreads_icv > 0 )
+ if ((nthreads_icv > 0)
#if OMP_40_ENABLED
- || ( proc_bind_icv != proc_bind_default )
+ || (proc_bind_icv != proc_bind_default)
#endif /* OMP_40_ENABLED */
- )
- {
+ ) {
kmp_internal_control_t new_icvs;
- copy_icvs( & new_icvs, & master_th->th.th_current_task->td_icvs );
+ copy_icvs(&new_icvs, &master_th->th.th_current_task->td_icvs);
new_icvs.next = NULL;
-
- if ( nthreads_icv > 0 ) {
+ if (nthreads_icv > 0) {
new_icvs.nproc = nthreads_icv;
}
#if OMP_40_ENABLED
- if ( proc_bind_icv != proc_bind_default ) {
+ if (proc_bind_icv != proc_bind_default) {
new_icvs.proc_bind = proc_bind_icv;
}
#endif /* OMP_40_ENABLED */
@@ -2746,47 +1757,31 @@ __kmp_fork_call(
KF_TRACE( 10, ( "__kmp_fork_call: before __kmp_allocate_team\n" ) );
team = __kmp_allocate_team(root, nthreads, nthreads,
#if OMP_40_ENABLED
- proc_bind,
+ proc_bind,
#endif
- &new_icvs, argc );
- } else
-#endif /* OMP_30_ENABLED */
- {
+ &new_icvs, argc USE_NESTED_HOT_ARG(master_th) );
+ } else {
/* allocate a new parallel team */
KF_TRACE( 10, ( "__kmp_fork_call: before __kmp_allocate_team\n" ) );
team = __kmp_allocate_team(root, nthreads, nthreads,
#if OMP_40_ENABLED
- proc_bind,
+ proc_bind,
#endif
-#if OMP_30_ENABLED
- &master_th->th.th_current_task->td_icvs,
-#else
- parent_team->t.t_set_nproc[master_tid],
- parent_team->t.t_set_dynamic[master_tid],
- parent_team->t.t_set_nested[master_tid],
- parent_team->t.t_set_blocktime[master_tid],
- parent_team->t.t_set_bt_intervals[master_tid],
- parent_team->t.t_set_bt_set[master_tid],
-#endif // OMP_30_ENABLED
- argc );
+ &master_th->th.th_current_task->td_icvs, argc
+ USE_NESTED_HOT_ARG(master_th) );
}
-
- KF_TRACE( 10, ( "__kmp_fork_call: after __kmp_allocate_team - team = %p\n",
- team ) );
+ KF_TRACE( 10, ( "__kmp_fork_call: after __kmp_allocate_team - team = %p\n", team ) );
/* setup the new team */
team->t.t_master_tid = master_tid;
team->t.t_master_this_cons = master_this_cons;
- team->t.t_master_last_cons = master_last_cons;
-
+ team->t.t_ident = loc;
team->t.t_parent = parent_team;
TCW_SYNC_PTR(team->t.t_pkfn, microtask);
team->t.t_invoke = invoker; /* TODO move this to root, maybe */
- team->t.t_ident = loc;
-#if OMP_30_ENABLED
// TODO: parent_team->t.t_level == INT_MAX ???
#if OMP_40_ENABLED
- if ( !master_th->th.th_team_microtask || level > teams_level ) {
+ if ( !master_th->th.th_teams_microtask || level > teams_level ) {
#endif /* OMP_40_ENABLED */
team->t.t_level = parent_team->t.t_level + 1;
team->t.t_active_level = parent_team->t.t_active_level + 1;
@@ -2797,33 +1792,22 @@ __kmp_fork_call(
team->t.t_active_level = parent_team->t.t_active_level;
}
#endif /* OMP_40_ENABLED */
- team->t.t_sched = get__sched_2( parent_team, master_tid ); // set master's schedule as new run-time schedule
+ team->t.t_sched = get__sched_2(parent_team, master_tid); // set master's schedule as new run-time schedule
-#if KMP_ARCH_X86 || KMP_ARCH_X86_64
- if ( __kmp_inherit_fp_control ) {
- __kmp_store_x87_fpu_control_word( &team->t.t_x87_fpu_control_word );
- __kmp_store_mxcsr( &team->t.t_mxcsr );
- team->t.t_mxcsr &= KMP_X86_MXCSR_MASK;
- team->t.t_fp_control_saved = TRUE;
- }
- else {
- team->t.t_fp_control_saved = FALSE;
- }
-#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
+ // Update the floating point rounding in the team if required.
+ propagateFPControl(team);
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- //
- // Set the master thread's task team to the team's task team.
- // Unless this is the hot team, it should be NULL.
- //
+ // Set master's task team to team's task team. Unless this is hot team, it should be NULL.
KMP_DEBUG_ASSERT( master_th->th.th_task_team == parent_team->t.t_task_team );
KA_TRACE( 20, ( "__kmp_fork_call: Master T#%d pushing task_team %p / team %p, new task_team %p / team %p\n",
- __kmp_gtid_from_thread( master_th ), master_th->th.th_task_team,
- parent_team, team->t.t_task_team, team ) );
+ __kmp_gtid_from_thread( master_th ), master_th->th.th_task_team,
+ parent_team, team->t.t_task_team, team ) );
master_th->th.th_task_team = team->t.t_task_team;
- KMP_DEBUG_ASSERT( ( master_th->th.th_task_team == NULL ) || ( team == root->r.r_hot_team ) ) ;
+#if !KMP_NESTED_HOT_TEAMS
+ KMP_DEBUG_ASSERT((master_th->th.th_task_team == NULL) || (team == root->r.r_hot_team));
+#endif
}
-#endif // OMP_30_ENABLED
KA_TRACE( 20, ("__kmp_fork_call: T#%d(%d:%d)->(%d:0) created a team of %d threads\n",
gtid, parent_team->t.t_id, team->t.t_master_tid, team->t.t_id, team->t.t_nproc ));
@@ -2833,12 +1817,12 @@ __kmp_fork_call(
KMP_MB();
/* now, setup the arguments */
- argv = (void**) team -> t.t_argv;
+ argv = (void**)team->t.t_argv;
#if OMP_40_ENABLED
if ( ap ) {
#endif /* OMP_40_ENABLED */
- for( i=argc-1; i >= 0; --i )
-/* TODO: revert workaround for Intel(R) 64 tracker #96 */
+ for ( i=argc-1; i >= 0; --i )
+// TODO: revert workaround for Intel(R) 64 tracker #96
#if (KMP_ARCH_X86_64 || KMP_ARCH_ARM) && KMP_OS_LINUX
*argv++ = va_arg( *ap, void * );
#else
@@ -2846,31 +1830,19 @@ __kmp_fork_call(
#endif
#if OMP_40_ENABLED
} else {
- for( i=0; i < argc; ++i )
+ for ( i=0; i < argc; ++i )
// Get args from parent team for teams construct
argv[i] = team->t.t_parent->t.t_argv[i];
}
#endif /* OMP_40_ENABLED */
/* now actually fork the threads */
-
team->t.t_master_active = master_active;
- if (!root -> r.r_active) /* Only do the assignment if it makes a difference to prevent cache ping-pong */
- root -> r.r_active = TRUE;
+ if (!root->r.r_active) // Only do assignment if it prevents cache ping-pong
+ root->r.r_active = TRUE;
__kmp_fork_team_threads( root, team, master_th, gtid );
- __kmp_setup_icv_copy(team, nthreads
-#if OMP_30_ENABLED
- , &master_th->th.th_current_task->td_icvs, loc
-#else
- , parent_team->t.t_set_nproc[master_tid],
- parent_team->t.t_set_dynamic[master_tid],
- parent_team->t.t_set_nested[master_tid],
- parent_team->t.t_set_blocktime[master_tid],
- parent_team->t.t_set_bt_intervals[master_tid],
- parent_team->t.t_set_bt_set[master_tid]
-#endif /* OMP_30_ENABLED */
- );
+ __kmp_setup_icv_copy( team, nthreads, &master_th->th.th_current_task->td_icvs, loc );
__kmp_release_bootstrap_lock( &__kmp_forkjoin_lock );
@@ -2878,20 +1850,30 @@ __kmp_fork_call(
#if USE_ITT_BUILD
// Mark start of "parallel" region for VTune. Only use one of frame notification scheme at the moment.
- if ( ( __itt_frame_begin_v3_ptr && __kmp_forkjoin_frames && ! __kmp_forkjoin_frames_mode ) || KMP_ITT_DEBUG )
+ if ((__itt_frame_begin_v3_ptr && __kmp_forkjoin_frames && !__kmp_forkjoin_frames_mode) || KMP_ITT_DEBUG)
# if OMP_40_ENABLED
- if ( !master_th->th.th_team_microtask || microtask == (microtask_t)__kmp_teams_master )
- // Either not in teams or the outer fork of the teams construct
+ if (!master_th->th.th_teams_microtask || microtask == (microtask_t)__kmp_teams_master)
+ // Either not in teams or the outer fork of the teams construct
# endif /* OMP_40_ENABLED */
- __kmp_itt_region_forking( gtid );
-#endif /* USE_ITT_BUILD */
+ {
+ __kmp_itt_region_forking(gtid, team->t.t_nproc, 0);
+ }
+ kmp_uint64 tmp_time = 0;
+#if USE_ITT_NOTIFY
+ if ( __itt_get_timestamp_ptr )
+ tmp_time = __itt_get_timestamp();
+#endif
+ if ((__itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode==3)|| KMP_ITT_DEBUG)
+# if OMP_40_ENABLED
+ if (!master_th->th.th_teams_microtask || microtask == (microtask_t)__kmp_teams_master)
+ // Either not in teams or the outer fork of the teams construct
+# endif /* OMP_40_ENABLED */
+ team->t.t_region_time = tmp_time;
-#if USE_ITT_BUILD && USE_ITT_NOTIFY && OMP_30_ENABLED
// Internal fork - report frame begin
- if( ( __kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3 ) && __itt_frame_submit_v3_ptr && __itt_get_timestamp_ptr )
- {
- if( ! ( team->t.t_active_level > 1 ) ) {
- master_th->th.th_frame_time = __itt_get_timestamp();
+ if ((__kmp_forkjoin_frames_mode == 1 || __kmp_forkjoin_frames_mode == 3) && __itt_frame_submit_v3_ptr ) {
+ if (!(team->t.t_active_level > 1)) {
+ master_th->th.th_frame_time = tmp_time;
}
}
#endif /* USE_ITT_BUILD */
@@ -2899,8 +1881,8 @@ __kmp_fork_call(
/* now go on and do the work */
KMP_DEBUG_ASSERT( team == __kmp_threads[gtid]->th.th_team );
KMP_MB();
-
- KF_TRACE( 10, ( "__kmp_internal_fork : root=%p, team=%p, master_th=%p, gtid=%d\n", root, team, master_th, gtid ) );
+ KF_TRACE(10, ("__kmp_internal_fork : root=%p, team=%p, master_th=%p, gtid=%d\n",
+ root, team, master_th, gtid));
#if USE_ITT_BUILD
if ( __itt_stack_caller_create_ptr ) {
@@ -2913,10 +1895,11 @@ __kmp_fork_call(
#endif /* OMP_40_ENABLED */
{
__kmp_internal_fork( loc, gtid, team );
- KF_TRACE( 10, ( "__kmp_internal_fork : after : root=%p, team=%p, master_th=%p, gtid=%d\n", root, team, master_th, gtid ) );
+ KF_TRACE(10, ("__kmp_internal_fork : after : root=%p, team=%p, master_th=%p, gtid=%d\n",
+ root, team, master_th, gtid));
}
- if (! exec_master) {
+ if (call_context == fork_context_gnu) {
KA_TRACE( 20, ("__kmp_fork_call: parallel exit T#%d\n", gtid ));
return TRUE;
}
@@ -2924,9 +1907,14 @@ __kmp_fork_call(
/* Invoke microtask for MASTER thread */
KA_TRACE( 20, ("__kmp_fork_call: T#%d(%d:0) invoke microtask = %p\n",
gtid, team->t.t_id, team->t.t_pkfn ) );
+ } // END of timer KMP_fork_call block
- if (! team->t.t_invoke( gtid )) {
- KMP_ASSERT2( 0, "cannot invoke microtask for MASTER thread" );
+ {
+ //KMP_TIME_BLOCK(OMP_work);
+ KMP_TIME_BLOCK(USER_master_invoke);
+ if (! team->t.t_invoke( gtid )) {
+ KMP_ASSERT2( 0, "cannot invoke microtask for MASTER thread" );
+ }
}
KA_TRACE( 20, ("__kmp_fork_call: T#%d(%d:0) done microtask = %p\n",
gtid, team->t.t_id, team->t.t_pkfn ) );
@@ -2937,7 +1925,6 @@ __kmp_fork_call(
return TRUE;
}
-
void
__kmp_join_call(ident_t *loc, int gtid
#if OMP_40_ENABLED
@@ -2945,6 +1932,7 @@ __kmp_join_call(ident_t *loc, int gtid
#endif /* OMP_40_ENABLED */
)
{
+ KMP_TIME_BLOCK(KMP_join_call);
kmp_team_t *team;
kmp_team_t *parent_team;
kmp_info_t *master_th;
@@ -2956,24 +1944,24 @@ __kmp_join_call(ident_t *loc, int gtid
/* setup current data */
master_th = __kmp_threads[ gtid ];
- root = master_th -> th.th_root;
- team = master_th -> th.th_team;
+ root = master_th->th.th_root;
+ team = master_th->th.th_team;
parent_team = team->t.t_parent;
master_th->th.th_ident = loc;
-#if OMP_30_ENABLED && KMP_DEBUG
+#if KMP_DEBUG
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
KA_TRACE( 20, ( "__kmp_join_call: T#%d, old team = %p old task_team = %p, th_task_team = %p\n",
__kmp_gtid_from_thread( master_th ), team,
- team -> t.t_task_team, master_th->th.th_task_team) );
+ team->t.t_task_team, master_th->th.th_task_team) );
KMP_DEBUG_ASSERT( master_th->th.th_task_team == team->t.t_task_team );
}
-#endif // OMP_30_ENABLED
+#endif
if( team->t.t_serialized ) {
#if OMP_40_ENABLED
- if ( master_th->th.th_team_microtask ) {
+ if ( master_th->th.th_teams_microtask ) {
// We are in teams construct
int level = team->t.t_level;
int tlevel = master_th->th.th_teams_level;
@@ -3012,7 +2000,7 @@ __kmp_join_call(ident_t *loc, int gtid
// Mark end of "parallel" region for VTune. Only use one of frame notification scheme at the moment.
if ( ( __itt_frame_end_v3_ptr && __kmp_forkjoin_frames && ! __kmp_forkjoin_frames_mode ) || KMP_ITT_DEBUG )
# if OMP_40_ENABLED
- if ( !master_th->th.th_team_microtask /* not in teams */ ||
+ if ( !master_th->th.th_teams_microtask /* not in teams */ ||
( !exit_teams && team->t.t_level == master_th->th.th_teams_level ) )
// Either not in teams or exiting teams region
// (teams is a frame and no other frames inside the teams)
@@ -3021,10 +2009,21 @@ __kmp_join_call(ident_t *loc, int gtid
master_th->th.th_ident = loc;
__kmp_itt_region_joined( gtid );
}
+ if ( ( __itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode == 3 ) || KMP_ITT_DEBUG )
+# if OMP_40_ENABLED
+ if ( !master_th->th.th_teams_microtask /* not in teams */ ||
+ ( !exit_teams && team->t.t_level == master_th->th.th_teams_level ) )
+ // Either not in teams or exiting teams region
+ // (teams is a frame and no other frames inside the teams)
+# endif /* OMP_40_ENABLED */
+ {
+ master_th->th.th_ident = loc;
+ __kmp_itt_frame_submit( gtid, team->t.t_region_time, master_th->th.th_frame_time, 0, loc, master_th->th.th_team_nproc, 1 );
+ }
#endif /* USE_ITT_BUILD */
#if OMP_40_ENABLED
- if ( master_th->th.th_team_microtask &&
+ if ( master_th->th.th_teams_microtask &&
!exit_teams &&
team->t.t_pkfn != (microtask_t)__kmp_teams_master &&
team->t.t_level == master_th->th.th_teams_level + 1 ) {
@@ -3038,9 +2037,9 @@ __kmp_join_call(ident_t *loc, int gtid
KMP_TEST_THEN_DEC32( (kmp_int32*) &root->r.r_in_parallel );
/* Restore number of threads in the team if needed */
- if ( master_th->th.th_team_nproc < master_th->th.th_set_nth_teams ) {
+ if ( master_th->th.th_team_nproc < master_th->th.th_teams_size.nth ) {
int old_num = master_th->th.th_team_nproc;
- int new_num = master_th->th.th_set_nth_teams;
+ int new_num = master_th->th.th_teams_size.nth;
kmp_info_t **other_threads = team->t.t_threads;
team->t.t_nproc = new_num;
for ( i = 0; i < old_num; ++i ) {
@@ -3051,8 +2050,9 @@ __kmp_join_call(ident_t *loc, int gtid
// Re-initialize thread's barrier data.
int b;
kmp_balign_t * balign = other_threads[i]->th.th_bar;
- for ( b = 0; b < bp_last_bar; ++ b ) {
+ for ( b = 0; b < bs_last_barrier; ++ b ) {
balign[ b ].bb.b_arrived = team->t.t_bar[ b ].b_arrived;
+ KMP_DEBUG_ASSERT(balign[ b ].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
}
// Synchronize thread's task state
other_threads[i]->th.th_task_state = master_th->th.th_task_state;
@@ -3061,13 +2061,13 @@ __kmp_join_call(ident_t *loc, int gtid
return;
}
#endif /* OMP_40_ENABLED */
+
/* do cleanup and restore the parent team */
- master_th -> th.th_info .ds.ds_tid = team -> t.t_master_tid;
- master_th -> th.th_local.this_construct = team -> t.t_master_this_cons;
- master_th -> th.th_local.last_construct = team -> t.t_master_last_cons;
+ master_th->th.th_info .ds.ds_tid = team->t.t_master_tid;
+ master_th->th.th_local.this_construct = team->t.t_master_this_cons;
- master_th -> th.th_dispatch =
- & parent_team -> t.t_dispatch[ team -> t.t_master_tid ];
+ master_th->th.th_dispatch =
+ & parent_team->t.t_dispatch[ team->t.t_master_tid ];
/* jc: The following lock has instructions with REL and ACQ semantics,
separating the parallel user code called in this parallel region
@@ -3076,7 +2076,7 @@ __kmp_join_call(ident_t *loc, int gtid
__kmp_acquire_bootstrap_lock( &__kmp_forkjoin_lock );
#if OMP_40_ENABLED
- if ( !master_th->th.th_team_microtask || team->t.t_level > master_th->th.th_teams_level )
+ if ( !master_th->th.th_teams_microtask || team->t.t_level > master_th->th.th_teams_level )
#endif /* OMP_40_ENABLED */
{
/* Decrement our nested depth level */
@@ -3084,32 +2084,24 @@ __kmp_join_call(ident_t *loc, int gtid
}
KMP_DEBUG_ASSERT( root->r.r_in_parallel >= 0 );
- #if OMP_30_ENABLED
KF_TRACE( 10, ("__kmp_join_call1: T#%d, this_thread=%p team=%p\n",
0, master_th, team ) );
__kmp_pop_current_task_from_thread( master_th );
- #endif // OMP_30_ENABLED
#if OMP_40_ENABLED && KMP_AFFINITY_SUPPORTED
//
// Restore master thread's partition.
//
- master_th -> th.th_first_place = team -> t.t_first_place;
- master_th -> th.th_last_place = team -> t.t_last_place;
+ master_th->th.th_first_place = team->t.t_first_place;
+ master_th->th.th_last_place = team->t.t_last_place;
#endif /* OMP_40_ENABLED */
-#if KMP_ARCH_X86 || KMP_ARCH_X86_64
- if ( __kmp_inherit_fp_control && team->t.t_fp_control_saved ) {
- __kmp_clear_x87_fpu_status_word();
- __kmp_load_x87_fpu_control_word( &team->t.t_x87_fpu_control_word );
- __kmp_load_mxcsr( &team->t.t_mxcsr );
- }
-#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
+ updateHWFPControl (team);
- if ( root -> r.r_active != master_active )
- root -> r.r_active = master_active;
+ if ( root->r.r_active != master_active )
+ root->r.r_active = master_active;
- __kmp_free_team( root, team ); /* this will free worker threads */
+ __kmp_free_team( root, team USE_NESTED_HOT_ARG(master_th) ); // this will free worker threads
/* this race was fun to find. make sure the following is in the critical
* region otherwise assertions may fail occasiounally since the old team
@@ -3117,39 +2109,35 @@ __kmp_join_call(ident_t *loc, int gtid
* actually safe to run and won't cause any bugs, but will cause thoose
* assertion failures. it's only one deref&assign so might as well put this
* in the critical region */
- master_th -> th.th_team = parent_team;
- master_th -> th.th_team_nproc = parent_team -> t.t_nproc;
- master_th -> th.th_team_master = parent_team -> t.t_threads[0];
- master_th -> th.th_team_serialized = parent_team -> t.t_serialized;
+ master_th->th.th_team = parent_team;
+ master_th->th.th_team_nproc = parent_team->t.t_nproc;
+ master_th->th.th_team_master = parent_team->t.t_threads[0];
+ master_th->th.th_team_serialized = parent_team->t.t_serialized;
/* restore serialized team, if need be */
- if( parent_team -> t.t_serialized &&
+ if( parent_team->t.t_serialized &&
parent_team != master_th->th.th_serial_team &&
parent_team != root->r.r_root_team ) {
- __kmp_free_team( root, master_th -> th.th_serial_team );
- master_th -> th.th_serial_team = parent_team;
+ __kmp_free_team( root, master_th->th.th_serial_team USE_NESTED_HOT_ARG(NULL) );
+ master_th->th.th_serial_team = parent_team;
}
-#if OMP_30_ENABLED
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
//
// Copy the task team from the new child / old parent team
// to the thread. If non-NULL, copy the state flag also.
//
- if ( ( master_th -> th.th_task_team = parent_team -> t.t_task_team ) != NULL ) {
- master_th -> th.th_task_state = master_th -> th.th_task_team -> tt.tt_state;
+ if ( ( master_th->th.th_task_team = parent_team->t.t_task_team ) != NULL ) {
+ master_th->th.th_task_state = master_th->th.th_task_team->tt.tt_state;
}
KA_TRACE( 20, ( "__kmp_join_call: Master T#%d restoring task_team %p / team %p\n",
__kmp_gtid_from_thread( master_th ), master_th->th.th_task_team,
parent_team ) );
}
-#endif /* OMP_30_ENABLED */
- #if OMP_30_ENABLED
- // TODO: GEH - cannot do this assertion because root thread not set up as executing
- // KMP_ASSERT( master_th->th.th_current_task->td_flags.executing == 0 );
- master_th->th.th_current_task->td_flags.executing = 1;
- #endif // OMP_30_ENABLED
+ // TODO: GEH - cannot do this assertion because root thread not set up as executing
+ // KMP_ASSERT( master_th->th.th_current_task->td_flags.executing == 0 );
+ master_th->th.th_current_task->td_flags.executing = 1;
__kmp_release_bootstrap_lock( &__kmp_forkjoin_lock );
@@ -3166,38 +2154,29 @@ void
__kmp_save_internal_controls ( kmp_info_t * thread )
{
- if ( thread -> th.th_team != thread -> th.th_serial_team ) {
+ if ( thread->th.th_team != thread->th.th_serial_team ) {
return;
}
- if (thread -> th.th_team -> t.t_serialized > 1) {
+ if (thread->th.th_team->t.t_serialized > 1) {
int push = 0;
- if (thread -> th.th_team -> t.t_control_stack_top == NULL) {
+ if (thread->th.th_team->t.t_control_stack_top == NULL) {
push = 1;
} else {
- if ( thread -> th.th_team -> t.t_control_stack_top -> serial_nesting_level !=
- thread -> th.th_team -> t.t_serialized ) {
+ if ( thread->th.th_team->t.t_control_stack_top->serial_nesting_level !=
+ thread->th.th_team->t.t_serialized ) {
push = 1;
}
}
if (push) { /* push a record on the serial team's stack */
kmp_internal_control_t * control = (kmp_internal_control_t *) __kmp_allocate(sizeof(kmp_internal_control_t));
-#if OMP_30_ENABLED
copy_icvs( control, & thread->th.th_current_task->td_icvs );
-#else
- control->nproc = thread->th.th_team->t.t_set_nproc[0];
- control->dynamic = thread->th.th_team->t.t_set_dynamic[0];
- control->nested = thread->th.th_team->t.t_set_nested[0];
- control->blocktime = thread->th.th_team->t.t_set_blocktime[0];
- control->bt_intervals = thread->th.th_team->t.t_set_bt_intervals[0];
- control->bt_set = thread->th.th_team->t.t_set_bt_set[0];
-#endif // OMP_30_ENABLED
control->serial_nesting_level = thread->th.th_team->t.t_serialized;
- control->next = thread -> th.th_team -> t.t_control_stack_top;
- thread -> th.th_team -> t.t_control_stack_top = control;
+ control->next = thread->th.th_team->t.t_control_stack_top;
+ thread->th.th_team->t.t_control_stack_top = control;
}
}
}
@@ -3230,14 +2209,17 @@ __kmp_set_num_threads( int new_nth, int gtid )
//
root = thread->th.th_root;
if ( __kmp_init_parallel && ( ! root->r.r_active )
- && ( root->r.r_hot_team->t.t_nproc > new_nth ) ) {
+ && ( root->r.r_hot_team->t.t_nproc > new_nth )
+#if KMP_NESTED_HOT_TEAMS
+ && __kmp_hot_teams_max_level && !__kmp_hot_teams_mode
+#endif
+ ) {
kmp_team_t *hot_team = root->r.r_hot_team;
int f;
__kmp_acquire_bootstrap_lock( &__kmp_forkjoin_lock );
-#if OMP_30_ENABLED
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
kmp_task_team_t *task_team = hot_team->t.t_task_team;
if ( ( task_team != NULL ) && TCR_SYNC_4(task_team->tt.tt_active) ) {
@@ -3259,7 +2241,6 @@ __kmp_set_num_threads( int new_nth, int gtid )
KMP_DEBUG_ASSERT( task_team == NULL );
}
}
-#endif // OMP_30_ENABLED
//
// Release the extra threads we don't need any more.
@@ -3270,6 +2251,12 @@ __kmp_set_num_threads( int new_nth, int gtid )
hot_team->t.t_threads[f] = NULL;
}
hot_team->t.t_nproc = new_nth;
+#if KMP_NESTED_HOT_TEAMS
+ if( thread->th.th_hot_teams ) {
+ KMP_DEBUG_ASSERT( hot_team == thread->th.th_hot_teams[0].hot_team );
+ thread->th.th_hot_teams[0].hot_team_nth = new_nth;
+ }
+#endif
__kmp_release_bootstrap_lock( &__kmp_forkjoin_lock );
@@ -3283,13 +2270,12 @@ __kmp_set_num_threads( int new_nth, int gtid )
}
#if KMP_MIC
// Special flag in case omp_set_num_threads() call
- hot_team -> t.t_size_changed = -1;
+ hot_team->t.t_size_changed = -1;
#endif
}
}
-#if OMP_30_ENABLED
/* Changes max_active_levels */
void
__kmp_set_max_active_levels( int gtid, int max_active_levels )
@@ -3338,10 +2324,10 @@ __kmp_get_max_active_levels( int gtid )
KMP_DEBUG_ASSERT( __kmp_init_serial );
thread = __kmp_threads[ gtid ];
- KMP_DEBUG_ASSERT( thread -> th.th_current_task );
+ KMP_DEBUG_ASSERT( thread->th.th_current_task );
KF_TRACE( 10, ( "__kmp_get_max_active_levels: thread %d, curtask=%p, curtask_maxaclevel=%d\n",
- gtid, thread -> th.th_current_task, thread -> th.th_current_task -> td_icvs.max_active_levels ) );
- return thread -> th.th_current_task -> td_icvs.max_active_levels;
+ gtid, thread->th.th_current_task, thread->th.th_current_task->td_icvs.max_active_levels ) );
+ return thread->th.th_current_task->td_icvs.max_active_levels;
}
/* Changes def_sched_var ICV values (run-time schedule kind and chunk) */
@@ -3380,20 +2366,20 @@ __kmp_set_schedule( int gtid, kmp_sched_t kind, int chunk )
if ( kind == kmp_sched_static && chunk < KMP_DEFAULT_CHUNK ) {
// differ static chunked vs. unchunked:
// chunk should be invalid to indicate unchunked schedule (which is the default)
- thread -> th.th_current_task -> td_icvs.sched.r_sched_type = kmp_sch_static;
+ thread->th.th_current_task->td_icvs.sched.r_sched_type = kmp_sch_static;
} else {
- thread -> th.th_current_task -> td_icvs.sched.r_sched_type = __kmp_sch_map[ kind - kmp_sched_lower - 1 ];
+ thread->th.th_current_task->td_icvs.sched.r_sched_type = __kmp_sch_map[ kind - kmp_sched_lower - 1 ];
}
} else {
// __kmp_sch_map[ kind - kmp_sched_lower_ext + kmp_sched_upper_std - kmp_sched_lower - 2 ];
- thread -> th.th_current_task -> td_icvs.sched.r_sched_type =
+ thread->th.th_current_task->td_icvs.sched.r_sched_type =
__kmp_sch_map[ kind - kmp_sched_lower_ext + kmp_sched_upper_std - kmp_sched_lower - 2 ];
}
if ( kind == kmp_sched_auto ) {
// ignore parameter chunk for schedule auto
- thread -> th.th_current_task -> td_icvs.sched.chunk = KMP_DEFAULT_CHUNK;
+ thread->th.th_current_task->td_icvs.sched.chunk = KMP_DEFAULT_CHUNK;
} else {
- thread -> th.th_current_task -> td_icvs.sched.chunk = chunk;
+ thread->th.th_current_task->td_icvs.sched.chunk = chunk;
}
}
@@ -3410,8 +2396,8 @@ __kmp_get_schedule( int gtid, kmp_sched_t * kind, int * chunk )
thread = __kmp_threads[ gtid ];
- //th_type = thread -> th.th_team -> t.t_set_sched[ thread->th.th_info.ds.ds_tid ].r_sched_type;
- th_type = thread -> th.th_current_task -> td_icvs.sched.r_sched_type;
+ //th_type = thread->th.th_team->t.t_set_sched[ thread->th.th_info.ds.ds_tid ].r_sched_type;
+ th_type = thread->th.th_current_task->td_icvs.sched.r_sched_type;
switch ( th_type ) {
case kmp_sch_static:
@@ -3446,8 +2432,8 @@ __kmp_get_schedule( int gtid, kmp_sched_t * kind, int * chunk )
KMP_FATAL( UnknownSchedulingType, th_type );
}
- //*chunk = thread -> th.th_team -> t.t_set_sched[ thread->th.th_info.ds.ds_tid ].chunk;
- *chunk = thread -> th.th_current_task -> td_icvs.sched.chunk;
+ //*chunk = thread->th.th_team->t.t_set_sched[ thread->th.th_info.ds.ds_tid ].chunk;
+ *chunk = thread->th.th_current_task->td_icvs.sched.chunk;
}
int
@@ -3465,11 +2451,11 @@ __kmp_get_ancestor_thread_num( int gtid, int level ) {
if( level < 0 ) return -1;
thr = __kmp_threads[ gtid ];
team = thr->th.th_team;
- ii = team -> t.t_level;
+ ii = team->t.t_level;
if( level > ii ) return -1;
#if OMP_40_ENABLED
- if( thr->th.th_team_microtask ) {
+ if( thr->th.th_teams_microtask ) {
// AC: we are in teams region where multiple nested teams have same level
int tlevel = thr->th.th_teams_level; // the level of the teams construct
if( level <= tlevel ) { // otherwise usual algorithm works (will not touch the teams)
@@ -3486,25 +2472,25 @@ __kmp_get_ancestor_thread_num( int gtid, int level ) {
if( ii == level ) return __kmp_tid_from_gtid( gtid );
- dd = team -> t.t_serialized;
+ dd = team->t.t_serialized;
level++;
while( ii > level )
{
- for( dd = team -> t.t_serialized; ( dd > 0 ) && ( ii > level ); dd--, ii-- )
+ for( dd = team->t.t_serialized; ( dd > 0 ) && ( ii > level ); dd--, ii-- )
{
}
- if( ( team -> t.t_serialized ) && ( !dd ) ) {
+ if( ( team->t.t_serialized ) && ( !dd ) ) {
team = team->t.t_parent;
continue;
}
if( ii > level ) {
team = team->t.t_parent;
- dd = team -> t.t_serialized;
+ dd = team->t.t_serialized;
ii--;
}
}
- return ( dd > 1 ) ? ( 0 ) : ( team -> t.t_master_tid );
+ return ( dd > 1 ) ? ( 0 ) : ( team->t.t_master_tid );
}
int
@@ -3522,11 +2508,11 @@ __kmp_get_team_size( int gtid, int level ) {
if( level < 0 ) return -1;
thr = __kmp_threads[ gtid ];
team = thr->th.th_team;
- ii = team -> t.t_level;
+ ii = team->t.t_level;
if( level > ii ) return -1;
#if OMP_40_ENABLED
- if( thr->th.th_team_microtask ) {
+ if( thr->th.th_teams_microtask ) {
// AC: we are in teams region where multiple nested teams have same level
int tlevel = thr->th.th_teams_level; // the level of the teams construct
if( level <= tlevel ) { // otherwise usual algorithm works (will not touch the teams)
@@ -3543,10 +2529,10 @@ __kmp_get_team_size( int gtid, int level ) {
while( ii > level )
{
- for( dd = team -> t.t_serialized; ( dd > 0 ) && ( ii > level ); dd--, ii-- )
+ for( dd = team->t.t_serialized; ( dd > 0 ) && ( ii > level ); dd--, ii-- )
{
}
- if( team -> t.t_serialized && ( !dd ) ) {
+ if( team->t.t_serialized && ( !dd ) ) {
team = team->t.t_parent;
continue;
}
@@ -3556,11 +2542,9 @@ __kmp_get_team_size( int gtid, int level ) {
}
}
- return team -> t.t_nproc;
+ return team->t.t_nproc;
}
-#endif // OMP_30_ENABLED
-
kmp_r_sched_t
__kmp_get_schedule_global() {
// This routine created because pairs (__kmp_sched, __kmp_chunk) and (__kmp_static, __kmp_guided)
@@ -3601,21 +2585,20 @@ __kmp_alloc_argv_entries( int argc, kmp_team_t *team, int realloc )
{
KMP_DEBUG_ASSERT( team );
- if( !realloc || argc > team -> t.t_max_argc ) {
+ if( !realloc || argc > team->t.t_max_argc ) {
KA_TRACE( 100, ( "__kmp_alloc_argv_entries: team %d: needed entries=%d, current entries=%d\n",
team->t.t_id, argc, ( realloc ) ? team->t.t_max_argc : 0 ));
-#if (KMP_PERF_V106 == KMP_ON)
/* if previously allocated heap space for args, free them */
- if ( realloc && team -> t.t_argv != &team -> t.t_inline_argv[0] )
- __kmp_free( (void *) team -> t.t_argv );
+ if ( realloc && team->t.t_argv != &team->t.t_inline_argv[0] )
+ __kmp_free( (void *) team->t.t_argv );
if ( argc <= KMP_INLINE_ARGV_ENTRIES ) {
/* use unused space in the cache line for arguments */
- team -> t.t_max_argc = KMP_INLINE_ARGV_ENTRIES;
+ team->t.t_max_argc = KMP_INLINE_ARGV_ENTRIES;
KA_TRACE( 100, ( "__kmp_alloc_argv_entries: team %d: inline allocate %d argv entries\n",
team->t.t_id, team->t.t_max_argc ));
- team -> t.t_argv = &team -> t.t_inline_argv[0];
+ team->t.t_argv = &team->t.t_inline_argv[0];
if ( __kmp_storage_map ) {
__kmp_print_storage_map_gtid( -1, &team->t.t_inline_argv[0],
&team->t.t_inline_argv[KMP_INLINE_ARGV_ENTRIES],
@@ -3625,31 +2608,17 @@ __kmp_alloc_argv_entries( int argc, kmp_team_t *team, int realloc )
}
} else {
/* allocate space for arguments in the heap */
- team -> t.t_max_argc = ( argc <= (KMP_MIN_MALLOC_ARGV_ENTRIES >> 1 )) ?
+ team->t.t_max_argc = ( argc <= (KMP_MIN_MALLOC_ARGV_ENTRIES >> 1 )) ?
KMP_MIN_MALLOC_ARGV_ENTRIES : 2 * argc;
KA_TRACE( 100, ( "__kmp_alloc_argv_entries: team %d: dynamic allocate %d argv entries\n",
team->t.t_id, team->t.t_max_argc ));
- team -> t.t_argv = (void**) __kmp_page_allocate( sizeof(void*) * team->t.t_max_argc );
+ team->t.t_argv = (void**) __kmp_page_allocate( sizeof(void*) * team->t.t_max_argc );
if ( __kmp_storage_map ) {
__kmp_print_storage_map_gtid( -1, &team->t.t_argv[0], &team->t.t_argv[team->t.t_max_argc],
sizeof(void *) * team->t.t_max_argc, "team_%d.t_argv",
team->t.t_id );
}
}
-#else /* KMP_PERF_V106 == KMP_OFF */
- if ( realloc )
- __kmp_free( (void*) team -> t.t_argv );
- team -> t.t_max_argc = ( argc <= (KMP_MIN_MALLOC_ARGV_ENTRIES >> 1 )) ?
- KMP_MIN_MALLOC_ARGV_ENTRIES : 2 * argc;
- KA_TRACE( 100, ( "__kmp_alloc_argv_entries: team %d: dynamic allocate %d argv entries\n",
- team->t.t_id, team->t.t_max_argc ));
- team -> t.t_argv = __kmp_page_allocate( sizeof(void*) * team->t.t_max_argc );
- if ( __kmp_storage_map ) {
- __kmp_print_storage_map_gtid( -1, &team->t.t_argv[0], &team->t.t_argv[team->t.t_max_argc],
- sizeof(void *) * team->t.t_max_argc, "team_%d.t_argv", team->t.t_id );
- }
-#endif /* KMP_PERF_V106 */
-
}
}
@@ -3663,55 +2632,41 @@ __kmp_allocate_team_arrays(kmp_team_t *team, int max_nth)
char *ptr = __kmp_allocate(max_nth *
( sizeof(kmp_info_t*) + sizeof(dispatch_shared_info_t)*num_disp_buf
+ sizeof(kmp_disp_t) + sizeof(int)*6
-# if OMP_30_ENABLED
//+ sizeof(int)
+ sizeof(kmp_r_sched_t)
- + sizeof(kmp_taskdata_t)
-# endif // OMP_30_ENABLED
- ) );
+ + sizeof(kmp_taskdata_t) ) );
- team -> t.t_threads = (kmp_info_t**) ptr; ptr += sizeof(kmp_info_t*) * max_nth;
- team -> t.t_disp_buffer = (dispatch_shared_info_t*) ptr;
+ team->t.t_threads = (kmp_info_t**) ptr; ptr += sizeof(kmp_info_t*) * max_nth;
+ team->t.t_disp_buffer = (dispatch_shared_info_t*) ptr;
ptr += sizeof(dispatch_shared_info_t) * num_disp_buff;
- team -> t.t_dispatch = (kmp_disp_t*) ptr; ptr += sizeof(kmp_disp_t) * max_nth;
- team -> t.t_set_nproc = (int*) ptr; ptr += sizeof(int) * max_nth;
- team -> t.t_set_dynamic = (int*) ptr; ptr += sizeof(int) * max_nth;
- team -> t.t_set_nested = (int*) ptr; ptr += sizeof(int) * max_nth;
- team -> t.t_set_blocktime = (int*) ptr; ptr += sizeof(int) * max_nth;
- team -> t.t_set_bt_intervals = (int*) ptr; ptr += sizeof(int) * max_nth;
- team -> t.t_set_bt_set = (int*) ptr;
-# if OMP_30_ENABLED
+ team->t.t_dispatch = (kmp_disp_t*) ptr; ptr += sizeof(kmp_disp_t) * max_nth;
+ team->t.t_set_nproc = (int*) ptr; ptr += sizeof(int) * max_nth;
+ team->t.t_set_dynamic = (int*) ptr; ptr += sizeof(int) * max_nth;
+ team->t.t_set_nested = (int*) ptr; ptr += sizeof(int) * max_nth;
+ team->t.t_set_blocktime = (int*) ptr; ptr += sizeof(int) * max_nth;
+ team->t.t_set_bt_intervals = (int*) ptr; ptr += sizeof(int) * max_nth;
+ team->t.t_set_bt_set = (int*) ptr;
ptr += sizeof(int) * max_nth;
- //team -> t.t_set_max_active_levels = (int*) ptr; ptr += sizeof(int) * max_nth;
- team -> t.t_set_sched = (kmp_r_sched_t*) ptr;
+ //team->t.t_set_max_active_levels = (int*) ptr; ptr += sizeof(int) * max_nth;
+ team->t.t_set_sched = (kmp_r_sched_t*) ptr;
ptr += sizeof(kmp_r_sched_t) * max_nth;
- team -> t.t_implicit_task_taskdata = (kmp_taskdata_t*) ptr;
+ team->t.t_implicit_task_taskdata = (kmp_taskdata_t*) ptr;
ptr += sizeof(kmp_taskdata_t) * max_nth;
-# endif // OMP_30_ENABLED
#else
- team -> t.t_threads = (kmp_info_t**) __kmp_allocate( sizeof(kmp_info_t*) * max_nth );
- team -> t.t_disp_buffer = (dispatch_shared_info_t*)
+ team->t.t_threads = (kmp_info_t**) __kmp_allocate( sizeof(kmp_info_t*) * max_nth );
+ team->t.t_disp_buffer = (dispatch_shared_info_t*)
__kmp_allocate( sizeof(dispatch_shared_info_t) * num_disp_buff );
- team -> t.t_dispatch = (kmp_disp_t*) __kmp_allocate( sizeof(kmp_disp_t) * max_nth );
- #if OMP_30_ENABLED
- //team -> t.t_set_max_active_levels = (int*) __kmp_allocate( sizeof(int) * max_nth );
- //team -> t.t_set_sched = (kmp_r_sched_t*) __kmp_allocate( sizeof(kmp_r_sched_t) * max_nth );
- team -> t.t_implicit_task_taskdata = (kmp_taskdata_t*) __kmp_allocate( sizeof(kmp_taskdata_t) * max_nth );
- #else
- team -> t.t_set_nproc = (int*) __kmp_allocate( sizeof(int) * max_nth );
- team -> t.t_set_dynamic = (int*) __kmp_allocate( sizeof(int) * max_nth );
- team -> t.t_set_nested = (int*) __kmp_allocate( sizeof(int) * max_nth );
- team -> t.t_set_blocktime = (int*) __kmp_allocate( sizeof(int) * max_nth );
- team -> t.t_set_bt_intervals = (int*) __kmp_allocate( sizeof(int) * max_nth );
- team -> t.t_set_bt_set = (int*) __kmp_allocate( sizeof(int) * max_nth );
-# endif // OMP_30_ENABLED
+ team->t.t_dispatch = (kmp_disp_t*) __kmp_allocate( sizeof(kmp_disp_t) * max_nth );
+ //team->t.t_set_max_active_levels = (int*) __kmp_allocate( sizeof(int) * max_nth );
+ //team->t.t_set_sched = (kmp_r_sched_t*) __kmp_allocate( sizeof(kmp_r_sched_t) * max_nth );
+ team->t.t_implicit_task_taskdata = (kmp_taskdata_t*) __kmp_allocate( sizeof(kmp_taskdata_t) * max_nth );
#endif
team->t.t_max_nproc = max_nth;
/* setup dispatch buffers */
for(i = 0 ; i < num_disp_buff; ++i)
- team -> t.t_disp_buffer[i].buffer_index = i;
+ team->t.t_disp_buffer[i].buffer_index = i;
}
static void
@@ -3728,34 +2683,16 @@ __kmp_free_team_arrays(kmp_team_t *team) {
#if !KMP_USE_POOLED_ALLOC
__kmp_free(team->t.t_disp_buffer);
__kmp_free(team->t.t_dispatch);
- #if OMP_30_ENABLED
//__kmp_free(team->t.t_set_max_active_levels);
//__kmp_free(team->t.t_set_sched);
__kmp_free(team->t.t_implicit_task_taskdata);
- #else
- __kmp_free(team->t.t_set_nproc);
- __kmp_free(team->t.t_set_dynamic);
- __kmp_free(team->t.t_set_nested);
- __kmp_free(team->t.t_set_blocktime);
- __kmp_free(team->t.t_set_bt_intervals);
- __kmp_free(team->t.t_set_bt_set);
- # endif // OMP_30_ENABLED
#endif
team->t.t_threads = NULL;
team->t.t_disp_buffer = NULL;
team->t.t_dispatch = NULL;
-#if OMP_30_ENABLED
//team->t.t_set_sched = 0;
//team->t.t_set_max_active_levels = 0;
team->t.t_implicit_task_taskdata = 0;
-#else
- team->t.t_set_nproc = 0;
- team->t.t_set_dynamic = 0;
- team->t.t_set_nested = 0;
- team->t.t_set_blocktime = 0;
- team->t.t_set_bt_intervals = 0;
- team->t.t_set_bt_set = 0;
-#endif // OMP_30_ENABLED
}
static void
@@ -3765,18 +2702,9 @@ __kmp_reallocate_team_arrays(kmp_team_t *team, int max_nth) {
#if !KMP_USE_POOLED_ALLOC
__kmp_free(team->t.t_disp_buffer);
__kmp_free(team->t.t_dispatch);
- #if OMP_30_ENABLED
//__kmp_free(team->t.t_set_max_active_levels);
//__kmp_free(team->t.t_set_sched);
__kmp_free(team->t.t_implicit_task_taskdata);
- #else
- __kmp_free(team->t.t_set_nproc);
- __kmp_free(team->t.t_set_dynamic);
- __kmp_free(team->t.t_set_nested);
- __kmp_free(team->t.t_set_blocktime);
- __kmp_free(team->t.t_set_bt_intervals);
- __kmp_free(team->t.t_set_bt_set);
- # endif // OMP_30_ENABLED
#endif
__kmp_allocate_team_arrays(team, max_nth);
@@ -3788,9 +2716,7 @@ __kmp_reallocate_team_arrays(kmp_team_t *team, int max_nth) {
static kmp_internal_control_t
__kmp_get_global_icvs( void ) {
-#if OMP_30_ENABLED
kmp_r_sched_t r_sched = __kmp_get_schedule_global(); // get current state of scheduling globals
-#endif /* OMP_30_ENABLED */
#if OMP_40_ENABLED
KMP_DEBUG_ASSERT( __kmp_nested_proc_bind.used > 0 );
@@ -3798,18 +2724,15 @@ __kmp_get_global_icvs( void ) {
kmp_internal_control_t g_icvs = {
0, //int serial_nesting_level; //corresponds to the value of the th_team_serialized field
- __kmp_dflt_nested, //int nested; //internal control for nested parallelism (per thread)
- __kmp_global.g.g_dynamic, //internal control for dynamic adjustment of threads (per thread)
- __kmp_dflt_team_nth,
- //int nproc; //internal control for # of threads for next parallel region (per thread)
- // (use a max ub on value if __kmp_parallel_initialize not called yet)
+ (kmp_int8)__kmp_dflt_nested, //int nested; //internal control for nested parallelism (per thread)
+ (kmp_int8)__kmp_global.g.g_dynamic, //internal control for dynamic adjustment of threads (per thread)
+ (kmp_int8)__kmp_env_blocktime, //int bt_set; //internal control for whether blocktime is explicitly set
__kmp_dflt_blocktime, //int blocktime; //internal control for blocktime
__kmp_bt_intervals, //int bt_intervals; //internal control for blocktime intervals
- __kmp_env_blocktime, //int bt_set; //internal control for whether blocktime is explicitly set
-#if OMP_30_ENABLED
+ __kmp_dflt_team_nth, //int nproc; //internal control for # of threads for next parallel region (per thread)
+ // (use a max ub on value if __kmp_parallel_initialize not called yet)
__kmp_dflt_max_active_levels, //int max_active_levels; //internal control for max_active_levels
r_sched, //kmp_r_sched_t sched; //internal control for runtime schedule {sched,chunk} pair
-#endif /* OMP_30_ENABLED */
#if OMP_40_ENABLED
__kmp_nested_proc_bind.bind_types[0],
#endif /* OMP_40_ENABLED */
@@ -3822,24 +2745,10 @@ __kmp_get_global_icvs( void ) {
static kmp_internal_control_t
__kmp_get_x_global_icvs( const kmp_team_t *team ) {
- #if OMP_30_ENABLED
kmp_internal_control_t gx_icvs;
gx_icvs.serial_nesting_level = 0; // probably =team->t.t_serial like in save_inter_controls
copy_icvs( & gx_icvs, & team->t.t_threads[0]->th.th_current_task->td_icvs );
gx_icvs.next = NULL;
- #else
- kmp_internal_control_t gx_icvs =
- {
- 0,
- team->t.t_set_nested[0],
- team->t.t_set_dynamic[0],
- team->t.t_set_nproc[0],
- team->t.t_set_blocktime[0],
- team->t.t_set_bt_intervals[0],
- team->t.t_set_bt_set[0],
- NULL //struct kmp_internal_control *next;
- };
- #endif // OMP_30_ENABLED
return gx_icvs;
}
@@ -3852,20 +2761,18 @@ __kmp_initialize_root( kmp_root_t *root )
kmp_team_t *hot_team;
size_t disp_size, dispatch_size, bar_size;
int hot_team_max_nth;
-#if OMP_30_ENABLED
kmp_r_sched_t r_sched = __kmp_get_schedule_global(); // get current state of scheduling globals
kmp_internal_control_t r_icvs = __kmp_get_global_icvs();
-#endif // OMP_30_ENABLED
KMP_DEBUG_ASSERT( root );
KMP_ASSERT( ! root->r.r_begin );
/* setup the root state structure */
__kmp_init_lock( &root->r.r_begin_lock );
- root -> r.r_begin = FALSE;
- root -> r.r_active = FALSE;
- root -> r.r_in_parallel = 0;
- root -> r.r_blocktime = __kmp_dflt_blocktime;
- root -> r.r_nested = __kmp_dflt_nested;
+ root->r.r_begin = FALSE;
+ root->r.r_active = FALSE;
+ root->r.r_in_parallel = 0;
+ root->r.r_blocktime = __kmp_dflt_blocktime;
+ root->r.r_nested = __kmp_dflt_nested;
/* setup the root team for this task */
/* allocate the root team structure */
@@ -3878,33 +2785,23 @@ __kmp_initialize_root( kmp_root_t *root )
#if OMP_40_ENABLED
__kmp_nested_proc_bind.bind_types[0],
#endif
-#if OMP_30_ENABLED
&r_icvs,
-#else
- __kmp_dflt_team_nth_ub, // num_treads
- __kmp_global.g.g_dynamic, // dynamic
- __kmp_dflt_nested, // nested
- __kmp_dflt_blocktime, // blocktime
- __kmp_bt_intervals, // bt_intervals
- __kmp_env_blocktime, // bt_set
-#endif // OMP_30_ENABLED
0 // argc
+ USE_NESTED_HOT_ARG(NULL) // master thread is unknown
);
KF_TRACE( 10, ( "__kmp_initialize_root: after root_team = %p\n", root_team ) );
- root -> r.r_root_team = root_team;
- root_team -> t.t_control_stack_top = NULL;
+ root->r.r_root_team = root_team;
+ root_team->t.t_control_stack_top = NULL;
/* initialize root team */
- root_team -> t.t_threads[0] = NULL;
- root_team -> t.t_nproc = 1;
- root_team -> t.t_serialized = 1;
-#if OMP_30_ENABLED
- // TODO???: root_team -> t.t_max_active_levels = __kmp_dflt_max_active_levels;
- root_team -> t.t_sched.r_sched_type = r_sched.r_sched_type;
- root_team -> t.t_sched.chunk = r_sched.chunk;
-#endif // OMP_30_ENABLED
+ root_team->t.t_threads[0] = NULL;
+ root_team->t.t_nproc = 1;
+ root_team->t.t_serialized = 1;
+ // TODO???: root_team->t.t_max_active_levels = __kmp_dflt_max_active_levels;
+ root_team->t.t_sched.r_sched_type = r_sched.r_sched_type;
+ root_team->t.t_sched.chunk = r_sched.chunk;
KA_TRACE( 20, ("__kmp_initialize_root: init root team %d arrived: join=%u, plain=%u\n",
root_team->t.t_id, KMP_INIT_BARRIER_STATE, KMP_INIT_BARRIER_STATE ));
@@ -3919,39 +2816,29 @@ __kmp_initialize_root( kmp_root_t *root )
#if OMP_40_ENABLED
__kmp_nested_proc_bind.bind_types[0],
#endif
-#if OMP_30_ENABLED
&r_icvs,
-#else
- __kmp_dflt_team_nth_ub, // num_treads
- __kmp_global.g.g_dynamic, // dynamic
- __kmp_dflt_nested, // nested
- __kmp_dflt_blocktime, // blocktime
- __kmp_bt_intervals, // bt_intervals
- __kmp_env_blocktime, // bt_set
-#endif // OMP_30_ENABLED
0 // argc
+ USE_NESTED_HOT_ARG(NULL) // master thread is unknown
);
KF_TRACE( 10, ( "__kmp_initialize_root: after hot_team = %p\n", hot_team ) );
- root -> r.r_hot_team = hot_team;
- root_team -> t.t_control_stack_top = NULL;
+ root->r.r_hot_team = hot_team;
+ root_team->t.t_control_stack_top = NULL;
/* first-time initialization */
- hot_team -> t.t_parent = root_team;
+ hot_team->t.t_parent = root_team;
/* initialize hot team */
hot_team_max_nth = hot_team->t.t_max_nproc;
for ( f = 0; f < hot_team_max_nth; ++ f ) {
- hot_team -> t.t_threads[ f ] = NULL;
+ hot_team->t.t_threads[ f ] = NULL;
}; // for
- hot_team -> t.t_nproc = 1;
-#if OMP_30_ENABLED
- // TODO???: hot_team -> t.t_max_active_levels = __kmp_dflt_max_active_levels;
- hot_team -> t.t_sched.r_sched_type = r_sched.r_sched_type;
- hot_team -> t.t_sched.chunk = r_sched.chunk;
-#endif // OMP_30_ENABLED
+ hot_team->t.t_nproc = 1;
+ // TODO???: hot_team->t.t_max_active_levels = __kmp_dflt_max_active_levels;
+ hot_team->t.t_sched.r_sched_type = r_sched.r_sched_type;
+ hot_team->t.t_sched.chunk = r_sched.chunk;
#if KMP_MIC
- hot_team -> t.t_size_changed = 0;
+ hot_team->t.t_size_changed = 0;
#endif
}
@@ -4041,7 +2928,7 @@ __kmp_print_structure_thread(
}; // if
}
-static void
+void
__kmp_print_structure(
void
) {
@@ -4185,10 +3072,10 @@ static const unsigned __kmp_primes[] = {
unsigned short
__kmp_get_random( kmp_info_t * thread )
{
- unsigned x = thread -> th.th_x;
+ unsigned x = thread->th.th_x;
unsigned short r = x>>16;
- thread -> th.th_x = x*thread->th.th_a+1;
+ thread->th.th_x = x*thread->th.th_a+1;
KA_TRACE(30, ("__kmp_get_random: THREAD: %d, RETURN: %u\n",
thread->th.th_info.ds.ds_tid, r) );
@@ -4203,9 +3090,9 @@ __kmp_init_random( kmp_info_t * thread )
{
unsigned seed = thread->th.th_info.ds.ds_tid;
- thread -> th.th_a = __kmp_primes[seed%(sizeof(__kmp_primes)/sizeof(__kmp_primes[0]))];
- thread -> th.th_x = (seed+1)*thread->th.th_a+1;
- KA_TRACE(30, ("__kmp_init_random: THREAD: %u; A: %u\n", seed, thread -> th.th_a) );
+ thread->th.th_a = __kmp_primes[seed%(sizeof(__kmp_primes)/sizeof(__kmp_primes[0]))];
+ thread->th.th_x = (seed+1)*thread->th.th_a+1;
+ KA_TRACE(30, ("__kmp_init_random: THREAD: %u; A: %u\n", seed, thread->th.th_a) );
}
@@ -4430,7 +3317,8 @@ __kmp_register_root( int initial_thread )
/* find an available thread slot */
/* Don't reassign the zero slot since we need that to only be used by initial
thread */
- for( gtid=(initial_thread ? 0 : 1) ; TCR_PTR(__kmp_threads[gtid]) != NULL ; gtid++ );
+ for( gtid=(initial_thread ? 0 : 1) ; TCR_PTR(__kmp_threads[gtid]) != NULL ; gtid++ )
+ ;
KA_TRACE( 1, ("__kmp_register_root: found slot in threads array: T#%d\n", gtid ));
KMP_ASSERT( gtid < __kmp_threads_capacity );
@@ -4475,69 +3363,61 @@ __kmp_register_root( int initial_thread )
__kmp_initialize_root( root );
/* setup new root thread structure */
- if( root -> r.r_uber_thread ) {
- root_thread = root -> r.r_uber_thread;
+ if( root->r.r_uber_thread ) {
+ root_thread = root->r.r_uber_thread;
} else {
root_thread = (kmp_info_t*) __kmp_allocate( sizeof(kmp_info_t) );
if ( __kmp_storage_map ) {
__kmp_print_thread_storage_map( root_thread, gtid );
}
- root_thread -> th.th_info .ds.ds_gtid = gtid;
- root_thread -> th.th_root = root;
+ root_thread->th.th_info .ds.ds_gtid = gtid;
+ root_thread->th.th_root = root;
if( __kmp_env_consistency_check ) {
- root_thread -> th.th_cons = __kmp_allocate_cons_stack( gtid );
+ root_thread->th.th_cons = __kmp_allocate_cons_stack( gtid );
}
#if USE_FAST_MEMORY
__kmp_initialize_fast_memory( root_thread );
#endif /* USE_FAST_MEMORY */
#if KMP_USE_BGET
- KMP_DEBUG_ASSERT( root_thread -> th.th_local.bget_data == NULL );
+ KMP_DEBUG_ASSERT( root_thread->th.th_local.bget_data == NULL );
__kmp_initialize_bget( root_thread );
#endif
__kmp_init_random( root_thread ); // Initialize random number generator
}
/* setup the serial team held in reserve by the root thread */
- if( ! root_thread -> th.th_serial_team ) {
- #if OMP_30_ENABLED
- kmp_internal_control_t r_icvs = __kmp_get_global_icvs();
- #endif // OMP_30_ENABLED
+ if( ! root_thread->th.th_serial_team ) {
+ kmp_internal_control_t r_icvs = __kmp_get_global_icvs();
KF_TRACE( 10, ( "__kmp_register_root: before serial_team\n" ) );
- root_thread -> th.th_serial_team = __kmp_allocate_team( root, 1, 1,
+ root_thread->th.th_serial_team = __kmp_allocate_team( root, 1, 1,
#if OMP_40_ENABLED
proc_bind_default,
#endif
-#if OMP_30_ENABLED
&r_icvs,
-#else
- __kmp_dflt_team_nth_ub,
- __kmp_global.g.g_dynamic,
- __kmp_dflt_nested,
- __kmp_dflt_blocktime,
- __kmp_bt_intervals,
- __kmp_env_blocktime,
-#endif // OMP_30_ENABLED
- 0 );
- }
- KMP_ASSERT( root_thread -> th.th_serial_team );
+ 0 USE_NESTED_HOT_ARG(NULL) );
+ }
+ KMP_ASSERT( root_thread->th.th_serial_team );
KF_TRACE( 10, ( "__kmp_register_root: after serial_team = %p\n",
- root_thread -> th.th_serial_team ) );
+ root_thread->th.th_serial_team ) );
/* drop root_thread into place */
TCW_SYNC_PTR(__kmp_threads[gtid], root_thread);
- root -> r.r_root_team -> t.t_threads[0] = root_thread;
- root -> r.r_hot_team -> t.t_threads[0] = root_thread;
- root_thread -> th.th_serial_team -> t.t_threads[0] = root_thread;
- root_thread -> th.th_serial_team -> t.t_serialized = 0; // AC: the team created in reserve, not for execution (it is unused for now).
- root -> r.r_uber_thread = root_thread;
+ root->r.r_root_team->t.t_threads[0] = root_thread;
+ root->r.r_hot_team ->t.t_threads[0] = root_thread;
+ root_thread->th.th_serial_team->t.t_threads[0] = root_thread;
+ root_thread->th.th_serial_team->t.t_serialized = 0; // AC: the team created in reserve, not for execution (it is unused for now).
+ root->r.r_uber_thread = root_thread;
/* initialize the thread, get it ready to go */
__kmp_initialize_info( root_thread, root->r.r_root_team, 0, gtid );
/* prepare the master thread for get_gtid() */
__kmp_gtid_set_specific( gtid );
+
+ __kmp_itt_thread_name( gtid );
+
#ifdef KMP_TDATA_GTID
__kmp_gtid = gtid;
#endif
@@ -4547,7 +3427,7 @@ __kmp_register_root( int initial_thread )
KA_TRACE( 20, ("__kmp_register_root: T#%d init T#%d(%d:%d) arrived: join=%u, plain=%u\n",
gtid, __kmp_gtid_from_tid( 0, root->r.r_hot_team ),
- root -> r.r_hot_team -> t.t_id, 0, KMP_INIT_BARRIER_STATE,
+ root->r.r_hot_team->t.t_id, 0, KMP_INIT_BARRIER_STATE,
KMP_INIT_BARRIER_STATE ) );
{ // Initialize barrier data.
int b;
@@ -4572,6 +3452,34 @@ __kmp_register_root( int initial_thread )
return gtid;
}
+#if KMP_NESTED_HOT_TEAMS
+static int
+__kmp_free_hot_teams( kmp_root_t *root, kmp_info_t *thr, int level, const int max_level )
+{
+ int i, n, nth;
+ kmp_hot_team_ptr_t *hot_teams = thr->th.th_hot_teams;
+ if( !hot_teams || !hot_teams[level].hot_team ) {
+ return 0;
+ }
+ KMP_DEBUG_ASSERT( level < max_level );
+ kmp_team_t *team = hot_teams[level].hot_team;
+ nth = hot_teams[level].hot_team_nth;
+ n = nth - 1; // master is not freed
+ if( level < max_level - 1 ) {
+ for( i = 0; i < nth; ++i ) {
+ kmp_info_t *th = team->t.t_threads[i];
+ n += __kmp_free_hot_teams( root, th, level + 1, max_level );
+ if( i > 0 && th->th.th_hot_teams ) {
+ __kmp_free( th->th.th_hot_teams );
+ th->th.th_hot_teams = NULL;
+ }
+ }
+ }
+ __kmp_free_team( root, team, NULL );
+ return n;
+}
+#endif
+
/* Resets a root thread and clear its root and hot teams.
Returns the number of __kmp_threads entries directly and indirectly freed.
*/
@@ -4589,10 +3497,21 @@ __kmp_reset_root(int gtid, kmp_root_t *root)
root->r.r_hot_team = NULL;
// __kmp_free_team() does not free hot teams, so we have to clear r_hot_team before call
// to __kmp_free_team().
- __kmp_free_team( root, root_team );
- __kmp_free_team( root, hot_team );
+ __kmp_free_team( root, root_team USE_NESTED_HOT_ARG(NULL) );
+#if KMP_NESTED_HOT_TEAMS
+ if( __kmp_hot_teams_max_level > 1 ) { // need to free nested hot teams and their threads if any
+ for( i = 0; i < hot_team->t.t_nproc; ++i ) {
+ kmp_info_t *th = hot_team->t.t_threads[i];
+ n += __kmp_free_hot_teams( root, th, 1, __kmp_hot_teams_max_level );
+ if( th->th.th_hot_teams ) {
+ __kmp_free( th->th.th_hot_teams );
+ th->th.th_hot_teams = NULL;
+ }
+ }
+ }
+#endif
+ __kmp_free_team( root, hot_team USE_NESTED_HOT_ARG(NULL) );
-#if OMP_30_ENABLED
//
// Before we can reap the thread, we need to make certain that all
// other threads in the teams that had this root as ancestor have stopped trying to steal tasks.
@@ -4600,7 +3519,6 @@ __kmp_reset_root(int gtid, kmp_root_t *root)
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
__kmp_wait_to_unref_task_teams();
}
-#endif /* OMP_30_ENABLED */
#if KMP_OS_WINDOWS
/* Close Handle of root duplicated in __kmp_create_worker (tr #62919) */
@@ -4616,7 +3534,7 @@ __kmp_reset_root(int gtid, kmp_root_t *root)
// We canot put root thread to __kmp_thread_pool, so we have to reap it istead of freeing.
root->r.r_uber_thread = NULL;
/* mark root as no longer in use */
- root -> r.r_begin = FALSE;
+ root->r.r_begin = FALSE;
return n;
}
@@ -4625,10 +3543,9 @@ void
__kmp_unregister_root_current_thread( int gtid )
{
KA_TRACE( 1, ("__kmp_unregister_root_current_thread: enter T#%d\n", gtid ));
- /* This lock should be OK, since unregister_root_current_thread is never called during
- * an abort, only during a normal close. Furthermore, if you have the
- * forkjoin lock, you should never try to get the initz lock.
- */
+ /* this lock should be ok, since unregister_root_current_thread is never called during
+ * and abort, only during a normal close. furthermore, if you have the
+ * forkjoin lock, you should never try to get the initz lock */
__kmp_acquire_bootstrap_lock( &__kmp_forkjoin_lock );
if( TCR_4(__kmp_global.g.g_done) || !__kmp_init_serial ) {
@@ -4681,24 +3598,20 @@ __kmp_unregister_root_other_thread( int gtid )
return r;
}
-#if OMP_30_ENABLED
-
#if KMP_DEBUG
void __kmp_task_info() {
kmp_int32 gtid = __kmp_entry_gtid();
kmp_int32 tid = __kmp_tid_from_gtid( gtid );
kmp_info_t *this_thr = __kmp_threads[ gtid ];
- kmp_team_t *steam = this_thr -> th.th_serial_team;
- kmp_team_t *team = this_thr -> th.th_team;
+ kmp_team_t *steam = this_thr->th.th_serial_team;
+ kmp_team_t *team = this_thr->th.th_team;
__kmp_printf( "__kmp_task_info: gtid=%d tid=%d t_thread=%p team=%p curtask=%p ptask=%p\n",
gtid, tid, this_thr, team, this_thr->th.th_current_task, team->t.t_implicit_task_taskdata[tid].td_parent );
}
#endif // KMP_DEBUG
-#endif // OMP_30_ENABLED
-
/* TODO optimize with one big memclr, take out what isn't needed,
* split responsility to workers as much as possible, and delay
* initialization of features as much as possible */
@@ -4707,14 +3620,14 @@ __kmp_initialize_info( kmp_info_t *this_thr, kmp_team_t *team, int tid, int gtid
{
/* this_thr->th.th_info.ds.ds_gtid is setup in kmp_allocate_thread/create_worker
* this_thr->th.th_serial_team is setup in __kmp_allocate_thread */
-
+ kmp_info_t *master = team->t.t_threads[0];
KMP_DEBUG_ASSERT( this_thr != NULL );
- KMP_DEBUG_ASSERT( this_thr -> th.th_serial_team );
+ KMP_DEBUG_ASSERT( this_thr->th.th_serial_team );
KMP_DEBUG_ASSERT( team );
- KMP_DEBUG_ASSERT( team -> t.t_threads );
- KMP_DEBUG_ASSERT( team -> t.t_dispatch );
- KMP_DEBUG_ASSERT( team -> t.t_threads[0] );
- KMP_DEBUG_ASSERT( team -> t.t_threads[0] -> th.th_root );
+ KMP_DEBUG_ASSERT( team->t.t_threads );
+ KMP_DEBUG_ASSERT( team->t.t_dispatch );
+ KMP_DEBUG_ASSERT( master );
+ KMP_DEBUG_ASSERT( master->th.th_root );
KMP_MB();
@@ -4728,21 +3641,15 @@ __kmp_initialize_info( kmp_info_t *this_thr, kmp_team_t *team, int tid, int gtid
this_thr->th.th_new_place = this_thr->th.th_current_place;
# endif
#endif
- this_thr->th.th_root = team -> t.t_threads[0] -> th.th_root;
+ this_thr->th.th_root = master->th.th_root;
/* setup the thread's cache of the team structure */
- this_thr->th.th_team_nproc = team -> t.t_nproc;
- this_thr->th.th_team_master = team -> t.t_threads[0];
- this_thr->th.th_team_serialized = team -> t.t_serialized;
-#if OMP_40_ENABLED
- this_thr->th.th_team_microtask = team -> t.t_threads[0] -> th.th_team_microtask;
- this_thr->th.th_teams_level = team -> t.t_threads[0] -> th.th_teams_level;
- this_thr->th.th_set_nth_teams = team -> t.t_threads[0] -> th.th_set_nth_teams;
-#endif /* OMP_40_ENABLED */
+ this_thr->th.th_team_nproc = team->t.t_nproc;
+ this_thr->th.th_team_master = master;
+ this_thr->th.th_team_serialized = team->t.t_serialized;
TCW_PTR(this_thr->th.th_sleep_loc, NULL);
-#if OMP_30_ENABLED
- KMP_DEBUG_ASSERT( team -> t.t_implicit_task_taskdata );
+ KMP_DEBUG_ASSERT( team->t.t_implicit_task_taskdata );
this_thr->th.th_task_state = 0;
KF_TRACE( 10, ( "__kmp_initialize_info1: T#%d:%d this_thread=%p curtask=%p\n",
@@ -4753,13 +3660,11 @@ __kmp_initialize_info( kmp_info_t *this_thr, kmp_team_t *team, int tid, int gtid
KF_TRACE( 10, ( "__kmp_initialize_info2: T#%d:%d this_thread=%p curtask=%p\n",
tid, gtid, this_thr, this_thr->th.th_current_task ) );
// TODO: Initialize ICVs from parent; GEH - isn't that already done in __kmp_initialize_team()?
-#endif // OMP_30_ENABLED
/* TODO no worksharing in speculative threads */
- this_thr -> th.th_dispatch = &team -> t.t_dispatch[ tid ];
+ this_thr->th.th_dispatch = &team->t.t_dispatch[ tid ];
this_thr->th.th_local.this_construct = 0;
- this_thr->th.th_local.last_construct = 0;
#ifdef BUILD_TV
this_thr->th.th_local.tv_data = 0;
@@ -4778,7 +3683,7 @@ __kmp_initialize_info( kmp_info_t *this_thr, kmp_team_t *team, int tid, int gtid
/* Initialize dynamic dispatch */
{
- volatile kmp_disp_t *dispatch = this_thr -> th.th_dispatch;
+ volatile kmp_disp_t *dispatch = this_thr->th.th_dispatch;
/*
* Use team max_nproc since this will never change for the team.
*/
@@ -4786,13 +3691,13 @@ __kmp_initialize_info( kmp_info_t *this_thr, kmp_team_t *team, int tid, int gtid
( team->t.t_max_nproc == 1 ? 1 : KMP_MAX_DISP_BUF );
KD_TRACE( 10, ("__kmp_initialize_info: T#%d max_nproc: %d\n", gtid, team->t.t_max_nproc ) );
KMP_ASSERT( dispatch );
- KMP_DEBUG_ASSERT( team -> t.t_dispatch );
+ KMP_DEBUG_ASSERT( team->t.t_dispatch );
KMP_DEBUG_ASSERT( dispatch == &team->t.t_dispatch[ tid ] );
dispatch->th_disp_index = 0;
- if( ! dispatch -> th_disp_buffer ) {
- dispatch -> th_disp_buffer = (dispatch_private_info_t *) __kmp_allocate( disp_size );
+ if( ! dispatch->th_disp_buffer ) {
+ dispatch->th_disp_buffer = (dispatch_private_info_t *) __kmp_allocate( disp_size );
if ( __kmp_storage_map ) {
__kmp_print_storage_map_gtid( gtid, &dispatch->th_disp_buffer[ 0 ],
@@ -4802,14 +3707,14 @@ __kmp_initialize_info( kmp_info_t *this_thr, kmp_team_t *team, int tid, int gtid
gtid, team->t.t_id, gtid );
}
} else {
- memset( & dispatch -> th_disp_buffer[0], '\0', disp_size );
+ memset( & dispatch->th_disp_buffer[0], '\0', disp_size );
}
- dispatch -> th_dispatch_pr_current = 0;
- dispatch -> th_dispatch_sh_current = 0;
+ dispatch->th_dispatch_pr_current = 0;
+ dispatch->th_dispatch_sh_current = 0;
- dispatch -> th_deo_fcn = 0; /* ORDERED */
- dispatch -> th_dxo_fcn = 0; /* END ORDERED */
+ dispatch->th_deo_fcn = 0; /* ORDERED */
+ dispatch->th_dxo_fcn = 0; /* END ORDERED */
}
this_thr->th.th_next_pool = NULL;
@@ -4836,7 +3741,9 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid )
KA_TRACE( 20, ("__kmp_allocate_thread: T#%d\n", __kmp_get_gtid() ));
KMP_DEBUG_ASSERT( root && team );
+#if !KMP_NESTED_HOT_TEAMS
KMP_DEBUG_ASSERT( KMP_MASTER_GTID( __kmp_get_gtid() ));
+#endif
KMP_MB();
/* first, try to get one from the thread pool */
@@ -4857,7 +3764,7 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid )
KA_TRACE( 20, ("__kmp_allocate_thread: T#%d using thread T#%d\n",
__kmp_get_gtid(), new_thr->th.th_info.ds.ds_gtid ));
- KMP_ASSERT( ! new_thr -> th.th_team );
+ KMP_ASSERT( ! new_thr->th.th_team );
KMP_DEBUG_ASSERT( __kmp_nth < __kmp_threads_capacity );
KMP_DEBUG_ASSERT( __kmp_thread_pool_nth >= 0 );
@@ -4877,6 +3784,14 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid )
}
#endif /* KMP_ADJUST_BLOCKTIME */
+#if KMP_DEBUG
+ // If thread entered pool via __kmp_free_thread, wait_flag should != KMP_BARRIER_PARENT_FLAG.
+ int b;
+ kmp_balign_t * balign = new_thr->th.th_bar;
+ for( b = 0; b < bs_last_barrier; ++ b )
+ KMP_DEBUG_ASSERT(balign[b].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
+#endif
+
KF_TRACE( 10, ("__kmp_allocate_thread: T#%d using thread %p T#%d\n",
__kmp_get_gtid(), new_thr, new_thr->th.th_info.ds.ds_gtid ));
@@ -4933,30 +3848,19 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid )
/* add the reserve serialized team, initialized from the team's master thread */
{
- #if OMP_30_ENABLED
kmp_internal_control_t r_icvs = __kmp_get_x_global_icvs( team );
- #endif // OMP_30_ENABLED
KF_TRACE( 10, ( "__kmp_allocate_thread: before th_serial/serial_team\n" ) );
- new_thr -> th.th_serial_team = serial_team =
+ new_thr->th.th_serial_team = serial_team =
(kmp_team_t*) __kmp_allocate_team( root, 1, 1,
#if OMP_40_ENABLED
proc_bind_default,
#endif
-#if OMP_30_ENABLED
&r_icvs,
-#else
- team->t.t_set_nproc[0],
- team->t.t_set_dynamic[0],
- team->t.t_set_nested[0],
- team->t.t_set_blocktime[0],
- team->t.t_set_bt_intervals[0],
- team->t.t_set_bt_set[0],
-#endif // OMP_30_ENABLED
- 0 );
+ 0 USE_NESTED_HOT_ARG(NULL) );
}
KMP_ASSERT ( serial_team );
- serial_team -> t.t_serialized = 0; // AC: the team created in reserve, not for execution (it is unused for now).
- serial_team -> t.t_threads[0] = new_thr;
+ serial_team->t.t_serialized = 0; // AC: the team created in reserve, not for execution (it is unused for now).
+ serial_team->t.t_threads[0] = new_thr;
KF_TRACE( 10, ( "__kmp_allocate_thread: after th_serial/serial_team : new_thr=%p\n",
new_thr ) );
@@ -4968,7 +3872,7 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid )
#endif /* USE_FAST_MEMORY */
#if KMP_USE_BGET
- KMP_DEBUG_ASSERT( new_thr -> th.th_local.bget_data == NULL );
+ KMP_DEBUG_ASSERT( new_thr->th.th_local.bget_data == NULL );
__kmp_initialize_bget( new_thr );
#endif
@@ -4978,11 +3882,14 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid )
KA_TRACE( 20, ("__kmp_allocate_thread: T#%d init go fork=%u, plain=%u\n",
__kmp_get_gtid(), KMP_INIT_BARRIER_STATE, KMP_INIT_BARRIER_STATE ));
- new_thr->th.th_bar[ bs_forkjoin_barrier ].bb.b_go = KMP_INIT_BARRIER_STATE;
- new_thr->th.th_bar[ bs_plain_barrier ].bb.b_go = KMP_INIT_BARRIER_STATE;
- #if KMP_FAST_REDUCTION_BARRIER
- new_thr->th.th_bar[ bs_reduction_barrier ].bb.b_go = KMP_INIT_BARRIER_STATE;
- #endif // KMP_FAST_REDUCTION_BARRIER
+ int b;
+ kmp_balign_t * balign = new_thr->th.th_bar;
+ for(b=0; b<bs_last_barrier; ++b) {
+ balign[b].bb.b_go = KMP_INIT_BARRIER_STATE;
+ balign[b].bb.team = NULL;
+ balign[b].bb.wait_flag = KMP_BARRIER_NOT_WAITING;
+ balign[b].bb.use_oncore_barrier = 0;
+ }
new_thr->th.th_spin_here = FALSE;
new_thr->th.th_next_waiting = 0;
@@ -5051,109 +3958,23 @@ __kmp_allocate_thread( kmp_root_t *root, kmp_team_t *team, int new_tid )
* IF YOU TOUCH THIS ROUTINE, RUN EPCC C SYNCBENCH ON A BIG-IRON MACHINE!!!
*/
static void
-__kmp_reinitialize_team( kmp_team_t *team,
-#if OMP_30_ENABLED
- kmp_internal_control_t *new_icvs, ident_t *loc
-#else
- int new_set_nproc, int new_set_dynamic, int new_set_nested,
- int new_set_blocktime, int new_bt_intervals, int new_bt_set
-#endif
- ) {
+__kmp_reinitialize_team( kmp_team_t *team, kmp_internal_control_t *new_icvs, ident_t *loc ) {
KF_TRACE( 10, ( "__kmp_reinitialize_team: enter this_thread=%p team=%p\n",
team->t.t_threads[0], team ) );
-#if OMP_30_ENABLED
KMP_DEBUG_ASSERT( team && new_icvs);
KMP_DEBUG_ASSERT( ( ! TCR_4(__kmp_init_parallel) ) || new_icvs->nproc );
team->t.t_ident = loc;
-#else
- KMP_DEBUG_ASSERT( team && new_set_nproc );
-#endif // OMP_30_ENABLED
team->t.t_id = KMP_GEN_TEAM_ID();
// Copy ICVs to the master thread's implicit taskdata
-#if OMP_30_ENABLED
- load_icvs(new_icvs);
__kmp_init_implicit_task( loc, team->t.t_threads[0], team, 0, FALSE );
- store_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs, new_icvs);
- sync_icvs();
-# else
- team -> t.t_set_nproc[0] = new_set_nproc;
- team -> t.t_set_dynamic[0] = new_set_dynamic;
- team -> t.t_set_nested[0] = new_set_nested;
- team -> t.t_set_blocktime[0] = new_set_blocktime;
- team -> t.t_set_bt_intervals[0] = new_bt_intervals;
- team -> t.t_set_bt_set[0] = new_bt_set;
-# endif // OMP_30_ENABLED
+ copy_icvs(&team->t.t_implicit_task_taskdata[0].td_icvs, new_icvs);
KF_TRACE( 10, ( "__kmp_reinitialize_team: exit this_thread=%p team=%p\n",
team->t.t_threads[0], team ) );
}
-static void
-__kmp_setup_icv_copy(kmp_team_t * team, int new_nproc,
-#if OMP_30_ENABLED
- kmp_internal_control_t * new_icvs,
- ident_t * loc
-#else
- int new_set_nproc, int new_set_dynamic, int new_set_nested,
- int new_set_blocktime, int new_bt_intervals, int new_bt_set
-#endif // OMP_30_ENABLED
- )
-{
- int f;
-
-#if OMP_30_ENABLED
- KMP_DEBUG_ASSERT( team && new_nproc && new_icvs );
- KMP_DEBUG_ASSERT( ( ! TCR_4(__kmp_init_parallel) ) || new_icvs->nproc );
-#else
- KMP_DEBUG_ASSERT( team && new_nproc && new_set_nproc );
-#endif // OMP_30_ENABLED
-
- // Master thread's copy of the ICVs was set up on the implicit taskdata in __kmp_reinitialize_team.
- // __kmp_fork_call() assumes the master thread's implicit task has this data before this function is called.
-#if KMP_BARRIER_ICV_PULL
- // Copy the ICVs to master's thread structure into th_fixed_icvs (which remains untouched), where all of the
- // worker threads can access them and make their own copies after the barrier.
- load_icvs(new_icvs);
- KMP_DEBUG_ASSERT(team->t.t_threads[0]); // the threads arrays should be allocated at this point
- store_icvs(&team->t.t_threads[0]->th.th_fixed_icvs, new_icvs);
- sync_icvs();
- KF_TRACE(10, ("__kmp_setup_icv_copy: PULL: T#%d this_thread=%p team=%p\n", 0, team->t.t_threads[0], team));
-
-#elif KMP_BARRIER_ICV_PUSH
- // The ICVs will be propagated in the fork barrier, so nothing needs to be done here.
- KF_TRACE(10, ("__kmp_setup_icv_copy: PUSH: T#%d this_thread=%p team=%p\n", 0, team->t.t_threads[0], team));
-
-#else
- // Copy the ICVs to each of the non-master threads. This takes O(nthreads) time.
-# if OMP_30_ENABLED
- load_icvs(new_icvs);
-# endif // OMP_30_ENABLED
- KMP_DEBUG_ASSERT(team->t.t_threads[0]); // the threads arrays should be allocated at this point
- for(f=1 ; f<new_nproc ; f++) { // skip the master thread
-# if OMP_30_ENABLED
- // TODO: GEH - pass in better source location info since usually NULL here
- KF_TRACE( 10, ( "__kmp_setup_icv_copy: LINEAR: T#%d this_thread=%p team=%p\n",
- f, team->t.t_threads[f], team ) );
- __kmp_init_implicit_task( loc, team->t.t_threads[f], team, f, FALSE );
- store_icvs(&team->t.t_implicit_task_taskdata[f].td_icvs, new_icvs);
- KF_TRACE( 10, ( "__kmp_setup_icv_copy: LINEAR: T#%d this_thread=%p team=%p\n",
- f, team->t.t_threads[f], team ) );
-# else
- team -> t.t_set_nproc[f] = new_set_nproc;
- team -> t.t_set_dynamic[f] = new_set_dynamic;
- team -> t.t_set_nested[f] = new_set_nested;
- team -> t.t_set_blocktime[f] = new_set_blocktime;
- team -> t.t_set_bt_intervals[f] = new_bt_intervals;
- team -> t.t_set_bt_set[f] = new_bt_set;
-# endif // OMP_30_ENABLED
- }
-# if OMP_30_ENABLED
- sync_icvs();
-# endif // OMP_30_ENABLED
-#endif // KMP_BARRIER_ICV_PULL
-}
/* initialize the team data structure
* this assumes the t_threads and t_max_nproc are already set
@@ -5162,13 +3983,8 @@ static void
__kmp_initialize_team(
kmp_team_t * team,
int new_nproc,
- #if OMP_30_ENABLED
- kmp_internal_control_t * new_icvs,
- ident_t * loc
- #else
- int new_set_nproc, int new_set_dynamic, int new_set_nested,
- int new_set_blocktime, int new_bt_intervals, int new_bt_set
- #endif // OMP_30_ENABLED
+ kmp_internal_control_t * new_icvs,
+ ident_t * loc
) {
KF_TRACE( 10, ( "__kmp_initialize_team: enter: team=%p\n", team ) );
@@ -5178,53 +3994,43 @@ __kmp_initialize_team(
KMP_DEBUG_ASSERT( team->t.t_threads );
KMP_MB();
- team -> t.t_master_tid = 0; /* not needed */
- /* team -> t.t_master_bar; not needed */
- team -> t.t_serialized = new_nproc > 1 ? 0 : 1;
- team -> t.t_nproc = new_nproc;
+ team->t.t_master_tid = 0; /* not needed */
+ /* team->t.t_master_bar; not needed */
+ team->t.t_serialized = new_nproc > 1 ? 0 : 1;
+ team->t.t_nproc = new_nproc;
- /* team -> t.t_parent = NULL; TODO not needed & would mess up hot team */
- team -> t.t_next_pool = NULL;
- /* memset( team -> t.t_threads, 0, sizeof(kmp_info_t*)*new_nproc ); would mess up hot team */
+ /* team->t.t_parent = NULL; TODO not needed & would mess up hot team */
+ team->t.t_next_pool = NULL;
+ /* memset( team->t.t_threads, 0, sizeof(kmp_info_t*)*new_nproc ); would mess up hot team */
TCW_SYNC_PTR(team->t.t_pkfn, NULL); /* not needed */
- team -> t.t_invoke = NULL; /* not needed */
+ team->t.t_invoke = NULL; /* not needed */
-#if OMP_30_ENABLED
- // TODO???: team -> t.t_max_active_levels = new_max_active_levels;
- team -> t.t_sched = new_icvs->sched;
-#endif // OMP_30_ENABLED
+ // TODO???: team->t.t_max_active_levels = new_max_active_levels;
+ team->t.t_sched = new_icvs->sched;
#if KMP_ARCH_X86 || KMP_ARCH_X86_64
- team -> t.t_fp_control_saved = FALSE; /* not needed */
- team -> t.t_x87_fpu_control_word = 0; /* not needed */
- team -> t.t_mxcsr = 0; /* not needed */
+ team->t.t_fp_control_saved = FALSE; /* not needed */
+ team->t.t_x87_fpu_control_word = 0; /* not needed */
+ team->t.t_mxcsr = 0; /* not needed */
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
- team -> t.t_construct = 0;
- __kmp_init_lock( & team -> t.t_single_lock );
+ team->t.t_construct = 0;
+ __kmp_init_lock( & team->t.t_single_lock );
- team -> t.t_ordered .dt.t_value = 0;
- team -> t.t_master_active = FALSE;
+ team->t.t_ordered .dt.t_value = 0;
+ team->t.t_master_active = FALSE;
- memset( & team -> t.t_taskq, '\0', sizeof( kmp_taskq_t ));
+ memset( & team->t.t_taskq, '\0', sizeof( kmp_taskq_t ));
#ifdef KMP_DEBUG
- team -> t.t_copypriv_data = NULL; /* not necessary, but nice for debugging */
+ team->t.t_copypriv_data = NULL; /* not necessary, but nice for debugging */
#endif
- team -> t.t_copyin_counter = 0; /* for barrier-free copyin implementation */
+ team->t.t_copyin_counter = 0; /* for barrier-free copyin implementation */
- team -> t.t_control_stack_top = NULL;
-
- __kmp_reinitialize_team( team,
-#if OMP_30_ENABLED
- new_icvs, loc
-#else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
-#endif // OMP_30_ENABLED
- );
+ team->t.t_control_stack_top = NULL;
+ __kmp_reinitialize_team( team, new_icvs, loc );
KMP_MB();
KF_TRACE( 10, ( "__kmp_initialize_team: exit: team=%p\n", team ) );
@@ -5330,7 +4136,7 @@ __kmp_partition_places( kmp_team_t *team )
if ( place == last_place ) {
place = first_place;
}
- else if ( place == __kmp_affinity_num_masks - 1) {
+ else if ( place == (int)(__kmp_affinity_num_masks - 1) ) {
place = 0;
}
else {
@@ -5370,7 +4176,7 @@ __kmp_partition_places( kmp_team_t *team )
if ( place == last_place ) {
place = first_place;
}
- else if ( place == __kmp_affinity_num_masks - 1) {
+ else if ( place == (int)(__kmp_affinity_num_masks - 1) ) {
place = 0;
}
else {
@@ -5384,7 +4190,7 @@ __kmp_partition_places( kmp_team_t *team )
if ( place == last_place ) {
place = first_place;
}
- else if ( place == __kmp_affinity_num_masks - 1) {
+ else if ( place == (int)(__kmp_affinity_num_masks - 1) ) {
place = 0;
}
else {
@@ -5433,7 +4239,7 @@ __kmp_partition_places( kmp_team_t *team )
if ( place == last_place ) {
place = first_place;
}
- else if ( place == __kmp_affinity_num_masks - 1) {
+ else if ( place == (int)(__kmp_affinity_num_masks - 1) ) {
place = 0;
}
else {
@@ -5445,7 +4251,7 @@ __kmp_partition_places( kmp_team_t *team )
if ( place == last_place ) {
place = first_place;
}
- else if ( place == __kmp_affinity_num_masks - 1) {
+ else if ( place == (int)(__kmp_affinity_num_masks - 1) ) {
place = 0;
}
else {
@@ -5460,7 +4266,7 @@ __kmp_partition_places( kmp_team_t *team )
if ( place == last_place ) {
place = first_place;
}
- else if ( place == __kmp_affinity_num_masks - 1) {
+ else if ( place == (int)(__kmp_affinity_num_masks - 1) ) {
place = 0;
}
else {
@@ -5499,7 +4305,7 @@ __kmp_partition_places( kmp_team_t *team )
if ( place == last_place ) {
place = first_place;
}
- else if ( place == __kmp_affinity_num_masks - 1) {
+ else if ( place == (int)(__kmp_affinity_num_masks - 1) ) {
place = 0;
}
else {
@@ -5513,7 +4319,7 @@ __kmp_partition_places( kmp_team_t *team )
if ( place == last_place ) {
place = first_place;
}
- else if ( place == __kmp_affinity_num_masks - 1) {
+ else if ( place == (int)(__kmp_affinity_num_masks - 1) ) {
place = 0;
}
else {
@@ -5548,49 +4354,106 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
#if OMP_40_ENABLED
kmp_proc_bind_t new_proc_bind,
#endif
-#if OMP_30_ENABLED
kmp_internal_control_t *new_icvs,
-#else
- int new_set_nproc, int new_set_dynamic, int new_set_nested,
- int new_set_blocktime, int new_bt_intervals, int new_bt_set,
-#endif
- int argc )
+ int argc USE_NESTED_HOT_ARG(kmp_info_t *master) )
{
+ KMP_TIME_BLOCK(KMP_allocate_team);
int f;
kmp_team_t *team;
char *ptr;
size_t size;
+ int use_hot_team = ! root->r.r_active;
KA_TRACE( 20, ("__kmp_allocate_team: called\n"));
KMP_DEBUG_ASSERT( new_nproc >=1 && argc >=0 );
KMP_DEBUG_ASSERT( max_nproc >= new_nproc );
KMP_MB();
- //
- // optimization to use a "hot" team for the top level,
- // as it is usually the same
- //
- if ( ! root->r.r_active && new_nproc > 1 ) {
-
+#if KMP_NESTED_HOT_TEAMS
+ int level;
+ kmp_hot_team_ptr_t *hot_teams;
+ if( master ) {
+ team = master->th.th_team;
+ level = team->t.t_active_level;
+ if( master->th.th_teams_microtask ) { // in teams construct?
+ if( master->th.th_teams_size.nteams > 1 && ( // #teams > 1
+ team->t.t_pkfn == (microtask_t)__kmp_teams_master || // inner fork of the teams
+ master->th.th_teams_level < team->t.t_level ) ) { // or nested parallel inside the teams
+ ++level; // not increment if #teams==1, or for outer fork of the teams; increment otherwise
+ }
+ }
+ hot_teams = master->th.th_hot_teams;
+ if( level < __kmp_hot_teams_max_level && hot_teams && hot_teams[level].hot_team )
+ { // hot team has already been allocated for given level
+ use_hot_team = 1;
+ } else {
+ use_hot_team = 0;
+ }
+ }
+#endif
+ // Optimization to use a "hot" team
+ if( use_hot_team && new_nproc > 1 ) {
KMP_DEBUG_ASSERT( new_nproc == max_nproc );
-
- team = root -> r.r_hot_team;
-
-#if OMP_30_ENABLED && KMP_DEBUG
+#if KMP_NESTED_HOT_TEAMS
+ team = hot_teams[level].hot_team;
+#else
+ team = root->r.r_hot_team;
+#endif
+#if KMP_DEBUG
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
KA_TRACE( 20, ("__kmp_allocate_team: hot team task_team = %p before reinit\n",
- team -> t.t_task_team ));
+ team->t.t_task_team ));
}
#endif
- /* has the number of threads changed? */
- if( team -> t.t_nproc > new_nproc ) {
+ // Has the number of threads changed?
+ /* Let's assume the most common case is that the number of threads is unchanged, and
+ put that case first. */
+ if (team->t.t_nproc == new_nproc) { // Check changes in number of threads
+ KA_TRACE( 20, ("__kmp_allocate_team: reusing hot team\n" ));
+#if KMP_MIC
+ // This case can mean that omp_set_num_threads() was called and the hot team size
+ // was already reduced, so we check the special flag
+ if ( team->t.t_size_changed == -1 ) {
+ team->t.t_size_changed = 1;
+ } else {
+ team->t.t_size_changed = 0;
+ }
+#endif
+
+ // TODO???: team->t.t_max_active_levels = new_max_active_levels;
+ team->t.t_sched = new_icvs->sched;
+
+ __kmp_reinitialize_team( team, new_icvs, root->r.r_uber_thread->th.th_ident );
+
+ KF_TRACE( 10, ("__kmp_allocate_team2: T#%d, this_thread=%p team=%p\n",
+ 0, team->t.t_threads[0], team ) );
+ __kmp_push_current_task_to_thread( team->t.t_threads[ 0 ], team, 0 );
+
+#if OMP_40_ENABLED
+# if KMP_AFFINITY_SUPPORTED
+ if ( team->t.t_proc_bind == new_proc_bind ) {
+ KA_TRACE( 200, ("__kmp_allocate_team: reusing hot team #%d bindings: proc_bind = %d, partition = [%d,%d]\n",
+ team->t.t_id, new_proc_bind, team->t.t_first_place,
+ team->t.t_last_place ) );
+ }
+ else {
+ team->t.t_proc_bind = new_proc_bind;
+ __kmp_partition_places( team );
+ }
+# else
+ if ( team->t.t_proc_bind != new_proc_bind ) {
+ team->t.t_proc_bind = new_proc_bind;
+ }
+# endif /* KMP_AFFINITY_SUPPORTED */
+#endif /* OMP_40_ENABLED */
+ }
+ else if( team->t.t_nproc > new_nproc ) {
KA_TRACE( 20, ("__kmp_allocate_team: decreasing hot team thread count to %d\n", new_nproc ));
#if KMP_MIC
- team -> t.t_size_changed = 1;
+ team->t.t_size_changed = 1;
#endif
-#if OMP_30_ENABLED
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
kmp_task_team_t *task_team = team->t.t_task_team;
if ( ( task_team != NULL ) && TCR_SYNC_4(task_team->tt.tt_active) ) {
@@ -5612,31 +4475,27 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
KMP_DEBUG_ASSERT( task_team == NULL );
}
}
-#endif // OMP_30_ENABLED
-
- /* release the extra threads we don't need any more */
- for( f = new_nproc ; f < team->t.t_nproc ; f++ ) {
- KMP_DEBUG_ASSERT( team->t.t_threads[ f ] );
- __kmp_free_thread( team->t.t_threads[ f ] );
- team -> t.t_threads[ f ] = NULL;
- }
-
- team -> t.t_nproc = new_nproc;
-#if OMP_30_ENABLED
- // TODO???: team -> t.t_max_active_levels = new_max_active_levels;
- team -> t.t_sched = new_icvs->sched;
-#endif
- __kmp_reinitialize_team( team,
-#if OMP_30_ENABLED
- new_icvs, root->r.r_uber_thread->th.th_ident
-#else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
-#endif // OMP_30_ENABLED
- );
-
+#if KMP_NESTED_HOT_TEAMS
+ if( __kmp_hot_teams_mode == 0 ) {
+ // AC: saved number of threads should correspond to team's value in this mode,
+ // can be bigger in mode 1, when hot team has some threads in reserve
+ KMP_DEBUG_ASSERT(hot_teams[level].hot_team_nth == team->t.t_nproc);
+ hot_teams[level].hot_team_nth = new_nproc;
+#endif // KMP_NESTED_HOT_TEAMS
+ /* release the extra threads we don't need any more */
+ for( f = new_nproc ; f < team->t.t_nproc ; f++ ) {
+ KMP_DEBUG_ASSERT( team->t.t_threads[ f ] );
+ __kmp_free_thread( team->t.t_threads[ f ] );
+ team->t.t_threads[ f ] = NULL;
+ }
+#if KMP_NESTED_HOT_TEAMS
+ } // (__kmp_hot_teams_mode == 0)
+#endif // KMP_NESTED_HOT_TEAMS
+ team->t.t_nproc = new_nproc;
+ // TODO???: team->t.t_max_active_levels = new_max_active_levels;
+ team->t.t_sched = new_icvs->sched;
+ __kmp_reinitialize_team( team, new_icvs, root->r.r_uber_thread->th.th_ident );
-#if OMP_30_ENABLED
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
kmp_task_team_t *task_team = team->t.t_task_team;
if ( task_team != NULL ) {
@@ -5646,20 +4505,17 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
task_team->tt.tt_ref_ct = new_nproc - 1;
}
}
-#endif
/* update the remaining threads */
- for( f = 0 ; f < new_nproc ; f++ ) {
- team -> t.t_threads[ f ] -> th.th_team_nproc = team->t.t_nproc;
+ for(f = 0; f < new_nproc; ++f) {
+ team->t.t_threads[f]->th.th_team_nproc = new_nproc;
}
-#if OMP_30_ENABLED
// restore the current task state of the master thread: should be the implicit task
KF_TRACE( 10, ("__kmp_allocate_team: T#%d, this_thread=%p team=%p\n",
0, team->t.t_threads[0], team ) );
- __kmp_push_current_task_to_thread( team -> t.t_threads[ 0 ], team, 0 );
-#endif
+ __kmp_push_current_task_to_thread( team->t.t_threads[ 0 ], team, 0 );
#ifdef KMP_DEBUG
for ( f = 0; f < team->t.t_nproc; f++ ) {
@@ -5674,9 +4530,8 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
__kmp_partition_places( team );
# endif
#endif
-
}
- else if ( team -> t.t_nproc < new_nproc ) {
+ else { // team->t.t_nproc < new_nproc
#if KMP_OS_LINUX && KMP_AFFINITY_SUPPORTED
kmp_affin_mask_t *old_mask;
if ( KMP_AFFINITY_CAPABLE() ) {
@@ -5687,21 +4542,39 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
KA_TRACE( 20, ("__kmp_allocate_team: increasing hot team thread count to %d\n", new_nproc ));
#if KMP_MIC
- team -> t.t_size_changed = 1;
+ team->t.t_size_changed = 1;
#endif
- if(team -> t.t_max_nproc < new_nproc) {
+#if KMP_NESTED_HOT_TEAMS
+ int avail_threads = hot_teams[level].hot_team_nth;
+ if( new_nproc < avail_threads )
+ avail_threads = new_nproc;
+ kmp_info_t **other_threads = team->t.t_threads;
+ for ( f = team->t.t_nproc; f < avail_threads; ++f ) {
+ // Adjust barrier data of reserved threads (if any) of the team
+ // Other data will be set in __kmp_initialize_info() below.
+ int b;
+ kmp_balign_t * balign = other_threads[f]->th.th_bar;
+ for ( b = 0; b < bs_last_barrier; ++ b ) {
+ balign[b].bb.b_arrived = team->t.t_bar[b].b_arrived;
+ KMP_DEBUG_ASSERT(balign[b].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
+ }
+ }
+ if( hot_teams[level].hot_team_nth >= new_nproc ) {
+ // we have all needed threads in reserve, no need to allocate any
+ // this only possible in mode 1, cannot have reserved threads in mode 0
+ KMP_DEBUG_ASSERT(__kmp_hot_teams_mode == 1);
+ team->t.t_nproc = new_nproc; // just get reserved threads involved
+ } else {
+ // we may have some threads in reserve, but not enough
+ team->t.t_nproc = hot_teams[level].hot_team_nth; // get reserved threads involved if any
+ hot_teams[level].hot_team_nth = new_nproc; // adjust hot team max size
+#endif // KMP_NESTED_HOT_TEAMS
+ if(team->t.t_max_nproc < new_nproc) {
/* reallocate larger arrays */
__kmp_reallocate_team_arrays(team, new_nproc);
- __kmp_reinitialize_team( team,
-#if OMP_30_ENABLED
- new_icvs, NULL
-#else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
-#endif // OMP_30_ENABLED
- );
+ __kmp_reinitialize_team( team, new_icvs, NULL );
}
#if KMP_OS_LINUX && KMP_AFFINITY_SUPPORTED
@@ -5729,8 +4602,9 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
{ // Initialize barrier data for new threads.
int b;
kmp_balign_t * balign = new_worker->th.th_bar;
- for ( b = 0; b < bp_last_bar; ++ b ) {
+ for( b = 0; b < bs_last_barrier; ++ b ) {
balign[ b ].bb.b_arrived = team->t.t_bar[ b ].b_arrived;
+ KMP_DEBUG_ASSERT(balign[b].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
}
}
}
@@ -5742,19 +4616,12 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
KMP_CPU_FREE(old_mask);
}
#endif
-
+#if KMP_NESTED_HOT_TEAMS
+ } // end of check of t_nproc vs. new_nproc vs. hot_team_nth
+#endif // KMP_NESTED_HOT_TEAMS
/* make sure everyone is syncronized */
- __kmp_initialize_team( team, new_nproc,
-#if OMP_30_ENABLED
- new_icvs,
- root->r.r_uber_thread->th.th_ident
-#else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
-#endif
- );
+ __kmp_initialize_team( team, new_nproc, new_icvs, root->r.r_uber_thread->th.th_ident );
-#if OMP_30_ENABLED
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
kmp_task_team_t *task_team = team->t.t_task_team;
if ( task_team != NULL ) {
@@ -5764,7 +4631,6 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
task_team->tt.tt_ref_ct = new_nproc - 1;
}
}
-#endif
/* reinitialize the old threads */
for( f = 0 ; f < team->t.t_nproc ; f++ )
@@ -5783,62 +4649,39 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
__kmp_partition_places( team );
# endif
#endif
-
- }
- else {
- KA_TRACE( 20, ("__kmp_allocate_team: reusing hot team\n" ));
-#if KMP_MIC
- // This case can mean that omp_set_num_threads() was called and the hot team size
- // was already reduced, so we check the special flag
- if ( team -> t.t_size_changed == -1 ) {
- team -> t.t_size_changed = 1;
- } else {
- team -> t.t_size_changed = 0;
- }
-#endif
-
-#if OMP_30_ENABLED
- // TODO???: team -> t.t_max_active_levels = new_max_active_levels;
- team -> t.t_sched = new_icvs->sched;
-#endif
-
- __kmp_reinitialize_team( team,
-#if OMP_30_ENABLED
- new_icvs, root->r.r_uber_thread->th.th_ident
-#else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
-#endif // OMP_30_ENABLED
- );
-
-#if OMP_30_ENABLED
- KF_TRACE( 10, ("__kmp_allocate_team2: T#%d, this_thread=%p team=%p\n",
- 0, team->t.t_threads[0], team ) );
- __kmp_push_current_task_to_thread( team -> t.t_threads[ 0 ], team, 0 );
-#endif
+ } // Check changes in number of threads
#if OMP_40_ENABLED
-# if KMP_AFFINITY_SUPPORTED
- if ( team->t.t_proc_bind == new_proc_bind ) {
- KA_TRACE( 200, ("__kmp_allocate_team: reusing hot team #%d bindings: proc_bind = %d, partition = [%d,%d]\n",
- team->t.t_id, new_proc_bind, team->t.t_first_place,
- team->t.t_last_place ) );
- }
- else {
- team->t.t_proc_bind = new_proc_bind;
- __kmp_partition_places( team );
+ kmp_info_t *master = team->t.t_threads[0];
+ if( master->th.th_teams_microtask ) {
+ for( f = 1; f < new_nproc; ++f ) {
+ // propagate teams construct specific info to workers
+ kmp_info_t *thr = team->t.t_threads[f];
+ thr->th.th_teams_microtask = master->th.th_teams_microtask;
+ thr->th.th_teams_level = master->th.th_teams_level;
+ thr->th.th_teams_size = master->th.th_teams_size;
}
-# else
- if ( team->t.t_proc_bind != new_proc_bind ) {
- team->t.t_proc_bind = new_proc_bind;
- }
-# endif /* KMP_AFFINITY_SUPPORTED */
+ }
#endif /* OMP_40_ENABLED */
+#if KMP_NESTED_HOT_TEAMS
+ if( level ) {
+ // Sync task (TODO: and barrier?) state for nested hot teams, not needed for outermost hot team.
+ for( f = 1; f < new_nproc; ++f ) {
+ kmp_info_t *thr = team->t.t_threads[f];
+ thr->th.th_task_state = master->th.th_task_state;
+ int b;
+ kmp_balign_t * balign = thr->th.th_bar;
+ for( b = 0; b < bs_last_barrier; ++ b ) {
+ balign[ b ].bb.b_arrived = team->t.t_bar[ b ].b_arrived;
+ KMP_DEBUG_ASSERT(balign[b].bb.wait_flag != KMP_BARRIER_PARENT_FLAG);
+ }
+ }
}
+#endif // KMP_NESTED_HOT_TEAMS
/* reallocate space for arguments if necessary */
__kmp_alloc_argv_entries( argc, team, TRUE );
- team -> t.t_argc = argc;
+ team->t.t_argc = argc;
//
// The hot team re-uses the previous task team,
// if untouched during the previous release->gather phase.
@@ -5846,10 +4689,10 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
KF_TRACE( 10, ( " hot_team = %p\n", team ) );
-#if OMP_30_ENABLED && KMP_DEBUG
+#if KMP_DEBUG
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
KA_TRACE( 20, ("__kmp_allocate_team: hot team task_team = %p after reinit\n",
- team -> t.t_task_team ));
+ team->t.t_task_team ));
}
#endif
@@ -5868,25 +4711,15 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
__kmp_team_pool = team->t.t_next_pool;
/* setup the team for fresh use */
- __kmp_initialize_team( team, new_nproc,
-#if OMP_30_ENABLED
- new_icvs,
- NULL // TODO: !!!
-#else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
-#endif
- );
+ __kmp_initialize_team( team, new_nproc, new_icvs, NULL );
-#if OMP_30_ENABLED
KA_TRACE( 20, ( "__kmp_allocate_team: setting task_team %p to NULL\n",
&team->t.t_task_team ) );
- team -> t.t_task_team = NULL;
-#endif
+ team->t.t_task_team = NULL;
/* reallocate space for arguments if necessary */
__kmp_alloc_argv_entries( argc, team, TRUE );
- team -> t.t_argc = argc;
+ team->t.t_argc = argc;
KA_TRACE( 20, ("__kmp_allocate_team: team %d init arrived: join=%u, plain=%u\n",
team->t.t_id, KMP_INIT_BARRIER_STATE, KMP_INIT_BARRIER_STATE ));
@@ -5919,28 +4752,18 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
team = (kmp_team_t*) __kmp_allocate( sizeof( kmp_team_t ) );
/* and set it up */
- team -> t.t_max_nproc = max_nproc;
+ team->t.t_max_nproc = max_nproc;
/* NOTE well, for some reason allocating one big buffer and dividing it
* up seems to really hurt performance a lot on the P4, so, let's not use
* this... */
__kmp_allocate_team_arrays( team, max_nproc );
KA_TRACE( 20, ( "__kmp_allocate_team: making a new team\n" ) );
- __kmp_initialize_team( team, new_nproc,
-#if OMP_30_ENABLED
- new_icvs,
- NULL // TODO: !!!
-#else
- new_set_nproc, new_set_dynamic, new_set_nested,
- new_set_blocktime, new_bt_intervals, new_bt_set
-#endif
- );
+ __kmp_initialize_team( team, new_nproc, new_icvs, NULL );
-#if OMP_30_ENABLED
KA_TRACE( 20, ( "__kmp_allocate_team: setting task_team %p to NULL\n",
&team->t.t_task_team ) );
- team -> t.t_task_team = NULL; // to be removed, as __kmp_allocate zeroes memory, no need to duplicate
-#endif
+ team->t.t_task_team = NULL; // to be removed, as __kmp_allocate zeroes memory, no need to duplicate
if ( __kmp_storage_map ) {
__kmp_print_team_storage_map( "team", team, team->t.t_id, new_nproc );
@@ -5948,7 +4771,7 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
/* allocate space for arguments */
__kmp_alloc_argv_entries( argc, team, FALSE );
- team -> t.t_argc = argc;
+ team->t.t_argc = argc;
KA_TRACE( 20, ("__kmp_allocate_team: team %d init arrived: join=%u, plain=%u\n",
team->t.t_id, KMP_INIT_BARRIER_STATE, KMP_INIT_BARRIER_STATE ));
@@ -5976,7 +4799,7 @@ __kmp_allocate_team( kmp_root_t *root, int new_nproc, int max_nproc,
/* free the team. return it to the team pool. release all the threads
* associated with it */
void
-__kmp_free_team( kmp_root_t *root, kmp_team_t *team )
+__kmp_free_team( kmp_root_t *root, kmp_team_t *team USE_NESTED_HOT_ARG(kmp_info_t *master) )
{
int f;
KA_TRACE( 20, ("__kmp_free_team: T#%d freeing team %d\n", __kmp_get_gtid(), team->t.t_id ));
@@ -5987,15 +4810,37 @@ __kmp_free_team( kmp_root_t *root, kmp_team_t *team )
KMP_DEBUG_ASSERT( team->t.t_nproc <= team->t.t_max_nproc );
KMP_DEBUG_ASSERT( team->t.t_threads );
+ int use_hot_team = team == root->r.r_hot_team;
+#if KMP_NESTED_HOT_TEAMS
+ int level;
+ kmp_hot_team_ptr_t *hot_teams;
+ if( master ) {
+ level = team->t.t_active_level - 1;
+ if( master->th.th_teams_microtask ) { // in teams construct?
+ if( master->th.th_teams_size.nteams > 1 ) {
+ ++level; // level was not increased in teams construct for team_of_masters
+ }
+ if( team->t.t_pkfn != (microtask_t)__kmp_teams_master &&
+ master->th.th_teams_level == team->t.t_level ) {
+ ++level; // level was not increased in teams construct for team_of_workers before the parallel
+ } // team->t.t_level will be increased inside parallel
+ }
+ hot_teams = master->th.th_hot_teams;
+ if( level < __kmp_hot_teams_max_level ) {
+ KMP_DEBUG_ASSERT( team == hot_teams[level].hot_team );
+ use_hot_team = 1;
+ }
+ }
+#endif // KMP_NESTED_HOT_TEAMS
+
/* team is done working */
TCW_SYNC_PTR(team->t.t_pkfn, NULL); // Important for Debugging Support Library.
- team -> t.t_copyin_counter = 0; // init counter for possible reuse
+ team->t.t_copyin_counter = 0; // init counter for possible reuse
// Do not reset pointer to parent team to NULL for hot teams.
- /* if we are a nested team, release our threads */
- if( team != root->r.r_hot_team ) {
+ /* if we are non-hot team, release our threads */
+ if( ! use_hot_team ) {
-#if OMP_30_ENABLED
if ( __kmp_tasking_mode != tskm_immediate_exec ) {
kmp_task_team_t *task_team = team->t.t_task_team;
if ( task_team != NULL ) {
@@ -6013,10 +4858,9 @@ __kmp_free_team( kmp_root_t *root, kmp_team_t *team )
team->t.t_task_team = NULL;
}
}
-#endif /* OMP_30_ENABLED */
// Reset pointer to parent team only for non-hot teams.
- team -> t.t_parent = NULL;
+ team->t.t_parent = NULL;
/* free the worker threads */
@@ -6029,7 +4873,7 @@ __kmp_free_team( kmp_root_t *root, kmp_team_t *team )
/* put the team back in the team pool */
/* TODO limit size of team pool, call reap_team if pool too large */
- team -> t.t_next_pool = (kmp_team_t*) __kmp_team_pool;
+ team->t.t_next_pool = (kmp_team_t*) __kmp_team_pool;
__kmp_team_pool = (volatile kmp_team_t*) team;
}
@@ -6041,29 +4885,21 @@ __kmp_free_team( kmp_root_t *root, kmp_team_t *team )
kmp_team_t *
__kmp_reap_team( kmp_team_t *team )
{
- kmp_team_t *next_pool = team -> t.t_next_pool;
+ kmp_team_t *next_pool = team->t.t_next_pool;
KMP_DEBUG_ASSERT( team );
- KMP_DEBUG_ASSERT( team -> t.t_dispatch );
- KMP_DEBUG_ASSERT( team -> t.t_disp_buffer );
- KMP_DEBUG_ASSERT( team -> t.t_threads );
- #if OMP_30_ENABLED
- #else
- KMP_DEBUG_ASSERT( team -> t.t_set_nproc );
- #endif
- KMP_DEBUG_ASSERT( team -> t.t_argv );
+ KMP_DEBUG_ASSERT( team->t.t_dispatch );
+ KMP_DEBUG_ASSERT( team->t.t_disp_buffer );
+ KMP_DEBUG_ASSERT( team->t.t_threads );
+ KMP_DEBUG_ASSERT( team->t.t_argv );
/* TODO clean the threads that are a part of this? */
/* free stuff */
__kmp_free_team_arrays( team );
-#if (KMP_PERF_V106 == KMP_ON)
- if ( team -> t.t_argv != &team -> t.t_inline_argv[0] )
- __kmp_free( (void*) team -> t.t_argv );
-#else
- __kmp_free( (void*) team -> t.t_argv );
-#endif
+ if ( team->t.t_argv != &team->t.t_inline_argv[0] )
+ __kmp_free( (void*) team->t.t_argv );
__kmp_free( team );
KMP_MB();
@@ -6108,6 +4944,15 @@ __kmp_free_thread( kmp_info_t *this_th )
KMP_DEBUG_ASSERT( this_th );
+ // When moving thread to pool, switch thread to wait on own b_go flag, and uninitialized (NULL team).
+ int b;
+ kmp_balign_t *balign = this_th->th.th_bar;
+ for (b=0; b<bs_last_barrier; ++b) {
+ if (balign[b].bb.wait_flag == KMP_BARRIER_PARENT_FLAG)
+ balign[b].bb.wait_flag = KMP_BARRIER_SWITCH_TO_OWN_FLAG;
+ balign[b].bb.team = NULL;
+ }
+
/* put thread back on the free pool */
TCW_PTR(this_th->th.th_team, NULL);
@@ -6170,361 +5015,7 @@ __kmp_free_thread( kmp_info_t *this_th )
KMP_MB();
}
-void
-__kmp_join_barrier( int gtid )
-{
- register kmp_info_t *this_thr = __kmp_threads[ gtid ];
- register kmp_team_t *team;
- register kmp_uint nproc;
- kmp_info_t *master_thread;
- int tid;
- #ifdef KMP_DEBUG
- int team_id;
- #endif /* KMP_DEBUG */
-#if USE_ITT_BUILD
- void * itt_sync_obj = NULL;
- #if USE_ITT_NOTIFY
- if ( __itt_sync_create_ptr || KMP_ITT_DEBUG ) // don't call routine without need
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier ); // get object created at fork_barrier
- #endif
-#endif /* USE_ITT_BUILD */
- KMP_MB();
-
- /* get current info */
- team = this_thr -> th.th_team;
- /* nproc = team -> t.t_nproc;*/
- nproc = this_thr -> th.th_team_nproc;
- KMP_DEBUG_ASSERT( nproc == team->t.t_nproc );
- tid = __kmp_tid_from_gtid(gtid);
- #ifdef KMP_DEBUG
- team_id = team -> t.t_id;
- #endif /* KMP_DEBUG */
- /* master_thread = team -> t.t_threads[0];*/
- master_thread = this_thr -> th.th_team_master;
- #ifdef KMP_DEBUG
- if ( master_thread != team->t.t_threads[0] ) {
- __kmp_print_structure();
- }
- #endif /* KMP_DEBUG */
- KMP_DEBUG_ASSERT( master_thread == team->t.t_threads[0] );
- KMP_MB();
-
- /* verify state */
- KMP_DEBUG_ASSERT( __kmp_threads && __kmp_threads[gtid] );
- KMP_DEBUG_ASSERT( TCR_PTR(this_thr->th.th_team) );
- KMP_DEBUG_ASSERT( TCR_PTR(this_thr->th.th_root) );
- KMP_DEBUG_ASSERT( this_thr == team -> t.t_threads[tid] );
-
- KA_TRACE( 10, ("__kmp_join_barrier: T#%d(%d:%d) arrived at join barrier\n",
- gtid, team_id, tid ));
-
- #if OMP_30_ENABLED
- if ( __kmp_tasking_mode == tskm_extra_barrier ) {
- __kmp_tasking_barrier( team, this_thr, gtid );
-
- KA_TRACE( 10, ("__kmp_join_barrier: T#%d(%d:%d) past taking barrier\n",
- gtid, team_id, tid ));
- }
- #ifdef KMP_DEBUG
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- KA_TRACE( 20, ( "__kmp_join_barrier: T#%d, old team = %d, old task_team = %p, th_task_team = %p\n",
- __kmp_gtid_from_thread( this_thr ), team_id, team -> t.t_task_team,
- this_thr->th.th_task_team ) );
- KMP_DEBUG_ASSERT( this_thr->th.th_task_team == team->t.t_task_team );
- }
- #endif /* KMP_DEBUG */
- #endif /* OMP_30_ENABLED */
-
- //
- // Copy the blocktime info to the thread, where __kmp_wait_sleep()
- // can access it when the team struct is not guaranteed to exist.
- //
- // Doing these loads causes a cache miss slows down EPCC parallel by 2x.
- // As a workaround, we do not perform the copy if blocktime=infinite,
- // since the values are not used by __kmp_wait_sleep() in that case.
- //
- if ( __kmp_dflt_blocktime != KMP_MAX_BLOCKTIME ) {
- #if OMP_30_ENABLED
- this_thr -> th.th_team_bt_intervals = team -> t.t_implicit_task_taskdata[tid].td_icvs.bt_intervals;
- this_thr -> th.th_team_bt_set = team -> t.t_implicit_task_taskdata[tid].td_icvs.bt_set;
- #else
- this_thr -> th.th_team_bt_intervals = team -> t.t_set_bt_intervals[tid];
- this_thr -> th.th_team_bt_set= team -> t.t_set_bt_set[tid];
- #endif // OMP_30_ENABLED
- }
-
-#if USE_ITT_BUILD
- if ( __itt_sync_create_ptr || KMP_ITT_DEBUG )
- __kmp_itt_barrier_starting( gtid, itt_sync_obj );
-#endif /* USE_ITT_BUILD */
-
- if ( __kmp_barrier_gather_pattern[ bs_forkjoin_barrier ] == bp_linear_bar || __kmp_barrier_gather_branch_bits[ bs_forkjoin_barrier ] == 0 ) {
- __kmp_linear_barrier_gather( bs_forkjoin_barrier, this_thr, gtid, tid, NULL
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- } else if ( __kmp_barrier_gather_pattern[ bs_forkjoin_barrier ] == bp_tree_bar ) {
- __kmp_tree_barrier_gather( bs_forkjoin_barrier, this_thr, gtid, tid, NULL
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- } else {
- __kmp_hyper_barrier_gather( bs_forkjoin_barrier, this_thr, gtid, tid, NULL
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- }; // if
-
-#if USE_ITT_BUILD
- if ( __itt_sync_create_ptr || KMP_ITT_DEBUG )
- __kmp_itt_barrier_middle( gtid, itt_sync_obj );
-#endif /* USE_ITT_BUILD */
-
- //
- // From this point on, the team data structure may be deallocated
- // at any time by the master thread - it is unsafe to reference it
- // in any of the worker threads.
- //
- // Any per-team data items that need to be referenced before the end
- // of the barrier should be moved to the kmp_task_team_t structs.
- //
-
- #if OMP_30_ENABLED
- if ( KMP_MASTER_TID( tid ) ) {
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- // Master shouldn't call decrease_load(). // TODO: enable master threads.
- // Master should have th_may_decrease_load == 0. // TODO: enable master threads.
- __kmp_task_team_wait( this_thr, team
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- }
-#if USE_ITT_BUILD && USE_ITT_NOTIFY
- // Join barrier - report frame end
- if( __itt_frame_submit_v3_ptr && __kmp_forkjoin_frames_mode ) {
- kmp_uint64 tmp = __itt_get_timestamp();
- ident_t * loc = team->t.t_ident;
- switch( __kmp_forkjoin_frames_mode ) {
- case 1:
- __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, loc );
- break;
- case 2:
- __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, loc );
- break;
- case 3:
- __kmp_itt_frame_submit( gtid, this_thr->th.th_frame_time, tmp, 0, loc );
- __kmp_itt_frame_submit( gtid, this_thr->th.th_bar_arrive_time, tmp, 1, loc );
- break;
- }
- }
-#endif /* USE_ITT_BUILD */
- }
- #endif /* OMP_30_ENABLED */
-
- #if KMP_DEBUG
- if( KMP_MASTER_TID( tid )) {
- KA_TRACE( 15, ( "__kmp_join_barrier: T#%d(%d:%d) says all %d team threads arrived\n",
- gtid, team_id, tid, nproc ));
- }
- #endif /* KMP_DEBUG */
-
- /* TODO now, mark worker threads as done so they may be disbanded */
-
- KMP_MB(); /* Flush all pending memory write invalidates. */
- KA_TRACE( 10, ("__kmp_join_barrier: T#%d(%d:%d) leaving\n",
- gtid, team_id, tid ));
-}
-
-
-/* TODO release worker threads' fork barriers as we are ready instead of all at once */
-
-void
-__kmp_fork_barrier( int gtid, int tid )
-{
- kmp_info_t *this_thr = __kmp_threads[ gtid ];
- kmp_team_t *team = ( tid == 0 ) ? this_thr -> th.th_team : NULL;
-#if USE_ITT_BUILD
- void * itt_sync_obj = NULL;
-#endif /* USE_ITT_BUILD */
-
- KA_TRACE( 10, ( "__kmp_fork_barrier: T#%d(%d:%d) has arrived\n",
- gtid, ( team != NULL ) ? team->t.t_id : -1, tid ));
-
- /* th_team pointer only valid for master thread here */
- if ( KMP_MASTER_TID( tid ) ) {
-
-#if USE_ITT_BUILD && USE_ITT_NOTIFY
- if ( __itt_sync_create_ptr || KMP_ITT_DEBUG ) {
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier, 1 ); // create itt barrier object
- //__kmp_itt_barrier_starting( gtid, itt_sync_obj ); // AC: no need to call prepare right before acquired
- __kmp_itt_barrier_middle( gtid, itt_sync_obj ); // call acquired / releasing
- }
-#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
-
-#ifdef KMP_DEBUG
-
- register kmp_info_t **other_threads = team -> t.t_threads;
- register int i;
-
- /* verify state */
- KMP_MB();
-
- for( i = 1; i < team -> t.t_nproc ; i++ ) {
- KA_TRACE( 500, ( "__kmp_fork_barrier: T#%d(%d:0) checking T#%d(%d:%d) fork "
- "go == %u.\n",
- gtid, team->t.t_id, other_threads[i]->th.th_info.ds.ds_gtid,
- team->t.t_id, other_threads[i]->th.th_info.ds.ds_tid,
- other_threads[i]->th.th_bar[ bs_forkjoin_barrier ].bb.b_go ) );
-
- KMP_DEBUG_ASSERT( ( TCR_4( other_threads[i]->th.th_bar[bs_forkjoin_barrier].bb.b_go )
- & ~(KMP_BARRIER_SLEEP_STATE) )
- == KMP_INIT_BARRIER_STATE );
- KMP_DEBUG_ASSERT( other_threads[i]->th.th_team == team );
-
- }
-#endif
-
-#if OMP_30_ENABLED
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- __kmp_task_team_setup( this_thr, team );
- }
-#endif /* OMP_30_ENABLED */
-
- //
- // The master thread may have changed its blocktime between the
- // join barrier and the fork barrier.
- //
- // Copy the blocktime info to the thread, where __kmp_wait_sleep()
- // can access it when the team struct is not guaranteed to exist.
- //
- // See the note about the corresponding code in __kmp_join_barrier()
- // being performance-critical.
- //
- if ( __kmp_dflt_blocktime != KMP_MAX_BLOCKTIME ) {
-#if OMP_30_ENABLED
- this_thr -> th.th_team_bt_intervals = team -> t.t_implicit_task_taskdata[tid].td_icvs.bt_intervals;
- this_thr -> th.th_team_bt_set = team -> t.t_implicit_task_taskdata[tid].td_icvs.bt_set;
-#else
- this_thr -> th.th_team_bt_intervals = team -> t.t_set_bt_intervals[tid];
- this_thr -> th.th_team_bt_set= team -> t.t_set_bt_set[tid];
-#endif // OMP_30_ENABLED
- }
- } // master
-
- if ( __kmp_barrier_release_pattern[ bs_forkjoin_barrier ] == bp_linear_bar || __kmp_barrier_release_branch_bits[ bs_forkjoin_barrier ] == 0 ) {
- __kmp_linear_barrier_release( bs_forkjoin_barrier, this_thr, gtid, tid, TRUE
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- } else if ( __kmp_barrier_release_pattern[ bs_forkjoin_barrier ] == bp_tree_bar ) {
- __kmp_tree_barrier_release( bs_forkjoin_barrier, this_thr, gtid, tid, TRUE
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- } else {
- __kmp_hyper_barrier_release( bs_forkjoin_barrier, this_thr, gtid, tid, TRUE
- USE_ITT_BUILD_ARG( itt_sync_obj )
- );
- }; // if
-
- //
- // early exit for reaping threads releasing forkjoin barrier
- //
- if ( TCR_4(__kmp_global.g.g_done) ) {
-
-#if OMP_30_ENABLED
- if ( this_thr->th.th_task_team != NULL ) {
- if ( KMP_MASTER_TID( tid ) ) {
- TCW_PTR(this_thr->th.th_task_team, NULL);
- }
- else {
- __kmp_unref_task_team( this_thr->th.th_task_team, this_thr );
- }
- }
-#endif /* OMP_30_ENABLED */
-
-#if USE_ITT_BUILD && USE_ITT_NOTIFY
- if ( __itt_sync_create_ptr || KMP_ITT_DEBUG ) {
- if ( !KMP_MASTER_TID( tid ) ) {
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier );
- if ( itt_sync_obj )
- __kmp_itt_barrier_finished( gtid, itt_sync_obj );
- }
- }
-#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
- KA_TRACE( 10, ( "__kmp_fork_barrier: T#%d is leaving early\n", gtid ));
- return;
- }
-
- //
- // We can now assume that a valid team structure has been allocated
- // by the master and propagated to all worker threads.
- //
- // The current thread, however, may not be part of the team, so we can't
- // blindly assume that the team pointer is non-null.
- //
- team = (kmp_team_t *)TCR_PTR(this_thr->th.th_team);
- KMP_DEBUG_ASSERT( team != NULL );
- tid = __kmp_tid_from_gtid( gtid );
-
-#if OMP_30_ENABLED
-
-# if KMP_BARRIER_ICV_PULL
- // Master thread's copy of the ICVs was set up on the implicit taskdata in __kmp_reinitialize_team.
- // __kmp_fork_call() assumes the master thread's implicit task has this data before this function is called.
- // We cannot modify __kmp_fork_call() to look at the fixed ICVs in the master's thread struct, because it is
- // not always the case that the threads arrays have been allocated when __kmp_fork_call() is executed.
- if (! KMP_MASTER_TID( tid ) ) { // master thread already has ICVs
- // Copy the initial ICVs from the master's thread struct to the implicit task for this tid.
- KA_TRACE( 10, ( "__kmp_fork_barrier: T#%d(%d) is PULLing ICVs\n", gtid, tid ));
- load_icvs(&team->t.t_threads[0]->th.th_fixed_icvs);
- __kmp_init_implicit_task( team->t.t_ident, team->t.t_threads[tid], team, tid, FALSE );
- store_icvs(&team->t.t_implicit_task_taskdata[tid].td_icvs, &team->t.t_threads[0]->th.th_fixed_icvs);
- sync_icvs();
- }
-# endif // KMP_BARRIER_ICV_PULL
-
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
- __kmp_task_team_sync( this_thr, team );
- }
-
-#endif /* OMP_30_ENABLED */
-
-#if OMP_40_ENABLED && KMP_AFFINITY_SUPPORTED
- kmp_proc_bind_t proc_bind = team->t.t_proc_bind;
- if ( proc_bind == proc_bind_intel ) {
-#endif
-#if KMP_MIC
- //
- // Call dynamic affinity settings
- //
- if( __kmp_affinity_type == affinity_balanced && team->t.t_size_changed ) {
- __kmp_balanced_affinity( tid, team->t.t_nproc );
- }
-#endif
-#if OMP_40_ENABLED && KMP_AFFINITY_SUPPORTED
- }
- else if ( ( proc_bind != proc_bind_false )
- && ( proc_bind != proc_bind_disabled )) {
- if ( this_thr->th.th_new_place == this_thr->th.th_current_place ) {
- KA_TRACE( 100, ( "__kmp_fork_barrier: T#%d already in correct place %d\n",
- __kmp_gtid_from_thread( this_thr ), this_thr->th.th_current_place ) );
- }
- else {
- __kmp_affinity_set_place( gtid );
- }
- }
-#endif
-
-#if USE_ITT_BUILD && USE_ITT_NOTIFY
- if ( __itt_sync_create_ptr || KMP_ITT_DEBUG ) {
- if ( !KMP_MASTER_TID( tid ) ) {
- itt_sync_obj = __kmp_itt_barrier_object( gtid, bs_forkjoin_barrier ); // get correct barrier object
- __kmp_itt_barrier_finished( gtid, itt_sync_obj ); // workers call acquired
- } // (prepare called inside barrier_release)
- }
-#endif /* USE_ITT_BUILD && USE_ITT_NOTIFY */
- KA_TRACE( 10, ( "__kmp_fork_barrier: T#%d(%d:%d) is leaving\n",
- gtid, team->t.t_id, tid ));
-}
-
-
-/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
void *
@@ -6538,7 +5029,7 @@ __kmp_launch_thread( kmp_info_t *this_thr )
KA_TRACE( 10, ("__kmp_launch_thread: T#%d start\n", gtid ) );
if( __kmp_env_consistency_check ) {
- this_thr -> th.th_cons = __kmp_allocate_cons_stack( gtid ); // ATT: Memory leak?
+ this_thr->th.th_cons = __kmp_allocate_cons_stack( gtid ); // ATT: Memory leak?
}
/* This is the place where threads wait for work */
@@ -6559,37 +5050,32 @@ __kmp_launch_thread( kmp_info_t *this_thr )
/* we were just woken up, so run our new task */
if ( TCR_SYNC_PTR((*pteam)->t.t_pkfn) != NULL ) {
int rc;
- KA_TRACE( 20, ("__kmp_launch_thread: T#%d(%d:%d) invoke microtask = %p\n",
- gtid, (*pteam)->t.t_id, __kmp_tid_from_gtid(gtid), (*pteam)->t.t_pkfn ));
+ KA_TRACE(20, ("__kmp_launch_thread: T#%d(%d:%d) invoke microtask = %p\n",
+ gtid, (*pteam)->t.t_id, __kmp_tid_from_gtid(gtid), (*pteam)->t.t_pkfn));
-#if KMP_ARCH_X86 || KMP_ARCH_X86_64
- if ( __kmp_inherit_fp_control && (*pteam)->t.t_fp_control_saved ) {
- __kmp_clear_x87_fpu_status_word();
- __kmp_load_x87_fpu_control_word( &(*pteam)->t.t_x87_fpu_control_word );
- __kmp_load_mxcsr( &(*pteam)->t.t_mxcsr );
- }
-#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
+ updateHWFPControl (*pteam);
- rc = (*pteam) -> t.t_invoke( gtid );
+ KMP_STOP_EXPLICIT_TIMER(USER_launch_thread_loop);
+ {
+ KMP_TIME_BLOCK(USER_worker_invoke);
+ rc = (*pteam)->t.t_invoke( gtid );
+ }
+ KMP_START_EXPLICIT_TIMER(USER_launch_thread_loop);
KMP_ASSERT( rc );
KMP_MB();
- KA_TRACE( 20, ("__kmp_launch_thread: T#%d(%d:%d) done microtask = %p\n",
- gtid, (*pteam)->t.t_id, __kmp_tid_from_gtid(gtid), (*pteam)->t.t_pkfn ));
+ KA_TRACE(20, ("__kmp_launch_thread: T#%d(%d:%d) done microtask = %p\n",
+ gtid, (*pteam)->t.t_id, __kmp_tid_from_gtid(gtid), (*pteam)->t.t_pkfn));
}
-
/* join barrier after parallel region */
__kmp_join_barrier( gtid );
}
}
- TCR_SYNC_PTR(__kmp_global.g.g_done);
+ TCR_SYNC_PTR((intptr_t)__kmp_global.g.g_done);
-#if OMP_30_ENABLED
if ( TCR_PTR( this_thr->th.th_task_team ) != NULL ) {
__kmp_unref_task_team( this_thr->th.th_task_team, this_thr );
}
-#endif /* OMP_30_ENABLED */
-
/* run the destructors for the threadprivate data for this thread */
__kmp_common_destroy_gtid( gtid );
@@ -6601,8 +5087,6 @@ __kmp_launch_thread( kmp_info_t *this_thr )
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
-
-
void
__kmp_internal_end_dest( void *specific_gtid )
{
@@ -6711,11 +5195,8 @@ __kmp_reap_thread(
/* Assume the threads are at the fork barrier here */
KA_TRACE( 20, ("__kmp_reap_thread: releasing T#%d from fork barrier for reap\n", gtid ) );
/* Need release fence here to prevent seg faults for tree forkjoin barrier (GEH) */
- __kmp_release(
- thread,
- &thread->th.th_bar[ bs_forkjoin_barrier ].bb.b_go,
- kmp_release_fence
- );
+ kmp_flag_64 flag(&thread->th.th_bar[ bs_forkjoin_barrier ].bb.b_go, thread);
+ __kmp_release_64(&flag);
}; // if
@@ -6824,7 +5305,7 @@ __kmp_internal_end(void)
for( i=0 ; i<__kmp_threads_capacity ; i++ )
if( __kmp_root[i] )
- if( __kmp_root[i] -> r.r_active )
+ if( __kmp_root[i]->r.r_active )
break;
KMP_MB(); /* Flush all pending memory write invalidates. */
TCW_SYNC_4(__kmp_global.g.g_done, TRUE);
@@ -6857,10 +5338,10 @@ __kmp_internal_end(void)
} else {
/* TODO move this to cleanup code */
#ifdef KMP_DEBUG
- /* Make sure that everything has properly ended */
+ /* make sure that everything has properly ended */
for ( i = 0; i < __kmp_threads_capacity; i++ ) {
if( __kmp_root[i] ) {
-// KMP_ASSERT( ! KMP_UBER_GTID( i ) ); // AC: there can be uber threads alive here
+// KMP_ASSERT( ! KMP_UBER_GTID( i ) ); // AC: there can be uber threads alive here
KMP_ASSERT( ! __kmp_root[i]->r.r_active ); // TODO: can they be active?
}
}
@@ -6891,9 +5372,7 @@ __kmp_internal_end(void)
__kmp_reap_team( team );
}; // while
- #if OMP_30_ENABLED
- __kmp_reap_task_teams( );
- #endif /* OMP_30_ENABLED */
+ __kmp_reap_task_teams( );
for ( i = 0; i < __kmp_threads_capacity; ++ i ) {
// TBD: Add some checking...
@@ -6968,7 +5447,7 @@ __kmp_internal_end_library( int gtid_req )
/* we don't know who we are, but we may still shutdown the library */
} else if( KMP_UBER_GTID( gtid )) {
/* unregister ourselves as an uber thread. gtid is no longer valid */
- if( __kmp_root[gtid] -> r.r_active ) {
+ if( __kmp_root[gtid]->r.r_active ) {
__kmp_global.g.g_abort = -1;
TCW_SYNC_4(__kmp_global.g.g_done, TRUE);
KA_TRACE( 10, ("__kmp_internal_end_library: root still active, abort T#%d\n", gtid ));
@@ -7072,7 +5551,7 @@ __kmp_internal_end_thread( int gtid_req )
/* we don't know who we are */
} else if( KMP_UBER_GTID( gtid )) {
/* unregister ourselves as an uber thread. gtid is no longer valid */
- if( __kmp_root[gtid] -> r.r_active ) {
+ if( __kmp_root[gtid]->r.r_active ) {
__kmp_global.g.g_abort = -1;
TCW_SYNC_4(__kmp_global.g.g_done, TRUE);
KA_TRACE( 10, ("__kmp_internal_end_thread: root still active, abort T#%d\n", gtid ));
@@ -7085,23 +5564,21 @@ __kmp_internal_end_thread( int gtid_req )
/* just a worker thread, let's leave */
KA_TRACE( 10, ("__kmp_internal_end_thread: worker thread T#%d\n", gtid ));
- #if OMP_30_ENABLED
- if ( gtid >= 0 ) {
- kmp_info_t *this_thr = __kmp_threads[ gtid ];
- if (TCR_PTR(this_thr->th.th_task_team) != NULL) {
- __kmp_unref_task_team(this_thr->th.th_task_team, this_thr);
- }
+ if ( gtid >= 0 ) {
+ kmp_info_t *this_thr = __kmp_threads[ gtid ];
+ if (TCR_PTR(this_thr->th.th_task_team) != NULL) {
+ __kmp_unref_task_team(this_thr->th.th_task_team, this_thr);
}
- #endif /* OMP_30_ENABLED */
+ }
KA_TRACE( 10, ("__kmp_internal_end_thread: worker thread done, exiting T#%d\n", gtid ));
return;
}
}
#if defined GUIDEDLL_EXPORTS
- // AC: let's not shutdown the Linux* OS dynamic library at the exit of uber thread,
- // because it is better shutdown later, in the library destructor.
- // The reason for this change is a performance problem when a non-openmp thread
+ // AC: lets not shutdown the Linux* OS dynamic library at the exit of uber thread,
+ // because we will better shutdown later in the library destructor.
+ // The reason of this change is performance problem when non-openmp thread
// in a loop forks and joins many openmp threads. We can save a lot of time
// keeping worker threads alive until the program shutdown.
// OM: Removed Linux* OS restriction to fix the crash on OS X* (DPD200239966) and
@@ -7319,7 +5796,7 @@ __kmp_do_serial_initialize( void )
int i, gtid;
int size;
- KA_TRACE( 10, ("__kmp_serial_initialize: enter\n" ) );
+ KA_TRACE( 10, ("__kmp_do_serial_initialize: enter\n" ) );
KMP_DEBUG_ASSERT( sizeof( kmp_int32 ) == 4 );
KMP_DEBUG_ASSERT( sizeof( kmp_uint32 ) == 4 );
@@ -7404,9 +5881,7 @@ __kmp_do_serial_initialize( void )
__kmp_static = kmp_sch_static_balanced;
// AC: do not use analytical here, because it is non-monotonous
//__kmp_guided = kmp_sch_guided_iterative_chunked;
- #if OMP_30_ENABLED
//__kmp_auto = kmp_sch_guided_analytical_chunked; // AC: it is the default, no need to repeate assignment
- #endif // OMP_30_ENABLED
// Barrier initialization. Moved here from __kmp_env_initialize() Barrier branch bit control and barrier method
// control parts
#if KMP_FAST_REDUCTION_BARRIER
@@ -7436,9 +5911,15 @@ __kmp_do_serial_initialize( void )
#undef kmp_reduction_barrier_gather_bb
#endif // KMP_FAST_REDUCTION_BARRIER
#if KMP_MIC
- // AC: plane=3,2, forkjoin=2,1 are optimal for 240 threads on KNC
- __kmp_barrier_gather_branch_bits [ 0 ] = 3; // plane gather
- __kmp_barrier_release_branch_bits[ 1 ] = 1; // forkjoin release
+ // AC: plane=3,2, forkjoin=2,1 are optimal for 240 threads on KNC
+ __kmp_barrier_gather_branch_bits [ bs_plain_barrier ] = 3; // plane gather
+ __kmp_barrier_release_branch_bits[ bs_forkjoin_barrier ] = 1; // forkjoin release
+ __kmp_barrier_gather_pattern [ bs_forkjoin_barrier ] = bp_hierarchical_bar;
+ __kmp_barrier_release_pattern[ bs_forkjoin_barrier ] = bp_hierarchical_bar;
+#if KMP_FAST_REDUCTION_BARRIER
+ __kmp_barrier_gather_pattern [ bs_reduction_barrier ] = bp_hierarchical_bar;
+ __kmp_barrier_release_pattern[ bs_reduction_barrier ] = bp_hierarchical_bar;
+#endif
#endif
// From KMP_CHECKS initialization
@@ -7455,6 +5936,7 @@ __kmp_do_serial_initialize( void )
__kmp_global.g.g_dynamic_mode = dynamic_default;
__kmp_env_initialize( NULL );
+
// Print all messages in message catalog for testing purposes.
#ifdef KMP_DEBUG
char const * val = __kmp_env_get( "KMP_DUMP_CATALOG" );
@@ -7660,13 +6142,9 @@ __kmp_do_middle_initialize( void )
for ( i = 0; i < __kmp_threads_capacity; i++ ) {
kmp_info_t *thread = __kmp_threads[ i ];
if ( thread == NULL ) continue;
-#if OMP_30_ENABLED
if ( thread->th.th_current_task->td_icvs.nproc != 0 ) continue;
-#else
- if ( thread->th.th_team->t.t_set_nproc[ thread->th.th_info.ds.ds_tid ] != 0 ) continue;
-#endif /* OMP_30_ENABLED */
- set__nproc_p( __kmp_threads[ i ], __kmp_dflt_team_nth );
+ set__nproc( __kmp_threads[ i ], __kmp_dflt_team_nth );
}
}
KA_TRACE( 20, ("__kmp_middle_initialize: final value for __kmp_dflt_team_nth = %d\n",
@@ -7786,16 +6264,15 @@ __kmp_run_before_invoked_task( int gtid, int tid, kmp_info_t *this_thr,
/* none of the threads have encountered any constructs, yet. */
this_thr->th.th_local.this_construct = 0;
- this_thr->th.th_local.last_construct = 0;
#if KMP_CACHE_MANAGE
- KMP_CACHE_PREFETCH( &this_thr -> th.th_bar[ bs_forkjoin_barrier ].bb.b_arrived );
+ KMP_CACHE_PREFETCH( &this_thr->th.th_bar[ bs_forkjoin_barrier ].bb.b_arrived );
#endif /* KMP_CACHE_MANAGE */
dispatch = (kmp_disp_t *)TCR_PTR(this_thr->th.th_dispatch);
KMP_DEBUG_ASSERT( dispatch );
- KMP_DEBUG_ASSERT( team -> t.t_dispatch );
- //KMP_DEBUG_ASSERT( this_thr -> th.th_dispatch == &team -> t.t_dispatch[ this_thr->th.th_info.ds.ds_tid ] );
+ KMP_DEBUG_ASSERT( team->t.t_dispatch );
+ //KMP_DEBUG_ASSERT( this_thr->th.th_dispatch == &team->t.t_dispatch[ this_thr->th.th_info.ds.ds_tid ] );
- dispatch -> th_disp_index = 0; /* reset the dispatch buffer counter */
+ dispatch->th_disp_index = 0; /* reset the dispatch buffer counter */
if( __kmp_env_consistency_check )
__kmp_push_parallel( gtid, team->t.t_ident );
@@ -7817,7 +6294,7 @@ __kmp_invoke_task_func( int gtid )
int rc;
int tid = __kmp_tid_from_gtid( gtid );
kmp_info_t *this_thr = __kmp_threads[ gtid ];
- kmp_team_t *team = this_thr -> th.th_team;
+ kmp_team_t *team = this_thr->th.th_team;
__kmp_run_before_invoked_task( gtid, tid, this_thr, team );
#if USE_ITT_BUILD
@@ -7825,6 +6302,9 @@ __kmp_invoke_task_func( int gtid )
__kmp_itt_stack_callee_enter( (__itt_caller)team->t.t_stack_id ); // inform ittnotify about entering user's code
}
#endif /* USE_ITT_BUILD */
+#if INCLUDE_SSC_MARKS
+ SSC_MARK_INVOKING();
+#endif
rc = __kmp_invoke_microtask( (microtask_t) TCR_SYNC_PTR(team->t.t_pkfn),
gtid, tid, (int) team->t.t_argc, (void **) team->t.t_argv );
@@ -7840,27 +6320,30 @@ __kmp_invoke_task_func( int gtid )
#if OMP_40_ENABLED
void
-__kmp_teams_master( microtask_t microtask, int gtid )
+__kmp_teams_master( int gtid )
{
// This routine is called by all master threads in teams construct
- kmp_info_t *this_thr = __kmp_threads[ gtid ];
- kmp_team_t *team = this_thr -> th.th_team;
+ kmp_info_t *thr = __kmp_threads[ gtid ];
+ kmp_team_t *team = thr->th.th_team;
ident_t *loc = team->t.t_ident;
-
-#if KMP_DEBUG
- int tid = __kmp_tid_from_gtid( gtid );
+ thr->th.th_set_nproc = thr->th.th_teams_size.nth;
+ KMP_DEBUG_ASSERT( thr->th.th_teams_microtask );
+ KMP_DEBUG_ASSERT( thr->th.th_set_nproc );
KA_TRACE( 20, ("__kmp_teams_master: T#%d, Tid %d, microtask %p\n",
- gtid, tid, microtask) );
-#endif
-
+ gtid, __kmp_tid_from_gtid( gtid ), thr->th.th_teams_microtask ) );
// Launch league of teams now, but not let workers execute
// (they hang on fork barrier until next parallel)
- this_thr->th.th_set_nproc = this_thr->th.th_set_nth_teams;
- __kmp_fork_call( loc, gtid, TRUE,
+#if INCLUDE_SSC_MARKS
+ SSC_MARK_FORKING();
+#endif
+ __kmp_fork_call( loc, gtid, fork_context_intel,
team->t.t_argc,
- microtask,
+ (microtask_t)thr->th.th_teams_microtask,
VOLATILE_CAST(launch_t) __kmp_invoke_task_func,
NULL );
+#if INCLUDE_SSC_MARKS
+ SSC_MARK_JOINING();
+#endif
__kmp_join_call( loc, gtid, 1 ); // AC: last parameter "1" eliminates join barrier which won't work because
// worker threads are in a fork barrier waiting for more parallel regions
}
@@ -7868,13 +6351,15 @@ __kmp_teams_master( microtask_t microtask, int gtid )
int
__kmp_invoke_teams_master( int gtid )
{
+ kmp_info_t *this_thr = __kmp_threads[ gtid ];
+ kmp_team_t *team = this_thr->th.th_team;
#if KMP_DEBUG
if ( !__kmp_threads[gtid]-> th.th_team->t.t_serialized )
KMP_DEBUG_ASSERT( (void*)__kmp_threads[gtid]-> th.th_team->t.t_pkfn == (void*)__kmp_teams_master );
#endif
-
- __kmp_teams_master( (microtask_t)__kmp_threads[gtid]->th.th_team_microtask, gtid );
-
+ __kmp_run_before_invoked_task( gtid, 0, this_thr, team );
+ __kmp_teams_master( gtid );
+ __kmp_run_after_invoked_task( gtid, 0, this_thr, team );
return 1;
}
#endif /* OMP_40_ENABLED */
@@ -7890,7 +6375,7 @@ __kmp_push_num_threads( ident_t *id, int gtid, int num_threads )
kmp_info_t *thr = __kmp_threads[gtid];
if( num_threads > 0 )
- thr -> th.th_set_nproc = num_threads;
+ thr->th.th_set_nproc = num_threads;
}
#if OMP_40_ENABLED
@@ -7901,20 +6386,21 @@ void
__kmp_push_num_teams( ident_t *id, int gtid, int num_teams, int num_threads )
{
kmp_info_t *thr = __kmp_threads[gtid];
- // The number of teams is the number of threads in the outer "parallel"
- if( num_teams > 0 ) {
- thr -> th.th_set_nproc = num_teams;
- } else {
- thr -> th.th_set_nproc = 1; // AC: default number of teams is 1;
- // TODO: should it be __kmp_ncores ?
+ KMP_DEBUG_ASSERT(num_teams >= 0);
+ KMP_DEBUG_ASSERT(num_threads >= 0);
+ if( num_teams == 0 ) {
+ num_teams = 1; // default number of teams is 1.
}
- // The number of threads is for inner parallel regions
+ // Set number of teams (number of threads in the outer "parallel" of the teams)
+ thr->th.th_set_nproc = thr->th.th_teams_size.nteams = num_teams;
+
+ // Remember the number of threads for inner parallel regions
if( num_threads > 0 ) {
- thr -> th.th_set_nth_teams = num_threads;
+ thr->th.th_teams_size.nth = num_threads;
} else {
if( !TCR_4(__kmp_init_middle) )
- __kmp_middle_initialize();
- thr -> th.th_set_nth_teams = __kmp_avail_proc / thr -> th.th_set_nproc;
+ __kmp_middle_initialize(); // get __kmp_avail_proc calculated
+ thr->th.th_teams_size.nth = __kmp_avail_proc / num_teams;
}
}
@@ -7926,7 +6412,7 @@ void
__kmp_push_proc_bind( ident_t *id, int gtid, kmp_proc_bind_t proc_bind )
{
kmp_info_t *thr = __kmp_threads[gtid];
- thr -> th.th_set_proc_bind = proc_bind;
+ thr->th.th_set_proc_bind = proc_bind;
}
#endif /* OMP_40_ENABLED */
@@ -7943,25 +6429,25 @@ __kmp_internal_fork( ident_t *id, int gtid, kmp_team_t *team )
#endif /* KMP_DEBUG */
KMP_DEBUG_ASSERT( team );
- KMP_DEBUG_ASSERT( this_thr -> th.th_team == team );
+ KMP_DEBUG_ASSERT( this_thr->th.th_team == team );
KMP_ASSERT( KMP_MASTER_GTID(gtid) );
KMP_MB(); /* Flush all pending memory write invalidates. */
- team -> t.t_construct = 0; /* no single directives seen yet */
- team -> t.t_ordered.dt.t_value = 0; /* thread 0 enters the ordered section first */
+ team->t.t_construct = 0; /* no single directives seen yet */
+ team->t.t_ordered.dt.t_value = 0; /* thread 0 enters the ordered section first */
/* Reset the identifiers on the dispatch buffer */
- KMP_DEBUG_ASSERT( team -> t.t_disp_buffer );
+ KMP_DEBUG_ASSERT( team->t.t_disp_buffer );
if ( team->t.t_max_nproc > 1 ) {
int i;
for (i = 0; i < KMP_MAX_DISP_BUF; ++i)
- team -> t.t_disp_buffer[ i ].buffer_index = i;
+ team->t.t_disp_buffer[ i ].buffer_index = i;
} else {
- team -> t.t_disp_buffer[ 0 ].buffer_index = 0;
+ team->t.t_disp_buffer[ 0 ].buffer_index = 0;
}
KMP_MB(); /* Flush all pending memory write invalidates. */
- KMP_ASSERT( this_thr -> th.th_team == team );
+ KMP_ASSERT( this_thr->th.th_team == team );
#ifdef KMP_DEBUG
for( f=0 ; f<team->t.t_nproc ; f++ ) {
@@ -7981,7 +6467,7 @@ __kmp_internal_join( ident_t *id, int gtid, kmp_team_t *team )
kmp_info_t *this_thr = __kmp_threads[gtid];
KMP_DEBUG_ASSERT( team );
- KMP_DEBUG_ASSERT( this_thr -> th.th_team == team );
+ KMP_DEBUG_ASSERT( this_thr->th.th_team == team );
KMP_ASSERT( KMP_MASTER_GTID(gtid) );
KMP_MB(); /* Flush all pending memory write invalidates. */
@@ -8001,7 +6487,7 @@ __kmp_internal_join( ident_t *id, int gtid, kmp_team_t *team )
__kmp_join_barrier( gtid ); /* wait for everyone */
KMP_MB(); /* Flush all pending memory write invalidates. */
- KMP_ASSERT( this_thr -> th.th_team == team );
+ KMP_ASSERT( this_thr->th.th_team == team );
}
@@ -8057,11 +6543,7 @@ __kmp_load_balance_nproc( kmp_root_t *root, int set_nproc )
KB_TRACE( 20, ("__kmp_load_balance_nproc: called root:%p set_nproc:%d\n",
root, set_nproc ) );
KMP_DEBUG_ASSERT( root );
- #if OMP_30_ENABLED
KMP_DEBUG_ASSERT( root->r.r_root_team->t.t_threads[0]->th.th_current_task->td_icvs.dynamic == TRUE );
- #else
- KMP_DEBUG_ASSERT( root->r.r_root_team->t.t_set_dynamic[0] == TRUE );
- #endif
KMP_DEBUG_ASSERT( set_nproc > 1 );
if ( set_nproc == 1) {
@@ -8203,6 +6685,11 @@ __kmp_cleanup( void )
__kmp_i18n_catclose();
+#if KMP_STATS_ENABLED
+ __kmp_accumulate_stats_at_exit();
+ __kmp_stats_list.deallocate();
+#endif
+
KA_TRACE( 10, ("__kmp_cleanup: exit\n" ) );
}
@@ -8244,7 +6731,7 @@ __kmp_internal_begin( void )
/* this is a very important step as it will register new sibling threads
* and assign these new uber threads a new gtid */
gtid = __kmp_entry_gtid();
- root = __kmp_threads[ gtid ] -> th.th_root;
+ root = __kmp_threads[ gtid ]->th.th_root;
KMP_ASSERT( KMP_UBER_GTID( gtid ));
if( root->r.r_begin ) return;
@@ -8254,7 +6741,7 @@ __kmp_internal_begin( void )
return;
}
- root -> r.r_begin = TRUE;
+ root->r.r_begin = TRUE;
__kmp_release_lock( & root->r.r_begin_lock, gtid );
}
@@ -8275,7 +6762,7 @@ __kmp_user_set_library (enum library_type arg)
gtid = __kmp_entry_gtid();
thread = __kmp_threads[ gtid ];
- root = thread -> th.th_root;
+ root = thread->th.th_root;
KA_TRACE( 20, ("__kmp_user_set_library: enter T#%d, arg: %d, %d\n", gtid, arg, library_serial ));
if (root->r.r_in_parallel) { /* Must be called in serial section of top-level thread */
@@ -8285,16 +6772,16 @@ __kmp_user_set_library (enum library_type arg)
switch ( arg ) {
case library_serial :
- thread -> th.th_set_nproc = 0;
- set__nproc_p( thread, 1 );
+ thread->th.th_set_nproc = 0;
+ set__nproc( thread, 1 );
break;
case library_turnaround :
- thread -> th.th_set_nproc = 0;
- set__nproc_p( thread, __kmp_dflt_team_nth ? __kmp_dflt_team_nth : __kmp_dflt_team_nth_ub );
+ thread->th.th_set_nproc = 0;
+ set__nproc( thread, __kmp_dflt_team_nth ? __kmp_dflt_team_nth : __kmp_dflt_team_nth_ub );
break;
case library_throughput :
- thread -> th.th_set_nproc = 0;
- set__nproc_p( thread, __kmp_dflt_team_nth ? __kmp_dflt_team_nth : __kmp_dflt_team_nth_ub );
+ thread->th.th_set_nproc = 0;
+ set__nproc( thread, __kmp_dflt_team_nth ? __kmp_dflt_team_nth : __kmp_dflt_team_nth_ub );
break;
default:
KMP_FATAL( UnknownLibraryType, arg );
@@ -8378,20 +6865,20 @@ __kmp_aux_set_blocktime (int arg, kmp_info_t *thread, int tid)
else if (blocktime > KMP_MAX_BLOCKTIME)
blocktime = KMP_MAX_BLOCKTIME;
- set__blocktime_team( thread -> th.th_team, tid, blocktime );
- set__blocktime_team( thread -> th.th_serial_team, 0, blocktime );
+ set__blocktime_team( thread->th.th_team, tid, blocktime );
+ set__blocktime_team( thread->th.th_serial_team, 0, blocktime );
/* Calculate and set blocktime intervals for the teams */
bt_intervals = KMP_INTERVALS_FROM_BLOCKTIME(blocktime, __kmp_monitor_wakeups);
- set__bt_intervals_team( thread -> th.th_team, tid, bt_intervals );
- set__bt_intervals_team( thread -> th.th_serial_team, 0, bt_intervals );
+ set__bt_intervals_team( thread->th.th_team, tid, bt_intervals );
+ set__bt_intervals_team( thread->th.th_serial_team, 0, bt_intervals );
/* Set whether blocktime has been set to "TRUE" */
bt_set = TRUE;
- set__bt_set_team( thread -> th.th_team, tid, bt_set );
- set__bt_set_team( thread -> th.th_serial_team, 0, bt_set );
+ set__bt_set_team( thread->th.th_team, tid, bt_set );
+ set__bt_set_team( thread->th.th_serial_team, 0, bt_set );
KF_TRACE(10, ( "kmp_set_blocktime: T#%d(%d:%d), blocktime=%d, bt_intervals=%d, monitor_updates=%d\n",
__kmp_gtid_from_tid(tid, thread->th.th_team),
thread->th.th_team->t.t_id, tid, blocktime, bt_intervals, __kmp_monitor_wakeups ) );
@@ -8481,7 +6968,7 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
#elif KMP_ARCH_X86 || KMP_ARCH_ARM
- #if KMP_AFFINITY_SUPPORTED
+ #if KMP_OS_LINUX || KMP_OS_WINDOWS
// basic tuning
@@ -8559,7 +7046,7 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
// this function is for testing set/get/determine reduce method
kmp_int32
__kmp_get_reduce_method( void ) {
- return ( ( __kmp_entry_thread() -> th.th_local.packed_reduction_method ) >> 8 );
+ return ( ( __kmp_entry_thread()->th.th_local.packed_reduction_method ) >> 8 );
}
/* ------------------------------------------------------------------------ */
diff --git a/openmp/runtime/src/kmp_sched.cpp b/openmp/runtime/src/kmp_sched.cpp
index 18e5a38dc40..14fa62ee85d 100644
--- a/openmp/runtime/src/kmp_sched.cpp
+++ b/openmp/runtime/src/kmp_sched.cpp
@@ -1,7 +1,7 @@
/*
* kmp_sched.c -- static scheduling -- iteration initialization
- * $Revision: 42358 $
- * $Date: 2013-05-07 13:43:26 -0500 (Tue, 07 May 2013) $
+ * $Revision: 43457 $
+ * $Date: 2014-09-17 03:57:22 -0500 (Wed, 17 Sep 2014) $
*/
@@ -28,6 +28,8 @@
#include "kmp_i18n.h"
#include "kmp_str.h"
#include "kmp_error.h"
+#include "kmp_stats.h"
+#include "kmp_itt.h"
// template for type limits
template< typename T >
@@ -79,6 +81,7 @@ __kmp_for_static_init(
typename traits_t< T >::signed_t incr,
typename traits_t< T >::signed_t chunk
) {
+ KMP_COUNT_BLOCK(OMP_FOR_static);
typedef typename traits_t< T >::unsigned_t UT;
typedef typename traits_t< T >::signed_t ST;
/* this all has to be changed back to TID and such.. */
@@ -88,6 +91,7 @@ __kmp_for_static_init(
register UT trip_count;
register kmp_team_t *team;
+ KMP_DEBUG_ASSERT( plastiter && plower && pupper && pstride );
KE_TRACE( 10, ("__kmpc_for_static_init called (%d)\n", global_tid));
#ifdef KMP_DEBUG
{
@@ -108,12 +112,12 @@ __kmp_for_static_init(
__kmp_push_workshare( global_tid, ct_pdo, loc );
if ( incr == 0 ) {
__kmp_error_construct( kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo, loc );
-
}
}
/* special handling for zero-trip loops */
if ( incr > 0 ? (*pupper < *plower) : (*plower < *pupper) ) {
- *plastiter = FALSE;
+ if( plastiter != NULL )
+ *plastiter = FALSE;
/* leave pupper and plower set to entire iteration space */
*pstride = incr; /* value should never be used */
// *plower = *pupper - incr; // let compiler bypass the illegal loop (like for(i=1;i<10;i--)) THIS LINE CAUSED shape2F/h_tests_1.f TO HAVE A FAILURE ON A ZERO-TRIP LOOP (lower=1,\
@@ -149,7 +153,8 @@ __kmp_for_static_init(
/* determine if "for" loop is an active worksharing construct */
if ( team -> t.t_serialized ) {
/* serialized parallel, each thread executes whole iteration space */
- *plastiter = TRUE;
+ if( plastiter != NULL )
+ *plastiter = TRUE;
/* leave pupper and plower set to entire iteration space */
*pstride = (incr > 0) ? (*pupper - *plower + 1) : (-(*plower - *pupper + 1));
@@ -169,8 +174,9 @@ __kmp_for_static_init(
}
nth = team->t.t_nproc;
if ( nth == 1 ) {
- *plastiter = TRUE;
-
+ if( plastiter != NULL )
+ *plastiter = TRUE;
+ *pstride = (incr > 0) ? (*pupper - *plower + 1) : (-(*plower - *pupper + 1));
#ifdef KMP_DEBUG
{
const char * buff;
@@ -192,12 +198,13 @@ __kmp_for_static_init(
} else if (incr == -1) {
trip_count = *plower - *pupper + 1;
} else {
- if ( incr > 1 ) {
+ if ( incr > 1 ) { // the check is needed for unsigned division when incr < 0
trip_count = (*pupper - *plower) / incr + 1;
} else {
trip_count = (*plower - *pupper) / ( -incr ) + 1;
}
}
+
if ( __kmp_env_consistency_check ) {
/* tripcount overflow? */
if ( trip_count == 0 && *pupper != *plower ) {
@@ -219,14 +226,16 @@ __kmp_for_static_init(
} else {
*plower = *pupper + incr;
}
- *plastiter = ( tid == trip_count - 1 );
+ if( plastiter != NULL )
+ *plastiter = ( tid == trip_count - 1 );
} else {
if ( __kmp_static == kmp_sch_static_balanced ) {
register UT small_chunk = trip_count / nth;
register UT extras = trip_count % nth;
*plower += incr * ( tid * small_chunk + ( tid < extras ? tid : extras ) );
*pupper = *plower + small_chunk * incr - ( tid < extras ? 0 : incr );
- *plastiter = ( tid == nth - 1 );
+ if( plastiter != NULL )
+ *plastiter = ( tid == nth - 1 );
} else {
register T big_chunk_inc_count = ( trip_count/nth +
( ( trip_count % nth ) ? 1 : 0) ) * incr;
@@ -238,16 +247,16 @@ __kmp_for_static_init(
*plower += tid * big_chunk_inc_count;
*pupper = *plower + big_chunk_inc_count - incr;
if ( incr > 0 ) {
- if ( *pupper < *plower ) {
+ if( *pupper < *plower )
*pupper = i_maxmin< T >::mx;
- }
- *plastiter = *plower <= old_upper && *pupper > old_upper - incr;
+ if( plastiter != NULL )
+ *plastiter = *plower <= old_upper && *pupper > old_upper - incr;
if ( *pupper > old_upper ) *pupper = old_upper; // tracker C73258
} else {
- if ( *pupper > *plower ) {
+ if( *pupper > *plower )
*pupper = i_maxmin< T >::mn;
- }
- *plastiter = *plower >= old_upper && *pupper < old_upper - incr;
+ if( plastiter != NULL )
+ *plastiter = *plower >= old_upper && *pupper < old_upper - incr;
if ( *pupper < old_upper ) *pupper = old_upper; // tracker C73258
}
}
@@ -256,7 +265,7 @@ __kmp_for_static_init(
}
case kmp_sch_static_chunked:
{
- register T span;
+ register ST span;
if ( chunk < 1 ) {
chunk = 1;
}
@@ -264,11 +273,8 @@ __kmp_for_static_init(
*pstride = span * nth;
*plower = *plower + (span * tid);
*pupper = *plower + span - incr;
- /* TODO: is the following line a bug? Shouldn't it be plastiter instead of *plastiter ? */
- if (*plastiter) { /* only calculate this if it was requested */
- kmp_int32 lasttid = ((trip_count - 1) / ( UT )chunk) % nth;
- *plastiter = (tid == lasttid);
- }
+ if( plastiter != NULL )
+ *plastiter = (tid == ((trip_count - 1)/( UT )chunk) % nth);
break;
}
default:
@@ -276,6 +282,18 @@ __kmp_for_static_init(
break;
}
+#if USE_ITT_BUILD
+ // Report loop metadata
+ if ( KMP_MASTER_TID(tid) && __itt_metadata_add_ptr && __kmp_forkjoin_frames_mode == 3 ) {
+ kmp_uint64 cur_chunk = chunk;
+ // Calculate chunk in case it was not specified; it is specified for kmp_sch_static_chunked
+ if ( schedtype == kmp_sch_static ) {
+ cur_chunk = trip_count / nth + ( ( trip_count % nth ) ? 1 : 0);
+ }
+ // 0 - "static" schedule
+ __kmp_itt_metadata_loop(loc, 0, trip_count, cur_chunk);
+ }
+#endif
#ifdef KMP_DEBUG
{
const char * buff;
@@ -291,6 +309,355 @@ __kmp_for_static_init(
return;
}
+template< typename T >
+static void
+__kmp_dist_for_static_init(
+ ident_t *loc,
+ kmp_int32 gtid,
+ kmp_int32 schedule,
+ kmp_int32 *plastiter,
+ T *plower,
+ T *pupper,
+ T *pupperDist,
+ typename traits_t< T >::signed_t *pstride,
+ typename traits_t< T >::signed_t incr,
+ typename traits_t< T >::signed_t chunk
+) {
+ KMP_COUNT_BLOCK(OMP_DISTR_FOR_static);
+ typedef typename traits_t< T >::unsigned_t UT;
+ typedef typename traits_t< T >::signed_t ST;
+ register kmp_uint32 tid;
+ register kmp_uint32 nth;
+ register kmp_uint32 team_id;
+ register kmp_uint32 nteams;
+ register UT trip_count;
+ register kmp_team_t *team;
+ kmp_info_t * th;
+
+ KMP_DEBUG_ASSERT( plastiter && plower && pupper && pupperDist && pstride );
+ KE_TRACE( 10, ("__kmpc_dist_for_static_init called (%d)\n", gtid));
+ #ifdef KMP_DEBUG
+ {
+ const char * buff;
+ // create format specifiers before the debug output
+ buff = __kmp_str_format(
+ "__kmpc_dist_for_static_init: T#%%d schedLoop=%%d liter=%%d "\
+ "iter=(%%%s, %%%s, %%%s) chunk=%%%s signed?<%s>\n",
+ traits_t< T >::spec, traits_t< T >::spec, traits_t< ST >::spec,
+ traits_t< ST >::spec, traits_t< T >::spec );
+ KD_TRACE(100, ( buff, gtid, schedule, *plastiter,
+ *plower, *pupper, incr, chunk ) );
+ __kmp_str_free( &buff );
+ }
+ #endif
+
+ if( __kmp_env_consistency_check ) {
+ __kmp_push_workshare( gtid, ct_pdo, loc );
+ if( incr == 0 ) {
+ __kmp_error_construct( kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo, loc );
+ }
+ if( incr > 0 ? (*pupper < *plower) : (*plower < *pupper) ) {
+ // The loop is illegal.
+ // Some zero-trip loops maintained by compiler, e.g.:
+ // for(i=10;i<0;++i) // lower >= upper - run-time check
+ // for(i=0;i>10;--i) // lower <= upper - run-time check
+ // for(i=0;i>10;++i) // incr > 0 - compile-time check
+ // for(i=10;i<0;--i) // incr < 0 - compile-time check
+ // Compiler does not check the following illegal loops:
+ // for(i=0;i<10;i+=incr) // where incr<0
+ // for(i=10;i>0;i-=incr) // where incr<0
+ __kmp_error_construct( kmp_i18n_msg_CnsLoopIncrIllegal, ct_pdo, loc );
+ }
+ }
+ tid = __kmp_tid_from_gtid( gtid );
+ th = __kmp_threads[gtid];
+ KMP_DEBUG_ASSERT(th->th.th_teams_microtask); // we are in the teams construct
+ nth = th->th.th_team_nproc;
+ team = th->th.th_team;
+ #if OMP_40_ENABLED
+ nteams = th->th.th_teams_size.nteams;
+ #endif
+ team_id = team->t.t_master_tid;
+ KMP_DEBUG_ASSERT(nteams == team->t.t_parent->t.t_nproc);
+
+ // compute global trip count
+ if( incr == 1 ) {
+ trip_count = *pupper - *plower + 1;
+ } else if(incr == -1) {
+ trip_count = *plower - *pupper + 1;
+ } else {
+ trip_count = (ST)(*pupper - *plower) / incr + 1; // cast to signed to cover incr<0 case
+ }
+ *pstride = *pupper - *plower; // just in case (can be unused)
+ if( trip_count <= nteams ) {
+ KMP_DEBUG_ASSERT(
+ __kmp_static == kmp_sch_static_greedy || \
+ __kmp_static == kmp_sch_static_balanced
+ ); // Unknown static scheduling type.
+ // only masters of some teams get single iteration, other threads get nothing
+ if( team_id < trip_count && tid == 0 ) {
+ *pupper = *pupperDist = *plower = *plower + team_id * incr;
+ } else {
+ *pupperDist = *pupper;
+ *plower = *pupper + incr; // compiler should skip loop body
+ }
+ if( plastiter != NULL )
+ *plastiter = ( tid == 0 && team_id == trip_count - 1 );
+ } else {
+ // Get the team's chunk first (each team gets at most one chunk)
+ if( __kmp_static == kmp_sch_static_balanced ) {
+ register UT chunkD = trip_count / nteams;
+ register UT extras = trip_count % nteams;
+ *plower += incr * ( team_id * chunkD + ( team_id < extras ? team_id : extras ) );
+ *pupperDist = *plower + chunkD * incr - ( team_id < extras ? 0 : incr );
+ if( plastiter != NULL )
+ *plastiter = ( team_id == nteams - 1 );
+ } else {
+ register T chunk_inc_count =
+ ( trip_count / nteams + ( ( trip_count % nteams ) ? 1 : 0) ) * incr;
+ register T upper = *pupper;
+ KMP_DEBUG_ASSERT( __kmp_static == kmp_sch_static_greedy );
+ // Unknown static scheduling type.
+ *plower += team_id * chunk_inc_count;
+ *pupperDist = *plower + chunk_inc_count - incr;
+ // Check/correct bounds if needed
+ if( incr > 0 ) {
+ if( *pupperDist < *plower )
+ *pupperDist = i_maxmin< T >::mx;
+ if( plastiter != NULL )
+ *plastiter = *plower <= upper && *pupperDist > upper - incr;
+ if( *pupperDist > upper )
+ *pupperDist = upper; // tracker C73258
+ if( *plower > *pupperDist ) {
+ *pupper = *pupperDist; // no iterations available for the team
+ goto end;
+ }
+ } else {
+ if( *pupperDist > *plower )
+ *pupperDist = i_maxmin< T >::mn;
+ if( plastiter != NULL )
+ *plastiter = *plower >= upper && *pupperDist < upper - incr;
+ if( *pupperDist < upper )
+ *pupperDist = upper; // tracker C73258
+ if( *plower < *pupperDist ) {
+ *pupper = *pupperDist; // no iterations available for the team
+ goto end;
+ }
+ }
+ }
+ // Get the parallel loop chunk now (for thread)
+ // compute trip count for team's chunk
+ if( incr == 1 ) {
+ trip_count = *pupperDist - *plower + 1;
+ } else if(incr == -1) {
+ trip_count = *plower - *pupperDist + 1;
+ } else {
+ trip_count = (ST)(*pupperDist - *plower) / incr + 1;
+ }
+ KMP_DEBUG_ASSERT( trip_count );
+ switch( schedule ) {
+ case kmp_sch_static:
+ {
+ if( trip_count <= nth ) {
+ KMP_DEBUG_ASSERT(
+ __kmp_static == kmp_sch_static_greedy || \
+ __kmp_static == kmp_sch_static_balanced
+ ); // Unknown static scheduling type.
+ if( tid < trip_count )
+ *pupper = *plower = *plower + tid * incr;
+ else
+ *plower = *pupper + incr; // no iterations available
+ if( plastiter != NULL )
+ if( *plastiter != 0 && !( tid == trip_count - 1 ) )
+ *plastiter = 0;
+ } else {
+ if( __kmp_static == kmp_sch_static_balanced ) {
+ register UT chunkL = trip_count / nth;
+ register UT extras = trip_count % nth;
+ *plower += incr * (tid * chunkL + (tid < extras ? tid : extras));
+ *pupper = *plower + chunkL * incr - (tid < extras ? 0 : incr);
+ if( plastiter != NULL )
+ if( *plastiter != 0 && !( tid == nth - 1 ) )
+ *plastiter = 0;
+ } else {
+ register T chunk_inc_count =
+ ( trip_count / nth + ( ( trip_count % nth ) ? 1 : 0) ) * incr;
+ register T upper = *pupperDist;
+ KMP_DEBUG_ASSERT( __kmp_static == kmp_sch_static_greedy );
+ // Unknown static scheduling type.
+ *plower += tid * chunk_inc_count;
+ *pupper = *plower + chunk_inc_count - incr;
+ if( incr > 0 ) {
+ if( *pupper < *plower )
+ *pupper = i_maxmin< T >::mx;
+ if( plastiter != NULL )
+ if( *plastiter != 0 && !(*plower <= upper && *pupper > upper - incr) )
+ *plastiter = 0;
+ if( *pupper > upper )
+ *pupper = upper;//tracker C73258
+ } else {
+ if( *pupper > *plower )
+ *pupper = i_maxmin< T >::mn;
+ if( plastiter != NULL )
+ if( *plastiter != 0 && !(*plower >= upper && *pupper < upper - incr) )
+ *plastiter = 0;
+ if( *pupper < upper )
+ *pupper = upper;//tracker C73258
+ }
+ }
+ }
+ break;
+ }
+ case kmp_sch_static_chunked:
+ {
+ register ST span;
+ if( chunk < 1 )
+ chunk = 1;
+ span = chunk * incr;
+ *pstride = span * nth;
+ *plower = *plower + (span * tid);
+ *pupper = *plower + span - incr;
+ if( plastiter != NULL )
+ if( *plastiter != 0 && !(tid == ((trip_count - 1) / ( UT )chunk) % nth) )
+ *plastiter = 0;
+ break;
+ }
+ default:
+ KMP_ASSERT2( 0, "__kmpc_dist_for_static_init: unknown loop scheduling type" );
+ break;
+ }
+ }
+ end:;
+ #ifdef KMP_DEBUG
+ {
+ const char * buff;
+ // create format specifiers before the debug output
+ buff = __kmp_str_format(
+ "__kmpc_dist_for_static_init: last=%%d lo=%%%s up=%%%s upDist=%%%s "\
+ "stride=%%%s signed?<%s>\n",
+ traits_t< T >::spec, traits_t< T >::spec, traits_t< T >::spec,
+ traits_t< ST >::spec, traits_t< T >::spec );
+ KD_TRACE(100, ( buff, *plastiter, *plower, *pupper, *pupperDist, *pstride ) );
+ __kmp_str_free( &buff );
+ }
+ #endif
+ KE_TRACE( 10, ("__kmpc_dist_for_static_init: T#%d return\n", gtid ) );
+ return;
+}
+
+template< typename T >
+static void
+__kmp_team_static_init(
+ ident_t *loc,
+ kmp_int32 gtid,
+ kmp_int32 *p_last,
+ T *p_lb,
+ T *p_ub,
+ typename traits_t< T >::signed_t *p_st,
+ typename traits_t< T >::signed_t incr,
+ typename traits_t< T >::signed_t chunk
+) {
+ // The routine returns the first chunk distributed to the team and
+ // stride for next chunks calculation.
+ // Last iteration flag set for the team that will execute
+ // the last iteration of the loop.
+ // The routine is called for dist_schedue(static,chunk) only.
+ typedef typename traits_t< T >::unsigned_t UT;
+ typedef typename traits_t< T >::signed_t ST;
+ kmp_uint32 team_id;
+ kmp_uint32 nteams;
+ UT trip_count;
+ T lower;
+ T upper;
+ ST span;
+ kmp_team_t *team;
+ kmp_info_t *th;
+
+ KMP_DEBUG_ASSERT( p_last && p_lb && p_ub && p_st );
+ KE_TRACE( 10, ("__kmp_team_static_init called (%d)\n", gtid));
+ #ifdef KMP_DEBUG
+ {
+ const char * buff;
+ // create format specifiers before the debug output
+ buff = __kmp_str_format( "__kmp_team_static_init enter: T#%%d liter=%%d "\
+ "iter=(%%%s, %%%s, %%%s) chunk %%%s; signed?<%s>\n",
+ traits_t< T >::spec, traits_t< T >::spec, traits_t< ST >::spec,
+ traits_t< ST >::spec, traits_t< T >::spec );
+ KD_TRACE(100, ( buff, gtid, *p_last, *p_lb, *p_ub, *p_st, chunk ) );
+ __kmp_str_free( &buff );
+ }
+ #endif
+
+ lower = *p_lb;
+ upper = *p_ub;
+ if( __kmp_env_consistency_check ) {
+ if( incr == 0 ) {
+ __kmp_error_construct( kmp_i18n_msg_CnsLoopIncrZeroProhibited, ct_pdo, loc );
+ }
+ if( incr > 0 ? (upper < lower) : (lower < upper) ) {
+ // The loop is illegal.
+ // Some zero-trip loops maintained by compiler, e.g.:
+ // for(i=10;i<0;++i) // lower >= upper - run-time check
+ // for(i=0;i>10;--i) // lower <= upper - run-time check
+ // for(i=0;i>10;++i) // incr > 0 - compile-time check
+ // for(i=10;i<0;--i) // incr < 0 - compile-time check
+ // Compiler does not check the following illegal loops:
+ // for(i=0;i<10;i+=incr) // where incr<0
+ // for(i=10;i>0;i-=incr) // where incr<0
+ __kmp_error_construct( kmp_i18n_msg_CnsLoopIncrIllegal, ct_pdo, loc );
+ }
+ }
+ th = __kmp_threads[gtid];
+ KMP_DEBUG_ASSERT(th->th.th_teams_microtask); // we are in the teams construct
+ team = th->th.th_team;
+ #if OMP_40_ENABLED
+ nteams = th->th.th_teams_size.nteams;
+ #endif
+ team_id = team->t.t_master_tid;
+ KMP_DEBUG_ASSERT(nteams == team->t.t_parent->t.t_nproc);
+
+ // compute trip count
+ if( incr == 1 ) {
+ trip_count = upper - lower + 1;
+ } else if(incr == -1) {
+ trip_count = lower - upper + 1;
+ } else {
+ trip_count = (ST)(upper - lower) / incr + 1; // cast to signed to cover incr<0 case
+ }
+ if( chunk < 1 )
+ chunk = 1;
+ span = chunk * incr;
+ *p_st = span * nteams;
+ *p_lb = lower + (span * team_id);
+ *p_ub = *p_lb + span - incr;
+ if ( p_last != NULL )
+ *p_last = (team_id == ((trip_count - 1)/(UT)chunk) % nteams);
+ // Correct upper bound if needed
+ if( incr > 0 ) {
+ if( *p_ub < *p_lb ) // overflow?
+ *p_ub = i_maxmin< T >::mx;
+ if( *p_ub > upper )
+ *p_ub = upper; // tracker C73258
+ } else { // incr < 0
+ if( *p_ub > *p_lb )
+ *p_ub = i_maxmin< T >::mn;
+ if( *p_ub < upper )
+ *p_ub = upper; // tracker C73258
+ }
+ #ifdef KMP_DEBUG
+ {
+ const char * buff;
+ // create format specifiers before the debug output
+ buff = __kmp_str_format( "__kmp_team_static_init exit: T#%%d team%%u liter=%%d "\
+ "iter=(%%%s, %%%s, %%%s) chunk %%%s\n",
+ traits_t< T >::spec, traits_t< T >::spec, traits_t< ST >::spec,
+ traits_t< ST >::spec );
+ KD_TRACE(100, ( buff, gtid, team_id, *p_last, *p_lb, *p_ub, *p_st, chunk ) );
+ __kmp_str_free( &buff );
+ }
+ #endif
+}
+
//--------------------------------------------------------------------------------------
extern "C" {
@@ -310,7 +677,7 @@ Each of the four functions here are identical apart from the argument types.
The functions compute the upper and lower bounds and stride to be used for the set of iterations
to be executed by the current thread from the statically scheduled loop that is described by the
-initial values of the bround, stride, increment and chunk size.
+initial values of the bounds, stride, increment and chunk size.
@{
*/
@@ -362,5 +729,155 @@ __kmpc_for_static_init_8u( ident_t *loc, kmp_int32 gtid, kmp_int32 schedtype, km
@}
*/
+/*!
+@ingroup WORK_SHARING
+@param loc Source code location
+@param gtid Global thread id of this thread
+@param scheduleD Scheduling type for the distribute
+@param scheduleL Scheduling type for the parallel loop
+@param plastiter Pointer to the "last iteration" flag
+@param plower Pointer to the lower bound
+@param pupper Pointer to the upper bound of loop chunk
+@param pupperD Pointer to the upper bound of dist_chunk
+@param pstrideD Pointer to the stride for distribute
+@param pstrideL Pointer to the stride for parallel loop
+@param incr Loop increment
+@param chunkD The chunk size for the distribute
+@param chunkL The chunk size for the parallel loop
+
+Each of the four functions here are identical apart from the argument types.
+
+The functions compute the upper and lower bounds and strides to be used for the set of iterations
+to be executed by the current thread from the statically scheduled loop that is described by the
+initial values of the bounds, strides, increment and chunks for parallel loop and distribute
+constructs.
+
+@{
+*/
+void
+__kmpc_dist_for_static_init_4(
+ ident_t *loc, kmp_int32 gtid, kmp_int32 schedule, kmp_int32 *plastiter,
+ kmp_int32 *plower, kmp_int32 *pupper, kmp_int32 *pupperD,
+ kmp_int32 *pstride, kmp_int32 incr, kmp_int32 chunk )
+{
+ __kmp_dist_for_static_init< kmp_int32 >(
+ loc, gtid, schedule, plastiter, plower, pupper, pupperD, pstride, incr, chunk );
+}
+
+/*!
+ See @ref __kmpc_dist_for_static_init_4
+ */
+void
+__kmpc_dist_for_static_init_4u(
+ ident_t *loc, kmp_int32 gtid, kmp_int32 schedule, kmp_int32 *plastiter,
+ kmp_uint32 *plower, kmp_uint32 *pupper, kmp_uint32 *pupperD,
+ kmp_int32 *pstride, kmp_int32 incr, kmp_int32 chunk )
+{
+ __kmp_dist_for_static_init< kmp_uint32 >(
+ loc, gtid, schedule, plastiter, plower, pupper, pupperD, pstride, incr, chunk );
+}
+
+/*!
+ See @ref __kmpc_dist_for_static_init_4
+ */
+void
+__kmpc_dist_for_static_init_8(
+ ident_t *loc, kmp_int32 gtid, kmp_int32 schedule, kmp_int32 *plastiter,
+ kmp_int64 *plower, kmp_int64 *pupper, kmp_int64 *pupperD,
+ kmp_int64 *pstride, kmp_int64 incr, kmp_int64 chunk )
+{
+ __kmp_dist_for_static_init< kmp_int64 >(
+ loc, gtid, schedule, plastiter, plower, pupper, pupperD, pstride, incr, chunk );
+}
+
+/*!
+ See @ref __kmpc_dist_for_static_init_4
+ */
+void
+__kmpc_dist_for_static_init_8u(
+ ident_t *loc, kmp_int32 gtid, kmp_int32 schedule, kmp_int32 *plastiter,
+ kmp_uint64 *plower, kmp_uint64 *pupper, kmp_uint64 *pupperD,
+ kmp_int64 *pstride, kmp_int64 incr, kmp_int64 chunk )
+{
+ __kmp_dist_for_static_init< kmp_uint64 >(
+ loc, gtid, schedule, plastiter, plower, pupper, pupperD, pstride, incr, chunk );
+}
+/*!
+@}
+*/
+
+//-----------------------------------------------------------------------------------------
+// Auxiliary routines for Distribute Parallel Loop construct implementation
+// Transfer call to template< type T >
+// __kmp_team_static_init( ident_t *loc, int gtid,
+// int *p_last, T *lb, T *ub, ST *st, ST incr, ST chunk )
+
+/*!
+@ingroup WORK_SHARING
+@{
+@param loc Source location
+@param gtid Global thread id
+@param p_last pointer to last iteration flag
+@param p_lb pointer to Lower bound
+@param p_ub pointer to Upper bound
+@param p_st Step (or increment if you prefer)
+@param incr Loop increment
+@param chunk The chunk size to block with
+
+The functions compute the upper and lower bounds and stride to be used for the set of iterations
+to be executed by the current team from the statically scheduled loop that is described by the
+initial values of the bounds, stride, increment and chunk for the distribute construct as part of
+composite distribute parallel loop construct.
+These functions are all identical apart from the types of the arguments.
+*/
+
+void
+__kmpc_team_static_init_4(
+ ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
+ kmp_int32 *p_lb, kmp_int32 *p_ub, kmp_int32 *p_st, kmp_int32 incr, kmp_int32 chunk )
+{
+ KMP_DEBUG_ASSERT( __kmp_init_serial );
+ __kmp_team_static_init< kmp_int32 >( loc, gtid, p_last, p_lb, p_ub, p_st, incr, chunk );
+}
+
+/*!
+ See @ref __kmpc_team_static_init_4
+ */
+void
+__kmpc_team_static_init_4u(
+ ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
+ kmp_uint32 *p_lb, kmp_uint32 *p_ub, kmp_int32 *p_st, kmp_int32 incr, kmp_int32 chunk )
+{
+ KMP_DEBUG_ASSERT( __kmp_init_serial );
+ __kmp_team_static_init< kmp_uint32 >( loc, gtid, p_last, p_lb, p_ub, p_st, incr, chunk );
+}
+
+/*!
+ See @ref __kmpc_team_static_init_4
+ */
+void
+__kmpc_team_static_init_8(
+ ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
+ kmp_int64 *p_lb, kmp_int64 *p_ub, kmp_int64 *p_st, kmp_int64 incr, kmp_int64 chunk )
+{
+ KMP_DEBUG_ASSERT( __kmp_init_serial );
+ __kmp_team_static_init< kmp_int64 >( loc, gtid, p_last, p_lb, p_ub, p_st, incr, chunk );
+}
+
+/*!
+ See @ref __kmpc_team_static_init_4
+ */
+void
+__kmpc_team_static_init_8u(
+ ident_t *loc, kmp_int32 gtid, kmp_int32 *p_last,
+ kmp_uint64 *p_lb, kmp_uint64 *p_ub, kmp_int64 *p_st, kmp_int64 incr, kmp_int64 chunk )
+{
+ KMP_DEBUG_ASSERT( __kmp_init_serial );
+ __kmp_team_static_init< kmp_uint64 >( loc, gtid, p_last, p_lb, p_ub, p_st, incr, chunk );
+}
+/*!
+@}
+*/
+
} // extern "C"
diff --git a/openmp/runtime/src/kmp_settings.c b/openmp/runtime/src/kmp_settings.c
index b85678e28fc..016e5a35859 100644
--- a/openmp/runtime/src/kmp_settings.c
+++ b/openmp/runtime/src/kmp_settings.c
@@ -1,7 +1,7 @@
/*
* kmp_settings.c -- Initialize environment variables
- * $Revision: 42816 $
- * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
*/
@@ -534,9 +534,9 @@ __kmp_stg_parse_file(
* out = __kmp_str_format( "%s", buffer );
} // __kmp_stg_parse_file
+#ifdef KMP_DEBUG
static char * par_range_to_print = NULL;
-#ifdef KMP_DEBUG
static void
__kmp_stg_parse_par_range(
char const * name,
@@ -945,6 +945,26 @@ __kmp_stg_print_settings( kmp_str_buf_t * buffer, char const * name, void * data
} // __kmp_stg_print_settings
// -------------------------------------------------------------------------------------------------
+// KMP_STACKPAD
+// -------------------------------------------------------------------------------------------------
+
+static void
+__kmp_stg_parse_stackpad( char const * name, char const * value, void * data ) {
+ __kmp_stg_parse_int(
+ name, // Env var name
+ value, // Env var value
+ KMP_MIN_STKPADDING, // Min value
+ KMP_MAX_STKPADDING, // Max value
+ & __kmp_stkpadding // Var to initialize
+ );
+} // __kmp_stg_parse_stackpad
+
+static void
+__kmp_stg_print_stackpad( kmp_str_buf_t * buffer, char const * name, void * data ) {
+ __kmp_stg_print_int( buffer, name, __kmp_stkpadding );
+} // __kmp_stg_print_stackpad
+
+// -------------------------------------------------------------------------------------------------
// KMP_STACKOFFSET
// -------------------------------------------------------------------------------------------------
@@ -1229,7 +1249,6 @@ __kmp_stg_print_num_threads( kmp_str_buf_t * buffer, char const * name, void * d
// OpenMP 3.0: KMP_TASKING, OMP_MAX_ACTIVE_LEVELS,
// -------------------------------------------------------------------------------------------------
-#if OMP_30_ENABLED
static void
__kmp_stg_parse_tasking( char const * name, char const * value, void * data ) {
__kmp_stg_parse_int( name, value, 0, (int)tskm_max, (int *)&__kmp_tasking_mode );
@@ -1259,7 +1278,41 @@ static void
__kmp_stg_print_max_active_levels( kmp_str_buf_t * buffer, char const * name, void * data ) {
__kmp_stg_print_int( buffer, name, __kmp_dflt_max_active_levels );
} // __kmp_stg_print_max_active_levels
-#endif // OMP_30_ENABLED
+
+#if KMP_NESTED_HOT_TEAMS
+// -------------------------------------------------------------------------------------------------
+// KMP_HOT_TEAMS_MAX_LEVEL, KMP_HOT_TEAMS_MODE
+// -------------------------------------------------------------------------------------------------
+
+static void
+__kmp_stg_parse_hot_teams_level( char const * name, char const * value, void * data ) {
+ if ( TCR_4(__kmp_init_parallel) ) {
+ KMP_WARNING( EnvParallelWarn, name );
+ return;
+ } // read value before first parallel only
+ __kmp_stg_parse_int( name, value, 0, KMP_MAX_ACTIVE_LEVELS_LIMIT, & __kmp_hot_teams_max_level );
+} // __kmp_stg_parse_hot_teams_level
+
+static void
+__kmp_stg_print_hot_teams_level( kmp_str_buf_t * buffer, char const * name, void * data ) {
+ __kmp_stg_print_int( buffer, name, __kmp_hot_teams_max_level );
+} // __kmp_stg_print_hot_teams_level
+
+static void
+__kmp_stg_parse_hot_teams_mode( char const * name, char const * value, void * data ) {
+ if ( TCR_4(__kmp_init_parallel) ) {
+ KMP_WARNING( EnvParallelWarn, name );
+ return;
+ } // read value before first parallel only
+ __kmp_stg_parse_int( name, value, 0, KMP_MAX_ACTIVE_LEVELS_LIMIT, & __kmp_hot_teams_mode );
+} // __kmp_stg_parse_hot_teams_mode
+
+static void
+__kmp_stg_print_hot_teams_mode( kmp_str_buf_t * buffer, char const * name, void * data ) {
+ __kmp_stg_print_int( buffer, name, __kmp_hot_teams_mode );
+} // __kmp_stg_print_hot_teams_mode
+
+#endif // KMP_NESTED_HOT_TEAMS
// -------------------------------------------------------------------------------------------------
// KMP_HANDLE_SIGNALS
@@ -1438,12 +1491,10 @@ __kmp_stg_parse_barrier_branch_bit( char const * name, char const * value, void
const char *var;
/* ---------- Barrier branch bit control ------------ */
-
for ( int i=bs_plain_barrier; i<bs_last_barrier; i++ ) {
var = __kmp_barrier_branch_bit_env_name[ i ];
-
if ( ( strcmp( var, name) == 0 ) && ( value != 0 ) ) {
- char *comma;
+ char *comma;
comma = (char *) strchr( value, ',' );
__kmp_barrier_gather_branch_bits[ i ] = ( kmp_uint32 ) __kmp_str_to_int( value, ',' );
@@ -1455,7 +1506,6 @@ __kmp_stg_parse_barrier_branch_bit( char const * name, char const * value, void
if ( __kmp_barrier_release_branch_bits[ i ] > KMP_MAX_BRANCH_BITS ) {
__kmp_msg( kmp_ms_warning, KMP_MSG( BarrReleaseValueInvalid, name, comma + 1 ), __kmp_msg_null );
-
__kmp_barrier_release_branch_bits[ i ] = __kmp_barrier_release_bb_dflt;
}
}
@@ -2037,11 +2087,6 @@ __kmp_parse_affinity_env( char const * name, char const * value,
# if OMP_40_ENABLED
KMP_DEBUG_ASSERT( ( __kmp_nested_proc_bind.bind_types != NULL )
&& ( __kmp_nested_proc_bind.used > 0 ) );
- if ( ( __kmp_affinity_notype != NULL )
- && ( ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_default )
- || ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_intel ) ) ) {
- type = TRUE;
- }
# endif
while ( *buf != '\0' ) {
@@ -2049,29 +2094,53 @@ __kmp_parse_affinity_env( char const * name, char const * value,
if (__kmp_match_str("none", buf, (const char **)&next)) {
set_type( affinity_none );
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_false;
+# endif
buf = next;
} else if (__kmp_match_str("scatter", buf, (const char **)&next)) {
set_type( affinity_scatter );
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
+# endif
buf = next;
} else if (__kmp_match_str("compact", buf, (const char **)&next)) {
set_type( affinity_compact );
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
+# endif
buf = next;
} else if (__kmp_match_str("logical", buf, (const char **)&next)) {
set_type( affinity_logical );
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
+# endif
buf = next;
} else if (__kmp_match_str("physical", buf, (const char **)&next)) {
set_type( affinity_physical );
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
+# endif
buf = next;
} else if (__kmp_match_str("explicit", buf, (const char **)&next)) {
set_type( affinity_explicit );
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
+# endif
buf = next;
# if KMP_MIC
} else if (__kmp_match_str("balanced", buf, (const char **)&next)) {
set_type( affinity_balanced );
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
+# endif
buf = next;
# endif
} else if (__kmp_match_str("disabled", buf, (const char **)&next)) {
set_type( affinity_disabled );
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_false;
+# endif
buf = next;
} else if (__kmp_match_str("verbose", buf, (const char **)&next)) {
set_verbose( TRUE );
@@ -2451,6 +2520,9 @@ __kmp_stg_parse_gomp_cpu_affinity( char const * name, char const * value, void *
__kmp_affinity_proclist = temp_proclist;
__kmp_affinity_type = affinity_explicit;
__kmp_affinity_gran = affinity_gran_fine;
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
+# endif
}
else {
KMP_WARNING( AffSyntaxError, name );
@@ -2772,6 +2844,21 @@ __kmp_stg_parse_places( char const * name, char const * value, void * data )
const char *scan = value;
const char *next = scan;
const char *kind = "\"threads\"";
+ kmp_setting_t **rivals = (kmp_setting_t **) data;
+ int rc;
+
+ rc = __kmp_stg_check_rivals( name, value, rivals );
+ if ( rc ) {
+ return;
+ }
+
+ //
+ // If OMP_PROC_BIND is not specified but OMP_PLACES is,
+ // then let OMP_PROC_BIND default to true.
+ //
+ if ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_default ) {
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_true;
+ }
//__kmp_affinity_num_places = 0;
@@ -2805,10 +2892,17 @@ __kmp_stg_parse_places( char const * name, char const * value, void * data )
__kmp_affinity_type = affinity_explicit;
__kmp_affinity_gran = affinity_gran_fine;
__kmp_affinity_dups = FALSE;
+ if ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_default ) {
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_true;
+ }
}
return;
}
+ if ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_default ) {
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_true;
+ }
+
SKIP_WS(scan);
if ( *scan == '\0' ) {
return;
@@ -2855,8 +2949,7 @@ __kmp_stg_print_places( kmp_str_buf_t * buffer, char const * name,
}
if ( ( __kmp_nested_proc_bind.used == 0 )
|| ( __kmp_nested_proc_bind.bind_types == NULL )
- || ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_false )
- || ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_intel ) ) {
+ || ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_false ) ) {
__kmp_str_buf_print( buffer, ": %s\n", KMP_I18N_STR( NotDefined ) );
}
else if ( __kmp_affinity_type == affinity_explicit ) {
@@ -2913,7 +3006,7 @@ __kmp_stg_print_places( kmp_str_buf_t * buffer, char const * name,
# endif /* OMP_40_ENABLED */
-# if OMP_30_ENABLED && (! OMP_40_ENABLED)
+# if (! OMP_40_ENABLED)
static void
__kmp_stg_parse_proc_bind( char const * name, char const * value, void * data )
@@ -2943,7 +3036,7 @@ __kmp_stg_parse_proc_bind( char const * name, char const * value, void * data )
}
} // __kmp_parse_proc_bind
-# endif /* if OMP_30_ENABLED && (! OMP_40_ENABLED) */
+# endif /* if (! OMP_40_ENABLED) */
static void
@@ -3132,11 +3225,7 @@ __kmp_stg_parse_proc_bind( char const * name, char const * value, void * data )
buf = next;
SKIP_WS( buf );
__kmp_nested_proc_bind.used = 1;
-
- //
- // "true" currently maps to "spread"
- //
- __kmp_nested_proc_bind.bind_types[0] = proc_bind_spread;
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_true;
}
else {
//
@@ -3454,7 +3543,7 @@ __kmp_stg_parse_schedule( char const * name, char const * value, void * data ) {
KMP_WARNING( InvalidClause, name, value );
} else
KMP_WARNING( EmptyClause, name );
- } while ( value = semicolon ? semicolon + 1 : NULL );
+ } while ( (value = semicolon ? semicolon + 1 : NULL) );
}
}; // if
@@ -3499,7 +3588,6 @@ __kmp_stg_parse_omp_schedule( char const * name, char const * value, void * data
else if (!__kmp_strcasecmp_with_sentinel("guided", value, ',')) /* GUIDED */
__kmp_sched = kmp_sch_guided_chunked;
// AC: TODO: add AUTO schedule, and pprobably remove TRAPEZOIDAL (OMP 3.0 does not allow it)
- #if OMP_30_ENABLED
else if (!__kmp_strcasecmp_with_sentinel("auto", value, ',')) { /* AUTO */
__kmp_sched = kmp_sch_auto;
if( comma ) {
@@ -3507,7 +3595,6 @@ __kmp_stg_parse_omp_schedule( char const * name, char const * value, void * data
comma = NULL;
}
}
- #endif // OMP_30_ENABLED
else if (!__kmp_strcasecmp_with_sentinel("trapezoidal", value, ',')) /* TRAPEZOIDAL */
__kmp_sched = kmp_sch_trapezoidal;
else if (!__kmp_strcasecmp_with_sentinel("static", value, ',')) /* STATIC */
@@ -4016,7 +4103,7 @@ __kmp_stg_parse_adaptive_lock_props( const char *name, const char *value, void *
break;
}
// Next character is not an integer or not a comma OR number of values > 2 => end of list
- if ( ( ( *next < '0' ) || ( *next > '9' ) ) && ( *next !=',') || ( total > 2 ) ) {
+ if ( ( ( *next < '0' || *next > '9' ) && *next !=',' ) || total > 2 ) {
KMP_WARNING( EnvSyntaxError, name, value );
return;
}
@@ -4314,6 +4401,10 @@ __kmp_stg_print_omp_display_env( kmp_str_buf_t * buffer, char const * name, void
static void
__kmp_stg_parse_omp_cancellation( char const * name, char const * value, void * data ) {
+ if ( TCR_4(__kmp_init_parallel) ) {
+ KMP_WARNING( EnvParallelWarn, name );
+ return;
+ } // read value before first parallel only
__kmp_stg_parse_bool( name, value, & __kmp_omp_cancellation );
} // __kmp_stg_parse_omp_cancellation
@@ -4340,6 +4431,7 @@ static kmp_setting_t __kmp_stg_table[] = {
{ "KMP_SETTINGS", __kmp_stg_parse_settings, __kmp_stg_print_settings, NULL, 0, 0 },
{ "KMP_STACKOFFSET", __kmp_stg_parse_stackoffset, __kmp_stg_print_stackoffset, NULL, 0, 0 },
{ "KMP_STACKSIZE", __kmp_stg_parse_stacksize, __kmp_stg_print_stacksize, NULL, 0, 0 },
+ { "KMP_STACKPAD", __kmp_stg_parse_stackpad, __kmp_stg_print_stackpad, NULL, 0, 0 },
{ "KMP_VERSION", __kmp_stg_parse_version, __kmp_stg_print_version, NULL, 0, 0 },
{ "KMP_WARNINGS", __kmp_stg_parse_warnings, __kmp_stg_print_warnings, NULL, 0, 0 },
@@ -4347,13 +4439,15 @@ static kmp_setting_t __kmp_stg_table[] = {
{ "OMP_NUM_THREADS", __kmp_stg_parse_num_threads, __kmp_stg_print_num_threads, NULL, 0, 0 },
{ "OMP_STACKSIZE", __kmp_stg_parse_stacksize, __kmp_stg_print_stacksize, NULL, 0, 0 },
-#if OMP_30_ENABLED
{ "KMP_TASKING", __kmp_stg_parse_tasking, __kmp_stg_print_tasking, NULL, 0, 0 },
{ "KMP_TASK_STEALING_CONSTRAINT", __kmp_stg_parse_task_stealing, __kmp_stg_print_task_stealing, NULL, 0, 0 },
{ "OMP_MAX_ACTIVE_LEVELS", __kmp_stg_parse_max_active_levels, __kmp_stg_print_max_active_levels, NULL, 0, 0 },
{ "OMP_THREAD_LIMIT", __kmp_stg_parse_all_threads, __kmp_stg_print_all_threads, NULL, 0, 0 },
{ "OMP_WAIT_POLICY", __kmp_stg_parse_wait_policy, __kmp_stg_print_wait_policy, NULL, 0, 0 },
-#endif // OMP_30_ENABLED
+#if KMP_NESTED_HOT_TEAMS
+ { "KMP_HOT_TEAMS_MAX_LEVEL", __kmp_stg_parse_hot_teams_level, __kmp_stg_print_hot_teams_level, NULL, 0, 0 },
+ { "KMP_HOT_TEAMS_MODE", __kmp_stg_parse_hot_teams_mode, __kmp_stg_print_hot_teams_mode, NULL, 0, 0 },
+#endif // KMP_NESTED_HOT_TEAMS
#if KMP_HANDLE_SIGNALS
{ "KMP_HANDLE_SIGNALS", __kmp_stg_parse_handle_signals, __kmp_stg_print_handle_signals, NULL, 0, 0 },
@@ -4411,18 +4505,16 @@ static kmp_setting_t __kmp_stg_table[] = {
# ifdef KMP_GOMP_COMPAT
{ "GOMP_CPU_AFFINITY", __kmp_stg_parse_gomp_cpu_affinity, NULL, /* no print */ NULL, 0, 0 },
# endif /* KMP_GOMP_COMPAT */
-# if OMP_30_ENABLED
-# if OMP_40_ENABLED
+# if OMP_40_ENABLED
{ "OMP_PROC_BIND", __kmp_stg_parse_proc_bind, __kmp_stg_print_proc_bind, NULL, 0, 0 },
{ "OMP_PLACES", __kmp_stg_parse_places, __kmp_stg_print_places, NULL, 0, 0 },
-# else
+# else
{ "OMP_PROC_BIND", __kmp_stg_parse_proc_bind, NULL, /* no print */ NULL, 0, 0 },
-# endif /* OMP_40_ENABLED */
-# endif /* OMP_30_ENABLED */
+# endif /* OMP_40_ENABLED */
{ "KMP_TOPOLOGY_METHOD", __kmp_stg_parse_topology_method, __kmp_stg_print_topology_method, NULL, 0, 0 },
-#elif !KMP_AFFINITY_SUPPORTED
+#else
//
// KMP_AFFINITY is not supported on OS X*, nor is OMP_PLACES.
@@ -4432,8 +4524,6 @@ static kmp_setting_t __kmp_stg_table[] = {
{ "OMP_PROC_BIND", __kmp_stg_parse_proc_bind, __kmp_stg_print_proc_bind, NULL, 0, 0 },
# endif
-#else
- #error "Unknown or unsupported OS"
#endif // KMP_AFFINITY_SUPPORTED
{ "KMP_INIT_AT_FORK", __kmp_stg_parse_init_at_fork, __kmp_stg_print_init_at_fork, NULL, 0, 0 },
@@ -4571,7 +4661,6 @@ __kmp_stg_init( void
}
-#if OMP_30_ENABLED
{ // Initialize KMP_LIBRARY and OMP_WAIT_POLICY data.
kmp_setting_t * kmp_library = __kmp_stg_find( "KMP_LIBRARY" ); // 1st priority.
@@ -4595,21 +4684,12 @@ __kmp_stg_init( void
}; // if
}
-#else
- {
- kmp_setting_t * kmp_library = __kmp_stg_find( "KMP_LIBRARY" );
- static kmp_stg_wp_data_t kmp_data = { 0, NULL };
- kmp_library->data = & kmp_data;
- }
-#endif /* OMP_30_ENABLED */
{ // Initialize KMP_ALL_THREADS, KMP_MAX_THREADS, and OMP_THREAD_LIMIT data.
kmp_setting_t * kmp_all_threads = __kmp_stg_find( "KMP_ALL_THREADS" ); // 1st priority.
kmp_setting_t * kmp_max_threads = __kmp_stg_find( "KMP_MAX_THREADS" ); // 2nd priority.
-#if OMP_30_ENABLED
kmp_setting_t * omp_thread_limit = __kmp_stg_find( "OMP_THREAD_LIMIT" ); // 3rd priority.
-#endif
// !!! volatile keyword is Intel (R) C Compiler bug CQ49908 workaround.
static kmp_setting_t * volatile rivals[ 4 ];
@@ -4617,20 +4697,16 @@ __kmp_stg_init( void
rivals[ i ++ ] = kmp_all_threads;
rivals[ i ++ ] = kmp_max_threads;
-#if OMP_30_ENABLED
if ( omp_thread_limit != NULL ) {
rivals[ i ++ ] = omp_thread_limit;
}; // if
-#endif
rivals[ i ++ ] = NULL;
kmp_all_threads->data = (void*)& rivals;
kmp_max_threads->data = (void*)& rivals;
-#if OMP_30_ENABLED
if ( omp_thread_limit != NULL ) {
omp_thread_limit->data = (void*)& rivals;
}; // if
-#endif
}
@@ -4645,18 +4721,11 @@ __kmp_stg_init( void
KMP_DEBUG_ASSERT( gomp_cpu_affinity != NULL );
# endif
-# if OMP_30_ENABLED
kmp_setting_t * omp_proc_bind = __kmp_stg_find( "OMP_PROC_BIND" ); // 3rd priority.
KMP_DEBUG_ASSERT( omp_proc_bind != NULL );
-# endif
-
-# if OMP_40_ENABLED
- kmp_setting_t * omp_places = __kmp_stg_find( "OMP_PLACES" ); // 3rd priority.
- KMP_DEBUG_ASSERT( omp_places != NULL );
-# endif
// !!! volatile keyword is Intel (R) C Compiler bug CQ49908 workaround.
- static kmp_setting_t * volatile rivals[ 5 ];
+ static kmp_setting_t * volatile rivals[ 4 ];
int i = 0;
rivals[ i ++ ] = kmp_affinity;
@@ -4666,23 +4735,30 @@ __kmp_stg_init( void
gomp_cpu_affinity->data = (void*)& rivals;
# endif
-# if OMP_30_ENABLED
rivals[ i ++ ] = omp_proc_bind;
omp_proc_bind->data = (void*)& rivals;
-# endif
+ rivals[ i ++ ] = NULL;
# if OMP_40_ENABLED
- rivals[ i ++ ] = omp_places;
- omp_places->data = (void*)& rivals;
-# endif
+ static kmp_setting_t * volatile places_rivals[ 4 ];
+ i = 0;
- rivals[ i ++ ] = NULL;
- }
+ kmp_setting_t * omp_places = __kmp_stg_find( "OMP_PLACES" ); // 3rd priority.
+ KMP_DEBUG_ASSERT( omp_places != NULL );
+ places_rivals[ i ++ ] = kmp_affinity;
+# ifdef KMP_GOMP_COMPAT
+ places_rivals[ i ++ ] = gomp_cpu_affinity;
+# endif
+ places_rivals[ i ++ ] = omp_places;
+ omp_places->data = (void*)& places_rivals;
+ places_rivals[ i ++ ] = NULL;
+# endif
+ }
#else
// KMP_AFFINITY not supported, so OMP_PROC_BIND has no rivals.
// OMP_PLACES not supported yet.
-#endif
+#endif // KMP_AFFINITY_SUPPORTED
{ // Initialize KMP_DETERMINISTIC_REDUCTION and KMP_FORCE_REDUCTION data.
@@ -4917,8 +4993,33 @@ __kmp_env_initialize( char const * string ) {
&& ( FIND( aff_str, "disabled" ) == NULL ) ) {
__kmp_affinity_notype = __kmp_stg_find( "KMP_AFFINITY" );
}
+ else {
+ //
+ // A new affinity type is specified.
+ // Reset the affinity flags to their default values,
+ // in case this is called from kmp_set_defaults().
+ //
+ __kmp_affinity_type = affinity_default;
+ __kmp_affinity_gran = affinity_gran_default;
+ __kmp_affinity_top_method = affinity_top_method_default;
+ __kmp_affinity_respect_mask = affinity_respect_mask_default;
+ }
# undef FIND
+
+#if OMP_40_ENABLED
+ //
+ // Also reset the affinity flags if OMP_PROC_BIND is specified.
+ //
+ aff_str = __kmp_env_blk_var( & block, "OMP_PROC_BIND" );
+ if ( aff_str != NULL ) {
+ __kmp_affinity_type = affinity_default;
+ __kmp_affinity_gran = affinity_gran_default;
+ __kmp_affinity_top_method = affinity_top_method_default;
+ __kmp_affinity_respect_mask = affinity_respect_mask_default;
+ }
+#endif /* OMP_40_ENABLED */
}
+
#endif /* KMP_AFFINITY_SUPPORTED */
#if OMP_40_ENABLED
@@ -4956,9 +5057,15 @@ __kmp_env_initialize( char const * string ) {
else {
KMP_DEBUG_ASSERT( string != NULL); // kmp_set_defaults() was called
KMP_DEBUG_ASSERT( __kmp_user_lock_kind != lk_default );
+ __kmp_set_user_lock_vptrs( __kmp_user_lock_kind );
+ // Binds lock functions again to follow the transition between different
+ // KMP_CONSISTENCY_CHECK values. Calling this again is harmless as long
+ // as we do not allow lock kind changes after making a call to any
+ // user lock functions (true).
}
#if KMP_AFFINITY_SUPPORTED
+
if ( ! TCR_4(__kmp_init_middle) ) {
//
// Determine if the machine/OS is actually capable of supporting
@@ -4984,102 +5091,87 @@ __kmp_env_initialize( char const * string ) {
}
# if OMP_40_ENABLED
-
if ( __kmp_affinity_type == affinity_disabled ) {
__kmp_nested_proc_bind.bind_types[0] = proc_bind_disabled;
}
- else if ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_default ) {
+ else if ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_true ) {
//
- // Where supported the default is to use the KMP_AFFINITY
- // mechanism. On OS X* etc. it is none.
+ // OMP_PROC_BIND=true maps to OMP_PROC_BIND=spread.
//
-# if KMP_AFFINITY_SUPPORTED
- __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
-# else
- __kmp_nested_proc_bind.bind_types[0] = proc_bind_false;
-# endif
- }
-
- //
- // If OMP_PROC_BIND was specified (so we are using OpenMP 4.0 affinity)
- // but OMP_PLACES was not, then it defaults to the equivalent of
- // KMP_AFFINITY=compact,noduplicates,granularity=fine.
- //
- if ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_intel ) {
- if ( ( __kmp_affinity_type == affinity_none )
-# if ! KMP_MIC
- || ( __kmp_affinity_type == affinity_default )
-# endif
- ) {
- __kmp_nested_proc_bind.bind_types[0] = proc_bind_false;
- }
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_spread;
}
- else if ( ( __kmp_nested_proc_bind.bind_types[0] != proc_bind_false )
- && ( __kmp_nested_proc_bind.bind_types[0] != proc_bind_disabled ) ) {
- if ( __kmp_affinity_type == affinity_default ) {
- __kmp_affinity_type = affinity_compact;
- __kmp_affinity_dups = FALSE;
- }
- if ( __kmp_affinity_gran == affinity_gran_default ) {
- __kmp_affinity_gran = affinity_gran_fine;
- }
- }
-# endif // OMP_40_ENABLED
+# endif /* OMP_40_ENABLED */
if ( KMP_AFFINITY_CAPABLE() ) {
# if KMP_OS_WINDOWS && KMP_ARCH_X86_64
- if ( __kmp_num_proc_groups > 1 ) {
+ //
+ // Handle the Win 64 group affinity stuff if there are multiple
+ // processor groups, or if the user requested it, and OMP 4.0
+ // affinity is not in effect.
+ //
+ if ( ( ( __kmp_num_proc_groups > 1 )
+ && ( __kmp_affinity_type == affinity_default )
+# if OMP_40_ENABLED
+ && ( __kmp_nested_proc_bind.bind_types[0] == proc_bind_default ) )
+# endif
+ || ( __kmp_affinity_top_method == affinity_top_method_group ) ) {
if ( __kmp_affinity_respect_mask == affinity_respect_mask_default ) {
- __kmp_affinity_respect_mask = FALSE;
+ __kmp_affinity_respect_mask = FALSE;
}
-
- if ( ( __kmp_affinity_type == affinity_default )
- || ( __kmp_affinity_type == affinity_none ) ) {
- if ( __kmp_affinity_type == affinity_none ) {
- if ( __kmp_affinity_verbose || ( __kmp_affinity_warnings
- && ( __kmp_affinity_type != affinity_none ) ) ) {
- KMP_WARNING( AffTypeCantUseMultGroups, "none", "compact" );
- }
- }
+ if ( __kmp_affinity_type == affinity_default ) {
__kmp_affinity_type = affinity_compact;
- if ( __kmp_affinity_top_method == affinity_top_method_default ) {
- __kmp_affinity_top_method = affinity_top_method_group;
- }
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
+# endif
}
- else if ( __kmp_affinity_top_method == affinity_top_method_default ) {
- __kmp_affinity_top_method = affinity_top_method_all;
+ if ( __kmp_affinity_top_method == affinity_top_method_default ) {
+ if ( __kmp_affinity_gran == affinity_gran_default ) {
+ __kmp_affinity_top_method = affinity_top_method_group;
+ __kmp_affinity_gran = affinity_gran_group;
+ }
+ else if ( __kmp_affinity_gran == affinity_gran_group ) {
+ __kmp_affinity_top_method = affinity_top_method_group;
+ }
+ else {
+ __kmp_affinity_top_method = affinity_top_method_all;
+ }
}
-
- if ( __kmp_affinity_gran_levels < 0 ) {
- if ( __kmp_affinity_top_method == affinity_top_method_group ) {
- if ( __kmp_affinity_gran == affinity_gran_default ) {
- __kmp_affinity_gran = affinity_gran_group;
- }
- else if ( __kmp_affinity_gran == affinity_gran_core ) {
- if ( __kmp_affinity_verbose || ( __kmp_affinity_warnings
- && ( __kmp_affinity_type != affinity_none ) ) ) {
- KMP_WARNING( AffGranCantUseMultGroups, "core", "thread" );
- }
- __kmp_affinity_gran = affinity_gran_thread;
- }
- else if ( __kmp_affinity_gran == affinity_gran_package ) {
- if ( __kmp_affinity_verbose || ( __kmp_affinity_warnings
- && ( __kmp_affinity_type != affinity_none ) ) ) {
- KMP_WARNING( AffGranCantUseMultGroups, "package", "group" );
- }
- __kmp_affinity_gran = affinity_gran_group;
- }
- else if ( __kmp_affinity_gran == affinity_gran_node ) {
- if ( __kmp_affinity_verbose || ( __kmp_affinity_warnings
- && ( __kmp_affinity_type != affinity_none ) ) ) {
- KMP_WARNING( AffGranCantUseMultGroups, "node", "group" );
- }
- __kmp_affinity_gran = affinity_gran_group;
+ else if ( __kmp_affinity_top_method == affinity_top_method_group ) {
+ if ( __kmp_affinity_gran == affinity_gran_default ) {
+ __kmp_affinity_gran = affinity_gran_group;
+ }
+ else if ( ( __kmp_affinity_gran != affinity_gran_group )
+ && ( __kmp_affinity_gran != affinity_gran_fine )
+ && ( __kmp_affinity_gran != affinity_gran_thread ) ) {
+ char *str = NULL;
+ switch ( __kmp_affinity_gran ) {
+ case affinity_gran_core: str = "core"; break;
+ case affinity_gran_package: str = "package"; break;
+ case affinity_gran_node: str = "node"; break;
+ default: KMP_DEBUG_ASSERT( 0 );
}
+ KMP_WARNING( AffGranTopGroup, var, str );
+ __kmp_affinity_gran = affinity_gran_fine;
}
- else if ( __kmp_affinity_gran == affinity_gran_default ) {
+ }
+ else {
+ if ( __kmp_affinity_gran == affinity_gran_default ) {
+ __kmp_affinity_gran = affinity_gran_core;
+ }
+ else if ( __kmp_affinity_gran == affinity_gran_group ) {
+ char *str = NULL;
+ switch ( __kmp_affinity_type ) {
+ case affinity_physical: str = "physical"; break;
+ case affinity_logical: str = "logical"; break;
+ case affinity_compact: str = "compact"; break;
+ case affinity_scatter: str = "scatter"; break;
+ case affinity_explicit: str = "explicit"; break;
+ // No MIC on windows, so no affinity_balanced case
+ default: KMP_DEBUG_ASSERT( 0 );
+ }
+ KMP_WARNING( AffGranGroupType, var, str );
__kmp_affinity_gran = affinity_gran_core;
}
}
@@ -5087,27 +5179,52 @@ __kmp_env_initialize( char const * string ) {
else
# endif /* KMP_OS_WINDOWS && KMP_ARCH_X86_64 */
+
{
if ( __kmp_affinity_respect_mask == affinity_respect_mask_default ) {
- __kmp_affinity_respect_mask = TRUE;
+# if KMP_OS_WINDOWS && KMP_ARCH_X86_64
+ if ( __kmp_num_proc_groups > 1 ) {
+ __kmp_affinity_respect_mask = FALSE;
+ }
+ else
+# endif /* KMP_OS_WINDOWS && KMP_ARCH_X86_64 */
+ {
+ __kmp_affinity_respect_mask = TRUE;
+ }
+ }
+# if OMP_40_ENABLED
+ if ( ( __kmp_nested_proc_bind.bind_types[0] != proc_bind_intel )
+ && ( __kmp_nested_proc_bind.bind_types[0] != proc_bind_default ) ) {
+ if ( __kmp_affinity_type == affinity_default ) {
+ __kmp_affinity_type = affinity_compact;
+ __kmp_affinity_dups = FALSE;
+ }
}
+ else
+# endif /* OMP_40_ENABLED */
if ( __kmp_affinity_type == affinity_default ) {
# if KMP_MIC
- __kmp_affinity_type = affinity_scatter;
+ __kmp_affinity_type = affinity_scatter;
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_intel;
+# endif
# else
- __kmp_affinity_type = affinity_none;
+ __kmp_affinity_type = affinity_none;
+# if OMP_40_ENABLED
+ __kmp_nested_proc_bind.bind_types[0] = proc_bind_false;
+# endif
# endif
}
if ( ( __kmp_affinity_gran == affinity_gran_default )
&& ( __kmp_affinity_gran_levels < 0 ) ) {
# if KMP_MIC
- __kmp_affinity_gran = affinity_gran_fine;
+ __kmp_affinity_gran = affinity_gran_fine;
# else
- __kmp_affinity_gran = affinity_gran_core;
+ __kmp_affinity_gran = affinity_gran_core;
# endif
}
if ( __kmp_affinity_top_method == affinity_top_method_default ) {
- __kmp_affinity_top_method = affinity_top_method_all;
+ __kmp_affinity_top_method = affinity_top_method_all;
}
}
}
@@ -5164,9 +5281,8 @@ __kmp_env_print() {
char const * name = block.vars[ i ].name;
char const * value = block.vars[ i ].value;
if (
- strlen( name ) > 4
- &&
- ( strncmp( name, "KMP_", 4 ) == 0 ) || strncmp( name, "OMP_", 4 ) == 0
+ ( strlen( name ) > 4 && strncmp( name, "KMP_", 4 ) == 0 )
+ || strncmp( name, "OMP_", 4 ) == 0
#ifdef KMP_GOMP_COMPAT
|| strncmp( name, "GOMP_", 5 ) == 0
#endif // KMP_GOMP_COMPAT
diff --git a/openmp/runtime/src/kmp_settings.h b/openmp/runtime/src/kmp_settings.h
index ebddc1db0ca..e1ad4280e7b 100644
--- a/openmp/runtime/src/kmp_settings.h
+++ b/openmp/runtime/src/kmp_settings.h
@@ -1,7 +1,7 @@
/*
* kmp_settings.h -- Initialize environment variables
- * $Revision: 42598 $
- * $Date: 2013-08-19 15:40:56 -0500 (Mon, 19 Aug 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_stats.cpp b/openmp/runtime/src/kmp_stats.cpp
new file mode 100644
index 00000000000..9750f7b3636
--- /dev/null
+++ b/openmp/runtime/src/kmp_stats.cpp
@@ -0,0 +1,615 @@
+/** @file kmp_stats.cpp
+ * Statistics gathering and processing.
+ */
+
+
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.txt for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#if KMP_STATS_ENABLED
+
+#include "kmp.h"
+#include "kmp_str.h"
+#include "kmp_lock.h"
+#include "kmp_stats.h"
+
+#include <algorithm>
+#include <sstream>
+#include <iomanip>
+#include <stdlib.h> // for atexit
+
+#define STRINGIZE2(x) #x
+#define STRINGIZE(x) STRINGIZE2(x)
+
+#define expandName(name,flags,ignore) {STRINGIZE(name),flags},
+statInfo timeStat::timerInfo[] = {
+ KMP_FOREACH_TIMER(expandName,0)
+ {0,0}
+};
+const statInfo counter::counterInfo[] = {
+ KMP_FOREACH_COUNTER(expandName,0)
+ {0,0}
+};
+#undef expandName
+
+#define expandName(ignore1,ignore2,ignore3) {0.0,0.0,0.0},
+kmp_stats_output_module::rgb_color kmp_stats_output_module::timerColorInfo[] = {
+ KMP_FOREACH_TIMER(expandName,0)
+ {0.0,0.0,0.0}
+};
+#undef expandName
+
+const kmp_stats_output_module::rgb_color kmp_stats_output_module::globalColorArray[] = {
+ {1.0, 0.0, 0.0}, // red
+ {1.0, 0.6, 0.0}, // orange
+ {1.0, 1.0, 0.0}, // yellow
+ {0.0, 1.0, 0.0}, // green
+ {0.0, 0.0, 1.0}, // blue
+ {0.6, 0.2, 0.8}, // purple
+ {1.0, 0.0, 1.0}, // magenta
+ {0.0, 0.4, 0.2}, // dark green
+ {1.0, 1.0, 0.6}, // light yellow
+ {0.6, 0.4, 0.6}, // dirty purple
+ {0.0, 1.0, 1.0}, // cyan
+ {1.0, 0.4, 0.8}, // pink
+ {0.5, 0.5, 0.5}, // grey
+ {0.8, 0.7, 0.5}, // brown
+ {0.6, 0.6, 1.0}, // light blue
+ {1.0, 0.7, 0.5}, // peach
+ {0.8, 0.5, 1.0}, // lavender
+ {0.6, 0.0, 0.0}, // dark red
+ {0.7, 0.6, 0.0}, // gold
+ {0.0, 0.0, 0.0} // black
+};
+
+// Ensure that the atexit handler only runs once.
+static uint32_t statsPrinted = 0;
+
+// output interface
+static kmp_stats_output_module __kmp_stats_global_output;
+
+/* ****************************************************** */
+/* ************* statistic member functions ************* */
+
+void statistic::addSample(double sample)
+{
+ double delta = sample - meanVal;
+
+ sampleCount = sampleCount + 1;
+ meanVal = meanVal + delta/sampleCount;
+ m2 = m2 + delta*(sample - meanVal);
+
+ minVal = std::min(minVal, sample);
+ maxVal = std::max(maxVal, sample);
+}
+
+statistic & statistic::operator+= (const statistic & other)
+{
+ if (sampleCount == 0)
+ {
+ *this = other;
+ return *this;
+ }
+
+ uint64_t newSampleCount = sampleCount + other.sampleCount;
+ double dnsc = double(newSampleCount);
+ double dsc = double(sampleCount);
+ double dscBydnsc = dsc/dnsc;
+ double dosc = double(other.sampleCount);
+ double delta = other.meanVal - meanVal;
+
+ // Try to order these calculations to avoid overflows.
+ // If this were Fortran, then the compiler would not be able to re-order over brackets.
+ // In C++ it may be legal to do that (we certainly hope it doesn't, and CC+ Programming Language 2nd edition
+ // suggests it shouldn't, since it says that exploitation of associativity can only be made if the operation
+ // really is associative (which floating addition isn't...)).
+ meanVal = meanVal*dscBydnsc + other.meanVal*(1-dscBydnsc);
+ m2 = m2 + other.m2 + dscBydnsc*dosc*delta*delta;
+ minVal = std::min (minVal, other.minVal);
+ maxVal = std::max (maxVal, other.maxVal);
+ sampleCount = newSampleCount;
+
+
+ return *this;
+}
+
+void statistic::scale(double factor)
+{
+ minVal = minVal*factor;
+ maxVal = maxVal*factor;
+ meanVal= meanVal*factor;
+ m2 = m2*factor*factor;
+ return;
+}
+
+std::string statistic::format(char unit, bool total) const
+{
+ std::string result = formatSI(sampleCount,9,' ');
+
+ result = result + std::string(", ") + formatSI(minVal, 9, unit);
+ result = result + std::string(", ") + formatSI(meanVal, 9, unit);
+ result = result + std::string(", ") + formatSI(maxVal, 9, unit);
+ if (total)
+ result = result + std::string(", ") + formatSI(meanVal*sampleCount, 9, unit);
+ result = result + std::string(", ") + formatSI(getSD(), 9, unit);
+
+ return result;
+}
+
+/* ********************************************************** */
+/* ************* explicitTimer member functions ************* */
+
+void explicitTimer::start(timer_e timerEnumValue) {
+ startTime = tsc_tick_count::now();
+ if(timeStat::logEvent(timerEnumValue)) {
+ __kmp_stats_thread_ptr->incrementNestValue();
+ }
+ return;
+}
+
+void explicitTimer::stop(timer_e timerEnumValue) {
+ if (startTime.getValue() == 0)
+ return;
+
+ tsc_tick_count finishTime = tsc_tick_count::now();
+
+ //stat->addSample ((tsc_tick_count::now() - startTime).ticks());
+ stat->addSample ((finishTime - startTime).ticks());
+
+ if(timeStat::logEvent(timerEnumValue)) {
+ __kmp_stats_thread_ptr->push_event(startTime.getValue() - __kmp_stats_start_time.getValue(), finishTime.getValue() - __kmp_stats_start_time.getValue(), __kmp_stats_thread_ptr->getNestValue(), timerEnumValue);
+ __kmp_stats_thread_ptr->decrementNestValue();
+ }
+
+ /* We accept the risk that we drop a sample because it really did start at t==0. */
+ startTime = 0;
+ return;
+}
+
+/* ******************************************************************* */
+/* ************* kmp_stats_event_vector member functions ************* */
+
+void kmp_stats_event_vector::deallocate() {
+ __kmp_free(events);
+ internal_size = 0;
+ allocated_size = 0;
+ events = NULL;
+}
+
+// This function is for qsort() which requires the compare function to return
+// either a negative number if event1 < event2, a positive number if event1 > event2
+// or zero if event1 == event2.
+// This sorts by start time (lowest to highest).
+int compare_two_events(const void* event1, const void* event2) {
+ kmp_stats_event* ev1 = (kmp_stats_event*)event1;
+ kmp_stats_event* ev2 = (kmp_stats_event*)event2;
+
+ if(ev1->getStart() < ev2->getStart()) return -1;
+ else if(ev1->getStart() > ev2->getStart()) return 1;
+ else return 0;
+}
+
+void kmp_stats_event_vector::sort() {
+ qsort(events, internal_size, sizeof(kmp_stats_event), compare_two_events);
+}
+
+/* *********************************************************** */
+/* ************* kmp_stats_list member functions ************* */
+
+// returns a pointer to newly created stats node
+kmp_stats_list* kmp_stats_list::push_back(int gtid) {
+ kmp_stats_list* newnode = (kmp_stats_list*)__kmp_allocate(sizeof(kmp_stats_list));
+ // placement new, only requires space and pointer and initializes (so __kmp_allocate instead of C++ new[] is used)
+ new (newnode) kmp_stats_list();
+ newnode->setGtid(gtid);
+ newnode->prev = this->prev;
+ newnode->next = this;
+ newnode->prev->next = newnode;
+ newnode->next->prev = newnode;
+ return newnode;
+}
+void kmp_stats_list::deallocate() {
+ kmp_stats_list* ptr = this->next;
+ kmp_stats_list* delptr = this->next;
+ while(ptr != this) {
+ delptr = ptr;
+ ptr=ptr->next;
+ // placement new means we have to explicitly call destructor.
+ delptr->_event_vector.deallocate();
+ delptr->~kmp_stats_list();
+ __kmp_free(delptr);
+ }
+}
+kmp_stats_list::iterator kmp_stats_list::begin() {
+ kmp_stats_list::iterator it;
+ it.ptr = this->next;
+ return it;
+}
+kmp_stats_list::iterator kmp_stats_list::end() {
+ kmp_stats_list::iterator it;
+ it.ptr = this;
+ return it;
+}
+int kmp_stats_list::size() {
+ int retval;
+ kmp_stats_list::iterator it;
+ for(retval=0, it=begin(); it!=end(); it++, retval++) {}
+ return retval;
+}
+
+/* ********************************************************************* */
+/* ************* kmp_stats_list::iterator member functions ************* */
+
+kmp_stats_list::iterator::iterator() : ptr(NULL) {}
+kmp_stats_list::iterator::~iterator() {}
+kmp_stats_list::iterator kmp_stats_list::iterator::operator++() {
+ this->ptr = this->ptr->next;
+ return *this;
+}
+kmp_stats_list::iterator kmp_stats_list::iterator::operator++(int dummy) {
+ this->ptr = this->ptr->next;
+ return *this;
+}
+kmp_stats_list::iterator kmp_stats_list::iterator::operator--() {
+ this->ptr = this->ptr->prev;
+ return *this;
+}
+kmp_stats_list::iterator kmp_stats_list::iterator::operator--(int dummy) {
+ this->ptr = this->ptr->prev;
+ return *this;
+}
+bool kmp_stats_list::iterator::operator!=(const kmp_stats_list::iterator & rhs) {
+ return this->ptr!=rhs.ptr;
+}
+bool kmp_stats_list::iterator::operator==(const kmp_stats_list::iterator & rhs) {
+ return this->ptr==rhs.ptr;
+}
+kmp_stats_list* kmp_stats_list::iterator::operator*() const {
+ return this->ptr;
+}
+
+/* *************************************************************** */
+/* ************* kmp_stats_output_module functions ************** */
+
+const char* kmp_stats_output_module::outputFileName = NULL;
+const char* kmp_stats_output_module::eventsFileName = NULL;
+const char* kmp_stats_output_module::plotFileName = NULL;
+int kmp_stats_output_module::printPerThreadFlag = 0;
+int kmp_stats_output_module::printPerThreadEventsFlag = 0;
+
+// init() is called very near the beginning of execution time in the constructor of __kmp_stats_global_output
+void kmp_stats_output_module::init()
+{
+ char * statsFileName = getenv("KMP_STATS_FILE");
+ eventsFileName = getenv("KMP_STATS_EVENTS_FILE");
+ plotFileName = getenv("KMP_STATS_PLOT_FILE");
+ char * threadStats = getenv("KMP_STATS_THREADS");
+ char * threadEvents = getenv("KMP_STATS_EVENTS");
+
+ // set the stats output filenames based on environment variables and defaults
+ outputFileName = statsFileName;
+ eventsFileName = eventsFileName ? eventsFileName : "events.dat";
+ plotFileName = plotFileName ? plotFileName : "events.plt";
+
+ // set the flags based on environment variables matching: true, on, 1, .true. , .t. , yes
+ printPerThreadFlag = __kmp_str_match_true(threadStats);
+ printPerThreadEventsFlag = __kmp_str_match_true(threadEvents);
+
+ if(printPerThreadEventsFlag) {
+ // assigns a color to each timer for printing
+ setupEventColors();
+ } else {
+ // will clear flag so that no event will be logged
+ timeStat::clearEventFlags();
+ }
+
+ return;
+}
+
+void kmp_stats_output_module::setupEventColors() {
+ int i;
+ int globalColorIndex = 0;
+ int numGlobalColors = sizeof(globalColorArray) / sizeof(rgb_color);
+ for(i=0;i<TIMER_LAST;i++) {
+ if(timeStat::logEvent((timer_e)i)) {
+ timerColorInfo[i] = globalColorArray[globalColorIndex];
+ globalColorIndex = (globalColorIndex+1)%numGlobalColors;
+ }
+ }
+ return;
+}
+
+void kmp_stats_output_module::printStats(FILE *statsOut, statistic const * theStats, bool areTimers)
+{
+ if (areTimers)
+ {
+ // Check if we have useful timers, since we don't print zero value timers we need to avoid
+ // printing a header and then no data.
+ bool haveTimers = false;
+ for (int s = 0; s<TIMER_LAST; s++)
+ {
+ if (theStats[s].getCount() != 0)
+ {
+ haveTimers = true;
+ break;
+ }
+ }
+ if (!haveTimers)
+ return;
+ }
+
+ // Print
+ const char * title = areTimers ? "Timer, SampleCount," : "Counter, ThreadCount,";
+ fprintf (statsOut, "%s Min, Mean, Max, Total, SD\n", title);
+ if (areTimers) {
+ for (int s = 0; s<TIMER_LAST; s++) {
+ statistic const * stat = &theStats[s];
+ if (stat->getCount() != 0) {
+ char tag = timeStat::noUnits(timer_e(s)) ? ' ' : 'T';
+ fprintf (statsOut, "%-25s, %s\n", timeStat::name(timer_e(s)), stat->format(tag, true).c_str());
+ }
+ }
+ } else { // Counters
+ for (int s = 0; s<COUNTER_LAST; s++) {
+ statistic const * stat = &theStats[s];
+ fprintf (statsOut, "%-25s, %s\n", counter::name(counter_e(s)), stat->format(' ', true).c_str());
+ }
+ }
+}
+
+void kmp_stats_output_module::printCounters(FILE * statsOut, counter const * theCounters)
+{
+ // We print all the counters even if they are zero.
+ // That makes it easier to slice them into a spreadsheet if you need to.
+ fprintf (statsOut, "\nCounter, Count\n");
+ for (int c = 0; c<COUNTER_LAST; c++) {
+ counter const * stat = &theCounters[c];
+ fprintf (statsOut, "%-25s, %s\n", counter::name(counter_e(c)), formatSI(stat->getValue(), 9, ' ').c_str());
+ }
+}
+
+void kmp_stats_output_module::printEvents(FILE* eventsOut, kmp_stats_event_vector* theEvents, int gtid) {
+ // sort by start time before printing
+ theEvents->sort();
+ for (int i = 0; i < theEvents->size(); i++) {
+ kmp_stats_event ev = theEvents->at(i);
+ rgb_color color = getEventColor(ev.getTimerName());
+ fprintf(eventsOut, "%d %lu %lu %1.1f rgb(%1.1f,%1.1f,%1.1f) %s\n",
+ gtid,
+ ev.getStart(),
+ ev.getStop(),
+ 1.2 - (ev.getNestLevel() * 0.2),
+ color.r, color.g, color.b,
+ timeStat::name(ev.getTimerName())
+ );
+ }
+ return;
+}
+
+void kmp_stats_output_module::windupExplicitTimers()
+{
+ // Wind up any explicit timers. We assume that it's fair at this point to just walk all the explcit timers in all threads
+ // and say "it's over".
+ // If the timer wasn't running, this won't record anything anyway.
+ kmp_stats_list::iterator it;
+ for(it = __kmp_stats_list.begin(); it != __kmp_stats_list.end(); it++) {
+ for (int timer=0; timer<EXPLICIT_TIMER_LAST; timer++) {
+ (*it)->getExplicitTimer(explicit_timer_e(timer))->stop((timer_e)timer);
+ }
+ }
+}
+
+void kmp_stats_output_module::printPloticusFile() {
+ int i;
+ int size = __kmp_stats_list.size();
+ FILE* plotOut = fopen(plotFileName, "w+");
+
+ fprintf(plotOut, "#proc page\n"
+ " pagesize: 15 10\n"
+ " scale: 1.0\n\n");
+
+ fprintf(plotOut, "#proc getdata\n"
+ " file: %s\n\n",
+ eventsFileName);
+
+ fprintf(plotOut, "#proc areadef\n"
+ " title: OpenMP Sampling Timeline\n"
+ " titledetails: align=center size=16\n"
+ " rectangle: 1 1 13 9\n"
+ " xautorange: datafield=2,3\n"
+ " yautorange: -1 %d\n\n",
+ size);
+
+ fprintf(plotOut, "#proc xaxis\n"
+ " stubs: inc\n"
+ " stubdetails: size=12\n"
+ " label: Time (ticks)\n"
+ " labeldetails: size=14\n\n");
+
+ fprintf(plotOut, "#proc yaxis\n"
+ " stubs: inc 1\n"
+ " stubrange: 0 %d\n"
+ " stubdetails: size=12\n"
+ " label: Thread #\n"
+ " labeldetails: size=14\n\n",
+ size-1);
+
+ fprintf(plotOut, "#proc bars\n"
+ " exactcolorfield: 5\n"
+ " axis: x\n"
+ " locfield: 1\n"
+ " segmentfields: 2 3\n"
+ " barwidthfield: 4\n\n");
+
+ // create legend entries corresponding to the timer color
+ for(i=0;i<TIMER_LAST;i++) {
+ if(timeStat::logEvent((timer_e)i)) {
+ rgb_color c = getEventColor((timer_e)i);
+ fprintf(plotOut, "#proc legendentry\n"
+ " sampletype: color\n"
+ " label: %s\n"
+ " details: rgb(%1.1f,%1.1f,%1.1f)\n\n",
+ timeStat::name((timer_e)i),
+ c.r, c.g, c.b);
+
+ }
+ }
+
+ fprintf(plotOut, "#proc legend\n"
+ " format: down\n"
+ " location: max max\n\n");
+ fclose(plotOut);
+ return;
+}
+
+void kmp_stats_output_module::outputStats(const char* heading)
+{
+ statistic allStats[TIMER_LAST];
+ statistic allCounters[COUNTER_LAST];
+
+ // stop all the explicit timers for all threads
+ windupExplicitTimers();
+
+ FILE * eventsOut;
+ FILE * statsOut = outputFileName ? fopen (outputFileName, "a+") : stderr;
+
+ if (eventPrintingEnabled()) {
+ eventsOut = fopen(eventsFileName, "w+");
+ }
+
+ if (!statsOut)
+ statsOut = stderr;
+
+ fprintf(statsOut, "%s\n",heading);
+ // Accumulate across threads.
+ kmp_stats_list::iterator it;
+ for (it = __kmp_stats_list.begin(); it != __kmp_stats_list.end(); it++) {
+ int t = (*it)->getGtid();
+ // Output per thread stats if requested.
+ if (perThreadPrintingEnabled()) {
+ fprintf (statsOut, "Thread %d\n", t);
+ printStats(statsOut, (*it)->getTimers(), true);
+ printCounters(statsOut, (*it)->getCounters());
+ fprintf(statsOut,"\n");
+ }
+ // Output per thread events if requested.
+ if (eventPrintingEnabled()) {
+ kmp_stats_event_vector events = (*it)->getEventVector();
+ printEvents(eventsOut, &events, t);
+ }
+
+ for (int s = 0; s<TIMER_LAST; s++) {
+ // See if we should ignore this timer when aggregating
+ if ((timeStat::masterOnly(timer_e(s)) && (t != 0)) || // Timer is only valid on the master and this thread is a worker
+ (timeStat::workerOnly(timer_e(s)) && (t == 0)) || // Timer is only valid on a worker and this thread is the master
+ timeStat::synthesized(timer_e(s)) // It's a synthesized stat, so there's no raw data for it.
+ )
+ {
+ continue;
+ }
+
+ statistic * threadStat = (*it)->getTimer(timer_e(s));
+ allStats[s] += *threadStat;
+ }
+
+ // Special handling for synthesized statistics.
+ // These just have to be coded specially here for now.
+ // At present we only have one: the total parallel work done in each thread.
+ // The variance here makes it easy to see load imbalance over the whole program (though, of course,
+ // it's possible to have a code with awful load balance in every parallel region but perfect load
+ // balance oever the whole program.)
+ allStats[TIMER_Total_work].addSample ((*it)->getTimer(TIMER_OMP_work)->getTotal());
+
+ // Time waiting for work (synthesized)
+ if ((t != 0) || !timeStat::workerOnly(timer_e(TIMER_OMP_await_work)))
+ allStats[TIMER_Total_await_work].addSample ((*it)->getTimer(TIMER_OMP_await_work)->getTotal());
+
+ // Time in explicit barriers.
+ allStats[TIMER_Total_barrier].addSample ((*it)->getTimer(TIMER_OMP_barrier)->getTotal());
+
+ for (int c = 0; c<COUNTER_LAST; c++) {
+ if (counter::masterOnly(counter_e(c)) && t != 0)
+ continue;
+ allCounters[c].addSample ((*it)->getCounter(counter_e(c))->getValue());
+ }
+ }
+
+ if (eventPrintingEnabled()) {
+ printPloticusFile();
+ fclose(eventsOut);
+ }
+
+ fprintf (statsOut, "Aggregate for all threads\n");
+ printStats (statsOut, &allStats[0], true);
+ fprintf (statsOut, "\n");
+ printStats (statsOut, &allCounters[0], false);
+
+ if (statsOut != stderr)
+ fclose(statsOut);
+
+}
+
+/* ************************************************** */
+/* ************* exported C functions ************** */
+
+// no name mangling for these functions, we want the c files to be able to get at these functions
+extern "C" {
+
+void __kmp_reset_stats()
+{
+ kmp_stats_list::iterator it;
+ for(it = __kmp_stats_list.begin(); it != __kmp_stats_list.end(); it++) {
+ timeStat * timers = (*it)->getTimers();
+ counter * counters = (*it)->getCounters();
+ explicitTimer * eTimers = (*it)->getExplicitTimers();
+
+ for (int t = 0; t<TIMER_LAST; t++)
+ timers[t].reset();
+
+ for (int c = 0; c<COUNTER_LAST; c++)
+ counters[c].reset();
+
+ for (int t=0; t<EXPLICIT_TIMER_LAST; t++)
+ eTimers[t].reset();
+
+ // reset the event vector so all previous events are "erased"
+ (*it)->resetEventVector();
+
+ // May need to restart the explicit timers in thread zero?
+ }
+ KMP_START_EXPLICIT_TIMER(OMP_serial);
+ KMP_START_EXPLICIT_TIMER(OMP_start_end);
+}
+
+// This function will reset all stats and stop all threads' explicit timers if they haven't been stopped already.
+void __kmp_output_stats(const char * heading)
+{
+ __kmp_stats_global_output.outputStats(heading);
+ __kmp_reset_stats();
+}
+
+void __kmp_accumulate_stats_at_exit(void)
+{
+ // Only do this once.
+ if (KMP_XCHG_FIXED32(&statsPrinted, 1) != 0)
+ return;
+
+ __kmp_output_stats("Statistics on exit");
+ return;
+}
+
+void __kmp_stats_init(void)
+{
+ return;
+}
+
+} // extern "C"
+
+#endif // KMP_STATS_ENABLED
diff --git a/openmp/runtime/src/kmp_stats.h b/openmp/runtime/src/kmp_stats.h
new file mode 100644
index 00000000000..f804cb5007b
--- /dev/null
+++ b/openmp/runtime/src/kmp_stats.h
@@ -0,0 +1,706 @@
+#ifndef KMP_STATS_H
+#define KMP_STATS_H
+
+/** @file kmp_stats.h
+ * Functions for collecting statistics.
+ */
+
+
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.txt for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#if KMP_STATS_ENABLED
+/*
+ * Statistics accumulator.
+ * Accumulates number of samples and computes min, max, mean, standard deviation on the fly.
+ *
+ * Online variance calculation algorithm from http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm
+ */
+
+#include <limits>
+#include <math.h>
+#include <string>
+#include <stdint.h>
+#include <new> // placement new
+#include "kmp_stats_timing.h"
+
+
+/*!
+ * @ingroup STATS_GATHERING
+ * \brief flags to describe the statistic ( timers or counter )
+ *
+*/
+class stats_flags_e {
+ public:
+ const static int onlyInMaster = 1<<0; //!< statistic is valid only for master
+ const static int noUnits = 1<<1; //!< statistic doesn't need units printed next to it in output
+ const static int synthesized = 1<<2; //!< statistic's value is created atexit time in the __kmp_output_stats function
+ const static int notInMaster = 1<<3; //!< statistic is valid for non-master threads
+ const static int logEvent = 1<<4; //!< statistic can be logged when KMP_STATS_EVENTS is on (valid only for timers)
+};
+
+/*!
+ * \brief Add new counters under KMP_FOREACH_COUNTER() macro in kmp_stats.h
+ *
+ * @param macro a user defined macro that takes three arguments - macro(COUNTER_NAME, flags, arg)
+ * @param arg a user defined argument to send to the user defined macro
+ *
+ * \details A counter counts the occurence of some event.
+ * Each thread accumulates its own count, at the end of execution the counts are aggregated treating each thread
+ * as a separate measurement. (Unless onlyInMaster is set, in which case there's only a single measurement).
+ * The min,mean,max are therefore the values for the threads.
+ * Adding the counter here and then putting in a KMP_BLOCK_COUNTER(name) is all you need to do.
+ * All of the tables and printing is generated from this macro.
+ * Format is "macro(name, flags, arg)"
+ *
+ * @ingroup STATS_GATHERING
+*/
+#define KMP_FOREACH_COUNTER(macro, arg) \
+ macro (OMP_PARALLEL, stats_flags_e::onlyInMaster, arg) \
+ macro (OMP_FOR_static, 0, arg) \
+ macro (OMP_FOR_dynamic, 0, arg) \
+ macro (OMP_DISTR_FOR_static, 0, arg) \
+ macro (OMP_DISTR_FOR_dynamic, 0, arg) \
+ macro (OMP_BARRIER, 0, arg) \
+ macro (OMP_CRITICAL,0, arg) \
+ macro (OMP_SINGLE, 0, arg) \
+ macro (OMP_MASTER, 0, arg) \
+ macro (OMP_set_lock, 0, arg) \
+ macro (OMP_test_lock, 0, arg) \
+ macro (OMP_test_lock_failure, 0, arg) \
+ macro (REDUCE_wait, 0, arg) \
+ macro (REDUCE_nowait, 0, arg) \
+ macro (LAST,0,arg)
+
+/*!
+ * \brief Add new timers under KMP_FOREACH_TIMER() macro in kmp_stats.h
+ *
+ * @param macro a user defined macro that takes three arguments - macro(TIMER_NAME, flags, arg)
+ * @param arg a user defined argument to send to the user defined macro
+ *
+ * \details A timer collects multiple samples of some count in each thread and then finally aggregates over all the threads.
+ * The count is normally a time (in ticks), hence the name "timer". (But can be any value, so we use this for "number of arguments passed to fork"
+ * as well, or we could collect "loop iteration count" if we wanted to).
+ * For timers the threads are not significant, it's the individual observations that count, so the statistics are at that level.
+ * Format is "macro(name, flags, arg)"
+ *
+ * @ingroup STATS_GATHERING
+ */
+#define KMP_FOREACH_TIMER(macro, arg) \
+ macro (OMP_PARALLEL_args, stats_flags_e::onlyInMaster | stats_flags_e::noUnits, arg) \
+ macro (FOR_static_iterations, stats_flags_e::onlyInMaster | stats_flags_e::noUnits, arg) \
+ macro (FOR_dynamic_iterations, stats_flags_e::noUnits, arg) \
+ macro (OMP_start_end, stats_flags_e::onlyInMaster, arg) \
+ macro (OMP_serial, stats_flags_e::onlyInMaster, arg) \
+ macro (OMP_work, 0, arg) \
+ macro (Total_work, stats_flags_e::synthesized, arg) \
+ macro (OMP_await_work, stats_flags_e::notInMaster, arg) \
+ macro (Total_await_work, stats_flags_e::synthesized, arg) \
+ macro (OMP_barrier, 0, arg) \
+ macro (Total_barrier, stats_flags_e::synthesized, arg) \
+ macro (OMP_test_lock, 0, arg) \
+ macro (FOR_static_scheduling, 0, arg) \
+ macro (FOR_dynamic_scheduling, 0, arg) \
+ macro (KMP_fork_call, 0, arg) \
+ macro (KMP_join_call, 0, arg) \
+ macro (KMP_fork_barrier, stats_flags_e::logEvent, arg) \
+ macro (KMP_join_barrier, stats_flags_e::logEvent, arg) \
+ macro (KMP_barrier, 0, arg) \
+ macro (KMP_end_split_barrier, 0, arg) \
+ macro (KMP_wait_sleep, 0, arg) \
+ macro (KMP_release, 0, arg) \
+ macro (KMP_hier_gather, 0, arg) \
+ macro (KMP_hier_release, 0, arg) \
+ macro (KMP_hyper_gather, stats_flags_e::logEvent, arg) \
+ macro (KMP_hyper_release, stats_flags_e::logEvent, arg) \
+ macro (KMP_linear_gather, 0, arg) \
+ macro (KMP_linear_release, 0, arg) \
+ macro (KMP_tree_gather, 0, arg) \
+ macro (KMP_tree_release, 0, arg) \
+ macro (USER_master_invoke, stats_flags_e::logEvent, arg) \
+ macro (USER_worker_invoke, stats_flags_e::logEvent, arg) \
+ macro (USER_resume, stats_flags_e::logEvent, arg) \
+ macro (USER_suspend, stats_flags_e::logEvent, arg) \
+ macro (USER_launch_thread_loop, stats_flags_e::logEvent, arg) \
+ macro (KMP_allocate_team, 0, arg) \
+ macro (KMP_setup_icv_copy, 0, arg) \
+ macro (USER_icv_copy, 0, arg) \
+ macro (LAST,0, arg)
+
+
+
+// OMP_PARALLEL_args -- the number of arguments passed to a fork
+// FOR_static_iterations -- Number of available parallel chunks of work in a static for
+// FOR_dynamic_iterations -- Number of available parallel chunks of work in a dynamic for
+// Both adjust for any chunking, so if there were an iteration count of 20 but a chunk size of 10, we'd record 2.
+// OMP_serial -- thread zero time executing serial code
+// OMP_start_end -- time from when OpenMP is initialized until the stats are printed at exit
+// OMP_work -- elapsed time in code dispatched by a fork (measured in the thread)
+// Total_work -- a synthesized statistic summarizing how much parallel work each thread executed.
+// OMP_barrier -- time at "real" barriers
+// Total_barrier -- a synthesized statistic summarizing how much time at real barriers in each thread
+// OMP_set_lock -- time in lock setting
+// OMP_test_lock -- time in testing a lock
+// LOCK_WAIT -- time waiting for a lock
+// FOR_static_scheduling -- time spent doing scheduling for a static "for"
+// FOR_dynamic_scheduling -- time spent doing scheduling for a dynamic "for"
+// KMP_wait_sleep -- time in __kmp_wait_sleep
+// KMP_release -- time in __kmp_release
+// KMP_fork_barrier -- time in __kmp_fork_barrier
+// KMP_join_barrier -- time in __kmp_join_barrier
+// KMP_barrier -- time in __kmp_barrier
+// KMP_end_split_barrier -- time in __kmp_end_split_barrier
+// KMP_setup_icv_copy -- time in __kmp_setup_icv_copy
+// KMP_icv_copy -- start/stop timer for any ICV copying
+// KMP_linear_gather -- time in __kmp_linear_barrier_gather
+// KMP_linear_release -- time in __kmp_linear_barrier_release
+// KMP_tree_gather -- time in __kmp_tree_barrier_gather
+// KMP_tree_release -- time in __kmp_tree_barrier_release
+// KMP_hyper_gather -- time in __kmp_hyper_barrier_gather
+// KMP_hyper_release -- time in __kmp_hyper_barrier_release
+
+/*!
+ * \brief Add new explicit timers under KMP_FOREACH_EXPLICIT_TIMER() macro.
+ *
+ * @param macro a user defined macro that takes three arguments - macro(TIMER_NAME, flags, arg)
+ * @param arg a user defined argument to send to the user defined macro
+ *
+ * \warning YOU MUST HAVE THE SAME NAMED TIMER UNDER KMP_FOREACH_TIMER() OR ELSE BAD THINGS WILL HAPPEN!
+ *
+ * \details Explicit timers are ones where we need to allocate a timer itself (as well as the accumulated timing statistics).
+ * We allocate these on a per-thread basis, and explicitly start and stop them.
+ * Block timers just allocate the timer itself on the stack, and use the destructor to notice block exit; they don't
+ * need to be defined here.
+ * The name here should be the same as that of a timer above.
+ *
+ * @ingroup STATS_GATHERING
+*/
+#define KMP_FOREACH_EXPLICIT_TIMER(macro, arg) \
+ macro(OMP_serial, 0, arg) \
+ macro(OMP_start_end, 0, arg) \
+ macro(USER_icv_copy, 0, arg) \
+ macro(USER_launch_thread_loop, stats_flags_e::logEvent, arg) \
+ macro(LAST, 0, arg)
+
+#define ENUMERATE(name,ignore,prefix) prefix##name,
+enum timer_e {
+ KMP_FOREACH_TIMER(ENUMERATE, TIMER_)
+};
+
+enum explicit_timer_e {
+ KMP_FOREACH_EXPLICIT_TIMER(ENUMERATE, EXPLICIT_TIMER_)
+};
+
+enum counter_e {
+ KMP_FOREACH_COUNTER(ENUMERATE, COUNTER_)
+};
+#undef ENUMERATE
+
+class statistic
+{
+ double minVal;
+ double maxVal;
+ double meanVal;
+ double m2;
+ uint64_t sampleCount;
+
+ public:
+ statistic() { reset(); }
+ statistic (statistic const &o): minVal(o.minVal), maxVal(o.maxVal), meanVal(o.meanVal), m2(o.m2), sampleCount(o.sampleCount) {}
+
+ double getMin() const { return minVal; }
+ double getMean() const { return meanVal; }
+ double getMax() const { return maxVal; }
+ uint64_t getCount() const { return sampleCount; }
+ double getSD() const { return sqrt(m2/sampleCount); }
+ double getTotal() const { return sampleCount*meanVal; }
+
+ void reset()
+ {
+ minVal = std::numeric_limits<double>::max();
+ maxVal = -std::numeric_limits<double>::max();
+ meanVal= 0.0;
+ m2 = 0.0;
+ sampleCount = 0;
+ }
+ void addSample(double sample);
+ void scale (double factor);
+ void scaleDown(double f) { scale (1./f); }
+ statistic & operator+= (statistic const & other);
+
+ std::string format(char unit, bool total=false) const;
+};
+
+struct statInfo
+{
+ const char * name;
+ uint32_t flags;
+};
+
+class timeStat : public statistic
+{
+ static statInfo timerInfo[];
+
+ public:
+ timeStat() : statistic() {}
+ static const char * name(timer_e e) { return timerInfo[e].name; }
+ static bool masterOnly (timer_e e) { return timerInfo[e].flags & stats_flags_e::onlyInMaster; }
+ static bool workerOnly (timer_e e) { return timerInfo[e].flags & stats_flags_e::notInMaster; }
+ static bool noUnits (timer_e e) { return timerInfo[e].flags & stats_flags_e::noUnits; }
+ static bool synthesized(timer_e e) { return timerInfo[e].flags & stats_flags_e::synthesized; }
+ static bool logEvent (timer_e e) { return timerInfo[e].flags & stats_flags_e::logEvent; }
+ static void clearEventFlags() {
+ int i;
+ for(i=0;i<TIMER_LAST;i++) {
+ timerInfo[i].flags &= (~(stats_flags_e::logEvent));
+ }
+ }
+};
+
+// Where we need explicitly to start and end the timer, this version can be used
+// Since these timers normally aren't nicely scoped, so don't have a good place to live
+// on the stack of the thread, they're more work to use.
+class explicitTimer
+{
+ timeStat * stat;
+ tsc_tick_count startTime;
+
+ public:
+ explicitTimer () : stat(0), startTime(0) { }
+ explicitTimer (timeStat * s) : stat(s), startTime() { }
+
+ void setStat (timeStat *s) { stat = s; }
+ void start(timer_e timerEnumValue);
+ void stop(timer_e timerEnumValue);
+ void reset() { startTime = 0; }
+};
+
+// Where all you need is to time a block, this is enough.
+// (It avoids the need to have an explicit end, leaving the scope suffices.)
+class blockTimer : public explicitTimer
+{
+ timer_e timerEnumValue;
+ public:
+ blockTimer (timeStat * s, timer_e newTimerEnumValue) : timerEnumValue(newTimerEnumValue), explicitTimer(s) { start(timerEnumValue); }
+ ~blockTimer() { stop(timerEnumValue); }
+};
+
+// If all you want is a count, then you can use this...
+// The individual per-thread counts will be aggregated into a statistic at program exit.
+class counter
+{
+ uint64_t value;
+ static const statInfo counterInfo[];
+
+ public:
+ counter() : value(0) {}
+ void increment() { value++; }
+ uint64_t getValue() const { return value; }
+ void reset() { value = 0; }
+ static const char * name(counter_e e) { return counterInfo[e].name; }
+ static bool masterOnly (counter_e e) { return counterInfo[e].flags & stats_flags_e::onlyInMaster; }
+};
+
+/* ****************************************************************
+ Class to implement an event
+
+ There are four components to an event: start time, stop time
+ nest_level, and timer_name.
+ The start and stop time should be obvious (recorded in clock ticks).
+ The nest_level relates to the bar width in the timeline graph.
+ The timer_name is used to determine which timer event triggered this event.
+
+ the interface to this class is through four read-only operations:
+ 1) getStart() -- returns the start time as 64 bit integer
+ 2) getStop() -- returns the stop time as 64 bit integer
+ 3) getNestLevel() -- returns the nest level of the event
+ 4) getTimerName() -- returns the timer name that triggered event
+
+ *MORE ON NEST_LEVEL*
+ The nest level is used in the bar graph that represents the timeline.
+ Its main purpose is for showing how events are nested inside eachother.
+ For example, say events, A, B, and C are recorded. If the timeline
+ looks like this:
+
+Begin -------------------------------------------------------------> Time
+ | | | | | |
+ A B C C B A
+ start start start end end end
+
+ Then A, B, C will have a nest level of 1, 2, 3 respectively.
+ These values are then used to calculate the barwidth so you can
+ see that inside A, B has occured, and inside B, C has occured.
+ Currently, this is shown with A's bar width being larger than B's
+ bar width, and B's bar width being larger than C's bar width.
+
+**************************************************************** */
+class kmp_stats_event {
+ uint64_t start;
+ uint64_t stop;
+ int nest_level;
+ timer_e timer_name;
+ public:
+ kmp_stats_event() : start(0), stop(0), nest_level(0), timer_name(TIMER_LAST) {}
+ kmp_stats_event(uint64_t strt, uint64_t stp, int nst, timer_e nme) : start(strt), stop(stp), nest_level(nst), timer_name(nme) {}
+ inline uint64_t getStart() const { return start; }
+ inline uint64_t getStop() const { return stop; }
+ inline int getNestLevel() const { return nest_level; }
+ inline timer_e getTimerName() const { return timer_name; }
+};
+
+/* ****************************************************************
+ Class to implement a dynamically expandable array of events
+
+ ---------------------------------------------------------
+ | event 1 | event 2 | event 3 | event 4 | ... | event N |
+ ---------------------------------------------------------
+
+ An event is pushed onto the back of this array at every
+ explicitTimer->stop() call. The event records the thread #,
+ start time, stop time, and nest level related to the bar width.
+
+ The event vector starts at size INIT_SIZE and grows (doubles in size)
+ if needed. An implication of this behavior is that log(N)
+ reallocations are needed (where N is number of events). If you want
+ to avoid reallocations, then set INIT_SIZE to a large value.
+
+ the interface to this class is through six operations:
+ 1) reset() -- sets the internal_size back to 0 but does not deallocate any memory
+ 2) size() -- returns the number of valid elements in the vector
+ 3) push_back(start, stop, nest, timer_name) -- pushes an event onto
+ the back of the array
+ 4) deallocate() -- frees all memory associated with the vector
+ 5) sort() -- sorts the vector by start time
+ 6) operator[index] or at(index) -- returns event reference at that index
+
+**************************************************************** */
+class kmp_stats_event_vector {
+ kmp_stats_event* events;
+ int internal_size;
+ int allocated_size;
+ static const int INIT_SIZE = 1024;
+ public:
+ kmp_stats_event_vector() {
+ events = (kmp_stats_event*)__kmp_allocate(sizeof(kmp_stats_event)*INIT_SIZE);
+ internal_size = 0;
+ allocated_size = INIT_SIZE;
+ }
+ ~kmp_stats_event_vector() {}
+ inline void reset() { internal_size = 0; }
+ inline int size() const { return internal_size; }
+ void push_back(uint64_t start_time, uint64_t stop_time, int nest_level, timer_e name) {
+ int i;
+ if(internal_size == allocated_size) {
+ kmp_stats_event* tmp = (kmp_stats_event*)__kmp_allocate(sizeof(kmp_stats_event)*allocated_size*2);
+ for(i=0;i<internal_size;i++) tmp[i] = events[i];
+ __kmp_free(events);
+ events = tmp;
+ allocated_size*=2;
+ }
+ events[internal_size] = kmp_stats_event(start_time, stop_time, nest_level, name);
+ internal_size++;
+ return;
+ }
+ void deallocate();
+ void sort();
+ const kmp_stats_event & operator[](int index) const { return events[index]; }
+ kmp_stats_event & operator[](int index) { return events[index]; }
+ const kmp_stats_event & at(int index) const { return events[index]; }
+ kmp_stats_event & at(int index) { return events[index]; }
+};
+
+/* ****************************************************************
+ Class to implement a doubly-linked, circular, statistics list
+
+ |---| ---> |---| ---> |---| ---> |---| ---> ... next
+ | | | | | | | |
+ |---| <--- |---| <--- |---| <--- |---| <--- ... prev
+ Sentinel first second third
+ Node node node node
+
+ The Sentinel Node is the user handle on the list.
+ The first node corresponds to thread 0's statistics.
+ The second node corresponds to thread 1's statistics and so on...
+
+ Each node has a _timers, _counters, and _explicitTimers array to
+ hold that thread's statistics. The _explicitTimers
+ point to the correct _timer and update its statistics at every stop() call.
+ The explicitTimers' pointers are set up in the constructor.
+ Each node also has an event vector to hold that thread's timing events.
+ The event vector expands as necessary and records the start-stop times
+ for each timer.
+
+ The nestLevel variable is for plotting events and is related
+ to the bar width in the timeline graph.
+
+ Every thread will have a __thread local pointer to its node in
+ the list. The sentinel node is used by the master thread to
+ store "dummy" statistics before __kmp_create_worker() is called.
+
+**************************************************************** */
+class kmp_stats_list {
+ int gtid;
+ timeStat _timers[TIMER_LAST+1];
+ counter _counters[COUNTER_LAST+1];
+ explicitTimer _explicitTimers[EXPLICIT_TIMER_LAST+1];
+ int _nestLevel; // one per thread
+ kmp_stats_event_vector _event_vector;
+ kmp_stats_list* next;
+ kmp_stats_list* prev;
+ public:
+ kmp_stats_list() : next(this) , prev(this) , _event_vector(), _nestLevel(0) {
+#define doInit(name,ignore1,ignore2) \
+ getExplicitTimer(EXPLICIT_TIMER_##name)->setStat(getTimer(TIMER_##name));
+ KMP_FOREACH_EXPLICIT_TIMER(doInit,0);
+#undef doInit
+ }
+ ~kmp_stats_list() { }
+ inline timeStat * getTimer(timer_e idx) { return &_timers[idx]; }
+ inline counter * getCounter(counter_e idx) { return &_counters[idx]; }
+ inline explicitTimer * getExplicitTimer(explicit_timer_e idx) { return &_explicitTimers[idx]; }
+ inline timeStat * getTimers() { return _timers; }
+ inline counter * getCounters() { return _counters; }
+ inline explicitTimer * getExplicitTimers() { return _explicitTimers; }
+ inline kmp_stats_event_vector & getEventVector() { return _event_vector; }
+ inline void resetEventVector() { _event_vector.reset(); }
+ inline void incrementNestValue() { _nestLevel++; }
+ inline int getNestValue() { return _nestLevel; }
+ inline void decrementNestValue() { _nestLevel--; }
+ inline int getGtid() const { return gtid; }
+ inline void setGtid(int newgtid) { gtid = newgtid; }
+ kmp_stats_list* push_back(int gtid); // returns newly created list node
+ inline void push_event(uint64_t start_time, uint64_t stop_time, int nest_level, timer_e name) {
+ _event_vector.push_back(start_time, stop_time, nest_level, name);
+ }
+ void deallocate();
+ class iterator;
+ kmp_stats_list::iterator begin();
+ kmp_stats_list::iterator end();
+ int size();
+ class iterator {
+ kmp_stats_list* ptr;
+ friend kmp_stats_list::iterator kmp_stats_list::begin();
+ friend kmp_stats_list::iterator kmp_stats_list::end();
+ public:
+ iterator();
+ ~iterator();
+ iterator operator++();
+ iterator operator++(int dummy);
+ iterator operator--();
+ iterator operator--(int dummy);
+ bool operator!=(const iterator & rhs);
+ bool operator==(const iterator & rhs);
+ kmp_stats_list* operator*() const; // dereference operator
+ };
+};
+
+/* ****************************************************************
+ Class to encapsulate all output functions and the environment variables
+
+ This module holds filenames for various outputs (normal stats, events, plot file),
+ as well as coloring information for the plot file.
+
+ The filenames and flags variables are read from environment variables.
+ These are read once by the constructor of the global variable __kmp_stats_output
+ which calls init().
+
+ During this init() call, event flags for the timeStat::timerInfo[] global array
+ are cleared if KMP_STATS_EVENTS is not true (on, 1, yes).
+
+ The only interface function that is public is outputStats(heading). This function
+ should print out everything it needs to, either to files or stderr,
+ depending on the environment variables described below
+
+ ENVIRONMENT VARIABLES:
+ KMP_STATS_FILE -- if set, all statistics (not events) will be printed to this file,
+ otherwise, print to stderr
+ KMP_STATS_THREADS -- if set to "on", then will print per thread statistics to either
+ KMP_STATS_FILE or stderr
+ KMP_STATS_PLOT_FILE -- if set, print the ploticus plot file to this filename,
+ otherwise, the plot file is sent to "events.plt"
+ KMP_STATS_EVENTS -- if set to "on", then log events, otherwise, don't log events
+ KMP_STATS_EVENTS_FILE -- if set, all events are outputted to this file,
+ otherwise, output is sent to "events.dat"
+
+**************************************************************** */
+class kmp_stats_output_module {
+
+ public:
+ struct rgb_color {
+ float r;
+ float g;
+ float b;
+ };
+
+ private:
+ static const char* outputFileName;
+ static const char* eventsFileName;
+ static const char* plotFileName;
+ static int printPerThreadFlag;
+ static int printPerThreadEventsFlag;
+ static const rgb_color globalColorArray[];
+ static rgb_color timerColorInfo[];
+
+ void init();
+ static void setupEventColors();
+ static void printPloticusFile();
+ static void printStats(FILE *statsOut, statistic const * theStats, bool areTimers);
+ static void printCounters(FILE * statsOut, counter const * theCounters);
+ static void printEvents(FILE * eventsOut, kmp_stats_event_vector* theEvents, int gtid);
+ static rgb_color getEventColor(timer_e e) { return timerColorInfo[e]; }
+ static void windupExplicitTimers();
+ bool eventPrintingEnabled() {
+ if(printPerThreadEventsFlag) return true;
+ else return false;
+ }
+ bool perThreadPrintingEnabled() {
+ if(printPerThreadFlag) return true;
+ else return false;
+ }
+
+ public:
+ kmp_stats_output_module() { init(); }
+ void outputStats(const char* heading);
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void __kmp_stats_init();
+void __kmp_reset_stats();
+void __kmp_output_stats(const char *);
+void __kmp_accumulate_stats_at_exit(void);
+// thread local pointer to stats node within list
+extern __thread kmp_stats_list* __kmp_stats_thread_ptr;
+// head to stats list.
+extern kmp_stats_list __kmp_stats_list;
+// lock for __kmp_stats_list
+extern kmp_tas_lock_t __kmp_stats_lock;
+// reference start time
+extern tsc_tick_count __kmp_stats_start_time;
+// interface to output
+extern kmp_stats_output_module __kmp_stats_output;
+
+#ifdef __cplusplus
+}
+#endif
+
+// Simple, standard interfaces that drop out completely if stats aren't enabled
+
+
+/*!
+ * \brief Uses specified timer (name) to time code block.
+ *
+ * @param name timer name as specified under the KMP_FOREACH_TIMER() macro
+ *
+ * \details Use KMP_TIME_BLOCK(name) macro to time a code block. This will record the time taken in the block
+ * and use the destructor to stop the timer. Convenient!
+ * With this definition you can't have more than one KMP_TIME_BLOCK in the same code block.
+ * I don't think that's a problem.
+ *
+ * @ingroup STATS_GATHERING
+*/
+#define KMP_TIME_BLOCK(name) \
+ blockTimer __BLOCKTIME__(__kmp_stats_thread_ptr->getTimer(TIMER_##name), TIMER_##name)
+
+/*!
+ * \brief Adds value to specified timer (name).
+ *
+ * @param name timer name as specified under the KMP_FOREACH_TIMER() macro
+ * @param value double precision sample value to add to statistics for the timer
+ *
+ * \details Use KMP_COUNT_VALUE(name, value) macro to add a particular value to a timer statistics.
+ *
+ * @ingroup STATS_GATHERING
+*/
+#define KMP_COUNT_VALUE(name, value) \
+ __kmp_stats_thread_ptr->getTimer(TIMER_##name)->addSample(value)
+
+/*!
+ * \brief Increments specified counter (name).
+ *
+ * @param name counter name as specified under the KMP_FOREACH_COUNTER() macro
+ *
+ * \details Use KMP_COUNT_BLOCK(name, value) macro to increment a statistics counter for the executing thread.
+ *
+ * @ingroup STATS_GATHERING
+*/
+#define KMP_COUNT_BLOCK(name) \
+ __kmp_stats_thread_ptr->getCounter(COUNTER_##name)->increment()
+
+/*!
+ * \brief "Starts" an explicit timer which will need a corresponding KMP_STOP_EXPLICIT_TIMER() macro.
+ *
+ * @param name explicit timer name as specified under the KMP_FOREACH_EXPLICIT_TIMER() macro
+ *
+ * \details Use to start a timer. This will need a corresponding KMP_STOP_EXPLICIT_TIMER()
+ * macro to stop the timer unlike the KMP_TIME_BLOCK(name) macro which has an implicit stopping macro at the end
+ * of the code block. All explicit timers are stopped at library exit time before the final statistics are outputted.
+ *
+ * @ingroup STATS_GATHERING
+*/
+#define KMP_START_EXPLICIT_TIMER(name) \
+ __kmp_stats_thread_ptr->getExplicitTimer(EXPLICIT_TIMER_##name)->start(TIMER_##name)
+
+/*!
+ * \brief "Stops" an explicit timer.
+ *
+ * @param name explicit timer name as specified under the KMP_FOREACH_EXPLICIT_TIMER() macro
+ *
+ * \details Use KMP_STOP_EXPLICIT_TIMER(name) to stop a timer. When this is done, the time between the last KMP_START_EXPLICIT_TIMER(name)
+ * and this KMP_STOP_EXPLICIT_TIMER(name) will be added to the timer's stat value. The timer will then be reset.
+ * After the KMP_STOP_EXPLICIT_TIMER(name) macro is called, another call to KMP_START_EXPLICIT_TIMER(name) will start the timer once again.
+ *
+ * @ingroup STATS_GATHERING
+*/
+#define KMP_STOP_EXPLICIT_TIMER(name) \
+ __kmp_stats_thread_ptr->getExplicitTimer(EXPLICIT_TIMER_##name)->stop(TIMER_##name)
+
+/*!
+ * \brief Outputs the current thread statistics and reset them.
+ *
+ * @param heading_string heading put above the final stats output
+ *
+ * \details Explicitly stops all timers and outputs all stats.
+ * Environment variable, `OMPTB_STATSFILE=filename`, can be used to output the stats to a filename instead of stderr
+ * Environment variable, `OMPTB_STATSTHREADS=true|undefined`, can be used to output thread specific stats
+ * For now the `OMPTB_STATSTHREADS` environment variable can either be defined with any value, which will print out thread
+ * specific stats, or it can be undefined (not specified in the environment) and thread specific stats won't be printed
+ * It should be noted that all statistics are reset when this macro is called.
+ *
+ * @ingroup STATS_GATHERING
+*/
+#define KMP_OUTPUT_STATS(heading_string) \
+ __kmp_output_stats(heading_string)
+
+/*!
+ * \brief resets all stats (counters to 0, timers to 0 elapsed ticks)
+ *
+ * \details Reset all stats for all threads.
+ *
+ * @ingroup STATS_GATHERING
+*/
+#define KMP_RESET_STATS() __kmp_reset_stats()
+
+#else // KMP_STATS_ENABLED
+
+// Null definitions
+#define KMP_TIME_BLOCK(n) ((void)0)
+#define KMP_COUNT_VALUE(n,v) ((void)0)
+#define KMP_COUNT_BLOCK(n) ((void)0)
+#define KMP_START_EXPLICIT_TIMER(n) ((void)0)
+#define KMP_STOP_EXPLICIT_TIMER(n) ((void)0)
+
+#define KMP_OUTPUT_STATS(heading_string) ((void)0)
+#define KMP_RESET_STATS() ((void)0)
+
+#endif // KMP_STATS_ENABLED
+
+#endif // KMP_STATS_H
diff --git a/openmp/runtime/src/kmp_stats_timing.cpp b/openmp/runtime/src/kmp_stats_timing.cpp
new file mode 100644
index 00000000000..987ea4f764d
--- /dev/null
+++ b/openmp/runtime/src/kmp_stats_timing.cpp
@@ -0,0 +1,167 @@
+/** @file kmp_stats_timing.cpp
+ * Timing functions
+ */
+
+
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.txt for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <iostream>
+#include <iomanip>
+#include <sstream>
+
+#include "kmp_stats_timing.h"
+
+using namespace std;
+
+#if KMP_OS_LINUX
+# if KMP_MIC
+double tsc_tick_count::tick_time()
+{
+ // pretty bad assumption of 1GHz clock for MIC
+ return 1/((double)1000*1.e6);
+}
+# else
+# include <string.h>
+// Extract the value from the CPUID information
+double tsc_tick_count::tick_time()
+{
+ static double result = 0.0;
+
+ if (result == 0.0)
+ {
+ int cpuinfo[4];
+ char brand[256];
+
+ __cpuid(cpuinfo, 0x80000000);
+ memset(brand, 0, sizeof(brand));
+ int ids = cpuinfo[0];
+
+ for (unsigned int i=2; i<(ids^0x80000000)+2; i++)
+ __cpuid(brand+(i-2)*sizeof(cpuinfo), i | 0x80000000);
+
+ char * start = &brand[0];
+ for (;*start == ' '; start++)
+ ;
+
+ char * end = brand + strlen(brand) - 3;
+ uint64_t multiplier;
+
+ if (*end == 'M') multiplier = 1000LL*1000LL;
+ else if (*end == 'G') multiplier = 1000LL*1000LL*1000LL;
+ else if (*end == 'T') multiplier = 1000LL*1000LL*1000LL*1000LL;
+ else
+ {
+ cout << "Error determining multiplier '" << *end << "'\n";
+ exit (-1);
+ }
+ *end = 0;
+ while (*end != ' ') end--;
+ end++;
+
+ double freq = strtod(end, &start);
+ if (freq == 0.0)
+ {
+ cout << "Error calculating frequency " << end << "\n";
+ exit (-1);
+ }
+
+ result = ((double)1.0)/(freq * multiplier);
+ }
+ return result;
+}
+# endif
+#endif
+
+static bool useSI = true;
+
+// Return a formatted string after normalising the value into
+// engineering style and using a suitable unit prefix (e.g. ms, us, ns).
+std::string formatSI(double interval, int width, char unit)
+{
+ std::stringstream os;
+
+ if (useSI)
+ {
+ // Preserve accuracy for small numbers, since we only multiply and the positive powers
+ // of ten are precisely representable.
+ static struct { double scale; char prefix; } ranges[] = {
+ {1.e12,'f'},
+ {1.e9, 'p'},
+ {1.e6, 'n'},
+ {1.e3, 'u'},
+ {1.0, 'm'},
+ {1.e-3,' '},
+ {1.e-6,'k'},
+ {1.e-9,'M'},
+ {1.e-12,'G'},
+ {1.e-15,'T'},
+ {1.e-18,'P'},
+ {1.e-21,'E'},
+ {1.e-24,'Z'},
+ {1.e-27,'Y'}
+ };
+
+ if (interval == 0.0)
+ {
+ os << std::setw(width-3) << std::right << "0.00" << std::setw(3) << unit;
+ return os.str();
+ }
+
+ bool negative = false;
+ if (interval < 0.0)
+ {
+ negative = true;
+ interval = -interval;
+ }
+
+ for (int i=0; i<(int)(sizeof(ranges)/sizeof(ranges[0])); i++)
+ {
+ if (interval*ranges[i].scale < 1.e0)
+ {
+ interval = interval * 1000.e0 * ranges[i].scale;
+ os << std::fixed << std::setprecision(2) << std::setw(width-3) << std::right <<
+ (negative ? -interval : interval) << std::setw(2) << ranges[i].prefix << std::setw(1) << unit;
+
+ return os.str();
+ }
+ }
+ }
+ os << std::setprecision(2) << std::fixed << std::right << std::setw(width-3) << interval << std::setw(3) << unit;
+
+ return os.str();
+}
+
+tsc_tick_count::tsc_interval_t computeLastInLastOutInterval(timePair * times, int nTimes)
+{
+ timePair lastTimes = times[0];
+ tsc_tick_count * startp = lastTimes.get_startp();
+ tsc_tick_count * endp = lastTimes.get_endp();
+
+ for (int i=1; i<nTimes; i++)
+ {
+ (*startp) = startp->later(times[i].get_start());
+ (*endp) = endp->later (times[i].get_end());
+ }
+
+ return lastTimes.duration();
+}
+
+std::string timePair::format() const
+{
+ std::ostringstream oss;
+
+ oss << start.getValue() << ":" << end.getValue() << " = " << (end-start).getValue();
+
+ return oss.str();
+}
diff --git a/openmp/runtime/src/kmp_stats_timing.h b/openmp/runtime/src/kmp_stats_timing.h
new file mode 100644
index 00000000000..2bdfdeadfd0
--- /dev/null
+++ b/openmp/runtime/src/kmp_stats_timing.h
@@ -0,0 +1,104 @@
+#ifndef KMP_STATS_TIMING_H
+#define KMP_STATS_TIMING_H
+
+/** @file kmp_stats_timing.h
+ * Access to real time clock and timers.
+ */
+
+
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.txt for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+
+#include <stdint.h>
+#include <string>
+#include <limits>
+#include "kmp_os.h"
+
+class tsc_tick_count {
+ private:
+ int64_t my_count;
+
+ public:
+ class tsc_interval_t {
+ int64_t value;
+ explicit tsc_interval_t(int64_t _value) : value(_value) {}
+ public:
+ tsc_interval_t() : value(0) {}; // Construct 0 time duration
+ double seconds() const; // Return the length of a time interval in seconds
+ double ticks() const { return double(value); }
+ int64_t getValue() const { return value; }
+
+ friend class tsc_tick_count;
+
+ friend tsc_interval_t operator-(
+ const tsc_tick_count t1, const tsc_tick_count t0);
+ };
+
+ tsc_tick_count() : my_count(static_cast<int64_t>(__rdtsc())) {};
+ tsc_tick_count(int64_t value) : my_count(value) {};
+ int64_t getValue() const { return my_count; }
+ tsc_tick_count later (tsc_tick_count const other) const {
+ return my_count > other.my_count ? (*this) : other;
+ }
+ tsc_tick_count earlier(tsc_tick_count const other) const {
+ return my_count < other.my_count ? (*this) : other;
+ }
+ static double tick_time(); // returns seconds per cycle (period) of clock
+ static tsc_tick_count now() { return tsc_tick_count(); } // returns the rdtsc register value
+ friend tsc_tick_count::tsc_interval_t operator-(const tsc_tick_count t1, const tsc_tick_count t0);
+};
+
+inline tsc_tick_count::tsc_interval_t operator-(const tsc_tick_count t1, const tsc_tick_count t0)
+{
+ return tsc_tick_count::tsc_interval_t( t1.my_count-t0.my_count );
+}
+
+inline double tsc_tick_count::tsc_interval_t::seconds() const
+{
+ return value*tick_time();
+}
+
+extern std::string formatSI(double interval, int width, char unit);
+
+inline std::string formatSeconds(double interval, int width)
+{
+ return formatSI(interval, width, 'S');
+}
+
+inline std::string formatTicks(double interval, int width)
+{
+ return formatSI(interval, width, 'T');
+}
+
+class timePair
+{
+ tsc_tick_count KMP_ALIGN_CACHE start;
+ tsc_tick_count end;
+
+public:
+ timePair() : start(-std::numeric_limits<int64_t>::max()), end(-std::numeric_limits<int64_t>::max()) {}
+ tsc_tick_count get_start() const { return start; }
+ tsc_tick_count get_end() const { return end; }
+ tsc_tick_count * get_startp() { return &start; }
+ tsc_tick_count * get_endp() { return &end; }
+
+ void markStart() { start = tsc_tick_count::now(); }
+ void markEnd() { end = tsc_tick_count::now(); }
+ void set_start(tsc_tick_count s) { start = s; }
+ void set_end (tsc_tick_count e) { end = e; }
+
+ tsc_tick_count::tsc_interval_t duration() const { return end-start; }
+ std::string format() const;
+
+};
+
+extern tsc_tick_count::tsc_interval_t computeLastInLastOutInterval(timePair * times, int nTimes);
+#endif // KMP_STATS_TIMING_H
diff --git a/openmp/runtime/src/kmp_str.c b/openmp/runtime/src/kmp_str.c
index 9c0469fd19d..d9e8d26a498 100644
--- a/openmp/runtime/src/kmp_str.c
+++ b/openmp/runtime/src/kmp_str.c
@@ -1,7 +1,7 @@
/*
* kmp_str.c -- String manipulation routines.
- * $Revision: 42810 $
- * $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+ * $Revision: 43084 $
+ * $Date: 2014-04-15 09:15:14 -0500 (Tue, 15 Apr 2014) $
*/
diff --git a/openmp/runtime/src/kmp_str.h b/openmp/runtime/src/kmp_str.h
index 7de3a2ec228..1c4fb984323 100644
--- a/openmp/runtime/src/kmp_str.h
+++ b/openmp/runtime/src/kmp_str.h
@@ -1,7 +1,7 @@
/*
* kmp_str.h -- String manipulation routines.
- * $Revision: 42613 $
- * $Date: 2013-08-23 13:29:50 -0500 (Fri, 23 Aug 2013) $
+ * $Revision: 43435 $
+ * $Date: 2014-09-04 15:16:08 -0500 (Thu, 04 Sep 2014) $
*/
diff --git a/openmp/runtime/src/kmp_stub.c b/openmp/runtime/src/kmp_stub.c
index c1914f4f570..aef8eb1f9c4 100644
--- a/openmp/runtime/src/kmp_stub.c
+++ b/openmp/runtime/src/kmp_stub.c
@@ -1,7 +1,7 @@
/*
* kmp_stub.c -- stub versions of user-callable OpenMP RT functions.
- * $Revision: 42826 $
- * $Date: 2013-11-20 03:39:45 -0600 (Wed, 20 Nov 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
@@ -15,13 +15,13 @@
//===----------------------------------------------------------------------===//
-#include "kmp_stub.h"
-
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
-#include "kmp_os.h" // KMP_OS_*
+#include "omp.h" // Function renamings.
+#include "kmp.h" // KMP_DEFAULT_STKSIZE
+#include "kmp_stub.h"
#if KMP_OS_WINDOWS
#include <windows.h>
@@ -29,20 +29,12 @@
#include <sys/time.h>
#endif
-#include "omp.h" // Function renamings.
-#include "kmp.h" // KMP_DEFAULT_STKSIZE
-#include "kmp_version.h"
-
// Moved from omp.h
-#if OMP_30_ENABLED
-
#define omp_set_max_active_levels ompc_set_max_active_levels
#define omp_set_schedule ompc_set_schedule
#define omp_get_ancestor_thread_num ompc_get_ancestor_thread_num
#define omp_get_team_size ompc_get_team_size
-#endif // OMP_30_ENABLED
-
#define omp_set_num_threads ompc_set_num_threads
#define omp_set_dynamic ompc_set_dynamic
#define omp_set_nested ompc_set_nested
@@ -95,15 +87,13 @@ static size_t __kmps_init() {
void omp_set_num_threads( omp_int_t num_threads ) { i; }
void omp_set_dynamic( omp_int_t dynamic ) { i; __kmps_set_dynamic( dynamic ); }
void omp_set_nested( omp_int_t nested ) { i; __kmps_set_nested( nested ); }
-#if OMP_30_ENABLED
- void omp_set_max_active_levels( omp_int_t max_active_levels ) { i; }
- void omp_set_schedule( omp_sched_t kind, omp_int_t modifier ) { i; __kmps_set_schedule( (kmp_sched_t)kind, modifier ); }
- int omp_get_ancestor_thread_num( omp_int_t level ) { i; return ( level ) ? ( -1 ) : ( 0 ); }
- int omp_get_team_size( omp_int_t level ) { i; return ( level ) ? ( -1 ) : ( 1 ); }
- int kmpc_set_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
- int kmpc_unset_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
- int kmpc_get_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
-#endif // OMP_30_ENABLED
+void omp_set_max_active_levels( omp_int_t max_active_levels ) { i; }
+void omp_set_schedule( omp_sched_t kind, omp_int_t modifier ) { i; __kmps_set_schedule( (kmp_sched_t)kind, modifier ); }
+int omp_get_ancestor_thread_num( omp_int_t level ) { i; return ( level ) ? ( -1 ) : ( 0 ); }
+int omp_get_team_size( omp_int_t level ) { i; return ( level ) ? ( -1 ) : ( 1 ); }
+int kmpc_set_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
+int kmpc_unset_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
+int kmpc_get_affinity_mask_proc( int proc, void **mask ) { i; return -1; }
/* kmp API functions */
void kmp_set_stacksize( omp_int_t arg ) { i; __kmps_set_stacksize( arg ); }
@@ -178,8 +168,6 @@ int __kmps_get_stacksize( void ) {
return __kmps_stacksize;
} // __kmps_get_stacksize
-#if OMP_30_ENABLED
-
static kmp_sched_t __kmps_sched_kind = kmp_sched_default;
static int __kmps_sched_modifier = 0;
@@ -195,8 +183,6 @@ static int __kmps_sched_modifier = 0;
*modifier = __kmps_sched_modifier;
} // __kmps_get_schedule
-#endif // OMP_30_ENABLED
-
#if OMP_40_ENABLED
static kmp_proc_bind_t __kmps_proc_bind = proc_bind_false;
diff --git a/openmp/runtime/src/kmp_stub.h b/openmp/runtime/src/kmp_stub.h
index 4b3e3ec0c41..44bd1f764f7 100644
--- a/openmp/runtime/src/kmp_stub.h
+++ b/openmp/runtime/src/kmp_stub.h
@@ -1,7 +1,7 @@
/*
* kmp_stub.h
- * $Revision: 42061 $
- * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
@@ -33,7 +33,6 @@ int __kmps_get_nested( void );
void __kmps_set_stacksize( int arg );
int __kmps_get_stacksize();
-#if OMP_30_ENABLED
#ifndef KMP_SCHED_TYPE_DEFINED
#define KMP_SCHED_TYPE_DEFINED
typedef enum kmp_sched {
@@ -46,11 +45,10 @@ typedef enum kmp_sched {
#endif
void __kmps_set_schedule( kmp_sched_t kind, int modifier );
void __kmps_get_schedule( kmp_sched_t *kind, int *modifier );
-#endif // OMP_30_ENABLED
#if OMP_40_ENABLED
-void __kmps_set_proc_bind( enum kmp_proc_bind_t arg );
-enum kmp_proc_bind_t __kmps_get_proc_bind( void );
+void __kmps_set_proc_bind( kmp_proc_bind_t arg );
+kmp_proc_bind_t __kmps_get_proc_bind( void );
#endif /* OMP_40_ENABLED */
double __kmps_get_wtime();
diff --git a/openmp/runtime/src/kmp_taskdeps.cpp b/openmp/runtime/src/kmp_taskdeps.cpp
index ac51de2b55d..be426171890 100644
--- a/openmp/runtime/src/kmp_taskdeps.cpp
+++ b/openmp/runtime/src/kmp_taskdeps.cpp
@@ -19,6 +19,7 @@
#include "kmp.h"
#include "kmp_io.h"
+#include "kmp_wait_release.h"
#if OMP_40_ENABLED
@@ -88,20 +89,20 @@ static kmp_dephash_t *
__kmp_dephash_create ( kmp_info_t *thread )
{
kmp_dephash_t *h;
-
+
kmp_int32 size = kmp_dephash_size * sizeof(kmp_dephash_entry_t) + sizeof(kmp_dephash_t);
-
+
#if USE_FAST_MEMORY
h = (kmp_dephash_t *) __kmp_fast_allocate( thread, size );
#else
h = (kmp_dephash_t *) __kmp_thread_malloc( thread, size );
#endif
-#ifdef KMP_DEBUG
+#ifdef KMP_DEBUG
h->nelements = 0;
#endif
h->buckets = (kmp_dephash_entry **)(h+1);
-
+
for ( kmp_int32 i = 0; i < kmp_dephash_size; i++ )
h->buckets[i] = 0;
@@ -137,11 +138,11 @@ static kmp_dephash_entry *
__kmp_dephash_find ( kmp_info_t *thread, kmp_dephash_t *h, kmp_intptr_t addr )
{
kmp_int32 bucket = __kmp_dephash_hash(addr);
-
+
kmp_dephash_entry_t *entry;
for ( entry = h->buckets[bucket]; entry; entry = entry->next_in_bucket )
if ( entry->addr == addr ) break;
-
+
if ( entry == NULL ) {
// create entry. This is only done by one thread so no locking required
#if USE_FAST_MEMORY
@@ -212,6 +213,8 @@ static inline kmp_int32
__kmp_process_deps ( kmp_int32 gtid, kmp_depnode_t *node, kmp_dephash_t *hash,
bool dep_barrier,kmp_int32 ndeps, kmp_depend_info_t *dep_list)
{
+ KA_TRACE(30, ("__kmp_process_deps<%d>: T#%d processing %d depencies : dep_barrier = %d\n", filter, gtid, ndeps, dep_barrier ) );
+
kmp_info_t *thread = __kmp_threads[ gtid ];
kmp_int32 npredecessors=0;
for ( kmp_int32 i = 0; i < ndeps ; i++ ) {
@@ -232,6 +235,8 @@ __kmp_process_deps ( kmp_int32 gtid, kmp_depnode_t *node, kmp_dephash_t *hash,
if ( indep->dn.task ) {
__kmp_track_dependence(indep,node);
indep->dn.successors = __kmp_add_node(thread, indep->dn.successors, node);
+ KA_TRACE(40,("__kmp_process_deps<%d>: T#%d adding dependence from %p to %p",
+ filter,gtid, KMP_TASK_TO_TASKDATA(indep->dn.task), KMP_TASK_TO_TASKDATA(node->dn.task)));
npredecessors++;
}
KMP_RELEASE_DEPNODE(gtid,indep);
@@ -246,13 +251,16 @@ __kmp_process_deps ( kmp_int32 gtid, kmp_depnode_t *node, kmp_dephash_t *hash,
if ( last_out->dn.task ) {
__kmp_track_dependence(last_out,node);
last_out->dn.successors = __kmp_add_node(thread, last_out->dn.successors, node);
+ KA_TRACE(40,("__kmp_process_deps<%d>: T#%d adding dependence from %p to %p",
+ filter,gtid, KMP_TASK_TO_TASKDATA(last_out->dn.task), KMP_TASK_TO_TASKDATA(node->dn.task)));
+
npredecessors++;
}
KMP_RELEASE_DEPNODE(gtid,last_out);
}
if ( dep_barrier ) {
- // if this is a sync point in the serial sequence and previous outputs are guaranteed to be completed after
+ // if this is a sync point in the serial sequence, then the previous outputs are guaranteed to be completed after
// the execution of this task so the previous output nodes can be cleared.
__kmp_node_deref(thread,last_out);
info->last_out = NULL;
@@ -265,6 +273,9 @@ __kmp_process_deps ( kmp_int32 gtid, kmp_depnode_t *node, kmp_dephash_t *hash,
}
}
+
+ KA_TRACE(30, ("__kmp_process_deps<%d>: T#%d found %d predecessors\n", filter, gtid, npredecessors ) );
+
return npredecessors;
}
@@ -278,7 +289,10 @@ __kmp_check_deps ( kmp_int32 gtid, kmp_depnode_t *node, kmp_task_t *task, kmp_de
kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list )
{
int i;
-
+
+ kmp_taskdata_t * taskdata = KMP_TASK_TO_TASKDATA(task);
+ KA_TRACE(20, ("__kmp_check_deps: T#%d checking dependencies for task %p : %d possibly aliased dependencies, %d non-aliased depedencies : dep_barrier=%d .\n", gtid, taskdata, ndeps, ndeps_noalias, dep_barrier ) );
+
// Filter deps in dep_list
// TODO: Different algorithm for large dep_list ( > 10 ? )
for ( i = 0; i < ndeps; i ++ ) {
@@ -292,8 +306,8 @@ __kmp_check_deps ( kmp_int32 gtid, kmp_depnode_t *node, kmp_task_t *task, kmp_de
}
// doesn't need to be atomic as no other thread is going to be accessing this node just yet
- // npredecessors is set 1 to ensure that none of the releasing tasks queues this task before we have finished processing all the dependencies
- node->dn.npredecessors = 1;
+ // npredecessors is set -1 to ensure that none of the releasing tasks queues this task before we have finished processing all the dependencies
+ node->dn.npredecessors = -1;
// used to pack all npredecessors additions into a single atomic operation at the end
int npredecessors;
@@ -301,12 +315,16 @@ __kmp_check_deps ( kmp_int32 gtid, kmp_depnode_t *node, kmp_task_t *task, kmp_de
npredecessors = __kmp_process_deps<true>(gtid, node, hash, dep_barrier, ndeps, dep_list);
npredecessors += __kmp_process_deps<false>(gtid, node, hash, dep_barrier, ndeps_noalias, noalias_dep_list);
- KMP_TEST_THEN_ADD32(&node->dn.npredecessors, npredecessors);
-
- // Remove the fake predecessor and find out if there's any outstanding dependence (some tasks may have finished while we processed the dependences)
node->dn.task = task;
KMP_MB();
- npredecessors = KMP_TEST_THEN_DEC32(&node->dn.npredecessors) - 1;
+
+ // Account for our initial fake value
+ npredecessors++;
+
+ // Update predecessors and obtain current value to check if there are still any outstandig dependences (some tasks may have finished while we processed the dependences)
+ npredecessors = KMP_TEST_THEN_ADD32(&node->dn.npredecessors, npredecessors) + npredecessors;
+
+ KA_TRACE(20, ("__kmp_check_deps: T#%d found %d predecessors for task %p \n", gtid, npredecessors, taskdata ) );
// beyond this point the task could be queued (and executed) by a releasing task...
return npredecessors > 0 ? true : false;
@@ -318,11 +336,15 @@ __kmp_release_deps ( kmp_int32 gtid, kmp_taskdata_t *task )
kmp_info_t *thread = __kmp_threads[ gtid ];
kmp_depnode_t *node = task->td_depnode;
- if ( task->td_dephash )
+ if ( task->td_dephash ) {
+ KA_TRACE(40, ("__kmp_realease_deps: T#%d freeing dependencies hash of task %p.\n", gtid, task ) );
__kmp_dephash_free(thread,task->td_dephash);
+ }
if ( !node ) return;
+ KA_TRACE(20, ("__kmp_realease_deps: T#%d notifying succesors of task %p.\n", gtid, task ) );
+
KMP_ACQUIRE_DEPNODE(gtid,node);
node->dn.task = NULL; // mark this task as finished, so no new dependencies are generated
KMP_RELEASE_DEPNODE(gtid,node);
@@ -335,9 +357,10 @@ __kmp_release_deps ( kmp_int32 gtid, kmp_taskdata_t *task )
// successor task can be NULL for wait_depends or because deps are still being processed
if ( npredecessors == 0 ) {
KMP_MB();
- if ( successor->dn.task )
- // loc_ref was already stored in successor's task_data
- __kmpc_omp_task(NULL,gtid,successor->dn.task);
+ if ( successor->dn.task ) {
+ KA_TRACE(20, ("__kmp_realease_deps: T#%d successor %p of %p scheduled for execution.\n", gtid, successor->dn.task, task ) );
+ __kmp_omp_task(gtid,successor->dn.task,false);
+ }
}
next = p->next;
@@ -350,6 +373,8 @@ __kmp_release_deps ( kmp_int32 gtid, kmp_taskdata_t *task )
}
__kmp_node_deref(thread,node);
+
+ KA_TRACE(20, ("__kmp_realease_deps: T#%d all successors of %p notified of completation\n", gtid, task ) );
}
/*!
@@ -368,15 +393,20 @@ Schedule a non-thread-switchable task with dependences for execution
*/
kmp_int32
__kmpc_omp_task_with_deps( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t * new_task,
- kmp_int32 ndeps, kmp_depend_info_t *dep_list,
- kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list )
+ kmp_int32 ndeps, kmp_depend_info_t *dep_list,
+ kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list )
{
+
+ kmp_taskdata_t * new_taskdata = KMP_TASK_TO_TASKDATA(new_task);
+ KA_TRACE(10, ("__kmpc_omp_task_with_deps(enter): T#%d loc=%p task=%p\n",
+ gtid, loc_ref, new_taskdata ) );
+
kmp_info_t *thread = __kmp_threads[ gtid ];
kmp_taskdata_t * current_task = thread->th.th_current_task;
bool serial = current_task->td_flags.team_serial || current_task->td_flags.tasking_ser || current_task->td_flags.final;
- if ( !serial && ( ndeps > 0 || ndeps_noalias > 0 )) {
+ if ( !serial && ( ndeps > 0 || ndeps_noalias > 0 )) {
/* if no dependencies have been tracked yet, create the dependence hash */
if ( current_task->td_dephash == NULL )
current_task->td_dephash = __kmp_dephash_create(thread);
@@ -388,13 +418,21 @@ __kmpc_omp_task_with_deps( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t * new_ta
#endif
__kmp_init_node(node);
- KMP_TASK_TO_TASKDATA(new_task)->td_depnode = node;
+ new_taskdata->td_depnode = node;
if ( __kmp_check_deps( gtid, node, new_task, current_task->td_dephash, NO_DEP_BARRIER,
- ndeps, dep_list, ndeps_noalias,noalias_dep_list ) )
+ ndeps, dep_list, ndeps_noalias,noalias_dep_list ) ) {
+ KA_TRACE(10, ("__kmpc_omp_task_with_deps(exit): T#%d task had blocking dependencies: "
+ "loc=%p task=%p, return: TASK_CURRENT_NOT_QUEUED\n", gtid, loc_ref,
+ new_taskdata ) );
return TASK_CURRENT_NOT_QUEUED;
+ }
}
+ KA_TRACE(10, ("__kmpc_omp_task_with_deps(exit): T#%d task had no blocking dependencies : "
+ "loc=%p task=%p, transferring to __kmpc_omp_task\n", gtid, loc_ref,
+ new_taskdata ) );
+
return __kmpc_omp_task(loc_ref,gtid,new_task);
}
@@ -413,35 +451,44 @@ void
__kmpc_omp_wait_deps ( ident_t *loc_ref, kmp_int32 gtid, kmp_int32 ndeps, kmp_depend_info_t *dep_list,
kmp_int32 ndeps_noalias, kmp_depend_info_t *noalias_dep_list )
{
- if ( ndeps == 0 && ndeps_noalias == 0 ) return;
+ KA_TRACE(10, ("__kmpc_omp_wait_deps(enter): T#%d loc=%p\n", gtid, loc_ref) );
+
+ if ( ndeps == 0 && ndeps_noalias == 0 ) {
+ KA_TRACE(10, ("__kmpc_omp_wait_deps(exit): T#%d has no dependencies to wait upon : loc=%p\n", gtid, loc_ref) );
+ return;
+ }
kmp_info_t *thread = __kmp_threads[ gtid ];
kmp_taskdata_t * current_task = thread->th.th_current_task;
- // dependences are not computed in serial teams
- if ( current_task->td_flags.team_serial || current_task->td_flags.tasking_ser || current_task->td_flags.final)
+ // We can return immediately as:
+ // - dependences are not computed in serial teams
+ // - if the dephash is not yet created it means we have nothing to wait for
+ if ( current_task->td_flags.team_serial || current_task->td_flags.tasking_ser || current_task->td_flags.final || current_task->td_dephash == NULL ) {
+ KA_TRACE(10, ("__kmpc_omp_wait_deps(exit): T#%d has no blocking dependencies : loc=%p\n", gtid, loc_ref) );
return;
-
- // if the dephash is not yet created it means we have nothing to wait for
- if ( current_task->td_dephash == NULL ) return;
+ }
kmp_depnode_t node;
__kmp_init_node(&node);
if (!__kmp_check_deps( gtid, &node, NULL, current_task->td_dephash, DEP_BARRIER,
- ndeps, dep_list, ndeps_noalias, noalias_dep_list ))
+ ndeps, dep_list, ndeps_noalias, noalias_dep_list )) {
+ KA_TRACE(10, ("__kmpc_omp_wait_deps(exit): T#%d has no blocking dependencies : loc=%p\n", gtid, loc_ref) );
return;
+ }
int thread_finished = FALSE;
+ kmp_flag_32 flag((volatile kmp_uint32 *)&(node.dn.npredecessors), 0U);
while ( node.dn.npredecessors > 0 ) {
- __kmp_execute_tasks( thread, gtid, (volatile kmp_uint32 *)&(node.dn.npredecessors),
- 0, FALSE, &thread_finished,
+ flag.execute_tasks(thread, gtid, FALSE, &thread_finished,
#if USE_ITT_BUILD
- NULL,
+ NULL,
#endif
- __kmp_task_stealing_constraint );
+ __kmp_task_stealing_constraint );
}
+ KA_TRACE(10, ("__kmpc_omp_wait_deps(exit): T#%d finished waiting : loc=%p\n", gtid, loc_ref) );
}
#endif /* OMP_40_ENABLED */
diff --git a/openmp/runtime/src/kmp_tasking.c b/openmp/runtime/src/kmp_tasking.c
index 6607577e69d..9db1565193b 100644
--- a/openmp/runtime/src/kmp_tasking.c
+++ b/openmp/runtime/src/kmp_tasking.c
@@ -1,7 +1,7 @@
/*
* kmp_tasking.c -- OpenMP 3.0 tasking support.
- * $Revision: 42852 $
- * $Date: 2013-12-04 10:50:49 -0600 (Wed, 04 Dec 2013) $
+ * $Revision: 43389 $
+ * $Date: 2014-08-11 10:54:01 -0500 (Mon, 11 Aug 2014) $
*/
@@ -18,9 +18,9 @@
#include "kmp.h"
#include "kmp_i18n.h"
#include "kmp_itt.h"
+#include "kmp_wait_release.h"
-#if OMP_30_ENABLED
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
@@ -31,26 +31,12 @@ static void __kmp_enable_tasking( kmp_task_team_t *task_team, kmp_info_t *this_t
static void __kmp_alloc_task_deque( kmp_info_t *thread, kmp_thread_data_t *thread_data );
static int __kmp_realloc_task_threads_data( kmp_info_t *thread, kmp_task_team_t *task_team );
-#ifndef KMP_DEBUG
-# define __kmp_static_delay( arg ) /* nothing to do */
-#else
-
-static void
-__kmp_static_delay( int arg )
-{
-/* Work around weird code-gen bug that causes assert to trip */
-# if KMP_ARCH_X86_64 && KMP_OS_LINUX
- KMP_ASSERT( arg != 0 );
-# else
- KMP_ASSERT( arg >= 0 );
-# endif
-}
-#endif /* KMP_DEBUG */
-
-static void
-__kmp_static_yield( int arg )
-{
- __kmp_yield( arg );
+static inline void __kmp_null_resume_wrapper(int gtid, volatile void *flag) {
+ switch (((kmp_flag_64 *)flag)->get_type()) {
+ case flag32: __kmp_resume_32(gtid, NULL); break;
+ case flag64: __kmp_resume_64(gtid, NULL); break;
+ case flag_oncore: __kmp_resume_oncore(gtid, NULL); break;
+ }
}
#ifdef BUILD_TIED_TASK_STACK
@@ -605,9 +591,7 @@ __kmp_task_finish( kmp_int32 gtid, kmp_task_t *task, kmp_taskdata_t *resumed_tas
}
#endif /* BUILD_TIED_TASK_STACK */
- KMP_DEBUG_ASSERT( taskdata -> td_flags.executing == 1 );
KMP_DEBUG_ASSERT( taskdata -> td_flags.complete == 0 );
- taskdata -> td_flags.executing = 0; // suspend the finishing task
taskdata -> td_flags.complete = 1; // mark the task as completed
KMP_DEBUG_ASSERT( taskdata -> td_flags.started == 1 );
KMP_DEBUG_ASSERT( taskdata -> td_flags.freed == 0 );
@@ -624,6 +608,12 @@ __kmp_task_finish( kmp_int32 gtid, kmp_task_t *task, kmp_taskdata_t *resumed_tas
#endif
}
+ // td_flags.executing must be marked as 0 after __kmp_release_deps has been called
+ // Othertwise, if a task is executed immediately from the release_deps code
+ // the flag will be reset to 1 again by this same function
+ KMP_DEBUG_ASSERT( taskdata -> td_flags.executing == 1 );
+ taskdata -> td_flags.executing = 0; // suspend the finishing task
+
KA_TRACE(20, ("__kmp_task_finish: T#%d finished task %p, %d incomplete children\n",
gtid, taskdata, children) );
@@ -908,7 +898,7 @@ __kmp_task_alloc( ident_t *loc_ref, kmp_int32 gtid, kmp_tasking_flags_t *flags,
taskdata->td_taskgroup = parent_task->td_taskgroup; // task inherits the taskgroup from the parent task
taskdata->td_dephash = NULL;
taskdata->td_depnode = NULL;
-#endif
+#endif
// Only need to keep track of child task counts if team parallel and tasking not serialized
if ( !( taskdata -> td_flags.team_serial || taskdata -> td_flags.tasking_ser ) ) {
KMP_TEST_THEN_INC32( (kmp_int32 *)(& parent_task->td_incomplete_child_tasks) );
@@ -1047,25 +1037,19 @@ __kmpc_omp_task_parts( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t * new_task)
return TASK_CURRENT_NOT_QUEUED;
}
-
//---------------------------------------------------------------------
-// __kmpc_omp_task: Schedule a non-thread-switchable task for execution
-// loc_ref: location of original task pragma (ignored)
+// __kmp_omp_task: Schedule a non-thread-switchable task for execution
// gtid: Global Thread ID of encountering thread
// new_task: non-thread-switchable task thunk allocated by __kmp_omp_task_alloc()
+// serialize_immediate: if TRUE then if the task is executed immediately its execution will be serialized
// returns:
//
// TASK_CURRENT_NOT_QUEUED (0) if did not suspend and queue current task to be resumed later.
// TASK_CURRENT_QUEUED (1) if suspended and queued the current task to be resumed later.
-
kmp_int32
-__kmpc_omp_task( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t * new_task)
+__kmp_omp_task( kmp_int32 gtid, kmp_task_t * new_task, bool serialize_immediate )
{
kmp_taskdata_t * new_taskdata = KMP_TASK_TO_TASKDATA(new_task);
- kmp_int32 rc;
-
- KA_TRACE(10, ("__kmpc_omp_task(enter): T#%d loc=%p task=%p\n",
- gtid, loc_ref, new_taskdata ) );
/* Should we execute the new task or queue it? For now, let's just always try to
queue it. If the queue fills up, then we'll execute it. */
@@ -1073,16 +1057,41 @@ __kmpc_omp_task( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t * new_task)
if ( __kmp_push_task( gtid, new_task ) == TASK_NOT_PUSHED ) // if cannot defer
{ // Execute this task immediately
kmp_taskdata_t * current_task = __kmp_threads[ gtid ] -> th.th_current_task;
- new_taskdata -> td_flags.task_serial = 1;
+ if ( serialize_immediate )
+ new_taskdata -> td_flags.task_serial = 1;
__kmp_invoke_task( gtid, new_task, current_task );
}
- KA_TRACE(10, ("__kmpc_omp_task(exit): T#%d returning TASK_CURRENT_NOT_QUEUED: loc=%p task=%p\n",
- gtid, loc_ref, new_taskdata ) );
return TASK_CURRENT_NOT_QUEUED;
}
+//---------------------------------------------------------------------
+// __kmpc_omp_task: Wrapper around __kmp_omp_task to schedule a non-thread-switchable task from
+// the parent thread only!
+// loc_ref: location of original task pragma (ignored)
+// gtid: Global Thread ID of encountering thread
+// new_task: non-thread-switchable task thunk allocated by __kmp_omp_task_alloc()
+// returns:
+//
+// TASK_CURRENT_NOT_QUEUED (0) if did not suspend and queue current task to be resumed later.
+// TASK_CURRENT_QUEUED (1) if suspended and queued the current task to be resumed later.
+
+kmp_int32
+__kmpc_omp_task( ident_t *loc_ref, kmp_int32 gtid, kmp_task_t * new_task)
+{
+ kmp_taskdata_t * new_taskdata = KMP_TASK_TO_TASKDATA(new_task);
+ kmp_int32 res;
+
+ KA_TRACE(10, ("__kmpc_omp_task(enter): T#%d loc=%p task=%p\n",
+ gtid, loc_ref, new_taskdata ) );
+
+ res = __kmp_omp_task(gtid,new_task,true);
+
+ KA_TRACE(10, ("__kmpc_omp_task(exit): T#%d returning TASK_CURRENT_NOT_QUEUED: loc=%p task=%p\n",
+ gtid, loc_ref, new_taskdata ) );
+ return res;
+}
//-------------------------------------------------------------------------------------
// __kmpc_omp_taskwait: Wait until all tasks generated by the current task are complete
@@ -1117,11 +1126,10 @@ __kmpc_omp_taskwait( ident_t *loc_ref, kmp_int32 gtid )
if ( ! taskdata->td_flags.team_serial ) {
// GEH: if team serialized, avoid reading the volatile variable below.
+ kmp_flag_32 flag(&(taskdata->td_incomplete_child_tasks), 0U);
while ( TCR_4(taskdata -> td_incomplete_child_tasks) != 0 ) {
- __kmp_execute_tasks( thread, gtid, &(taskdata->td_incomplete_child_tasks),
- 0, FALSE, &thread_finished
- USE_ITT_BUILD_ARG(itt_sync_obj),
- __kmp_task_stealing_constraint );
+ flag.execute_tasks(thread, gtid, FALSE, &thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj), __kmp_task_stealing_constraint );
}
}
#if USE_ITT_BUILD
@@ -1153,7 +1161,7 @@ __kmpc_omp_taskyield( ident_t *loc_ref, kmp_int32 gtid, int end_part )
KA_TRACE(10, ("__kmpc_omp_taskyield(enter): T#%d loc=%p end_part = %d\n",
gtid, loc_ref, end_part) );
- if ( __kmp_tasking_mode != tskm_immediate_exec ) {
+ if ( __kmp_tasking_mode != tskm_immediate_exec && __kmp_init_parallel ) {
// GEH TODO: shouldn't we have some sort of OMPRAP API calls here to mark begin wait?
thread = __kmp_threads[ gtid ];
@@ -1172,11 +1180,14 @@ __kmpc_omp_taskyield( ident_t *loc_ref, kmp_int32 gtid, int end_part )
__kmp_itt_taskwait_starting( gtid, itt_sync_obj );
#endif /* USE_ITT_BUILD */
if ( ! taskdata->td_flags.team_serial ) {
- __kmp_execute_tasks( thread, gtid, NULL, 0, FALSE, &thread_finished
- USE_ITT_BUILD_ARG(itt_sync_obj),
- __kmp_task_stealing_constraint );
+ kmp_task_team_t * task_team = thread->th.th_task_team;
+ if (task_team != NULL) {
+ if (KMP_TASKING_ENABLED(task_team, thread->th.th_task_state)) {
+ __kmp_execute_tasks_32( thread, gtid, NULL, FALSE, &thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj), __kmp_task_stealing_constraint );
+ }
+ }
}
-
#if USE_ITT_BUILD
if ( itt_sync_obj != NULL )
__kmp_itt_taskwait_finished( gtid, itt_sync_obj );
@@ -1236,11 +1247,10 @@ __kmpc_end_taskgroup( ident_t* loc, int gtid )
#endif /* USE_ITT_BUILD */
if ( ! taskdata->td_flags.team_serial ) {
+ kmp_flag_32 flag(&(taskgroup->count), 0U);
while ( TCR_4(taskgroup->count) != 0 ) {
- __kmp_execute_tasks( thread, gtid, &(taskgroup->count),
- 0, FALSE, &thread_finished
- USE_ITT_BUILD_ARG(itt_sync_obj),
- __kmp_task_stealing_constraint );
+ flag.execute_tasks(thread, gtid, FALSE, &thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj), __kmp_task_stealing_constraint );
}
}
@@ -1433,7 +1443,7 @@ __kmp_steal_task( kmp_info_t *victim, kmp_int32 gtid, kmp_task_team_t *task_team
__kmp_release_bootstrap_lock( & victim_td -> td.td_deque_lock );
- KA_TRACE(10, ("__kmp_steal_task(exit #3): T#%d stole task %p from T#d: task_team=%p "
+ KA_TRACE(10, ("__kmp_steal_task(exit #3): T#%d stole task %p from T#%d: task_team=%p "
"ntasks=%d head=%u tail=%u\n",
gtid, taskdata, __kmp_gtid_from_thread( victim ), task_team,
victim_td->td.td_deque_ntasks, victim_td->td.td_deque_head,
@@ -1445,7 +1455,7 @@ __kmp_steal_task( kmp_info_t *victim, kmp_int32 gtid, kmp_task_team_t *task_team
//-----------------------------------------------------------------------------
-// __kmp_execute_tasks: Choose and execute tasks until either the condition
+// __kmp_execute_tasks_template: Choose and execute tasks until either the condition
// is statisfied (return true) or there are none left (return false).
// final_spin is TRUE if this is the spin at the release barrier.
// thread_finished indicates whether the thread is finished executing all
@@ -1453,16 +1463,10 @@ __kmp_steal_task( kmp_info_t *victim, kmp_int32 gtid, kmp_task_team_t *task_team
// spinner is the location on which to spin.
// spinner == NULL means only execute a single task and return.
// checker is the value to check to terminate the spin.
-
-int
-__kmp_execute_tasks( kmp_info_t *thread,
- kmp_int32 gtid,
- volatile kmp_uint *spinner,
- kmp_uint checker,
- int final_spin,
- int *thread_finished
- USE_ITT_BUILD_ARG(void * itt_sync_obj),
- kmp_int32 is_constrained )
+template <class C>
+static inline int __kmp_execute_tasks_template(kmp_info_t *thread, kmp_int32 gtid, C *flag, int final_spin,
+ int *thread_finished
+ USE_ITT_BUILD_ARG(void * itt_sync_obj), kmp_int32 is_constrained)
{
kmp_task_team_t * task_team;
kmp_team_t * team;
@@ -1478,7 +1482,7 @@ __kmp_execute_tasks( kmp_info_t *thread,
task_team = thread -> th.th_task_team;
KMP_DEBUG_ASSERT( task_team != NULL );
- KA_TRACE(15, ("__kmp_execute_tasks(enter): T#%d final_spin=%d *thread_finished=%d\n",
+ KA_TRACE(15, ("__kmp_execute_tasks_template(enter): T#%d final_spin=%d *thread_finished=%d\n",
gtid, final_spin, *thread_finished) );
threads_data = (kmp_thread_data_t *)TCR_PTR(task_team -> tt.tt_threads_data);
@@ -1512,8 +1516,8 @@ __kmp_execute_tasks( kmp_info_t *thread,
// If this thread is in the last spin loop in the barrier, waiting to be
// released, we know that the termination condition will not be satisified,
// so don't waste any cycles checking it.
- if ((spinner == NULL) || ((!final_spin) && (TCR_4(*spinner) == checker))) {
- KA_TRACE(15, ("__kmp_execute_tasks(exit #1): T#%d spin condition satisfied\n", gtid) );
+ if (flag == NULL || (!final_spin && flag->done_check())) {
+ KA_TRACE(15, ("__kmp_execute_tasks_template(exit #1): T#%d spin condition satisfied\n", gtid) );
return TRUE;
}
KMP_YIELD( __kmp_library == library_throughput ); // Yield before executing next task
@@ -1527,7 +1531,7 @@ __kmp_execute_tasks( kmp_info_t *thread,
// result in the termination condition being satisfied.
if (! *thread_finished) {
kmp_uint32 count = KMP_TEST_THEN_DEC32( (kmp_int32 *)unfinished_threads ) - 1;
- KA_TRACE(20, ("__kmp_execute_tasks(dec #1): T#%d dec unfinished_threads to %d task_team=%p\n",
+ KA_TRACE(20, ("__kmp_execute_tasks_template(dec #1): T#%d dec unfinished_threads to %d task_team=%p\n",
gtid, count, task_team) );
*thread_finished = TRUE;
}
@@ -1537,8 +1541,8 @@ __kmp_execute_tasks( kmp_info_t *thread,
// thread to pass through the barrier, where it might reset each thread's
// th.th_team field for the next parallel region.
// If we can steal more work, we know that this has not happened yet.
- if ((spinner != NULL) && (TCR_4(*spinner) == checker)) {
- KA_TRACE(15, ("__kmp_execute_tasks(exit #2): T#%d spin condition satisfied\n", gtid) );
+ if (flag != NULL && flag->done_check()) {
+ KA_TRACE(15, ("__kmp_execute_tasks_template(exit #2): T#%d spin condition satisfied\n", gtid) );
return TRUE;
}
}
@@ -1569,8 +1573,8 @@ __kmp_execute_tasks( kmp_info_t *thread,
#endif /* USE_ITT_BUILD */
// Check to see if this thread can proceed.
- if ((spinner == NULL) || ((!final_spin) && (TCR_4(*spinner) == checker))) {
- KA_TRACE(15, ("__kmp_execute_tasks(exit #3): T#%d spin condition satisfied\n",
+ if (flag == NULL || (!final_spin && flag->done_check())) {
+ KA_TRACE(15, ("__kmp_execute_tasks_template(exit #3): T#%d spin condition satisfied\n",
gtid) );
return TRUE;
}
@@ -1579,7 +1583,7 @@ __kmp_execute_tasks( kmp_info_t *thread,
// If the execution of the stolen task resulted in more tasks being
// placed on our run queue, then restart the whole process.
if (TCR_4(threads_data[ tid ].td.td_deque_ntasks) != 0) {
- KA_TRACE(20, ("__kmp_execute_tasks: T#%d stolen task spawned other tasks, restart\n",
+ KA_TRACE(20, ("__kmp_execute_tasks_template: T#%d stolen task spawned other tasks, restart\n",
gtid) );
goto start;
}
@@ -1596,7 +1600,7 @@ __kmp_execute_tasks( kmp_info_t *thread,
// result in the termination condition being satisfied.
if (! *thread_finished) {
kmp_uint32 count = KMP_TEST_THEN_DEC32( (kmp_int32 *)unfinished_threads ) - 1;
- KA_TRACE(20, ("__kmp_execute_tasks(dec #2): T#%d dec unfinished_threads to %d "
+ KA_TRACE(20, ("__kmp_execute_tasks_template(dec #2): T#%d dec unfinished_threads to %d "
"task_team=%p\n", gtid, count, task_team) );
*thread_finished = TRUE;
}
@@ -1607,8 +1611,8 @@ __kmp_execute_tasks( kmp_info_t *thread,
// thread to pass through the barrier, where it might reset each thread's
// th.th_team field for the next parallel region.
// If we can steal more work, we know that this has not happened yet.
- if ((spinner != NULL) && (TCR_4(*spinner) == checker)) {
- KA_TRACE(15, ("__kmp_execute_tasks(exit #4): T#%d spin condition satisfied\n",
+ if (flag != NULL && flag->done_check()) {
+ KA_TRACE(15, ("__kmp_execute_tasks_template(exit #4): T#%d spin condition satisfied\n",
gtid) );
return TRUE;
}
@@ -1640,8 +1644,7 @@ __kmp_execute_tasks( kmp_info_t *thread,
(__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) &&
(TCR_PTR(other_thread->th.th_sleep_loc) != NULL))
{
- __kmp_resume( __kmp_gtid_from_thread( other_thread ), NULL );
-
+ __kmp_null_resume_wrapper(__kmp_gtid_from_thread(other_thread), other_thread->th.th_sleep_loc);
// A sleeping thread should not have any tasks on it's queue.
// There is a slight possibility that it resumes, steals a task from
// another thread, which spawns more tasks, all in the that it takes
@@ -1677,8 +1680,8 @@ __kmp_execute_tasks( kmp_info_t *thread,
}
// Check to see if this thread can proceed.
- if ((spinner == NULL) || ((!final_spin) && (TCR_4(*spinner) == checker))) {
- KA_TRACE(15, ("__kmp_execute_tasks(exit #5): T#%d spin condition satisfied\n",
+ if (flag == NULL || (!final_spin && flag->done_check())) {
+ KA_TRACE(15, ("__kmp_execute_tasks_template(exit #5): T#%d spin condition satisfied\n",
gtid) );
return TRUE;
}
@@ -1687,7 +1690,7 @@ __kmp_execute_tasks( kmp_info_t *thread,
// If the execution of the stolen task resulted in more tasks being
// placed on our run queue, then restart the whole process.
if (TCR_4(threads_data[ tid ].td.td_deque_ntasks) != 0) {
- KA_TRACE(20, ("__kmp_execute_tasks: T#%d stolen task spawned other tasks, restart\n",
+ KA_TRACE(20, ("__kmp_execute_tasks_template: T#%d stolen task spawned other tasks, restart\n",
gtid) );
goto start;
}
@@ -1704,7 +1707,7 @@ __kmp_execute_tasks( kmp_info_t *thread,
// result in the termination condition being satisfied.
if (! *thread_finished) {
kmp_uint32 count = KMP_TEST_THEN_DEC32( (kmp_int32 *)unfinished_threads ) - 1;
- KA_TRACE(20, ("__kmp_execute_tasks(dec #3): T#%d dec unfinished_threads to %d; "
+ KA_TRACE(20, ("__kmp_execute_tasks_template(dec #3): T#%d dec unfinished_threads to %d; "
"task_team=%p\n",
gtid, count, task_team) );
*thread_finished = TRUE;
@@ -1716,18 +1719,42 @@ __kmp_execute_tasks( kmp_info_t *thread,
// thread to pass through the barrier, where it might reset each thread's
// th.th_team field for the next parallel region.
// If we can steal more work, we know that this has not happened yet.
- if ((spinner != NULL) && (TCR_4(*spinner) == checker)) {
- KA_TRACE(15, ("__kmp_execute_tasks(exit #6): T#%d spin condition satisfied\n",
- gtid) );
+ if (flag != NULL && flag->done_check()) {
+ KA_TRACE(15, ("__kmp_execute_tasks_template(exit #6): T#%d spin condition satisfied\n", gtid) );
return TRUE;
}
}
}
- KA_TRACE(15, ("__kmp_execute_tasks(exit #7): T#%d can't find work\n", gtid) );
+ KA_TRACE(15, ("__kmp_execute_tasks_template(exit #7): T#%d can't find work\n", gtid) );
return FALSE;
}
+int __kmp_execute_tasks_32(kmp_info_t *thread, kmp_int32 gtid, kmp_flag_32 *flag, int final_spin,
+ int *thread_finished
+ USE_ITT_BUILD_ARG(void * itt_sync_obj), kmp_int32 is_constrained)
+{
+ return __kmp_execute_tasks_template(thread, gtid, flag, final_spin, thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj), is_constrained);
+}
+
+int __kmp_execute_tasks_64(kmp_info_t *thread, kmp_int32 gtid, kmp_flag_64 *flag, int final_spin,
+ int *thread_finished
+ USE_ITT_BUILD_ARG(void * itt_sync_obj), kmp_int32 is_constrained)
+{
+ return __kmp_execute_tasks_template(thread, gtid, flag, final_spin, thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj), is_constrained);
+}
+
+int __kmp_execute_tasks_oncore(kmp_info_t *thread, kmp_int32 gtid, kmp_flag_oncore *flag, int final_spin,
+ int *thread_finished
+ USE_ITT_BUILD_ARG(void * itt_sync_obj), kmp_int32 is_constrained)
+{
+ return __kmp_execute_tasks_template(thread, gtid, flag, final_spin, thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj), is_constrained);
+}
+
+
//-----------------------------------------------------------------------------
// __kmp_enable_tasking: Allocate task team and resume threads sleeping at the
@@ -1770,7 +1797,7 @@ __kmp_enable_tasking( kmp_task_team_t *task_team, kmp_info_t *this_thr )
// tasks and execute them. In extra barrier mode, tasks do not sleep
// at the separate tasking barrier, so this isn't a problem.
for (i = 0; i < nthreads; i++) {
- volatile kmp_uint *sleep_loc;
+ volatile void *sleep_loc;
kmp_info_t *thread = threads_data[i].td.td_thr;
if (i == this_thr->th.th_info.ds.ds_tid) {
@@ -1779,17 +1806,16 @@ __kmp_enable_tasking( kmp_task_team_t *task_team, kmp_info_t *this_thr )
// Since we haven't locked the thread's suspend mutex lock at this
// point, there is a small window where a thread might be putting
// itself to sleep, but hasn't set the th_sleep_loc field yet.
- // To work around this, __kmp_execute_tasks() periodically checks
+ // To work around this, __kmp_execute_tasks_template() periodically checks
// see if other threads are sleeping (using the same random
// mechanism that is used for task stealing) and awakens them if
// they are.
- if ( ( sleep_loc = (volatile kmp_uint *)
- TCR_PTR( thread -> th.th_sleep_loc) ) != NULL )
+ if ( ( sleep_loc = TCR_PTR( thread -> th.th_sleep_loc) ) != NULL )
{
KF_TRACE( 50, ( "__kmp_enable_tasking: T#%d waking up thread T#%d\n",
__kmp_gtid_from_thread( this_thr ),
__kmp_gtid_from_thread( thread ) ) );
- __kmp_resume( __kmp_gtid_from_thread( thread ), sleep_loc );
+ __kmp_null_resume_wrapper(__kmp_gtid_from_thread(thread), sleep_loc);
}
else {
KF_TRACE( 50, ( "__kmp_enable_tasking: T#%d don't wake up thread T#%d\n",
@@ -1805,7 +1831,7 @@ __kmp_enable_tasking( kmp_task_team_t *task_team, kmp_info_t *this_thr )
/* ------------------------------------------------------------------------ */
-/*
+/* // TODO: Check the comment consistency
* Utility routines for "task teams". A task team (kmp_task_t) is kind of
* like a shadow of the kmp_team_t data struct, with a different lifetime.
* After a child * thread checks into a barrier and calls __kmp_release() from
@@ -1839,6 +1865,7 @@ __kmp_enable_tasking( kmp_task_team_t *task_team, kmp_info_t *this_thr )
* barriers, when no explicit tasks were spawned (pushed, actually).
*/
+
static kmp_task_team_t *__kmp_free_task_teams = NULL; // Free list for task_team data structures
// Lock for task team data structures
static kmp_bootstrap_lock_t __kmp_task_team_lock = KMP_BOOTSTRAP_LOCK_INITIALIZER( __kmp_task_team_lock );
@@ -2193,7 +2220,6 @@ __kmp_wait_to_unref_task_teams(void)
thread != NULL;
thread = thread->th.th_next_pool)
{
- volatile kmp_uint *sleep_loc;
#if KMP_OS_WINDOWS
DWORD exit_val;
#endif
@@ -2218,11 +2244,12 @@ __kmp_wait_to_unref_task_teams(void)
__kmp_gtid_from_thread( thread ) ) );
if ( __kmp_dflt_blocktime != KMP_MAX_BLOCKTIME ) {
+ volatile void *sleep_loc;
// If the thread is sleeping, awaken it.
- if ( ( sleep_loc = (volatile kmp_uint *) TCR_PTR( thread->th.th_sleep_loc) ) != NULL ) {
+ if ( ( sleep_loc = TCR_PTR( thread->th.th_sleep_loc) ) != NULL ) {
KA_TRACE( 10, ( "__kmp_wait_to_unref_task_team: T#%d waking up thread T#%d\n",
__kmp_gtid_from_thread( thread ), __kmp_gtid_from_thread( thread ) ) );
- __kmp_resume( __kmp_gtid_from_thread( thread ), sleep_loc );
+ __kmp_null_resume_wrapper(__kmp_gtid_from_thread(thread), sleep_loc);
}
}
}
@@ -2350,9 +2377,9 @@ __kmp_task_team_wait( kmp_info_t *this_thr,
// contention, only the master thread checks for the
// termination condition.
//
- __kmp_wait_sleep( this_thr, &task_team->tt.tt_unfinished_threads, 0, TRUE
- USE_ITT_BUILD_ARG(itt_sync_obj)
- );
+ kmp_flag_32 flag(&task_team->tt.tt_unfinished_threads, 0U);
+ flag.wait(this_thr, TRUE
+ USE_ITT_BUILD_ARG(itt_sync_obj));
//
// Kill the old task team, so that the worker threads will
@@ -2390,8 +2417,9 @@ __kmp_tasking_barrier( kmp_team_t *team, kmp_info_t *thread, int gtid )
#if USE_ITT_BUILD
KMP_FSYNC_SPIN_INIT( spin, (kmp_uint32*) NULL );
#endif /* USE_ITT_BUILD */
- while (! __kmp_execute_tasks( thread, gtid, spin, 0, TRUE, &flag
- USE_ITT_BUILD_ARG(NULL), 0 ) ) {
+ kmp_flag_32 spin_flag(spin, 0U);
+ while (! spin_flag.execute_tasks(thread, gtid, TRUE, &flag
+ USE_ITT_BUILD_ARG(NULL), 0 ) ) {
#if USE_ITT_BUILD
// TODO: What about itt_sync_obj??
KMP_FSYNC_SPIN_PREPARE( spin );
@@ -2409,5 +2437,3 @@ __kmp_tasking_barrier( kmp_team_t *team, kmp_info_t *thread, int gtid )
#endif /* USE_ITT_BUILD */
}
-#endif // OMP_30_ENABLED
-
diff --git a/openmp/runtime/src/kmp_taskq.c b/openmp/runtime/src/kmp_taskq.c
index 79ba3f3e72a..3a276b55ad5 100644
--- a/openmp/runtime/src/kmp_taskq.c
+++ b/openmp/runtime/src/kmp_taskq.c
@@ -1,7 +1,7 @@
/*
* kmp_taskq.c -- TASKQ support for OpenMP.
- * $Revision: 42582 $
- * $Date: 2013-08-09 06:30:22 -0500 (Fri, 09 Aug 2013) $
+ * $Revision: 43389 $
+ * $Date: 2014-08-11 10:54:01 -0500 (Mon, 11 Aug 2014) $
*/
@@ -33,23 +33,6 @@
#define THREAD_ALLOC_FOR_TASKQ
-static void
-__kmp_static_delay( int arg )
-{
-/* Work around weird code-gen bug that causes assert to trip */
-#if KMP_ARCH_X86_64 && KMP_OS_LINUX
- KMP_ASSERT( arg != 0 );
-#else
- KMP_ASSERT( arg >= 0 );
-#endif
-}
-
-static void
-__kmp_static_yield( int arg )
-{
- __kmp_yield( arg );
-}
-
static int
in_parallel_context( kmp_team_t *team )
{
@@ -790,7 +773,7 @@ __kmp_dequeue_task (kmp_int32 global_tid, kmpc_task_queue_t *queue, int in_paral
* 1. Walk up the task queue tree from the current queue's parent and look
* on the way up (for loop, below).
* 2. Do a depth-first search back down the tree from the root and
- * look (find_task_in_descandent_queue()).
+ * look (find_task_in_descendant_queue()).
*
* Here are the rules for deciding which task to take from a queue
* (__kmp_find_task_in_queue ()):
@@ -1608,7 +1591,6 @@ __kmpc_end_taskq(ident_t *loc, kmp_int32 global_tid, kmpc_thunk_t *taskq_thunk)
&& (! __kmp_taskq_has_any_children(queue) )
&& (! (queue->tq_flags & TQF_ALL_TASKS_QUEUED) )
) {
- __kmp_static_delay( 1 );
KMP_YIELD_WHEN( TRUE, spins );
}
diff --git a/openmp/runtime/src/kmp_threadprivate.c b/openmp/runtime/src/kmp_threadprivate.c
index 6ab79690eb5..4bf2701f245 100644
--- a/openmp/runtime/src/kmp_threadprivate.c
+++ b/openmp/runtime/src/kmp_threadprivate.c
@@ -1,7 +1,7 @@
/*
* kmp_threadprivate.c -- OpenMP threadprivate support library
- * $Revision: 42618 $
- * $Date: 2013-08-27 09:15:45 -0500 (Tue, 27 Aug 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_utility.c b/openmp/runtime/src/kmp_utility.c
index faf3916b2d1..180fceaeba1 100644
--- a/openmp/runtime/src/kmp_utility.c
+++ b/openmp/runtime/src/kmp_utility.c
@@ -1,7 +1,7 @@
/*
* kmp_utility.c -- Utility routines for the OpenMP support library.
- * $Revision: 42588 $
- * $Date: 2013-08-13 01:26:00 -0500 (Tue, 13 Aug 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_version.c b/openmp/runtime/src/kmp_version.c
index b836c39d192..77a24e8aa00 100644
--- a/openmp/runtime/src/kmp_version.c
+++ b/openmp/runtime/src/kmp_version.c
@@ -1,7 +1,7 @@
/*
* kmp_version.c
- * $Revision: 42806 $
- * $Date: 2013-11-05 16:16:45 -0600 (Tue, 05 Nov 2013) $
+ * $Revision: 43435 $
+ * $Date: 2014-09-04 15:16:08 -0500 (Thu, 04 Sep 2014) $
*/
@@ -20,7 +20,7 @@
#include "kmp_version.h"
// Replace with snapshot date YYYYMMDD for promotion build.
-#define KMP_VERSION_BUILD 00000000
+#define KMP_VERSION_BUILD 20140926
// Helper macros to convert value of macro to string literal.
#define _stringer( x ) #x
@@ -46,6 +46,8 @@
#define KMP_COMPILER "Intel C++ Compiler 14.0"
#elif __INTEL_COMPILER == 1410
#define KMP_COMPILER "Intel C++ Compiler 14.1"
+ #elif __INTEL_COMPILER == 1500
+ #define KMP_COMPILER "Intel C++ Compiler 15.0"
#elif __INTEL_COMPILER == 9999
#define KMP_COMPILER "Intel C++ Compiler mainline"
#endif
@@ -54,7 +56,7 @@
#elif KMP_COMPILER_GCC
#define KMP_COMPILER "GCC " stringer( __GNUC__ ) "." stringer( __GNUC_MINOR__ )
#elif KMP_COMPILER_MSVC
- #define KMP_COMPILER "MSVC " stringer( __MSC_FULL_VER )
+ #define KMP_COMPILER "MSVC " stringer( _MSC_FULL_VER )
#endif
#ifndef KMP_COMPILER
#warning "Unknown compiler"
@@ -77,7 +79,7 @@
// Finally, define strings.
#define KMP_LIBRARY KMP_LIB_TYPE " library (" KMP_LINK_TYPE ")"
-#define KMP_COPYRIGHT "Copyright (C) 1997-2013, Intel Corporation. All Rights Reserved."
+#define KMP_COPYRIGHT ""
int const __kmp_version_major = KMP_VERSION_MAJOR;
int const __kmp_version_minor = KMP_VERSION_MINOR;
@@ -85,10 +87,8 @@ int const __kmp_version_build = KMP_VERSION_BUILD;
int const __kmp_openmp_version =
#if OMP_40_ENABLED
201307;
- #elif OMP_30_ENABLED
- 201107;
#else
- 200505;
+ 201107;
#endif
/* Do NOT change the format of this string! Intel(R) Thread Profiler checks for a
@@ -128,7 +128,6 @@ __kmp_print_version_1( void )
kmp_str_buf_t buffer;
__kmp_str_buf_init( & buffer );
// Print version strings skipping initial magic.
- __kmp_str_buf_print( & buffer, "%s\n", & __kmp_version_copyright[ KMP_VERSION_MAGIC_LEN ] );
__kmp_str_buf_print( & buffer, "%s\n", & __kmp_version_lib_ver[ KMP_VERSION_MAGIC_LEN ] );
__kmp_str_buf_print( & buffer, "%s\n", & __kmp_version_lib_type[ KMP_VERSION_MAGIC_LEN ] );
__kmp_str_buf_print( & buffer, "%s\n", & __kmp_version_link_type[ KMP_VERSION_MAGIC_LEN ] );
@@ -164,8 +163,6 @@ __kmp_print_version_1( void )
); // __kmp_str_buf_print
}; // for i
__kmp_str_buf_print( & buffer, "%s\n", & __kmp_version_lock[ KMP_VERSION_MAGIC_LEN ] );
- __kmp_str_buf_print( & buffer, "%s\n", & __kmp_version_perf_v19[ KMP_VERSION_MAGIC_LEN ] );
- __kmp_str_buf_print( & buffer, "%s\n", & __kmp_version_perf_v106[ KMP_VERSION_MAGIC_LEN ] );
#endif
__kmp_str_buf_print(
& buffer,
diff --git a/openmp/runtime/src/kmp_version.h b/openmp/runtime/src/kmp_version.h
index 0bd2c4235bd..76e1e631b67 100644
--- a/openmp/runtime/src/kmp_version.h
+++ b/openmp/runtime/src/kmp_version.h
@@ -1,7 +1,7 @@
/*
* kmp_version.h -- version number for this release
- * $Revision: 42181 $
- * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+ * $Revision: 42982 $
+ * $Date: 2014-02-12 10:11:02 -0600 (Wed, 12 Feb 2014) $
*/
@@ -55,8 +55,6 @@ extern char const __kmp_version_alt_comp[];
extern char const __kmp_version_omp_api[];
// ??? extern char const __kmp_version_debug[];
extern char const __kmp_version_lock[];
-extern char const __kmp_version_perf_v19[];
-extern char const __kmp_version_perf_v106[];
extern char const __kmp_version_nested_stats_reporting[];
extern char const __kmp_version_ftnstdcall[];
extern char const __kmp_version_ftncdecl[];
diff --git a/openmp/runtime/src/kmp_wait_release.cpp b/openmp/runtime/src/kmp_wait_release.cpp
new file mode 100644
index 00000000000..c3e228f3a61
--- /dev/null
+++ b/openmp/runtime/src/kmp_wait_release.cpp
@@ -0,0 +1,52 @@
+/*
+ * kmp_wait_release.cpp -- Wait/Release implementation
+ * $Revision: 43417 $
+ * $Date: 2014-08-26 14:06:38 -0500 (Tue, 26 Aug 2014) $
+ */
+
+
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.txt for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "kmp_wait_release.h"
+
+void __kmp_wait_32(kmp_info_t *this_thr, kmp_flag_32 *flag, int final_spin
+ USE_ITT_BUILD_ARG(void * itt_sync_obj) )
+{
+ __kmp_wait_template(this_thr, flag, final_spin
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+}
+
+void __kmp_wait_64(kmp_info_t *this_thr, kmp_flag_64 *flag, int final_spin
+ USE_ITT_BUILD_ARG(void * itt_sync_obj) )
+{
+ __kmp_wait_template(this_thr, flag, final_spin
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+}
+
+void __kmp_wait_oncore(kmp_info_t *this_thr, kmp_flag_oncore *flag, int final_spin
+ USE_ITT_BUILD_ARG(void * itt_sync_obj) )
+{
+ __kmp_wait_template(this_thr, flag, final_spin
+ USE_ITT_BUILD_ARG(itt_sync_obj) );
+}
+
+
+
+void __kmp_release_32(kmp_flag_32 *flag) {
+ __kmp_release_template(flag);
+}
+
+void __kmp_release_64(kmp_flag_64 *flag) {
+ __kmp_release_template(flag);
+}
+
+void __kmp_release_oncore(kmp_flag_oncore *flag) {
+ __kmp_release_template(flag);
+}
diff --git a/openmp/runtime/src/kmp_wait_release.h b/openmp/runtime/src/kmp_wait_release.h
new file mode 100644
index 00000000000..599dcf0d772
--- /dev/null
+++ b/openmp/runtime/src/kmp_wait_release.h
@@ -0,0 +1,496 @@
+/*
+ * kmp_wait_release.h -- Wait/Release implementation
+ * $Revision: 43417 $
+ * $Date: 2014-08-26 14:06:38 -0500 (Tue, 26 Aug 2014) $
+ */
+
+
+//===----------------------------------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.txt for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+#ifndef KMP_WAIT_RELEASE_H
+#define KMP_WAIT_RELEASE_H
+
+#include "kmp.h"
+#include "kmp_itt.h"
+
+/*!
+@defgroup WAIT_RELEASE Wait/Release operations
+
+The definitions and functions here implement the lowest level thread
+synchronizations of suspending a thread and awaking it. They are used
+to build higher level operations such as barriers and fork/join.
+*/
+
+/*!
+@ingroup WAIT_RELEASE
+@{
+*/
+
+/*!
+ * The flag_type describes the storage used for the flag.
+ */
+enum flag_type {
+ flag32, /**< 32 bit flags */
+ flag64, /**< 64 bit flags */
+ flag_oncore /**< special 64-bit flag for on-core barrier (hierarchical) */
+};
+
+/*!
+ * Base class for wait/release volatile flag
+ */
+template <typename P>
+class kmp_flag {
+ volatile P * loc; /**< Pointer to the flag storage that is modified by another thread */
+ flag_type t; /**< "Type" of the flag in loc */
+ public:
+ typedef P flag_t;
+ kmp_flag(volatile P *p, flag_type ft) : loc(p), t(ft) {}
+ /*!
+ * @result the pointer to the actual flag
+ */
+ volatile P * get() { return loc; }
+ /*!
+ * @result the flag_type
+ */
+ flag_type get_type() { return t; }
+ // Derived classes must provide the following:
+ /*
+ kmp_info_t * get_waiter(kmp_uint32 i);
+ kmp_uint32 get_num_waiters();
+ bool done_check();
+ bool done_check_val(P old_loc);
+ bool notdone_check();
+ P internal_release();
+ P set_sleeping();
+ P unset_sleeping();
+ bool is_sleeping();
+ bool is_sleeping_val(P old_loc);
+ */
+};
+
+/* Spin wait loop that first does pause, then yield, then sleep. A thread that calls __kmp_wait_*
+ must make certain that another thread calls __kmp_release to wake it back up to prevent deadlocks! */
+template <class C>
+static inline void __kmp_wait_template(kmp_info_t *this_thr, C *flag, int final_spin
+ USE_ITT_BUILD_ARG(void * itt_sync_obj) )
+{
+ // NOTE: We may not belong to a team at this point.
+ volatile typename C::flag_t *spin = flag->get();
+ kmp_uint32 spins;
+ kmp_uint32 hibernate;
+ int th_gtid;
+ int tasks_completed = FALSE;
+
+ KMP_FSYNC_SPIN_INIT(spin, NULL);
+ if (flag->done_check()) {
+ KMP_FSYNC_SPIN_ACQUIRED(spin);
+ return;
+ }
+ th_gtid = this_thr->th.th_info.ds.ds_gtid;
+ KA_TRACE(20, ("__kmp_wait_sleep: T#%d waiting for flag(%p)\n", th_gtid, flag));
+
+ // Setup for waiting
+ KMP_INIT_YIELD(spins);
+
+ if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) {
+ // The worker threads cannot rely on the team struct existing at this point.
+ // Use the bt values cached in the thread struct instead.
+#ifdef KMP_ADJUST_BLOCKTIME
+ if (__kmp_zero_bt && !this_thr->th.th_team_bt_set)
+ // Force immediate suspend if not set by user and more threads than available procs
+ hibernate = 0;
+ else
+ hibernate = this_thr->th.th_team_bt_intervals;
+#else
+ hibernate = this_thr->th.th_team_bt_intervals;
+#endif /* KMP_ADJUST_BLOCKTIME */
+
+ /* If the blocktime is nonzero, we want to make sure that we spin wait for the entirety
+ of the specified #intervals, plus up to one interval more. This increment make
+ certain that this thread doesn't go to sleep too soon. */
+ if (hibernate != 0)
+ hibernate++;
+
+ // Add in the current time value.
+ hibernate += TCR_4(__kmp_global.g.g_time.dt.t_value);
+ KF_TRACE(20, ("__kmp_wait_sleep: T#%d now=%d, hibernate=%d, intervals=%d\n",
+ th_gtid, __kmp_global.g.g_time.dt.t_value, hibernate,
+ hibernate - __kmp_global.g.g_time.dt.t_value));
+ }
+ KMP_MB();
+
+ // Main wait spin loop
+ while (flag->notdone_check()) {
+ int in_pool;
+
+ /* If the task team is NULL, it means one of things:
+ 1) A newly-created thread is first being released by __kmp_fork_barrier(), and
+ its task team has not been set up yet.
+ 2) All tasks have been executed to completion, this thread has decremented the task
+ team's ref ct and possibly deallocated it, and should no longer reference it.
+ 3) Tasking is off for this region. This could be because we are in a serialized region
+ (perhaps the outer one), or else tasking was manually disabled (KMP_TASKING=0). */
+ kmp_task_team_t * task_team = NULL;
+ if (__kmp_tasking_mode != tskm_immediate_exec) {
+ task_team = this_thr->th.th_task_team;
+ if (task_team != NULL) {
+ if (!TCR_SYNC_4(task_team->tt.tt_active)) {
+ KMP_DEBUG_ASSERT(!KMP_MASTER_TID(this_thr->th.th_info.ds.ds_tid));
+ __kmp_unref_task_team(task_team, this_thr);
+ } else if (KMP_TASKING_ENABLED(task_team, this_thr->th.th_task_state)) {
+ flag->execute_tasks(this_thr, th_gtid, final_spin, &tasks_completed
+ USE_ITT_BUILD_ARG(itt_sync_obj), 0);
+ }
+ } // if
+ } // if
+
+ KMP_FSYNC_SPIN_PREPARE(spin);
+ if (TCR_4(__kmp_global.g.g_done)) {
+ if (__kmp_global.g.g_abort)
+ __kmp_abort_thread();
+ break;
+ }
+
+ // If we are oversubscribed, or have waited a bit (and KMP_LIBRARY=throughput), then yield
+ KMP_YIELD(TCR_4(__kmp_nth) > __kmp_avail_proc);
+ // TODO: Should it be number of cores instead of thread contexts? Like:
+ // KMP_YIELD(TCR_4(__kmp_nth) > __kmp_ncores);
+ // Need performance improvement data to make the change...
+ KMP_YIELD_SPIN(spins);
+
+ // Check if this thread was transferred from a team
+ // to the thread pool (or vice-versa) while spinning.
+ in_pool = !!TCR_4(this_thr->th.th_in_pool);
+ if (in_pool != !!this_thr->th.th_active_in_pool) {
+ if (in_pool) { // Recently transferred from team to pool
+ KMP_TEST_THEN_INC32((kmp_int32 *)&__kmp_thread_pool_active_nth);
+ this_thr->th.th_active_in_pool = TRUE;
+ /* Here, we cannot assert that:
+ KMP_DEBUG_ASSERT(TCR_4(__kmp_thread_pool_active_nth) <= __kmp_thread_pool_nth);
+ __kmp_thread_pool_nth is inc/dec'd by the master thread while the fork/join
+ lock is held, whereas __kmp_thread_pool_active_nth is inc/dec'd asynchronously
+ by the workers. The two can get out of sync for brief periods of time. */
+ }
+ else { // Recently transferred from pool to team
+ KMP_TEST_THEN_DEC32((kmp_int32 *) &__kmp_thread_pool_active_nth);
+ KMP_DEBUG_ASSERT(TCR_4(__kmp_thread_pool_active_nth) >= 0);
+ this_thr->th.th_active_in_pool = FALSE;
+ }
+ }
+
+ // Don't suspend if KMP_BLOCKTIME is set to "infinite"
+ if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME)
+ continue;
+
+ // Don't suspend if there is a likelihood of new tasks being spawned.
+ if ((task_team != NULL) && TCR_4(task_team->tt.tt_found_tasks))
+ continue;
+
+ // If we have waited a bit more, fall asleep
+ if (TCR_4(__kmp_global.g.g_time.dt.t_value) < hibernate)
+ continue;
+
+ KF_TRACE(50, ("__kmp_wait_sleep: T#%d suspend time reached\n", th_gtid));
+
+ flag->suspend(th_gtid);
+
+ if (TCR_4(__kmp_global.g.g_done)) {
+ if (__kmp_global.g.g_abort)
+ __kmp_abort_thread();
+ break;
+ }
+ // TODO: If thread is done with work and times out, disband/free
+ }
+ KMP_FSYNC_SPIN_ACQUIRED(spin);
+}
+
+/* Release any threads specified as waiting on the flag by releasing the flag and resume the waiting thread
+ if indicated by the sleep bit(s). A thread that calls __kmp_wait_template must call this function to wake
+ up the potentially sleeping thread and prevent deadlocks! */
+template <class C>
+static inline void __kmp_release_template(C *flag)
+{
+#ifdef KMP_DEBUG
+ // FIX ME
+ kmp_info_t * wait_thr = flag->get_waiter(0);
+ int target_gtid = wait_thr->th.th_info.ds.ds_gtid;
+ int gtid = TCR_4(__kmp_init_gtid) ? __kmp_get_gtid() : -1;
+#endif
+ KF_TRACE(20, ("__kmp_release: T#%d releasing T#%d spin(%p)\n", gtid, target_gtid, flag->get()));
+ KMP_DEBUG_ASSERT(flag->get());
+ KMP_FSYNC_RELEASING(flag->get());
+
+ typename C::flag_t old_spin = flag->internal_release();
+
+ KF_TRACE(100, ("__kmp_release: T#%d old spin(%p)=%d, set new spin=%d\n",
+ gtid, flag->get(), old_spin, *(flag->get())));
+
+ if (__kmp_dflt_blocktime != KMP_MAX_BLOCKTIME) {
+ // Only need to check sleep stuff if infinite block time not set
+ if (flag->is_sleeping_val(old_spin)) {
+ for (unsigned int i=0; i<flag->get_num_waiters(); ++i) {
+ kmp_info_t * waiter = flag->get_waiter(i);
+ int wait_gtid = waiter->th.th_info.ds.ds_gtid;
+ // Wake up thread if needed
+ KF_TRACE(50, ("__kmp_release: T#%d waking up thread T#%d since sleep spin(%p) set\n",
+ gtid, wait_gtid, flag->get()));
+ flag->resume(wait_gtid);
+ }
+ } else {
+ KF_TRACE(50, ("__kmp_release: T#%d don't wake up thread T#%d since sleep spin(%p) not set\n",
+ gtid, target_gtid, flag->get()));
+ }
+ }
+}
+
+template <typename FlagType>
+struct flag_traits {};
+
+template <>
+struct flag_traits<kmp_uint32> {
+ typedef kmp_uint32 flag_t;
+ static const flag_type t = flag32;
+ static inline flag_t tcr(flag_t f) { return TCR_4(f); }
+ static inline flag_t test_then_add4(volatile flag_t *f) { return KMP_TEST_THEN_ADD4_32((volatile kmp_int32 *)f); }
+ static inline flag_t test_then_or(volatile flag_t *f, flag_t v) { return KMP_TEST_THEN_OR32((volatile kmp_int32 *)f, v); }
+ static inline flag_t test_then_and(volatile flag_t *f, flag_t v) { return KMP_TEST_THEN_AND32((volatile kmp_int32 *)f, v); }
+};
+
+template <>
+struct flag_traits<kmp_uint64> {
+ typedef kmp_uint64 flag_t;
+ static const flag_type t = flag64;
+ static inline flag_t tcr(flag_t f) { return TCR_8(f); }
+ static inline flag_t test_then_add4(volatile flag_t *f) { return KMP_TEST_THEN_ADD4_64((volatile kmp_int64 *)f); }
+ static inline flag_t test_then_or(volatile flag_t *f, flag_t v) { return KMP_TEST_THEN_OR64((volatile kmp_int64 *)f, v); }
+ static inline flag_t test_then_and(volatile flag_t *f, flag_t v) { return KMP_TEST_THEN_AND64((volatile kmp_int64 *)f, v); }
+};
+
+template <typename FlagType>
+class kmp_basic_flag : public kmp_flag<FlagType> {
+ typedef flag_traits<FlagType> traits_type;
+ FlagType checker; /**< Value to compare flag to to check if flag has been released. */
+ kmp_info_t * waiting_threads[1]; /**< Array of threads sleeping on this thread. */
+ kmp_uint32 num_waiting_threads; /**< Number of threads sleeping on this thread. */
+public:
+ kmp_basic_flag(volatile FlagType *p) : kmp_flag<FlagType>(p, traits_type::t), num_waiting_threads(0) {}
+ kmp_basic_flag(volatile FlagType *p, kmp_info_t *thr) : kmp_flag<FlagType>(p, traits_type::t), num_waiting_threads(1) {
+ waiting_threads[0] = thr;
+ }
+ kmp_basic_flag(volatile FlagType *p, FlagType c) : kmp_flag<FlagType>(p, traits_type::t), checker(c), num_waiting_threads(0) {}
+ /*!
+ * param i in index into waiting_threads
+ * @result the thread that is waiting at index i
+ */
+ kmp_info_t * get_waiter(kmp_uint32 i) {
+ KMP_DEBUG_ASSERT(i<num_waiting_threads);
+ return waiting_threads[i];
+ }
+ /*!
+ * @result num_waiting_threads
+ */
+ kmp_uint32 get_num_waiters() { return num_waiting_threads; }
+ /*!
+ * @param thr in the thread which is now waiting
+ *
+ * Insert a waiting thread at index 0.
+ */
+ void set_waiter(kmp_info_t *thr) {
+ waiting_threads[0] = thr;
+ num_waiting_threads = 1;
+ }
+ /*!
+ * @result true if the flag object has been released.
+ */
+ bool done_check() { return traits_type::tcr(*(this->get())) == checker; }
+ /*!
+ * @param old_loc in old value of flag
+ * @result true if the flag's old value indicates it was released.
+ */
+ bool done_check_val(FlagType old_loc) { return old_loc == checker; }
+ /*!
+ * @result true if the flag object is not yet released.
+ * Used in __kmp_wait_template like:
+ * @code
+ * while (flag.notdone_check()) { pause(); }
+ * @endcode
+ */
+ bool notdone_check() { return traits_type::tcr(*(this->get())) != checker; }
+ /*!
+ * @result Actual flag value before release was applied.
+ * Trigger all waiting threads to run by modifying flag to release state.
+ */
+ FlagType internal_release() {
+ return traits_type::test_then_add4((volatile FlagType *)this->get());
+ }
+ /*!
+ * @result Actual flag value before sleep bit(s) set.
+ * Notes that there is at least one thread sleeping on the flag by setting sleep bit(s).
+ */
+ FlagType set_sleeping() {
+ return traits_type::test_then_or((volatile FlagType *)this->get(), KMP_BARRIER_SLEEP_STATE);
+ }
+ /*!
+ * @result Actual flag value before sleep bit(s) cleared.
+ * Notes that there are no longer threads sleeping on the flag by clearing sleep bit(s).
+ */
+ FlagType unset_sleeping() {
+ return traits_type::test_then_and((volatile FlagType *)this->get(), ~KMP_BARRIER_SLEEP_STATE);
+ }
+ /*!
+ * @param old_loc in old value of flag
+ * Test whether there are threads sleeping on the flag's old value in old_loc.
+ */
+ bool is_sleeping_val(FlagType old_loc) { return old_loc & KMP_BARRIER_SLEEP_STATE; }
+ /*!
+ * Test whether there are threads sleeping on the flag.
+ */
+ bool is_sleeping() { return is_sleeping_val(*(this->get())); }
+};
+
+class kmp_flag_32 : public kmp_basic_flag<kmp_uint32> {
+public:
+ kmp_flag_32(volatile kmp_uint32 *p) : kmp_basic_flag<kmp_uint32>(p) {}
+ kmp_flag_32(volatile kmp_uint32 *p, kmp_info_t *thr) : kmp_basic_flag<kmp_uint32>(p, thr) {}
+ kmp_flag_32(volatile kmp_uint32 *p, kmp_uint32 c) : kmp_basic_flag<kmp_uint32>(p, c) {}
+ void suspend(int th_gtid) { __kmp_suspend_32(th_gtid, this); }
+ void resume(int th_gtid) { __kmp_resume_32(th_gtid, this); }
+ int execute_tasks(kmp_info_t *this_thr, kmp_int32 gtid, int final_spin, int *thread_finished
+ USE_ITT_BUILD_ARG(void * itt_sync_obj), kmp_int32 is_constrained) {
+ return __kmp_execute_tasks_32(this_thr, gtid, this, final_spin, thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj), is_constrained);
+ }
+ void wait(kmp_info_t *this_thr, int final_spin
+ USE_ITT_BUILD_ARG(void * itt_sync_obj)) {
+ __kmp_wait_template(this_thr, this, final_spin
+ USE_ITT_BUILD_ARG(itt_sync_obj));
+ }
+ void release() { __kmp_release_template(this); }
+};
+
+class kmp_flag_64 : public kmp_basic_flag<kmp_uint64> {
+public:
+ kmp_flag_64(volatile kmp_uint64 *p) : kmp_basic_flag<kmp_uint64>(p) {}
+ kmp_flag_64(volatile kmp_uint64 *p, kmp_info_t *thr) : kmp_basic_flag<kmp_uint64>(p, thr) {}
+ kmp_flag_64(volatile kmp_uint64 *p, kmp_uint64 c) : kmp_basic_flag<kmp_uint64>(p, c) {}
+ void suspend(int th_gtid) { __kmp_suspend_64(th_gtid, this); }
+ void resume(int th_gtid) { __kmp_resume_64(th_gtid, this); }
+ int execute_tasks(kmp_info_t *this_thr, kmp_int32 gtid, int final_spin, int *thread_finished
+ USE_ITT_BUILD_ARG(void * itt_sync_obj), kmp_int32 is_constrained) {
+ return __kmp_execute_tasks_64(this_thr, gtid, this, final_spin, thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj), is_constrained);
+ }
+ void wait(kmp_info_t *this_thr, int final_spin
+ USE_ITT_BUILD_ARG(void * itt_sync_obj)) {
+ __kmp_wait_template(this_thr, this, final_spin
+ USE_ITT_BUILD_ARG(itt_sync_obj));
+ }
+ void release() { __kmp_release_template(this); }
+};
+
+// Hierarchical 64-bit on-core barrier instantiation
+class kmp_flag_oncore : public kmp_flag<kmp_uint64> {
+ kmp_uint64 checker;
+ kmp_info_t * waiting_threads[1];
+ kmp_uint32 num_waiting_threads;
+ kmp_uint32 offset; /**< Portion of flag that is of interest for an operation. */
+ bool flag_switch; /**< Indicates a switch in flag location. */
+ enum barrier_type bt; /**< Barrier type. */
+ kmp_info_t * this_thr; /**< Thread that may be redirected to different flag location. */
+#if USE_ITT_BUILD
+ void *itt_sync_obj; /**< ITT object that must be passed to new flag location. */
+#endif
+ char& byteref(volatile kmp_uint64* loc, size_t offset) { return ((char *)loc)[offset]; }
+public:
+ kmp_flag_oncore(volatile kmp_uint64 *p)
+ : kmp_flag<kmp_uint64>(p, flag_oncore), num_waiting_threads(0), flag_switch(false) {}
+ kmp_flag_oncore(volatile kmp_uint64 *p, kmp_uint32 idx)
+ : kmp_flag<kmp_uint64>(p, flag_oncore), offset(idx), num_waiting_threads(0), flag_switch(false) {}
+ kmp_flag_oncore(volatile kmp_uint64 *p, kmp_uint64 c, kmp_uint32 idx, enum barrier_type bar_t,
+ kmp_info_t * thr
+#if USE_ITT_BUILD
+ , void *itt
+#endif
+ )
+ : kmp_flag<kmp_uint64>(p, flag_oncore), checker(c), offset(idx), bt(bar_t), this_thr(thr)
+#if USE_ITT_BUILD
+ , itt_sync_obj(itt)
+#endif
+ , num_waiting_threads(0), flag_switch(false) {}
+ kmp_info_t * get_waiter(kmp_uint32 i) {
+ KMP_DEBUG_ASSERT(i<num_waiting_threads);
+ return waiting_threads[i];
+ }
+ kmp_uint32 get_num_waiters() { return num_waiting_threads; }
+ void set_waiter(kmp_info_t *thr) {
+ waiting_threads[0] = thr;
+ num_waiting_threads = 1;
+ }
+ bool done_check_val(kmp_uint64 old_loc) { return byteref(&old_loc,offset) == checker; }
+ bool done_check() { return done_check_val(*get()); }
+ bool notdone_check() {
+ // Calculate flag_switch
+ if (this_thr->th.th_bar[bt].bb.wait_flag == KMP_BARRIER_SWITCH_TO_OWN_FLAG)
+ flag_switch = true;
+ if (byteref(get(),offset) != 1 && !flag_switch)
+ return true;
+ else if (flag_switch) {
+ this_thr->th.th_bar[bt].bb.wait_flag = KMP_BARRIER_SWITCHING;
+ kmp_flag_64 flag(&this_thr->th.th_bar[bt].bb.b_go, (kmp_uint64)KMP_BARRIER_STATE_BUMP);
+ __kmp_wait_64(this_thr, &flag, TRUE
+#if USE_ITT_BUILD
+ , itt_sync_obj
+#endif
+ );
+ }
+ return false;
+ }
+ kmp_uint64 internal_release() {
+ kmp_uint64 old_val;
+ if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME) {
+ old_val = *get();
+ byteref(get(),offset) = 1;
+ }
+ else {
+ kmp_uint64 mask=0;
+ byteref(&mask,offset) = 1;
+ old_val = KMP_TEST_THEN_OR64((volatile kmp_int64 *)get(), mask);
+ }
+ return old_val;
+ }
+ kmp_uint64 set_sleeping() {
+ return KMP_TEST_THEN_OR64((kmp_int64 volatile *)get(), KMP_BARRIER_SLEEP_STATE);
+ }
+ kmp_uint64 unset_sleeping() {
+ return KMP_TEST_THEN_AND64((kmp_int64 volatile *)get(), ~KMP_BARRIER_SLEEP_STATE);
+ }
+ bool is_sleeping_val(kmp_uint64 old_loc) { return old_loc & KMP_BARRIER_SLEEP_STATE; }
+ bool is_sleeping() { return is_sleeping_val(*get()); }
+ void wait(kmp_info_t *this_thr, int final_spin
+ USE_ITT_BUILD_ARG(void * itt_sync_obj)) {
+ __kmp_wait_template(this_thr, this, final_spin
+ USE_ITT_BUILD_ARG(itt_sync_obj));
+ }
+ void release() { __kmp_release_template(this); }
+ void suspend(int th_gtid) { __kmp_suspend_oncore(th_gtid, this); }
+ void resume(int th_gtid) { __kmp_resume_oncore(th_gtid, this); }
+ int execute_tasks(kmp_info_t *this_thr, kmp_int32 gtid, int final_spin, int *thread_finished
+ USE_ITT_BUILD_ARG(void * itt_sync_obj), kmp_int32 is_constrained) {
+ return __kmp_execute_tasks_oncore(this_thr, gtid, this, final_spin, thread_finished
+ USE_ITT_BUILD_ARG(itt_sync_obj), is_constrained);
+ }
+};
+
+/*!
+@}
+*/
+
+#endif // KMP_WAIT_RELEASE_H
diff --git a/openmp/runtime/src/kmp_wrapper_getpid.h b/openmp/runtime/src/kmp_wrapper_getpid.h
index 5cdc1699198..35e4d179f62 100644
--- a/openmp/runtime/src/kmp_wrapper_getpid.h
+++ b/openmp/runtime/src/kmp_wrapper_getpid.h
@@ -1,7 +1,7 @@
/*
* kmp_wrapper_getpid.h -- getpid() declaration.
- * $Revision: 42181 $
- * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/kmp_wrapper_malloc.h b/openmp/runtime/src/kmp_wrapper_malloc.h
index b2e3dbf9e90..b0564b9a3f7 100644
--- a/openmp/runtime/src/kmp_wrapper_malloc.h
+++ b/openmp/runtime/src/kmp_wrapper_malloc.h
@@ -1,8 +1,8 @@
/*
* kmp_wrapper_malloc.h -- Wrappers for memory allocation routines
* (malloc(), free(), and others).
- * $Revision: 42181 $
- * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+ * $Revision: 43084 $
+ * $Date: 2014-04-15 09:15:14 -0500 (Tue, 15 Apr 2014) $
*/
diff --git a/openmp/runtime/src/libiomp.rc.var b/openmp/runtime/src/libiomp.rc.var
index 619f99baf97..5e221b69622 100644
--- a/openmp/runtime/src/libiomp.rc.var
+++ b/openmp/runtime/src/libiomp.rc.var
@@ -1,6 +1,6 @@
// libiomp.rc.var
-// $Revision: 42219 $
-// $Date: 2013-03-29 13:36:05 -0500 (Fri, 29 Mar 2013) $
+// $Revision: 42994 $
+// $Date: 2014-03-04 02:22:15 -0600 (Tue, 04 Mar 2014) $
//
////===----------------------------------------------------------------------===//
@@ -41,8 +41,6 @@ VS_VERSION_INFO VERSIONINFO
// FileDescription and LegalCopyright should be short.
VALUE "FileDescription", "Intel(R) OpenMP* Runtime Library${{ our $MESSAGE_CATALOG; $MESSAGE_CATALOG ? " Message Catalog" : "" }}\0"
- VALUE "LegalCopyright", "Copyright (C) 1997-2013, Intel Corporation. All rights reserved.\0"
-
// Following values may be relatively long.
VALUE "CompanyName", "Intel Corporation\0"
// VALUE "LegalTrademarks", "\0" // Not used for now.
diff --git a/openmp/runtime/src/makefile.mk b/openmp/runtime/src/makefile.mk
index b4ed8e58067..553c2f8332e 100644
--- a/openmp/runtime/src/makefile.mk
+++ b/openmp/runtime/src/makefile.mk
@@ -1,6 +1,6 @@
# makefile.mk #
-# $Revision: 42820 $
-# $Date: 2013-11-13 16:53:44 -0600 (Wed, 13 Nov 2013) $
+# $Revision: 43473 $
+# $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
#
#//===----------------------------------------------------------------------===//
@@ -221,6 +221,18 @@ ifeq "$(filter gcc clang,$(c))" ""
endif
endif
+# On Linux and Windows Intel64 we need offload attribute for all Fortran entries
+# in order to support OpenMP function calls inside Device constructs
+ifeq "$(fort)" "ifort"
+ ifeq "$(os)_$(arch)" "lin_32e"
+ # TODO: change to -qoffload... when we stop supporting 14.0 compiler (-offload is deprecated)
+ fort-flags += -offload-attribute-target=mic
+ endif
+ ifeq "$(os)_$(arch)" "win_32e"
+ fort-flags += /Qoffload-attribute-target:mic
+ endif
+endif
+
ifeq "$(os)" "lrb"
c-flags += -mmic
cxx-flags += -mmic
@@ -361,6 +373,7 @@ ifeq "$(os)" "lin"
# to remove dependency on libgcc_s:
ifeq "$(c)" "gcc"
ld-flags-dll += -static-libgcc
+ # omp_os is non-empty only in the open-source code
ifneq "$(omp_os)" "freebsd"
ld-flags-extra += -Wl,-ldl
endif
@@ -417,11 +430,15 @@ ifeq "$(os)" "lrb"
ld-flags += -ldl
endif
endif
+ # include the c++ library for stats-gathering code
+ ifeq "$(stats)" "on"
+ ld-flags-extra += -Wl,-lstdc++
+ endif
endif
endif
ifeq "$(os)" "mac"
- ifeq "$(c)" "icc"
+ ifeq "$(ld)" "icc"
ld-flags += -no-intel-extensions
endif
ld-flags += -single_module
@@ -483,6 +500,13 @@ endif
cpp-flags += -D KMP_ADJUST_BLOCKTIME=1
cpp-flags += -D BUILD_PARALLEL_ORDERED
cpp-flags += -D KMP_ASM_INTRINS
+cpp-flags += -D KMP_USE_INTERNODE_ALIGNMENT=0
+# Linux and MIC compile with version symbols
+ifneq "$(filter lin lrb,$(os))" ""
+ifeq "$(filter ppc64,$(arch))" ""
+ cpp-flags += -D KMP_USE_VERSION_SYMBOLS
+endif
+endif
ifneq "$(os)" "lrb"
cpp-flags += -D USE_LOAD_BALANCE
endif
@@ -506,43 +530,52 @@ else # 5
cpp-flags += -D KMP_GOMP_COMPAT
endif
endif
-
+cpp-flags += -D KMP_NESTED_HOT_TEAMS
ifneq "$(filter 32 32e,$(arch))" ""
cpp-flags += -D KMP_USE_ADAPTIVE_LOCKS=1 -D KMP_DEBUG_ADAPTIVE_LOCKS=0
endif
+# is the std c++ library needed? (for stats-gathering, it is)
+std_cpp_lib=0
+ifneq "$(filter lin lrb,$(os))" ""
+ ifeq "$(stats)" "on"
+ cpp-flags += -D KMP_STATS_ENABLED=1
+ std_cpp_lib=1
+ else
+ cpp-flags += -D KMP_STATS_ENABLED=0
+ endif
+else # no mac or windows support for stats-gathering
+ ifeq "$(stats)" "on"
+ $(error Statistics-gathering functionality not available on $(os) platform)
+ endif
+ cpp-flags += -D KMP_STATS_ENABLED=0
+endif
+
# define compatibility with different OpenMP versions
have_omp_50=0
have_omp_41=0
have_omp_40=0
-have_omp_30=0
ifeq "$(OMP_VERSION)" "50"
have_omp_50=1
have_omp_41=1
have_omp_40=1
- have_omp_30=1
endif
ifeq "$(OMP_VERSION)" "41"
have_omp_50=0
have_omp_41=1
have_omp_40=1
- have_omp_30=1
endif
ifeq "$(OMP_VERSION)" "40"
have_omp_50=0
have_omp_41=0
have_omp_40=1
- have_omp_30=1
endif
ifeq "$(OMP_VERSION)" "30"
have_omp_50=0
have_omp_41=0
have_omp_40=0
- have_omp_30=1
endif
-cpp-flags += -D OMP_50_ENABLED=$(have_omp_50) -D OMP_41_ENABLED=$(have_omp_41)
-cpp-flags += -D OMP_40_ENABLED=$(have_omp_40) -D OMP_30_ENABLED=$(have_omp_30)
-
+cpp-flags += -D OMP_50_ENABLED=$(have_omp_50) -D OMP_41_ENABLED=$(have_omp_41) -D OMP_40_ENABLED=$(have_omp_40)
# Using ittnotify is enabled by default.
USE_ITT_NOTIFY = 1
@@ -598,8 +631,8 @@ ifneq "$(os)" "win"
z_Linux_asm$(obj) : \
cpp-flags += -D KMP_ARCH_PPC64
else
- z_Linux_asm$(obj) : \
- cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e,$(arch)),_64)
+ z_Linux_asm$(obj) : \
+ cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e,$(arch)),_64)
endif
endif
@@ -699,6 +732,8 @@ else # norm or prof
kmp_i18n \
kmp_io \
kmp_runtime \
+ kmp_wait_release \
+ kmp_barrier \
kmp_settings \
kmp_str \
kmp_tasking \
@@ -715,6 +750,10 @@ ifeq "$(OMP_VERSION)" "40"
lib_cpp_items += kmp_taskdeps
lib_cpp_items += kmp_cancel
endif
+ifeq "$(stats)" "on"
+ lib_cpp_items += kmp_stats
+ lib_cpp_items += kmp_stats_timing
+endif
# OS-specific files.
ifeq "$(os)" "win"
@@ -1272,8 +1311,20 @@ ifneq "$(os)" "lrb"
# On Linux* OS and OS X* the test is good enough because GNU compiler knows nothing
# about libirc and Intel compiler private lib directories, but we will grep verbose linker
# output just in case.
- tt-c = cc
- ifeq "$(os)" "lin" # GCC on OS X* does not recognize -pthread.
+ # Using clang on OS X* because of discontinued support of GNU compilers.
+ ifeq "$(os)" "mac"
+ ifeq "$(std_cpp_lib)" "1"
+ tt-c = clang++
+ else
+ tt-c = clang
+ endif
+ else # lin
+ ifeq "$(std_cpp_lib)" "1"
+ tt-c = g++
+ else
+ tt-c = gcc
+ endif
+ # GCC on OS X* does not recognize -pthread.
tt-c-flags += -pthread
endif
tt-c-flags += -o $(tt-exe-file)
@@ -1416,6 +1467,10 @@ ifneq "$(filter %-dyna win-%,$(os)-$(LINK_TYPE))" ""
td_exp += libc.so.6
td_exp += ld64.so.1
endif
+ ifeq "$(std_cpp_lib)" "1"
+ td_exp += libstdc++.so.6
+ endif
+
td_exp += libdl.so.2
td_exp += libgcc_s.so.1
ifeq "$(filter 32 32e 64 ppc64,$(arch))" ""
@@ -1428,6 +1483,9 @@ ifneq "$(filter %-dyna win-%,$(os)-$(LINK_TYPE))" ""
endif
ifeq "$(os)" "lrb"
ifeq "$(MIC_OS)" "lin"
+ ifeq "$(std_cpp_lib)" "1"
+ td_exp += libstdc++.so.6
+ endif
ifeq "$(MIC_ARCH)" "knf"
td_exp += "ld-linux-l1om.so.2"
td_exp += libc.so.6
@@ -1459,8 +1517,9 @@ ifneq "$(filter %-dyna win-%,$(os)-$(LINK_TYPE))" ""
td_exp += uuid
endif
endif
+
ifeq "$(omp_os)" "freebsd"
- td_exp =
+ td_exp =
td_exp += libc.so.7
td_exp += libthr.so.3
td_exp += libunwind.so.5
diff --git a/openmp/runtime/src/rules.mk b/openmp/runtime/src/rules.mk
index 3d407356fdf..09f30ba26b9 100644
--- a/openmp/runtime/src/rules.mk
+++ b/openmp/runtime/src/rules.mk
@@ -1,6 +1,6 @@
# rules.mk #
-# $Revision: 42423 $
-# $Date: 2013-06-07 09:25:21 -0500 (Fri, 07 Jun 2013) $
+# $Revision: 42951 $
+# $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
#
#//===----------------------------------------------------------------------===//
diff --git a/openmp/runtime/src/test-touch.c b/openmp/runtime/src/test-touch.c
index 3470f7ca6f9..6ce529ae23a 100644
--- a/openmp/runtime/src/test-touch.c
+++ b/openmp/runtime/src/test-touch.c
@@ -11,9 +11,15 @@
//===----------------------------------------------------------------------===//
+#ifdef __cplusplus
+extern "C" {
+#endif
extern double omp_get_wtime();
extern int omp_get_num_threads();
extern int omp_get_max_threads();
+#ifdef __cplusplus
+}
+#endif
int main() {
omp_get_wtime();
diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h
index a9988db002f..d05d8b73c36 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h
+++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify.h
@@ -8,7 +8,6 @@
//
//===----------------------------------------------------------------------===//
-
#ifndef _ITTNOTIFY_H_
#define _ITTNOTIFY_H_
@@ -141,7 +140,7 @@ The same ID may not be reused for different instances, unless a previous
# if ITT_PLATFORM==ITT_PLATFORM_WIN
# define CDECL __cdecl
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# if defined _M_IX86 || defined __i386__
+# if defined _M_IX86 || defined __i386__
# define CDECL __attribute__ ((cdecl))
# else /* _M_IX86 || __i386__ */
# define CDECL /* actual only on x86 platform */
@@ -154,7 +153,7 @@ The same ID may not be reused for different instances, unless a previous
# define STDCALL __stdcall
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
# if defined _M_IX86 || defined __i386__
-# define STDCALL __attribute__ ((stdcall))
+# define STDCALL __attribute__ ((stdcall))
# else /* _M_IX86 || __i386__ */
# define STDCALL /* supported only on x86 platform */
# endif /* _M_IX86 || __i386__ */
@@ -416,19 +415,19 @@ ITT_STUBV(ITTAPI, void, thread_ignore, (void))
*********************************************************************/
/** @{ */
/**
- * @hideinitializer
+ * @hideinitializer
* @brief possible value for suppression mask
*/
#define __itt_suppress_all_errors 0x7fffffff
/**
- * @hideinitializer
+ * @hideinitializer
* @brief possible value for suppression mask (suppresses errors from threading analysis)
*/
#define __itt_suppress_threading_errors 0x000000ff
/**
- * @hideinitializer
+ * @hideinitializer
* @brief possible value for suppression mask (suppresses errors from memory analysis)
*/
#define __itt_suppress_memory_errors 0x0000ff00
@@ -454,7 +453,7 @@ ITT_STUBV(ITTAPI, void, suppress_push, (unsigned int mask))
/** @endcond */
/**
- * @brief Undo the effects of the matching call to __itt_suppress_push
+ * @brief Undo the effects of the matching call to __itt_suppress_push
*/
void ITTAPI __itt_suppress_pop(void);
@@ -1584,13 +1583,13 @@ ITT_STUBV(ITTAPI, void, heap_record_memory_growth_end, (void))
* @brief Specify the type of heap detection/reporting to modify.
*/
/**
- * @hideinitializer
+ * @hideinitializer
* @brief Report on memory leaks.
*/
#define __itt_heap_leaks 0x00000001
/**
- * @hideinitializer
+ * @hideinitializer
* @brief Report on memory growth.
*/
#define __itt_heap_growth 0x00000002
@@ -1667,7 +1666,7 @@ typedef struct ___itt_domain
* @ingroup domains
* @brief Create a domain.
* Create domain using some domain name: the URI naming style is recommended.
- * Because the set of domains is expected to be static over the application's
+ * Because the set of domains is expected to be static over the application's
* execution time, there is no mechanism to destroy a domain.
* Any domain can be accessed by any thread in the process, regardless of
* which thread created the domain. This call is thread-safe.
@@ -1802,7 +1801,7 @@ ITT_STUBV(ITTAPI, void, id_create, (const __itt_domain *domain, __itt_id id))
* @brief Destroy an instance of identifier.
* This ends the lifetime of the current instance of the given ID value in the trace.
* Any relationships that are established after this lifetime ends are invalid.
- * This call must be performed before the given ID value can be reused for a different
+ * This call must be performed before the given ID value can be reused for a different
* named entity instance.
* @param[in] domain The domain controlling the execution of this call.
* @param[in] id The ID to destroy.
@@ -1926,10 +1925,10 @@ static const __itt_timestamp __itt_timestamp_none = (__itt_timestamp)-1LL;
/**
* @ingroup timestamps
- * @brief Return timestamp corresponding to current moment.
- * This returns the timestamp in format that is most relevant for the current
- * host or platform. Do not rely that it's RDTSC value. It is possible
- * to compare __itt_timestamp values with "<" operator.
+ * @brief Return timestamp corresponding to the current moment.
+ * This returns the timestamp in the format that is the most relevant for the current
+ * host or platform (RDTSC, QPC, and others). You can use the "<" operator to
+ * compare __itt_timestamp values.
*/
__itt_timestamp ITTAPI __itt_get_timestamp(void);
@@ -2053,13 +2052,13 @@ void ITTAPI __itt_frame_submit_v3(const __itt_domain *domain, __itt_id *id,
/** @cond exclude_from_documentation */
#ifndef INTEL_NO_MACRO_BODY
#ifndef INTEL_NO_ITTNOTIFY_API
-ITT_STUBV(ITTAPI, void, frame_begin_v3, (const __itt_domain *domain, __itt_id *id))
-ITT_STUBV(ITTAPI, void, frame_end_v3, (const __itt_domain *domain, __itt_id *id))
+ITT_STUBV(ITTAPI, void, frame_begin_v3, (const __itt_domain *domain, __itt_id *id))
+ITT_STUBV(ITTAPI, void, frame_end_v3, (const __itt_domain *domain, __itt_id *id))
ITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end))
-#define __itt_frame_begin_v3(d,x) ITTNOTIFY_VOID_D1(frame_begin_v3,d,x)
-#define __itt_frame_begin_v3_ptr ITTNOTIFY_NAME(frame_begin_v3)
-#define __itt_frame_end_v3(d,x) ITTNOTIFY_VOID_D1(frame_end_v3,d,x)
-#define __itt_frame_end_v3_ptr ITTNOTIFY_NAME(frame_end_v3)
+#define __itt_frame_begin_v3(d,x) ITTNOTIFY_VOID_D1(frame_begin_v3,d,x)
+#define __itt_frame_begin_v3_ptr ITTNOTIFY_NAME(frame_begin_v3)
+#define __itt_frame_end_v3(d,x) ITTNOTIFY_VOID_D1(frame_end_v3,d,x)
+#define __itt_frame_end_v3_ptr ITTNOTIFY_NAME(frame_end_v3)
#define __itt_frame_submit_v3(d,x,b,e) ITTNOTIFY_VOID_D3(frame_submit_v3,d,x,b,e)
#define __itt_frame_submit_v3_ptr ITTNOTIFY_NAME(frame_submit_v3)
#else /* INTEL_NO_ITTNOTIFY_API */
@@ -2361,7 +2360,7 @@ ITT_STUBV(ITTAPI, void, metadata_add, (const __itt_domain *domain, __itt_id id,
* @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task
* @param[in] key The name of the metadata
* @param[in] data The metadata itself
- * @param[in] length The number of characters in the string, or -1 if the length is unknown but the string is null-terminated
+ * @param[in] length The number of characters in the string, or -1 if the length is unknown but the string is null-terminated
*/
#if ITT_PLATFORM==ITT_PLATFORM_WIN
void ITTAPI __itt_metadata_str_addA(const __itt_domain *domain, __itt_id id, __itt_string_handle *key, const char *data, size_t length);
@@ -2397,9 +2396,9 @@ ITT_STUBV(ITTAPI, void, metadata_str_add, (const __itt_domain *domain, __itt_id
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#else /* INTEL_NO_ITTNOTIFY_API */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-#define __itt_metadata_str_addA(d,x,y,z,a)
+#define __itt_metadata_str_addA(d,x,y,z,a)
#define __itt_metadata_str_addA_ptr 0
-#define __itt_metadata_str_addW(d,x,y,z,a)
+#define __itt_metadata_str_addW(d,x,y,z,a)
#define __itt_metadata_str_addW_ptr 0
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#define __itt_metadata_str_add(d,x,y,z,a)
@@ -2423,7 +2422,7 @@ ITT_STUBV(ITTAPI, void, metadata_str_add, (const __itt_domain *domain, __itt_id
* @param[in] scope The scope of the instance to which the metadata is to be added
* @param[in] id The identifier of the instance to which the metadata is to be added, or __itt_null to add to the current task
-
+
* @param[in] key The name of the metadata
* @param[in] type The type of the metadata
* @param[in] count The number of elements of the given type. If count == 0, no metadata will be added.
@@ -2456,7 +2455,7 @@ ITT_STUBV(ITTAPI, void, metadata_add_with_scope, (const __itt_domain *domain, __
* @param[in] key The name of the metadata
* @param[in] data The metadata itself
- * @param[in] length The number of characters in the string, or -1 if the length is unknown but the string is null-terminated
+ * @param[in] length The number of characters in the string, or -1 if the length is unknown but the string is null-terminated
*/
#if ITT_PLATFORM==ITT_PLATFORM_WIN
void ITTAPI __itt_metadata_str_add_with_scopeA(const __itt_domain *domain, __itt_scope scope, __itt_string_handle *key, const char *data, size_t length);
@@ -2492,9 +2491,9 @@ ITT_STUBV(ITTAPI, void, metadata_str_add_with_scope, (const __itt_domain *domain
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#else /* INTEL_NO_ITTNOTIFY_API */
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-#define __itt_metadata_str_add_with_scopeA(d,x,y,z,a)
+#define __itt_metadata_str_add_with_scopeA(d,x,y,z,a)
#define __itt_metadata_str_add_with_scopeA_ptr 0
-#define __itt_metadata_str_add_with_scopeW(d,x,y,z,a)
+#define __itt_metadata_str_add_with_scopeW(d,x,y,z,a)
#define __itt_metadata_str_add_with_scopeW_ptr 0
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
#define __itt_metadata_str_add_with_scope(d,x,y,z,a)
@@ -3080,9 +3079,9 @@ ITT_STUB(LIBITTAPI, int, event_end, (__itt_event event))
/**
* @enum __itt_av_data_type
- * @brief Defines types of arrays data (for C/C++ intrinsic types)
+ * @brief Defines types of arrays data (for C/C++ intrinsic types)
*/
-typedef enum
+typedef enum
{
__itt_e_first = 0,
__itt_e_char = 0, /* 1-byte integer */
@@ -3102,8 +3101,8 @@ typedef enum
* @brief Save an array data to a file.
* Output format is defined by the file extension. The csv and bmp formats are supported (bmp - for 2-dimensional array only).
* @param[in] data - pointer to the array data
- * @param[in] rank - the rank of the array
- * @param[in] dimensions - pointer to an array of integers, which specifies the array dimensions.
+ * @param[in] rank - the rank of the array
+ * @param[in] dimensions - pointer to an array of integers, which specifies the array dimensions.
* The size of dimensions must be equal to the rank
* @param[in] type - the type of the array, specified as one of the __itt_av_data_type values (for intrinsic types)
* @param[in] filePath - the file path; the output format is defined by the file extension
diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h
index 9e7b36b5890..863ab956d63 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h
+++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h
@@ -74,7 +74,7 @@
# if ITT_PLATFORM==ITT_PLATFORM_WIN
# define CDECL __cdecl
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# if defined _M_IX86 || defined __i386__
+# if defined _M_IX86 || defined __i386__
# define CDECL __attribute__ ((cdecl))
# else /* _M_IX86 || __i386__ */
# define CDECL /* actual only on x86 platform */
@@ -87,7 +87,7 @@
# define STDCALL __stdcall
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
# if defined _M_IX86 || defined __i386__
-# define STDCALL __attribute__ ((stdcall))
+# define STDCALL __attribute__ ((stdcall))
# else /* _M_IX86 || __i386__ */
# define STDCALL /* supported only on x86 platform */
# endif /* _M_IX86 || __i386__ */
@@ -267,7 +267,7 @@ ITT_INLINE long __itt_interlocked_increment(volatile long* ptr)
#ifdef __INTEL_COMPILER
#define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val)
#else /* __INTEL_COMPILER */
-/* TODO: Add Support for not Intel compilers for IA-64 architecture */
+/* TODO: Add Support for not Intel compilers for IA-64 */
#endif /* __INTEL_COMPILER */
#elif ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_IA32E /* ITT_ARCH!=ITT_ARCH_IA64 */
ITT_INLINE long
diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c
index 4b5f464feb8..1b44011b5e3 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c
+++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.c
@@ -22,14 +22,14 @@
#include <stdarg.h>
#include <string.h>
-#define INTEL_NO_MACRO_BODY
+#define INTEL_NO_MACRO_BODY
#define INTEL_ITTNOTIFY_API_PRIVATE
#include "ittnotify.h"
#include "legacy/ittnotify.h"
#include "disable_warnings.h"
-static const char api_version[] = API_VERSION "\0\n@(#) $Revision: 42754 $\n";
+static const char api_version[] = API_VERSION "\0\n@(#) $Revision: 43375 $\n";
#define _N_(n) ITT_JOIN(INTEL_ITTNOTIFY_PREFIX,n)
@@ -44,13 +44,34 @@ static const char* ittnotify_lib_name = "libittnotify.dylib";
#endif
#ifdef __ANDROID__
+#include <android/log.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <linux/limits.h>
+
+#ifdef ITT_ANDROID_LOG
+ #define ITT_ANDROID_LOG_TAG "INTEL_VTUNE_USERAPI"
+ #define ITT_ANDROID_LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ITT_ANDROID_LOG_TAG, __VA_ARGS__))
+ #define ITT_ANDROID_LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ITT_ANDROID_LOG_TAG, __VA_ARGS__))
+ #define ITT_ANDROID_LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,ITT_ANDROID_LOG_TAG, __VA_ARGS__))
+ #define ITT_ANDROID_LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG,ITT_ANDROID_LOG_TAG, __VA_ARGS__))
+#else
+ #define ITT_ANDROID_LOGI(...)
+ #define ITT_ANDROID_LOGW(...)
+ #define ITT_ANDROID_LOGE(...)
+ #define ITT_ANDROID_LOGD(...)
+#endif
+
/* default location of userapi collector on Android */
#define ANDROID_ITTNOTIFY_DEFAULT_PATH "/data/data/com.intel.vtune/intel/libittnotify.so"
#endif
#ifndef LIB_VAR_NAME
-#if ITT_ARCH==ITT_ARCH_IA32
+#if ITT_ARCH==ITT_ARCH_IA32 || ITT_ARCH==ITT_ARCH_ARM
#define LIB_VAR_NAME INTEL_LIBITTNOTIFY32
#else
#define LIB_VAR_NAME INTEL_LIBITTNOTIFY64
@@ -687,6 +708,92 @@ static const char* __itt_get_lib_name(void)
{
const char* lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));
+#ifdef __ANDROID__
+ if (lib_name == NULL)
+ {
+ const char* const system_wide_marker_filename = "/data/local/tmp/com.intel.itt.collector_lib";
+ int itt_marker_file_fd = open(system_wide_marker_filename, O_RDONLY);
+ ssize_t res = 0;
+
+ if (itt_marker_file_fd == -1)
+ {
+ const pid_t my_pid = getpid();
+ char cmdline_path[PATH_MAX] = {0};
+ char package_name[PATH_MAX] = {0};
+ char app_sandbox_file[PATH_MAX] = {0};
+ int cmdline_fd = 0;
+
+ ITT_ANDROID_LOGI("Unable to open system-wide marker file.");
+ snprintf(cmdline_path, PATH_MAX - 1, "/proc/%d/cmdline", my_pid);
+ ITT_ANDROID_LOGI("CMD file: %s\n", cmdline_path);
+ cmdline_fd = open(cmdline_path, O_RDONLY);
+ if (cmdline_fd == -1)
+ {
+ ITT_ANDROID_LOGE("Unable to open %s file!", cmdline_path);
+ return lib_name;
+ }
+ res = read(cmdline_fd, package_name, PATH_MAX - 1);
+ if (res == -1)
+ {
+ ITT_ANDROID_LOGE("Unable to read %s file!", cmdline_path);
+ res = close(cmdline_fd);
+ if (res == -1)
+ {
+ ITT_ANDROID_LOGE("Unable to close %s file!", cmdline_path);
+ }
+ return lib_name;
+ }
+ res = close(cmdline_fd);
+ if (res == -1)
+ {
+ ITT_ANDROID_LOGE("Unable to close %s file!", cmdline_path);
+ return lib_name;
+ }
+ ITT_ANDROID_LOGI("Package name: %s\n", package_name);
+ snprintf(app_sandbox_file, PATH_MAX - 1, "/data/data/%s/com.intel.itt.collector_lib", package_name);
+ ITT_ANDROID_LOGI("Lib marker file name: %s\n", app_sandbox_file);
+ itt_marker_file_fd = open(app_sandbox_file, O_RDONLY);
+ if (itt_marker_file_fd == -1)
+ {
+ ITT_ANDROID_LOGE("Unable to open app marker file!");
+ return lib_name;
+ }
+ }
+
+ {
+ char itt_lib_name[PATH_MAX] = {0};
+
+ res = read(itt_marker_file_fd, itt_lib_name, PATH_MAX - 1);
+ if (res == -1)
+ {
+ ITT_ANDROID_LOGE("Unable to read %s file!", itt_marker_file_fd);
+ res = close(itt_marker_file_fd);
+ if (res == -1)
+ {
+ ITT_ANDROID_LOGE("Unable to close %s file!", itt_marker_file_fd);
+ }
+ return lib_name;
+ }
+ ITT_ANDROID_LOGI("ITT Lib path: %s", itt_lib_name);
+ res = close(itt_marker_file_fd);
+ if (res == -1)
+ {
+ ITT_ANDROID_LOGE("Unable to close %s file!", itt_marker_file_fd);
+ return lib_name;
+ }
+ ITT_ANDROID_LOGI("Set env");
+ res = setenv(ITT_TO_STR(LIB_VAR_NAME), itt_lib_name, 0);
+ if (res == -1)
+ {
+ ITT_ANDROID_LOGE("Unable to set env var!");
+ return lib_name;
+ }
+ lib_name = __itt_get_env_var(ITT_TO_STR(LIB_VAR_NAME));
+ ITT_ANDROID_LOGI("ITT Lib path from env: %s", itt_lib_name);
+ }
+ }
+#endif
+
return lib_name;
}
diff --git a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h
index fe1fe3c14f7..a218cc87bf1 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h
+++ b/openmp/runtime/src/thirdparty/ittnotify/ittnotify_static.h
@@ -105,14 +105,14 @@ ITT_STUBV(ITTAPI, void, model_clear_uses, (void* addr), (I
#ifndef __ITT_INTERNAL_BODY
#if ITT_PLATFORM==ITT_PLATFORM_WIN
-ITT_STUBV(ITTAPI, void, model_site_beginW, (const wchar_t *name), (ITT_FORMAT name), model_site_beginW, __itt_group_model, "\"%s\"")
-ITT_STUBV(ITTAPI, void, model_task_beginW, (const wchar_t *name), (ITT_FORMAT name), model_task_beginW, __itt_group_model, "\"%s\"")
+ITT_STUBV(ITTAPI, void, model_site_beginW, (const wchar_t *name), (ITT_FORMAT name), model_site_beginW, __itt_group_model, "\"%s\"")
+ITT_STUBV(ITTAPI, void, model_task_beginW, (const wchar_t *name), (ITT_FORMAT name), model_task_beginW, __itt_group_model, "\"%s\"")
ITT_STUBV(ITTAPI, void, model_iteration_taskW, (const wchar_t *name), (ITT_FORMAT name), model_iteration_taskW, __itt_group_model, "\"%s\"")
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
ITT_STUBV(ITTAPI, void, model_site_beginA, (const char *name), (ITT_FORMAT name), model_site_beginA, __itt_group_model, "\"%s\"")
-ITT_STUBV(ITTAPI, void, model_site_beginAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_site_beginAL, __itt_group_model, "\"%s\", %d")
+ITT_STUBV(ITTAPI, void, model_site_beginAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_site_beginAL, __itt_group_model, "\"%s\", %d")
ITT_STUBV(ITTAPI, void, model_task_beginA, (const char *name), (ITT_FORMAT name), model_task_beginA, __itt_group_model, "\"%s\"")
-ITT_STUBV(ITTAPI, void, model_task_beginAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_task_beginAL, __itt_group_model, "\"%s\", %d")
+ITT_STUBV(ITTAPI, void, model_task_beginAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_task_beginAL, __itt_group_model, "\"%s\", %d")
ITT_STUBV(ITTAPI, void, model_iteration_taskA, (const char *name), (ITT_FORMAT name), model_iteration_taskA, __itt_group_model, "\"%s\"")
ITT_STUBV(ITTAPI, void, model_iteration_taskAL, (const char *name, size_t len), (ITT_FORMAT name, len), model_iteration_taskAL, __itt_group_model, "\"%s\", %d")
ITT_STUBV(ITTAPI, void, model_site_end_2, (void), (ITT_NO_PARAMS), model_site_end_2, __itt_group_model, "no args")
@@ -154,8 +154,8 @@ ITT_STUBV(ITTAPI, void, region_begin, (const __itt_domain *domain, __itt_id id,
ITT_STUBV(ITTAPI, void, region_end, (const __itt_domain *domain, __itt_id id), (ITT_FORMAT domain, id), region_end, __itt_group_structure, "%p, %lu")
#ifndef __ITT_INTERNAL_BODY
-ITT_STUBV(ITTAPI, void, frame_begin_v3, (const __itt_domain *domain, __itt_id *id), (ITT_FORMAT domain, id), frame_begin_v3, __itt_group_structure, "%p, %p")
-ITT_STUBV(ITTAPI, void, frame_end_v3, (const __itt_domain *domain, __itt_id *id), (ITT_FORMAT domain, id), frame_end_v3, __itt_group_structure, "%p, %p")
+ITT_STUBV(ITTAPI, void, frame_begin_v3, (const __itt_domain *domain, __itt_id *id), (ITT_FORMAT domain, id), frame_begin_v3, __itt_group_structure, "%p, %p")
+ITT_STUBV(ITTAPI, void, frame_end_v3, (const __itt_domain *domain, __itt_id *id), (ITT_FORMAT domain, id), frame_end_v3, __itt_group_structure, "%p, %p")
ITT_STUBV(ITTAPI, void, frame_submit_v3, (const __itt_domain *domain, __itt_id *id, __itt_timestamp begin, __itt_timestamp end), (ITT_FORMAT domain, id, begin, end), frame_submit_v3, __itt_group_structure, "%p, %p, %lu, %lu")
#endif /* __ITT_INTERNAL_BODY */
diff --git a/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h b/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h
index 08e5bb90883..4d87bd3ded9 100644
--- a/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h
+++ b/openmp/runtime/src/thirdparty/ittnotify/legacy/ittnotify.h
@@ -79,7 +79,7 @@
# if ITT_PLATFORM==ITT_PLATFORM_WIN
# define CDECL __cdecl
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
-# if defined _M_IX86 || defined __i386__
+# if defined _M_IX86 || defined __i386__
# define CDECL __attribute__ ((cdecl))
# else /* _M_IX86 || __i386__ */
# define CDECL /* actual only on x86 platform */
@@ -92,7 +92,7 @@
# define STDCALL __stdcall
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
# if defined _M_IX86 || defined __i386__
-# define STDCALL __attribute__ ((stdcall))
+# define STDCALL __attribute__ ((stdcall))
# else /* _M_IX86 || __i386__ */
# define STDCALL /* supported only on x86 platform */
# endif /* _M_IX86 || __i386__ */
diff --git a/openmp/runtime/src/z_Linux_asm.s b/openmp/runtime/src/z_Linux_asm.s
index 64c80522614..2b982234307 100644
--- a/openmp/runtime/src/z_Linux_asm.s
+++ b/openmp/runtime/src/z_Linux_asm.s
@@ -1,7 +1,7 @@
// z_Linux_asm.s: - microtasking routines specifically
// written for Intel platforms running Linux* OS
-// $Revision: 42810 $
-// $Date: 2013-11-07 12:06:33 -0600 (Thu, 07 Nov 2013) $
+// $Revision: 43473 $
+// $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
//
////===----------------------------------------------------------------------===//
@@ -489,118 +489,6 @@ __kmp_unnamed_critical_addr:
//------------------------------------------------------------------------
//
-// FUNCTION __kmp_test_then_add_real32
-//
-// kmp_real32
-// __kmp_test_then_add_real32( volatile kmp_real32 *addr, kmp_real32 data );
-//
-
- PROC __kmp_test_then_add_real32
-
-_addr = 8
-_data = 12
-_old_value = -4
-_new_value = -8
-
- pushl %ebp
- movl %esp, %ebp
- subl $8, %esp
- pushl %esi
- pushl %ebx
- movl _addr(%ebp), %esi
-L22:
- flds (%esi)
- // load <addr>
- fsts _old_value(%ebp)
- // store into old_value
- fadds _data(%ebp)
- fstps _new_value(%ebp)
- // new_value = old_value + data
-
- movl _old_value(%ebp), %eax
- // load old_value
- movl _new_value(%ebp), %ebx
- // load new_value
-
- lock
- cmpxchgl %ebx,(%esi)
- // Compare %EAX with <addr>. If equal set
- // ZF and load %EBX into <addr>. Else, clear
- // ZF and load <addr> into %EAX.
- jnz L22
-
-
- flds _old_value(%ebp)
- // return old_value
- popl %ebx
- popl %esi
- movl %ebp, %esp
- popl %ebp
- ret
-
- DEBUG_INFO __kmp_test_then_add_real32
-
-//------------------------------------------------------------------------
-//
-// FUNCTION __kmp_test_then_add_real64
-//
-// kmp_real64
-// __kmp_test_then_add_real64( volatile kmp_real64 *addr, kmp_real64 data );
-//
- PROC __kmp_test_then_add_real64
-
-_addr = 8
-_data = 12
-_old_value = -8
-_new_value = -16
-
- pushl %ebp
- movl %esp, %ebp
- subl $16, %esp
- pushl %esi
- pushl %ebx
- pushl %ecx
- pushl %edx
- movl _addr(%ebp), %esi
-L44:
- fldl (%esi)
- // load <addr>
- fstl _old_value(%ebp)
- // store into old_value
- faddl _data(%ebp)
- fstpl _new_value(%ebp)
- // new_value = old_value + data
-
- movl _old_value+4(%ebp), %edx
- movl _old_value(%ebp), %eax
- // load old_value
- movl _new_value+4(%ebp), %ecx
- movl _new_value(%ebp), %ebx
- // load new_value
-
- lock
- cmpxchg8b (%esi)
- // Compare %EDX:%EAX with <addr>. If equal set
- // ZF and load %ECX:%EBX into <addr>. Else, clear
- // ZF and load <addr> into %EDX:%EAX.
- jnz L44
-
-
- fldl _old_value(%ebp)
- // return old_value
- popl %edx
- popl %ecx
- popl %ebx
- popl %esi
- movl %ebp, %esp
- popl %ebp
- ret
-
- DEBUG_INFO __kmp_test_then_add_real64
-
-
-//------------------------------------------------------------------------
-//
// FUNCTION __kmp_load_x87_fpu_control_word
//
// void
@@ -758,30 +646,7 @@ L44:
.data
ALIGN 4
-// AC: The following #if hiden the .text thus moving the rest of code into .data section on MIC.
-// To prevent this in future .text added to every routine definition for x86_64.
-# if __MIC__ || __MIC2__
-
-# else
-
-//------------------------------------------------------------------------
-//
-// FUNCTION __kmp_x86_pause
-//
-// void
-// __kmp_x86_pause( void );
-//
-
- .text
- PROC __kmp_x86_pause
-
- pause_op
- ret
-
- DEBUG_INFO __kmp_x86_pause
-
-# endif // __MIC__ || __MIC2__
-
+// To prevent getting our code into .data section .text added to every routine definition for x86_64.
//------------------------------------------------------------------------
//
// FUNCTION __kmp_x86_cpuid
@@ -1176,79 +1041,6 @@ L44:
# if ! (__MIC__ || __MIC2__)
-//------------------------------------------------------------------------
-//
-// FUNCTION __kmp_test_then_add_real32
-//
-// kmp_real32
-// __kmp_test_then_add_real32( volatile kmp_real32 *addr, kmp_real32 data );
-//
-// parameters:
-// addr: %rdi
-// data: %xmm0 (lower 4 bytes)
-//
-// return: %xmm0 (lower 4 bytes)
-
- .text
- PROC __kmp_test_then_add_real32
-1:
- movss (%rdi), %xmm1 // load value of <addr>
- movd %xmm1, %eax // save old value of <addr>
-
- addss %xmm0, %xmm1 // new value = old value + <data>
- movd %xmm1, %ecx // move new value to GP reg.
-
- lock
- cmpxchgl %ecx, (%rdi) // Compare %EAX with <addr>. If equal set
- // ZF and exchange %ECX with <addr>. Else,
- // clear ZF and load <addr> into %EAX.
- jz 2f
- pause_op
- jmp 1b
-2:
- movd %eax, %xmm0 // load old value into return register
- ret
-
- DEBUG_INFO __kmp_test_then_add_real32
-
-
-//------------------------------------------------------------------------
-//
-// FUNCTION __kmp_test_then_add_real64
-//
-// kmp_real64
-// __kmp_test_then_add_real64( volatile kmp_real64 *addr, kmp_real64 data );
-//
-// parameters:
-// addr: %rdi
-// data: %xmm0 (lower 8 bytes)
-// return: %xmm0 (lower 8 bytes)
-//
-
- .text
- PROC __kmp_test_then_add_real64
-1:
- movlpd (%rdi), %xmm1 // load value of <addr>
- movd %xmm1, %rax // save old value of <addr>
-
- addsd %xmm0, %xmm1 // new value = old value + <data>
- movd %xmm1, %rcx // move new value to GP reg.
-
- lock
- cmpxchgq %rcx, (%rdi) // Compare %RAX with <addr>. If equal set
- // ZF and exchange %RCX with <addr>. Else,
- // clear ZF and load <addr> into %RAX.
- jz 2f
- pause_op
- jmp 1b
-
-2:
- movd %rax, %xmm0 // load old value into return register
- ret
-
- DEBUG_INFO __kmp_test_then_add_real64
-
-
# if !KMP_ASM_INTRINS
//------------------------------------------------------------------------
@@ -1382,7 +1174,7 @@ L44:
// typedef void (*microtask_t)( int *gtid, int *tid, ... );
//
// int
-// __kmp_invoke_microtask( void (*pkfn) (int *gtid, int *tid, ...),
+// __kmp_invoke_microtask( void (*pkfn) (int gtid, int tid, ...),
// int gtid, int tid,
// int argc, void *p_argv[] ) {
// (*pkfn)( & gtid, & tid, argv[0], ... );
@@ -1597,5 +1389,9 @@ __kmp_unnamed_critical_addr:
#endif /* KMP_ARCH_PPC64 */
#if defined(__linux__)
+# if KMP_ARCH_ARM
+.section .note.GNU-stack,"",%progbits
+# else
.section .note.GNU-stack,"",@progbits
+# endif
#endif
diff --git a/openmp/runtime/src/z_Linux_util.c b/openmp/runtime/src/z_Linux_util.c
index 01f463e4c50..d66d2a4557c 100644
--- a/openmp/runtime/src/z_Linux_util.c
+++ b/openmp/runtime/src/z_Linux_util.c
@@ -1,7 +1,7 @@
/*
* z_Linux_util.c -- platform specific routines.
- * $Revision: 42847 $
- * $Date: 2013-11-26 09:10:01 -0600 (Tue, 26 Nov 2013) $
+ * $Revision: 43473 $
+ * $Date: 2014-09-26 15:02:57 -0500 (Fri, 26 Sep 2014) $
*/
@@ -21,6 +21,8 @@
#include "kmp_str.h"
#include "kmp_i18n.h"
#include "kmp_io.h"
+#include "kmp_stats.h"
+#include "kmp_wait_release.h"
#if !KMP_OS_FREEBSD
# include <alloca.h>
@@ -654,7 +656,6 @@ __kmp_set_stack_info( int gtid, kmp_info_t *th )
return TRUE;
}
#endif /* KMP_OS_LINUX || KMP_OS_FREEBSD */
-
/* Use incremental refinement starting from initial conservative estimate */
TCW_PTR(th->th.th_info.ds.ds_stacksize, 0);
TCW_PTR(th -> th.th_info.ds.ds_stackbase, &stack_data);
@@ -679,6 +680,10 @@ __kmp_launch_worker( void *thr )
#ifdef KMP_TDATA_GTID
__kmp_gtid = gtid;
#endif
+#if KMP_STATS_ENABLED
+ // set __thread local index to point to thread-specific stats
+ __kmp_stats_thread_ptr = ((kmp_info_t*)thr)->th.th_stats;
+#endif
#if USE_ITT_BUILD
__kmp_itt_thread_name( gtid );
@@ -815,6 +820,7 @@ __kmp_launch_monitor( void *thr )
);
}; // if
}; // if
+ TCW_4( __kmp_global.g.g_time.dt.t_value, 0 ); // AC: free thread that waits for monitor started
}
#endif // KMP_REAL_TIME_FIX
@@ -942,6 +948,25 @@ __kmp_create_worker( int gtid, kmp_info_t *th, size_t stack_size )
th->th.th_info.ds.ds_gtid = gtid;
+#if KMP_STATS_ENABLED
+ // sets up worker thread stats
+ __kmp_acquire_tas_lock(&__kmp_stats_lock, gtid);
+
+ // th->th.th_stats is used to transfer thread specific stats-pointer to __kmp_launch_worker
+ // So when thread is created (goes into __kmp_launch_worker) it will
+ // set it's __thread local pointer to th->th.th_stats
+ th->th.th_stats = __kmp_stats_list.push_back(gtid);
+ if(KMP_UBER_GTID(gtid)) {
+ __kmp_stats_start_time = tsc_tick_count::now();
+ __kmp_stats_thread_ptr = th->th.th_stats;
+ __kmp_stats_init();
+ KMP_START_EXPLICIT_TIMER(OMP_serial);
+ KMP_START_EXPLICIT_TIMER(OMP_start_end);
+ }
+ __kmp_release_tas_lock(&__kmp_stats_lock, gtid);
+
+#endif // KMP_STATS_ENABLED
+
if ( KMP_UBER_GTID(gtid) ) {
KA_TRACE( 10, ("__kmp_create_worker: uber thread (%d)\n", gtid ) );
th -> th.th_info.ds.ds_thread = pthread_self();
@@ -1088,6 +1113,8 @@ __kmp_create_monitor( kmp_info_t *th )
th->th.th_info.ds.ds_gtid = KMP_GTID_MONITOR;
#if KMP_REAL_TIME_FIX
TCW_4( __kmp_global.g.g_time.dt.t_value, -1 ); // Will use it for synchronization a bit later.
+ #else
+ TCW_4( __kmp_global.g.g_time.dt.t_value, 0 );
#endif // KMP_REAL_TIME_FIX
#ifdef KMP_THREAD_ATTR
@@ -1156,8 +1183,6 @@ __kmp_create_monitor( kmp_info_t *th )
}; // if
#endif /* _POSIX_THREAD_ATTR_STACKSIZE */
- TCW_4( __kmp_global.g.g_time.dt.t_value, 0 );
-
status = pthread_create( &handle, & thread_attr, __kmp_launch_monitor, (void *) th );
if ( status != 0 ) {
@@ -1229,7 +1254,7 @@ void
__kmp_exit_thread(
int exit_status
) {
- pthread_exit( (void *) exit_status );
+ pthread_exit( (void *)(intptr_t) exit_status );
} // __kmp_exit_thread
void __kmp_resume_monitor();
@@ -1642,62 +1667,54 @@ __kmp_suspend_uninitialize_thread( kmp_info_t *th )
}
}
-/*
- * This routine puts the calling thread to sleep after setting the
- * sleep bit for the indicated spin variable to true.
+/* This routine puts the calling thread to sleep after setting the
+ * sleep bit for the indicated flag variable to true.
*/
-
-void
-__kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker )
+template <class C>
+static inline void __kmp_suspend_template( int th_gtid, C *flag )
{
+ KMP_TIME_BLOCK(USER_suspend);
kmp_info_t *th = __kmp_threads[th_gtid];
int status;
- kmp_uint old_spin;
+ typename C::flag_t old_spin;
- KF_TRACE( 30, ("__kmp_suspend: T#%d enter for spin = %p\n", th_gtid, spinner ) );
+ KF_TRACE( 30, ("__kmp_suspend_template: T#%d enter for flag = %p\n", th_gtid, flag->get() ) );
__kmp_suspend_initialize_thread( th );
status = pthread_mutex_lock( &th->th.th_suspend_mx.m_mutex );
KMP_CHECK_SYSFAIL( "pthread_mutex_lock", status );
- KF_TRACE( 10, ( "__kmp_suspend: T#%d setting sleep bit for spin(%p)\n",
- th_gtid, spinner ) );
+ KF_TRACE( 10, ( "__kmp_suspend_template: T#%d setting sleep bit for spin(%p)\n",
+ th_gtid, flag->get() ) );
/* TODO: shouldn't this use release semantics to ensure that __kmp_suspend_initialize_thread
gets called first?
*/
- old_spin = KMP_TEST_THEN_OR32( (volatile kmp_int32 *) spinner,
- KMP_BARRIER_SLEEP_STATE );
-
- KF_TRACE( 5, ( "__kmp_suspend: T#%d set sleep bit for spin(%p)==%d\n",
- th_gtid, spinner, *spinner ) );
+ old_spin = flag->set_sleeping();
- if ( old_spin == checker ) {
- KMP_TEST_THEN_AND32( (volatile kmp_int32 *) spinner, ~(KMP_BARRIER_SLEEP_STATE) );
+ KF_TRACE( 5, ( "__kmp_suspend_template: T#%d set sleep bit for spin(%p)==%d\n",
+ th_gtid, flag->get(), *(flag->get()) ) );
- KF_TRACE( 5, ( "__kmp_suspend: T#%d false alarm, reset sleep bit for spin(%p)\n",
- th_gtid, spinner) );
+ if ( flag->done_check_val(old_spin) ) {
+ old_spin = flag->unset_sleeping();
+ KF_TRACE( 5, ( "__kmp_suspend_template: T#%d false alarm, reset sleep bit for spin(%p)\n",
+ th_gtid, flag->get()) );
} else {
-
/* Encapsulate in a loop as the documentation states that this may
* "with low probability" return when the condition variable has
* not been signaled or broadcast
*/
int deactivated = FALSE;
- TCW_PTR(th->th.th_sleep_loc, spinner);
- while ( TCR_4( *spinner ) & KMP_BARRIER_SLEEP_STATE ) {
+ TCW_PTR(th->th.th_sleep_loc, (void *)flag);
+ while ( flag->is_sleeping() ) {
#ifdef DEBUG_SUSPEND
char buffer[128];
__kmp_suspend_count++;
__kmp_print_cond( buffer, &th->th.th_suspend_cv );
- __kmp_printf( "__kmp_suspend: suspending T#%d: %s\n", th_gtid, buffer );
+ __kmp_printf( "__kmp_suspend_template: suspending T#%d: %s\n", th_gtid, buffer );
#endif
-
- //
- // Mark the thread as no longer active
- // (only in the first iteration of the loop).
- //
+ // Mark the thread as no longer active (only in the first iteration of the loop).
if ( ! deactivated ) {
th->th.th_active = FALSE;
if ( th->th.th_active_in_pool ) {
@@ -1724,11 +1741,11 @@ __kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker )
now.tv_sec += msecs / 1000;
now.tv_nsec += (msecs % 1000)*1000;
- KF_TRACE( 15, ( "__kmp_suspend: T#%d about to perform pthread_cond_timedwait\n",
+ KF_TRACE( 15, ( "__kmp_suspend_template: T#%d about to perform pthread_cond_timedwait\n",
th_gtid ) );
status = pthread_cond_timedwait( &th->th.th_suspend_cv.c_cond, &th->th.th_suspend_mx.m_mutex, & now );
#else
- KF_TRACE( 15, ( "__kmp_suspend: T#%d about to perform pthread_cond_wait\n",
+ KF_TRACE( 15, ( "__kmp_suspend_template: T#%d about to perform pthread_cond_wait\n",
th_gtid ) );
status = pthread_cond_wait( &th->th.th_suspend_cv.c_cond, &th->th.th_suspend_mx.m_mutex );
@@ -1739,28 +1756,23 @@ __kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker )
}
#ifdef KMP_DEBUG
if (status == ETIMEDOUT) {
- if ( (*spinner) & KMP_BARRIER_SLEEP_STATE ) {
- KF_TRACE( 100, ( "__kmp_suspend: T#%d timeout wakeup\n", th_gtid ) );
+ if ( flag->is_sleeping() ) {
+ KF_TRACE( 100, ( "__kmp_suspend_template: T#%d timeout wakeup\n", th_gtid ) );
} else {
- KF_TRACE( 2, ( "__kmp_suspend: T#%d timeout wakeup, sleep bit not set!\n",
+ KF_TRACE( 2, ( "__kmp_suspend_template: T#%d timeout wakeup, sleep bit not set!\n",
th_gtid ) );
}
- } else if ( (*spinner) & KMP_BARRIER_SLEEP_STATE ) {
- KF_TRACE( 100, ( "__kmp_suspend: T#%d spurious wakeup\n", th_gtid ) );
+ } else if ( flag->is_sleeping() ) {
+ KF_TRACE( 100, ( "__kmp_suspend_template: T#%d spurious wakeup\n", th_gtid ) );
}
#endif
-
} // while
- //
- // Mark the thread as active again
- // (if it was previous marked as inactive)
- //
+ // Mark the thread as active again (if it was previous marked as inactive)
if ( deactivated ) {
th->th.th_active = TRUE;
if ( TCR_4(th->th.th_in_pool) ) {
- KMP_TEST_THEN_INC32(
- (kmp_int32 *) &__kmp_thread_pool_active_nth );
+ KMP_TEST_THEN_INC32( (kmp_int32 *) &__kmp_thread_pool_active_nth );
th->th.th_active_in_pool = TRUE;
}
}
@@ -1770,7 +1782,7 @@ __kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker )
{
char buffer[128];
__kmp_print_cond( buffer, &th->th.th_suspend_cv);
- __kmp_printf( "__kmp_suspend: T#%d has awakened: %s\n", th_gtid, buffer );
+ __kmp_printf( "__kmp_suspend_template: T#%d has awakened: %s\n", th_gtid, buffer );
}
#endif
@@ -1778,69 +1790,76 @@ __kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker )
status = pthread_mutex_unlock( &th->th.th_suspend_mx.m_mutex );
KMP_CHECK_SYSFAIL( "pthread_mutex_unlock", status );
- KF_TRACE( 30, ("__kmp_suspend: T#%d exit\n", th_gtid ) );
+ KF_TRACE( 30, ("__kmp_suspend_template: T#%d exit\n", th_gtid ) );
+}
+
+void __kmp_suspend_32(int th_gtid, kmp_flag_32 *flag) {
+ __kmp_suspend_template(th_gtid, flag);
+}
+void __kmp_suspend_64(int th_gtid, kmp_flag_64 *flag) {
+ __kmp_suspend_template(th_gtid, flag);
+}
+void __kmp_suspend_oncore(int th_gtid, kmp_flag_oncore *flag) {
+ __kmp_suspend_template(th_gtid, flag);
}
/* This routine signals the thread specified by target_gtid to wake up
- * after setting the sleep bit indicated by the spin argument to FALSE.
- * The target thread must already have called __kmp_suspend()
+ * after setting the sleep bit indicated by the flag argument to FALSE.
+ * The target thread must already have called __kmp_suspend_template()
*/
-
-void
-__kmp_resume( int target_gtid, volatile kmp_uint *spin )
+template <class C>
+static inline void __kmp_resume_template( int target_gtid, C *flag )
{
kmp_info_t *th = __kmp_threads[target_gtid];
int status;
- kmp_uint old_spin;
#ifdef KMP_DEBUG
int gtid = TCR_4(__kmp_init_gtid) ? __kmp_get_gtid() : -1;
#endif
- KF_TRACE( 30, ( "__kmp_resume: T#%d wants to wakeup T#%d enter\n",
- gtid, target_gtid ) );
-
+ KF_TRACE( 30, ( "__kmp_resume_template: T#%d wants to wakeup T#%d enter\n", gtid, target_gtid ) );
KMP_DEBUG_ASSERT( gtid != target_gtid );
__kmp_suspend_initialize_thread( th );
status = pthread_mutex_lock( &th->th.th_suspend_mx.m_mutex );
KMP_CHECK_SYSFAIL( "pthread_mutex_lock", status );
- if ( spin == NULL ) {
- spin = (volatile kmp_uint *)TCR_PTR(th->th.th_sleep_loc);
- if ( spin == NULL ) {
- KF_TRACE( 5, ( "__kmp_resume: T#%d exiting, thread T#%d already awake - spin(%p)\n",
- gtid, target_gtid, spin ) );
- status = pthread_mutex_unlock( &th->th.th_suspend_mx.m_mutex );
- KMP_CHECK_SYSFAIL( "pthread_mutex_unlock", status );
- return;
- }
+ if (!flag) {
+ flag = (C *)th->th.th_sleep_loc;
}
- old_spin = KMP_TEST_THEN_AND32( (kmp_int32 volatile *) spin,
- ~( KMP_BARRIER_SLEEP_STATE ) );
- if ( ( old_spin & KMP_BARRIER_SLEEP_STATE ) == 0 ) {
- KF_TRACE( 5, ( "__kmp_resume: T#%d exiting, thread T#%d already awake - spin(%p): "
- "%u => %u\n",
- gtid, target_gtid, spin, old_spin, *spin ) );
-
+ if (!flag) {
+ KF_TRACE( 5, ( "__kmp_resume_template: T#%d exiting, thread T#%d already awake: flag(%p)\n",
+ gtid, target_gtid, NULL ) );
status = pthread_mutex_unlock( &th->th.th_suspend_mx.m_mutex );
KMP_CHECK_SYSFAIL( "pthread_mutex_unlock", status );
return;
}
+ else {
+ typename C::flag_t old_spin = flag->unset_sleeping();
+ if ( ! flag->is_sleeping_val(old_spin) ) {
+ KF_TRACE( 5, ( "__kmp_resume_template: T#%d exiting, thread T#%d already awake: flag(%p): "
+ "%u => %u\n",
+ gtid, target_gtid, flag->get(), old_spin, *flag->get() ) );
+
+ status = pthread_mutex_unlock( &th->th.th_suspend_mx.m_mutex );
+ KMP_CHECK_SYSFAIL( "pthread_mutex_unlock", status );
+ return;
+ }
+ KF_TRACE( 5, ( "__kmp_resume_template: T#%d about to wakeup T#%d, reset sleep bit for flag's loc(%p): "
+ "%u => %u\n",
+ gtid, target_gtid, flag->get(), old_spin, *flag->get() ) );
+ }
TCW_PTR(th->th.th_sleep_loc, NULL);
- KF_TRACE( 5, ( "__kmp_resume: T#%d about to wakeup T#%d, reset sleep bit for spin(%p): "
- "%u => %u\n",
- gtid, target_gtid, spin, old_spin, *spin ) );
#ifdef DEBUG_SUSPEND
{
char buffer[128];
__kmp_print_cond( buffer, &th->th.th_suspend_cv );
- __kmp_printf( "__kmp_resume: T#%d resuming T#%d: %s\n", gtid, target_gtid, buffer );
+ __kmp_printf( "__kmp_resume_template: T#%d resuming T#%d: %s\n", gtid, target_gtid, buffer );
}
#endif
@@ -1849,13 +1868,24 @@ __kmp_resume( int target_gtid, volatile kmp_uint *spin )
KMP_CHECK_SYSFAIL( "pthread_cond_signal", status );
status = pthread_mutex_unlock( &th->th.th_suspend_mx.m_mutex );
KMP_CHECK_SYSFAIL( "pthread_mutex_unlock", status );
- KF_TRACE( 30, ( "__kmp_resume: T#%d exiting after signaling wake up for T#%d\n",
+ KF_TRACE( 30, ( "__kmp_resume_template: T#%d exiting after signaling wake up for T#%d\n",
gtid, target_gtid ) );
}
+void __kmp_resume_32(int target_gtid, kmp_flag_32 *flag) {
+ __kmp_resume_template(target_gtid, flag);
+}
+void __kmp_resume_64(int target_gtid, kmp_flag_64 *flag) {
+ __kmp_resume_template(target_gtid, flag);
+}
+void __kmp_resume_oncore(int target_gtid, kmp_flag_oncore *flag) {
+ __kmp_resume_template(target_gtid, flag);
+}
+
void
__kmp_resume_monitor()
{
+ KMP_TIME_BLOCK(USER_resume);
int status;
#ifdef KMP_DEBUG
int gtid = TCR_4(__kmp_init_gtid) ? __kmp_get_gtid() : -1;
@@ -1899,7 +1929,7 @@ __kmp_gtid_set_specific( int gtid )
{
int status;
KMP_ASSERT( __kmp_init_runtime );
- status = pthread_setspecific( __kmp_gtid_threadprivate_key, (void*)(gtid+1) );
+ status = pthread_setspecific( __kmp_gtid_threadprivate_key, (void*)(intptr_t)(gtid+1) );
KMP_CHECK_SYSFAIL( "pthread_setspecific", status );
}
@@ -2052,9 +2082,9 @@ __kmp_get_xproc( void ) {
int mib[] = { CTL_HW, HW_NCPU };
size_t len = sizeof( r );
if ( sysctl( mib, 2, &r, &len, NULL, 0 ) < 0 ) {
- r = 0;
- KMP_WARNING( CantGetNumAvailCPU );
- KMP_INFORM( AssumedNumCPU );
+ r = 0;
+ KMP_WARNING( CantGetNumAvailCPU );
+ KMP_INFORM( AssumedNumCPU );
}
#else
@@ -2298,7 +2328,7 @@ __kmp_is_address_mapped( void * addr ) {
#elif KMP_OS_FREEBSD
- // FIXME(FreeBSD): Implement this.
+ // FIXME(FreeBSD*): Implement this
found = 1;
#else
diff --git a/openmp/runtime/src/z_Windows_NT-586_asm.asm b/openmp/runtime/src/z_Windows_NT-586_asm.asm
index feb0b1cd1f3..385e3263d2b 100644
--- a/openmp/runtime/src/z_Windows_NT-586_asm.asm
+++ b/openmp/runtime/src/z_Windows_NT-586_asm.asm
@@ -1,7 +1,7 @@
; z_Windows_NT-586_asm.asm: - microtasking routines specifically
; written for IA-32 architecture and Intel(R) 64 running Windows* OS
-; $Revision: 42487 $
-; $Date: 2013-07-08 08:11:23 -0500 (Mon, 08 Jul 2013) $
+; $Revision: 43373 $
+; $Date: 2014-08-07 09:17:32 -0500 (Thu, 07 Aug 2014) $
;
;//===----------------------------------------------------------------------===//
@@ -495,121 +495,6 @@ lock cmpxchg8b QWORD PTR [edi]
___kmp_compare_and_store_ret64 ENDP
_TEXT ENDS
-
-;------------------------------------------------------------------------
-;
-; FUNCTION ___kmp_test_then_add_real32
-;
-; kmp_real32
-; __kmp_test_then_add_real32( volatile kmp_real32 *addr, kmp_real32 data );
-;
-
-PUBLIC ___kmp_test_then_add_real32
-_TEXT SEGMENT
- ALIGN 16
-_addr$ = 8
-_data$ = 12
-_old_value$ = -4
-_new_value$ = -8
-
-___kmp_test_then_add_real32 PROC NEAR
- push ebp
- mov ebp, esp
- sub esp, 8
- push esi
- push ebx
- mov esi, DWORD PTR _addr$[ebp]
-$L22:
- fld DWORD PTR [esi]
- ;; load <addr>
- fst DWORD PTR _old_value$[ebp]
- ;; store into old_value
- fadd DWORD PTR _data$[ebp]
- fstp DWORD PTR _new_value$[ebp]
- ;; new_value = old_value + data
-
- mov eax, DWORD PTR _old_value$[ebp]
- ;; load old_value
- mov ebx, DWORD PTR _new_value$[ebp]
- ;; load new_value
-
-lock cmpxchg DWORD PTR [esi], ebx
- ;; Compare EAX with <addr>. If equal set
- ;; ZF and load EBX into <addr>. Else, clear
- ;; ZF and load <addr> into EAX.
- jnz SHORT $L22
-
-
- fld DWORD PTR _old_value$[ebp]
- ;; return old_value
- pop ebx
- pop esi
- mov esp, ebp
- pop ebp
- ret 0
-___kmp_test_then_add_real32 ENDP
-_TEXT ENDS
-
-;------------------------------------------------------------------------
-;
-; FUNCTION ___kmp_test_then_add_real64
-;
-; kmp_real64
-; __kmp_test_then_add_real64( volatile kmp_real64 *addr, kmp_real64 data );
-;
-
-PUBLIC ___kmp_test_then_add_real64
-_TEXT SEGMENT
- ALIGN 16
-_addr$ = 8
-_data$ = 12
-_old_value$ = -8
-_new_value$ = -16
-
-___kmp_test_then_add_real64 PROC NEAR
- push ebp
- mov ebp, esp
- sub esp, 16
- push esi
- push ebx
- push ecx
- push edx
- mov esi, DWORD PTR _addr$[ebp]
-$L44:
- fld QWORD PTR [esi]
- ;; load <addr>
- fst QWORD PTR _old_value$[ebp]
- ;; store into old_value
- fadd QWORD PTR _data$[ebp]
- fstp QWORD PTR _new_value$[ebp]
- ;; new_value = old_value + data
-
- mov edx, DWORD PTR _old_value$[ebp+4]
- mov eax, DWORD PTR _old_value$[ebp]
- ;; load old_value
- mov ecx, DWORD PTR _new_value$[ebp+4]
- mov ebx, DWORD PTR _new_value$[ebp]
- ;; load new_value
-
-lock cmpxchg8b QWORD PTR [esi]
- ;; Compare EDX:EAX with <addr>. If equal set
- ;; ZF and load ECX:EBX into <addr>. Else, clear
- ;; ZF and load <addr> into EDX:EAX.
- jnz SHORT $L44
-
-
- fld QWORD PTR _old_value$[ebp]
- ;; return old_value
- pop edx
- pop ecx
- pop ebx
- pop esi
- mov esp, ebp
- pop ebp
- ret 0
-___kmp_test_then_add_real64 ENDP
-_TEXT ENDS
-
;------------------------------------------------------------------------
;
; FUNCTION ___kmp_load_x87_fpu_control_word
@@ -788,27 +673,6 @@ ifdef _M_AMD64
;------------------------------------------------------------------------
;
-; FUNCTION __kmp_x86_pause
-;
-; void
-; __kmp_x86_pause( void )
-;
-
-PUBLIC __kmp_x86_pause
-_TEXT SEGMENT
- ALIGN 16
-__kmp_x86_pause PROC ;NEAR
-
- db 0f3H
- db 090H ; pause
- ret
-
-__kmp_x86_pause ENDP
-_TEXT ENDS
-
-
-;------------------------------------------------------------------------
-;
; FUNCTION __kmp_x86_cpuid
;
; void
@@ -1340,93 +1204,6 @@ lock xchg QWORD PTR [rcx], rax
__kmp_xchg_real64 ENDP
_TEXT ENDS
-
-;------------------------------------------------------------------------
-;
-; FUNCTION __kmp_test_then_add_real32
-;
-; kmp_real32
-; __kmp_test_then_add_real32( volatile kmp_real32 *addr, kmp_real32 data );
-;
-; parameters:
-; addr: rcx
-; data: xmm1 (lower 4 bytes)
-;
-; return: xmm0 (lower 4 bytes)
-
-PUBLIC __kmp_test_then_add_real32
-_TEXT SEGMENT
- ALIGN 16
-
-__kmp_test_then_add_real32 PROC ;NEAR
-$__kmp_real32_loop:
- movss xmm0, DWORD PTR [rcx] ; load value at <addr>
- movd eax, xmm0 ; save old value at <addr>
-
- addss xmm0, xmm1 ; new value = old value + <data>
- movd edx, xmm0 ; move new value to GP reg.
-
-lock cmpxchg DWORD PTR [rcx], edx
- ; Compare EAX with <addr>. If equal set
- ; ZF and exchange EDX with <addr>. Else, clear
- ; ZF and load <addr> into EAX.
- jz SHORT $__kmp_real32_success
-
- db 0f3H
- db 090H ; pause
-
- jmp SHORT $__kmp_real32_loop
-
-$__kmp_real32_success:
- movd xmm0, eax ; load old value into return register
- ret
-__kmp_test_then_add_real32 ENDP
-_TEXT ENDS
-
-
-;------------------------------------------------------------------------
-;
-; FUNCTION __kmp_test_then_add_real64
-;
-; kmp_real64
-; __kmp_test_then_add_real64( volatile kmp_real64 *addr, kmp_real64 data );
-;
-; parameters:
-; addr: rcx
-; data: xmm1 (lower 8 bytes)
-;
-; return: xmm0 (lower 8 bytes)
-
-PUBLIC __kmp_test_then_add_real64
-_TEXT SEGMENT
- ALIGN 16
-
-__kmp_test_then_add_real64 PROC ;NEAR
-$__kmp_real64_loop:
- movlpd xmm0, QWORD PTR [rcx] ; load value at <addr>
- movd rax, xmm0 ; save old value at <addr>
-
- addsd xmm0, xmm1 ; new value = old value + <data>
- movd rdx, xmm0 ; move new value to GP reg.
-
-lock cmpxchg QWORD PTR [rcx], rdx
- ; Compare RAX with <addr>. If equal set
- ; ZF and exchange RDX with <addr>. Else, clear
- ; ZF and load <addr> into RAX.
- jz SHORT $__kmp_real64_success
-
- db 0f3H
- db 090H ; pause
-
- jmp SHORT $__kmp_real64_loop
-
-$__kmp_real64_success:
- movd xmm0, rax ; load old value into return register
- ret
-__kmp_test_then_add_real64 ENDP
-_TEXT ENDS
-
-
;------------------------------------------------------------------------
;
; FUNCTION __kmp_load_x87_fpu_control_word
diff --git a/openmp/runtime/src/z_Windows_NT-586_util.c b/openmp/runtime/src/z_Windows_NT-586_util.c
index 19bd96b4401..9e35df45d41 100644
--- a/openmp/runtime/src/z_Windows_NT-586_util.c
+++ b/openmp/runtime/src/z_Windows_NT-586_util.c
@@ -1,7 +1,7 @@
/*
* z_Windows_NT-586_util.c -- platform specific routines.
- * $Revision: 42181 $
- * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/src/z_Windows_NT_util.c b/openmp/runtime/src/z_Windows_NT_util.c
index 97e7fd20222..9442444ac9f 100644
--- a/openmp/runtime/src/z_Windows_NT_util.c
+++ b/openmp/runtime/src/z_Windows_NT_util.c
@@ -1,7 +1,7 @@
/*
* z_Windows_NT_util.c -- platform specific routines.
- * $Revision: 42816 $
- * $Date: 2013-11-11 15:33:37 -0600 (Mon, 11 Nov 2013) $
+ * $Revision: 43389 $
+ * $Date: 2014-08-11 10:54:01 -0500 (Mon, 11 Aug 2014) $
*/
@@ -19,14 +19,15 @@
#include "kmp_itt.h"
#include "kmp_i18n.h"
#include "kmp_io.h"
+#include "kmp_wait_release.h"
/* ----------------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------------------- */
-/* This code is related to NtQuerySystemInformation() function. This function
- is used in the Load balance algorithm for OMP_DYNAMIC=true to find the
+/* This code is related to NtQuerySystemInformation() function. This function
+ is used in the Load balance algorithm for OMP_DYNAMIC=true to find the
number of running threads in the system. */
#include <ntstatus.h>
@@ -140,32 +141,6 @@ static HMODULE kernel32 = NULL;
/* ----------------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------------------- */
-
-// Why do we have multiple copies of __kmp_static_delay() and __kmp_static_yield() in many files?
-#ifdef KMP_DEBUG
-
-static void
-__kmp_static_delay( int arg ) {
- /* Work around weird code-gen bug that causes assert to trip */
- #if KMP_ARCH_X86_64 && KMP_OS_LINUX
- KMP_ASSERT( arg != 0 );
- #else
- KMP_ASSERT( arg >= 0 );
- #endif
-}
-
-#else
-
- #define __kmp_static_delay( arg ) /* nothing to do */
-
-#endif /* KMP_DEBUG */
-
-static void
-__kmp_static_yield( int arg )
-{
- __kmp_yield( arg );
-}
-
#if KMP_HANDLE_SIGNALS
typedef void (* sig_func_t )( int );
static sig_func_t __kmp_sighldrs[ NSIG ];
@@ -367,62 +342,50 @@ __kmp_suspend_uninitialize_thread( kmp_info_t *th )
}
}
-/*
- * This routine puts the calling thread to sleep after setting the
- * sleep bit for the indicated spin variable to true.
+/* This routine puts the calling thread to sleep after setting the
+ * sleep bit for the indicated flag variable to true.
*/
-
-void
-__kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker )
+template <class C>
+static inline void __kmp_suspend_template( int th_gtid, C *flag )
{
kmp_info_t *th = __kmp_threads[th_gtid];
int status;
- kmp_uint old_spin;
+ typename C::flag_t old_spin;
- KF_TRACE( 30, ("__kmp_suspend: T#%d enter for spin = %p\n", th_gtid, spinner ) );
+ KF_TRACE( 30, ("__kmp_suspend_template: T#%d enter for flag's loc(%p)\n", th_gtid, flag->get() ) );
__kmp_suspend_initialize_thread( th );
-
__kmp_win32_mutex_lock( &th->th.th_suspend_mx );
- KF_TRACE( 10, ( "__kmp_suspend: T#%d setting sleep bit for spin(%p)\n",
- th_gtid, spinner ) );
+ KF_TRACE( 10, ( "__kmp_suspend_template: T#%d setting sleep bit for flag's loc(%p)\n",
+ th_gtid, flag->get() ) );
/* TODO: shouldn't this use release semantics to ensure that __kmp_suspend_initialize_thread
gets called first?
*/
- old_spin = KMP_TEST_THEN_OR32( (volatile kmp_int32 *) spinner,
- KMP_BARRIER_SLEEP_STATE );
+ old_spin = flag->set_sleeping();
- KF_TRACE( 5, ( "__kmp_suspend: T#%d set sleep bit for spin(%p)==%d\n",
- th_gtid, spinner, *spinner ) );
+ KF_TRACE( 5, ( "__kmp_suspend_template: T#%d set sleep bit for flag's loc(%p)==%d\n",
+ th_gtid, flag->get(), *(flag->get()) ) );
- if ( old_spin == checker ) {
- KMP_TEST_THEN_AND32( (volatile kmp_int32 *) spinner, ~(KMP_BARRIER_SLEEP_STATE) );
-
- KF_TRACE( 5, ( "__kmp_suspend: T#%d false alarm, reset sleep bit for spin(%p)\n",
- th_gtid, spinner) );
+ if ( flag->done_check_val(old_spin) ) {
+ old_spin = flag->unset_sleeping();
+ KF_TRACE( 5, ( "__kmp_suspend_template: T#%d false alarm, reset sleep bit for flag's loc(%p)\n",
+ th_gtid, flag->get()) );
} else {
#ifdef DEBUG_SUSPEND
__kmp_suspend_count++;
#endif
-
/* Encapsulate in a loop as the documentation states that this may
* "with low probability" return when the condition variable has
* not been signaled or broadcast
*/
int deactivated = FALSE;
- TCW_PTR(th->th.th_sleep_loc, spinner);
- while ( TCR_4( *spinner ) & KMP_BARRIER_SLEEP_STATE ) {
-
- KF_TRACE( 15, ("__kmp_suspend: T#%d about to perform kmp_win32_cond_wait()\n",
+ TCW_PTR(th->th.th_sleep_loc, (void *)flag);
+ while ( flag->is_sleeping() ) {
+ KF_TRACE( 15, ("__kmp_suspend_template: T#%d about to perform kmp_win32_cond_wait()\n",
th_gtid ) );
-
-
- //
- // Mark the thread as no longer active
- // (only in the first iteration of the loop).
- //
+ // Mark the thread as no longer active (only in the first iteration of the loop).
if ( ! deactivated ) {
th->th.th_active = FALSE;
if ( th->th.th_active_in_pool ) {
@@ -441,17 +404,14 @@ __kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker )
}
#ifdef KMP_DEBUG
- if( (*spinner) & KMP_BARRIER_SLEEP_STATE ) {
- KF_TRACE( 100, ("__kmp_suspend: T#%d spurious wakeup\n", th_gtid ));
+ if( flag->is_sleeping() ) {
+ KF_TRACE( 100, ("__kmp_suspend_template: T#%d spurious wakeup\n", th_gtid ));
}
#endif /* KMP_DEBUG */
- } // while
+ } // while
- //
- // Mark the thread as active again
- // (if it was previous marked as inactive)
- //
+ // Mark the thread as active again (if it was previous marked as inactive)
if ( deactivated ) {
th->th.th_active = TRUE;
if ( TCR_4(th->th.th_in_pool) ) {
@@ -465,66 +425,82 @@ __kmp_suspend( int th_gtid, volatile kmp_uint *spinner, kmp_uint checker )
__kmp_win32_mutex_unlock( &th->th.th_suspend_mx );
- KF_TRACE( 30, ("__kmp_suspend: T#%d exit\n", th_gtid ) );
+ KF_TRACE( 30, ("__kmp_suspend_template: T#%d exit\n", th_gtid ) );
}
+void __kmp_suspend_32(int th_gtid, kmp_flag_32 *flag) {
+ __kmp_suspend_template(th_gtid, flag);
+}
+void __kmp_suspend_64(int th_gtid, kmp_flag_64 *flag) {
+ __kmp_suspend_template(th_gtid, flag);
+}
+void __kmp_suspend_oncore(int th_gtid, kmp_flag_oncore *flag) {
+ __kmp_suspend_template(th_gtid, flag);
+}
+
+
/* This routine signals the thread specified by target_gtid to wake up
- * after setting the sleep bit indicated by the spin argument to FALSE
+ * after setting the sleep bit indicated by the flag argument to FALSE
*/
-void
-__kmp_resume( int target_gtid, volatile kmp_uint *spin )
+template <class C>
+static inline void __kmp_resume_template( int target_gtid, C *flag )
{
kmp_info_t *th = __kmp_threads[target_gtid];
int status;
- kmp_uint32 old_spin;
#ifdef KMP_DEBUG
int gtid = TCR_4(__kmp_init_gtid) ? __kmp_get_gtid() : -1;
#endif
- KF_TRACE( 30, ( "__kmp_resume: T#%d wants to wakeup T#%d enter\n",
- gtid, target_gtid ) );
+ KF_TRACE( 30, ( "__kmp_resume_template: T#%d wants to wakeup T#%d enter\n", gtid, target_gtid ) );
__kmp_suspend_initialize_thread( th );
-
__kmp_win32_mutex_lock( &th->th.th_suspend_mx );
- if ( spin == NULL ) {
- spin = (volatile kmp_uint *)TCR_PTR(th->th.th_sleep_loc);
- if ( spin == NULL ) {
- KF_TRACE( 5, ( "__kmp_resume: T#%d exiting, thread T#%d already awake - spin(%p)\n",
- gtid, target_gtid, spin ) );
-
- __kmp_win32_mutex_unlock( &th->th.th_suspend_mx );
- return;
- }
+ if (!flag) {
+ flag = (C *)th->th.th_sleep_loc;
}
- TCW_PTR(th->th.th_sleep_loc, NULL);
- old_spin = KMP_TEST_THEN_AND32( (kmp_int32 volatile *) spin, ~( KMP_BARRIER_SLEEP_STATE ) );
-
- if ( ( old_spin & KMP_BARRIER_SLEEP_STATE ) == 0 ) {
- KF_TRACE( 5, ( "__kmp_resume: T#%d exiting, thread T#%d already awake - spin(%p): "
- "%u => %u\n",
- gtid, target_gtid, spin, old_spin, *spin ) );
-
+ if (!flag) {
+ KF_TRACE( 5, ( "__kmp_resume_template: T#%d exiting, thread T#%d already awake: flag's loc(%p)\n",
+ gtid, target_gtid, NULL ) );
__kmp_win32_mutex_unlock( &th->th.th_suspend_mx );
return;
}
+ else {
+ typename C::flag_t old_spin = flag->unset_sleeping();
+ if ( !flag->is_sleeping_val(old_spin) ) {
+ KF_TRACE( 5, ( "__kmp_resume_template: T#%d exiting, thread T#%d already awake: flag's loc(%p): "
+ "%u => %u\n",
+ gtid, target_gtid, flag->get(), old_spin, *(flag->get()) ) );
+ __kmp_win32_mutex_unlock( &th->th.th_suspend_mx );
+ return;
+ }
+ }
TCW_PTR(th->th.th_sleep_loc, NULL);
- KF_TRACE( 5, ( "__kmp_resume: T#%d about to wakeup T#%d, reset sleep bit for spin(%p)\n",
- gtid, target_gtid, spin) );
+ KF_TRACE( 5, ( "__kmp_resume_template: T#%d about to wakeup T#%d, reset sleep bit for flag's loc(%p)\n",
+ gtid, target_gtid, flag->get() ) );
__kmp_win32_cond_signal( &th->th.th_suspend_cv );
-
__kmp_win32_mutex_unlock( &th->th.th_suspend_mx );
- KF_TRACE( 30, ( "__kmp_resume: T#%d exiting after signaling wake up for T#%d\n",
+ KF_TRACE( 30, ( "__kmp_resume_template: T#%d exiting after signaling wake up for T#%d\n",
gtid, target_gtid ) );
}
+void __kmp_resume_32(int target_gtid, kmp_flag_32 *flag) {
+ __kmp_resume_template(target_gtid, flag);
+}
+void __kmp_resume_64(int target_gtid, kmp_flag_64 *flag) {
+ __kmp_resume_template(target_gtid, flag);
+}
+void __kmp_resume_oncore(int target_gtid, kmp_flag_oncore *flag) {
+ __kmp_resume_template(target_gtid, flag);
+}
+
+
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
@@ -582,7 +558,6 @@ __kmp_get_proc_group( kmp_affin_mask_t const *mask )
{
int i;
int group = -1;
- struct GROUP_AFFINITY new_ga, prev_ga;
for (i = 0; i < __kmp_num_proc_groups; i++) {
if (mask[i] == 0) {
continue;
@@ -607,7 +582,7 @@ __kmp_set_system_affinity( kmp_affin_mask_t const *mask, int abort_on_error )
//
// Check for a valid mask.
//
- struct GROUP_AFFINITY ga;
+ GROUP_AFFINITY ga;
int group = __kmp_get_proc_group( mask );
if (group < 0) {
if (abort_on_error) {
@@ -620,9 +595,9 @@ __kmp_set_system_affinity( kmp_affin_mask_t const *mask, int abort_on_error )
// Transform the bit vector into a GROUP_AFFINITY struct
// and make the system call to set affinity.
//
- ga.group = group;
- ga.mask = mask[group];
- ga.reserved[0] = ga.reserved[1] = ga.reserved[2] = 0;
+ ga.Group = group;
+ ga.Mask = mask[group];
+ ga.Reserved[0] = ga.Reserved[1] = ga.Reserved[2] = 0;
KMP_DEBUG_ASSERT(__kmp_SetThreadGroupAffinity != NULL);
if (__kmp_SetThreadGroupAffinity(GetCurrentThread(), &ga, NULL) == 0) {
@@ -667,7 +642,7 @@ __kmp_get_system_affinity( kmp_affin_mask_t *mask, int abort_on_error )
if (__kmp_num_proc_groups > 1) {
KMP_CPU_ZERO(mask);
- struct GROUP_AFFINITY ga;
+ GROUP_AFFINITY ga;
KMP_DEBUG_ASSERT(__kmp_GetThreadGroupAffinity != NULL);
if (__kmp_GetThreadGroupAffinity(GetCurrentThread(), &ga) == 0) {
@@ -683,12 +658,12 @@ __kmp_get_system_affinity( kmp_affin_mask_t *mask, int abort_on_error )
return error;
}
- if ((ga.group < 0) || (ga.group > __kmp_num_proc_groups)
- || (ga.mask == 0)) {
+ if ((ga.Group < 0) || (ga.Group > __kmp_num_proc_groups)
+ || (ga.Mask == 0)) {
return -1;
}
- mask[ga.group] = ga.mask;
+ mask[ga.Group] = ga.Mask;
}
else
@@ -750,12 +725,12 @@ __kmp_affinity_bind_thread( int proc )
// Form the GROUP_AFFINITY struct directly, rather than filling
// out a bit vector and calling __kmp_set_system_affinity().
//
- struct GROUP_AFFINITY ga;
+ GROUP_AFFINITY ga;
KMP_DEBUG_ASSERT((proc >= 0) && (proc < (__kmp_num_proc_groups
* CHAR_BIT * sizeof(DWORD_PTR))));
- ga.group = proc / (CHAR_BIT * sizeof(DWORD_PTR));
- ga.mask = (unsigned long long)1 << (proc % (CHAR_BIT * sizeof(DWORD_PTR)));
- ga.reserved[0] = ga.reserved[1] = ga.reserved[2] = 0;
+ ga.Group = proc / (CHAR_BIT * sizeof(DWORD_PTR));
+ ga.Mask = (unsigned long long)1 << (proc % (CHAR_BIT * sizeof(DWORD_PTR)));
+ ga.Reserved[0] = ga.Reserved[1] = ga.Reserved[2] = 0;
KMP_DEBUG_ASSERT(__kmp_SetThreadGroupAffinity != NULL);
if (__kmp_SetThreadGroupAffinity(GetCurrentThread(), &ga, NULL) == 0) {
@@ -875,7 +850,7 @@ __kmp_runtime_initialize( void )
#endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
/* Set up minimum number of threads to switch to TLS gtid */
- #if KMP_OS_WINDOWS && ! defined GUIDEDLL_EXPORTS
+ #if KMP_OS_WINDOWS && ! defined GUIDEDLL_EXPORTS
// Windows* OS, static library.
/*
New thread may use stack space previously used by another thread, currently terminated.
@@ -977,7 +952,7 @@ __kmp_runtime_initialize( void )
// See if group affinity is supported on this system.
// If so, calculate the #groups and #procs.
//
- // Group affinity was introduced with Windows* 7 OS and
+ // Group affinity was introduced with Windows* 7 OS and
// Windows* Server 2008 R2 OS.
//
if ( ( __kmp_GetActiveProcessorCount != NULL )
@@ -1368,11 +1343,11 @@ __kmp_create_worker( int gtid, kmp_info_t *th, size_t stack_size )
{
kmp_thread_t handle;
DWORD idThread;
-
+
KA_TRACE( 10, ("__kmp_create_worker: try to create thread (%d)\n", gtid ) );
-
+
th->th.th_info.ds.ds_gtid = gtid;
-
+
if ( KMP_UBER_GTID(gtid) ) {
int stack_data;
@@ -1411,12 +1386,12 @@ __kmp_create_worker( int gtid, kmp_info_t *th, size_t stack_size )
/* Set stack size for this thread now. */
KA_TRACE( 10, ( "__kmp_create_worker: stack_size = %" KMP_SIZE_T_SPEC
" bytes\n", stack_size ) );
-
+
stack_size += gtid * __kmp_stkoffset;
-
+
TCW_PTR(th->th.th_info.ds.ds_stacksize, stack_size);
TCW_4(th->th.th_info.ds.ds_stackgrow, FALSE);
-
+
KA_TRACE( 10, ( "__kmp_create_worker: (before) stack_size = %"
KMP_SIZE_T_SPEC
" bytes, &__kmp_launch_worker = %p, th = %p, "
@@ -1424,13 +1399,13 @@ __kmp_create_worker( int gtid, kmp_info_t *th, size_t stack_size )
(SIZE_T) stack_size,
(LPTHREAD_START_ROUTINE) & __kmp_launch_worker,
(LPVOID) th, &idThread ) );
-
+
{
handle = CreateThread( NULL, (SIZE_T) stack_size,
(LPTHREAD_START_ROUTINE) __kmp_launch_worker,
(LPVOID) th, STACK_SIZE_PARAM_IS_A_RESERVATION, &idThread );
}
-
+
KA_TRACE( 10, ( "__kmp_create_worker: (after) stack_size = %"
KMP_SIZE_T_SPEC
" bytes, &__kmp_launch_worker = %p, th = %p, "
@@ -1438,7 +1413,7 @@ __kmp_create_worker( int gtid, kmp_info_t *th, size_t stack_size )
(SIZE_T) stack_size,
(LPTHREAD_START_ROUTINE) & __kmp_launch_worker,
(LPVOID) th, idThread, handle ) );
-
+
{
if ( handle == 0 ) {
DWORD error = GetLastError();
@@ -1454,7 +1429,7 @@ __kmp_create_worker( int gtid, kmp_info_t *th, size_t stack_size )
}
KMP_MB(); /* Flush all pending memory write invalidates. */
}
-
+
KA_TRACE( 10, ("__kmp_create_worker: done creating thread (%d)\n", gtid ) );
}
@@ -1601,7 +1576,6 @@ __kmp_reap_common( kmp_info_t * th )
KMP_FSYNC_SPIN_PREPARE( obj );
#endif /* USE_ITT_BUILD */
__kmp_is_thread_alive( th, &exit_val );
- __kmp_static_delay( TRUE );
KMP_YIELD( TCR_4(__kmp_nth) > __kmp_avail_proc );
KMP_YIELD_SPIN( spins );
} while ( exit_val == STILL_ACTIVE && TCR_4( th->th.th_info.ds.ds_alive ) );
diff --git a/openmp/runtime/tools/check-depends.pl b/openmp/runtime/tools/check-depends.pl
index cce111f3c52..2a8de56604a 100755
--- a/openmp/runtime/tools/check-depends.pl
+++ b/openmp/runtime/tools/check-depends.pl
@@ -272,6 +272,8 @@ sub get_deps_link($) {
} elsif ( $line =~ m{^\s*-+\s*$} ) {
} elsif ( $line =~ m{^\s*/alternatename\:.*$} ) {
} elsif ( $line =~ m{^\s*$} ) {
+ } elsif ( $line =~ m{^\s*/FAILIFMISMATCH\:.*$} ) {
+ # This directive is produced only by _MSC_VER=1600
} elsif ( $line =~ m{^\s*Summary\s*$} ) {
last;
} else {
diff --git a/openmp/runtime/tools/check-tools.pl b/openmp/runtime/tools/check-tools.pl
index f36d51a1f5b..ae7fb72ac79 100755
--- a/openmp/runtime/tools/check-tools.pl
+++ b/openmp/runtime/tools/check-tools.pl
@@ -296,9 +296,14 @@ sub get_clang_compiler_version($) {
$rc = run( [ $tool, "--version" ], $stdout, $stderr );
if ( $rc >= 0 ) {
my ( $ver, $bld );
- if ( $target_os eq "mac" and $stdout =~ m{^.*? (\d+\.\d+) \(.*-(\d+\.\d+\.\d+)\)}m ) {
+ if ( $target_os eq "mac" ) {
# Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
+ $stdout =~ m{^.*? (\d+\.\d+) \(.*-(\d+\.\d+\.\d+)\)}m;
( $ver, $bld ) = ( $1, $2 );
+ # For custom clang versions.
+ if ( not defined($ver) and $stdout =~ m{^.*? (\d+\.\d+)( \((.*)\))?}m ) {
+ ( $ver, $bld ) = ( $1, $3 );
+ }
} else {
if ( 0 ) {
} elsif ( $stdout =~ m{^.*? (\d+\.\d+)( \((.*)\))?}m ) {
@@ -322,7 +327,7 @@ sub get_ms_compiler_version() {
my $tool = "cl";
my ( @ret ) = ( $tool );
my $mc_archs = {
- qr{80x86} => "IA-32 architecture",
+ qr{80x86|x86} => "IA-32 architecture",
qr{AMD64|x64} => "Intel(R) 64",
};
$rc = run( [ $tool ], $stdout, $stderr );
@@ -426,13 +431,14 @@ if ( $intel ) {
};
}; # if
if ( $target_os eq "lin" or $target_os eq "mac" ) {
- if ( $clang ) {
+ # check for clang/gnu tools because touch-test.c is compiled with them.
+ if ( $clang or $target_os eq "mac" ) { # OS X* >= 10.9 discarded GNU compilers.
push( @versions, [ "Clang C Compiler", get_clang_compiler_version( $clang_compilers->{ $target_os }->{ c } ) ] );
push( @versions, [ "Clang C++ Compiler", get_clang_compiler_version( $clang_compilers->{ $target_os }->{ cpp } ) ] );
} else {
push( @versions, [ "GNU C Compiler", get_gnu_compiler_version( $gnu_compilers->{ $target_os }->{ c } ) ] );
push( @versions, [ "GNU C++ Compiler", get_gnu_compiler_version( $gnu_compilers->{ $target_os }->{ cpp } ) ] );
- }; # if
+ };
# if intel fortran has been checked then gnu fortran is unnecessary
# also, if user specifies clang as build compiler, then gfortran is assumed fortran compiler
if ( $fortran and not $intel ) {
diff --git a/openmp/runtime/tools/freebsd.inc b/openmp/runtime/tools/freebsd.inc
index add7fe9d46d..7b60eec884e 100644
--- a/openmp/runtime/tools/freebsd.inc
+++ b/openmp/runtime/tools/freebsd.inc
@@ -10,4 +10,3 @@
#
include tools/linux.inc
-
diff --git a/openmp/runtime/tools/make-fat-binaries.pl b/openmp/runtime/tools/make-fat-binaries.pl
new file mode 100755
index 00000000000..fa670d6adc3
--- /dev/null
+++ b/openmp/runtime/tools/make-fat-binaries.pl
@@ -0,0 +1,234 @@
+#!/usr/bin/env perl
+
+#
+#//===----------------------------------------------------------------------===//
+#//
+#// The LLVM Compiler Infrastructure
+#//
+#// This file is dual licensed under the MIT and the University of Illinois Open
+#// Source Licenses. See LICENSE.txt for details.
+#//
+#//===----------------------------------------------------------------------===//
+#
+
+use strict;
+use warnings;
+
+use IO::Dir;
+
+use FindBin;
+use lib "$FindBin::Bin/lib";
+
+
+use tools;
+
+our $VERSION = "0.003";
+
+#
+# Subroutines.
+#
+
+sub check_dir($$) {
+
+ # Make sure a directory is a readable directory.
+
+ my ( $dir, $type ) = @_;
+
+ -e $dir or runtime_error( "Directory \"$dir\" does not exist" );
+ -d $dir or runtime_error( "\"$dir\" is not a directory" );
+ -r $dir or runtime_error( "Directory \"$dir\" is not readable" );
+
+}; # sub check_dir
+
+sub read_dir($) {
+
+ # Return list of files (not subdirectories) of specified directory.
+
+ my ( $dir ) = @_;
+ my $handle;
+ my $entry;
+ my @files;
+
+ $handle = IO::Dir->new( $dir ) or runtime_error( "Cannot open \"$dir\" directory: $!" );
+ while ( $entry = $handle->read() ) {
+ my $path = "$dir/$entry";
+ if ( $entry !~ m{\A\.} and -f $path ) {
+ push( @files, $entry );
+ }; # if
+ }; # while
+ $handle->close();
+
+ @files = sort( @files );
+ return @files;
+
+}; # sub read_dir
+
+# --------------------------------------------------------------------------------------------------
+# Main program.
+# --------------------------------------------------------------------------------------------------
+
+#
+# Parse command line.
+#
+my @dirs; # List of input directories.
+my @files; # List of files.
+my $output; # Output directory.
+
+get_options(
+ "output=s" => \$output
+);
+
+@ARGV == 0 and cmdline_error( "No input directories specified" );
+
+#
+# Check input and output directories.
+#
+
+# Make shure there is no duplicated directories.
+my %dirs;
+$dirs{ $output } = "";
+foreach my $dir ( @ARGV ) {
+ if ( exists( $dirs{ $dir } ) ) {
+ cmdline_error( "Directory \"$dir\" has already been specified" );
+ }; # if
+ $dirs{ $dir } = "";
+ push( @dirs, $dir );
+}; # foreach $dir
+undef( %dirs );
+
+# Make sure all dirs are exist, dirs, and readable.
+check_dir( $output, "output" );
+foreach my $dir ( @dirs ) {
+ check_dir( $dir, "input" );
+}; # foreach $dir
+
+# All input dirs should contain exactly the same list of files.
+my @errors;
+@files = read_dir( $dirs[ 0 ] );
+foreach my $dir ( @dirs ) {
+ my %files = map( ( $_ => 0 ), @files );
+ foreach my $file ( read_dir( $dir ) ) {
+ if ( not exists( $files{ $file } ) ) {
+ push( @errors, "Extra file: `" . cat_file( $dir, $file ) . "'." );
+ }; # if
+ $files{ $file } = 1;
+ }; # foreach $file
+ foreach my $file ( keys( %files ) ) {
+ if ( $files{ $file } == 0 ) {
+ push( @errors, "Missed file: `" . cat_file( $dir, $file ) . "'." );
+ }; # if
+ }; # foreach $file
+}; # foreach $dir
+if ( @errors ) {
+ runtime_error( @errors );
+}; # if
+
+#
+# Make fat binaries.
+#
+
+foreach my $file ( sort( @files ) ) {
+ info( "Making \"$file\"..." );
+ my $output_file = cat_file( $output, $file );
+ del_file( $output_file );
+ execute(
+ [
+ "lipo",
+ "-create",
+ "-output", $output_file,
+ map( cat_file( $_, $file ), @dirs )
+ ]
+ );
+}; # foreach $entry
+
+exit( 0 );
+
+__END__
+
+=pod
+
+=head1 NAME
+
+B<make-fat-binaries.pl> -- Make set of fat (universal) binaries.
+
+=head1 SYNOPSIS
+
+B<make-fat-binaries.pl> I<OPTION>... I<INPUT_DIR>...
+
+=head1 OPTIONS
+
+=over
+
+=item B<--output=>I<DIR>
+
+Name of output directory to place fat binaries to. Directory must exist and be writable.
+
+=item Standard Options
+
+=over
+
+=item B<--doc>
+
+=item B<--manual>
+
+Print full help message and exit.
+
+=item B<--help>
+
+Print short help message and exit.
+
+=item B<--usage>
+
+Print very short usage message and exit.
+
+=item B<--verbose>
+
+Do print informational messages.
+
+=item B<--version>
+
+Print program version and exit.
+
+=item B<--quiet>
+
+Work quiet, do not print informational messages.
+
+=back
+
+=back
+
+=head1 ARGUMENTS
+
+=over
+
+=item I<INPUT_DIR>
+
+Name of input directory to get thin files from. Directory must exist and be readable. At least one
+directory required.
+
+=back
+
+=head1 DESCRIPTION
+
+The script creates set of Mac-O fat (universal, multi-architecture) binaries from set of thin
+(single-architecture) files.
+
+The scripts reads files from input directory (or directoriers). It is assumed that one input
+directory keeps files for one architecture (e. g. i386), another directory contains files for
+another architecture (e. g. x86_64), etc. All input directories must contain the same set of files.
+The script issues an error if sets of files in input directories differ.
+
+If the script finishes successfuly, output directory will contain the set universal binaries
+built from files with the same name in input directories.
+
+=head1 EXAMPLES
+
+Get thin binaries from C<mac_32.thin/> and C<mac_32e.thin/> directories, and put fat binaries to
+C<mac.fat/> directory:
+
+ $ make-fat-binaries.pl --output=mac.fat mac_32.thin mac_32e.thin
+
+
+=cut
+
+# end of file #
diff --git a/openmp/runtime/tools/objcopy.cpp b/openmp/runtime/tools/objcopy.cpp
index afd18b02bc4..548e7f24751 100644
--- a/openmp/runtime/tools/objcopy.cpp
+++ b/openmp/runtime/tools/objcopy.cpp
@@ -1,6 +1,6 @@
/*
- * $Revision: 42181 $
- * $Date: 2013-03-26 15:04:45 -0500 (Tue, 26 Mar 2013) $
+ * $Revision: 42951 $
+ * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
*/
diff --git a/openmp/runtime/tools/src/common-checks.mk b/openmp/runtime/tools/src/common-checks.mk
index 0959fc63ebc..250eaed1903 100644
--- a/openmp/runtime/tools/src/common-checks.mk
+++ b/openmp/runtime/tools/src/common-checks.mk
@@ -32,7 +32,7 @@ ifeq "$(clean)" "" # Do not check tools if clean goal specified.
endif
endif
ifneq "$(filter gcc clang,$(c))" "" # if build compiler is gcc or clang
- check_tools_flags += --no-intel
+ check_tools_flags += --nointel
endif
ifeq "$(c)" "clang"
check_tools_flags += --clang
diff --git a/openmp/runtime/tools/src/common-tools.mk b/openmp/runtime/tools/src/common-tools.mk
index a9c9fbcee65..873ee886035 100644
--- a/openmp/runtime/tools/src/common-tools.mk
+++ b/openmp/runtime/tools/src/common-tools.mk
@@ -48,6 +48,11 @@ ifeq "$(OPTIMIZATION)" "on"
cpp-flags += -D NDEBUG
else
cpp-flags += -D _DEBUG -D BUILD_DEBUG
+ ifeq "$(os)" "win"
+ # This is forced since VS2010 tool produces inconsistent directives
+ # between objects, resulting in a link failure.
+ cpp-flags += -D _ITERATOR_DEBUG_LEVEL=0
+ endif
endif
# --- Linux* OS, Intel(R) Many Integrated Core Architecture and OS X* definitions ---
@@ -372,6 +377,11 @@ ifeq "$(os)" "win"
c-flags += -RTC1
cxx-flags += -RTC1
endif
+ # SDL (Security Development Lifecycle) flags:
+ # GS - Stack-based Buffer Overrun Detection
+ # DynamicBase - Image Randomization
+ c-flags += -GS -DynamicBase
+ cxx-flags += -GS -DynamicBase
# --- Assembler ---
ifeq "$(arch)" "32"
as = ml
@@ -385,12 +395,19 @@ ifeq "$(os)" "win"
ifneq "$(filter ml ml64,$(as))" ""
as-out = -Fo
as-flags += -nologo -c
+ # SDL (Security Development Lifecycle) flags:
+ # DynamicBase - Image Randomization
+ as-flags += -DynamicBase
endif
# --- Fortran ---
fort = ifort
fort-out = -o$(space)
fort-flags += -nologo
fort-flags += -c
+ # SDL (Security Development Lifecycle) flags:
+ # GS - Stack-based Buffer Overrun Detection
+ # DynamicBase - Image Randomization
+ fort-flags += -GS -DynamicBase
# --- Librarian ---
ar = link.exe
ar-out = -out:
@@ -433,6 +450,9 @@ ifeq "$(os)" "win"
as-flags += -safeseh
ld-flags += -safeseh
endif
+ # SDL (Security Development Lifecycle) flags:
+ # NXCompat - Data Execution Prevention
+ ld-flags += -NXCompat -DynamicBase
endif
# end of file #
OpenPOWER on IntegriCloud