From 533193402287ddccd202ed33b9a1a3f7b448475f Mon Sep 17 00:00:00 2001 From: Rafal Rudnicki Date: Wed, 23 Sep 2026 12:54:49 +0000 Subject: [PATCH 1/6] Add hwloc headers and static libs --- src/deps/hwloc/include/hwloc.h | 2878 +++++++++++++++++ src/deps/hwloc/include/hwloc/bitmap.h | 581 ++++ src/deps/hwloc/include/hwloc/cpukinds.h | 194 ++ src/deps/hwloc/include/hwloc/cuda.h | 227 ++ src/deps/hwloc/include/hwloc/cudart.h | 184 ++ src/deps/hwloc/include/hwloc/deprecated.h | 218 ++ src/deps/hwloc/include/hwloc/diff.h | 305 ++ src/deps/hwloc/include/hwloc/distances.h | 507 +++ src/deps/hwloc/include/hwloc/export.h | 287 ++ src/deps/hwloc/include/hwloc/gl.h | 138 + src/deps/hwloc/include/hwloc/glibc-sched.h | 134 + src/deps/hwloc/include/hwloc/helper.h | 1332 ++++++++ src/deps/hwloc/include/hwloc/inlines.h | 147 + src/deps/hwloc/include/hwloc/levelzero.h | 299 ++ src/deps/hwloc/include/hwloc/linux-libnuma.h | 301 ++ src/deps/hwloc/include/hwloc/linux.h | 96 + src/deps/hwloc/include/hwloc/memattrs.h | 672 ++++ src/deps/hwloc/include/hwloc/nvml.h | 185 ++ src/deps/hwloc/include/hwloc/opencl.h | 278 ++ .../hwloc/include/hwloc/openfabrics-verbs.h | 156 + src/deps/hwloc/include/hwloc/plugins.h | 704 ++++ src/deps/hwloc/include/hwloc/rename.h | 923 ++++++ src/deps/hwloc/include/hwloc/rsmi.h | 207 ++ src/deps/hwloc/include/hwloc/shmem.h | 143 + src/deps/hwloc/linux/build_hwloc.sh | 62 + .../linux/include/hwloc/autogen/config.h | 243 ++ src/deps/hwloc/linux/libhwloc.a | Bin 0 -> 740764 bytes src/deps/hwloc/windows/hwloc.lib | Bin 0 -> 1024120 bytes .../windows/include/hwloc/autogen/config.h | 60 + 29 files changed, 11461 insertions(+) create mode 100644 src/deps/hwloc/include/hwloc.h create mode 100644 src/deps/hwloc/include/hwloc/bitmap.h create mode 100644 src/deps/hwloc/include/hwloc/cpukinds.h create mode 100644 src/deps/hwloc/include/hwloc/cuda.h create mode 100644 src/deps/hwloc/include/hwloc/cudart.h create mode 100644 src/deps/hwloc/include/hwloc/deprecated.h create mode 100644 src/deps/hwloc/include/hwloc/diff.h create mode 100644 src/deps/hwloc/include/hwloc/distances.h create mode 100644 src/deps/hwloc/include/hwloc/export.h create mode 100644 src/deps/hwloc/include/hwloc/gl.h create mode 100644 src/deps/hwloc/include/hwloc/glibc-sched.h create mode 100644 src/deps/hwloc/include/hwloc/helper.h create mode 100644 src/deps/hwloc/include/hwloc/inlines.h create mode 100644 src/deps/hwloc/include/hwloc/levelzero.h create mode 100644 src/deps/hwloc/include/hwloc/linux-libnuma.h create mode 100644 src/deps/hwloc/include/hwloc/linux.h create mode 100644 src/deps/hwloc/include/hwloc/memattrs.h create mode 100644 src/deps/hwloc/include/hwloc/nvml.h create mode 100644 src/deps/hwloc/include/hwloc/opencl.h create mode 100644 src/deps/hwloc/include/hwloc/openfabrics-verbs.h create mode 100644 src/deps/hwloc/include/hwloc/plugins.h create mode 100644 src/deps/hwloc/include/hwloc/rename.h create mode 100644 src/deps/hwloc/include/hwloc/rsmi.h create mode 100644 src/deps/hwloc/include/hwloc/shmem.h create mode 100755 src/deps/hwloc/linux/build_hwloc.sh create mode 100644 src/deps/hwloc/linux/include/hwloc/autogen/config.h create mode 100644 src/deps/hwloc/linux/libhwloc.a create mode 100644 src/deps/hwloc/windows/hwloc.lib create mode 100644 src/deps/hwloc/windows/include/hwloc/autogen/config.h diff --git a/src/deps/hwloc/include/hwloc.h b/src/deps/hwloc/include/hwloc.h new file mode 100644 index 000000000..155e45f5b --- /dev/null +++ b/src/deps/hwloc/include/hwloc.h @@ -0,0 +1,2878 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2025 Inria. All rights reserved. + * Copyright © 2009-2012 Université Bordeaux + * Copyright © 2009-2020 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/*===================================================================== + * PLEASE GO READ THE DOCUMENTATION! + * ------------------------------------------------ + * $tarball_directory/doc/doxygen-doc/ + * or + * https://www.open-mpi.org/projects/hwloc/doc/ + *===================================================================== + * + * FAIR WARNING: Do NOT expect to be able to figure out all the + * subtleties of hwloc by simply reading function prototypes and + * constant descrptions here in this file. + * + * Hwloc has wonderful documentation in both PDF and HTML formats for + * your reading pleasure. The formal documentation explains a LOT of + * hwloc-specific concepts, provides definitions, and discusses the + * "big picture" for many of the things that you'll find here in this + * header file. + * + * The PDF/HTML documentation was generated via Doxygen; much of what + * you'll see in there is also here in this file. BUT THERE IS A LOT + * THAT IS IN THE PDF/HTML THAT IS ***NOT*** IN hwloc.h! + * + * There are entire paragraph-length descriptions, discussions, and + * pretty pictures to explain subtle corner cases, provide concrete + * examples, etc. + * + * Please, go read the documentation. :-) + * + * Moreover there are several examples of hwloc use under doc/examples + * in the source tree. + * + *=====================================================================*/ + +/** \file + * \brief The hwloc API. + * + * See hwloc/bitmap.h for bitmap specific macros. + * See hwloc/helper.h for high-level topology traversal helpers. + * See hwloc/inlines.h for the actual inline code of some functions below. + * See hwloc/export.h for exporting topologies to XML or to synthetic descriptions. + * See hwloc/distances.h for querying and modifying distances between objects. + * See hwloc/memattrs.h for querying and modifying memory attributes such as Bandwidth. + * See hwloc/cpukinds.h for querying and modifying kinds of CPU cores. + * See hwloc/diff.h for manipulating differences between similar topologies. + */ + +#ifndef HWLOC_H +#define HWLOC_H + +#include "hwloc/autogen/config.h" + +#include +#include +#include +#include + +/* + * Symbol transforms + */ +#include "hwloc/rename.h" + +/* + * Bitmap definitions + */ + +#include "hwloc/bitmap.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_api_error_reporting Error reporting in the API + * @{ + * Most functions in the hwloc API return an integer value. + * Unless documentated differently, they return 0 on success + * and -1 on error. + * Functions that return a pointer type return \c NULL on error. + * + * \p errno will be set to a meaningful value whenever possible. + * This includes the usual \c EINVAL when invalid function parameters are passed + * or \c ENOMEM when an internal allocation fails. + * Some specific \c errno value are also used, for instance for binding + * errors as documented in \ref hwlocality_cpubinding. + * + * Some modules describe return values of their functions + * in their introduction, for instance in \ref hwlocality_bitmap. + * @} + */ + + +/** \defgroup hwlocality_api_version API version + * @{ + */ + +/** \brief Indicate at build time which hwloc API version is being used. + * + * This number is updated to (X<<16)+(Y<<8)+Z when a new release X.Y.Z + * actually modifies the API. + * + * Users may check for available features at build time using this number + * (see \ref faq_version_api). + * + * \note This should not be confused with HWLOC_VERSION, the library version. + * Two stable releases of the same series usually have the same ::HWLOC_API_VERSION + * even if their HWLOC_VERSION are different. + */ +#define HWLOC_API_VERSION 0x00020c00 + +/** \brief Indicate at runtime which hwloc API version was used at build time. + * + * Should be ::HWLOC_API_VERSION if running on the same version. + * + * \return the build-time version number. + */ +HWLOC_DECLSPEC unsigned hwloc_get_api_version(void); + +/** \brief Current component and plugin ABI version (see hwloc/plugins.h) */ +#define HWLOC_COMPONENT_ABI 7 + +/** @} */ + + + +/** \defgroup hwlocality_object_sets Object Sets (hwloc_cpuset_t and hwloc_nodeset_t) + * + * Hwloc uses bitmaps to represent two distinct kinds of object sets: + * CPU sets (::hwloc_cpuset_t) and NUMA node sets (::hwloc_nodeset_t). + * These types are both typedefs to a common back end type + * (::hwloc_bitmap_t), and therefore all the hwloc bitmap functions + * are applicable to both ::hwloc_cpuset_t and ::hwloc_nodeset_t (see + * \ref hwlocality_bitmap). + * + * The rationale for having two different types is that even though + * the actions one wants to perform on these types are the same (e.g., + * enable and disable individual items in the set/mask), they're used + * in very different contexts: one for specifying which processors to + * use and one for specifying which NUMA nodes to use. Hence, the + * name difference is really just to reflect the intent of where the + * type is used. + * + * @{ + */ + +/** \brief A CPU set is a bitmap whose bits are set according to CPU + * physical OS indexes. + * + * It may be consulted and modified with the bitmap API as any + * ::hwloc_bitmap_t (see hwloc/bitmap.h). + * + * Each bit may be converted into a PU object using + * hwloc_get_pu_obj_by_os_index(). + * \sa faq_indexes + */ +typedef hwloc_bitmap_t hwloc_cpuset_t; +/** \brief A non-modifiable ::hwloc_cpuset_t. */ +typedef hwloc_const_bitmap_t hwloc_const_cpuset_t; + +/** \brief A node set is a bitmap whose bits are set according to NUMA + * memory node physical OS indexes. + * + * It may be consulted and modified with the bitmap API as any + * ::hwloc_bitmap_t (see hwloc/bitmap.h). + * Each bit may be converted into a NUMA node object using + * hwloc_get_numanode_obj_by_os_index(). + * \sa faq_indexes + * + * When binding memory on a system without any NUMA node, + * the single main memory bank is considered as NUMA node #0. + * + * See also \ref hwlocality_helper_nodeset_convert. + */ +typedef hwloc_bitmap_t hwloc_nodeset_t; +/** \brief A non-modifiable ::hwloc_nodeset_t. + */ +typedef hwloc_const_bitmap_t hwloc_const_nodeset_t; + +/** @} */ + + + +/** \defgroup hwlocality_object_types Object Types + * @{ + */ + +/** \brief Type of topology object. + * + * \note Do not rely on the ordering or completeness of the values as new ones + * may be defined in the future! If you need to compare types, use + * hwloc_compare_types() instead. + */ +typedef enum { + +/** \cond */ +#define HWLOC_OBJ_TYPE_MIN HWLOC_OBJ_MACHINE /* Sentinel value */ +/** \endcond */ + + HWLOC_OBJ_MACHINE, /**< \brief Machine. + * A set of processors and memory with cache + * coherency. + * + * This type is always used for the root object of a topology, + * and never used anywhere else. + * Hence its parent is always \c NULL. + */ + + HWLOC_OBJ_PACKAGE, /**< \brief Physical package. + * The physical package that usually gets inserted + * into a socket on the motherboard. + * A processor package usually contains multiple cores, + * and possibly some dies. + */ + HWLOC_OBJ_CORE, /**< \brief Core. + * A computation unit (may be shared by several + * PUs, aka logical processors). + */ + HWLOC_OBJ_PU, /**< \brief Processing Unit, or (Logical) Processor. + * An execution unit (may share a core with some + * other logical processors, e.g. in the case of + * an SMT core). + * + * This is the smallest object representing CPU resources, + * it cannot have any child except Misc objects. + * + * Objects of this kind are always reported and can + * thus be used as fallback when others are not. + */ + + HWLOC_OBJ_L1CACHE, /**< \brief Level 1 Data (or Unified) Cache. */ + HWLOC_OBJ_L2CACHE, /**< \brief Level 2 Data (or Unified) Cache. */ + HWLOC_OBJ_L3CACHE, /**< \brief Level 3 Data (or Unified) Cache. */ + HWLOC_OBJ_L4CACHE, /**< \brief Level 4 Data (or Unified) Cache. */ + HWLOC_OBJ_L5CACHE, /**< \brief Level 5 Data (or Unified) Cache. */ + + HWLOC_OBJ_L1ICACHE, /**< \brief Level 1 instruction Cache (filtered out by default). */ + HWLOC_OBJ_L2ICACHE, /**< \brief Level 2 instruction Cache (filtered out by default). */ + HWLOC_OBJ_L3ICACHE, /**< \brief Level 3 instruction Cache (filtered out by default). */ + + HWLOC_OBJ_GROUP, /**< \brief Group objects. + * Objects which do not fit in the above but are + * detected by hwloc and are useful to take into + * account for affinity. For instance, some operating systems + * expose their arbitrary processors aggregation this + * way. And hwloc may insert such objects to group + * NUMA nodes according to their distances. + * See also \ref faq_groups. + * + * These objects are removed when they do not bring + * any structure (see ::HWLOC_TYPE_FILTER_KEEP_STRUCTURE). + */ + + HWLOC_OBJ_NUMANODE, /**< \brief NUMA node. + * An object that contains memory that is directly + * and byte-accessible to the host processors. + * It is usually close to some cores (the corresponding objects + * are descendants of the NUMA node object in the hwloc tree). + * + * This is the smallest object representing Memory resources, + * it cannot have any child except Misc objects. + * However it may have Memory-side cache parents. + * + * NUMA nodes may correspond to different kinds of memory + * (DRAM, HBM, CXL-DRAM, etc.). When hwloc is able to guess + * that kind, it is specified in the subtype field of the object. + * See also \ref attributes_normal in the main documentation. + * + * There is always at least one such object in the topology + * even if the machine is not NUMA. + * + * Memory objects are not listed in the main children list, + * but rather in the dedicated Memory children list. + * + * NUMA nodes have a special depth ::HWLOC_TYPE_DEPTH_NUMANODE + * instead of a normal depth just like other objects in the + * main tree. + */ + + HWLOC_OBJ_BRIDGE, /**< \brief Bridge (filtered out by default). + * Any bridge (or PCI switch) that connects the host or an I/O bus, + * to another I/O bus. + * + * Bridges are not added to the topology unless their + * filtering is changed (see hwloc_topology_set_type_filter() + * and hwloc_topology_set_io_types_filter()). + * + * I/O objects are not listed in the main children list, + * but rather in the dedicated io children list. + * I/O objects have NULL CPU and node sets. + */ + HWLOC_OBJ_PCI_DEVICE, /**< \brief PCI device (filtered out by default). + * + * PCI devices are not added to the topology unless their + * filtering is changed (see hwloc_topology_set_type_filter() + * and hwloc_topology_set_io_types_filter()). + * + * I/O objects are not listed in the main children list, + * but rather in the dedicated io children list. + * I/O objects have NULL CPU and node sets. + */ + HWLOC_OBJ_OS_DEVICE, /**< \brief Operating system device (filtered out by default). + * + * OS devices are not added to the topology unless their + * filtering is changed (see hwloc_topology_set_type_filter() + * and hwloc_topology_set_io_types_filter()). + * + * I/O objects are not listed in the main children list, + * but rather in the dedicated io children list. + * I/O objects have NULL CPU and node sets. + */ + + HWLOC_OBJ_MISC, /**< \brief Miscellaneous objects (filtered out by default). + * Objects without particular meaning, that can e.g. be + * added by the application for its own use, or by hwloc + * for miscellaneous objects such as MemoryModule (DIMMs). + * + * They are not added to the topology unless their filtering + * is changed (see hwloc_topology_set_type_filter()). + * + * These objects are not listed in the main children list, + * but rather in the dedicated misc children list. + * Misc objects may only have Misc objects as children, + * and those are in the dedicated misc children list as well. + * Misc objects have NULL CPU and node sets. + */ + + HWLOC_OBJ_MEMCACHE, /**< \brief Memory-side cache (filtered out by default). + * A cache in front of a specific NUMA node. + * + * This object always has at least one NUMA node as a memory child. + * + * Memory objects are not listed in the main children list, + * but rather in the dedicated Memory children list. + * + * Memory-side cache have a special depth ::HWLOC_TYPE_DEPTH_MEMCACHE + * instead of a normal depth just like other objects in the + * main tree. + */ + + HWLOC_OBJ_DIE, /**< \brief Die within a physical package. + * A subpart of the physical package, that contains multiple cores. + * + * Some operating systems (e.g. Linux) may expose a single die per package + * even if the hardware does not support dies at all. To avoid showing + * such non-existing dies, hwloc will filter them out if all of them are + * identical to packages. + * This is functionally equivalent to ::HWLOC_TYPE_FILTER_KEEP_STRUCTURE + * being enforced for Dies versus Packages. + */ + + HWLOC_OBJ_TYPE_MAX /**< \private Sentinel value */ +} hwloc_obj_type_t; + +/** \brief Cache type. */ +typedef enum hwloc_obj_cache_type_e { + HWLOC_OBJ_CACHE_UNIFIED, /**< \brief Unified cache. */ + HWLOC_OBJ_CACHE_DATA, /**< \brief Data cache. */ + HWLOC_OBJ_CACHE_INSTRUCTION /**< \brief Instruction cache (filtered out by default). */ +} hwloc_obj_cache_type_t; + +/** \brief Type of one side (upstream or downstream) of an I/O bridge. */ +typedef enum hwloc_obj_bridge_type_e { + HWLOC_OBJ_BRIDGE_HOST, /**< \brief Host-side of a bridge, only possible upstream. */ + HWLOC_OBJ_BRIDGE_PCI /**< \brief PCI-side of a bridge. */ +} hwloc_obj_bridge_type_t; + +/** \brief Type of a OS device. */ +typedef enum hwloc_obj_osdev_type_e { + HWLOC_OBJ_OSDEV_BLOCK, /**< \brief Operating system block device, or non-volatile memory device. + * For instance "sda" or "dax2.0" on Linux. */ + HWLOC_OBJ_OSDEV_GPU, /**< \brief Operating system GPU device. + * For instance ":0.0" for a GL display, + * "card0" for a Linux DRM device. */ + HWLOC_OBJ_OSDEV_NETWORK, /**< \brief Operating system network device. + * For instance the "eth0" interface on Linux. */ + HWLOC_OBJ_OSDEV_OPENFABRICS, /**< \brief Operating system openfabrics device. + * For instance the "mlx4_0" InfiniBand HCA, + * "hfi1_0" Omni-Path interface, + * or "bxi0" Atos/Bull BXI HCA on Linux. */ + HWLOC_OBJ_OSDEV_DMA, /**< \brief Operating system dma engine device. + * For instance the "dma0chan0" DMA channel on Linux. */ + HWLOC_OBJ_OSDEV_COPROC /**< \brief Operating system co-processor device. + * For instance "opencl0d0" for a OpenCL device, + * "cuda0" for a CUDA device. */ +} hwloc_obj_osdev_type_t; + +/** \brief Compare the depth of two object types + * + * Types shouldn't be compared as they are, since newer ones may be added in + * the future. + * + * \return A negative integer if \p type1 objects usually include \p type2 objects. + * \return A positive integer if \p type1 objects are usually included in \p type2 objects. + * \return 0 if \p type1 and \p type2 objects are the same. + * \return ::HWLOC_TYPE_UNORDERED if objects cannot be compared + * (because neither is usually contained in the other). + * + * \note Object types containing CPUs can always be compared + * (usually, a machine contains packages, which contain caches, + * which contain cores, which contain PUs). + * + * \note ::HWLOC_OBJ_PU will always be the deepest, + * while ::HWLOC_OBJ_MACHINE is always the highest. + * + * \note This does not mean that the actual topology will respect that order: + * e.g. as of today cores may also contain caches, and packages may also contain + * nodes. This is thus just to be seen as a fallback comparison method. + */ +HWLOC_DECLSPEC int hwloc_compare_types (hwloc_obj_type_t type1, hwloc_obj_type_t type2) __hwloc_attribute_const; + +/** \brief Value returned by hwloc_compare_types() when types can not be compared. \hideinitializer */ +#define HWLOC_TYPE_UNORDERED INT_MAX + +/** @} */ + + + +/** \defgroup hwlocality_objects Object Structure and Attributes + * @{ + */ + +union hwloc_obj_attr_u; + +/** \brief Structure of a topology object + * + * Applications must not modify any field except \p hwloc_obj.userdata. + */ +struct hwloc_obj { + /* physical information */ + hwloc_obj_type_t type; /**< \brief Type of object */ + char *subtype; /**< \brief Subtype string to better describe the type field. */ + + unsigned os_index; /**< \brief OS-provided physical index number. + * It is not guaranteed unique across the entire machine, + * except for PUs and NUMA nodes. + * Set to HWLOC_UNKNOWN_INDEX if unknown or irrelevant for this object. + */ +#define HWLOC_UNKNOWN_INDEX (unsigned)-1 + + char *name; /**< \brief Object-specific name if any. + * Mostly used for identifying OS devices and Misc objects where + * a name string is more useful than numerical indexes. + */ + + hwloc_uint64_t total_memory; /**< \brief Total memory (in bytes) in NUMA nodes below this object. */ + + union hwloc_obj_attr_u *attr; /**< \brief Object type-specific Attributes, + * may be \c NULL if no attribute value was found */ + + /* global position */ + int depth; /**< \brief Vertical index in the hierarchy. + * + * For normal objects, this is the depth of the horizontal level + * that contains this object and its cousins of the same type. + * If the topology is symmetric, this is equal to the parent depth + * plus one, and also equal to the number of parent/child links + * from the root object to here. + * + * For special objects (NUMA nodes, I/O and Misc) that are not + * in the main tree, this is a special negative value that + * corresponds to their dedicated level, + * see hwloc_get_type_depth() and ::hwloc_get_type_depth_e. + * Those special values can be passed to hwloc functions such + * hwloc_get_nbobjs_by_depth() as usual. + */ + unsigned logical_index; /**< \brief Horizontal index in the whole list of similar objects, + * hence guaranteed unique across the entire machine. + * Could be a "cousin_rank" since it's the rank within the "cousin" list below + * Note that this index may change when restricting the topology + * or when inserting a group. + */ + + /* cousins are all objects of the same type (and depth) across the entire topology */ + struct hwloc_obj *next_cousin; /**< \brief Next object of same type and depth */ + struct hwloc_obj *prev_cousin; /**< \brief Previous object of same type and depth */ + + /* children of the same parent are siblings, even if they may have different type and depth */ + struct hwloc_obj *parent; /**< \brief Parent, \c NULL if root (Machine object) */ + unsigned sibling_rank; /**< \brief Index in parent's \c children[] array. Or the index in parent's Memory, I/O or Misc children list. */ + struct hwloc_obj *next_sibling; /**< \brief Next object below the same parent (inside the same list of children). */ + struct hwloc_obj *prev_sibling; /**< \brief Previous object below the same parent (inside the same list of children). */ + /** @name List and array of normal children below this object (except Memory, I/O and Misc children). */ + /**@{*/ + unsigned arity; /**< \brief Number of normal children. + * Memory, Misc and I/O children are not listed here + * but rather in their dedicated children list. + */ + struct hwloc_obj **children; /**< \brief Normal children, \c children[0 .. arity -1] */ + struct hwloc_obj *first_child; /**< \brief First normal child */ + struct hwloc_obj *last_child; /**< \brief Last normal child */ + /**@}*/ + + int symmetric_subtree; /**< \brief Set if the subtree of normal objects below this object is symmetric, + * which means all normal children and their children have identical subtrees. + * + * Memory, I/O and Misc children are ignored. + * + * If set in the topology root object, lstopo may export the topology + * as a synthetic string. + */ + + /** @name List of Memory children below this object. */ + /**@{*/ + unsigned memory_arity; /**< \brief Number of Memory children. + * These children are listed in \p memory_first_child. + */ + struct hwloc_obj *memory_first_child; /**< \brief First Memory child. + * NUMA nodes and Memory-side caches are listed here + * (\p memory_arity and \p memory_first_child) + * instead of in the normal children list. + * See also hwloc_obj_type_is_memory(). + * + * A memory hierarchy starts from a normal CPU-side object + * (e.g. Package) and ends with NUMA nodes as leaves. + * There might exist some memory-side caches between them + * in the middle of the memory subtree. + */ + /**@}*/ + + /** @name List of I/O children below this object. */ + /**@{*/ + unsigned io_arity; /**< \brief Number of I/O children. + * These children are listed in \p io_first_child. + */ + struct hwloc_obj *io_first_child; /**< \brief First I/O child. + * Bridges, PCI and OS devices are listed here (\p io_arity and \p io_first_child) + * instead of in the normal children list. + * See also hwloc_obj_type_is_io(). + */ + /**@}*/ + + /** @name List of Misc children below this object. */ + /**@{*/ + unsigned misc_arity; /**< \brief Number of Misc children. + * These children are listed in \p misc_first_child. + */ + struct hwloc_obj *misc_first_child; /**< \brief First Misc child. + * Misc objects are listed here (\p misc_arity and \p misc_first_child) + * instead of in the normal children list. + */ + /**@}*/ + + /* cpusets and nodesets */ + hwloc_cpuset_t cpuset; /**< \brief CPUs covered by this object + * + * This is the set of CPUs for which there are PU objects in the topology + * under this object, i.e. which are known to be physically contained in this + * object and known how (the children path between this object and the PU + * objects). + * + * If the ::HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED configuration flag is set, + * some of these CPUs may be online but not allowed for binding, + * see hwloc_topology_get_allowed_cpuset(). + * + * \note All objects have non-NULL CPU and node sets except Misc and I/O objects. + * + * \note Its value must not be changed, hwloc_bitmap_dup() must be used instead. + */ + hwloc_cpuset_t complete_cpuset; /**< \brief The complete CPU set of processors of this object, + * + * This may include not only the same as the cpuset field, but also some CPUs for + * which topology information is unknown or incomplete, some offlines CPUs, and + * the CPUs that are ignored when the ::HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED flag + * is not set. + * Thus no corresponding PU object may be found in the topology, because the + * precise position is undefined. It is however known that it would be somewhere + * under this object. + * + * \note Its value must not be changed, hwloc_bitmap_dup() must be used instead. + */ + + hwloc_nodeset_t nodeset; /**< \brief NUMA nodes covered by this object or containing this object + * + * This is the set of NUMA nodes for which there are NUMA node objects in the + * topology under or above this object, i.e. which are known to be physically + * contained in this object or containing it and known how (the children path + * between this object and the NUMA node objects). + * + * In the end, these nodes are those that are close to the current object. + * Function hwloc_get_local_numanode_objs() may be used to list those NUMA + * nodes more precisely. + * + * If the ::HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED configuration flag is set, + * some of these nodes may be online but not allowed for allocation, + * see hwloc_topology_get_allowed_nodeset(). + * + * If there are no NUMA nodes in the machine, all the memory is close to this + * object, so only the first bit may be set in \p nodeset. + * + * \note All objects have non-NULL CPU and node sets except Misc and I/O objects. + * + * \note Its value must not be changed, hwloc_bitmap_dup() must be used instead. + */ + hwloc_nodeset_t complete_nodeset; /**< \brief The complete NUMA node set of this object, + * + * This may include not only the same as the nodeset field, but also some NUMA + * nodes for which topology information is unknown or incomplete, some offlines + * nodes, and the nodes that are ignored when the ::HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED + * flag is not set. + * Thus no corresponding NUMA node object may be found in the topology, because the + * precise position is undefined. It is however known that it would be + * somewhere under this object. + * + * If there are no NUMA nodes in the machine, all the memory is close to this + * object, so only the first bit is set in \p complete_nodeset. + * + * \note Its value must not be changed, hwloc_bitmap_dup() must be used instead. + */ + + struct hwloc_info_s *infos; /**< \brief Array of info attributes (name and value strings). */ + unsigned infos_count; /**< \brief Size of infos array. */ + + /* misc */ + void *userdata; /**< \brief Application-given private data pointer, + * initialized to \c NULL, use it as you wish. + * See hwloc_topology_set_userdata_export_callback() in hwloc/export.h + * if you wish to export this field to XML. */ + + hwloc_uint64_t gp_index; /**< \brief Global persistent index. + * Generated by hwloc, unique across the topology (contrary to os_index) + * and persistent across topology changes (contrary to logical_index). + * Mostly used internally, but could also be used by application to identify objects. + */ +}; +/** + * \brief Convenience typedef; a pointer to a struct hwloc_obj. + */ +typedef struct hwloc_obj * hwloc_obj_t; + +/** \brief Object type-specific Attributes */ +union hwloc_obj_attr_u { + /** \brief NUMA node-specific Object Attributes */ + struct hwloc_numanode_attr_s { + hwloc_uint64_t local_memory; /**< \brief Local memory (in bytes) */ + unsigned page_types_len; /**< \brief Size of array \p page_types */ + /** \brief Array of local memory page types, \c NULL if no local memory and \p page_types is 0. + * + * The array is sorted by increasing \p size fields. + * It contains \p page_types_len slots. + */ + struct hwloc_memory_page_type_s { + hwloc_uint64_t size; /**< \brief Size of pages */ + hwloc_uint64_t count; /**< \brief Number of pages of this size */ + } * page_types; + } numanode; + + /** \brief Cache-specific Object Attributes */ + struct hwloc_cache_attr_s { + hwloc_uint64_t size; /**< \brief Size of cache in bytes */ + unsigned depth; /**< \brief Depth of cache (e.g., L1, L2, ...etc.) */ + unsigned linesize; /**< \brief Cache-line size in bytes. 0 if unknown */ + int associativity; /**< \brief Ways of associativity, + * -1 if fully associative, 0 if unknown */ + hwloc_obj_cache_type_t type; /**< \brief Cache type */ + } cache; + /** \brief Group-specific Object Attributes */ + struct hwloc_group_attr_s { + unsigned depth; /**< \brief Depth of group object. + * It may change if intermediate Group objects are added. */ + unsigned kind; /**< \brief Internally-used kind of group. */ + unsigned subkind; /**< \brief Internally-used subkind to distinguish different levels of groups with same kind */ + unsigned char dont_merge; /**< \brief Flag preventing groups from being automatically merged with identical parent or children. */ + } group; + /** \brief PCI Device specific Object Attributes */ + struct hwloc_pcidev_attr_s { +#ifndef HWLOC_HAVE_32BITS_PCI_DOMAIN + unsigned short domain; /**< \brief Domain number (xxxx in the PCI BDF notation xxxx:yy:zz.t). + * Only 16bits PCI domains are supported by default. */ +#else + unsigned int domain; /**< \brief Domain number (xxxx in the PCI BDF notation xxxx:yy:zz.t). + * 32bits PCI domain support break the library ABI, hence it's disabled by default. */ +#endif + unsigned char bus; /**< \brief Bus number (yy in the PCI BDF notation xxxx:yy:zz.t). */ + unsigned char dev; /**< \brief Device number (zz in the PCI BDF notation xxxx:yy:zz.t). */ + unsigned char func; /**< \brief Function number (t in the PCI BDF notation xxxx:yy:zz.t). */ + unsigned short class_id; /**< \brief The class number (first two bytes, without the prog_if). */ + unsigned short vendor_id; /**< \brief Vendor ID (xxxx in [xxxx:yyyy]). */ + unsigned short device_id; /**< \brief Device ID (yyyy in [xxxx:yyyy]). */ + unsigned short subvendor_id; /**< \brief Sub-Vendor ID. */ + unsigned short subdevice_id; /**< \brief Sub-Device ID. */ + unsigned char revision; /**< \brief Revision number. */ + float linkspeed; /**< \brief Link speed in GB/s. + * This datarate is the currently configured speed of the entire PCI link + * (sum of the bandwidth of all PCI lanes in that link). + * It may change during execution since some devices are able to + * slow their PCI links down when idle. + */ + } pcidev; + /** \brief Bridge specific Object Attributes */ + struct hwloc_bridge_attr_s { + union { + struct hwloc_pcidev_attr_s pci; /**< \brief PCI attribute of the upstream part as a PCI device. */ + } upstream; + hwloc_obj_bridge_type_t upstream_type; /**< \brief Upstream Bridge type. */ + union { + struct { +#ifndef HWLOC_HAVE_32BITS_PCI_DOMAIN + unsigned short domain; /**< \brief Domain number the downstream PCI buses. + * Only 16bits PCI domains are supported by default. */ +#else + unsigned int domain; /**< \brief Domain number the downstream PCI buses. + * 32bits PCI domain support break the library ABI, hence it's disabled by default */ +#endif + unsigned char secondary_bus; /**< \brief First PCI bus number below the bridge. */ + unsigned char subordinate_bus; /**< \brief Highest PCI bus number below the bridge. */ + } pci; + } downstream; + hwloc_obj_bridge_type_t downstream_type; /**< \brief Downstream Bridge type. */ + unsigned depth; + } bridge; + /** \brief OS Device specific Object Attributes */ + struct hwloc_osdev_attr_s { + hwloc_obj_osdev_type_t type; + } osdev; +}; + +/** \brief Object info attribute (name and value strings) + * + * \sa hwlocality_info_attr + */ +struct hwloc_info_s { + char *name; /**< \brief Info name */ + char *value; /**< \brief Info value */ +}; + +/** @} */ + + + +/** \defgroup hwlocality_creation Topology Creation and Destruction + * @{ + */ + +struct hwloc_topology; +/** \brief Topology context + * + * To be initialized with hwloc_topology_init() and built with hwloc_topology_load(). + */ +typedef struct hwloc_topology * hwloc_topology_t; + +/** \brief Allocate a topology context. + * + * \param[out] topologyp is assigned a pointer to the new allocated context. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_topology_init (hwloc_topology_t *topologyp); + +/** \brief Build the actual topology + * + * Build the actual topology once initialized with hwloc_topology_init() and + * tuned with \ref hwlocality_configuration and \ref hwlocality_setsource routines. + * No other routine may be called earlier using this topology context. + * + * \param topology is the topology to be loaded with objects. + * + * \return 0 on success, -1 on error. + * + * \note On failure, the topology is reinitialized. It should be either + * destroyed with hwloc_topology_destroy() or configured and loaded again. + * + * \note This function may be called only once per topology. + * + * \note The binding of the current thread or process may temporarily change + * during this call but it will be restored before it returns. + * + * \sa hwlocality_configuration and hwlocality_setsource + */ +HWLOC_DECLSPEC int hwloc_topology_load(hwloc_topology_t topology); + +/** \brief Terminate and free a topology context + * + * \param topology is the topology to be freed + */ +HWLOC_DECLSPEC void hwloc_topology_destroy (hwloc_topology_t topology); + +/** \brief Duplicate a topology. + * + * The entire topology structure as well as its objects + * are duplicated into a new one. + * + * This is useful for keeping a backup while modifying a topology. + * + * \return 0 on success, -1 on error. + * + * \note Object userdata is not duplicated since hwloc does not know what it point to. + * The objects of both old and new topologies will point to the same userdata. + */ +HWLOC_DECLSPEC int hwloc_topology_dup(hwloc_topology_t *newtopology, hwloc_topology_t oldtopology); + +/** \brief Verify that the topology is compatible with the current hwloc library. + * + * This is useful when using the same topology structure (in memory) + * in different libraries that may use different hwloc installations + * (for instance if one library embeds a specific version of hwloc, + * while another library uses a default system-wide hwloc installation). + * + * If all libraries/programs use the same hwloc installation, this function + * always returns success. + * + * \return \c 0 on success. + * + * \return \c -1 with \p errno set to \c EINVAL if incompatible. + * + * \note If sharing between processes with hwloc_shmem_topology_write(), + * the relevant check is already performed inside hwloc_shmem_topology_adopt(). + */ +HWLOC_DECLSPEC int hwloc_topology_abi_check(hwloc_topology_t topology); + +/** \brief Run internal checks on a topology structure + * + * The program aborts if an inconsistency is detected in the given topology. + * + * \param topology is the topology to be checked + * + * \note This routine is only useful to developers. + * + * \note The input topology should have been previously loaded with + * hwloc_topology_load(). + */ +HWLOC_DECLSPEC void hwloc_topology_check(hwloc_topology_t topology); + +/** @} */ + + + +/** \defgroup hwlocality_levels Object levels, depths and types + * @{ + * + * Be sure to see the figure in \ref termsanddefs that shows a + * complete topology tree, including depths, child/sibling/cousin + * relationships, and an example of an asymmetric topology where one + * package has fewer caches than its peers. + */ + +/** \brief Get the depth of the hierarchical tree of objects. + * + * This is the depth of ::HWLOC_OBJ_PU objects plus one. + * + * \return the depth of the object tree. + * + * \note NUMA nodes, I/O and Misc objects are ignored when computing + * the depth of the tree (they are placed on special levels). + */ +HWLOC_DECLSPEC int hwloc_topology_get_depth(hwloc_topology_t __hwloc_restrict topology) __hwloc_attribute_pure; + +/** \brief Returns the depth of objects of type \p type. + * + * \return The depth of objects of type \p type. + * + * \return A negative virtual depth if a NUMA node, I/O or Misc object type is given. + * These objects are stored in special levels that are not CPU-related. + * This virtual depth may be passed to other hwloc functions such as + * hwloc_get_obj_by_depth() but it should not be considered as an actual + * depth by the application. In particular, it should not be compared with + * any other object depth or with the entire topology depth. + * + * \return ::HWLOC_TYPE_DEPTH_UNKNOWN + * if no object of this type is present on the underlying architecture, + * or if the OS doesn't provide this kind of information. + * + * \return ::HWLOC_TYPE_DEPTH_MULTIPLE if type ::HWLOC_OBJ_GROUP is given + * and multiple levels of Groups exist. + * + * \note If the type is absent but a similar type is acceptable, see also + * hwloc_get_type_or_below_depth() and hwloc_get_type_or_above_depth(). + * + * \sa hwloc_get_memory_parents_depth() for managing the depth of memory objects. + * + * \sa hwloc_type_sscanf_as_depth() for returning the depth of objects + * whose type is given as a string. + */ +HWLOC_DECLSPEC int hwloc_get_type_depth (hwloc_topology_t topology, hwloc_obj_type_t type); + +enum hwloc_get_type_depth_e { + HWLOC_TYPE_DEPTH_UNKNOWN = -1, /**< \brief No object of given type exists in the topology. \hideinitializer */ + HWLOC_TYPE_DEPTH_MULTIPLE = -2, /**< \brief Objects of given type exist at different depth in the topology (only for Groups). \hideinitializer */ + HWLOC_TYPE_DEPTH_NUMANODE = -3, /**< \brief Virtual depth for NUMA nodes. \hideinitializer */ + HWLOC_TYPE_DEPTH_BRIDGE = -4, /**< \brief Virtual depth for bridge object level. \hideinitializer */ + HWLOC_TYPE_DEPTH_PCI_DEVICE = -5, /**< \brief Virtual depth for PCI device object level. \hideinitializer */ + HWLOC_TYPE_DEPTH_OS_DEVICE = -6, /**< \brief Virtual depth for software device object level. \hideinitializer */ + HWLOC_TYPE_DEPTH_MISC = -7, /**< \brief Virtual depth for Misc object. \hideinitializer */ + HWLOC_TYPE_DEPTH_MEMCACHE = -8 /**< \brief Virtual depth for MemCache object. \hideinitializer */ +}; + +/** \brief Return the depth of parents where memory objects are attached. + * + * Memory objects have virtual negative depths because they are not part of + * the main CPU-side hierarchy of objects. This depth should not be compared + * with other level depths. + * + * If all Memory objects are attached to Normal parents at the same depth, + * this parent depth may be compared to other as usual, for instance + * for knowing whether NUMA nodes is attached above or below Packages. + * + * \return The depth of Normal parents of all memory children + * if all these parents have the same depth. For instance the depth of + * the Package level if all NUMA nodes are attached to Package objects. + * + * \return ::HWLOC_TYPE_DEPTH_MULTIPLE if Normal parents of all + * memory children do not have the same depth. For instance if some + * NUMA nodes are attached to Packages while others are attached to + * Groups. + */ +HWLOC_DECLSPEC int hwloc_get_memory_parents_depth (hwloc_topology_t topology); + +/** \brief Returns the depth of objects of type \p type or below + * + * If no object of this type is present on the underlying architecture, the + * function returns the depth of the first "present" object typically found + * inside \p type. + * + * This function is only meaningful for normal object types. + * If a memory, I/O or Misc object type is given, the corresponding virtual + * depth is always returned (see hwloc_get_type_depth()). + * + * May return ::HWLOC_TYPE_DEPTH_MULTIPLE for ::HWLOC_OBJ_GROUP just like + * hwloc_get_type_depth(). + */ +static __hwloc_inline int +hwloc_get_type_or_below_depth (hwloc_topology_t topology, hwloc_obj_type_t type) __hwloc_attribute_pure; + +/** \brief Returns the depth of objects of type \p type or above + * + * If no object of this type is present on the underlying architecture, the + * function returns the depth of the first "present" object typically + * containing \p type. + * + * This function is only meaningful for normal object types. + * If a memory, I/O or Misc object type is given, the corresponding virtual + * depth is always returned (see hwloc_get_type_depth()). + * + * May return ::HWLOC_TYPE_DEPTH_MULTIPLE for ::HWLOC_OBJ_GROUP just like + * hwloc_get_type_depth(). + */ +static __hwloc_inline int +hwloc_get_type_or_above_depth (hwloc_topology_t topology, hwloc_obj_type_t type) __hwloc_attribute_pure; + +/** \brief Returns the type of objects at depth \p depth. + * + * \p depth should between 0 and hwloc_topology_get_depth()-1, + * or a virtual depth such as ::HWLOC_TYPE_DEPTH_NUMANODE. + * + * \return The type of objects at depth \p depth. + * \return (hwloc_obj_type_t)-1 if depth \p depth does not exist. + */ +HWLOC_DECLSPEC hwloc_obj_type_t hwloc_get_depth_type (hwloc_topology_t topology, int depth) __hwloc_attribute_pure; + +/** \brief Returns the width of level at depth \p depth. + * + * \return The number of objects at topology depth \p depth. + * \return 0 if there are no objects at depth \p depth. + */ +HWLOC_DECLSPEC unsigned hwloc_get_nbobjs_by_depth (hwloc_topology_t topology, int depth) __hwloc_attribute_pure; + +/** \brief Returns the width of level type \p type + * + * \return The number of objects of type \p type. + * \return -1 if there are multiple levels with objects of that type, e.g. ::HWLOC_OBJ_GROUP. + * \return 0 if there are no objects at depth \p depth. + */ +static __hwloc_inline int +hwloc_get_nbobjs_by_type (hwloc_topology_t topology, hwloc_obj_type_t type) __hwloc_attribute_pure; + +/** \brief Returns the top-object of the topology-tree. + * + * Its type is ::HWLOC_OBJ_MACHINE. + * + * This function cannot return \c NULL. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_root_obj (hwloc_topology_t topology) __hwloc_attribute_pure; + +/** \brief Returns the topology object at logical index \p idx from depth \p depth + * + * \return The object if it exists. + * \return \c NULL if there is no object with this index and depth. + */ +HWLOC_DECLSPEC hwloc_obj_t hwloc_get_obj_by_depth (hwloc_topology_t topology, int depth, unsigned idx) __hwloc_attribute_pure; + +/** \brief Returns the topology object at logical index \p idx with type \p type + * + * \return The object if it exists. + * \return \c NULL if there is no object with this index and type. + * \return \c NULL if there are multiple levels with objects of that type (e.g. ::HWLOC_OBJ_GROUP), + * the caller may fallback to hwloc_get_obj_by_depth(). + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_by_type (hwloc_topology_t topology, hwloc_obj_type_t type, unsigned idx) __hwloc_attribute_pure; + +/** \brief Returns the next object at depth \p depth. + * + * \return The first object at depth \p depth if \p prev is \c NULL. + * \return The object after \p prev at depth \p depth if \p prev is not \c NULL. + * \return \c NULL if there is no such object. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_next_obj_by_depth (hwloc_topology_t topology, int depth, hwloc_obj_t prev); + +/** \brief Returns the next object of type \p type. + * + * \return The first object of type \p type if \p prev is \c NULL. + * \return The object after \p prev of type \p type if \p prev is not \c NULL. + * \return \c NULL if there is no such object. + * \return \c NULL if there are multiple levels with objects of that type (e.g. ::HWLOC_OBJ_GROUP), + * the caller may fallback to hwloc_get_obj_by_depth(). + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_next_obj_by_type (hwloc_topology_t topology, hwloc_obj_type_t type, + hwloc_obj_t prev); + +/** @} */ + + + +/** \defgroup hwlocality_object_strings Converting between Object Types and Attributes, and Strings + * @{ + */ + +/** \brief Return a constant stringified object type. + * + * This function is the basic way to convert a generic type into a string. + * The output string may be parsed back by hwloc_type_sscanf(). + * + * hwloc_obj_type_snprintf() may return a more precise output for a specific + * object, but it requires the caller to provide the output buffer. + * + * \return A constant string containing the object type name or \c "Unknown". + */ +HWLOC_DECLSPEC const char * hwloc_obj_type_string (hwloc_obj_type_t type) __hwloc_attribute_const; + +/** \brief Stringify the type of a given topology object into a human-readable form. + * + * Contrary to hwloc_obj_type_string(), this function includes object-specific + * attributes (such as the Group depth, the Bridge type, or OS device type) + * in the output, and it requires the caller to provide the output buffer. + * + * The output is guaranteed to be the same for all objects of a same topology level. + * + * If \p verbose is 1, longer type names are used, e.g. L1Cache instead of L1. + * + * The output string may be parsed back by hwloc_type_sscanf(). + * + * If \p size is 0, \p string may safely be \c NULL. + * + * \return the number of characters that were actually written if not truncating, + * or that would have been written (not including the ending \c \0). + */ +HWLOC_DECLSPEC int hwloc_obj_type_snprintf(char * __hwloc_restrict string, size_t size, + hwloc_obj_t obj, + int verbose); + +/** \brief Stringify the attributes of a given topology object into a human-readable form. + * + * Attribute values are separated by \p separator. + * + * Only the major attributes are printed in non-verbose mode. + * + * If \p size is 0, \p string may safely be \c NULL. + * + * \return the number of characters that were actually written if not truncating, + * or that would have been written (not including the ending \c \0). + */ +HWLOC_DECLSPEC int hwloc_obj_attr_snprintf(char * __hwloc_restrict string, size_t size, + hwloc_obj_t obj, const char * __hwloc_restrict separator, + int verbose); + +/** \brief Return an object type and attributes from a type string. + * + * Convert strings such as "Package" or "L1iCache" into the corresponding types. + * Matching is case-insensitive, and only the first letters are actually + * required to match. + * + * The matched object type is set in \p typep (which cannot be \c NULL). + * + * Type-specific attributes, for instance Cache type, Cache depth, Group depth, + * Bridge type or OS Device type may be returned in \p attrp. + * Attributes that are not specified in the string (for instance "Group" + * without a depth, or "L2Cache" without a cache type) are set to -1. + * + * \p attrp is only filled if not \c NULL and if its size specified in \p attrsize + * is large enough. It should be at least as large as union hwloc_obj_attr_u. + * + * \return 0 if a type was correctly identified, otherwise -1. + * + * \note This function is guaranteed to match any string returned by + * hwloc_obj_type_string() or hwloc_obj_type_snprintf(). + * + * \note This is an extended version of the now deprecated hwloc_obj_type_sscanf(). + */ +HWLOC_DECLSPEC int hwloc_type_sscanf(const char *string, + hwloc_obj_type_t *typep, + union hwloc_obj_attr_u *attrp, size_t attrsize); + +/** \brief Return an object type and its level depth from a type string. + * + * Convert strings such as "Package" or "L1iCache" into the corresponding types + * and return in \p depthp the depth of the corresponding level in the + * topology \p topology. + * + * If no object of this type is present on the underlying architecture, + * ::HWLOC_TYPE_DEPTH_UNKNOWN is returned. + * + * If multiple such levels exist (for instance if giving Group without any depth), + * the function may return ::HWLOC_TYPE_DEPTH_MULTIPLE instead. + * + * The matched object type is set in \p typep if \p typep is non \c NULL. + * + * \note This function is similar to hwloc_type_sscanf() followed + * by hwloc_get_type_depth() but it also automatically disambiguates + * multiple group levels etc. + * + * \note This function is guaranteed to match any string returned by + * hwloc_obj_type_string() or hwloc_obj_type_snprintf(). + */ +HWLOC_DECLSPEC int hwloc_type_sscanf_as_depth(const char *string, + hwloc_obj_type_t *typep, + hwloc_topology_t topology, int *depthp); + +/** @} */ + + + +/** \defgroup hwlocality_info_attr Consulting and Adding Info Attributes + * + * @{ + */ + +/** \brief Search the given name in object infos and return the corresponding value. + * + * If multiple info attributes match the given name, only the first one is returned. + * + * \return A pointer to the value string if it exists. + * \return \c NULL if no such info attribute exists. + * + * \note The string should not be freed by the caller, it belongs to the hwloc library. + */ +static __hwloc_inline const char * +hwloc_obj_get_info_by_name(hwloc_obj_t obj, const char *name) __hwloc_attribute_pure; + +/** \brief Add the given name and value pair to the given object info attributes. + * + * The info pair is appended to the existing info array even if another pair + * with the same name already exists. + * + * The input strings are copied before being added in the object infos. + * + * \return \c 0 on success, \c -1 on error. + * + * \note This function may be used to enforce object colors in the lstopo + * graphical output by adding "lstopoStyle" as a name and "Background=#rrggbb" + * as a value. See CUSTOM COLORS in the lstopo(1) manpage for details. + * + * \note If \p name or \p value contain some non-printable characters, they will + * be dropped when exporting to XML, see hwloc_topology_export_xml() in hwloc/export.h. + */ +HWLOC_DECLSPEC int hwloc_obj_add_info(hwloc_obj_t obj, const char *name, const char *value); + +/** \brief Set (or replace) the subtype of an object. + * + * The given \p subtype is copied internally, the caller is responsible + * for freeing the original \p subtype if needed. + * + * If another subtype already exists in \p object, it is replaced. + * The given \p subtype may be \c NULL to remove the existing subtype. + * + * \note This function is mostly meant to initialize the subtype of user-added + * objects such as groups with hwloc_topology_alloc_group_object(). + * + * \return \c 0 on success. + * \return \c -1 with \p errno set to \c ENOMEM on failure to allocate memory. + */ +HWLOC_DECLSPEC int hwloc_obj_set_subtype(hwloc_topology_t topology, hwloc_obj_t obj, const char *subtype); + +/** @} */ + + + +/** \defgroup hwlocality_cpubinding CPU binding + * + * Some operating systems only support binding threads or processes to a single PU. + * Others allow binding to larger sets such as entire Cores or Packages or + * even random sets of individual PUs. In such operating system, the scheduler + * is free to run the task on one of these PU, then migrate it to another PU, etc. + * It is often useful to call hwloc_bitmap_singlify() on the target CPU set before + * passing it to the binding function to avoid these expensive migrations. + * See the documentation of hwloc_bitmap_singlify() for details. + * + * Some operating systems do not provide all hwloc-supported + * mechanisms to bind processes, threads, etc. + * hwloc_topology_get_support() may be used to query about the actual CPU + * binding support in the currently used operating system. + * + * When the requested binding operation is not available and the + * ::HWLOC_CPUBIND_STRICT flag was passed, the function returns -1. + * \p errno is set to \c ENOSYS when it is not possible to bind the requested kind of object + * processes/threads. errno is set to \c EXDEV when the requested cpuset + * can not be enforced (e.g. some systems only allow one CPU, and some + * other systems only allow one NUMA node). + * + * If ::HWLOC_CPUBIND_STRICT was not passed, the function may fail as well, + * or the operating system may use a slightly different operation + * (with side-effects, smaller binding set, etc.) + * when the requested operation is not exactly supported. + * + * The most portable version that should be preferred over the others, + * whenever possible, is the following one which just binds the current program, + * assuming it is single-threaded: + * + * \code + * hwloc_set_cpubind(topology, set, 0), + * \endcode + * + * If the program may be multithreaded, the following one should be preferred + * to only bind the current thread: + * + * \code + * hwloc_set_cpubind(topology, set, HWLOC_CPUBIND_THREAD), + * \endcode + * + * \sa Some example codes are available under doc/examples/ in the source tree. + * + * \note To unbind, just call the binding function with either a full cpuset or + * a cpuset equal to the system cpuset. + * + * \note On some operating systems, CPU binding may have effects on memory binding, see + * ::HWLOC_CPUBIND_NOMEMBIND + * + * \note Running lstopo \--top or hwloc-ps can be a very convenient tool to check + * how binding actually happened. + * @{ + */ + +/** \brief Process/Thread binding flags. + * + * These bit flags can be used to refine the binding policy. + * + * The default (0) is to bind the current process, assumed to be + * single-threaded, in a non-strict way. This is the most portable + * way to bind as all operating systems usually provide it. + * + * \note Not all systems support all kinds of binding. See the + * "Detailed Description" section of \ref hwlocality_cpubinding for a + * description of errors that can occur. + */ +typedef enum { + /** \brief Bind all threads of the current (possibly) multithreaded process. + * \hideinitializer */ + HWLOC_CPUBIND_PROCESS = (1<<0), + + /** \brief Bind current thread of current process. + * \hideinitializer */ + HWLOC_CPUBIND_THREAD = (1<<1), + + /** \brief Request for strict binding from the OS. + * + * By default, when the designated CPUs are all busy while other + * CPUs are idle, operating systems may execute the thread/process + * on those other CPUs instead of the designated CPUs, to let them + * progress anyway. Strict binding means that the thread/process + * will _never_ execute on other CPUs than the designated CPUs, even + * when those are busy with other tasks and other CPUs are idle. + * + * \note Depending on the operating system, strict binding may not + * be possible (e.g., the OS does not implement it) or not allowed + * (e.g., for an administrative reasons), and the function will fail + * in that case. + * + * When retrieving the binding of a process, this flag checks + * whether all its threads actually have the same binding. If the + * flag is not given, the binding of each thread will be + * accumulated. + * + * \note This flag is meaningless when retrieving the binding of a + * thread. + * \hideinitializer + */ + HWLOC_CPUBIND_STRICT = (1<<2), + + /** \brief Avoid any effect on memory binding + * + * On some operating systems, some CPU binding function would also + * bind the memory on the corresponding NUMA node. It is often not + * a problem for the application, but if it is, setting this flag + * will make hwloc avoid using OS functions that would also bind + * memory. This will however reduce the support of CPU bindings, + * i.e. potentially return -1 with errno set to \c ENOSYS in some + * cases. + * + * This flag is only meaningful when used with functions that set + * the CPU binding. It is ignored when used with functions that get + * CPU binding information. + * \hideinitializer + */ + HWLOC_CPUBIND_NOMEMBIND = (1<<3) +} hwloc_cpubind_flags_t; + +/** \brief Bind current process or thread on CPUs given in physical bitmap \p set. + * + * \return 0 on success. + * \return -1 with errno set to \c ENOSYS if the action is not supported. + * \return -1 with errno set to \c EXDEV if the binding cannot be enforced. + */ +HWLOC_DECLSPEC int hwloc_set_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t set, int flags); + +/** \brief Get current process or thread binding. + * + * The CPU-set \p set (previously allocated by the caller) + * is filled with the list of PUs which the process or + * thread (according to \e flags) was last bound to. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_get_cpubind(hwloc_topology_t topology, hwloc_cpuset_t set, int flags); + +/** \brief Bind a process \p pid on CPUs given in physical bitmap \p set. + * + * \return 0 on success, -1 on error. + * + * \note \p hwloc_pid_t is \p pid_t on Unix platforms, + * and \p HANDLE on native Windows platforms. + * + * \note As a special case on Linux, if a tid (thread ID) is supplied + * instead of a pid (process ID) and ::HWLOC_CPUBIND_THREAD is passed in flags, + * the binding is applied to that specific thread. + * + * \note On non-Linux systems, ::HWLOC_CPUBIND_THREAD can not be used in \p flags. + */ +HWLOC_DECLSPEC int hwloc_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t set, int flags); + +/** \brief Get the current physical binding of process \p pid. + * + * The CPU-set \p set (previously allocated by the caller) + * is filled with the list of PUs which the process + * was last bound to. + * + * \return 0 on success, -1 on error. + * + * \note \p hwloc_pid_t is \p pid_t on Unix platforms, + * and \p HANDLE on native Windows platforms. + * + * \note As a special case on Linux, if a tid (thread ID) is supplied + * instead of a pid (process ID) and HWLOC_CPUBIND_THREAD is passed in flags, + * the binding for that specific thread is returned. + * + * \note On non-Linux systems, HWLOC_CPUBIND_THREAD can not be used in \p flags. + */ +HWLOC_DECLSPEC int hwloc_get_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int flags); + +#ifdef hwloc_thread_t +/** \brief Bind a thread \p thread on CPUs given in physical bitmap \p set. + * + * \return 0 on success, -1 on error. + * + * \note \p hwloc_thread_t is \p pthread_t on Unix platforms, + * and \p HANDLE on native Windows platforms. + * + * \note ::HWLOC_CPUBIND_PROCESS can not be used in \p flags. + */ +HWLOC_DECLSPEC int hwloc_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t thread, hwloc_const_cpuset_t set, int flags); +#endif + +#ifdef hwloc_thread_t +/** \brief Get the current physical binding of thread \p tid. + * + * The CPU-set \p set (previously allocated by the caller) + * is filled with the list of PUs which the thread + * was last bound to. + * + * \return 0 on success, -1 on error. + * + * \note \p hwloc_thread_t is \p pthread_t on Unix platforms, + * and \p HANDLE on native Windows platforms. + * + * \note ::HWLOC_CPUBIND_PROCESS can not be used in \p flags. + */ +HWLOC_DECLSPEC int hwloc_get_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t thread, hwloc_cpuset_t set, int flags); +#endif + +/** \brief Get the last physical CPU where the current process or thread ran. + * + * The CPU-set \p set (previously allocated by the caller) + * is filled with the list of PUs which the process or + * thread (according to \e flags) last ran on. + * + * The operating system may move some tasks from one processor + * to another at any time according to their binding, + * so this function may return something that is already + * outdated. + * + * \p flags can include either ::HWLOC_CPUBIND_PROCESS or ::HWLOC_CPUBIND_THREAD to + * specify whether the query should be for the whole process (union of all CPUs + * on which all threads are running), or only the current thread. If the + * process is single-threaded, flags can be set to zero to let hwloc use + * whichever method is available on the underlying OS. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_get_last_cpu_location(hwloc_topology_t topology, hwloc_cpuset_t set, int flags); + +/** \brief Get the last physical CPU where a process ran. + * + * The CPU-set \p set (previously allocated by the caller) + * is filled with the list of PUs which the process + * last ran on. + * + * The operating system may move some tasks from one processor + * to another at any time according to their binding, + * so this function may return something that is already + * outdated. + * + * \return 0 on success, -1 on error. + * + * \note \p hwloc_pid_t is \p pid_t on Unix platforms, + * and \p HANDLE on native Windows platforms. + * + * \note As a special case on Linux, if a tid (thread ID) is supplied + * instead of a pid (process ID) and ::HWLOC_CPUBIND_THREAD is passed in flags, + * the last CPU location of that specific thread is returned. + * + * \note On non-Linux systems, ::HWLOC_CPUBIND_THREAD can not be used in \p flags. + */ +HWLOC_DECLSPEC int hwloc_get_proc_last_cpu_location(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int flags); + +/** @} */ + + + +/** \defgroup hwlocality_membinding Memory binding + * + * Memory binding can be done three ways: + * + * - explicit memory allocation thanks to hwloc_alloc_membind() and friends: + * the binding will have effect on the memory allocated by these functions. + * - implicit memory binding through binding policy: hwloc_set_membind() and + * friends only define the current policy of the process, which will be + * applied to the subsequent calls to malloc() and friends. + * - migration of existing memory ranges, thanks to hwloc_set_area_membind() + * and friends, which move already-allocated data. + * + * Not all operating systems support all three ways. + * hwloc_topology_get_support() may be used to query about the actual memory + * binding support in the currently used operating system. + * + * When the requested binding operation is not available and the + * ::HWLOC_MEMBIND_STRICT flag was passed, the function returns -1. + * \p errno will be set to \c ENOSYS when the system does support + * the specified action or policy + * (e.g., some systems only allow binding memory on a per-thread + * basis, whereas other systems only allow binding memory for all + * threads in a process). + * \p errno will be set to \c EXDEV when the requested set can not be enforced + * (e.g., some systems only allow binding memory to a single NUMA node). + * + * If ::HWLOC_MEMBIND_STRICT was not passed, the function may fail as well, + * or the operating system may use a slightly different operation + * (with side-effects, smaller binding set, etc.) + * when the requested operation is not exactly supported. + * + * The most portable form that should be preferred over the others + * whenever possible is as follows. + * It allocates some memory hopefully bound to the specified set. + * To do so, hwloc will possibly have to change the current memory + * binding policy in order to actually get the memory bound, if the OS + * does not provide any other way to simply allocate bound memory + * without changing the policy for all allocations. That is the + * difference with hwloc_alloc_membind(), which will never change the + * current memory binding policy. + * + * \code + * hwloc_alloc_membind_policy(topology, size, set, + * HWLOC_MEMBIND_BIND, 0); + * \endcode + * + * Each hwloc memory binding function takes a bitmap argument that + * is a CPU set by default, or a NUMA memory node set if the flag + * ::HWLOC_MEMBIND_BYNODESET is specified. + * See \ref hwlocality_object_sets and \ref hwlocality_bitmap for a + * discussion of CPU sets and NUMA memory node sets. + * It is also possible to convert between CPU set and node set using + * hwloc_cpuset_to_nodeset() or hwloc_cpuset_from_nodeset(). + * + * Memory binding by CPU set cannot work for CPU-less NUMA memory nodes. + * Binding by nodeset should therefore be preferred whenever possible. + * + * \sa Some example codes are available under doc/examples/ in the source tree. + * + * \note On some operating systems, memory binding affects the CPU + * binding; see ::HWLOC_MEMBIND_NOCPUBIND + * @{ + */ + +/** \brief Memory binding policy. + * + * These constants can be used to choose the binding policy. Only one policy can + * be used at a time (i.e., the values cannot be OR'ed together). + * + * Not all systems support all kinds of binding. + * hwloc_topology_get_support() may be used to query about the actual memory + * binding policy support in the currently used operating system. + * See the "Detailed Description" section of \ref hwlocality_membinding + * for a description of errors that can occur. + */ +typedef enum { + /** \brief Reset the memory allocation policy to the system default. + * Depending on the operating system, this may correspond to + * ::HWLOC_MEMBIND_FIRSTTOUCH (Linux, FreeBSD), + * or ::HWLOC_MEMBIND_BIND (AIX, HP-UX, Solaris, Windows). + * This policy is never returned by get membind functions. + * The nodeset argument is ignored. + * \hideinitializer */ + HWLOC_MEMBIND_DEFAULT = 0, + + /** \brief Allocate each memory page individually on the local NUMA + * node of the thread that touches it. + * + * The given nodeset should usually be hwloc_topology_get_topology_nodeset() + * so that the touching thread may run and allocate on any node in the system. + * + * On AIX, if the nodeset is smaller, pages are allocated locally (if the local + * node is in the nodeset) or from a random non-local node (otherwise). + * \hideinitializer */ + HWLOC_MEMBIND_FIRSTTOUCH = 1, + + /** \brief Allocate memory on the specified nodes. + * + * The actual behavior may slightly vary between operating systems, + * especially when (some of) the requested nodes are full. + * On Linux, by default, the MPOL_PREFERRED_MANY (or MPOL_PREFERRED) policy + * is used. However, if the hwloc strict flag is also given, the Linux + * MPOL_BIND policy is rather used. + * \hideinitializer */ + HWLOC_MEMBIND_BIND = 2, + + /** \brief Allocate memory on the given nodes in an interleaved + * / round-robin manner. The precise layout of the memory across + * multiple NUMA nodes is OS/system specific. Interleaving can be + * useful when threads distributed across the specified NUMA nodes + * will all be accessing the whole memory range concurrently, since + * the interleave will then balance the memory references. + * \hideinitializer */ + HWLOC_MEMBIND_INTERLEAVE = 3, + + /** \brief Allocate memory on the given nodes in an interleaved + * / weighted manner. The precise layout of the memory across + * multiple NUMA nodes is OS/system specific. Weighted interleaving + * can be useful when threads distributed across the specified NUMA + * nodes with different bandwidth capabilities will all be accessing + * the whole memory range concurrently, since the interleave will then + * balance the memory references. + * \hideinitializer */ + HWLOC_MEMBIND_WEIGHTED_INTERLEAVE = 5, + + /** \brief For each page bound with this policy, by next time + * it is touched (and next time only), it is moved from its current + * location to the local NUMA node of the thread where the memory + * reference occurred (if it needs to be moved at all). + * \hideinitializer */ + HWLOC_MEMBIND_NEXTTOUCH = 4, + + /** \brief Returned by get_membind() functions when multiple + * threads or parts of a memory area have differing memory binding + * policies. + * Also returned when binding is unknown because binding hooks are empty + * when the topology is loaded from XML without HWLOC_THISSYSTEM=1, etc. + * \hideinitializer */ + HWLOC_MEMBIND_MIXED = -1 +} hwloc_membind_policy_t; + +/** \brief Memory binding flags. + * + * These flags can be used to refine the binding policy. + * All flags can be logically OR'ed together with the exception of + * ::HWLOC_MEMBIND_PROCESS and ::HWLOC_MEMBIND_THREAD; + * these two flags are mutually exclusive. + * + * Not all systems support all kinds of binding. + * hwloc_topology_get_support() may be used to query about the actual memory + * binding support in the currently used operating system. + * See the "Detailed Description" section of \ref hwlocality_membinding + * for a description of errors that can occur. + */ +typedef enum { + /** \brief Set policy for all threads of the specified (possibly + * multithreaded) process. This flag is mutually exclusive with + * ::HWLOC_MEMBIND_THREAD. + * \hideinitializer */ + HWLOC_MEMBIND_PROCESS = (1<<0), + + /** \brief Set policy for a specific thread of the current process. + * This flag is mutually exclusive with ::HWLOC_MEMBIND_PROCESS. + * \hideinitializer */ + HWLOC_MEMBIND_THREAD = (1<<1), + + /** Request strict binding from the OS. The function will fail if + * the binding can not be guaranteed / completely enforced. + * + * This flag has slightly different meanings depending on which + * function it is used with. + * \hideinitializer */ + HWLOC_MEMBIND_STRICT = (1<<2), + + /** \brief Migrate existing allocated memory. If the memory cannot + * be migrated and the ::HWLOC_MEMBIND_STRICT flag is passed, an error + * will be returned. + * \hideinitializer */ + HWLOC_MEMBIND_MIGRATE = (1<<3), + + /** \brief Avoid any effect on CPU binding. + * + * On some operating systems, some underlying memory binding + * functions also bind the application to the corresponding CPU(s). + * Using this flag will cause hwloc to avoid using OS functions that + * could potentially affect CPU bindings. Note, however, that using + * NOCPUBIND may reduce hwloc's overall memory binding + * support. Specifically: some of hwloc's memory binding functions + * may fail with errno set to \c ENOSYS when used with NOCPUBIND. + * \hideinitializer + */ + HWLOC_MEMBIND_NOCPUBIND = (1<<4), + + /** \brief Consider the bitmap argument as a nodeset. + * + * The bitmap argument is considered a nodeset if this flag is given, + * or a cpuset otherwise by default. + * + * Memory binding by CPU set cannot work for CPU-less NUMA memory nodes. + * Binding by nodeset should therefore be preferred whenever possible. + * \hideinitializer + */ + HWLOC_MEMBIND_BYNODESET = (1<<5) +} hwloc_membind_flags_t; + +/** \brief Set the default memory binding policy of the current + * process or thread to prefer the NUMA node(s) specified by \p set + * + * If neither ::HWLOC_MEMBIND_PROCESS nor ::HWLOC_MEMBIND_THREAD is + * specified, the current process is assumed to be single-threaded. + * This is the most portable form as it permits hwloc to use either + * process-based OS functions or thread-based OS functions, depending + * on which are available. + * + * If ::HWLOC_MEMBIND_BYNODESET is specified, set is considered a nodeset. + * Otherwise it's a cpuset. + * + * \return 0 on success. + * \return -1 with errno set to \c ENOSYS if the action is not supported. + * \return -1 with errno set to \c EXDEV if the binding cannot be enforced. + */ +HWLOC_DECLSPEC int hwloc_set_membind(hwloc_topology_t topology, hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int flags); + +/** \brief Query the default memory binding policy and physical locality of the + * current process or thread. + * + * The bitmap \p set (previously allocated by the caller) + * is filled with the process or thread memory binding. + * + * This function has two output parameters: \p set and \p policy. + * The values returned in these parameters depend on both the \p flags + * passed in and the current memory binding policies and nodesets in + * the queried target. + * + * Passing the ::HWLOC_MEMBIND_PROCESS flag specifies that the query + * target is the current policies and nodesets for all the threads in + * the current process. Passing ::HWLOC_MEMBIND_THREAD specifies that + * the query target is the current policy and nodeset for only the + * thread invoking this function. + * + * If neither of these flags are passed (which is the most portable + * method), the process is assumed to be single threaded. This allows + * hwloc to use either process-based OS functions or thread-based OS + * functions, depending on which are available. + * + * ::HWLOC_MEMBIND_STRICT is only meaningful when ::HWLOC_MEMBIND_PROCESS + * is also specified. In this case, hwloc will check the default + * memory policies and nodesets for all threads in the process. If + * they are not identical, -1 is returned and errno is set to \c EXDEV. + * If they are identical, the values are returned in \p set and \p + * policy. + * + * Otherwise, if ::HWLOC_MEMBIND_PROCESS is specified (and + * ::HWLOC_MEMBIND_STRICT is \em not specified), the default set + * from each thread is logically OR'ed together. + * If all threads' default policies are the same, \p policy is set to + * that policy. If they are different, \p policy is set to + * ::HWLOC_MEMBIND_MIXED. + * + * In the ::HWLOC_MEMBIND_THREAD case (or when neither + * ::HWLOC_MEMBIND_PROCESS or ::HWLOC_MEMBIND_THREAD is specified), there + * is only one set and policy; they are returned in \p set and + * \p policy, respectively. + * + * If ::HWLOC_MEMBIND_BYNODESET is specified, set is considered a nodeset. + * Otherwise it's a cpuset. + * + * If any other flags are specified, -1 is returned and errno is set + * to \c EINVAL. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_get_membind(hwloc_topology_t topology, hwloc_bitmap_t set, hwloc_membind_policy_t * policy, int flags); + +/** \brief Set the default memory binding policy of the specified + * process to prefer the NUMA node(s) specified by \p set + * + * If ::HWLOC_MEMBIND_BYNODESET is specified, set is considered a nodeset. + * Otherwise it's a cpuset. + * + * \return 0 on success. + * \return -1 with errno set to \c ENOSYS if the action is not supported. + * \return -1 with errno set to \c EXDEV if the binding cannot be enforced. + * + * \note \p hwloc_pid_t is \p pid_t on Unix platforms, + * and \p HANDLE on native Windows platforms. + */ +HWLOC_DECLSPEC int hwloc_set_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int flags); + +/** \brief Query the default memory binding policy and physical locality of the + * specified process. + * + * The bitmap \p set (previously allocated by the caller) + * is filled with the process memory binding. + * + * This function has two output parameters: \p set and \p policy. + * The values returned in these parameters depend on both the \p flags + * passed in and the current memory binding policies and nodesets in + * the queried target. + * + * Passing the ::HWLOC_MEMBIND_PROCESS flag specifies that the query + * target is the current policies and nodesets for all the threads in + * the specified process. If ::HWLOC_MEMBIND_PROCESS is not specified + * (which is the most portable method), the process is assumed to be + * single threaded. This allows hwloc to use either process-based OS + * functions or thread-based OS functions, depending on which are + * available. + * + * Note that it does not make sense to pass ::HWLOC_MEMBIND_THREAD to + * this function. + * + * If ::HWLOC_MEMBIND_STRICT is specified, hwloc will check the default + * memory policies and nodesets for all threads in the specified + * process. If they are not identical, -1 is returned and errno is + * set to \c EXDEV. If they are identical, the values are returned in \p + * set and \p policy. + * + * Otherwise, \p set is set to the logical OR of all threads' + * default set. If all threads' default policies + * are the same, \p policy is set to that policy. If they are + * different, \p policy is set to ::HWLOC_MEMBIND_MIXED. + * + * If ::HWLOC_MEMBIND_BYNODESET is specified, set is considered a nodeset. + * Otherwise it's a cpuset. + * + * If any other flags are specified, -1 is returned and errno is set + * to \c EINVAL. + * + * \return 0 on success, -1 on error. + * + * \note \p hwloc_pid_t is \p pid_t on Unix platforms, + * and \p HANDLE on native Windows platforms. + */ +HWLOC_DECLSPEC int hwloc_get_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_bitmap_t set, hwloc_membind_policy_t * policy, int flags); + +/** \brief Bind the already-allocated memory identified by (addr, len) + * to the NUMA node(s) specified by \p set. + * + * If ::HWLOC_MEMBIND_BYNODESET is specified, set is considered a nodeset. + * Otherwise it's a cpuset. + * + * \return 0 on success or if \p len is 0. + * \return -1 with errno set to \c ENOSYS if the action is not supported. + * \return -1 with errno set to \c EXDEV if the binding cannot be enforced. + */ +HWLOC_DECLSPEC int hwloc_set_area_membind(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int flags); + +/** \brief Query the CPUs near the physical NUMA node(s) and binding policy of + * the memory identified by (\p addr, \p len ). + * + * The bitmap \p set (previously allocated by the caller) + * is filled with the memory area binding. + * + * This function has two output parameters: \p set and \p policy. + * The values returned in these parameters depend on both the \p flags + * passed in and the memory binding policies and nodesets of the pages + * in the address range. + * + * If ::HWLOC_MEMBIND_STRICT is specified, the target pages are first + * checked to see if they all have the same memory binding policy and + * nodeset. If they do not, -1 is returned and errno is set to \c EXDEV. + * If they are identical across all pages, the set and policy are + * returned in \p set and \p policy, respectively. + * + * If ::HWLOC_MEMBIND_STRICT is not specified, the union of all NUMA + * node(s) containing pages in the address range is calculated. + * If all pages in the target have the same policy, it is returned in + * \p policy. Otherwise, \p policy is set to ::HWLOC_MEMBIND_MIXED. + * + * If ::HWLOC_MEMBIND_BYNODESET is specified, set is considered a nodeset. + * Otherwise it's a cpuset. + * + * If any other flags are specified, -1 is returned and errno is set + * to \c EINVAL. + * + * \return 0 on success. + * \return -1 with errno set to \c EINVAL if \p len is 0. + */ +HWLOC_DECLSPEC int hwloc_get_area_membind(hwloc_topology_t topology, const void *addr, size_t len, hwloc_bitmap_t set, hwloc_membind_policy_t * policy, int flags); + +/** \brief Get the NUMA nodes where memory identified by (\p addr, \p len ) is physically allocated. + * + * The bitmap \p set (previously allocated by the caller) + * is filled according to the NUMA nodes where the memory area pages + * are physically allocated. If no page is actually allocated yet, + * \p set may be empty. + * + * If pages spread to multiple nodes, it is not specified whether they spread + * equitably, or whether most of them are on a single node, etc. + * + * The operating system may move memory pages from one processor + * to another at any time according to their binding, + * so this function may return something that is already + * outdated. + * + * If ::HWLOC_MEMBIND_BYNODESET is specified in \p flags, set is + * considered a nodeset. Otherwise it's a cpuset. + * + * If \p len is 0, \p set is emptied. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_get_area_memlocation(hwloc_topology_t topology, const void *addr, size_t len, hwloc_bitmap_t set, int flags); + +/** \brief Allocate some memory + * + * This is equivalent to malloc(), except that it tries to allocate + * page-aligned memory from the OS. + * + * \return a pointer to the allocated area, or \c NULL on error. + * + * \note The allocated memory should be freed with hwloc_free(). + */ +HWLOC_DECLSPEC void *hwloc_alloc(hwloc_topology_t topology, size_t len); + +/** \brief Allocate some memory on NUMA memory nodes specified by \p set + * + * \return a pointer to the allocated area. + * \return NULL with errno set to \c ENOSYS if the action is not supported + * and ::HWLOC_MEMBIND_STRICT is given. + * \return NULL with errno set to \c EXDEV if the binding cannot be enforced + * and ::HWLOC_MEMBIND_STRICT is given. + * \return NULL with errno set to \c ENOMEM if the memory allocation failed + * even before trying to bind. + * + * If ::HWLOC_MEMBIND_BYNODESET is specified, set is considered a nodeset. + * Otherwise it's a cpuset. + * + * \note The allocated memory should be freed with hwloc_free(). + */ +HWLOC_DECLSPEC void *hwloc_alloc_membind(hwloc_topology_t topology, size_t len, hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_malloc; + +/** \brief Allocate some memory on NUMA memory nodes specified by \p set + * + * First, try to allocate properly with hwloc_alloc_membind(). + * On failure, the current process or thread memory binding policy + * is changed with hwloc_set_membind() before allocating memory. + * Thus this function works in more cases, at the expense of changing + * the current state (possibly affecting future allocations that + * would not specify any policy). + * + * If ::HWLOC_MEMBIND_BYNODESET is specified, set is considered a nodeset. + * Otherwise it's a cpuset. + * + * \return a pointer to the allocated area, or \c NULL on error. + */ +static __hwloc_inline void * +hwloc_alloc_membind_policy(hwloc_topology_t topology, size_t len, hwloc_const_bitmap_t set, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_malloc; + +/** \brief Free memory that was previously allocated by hwloc_alloc() + * or hwloc_alloc_membind(). + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_free(hwloc_topology_t topology, void *addr, size_t len); + +/** @} */ + + + +/** \defgroup hwlocality_setsource Changing the Source of Topology Discovery + * + * These functions must be called between hwloc_topology_init() and hwloc_topology_load(). + * Otherwise, they will return -1 with errno set to \c EBUSY. + * + * If none of the functions below is called, the default is to detect all the objects + * of the machine that the caller is allowed to access. + * + * This default behavior may also be modified through environment variables + * if the application did not modify it already. + * Setting HWLOC_XMLFILE in the environment enforces the discovery from a XML + * file as if hwloc_topology_set_xml() had been called. + * Setting HWLOC_SYNTHETIC enforces a synthetic topology as if + * hwloc_topology_set_synthetic() had been called. + * + * Finally, HWLOC_THISSYSTEM enforces the return value of + * hwloc_topology_is_thissystem(). + * + * @{ + */ + +/** \brief Change which process the topology is viewed from. + * + * On some systems, processes may have different views of the machine, for + * instance the set of allowed CPUs. By default, hwloc exposes the view from + * the current process. Calling hwloc_topology_set_pid() permits to make it + * expose the topology of the machine from the point of view of another + * process. + * + * \note \p hwloc_pid_t is \p pid_t on Unix platforms, + * and \p HANDLE on native Windows platforms. + * + * \note -1 is returned and errno is set to \c ENOSYS on platforms that do not + * support this feature. + * + * \note The PID will not actually be used until hwloc_topology_load(). + * If the corresponding process exits in the meantime, hwloc will ignore the PID. + * If another process reuses the PID, the view of that process will be used. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_topology_set_pid(hwloc_topology_t __hwloc_restrict topology, hwloc_pid_t pid); + +/** \brief Enable synthetic topology. + * + * Gather topology information from the given \p description, + * a space-separated string of describing + * the object type and arity at each level. + * All types may be omitted (space-separated string of numbers) so that + * hwloc chooses all types according to usual topologies. + * See also the \ref synthetic. + * + * Setting the environment variable HWLOC_SYNTHETIC + * may also result in this behavior. + * + * If \p description was properly parsed and describes a valid topology + * configuration, this function returns 0. + * Otherwise -1 is returned and errno is set to \c EINVAL. + * + * Note that this function does not actually load topology + * information; it just tells hwloc where to load it from. You'll + * still need to invoke hwloc_topology_load() to actually load the + * topology information. + * + * \return 0 on success. + * \return -1 with errno set to \c EINVAL if the description was invalid. + * + * \note For convenience, this backend provides empty binding hooks which just + * return success. + * + * \note On success, the synthetic component replaces the previously enabled + * component (if any), but the topology is not actually modified until + * hwloc_topology_load(). + */ +HWLOC_DECLSPEC int hwloc_topology_set_synthetic(hwloc_topology_t __hwloc_restrict topology, const char * __hwloc_restrict description); + +/** \brief Enable XML-file based topology. + * + * Gather topology information from the XML file given at \p xmlpath. + * Setting the environment variable HWLOC_XMLFILE may also result in this behavior. + * This file may have been generated earlier with hwloc_topology_export_xml() in hwloc/export.h, + * or lstopo file.xml. + * + * Note that this function does not actually load topology + * information; it just tells hwloc where to load it from. You'll + * still need to invoke hwloc_topology_load() to actually load the + * topology information. + * + * \return 0 on success. + * \return -1 with errno set to \c EINVAL on failure to read the XML file. + * + * \note See also hwloc_topology_set_userdata_import_callback() + * for importing application-specific object userdata. + * + * \note For convenience, this backend provides empty binding hooks which just + * return success. To have hwloc still actually call OS-specific hooks, the + * ::HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM has to be set to assert that the loaded + * file is really the underlying system. + * + * \note On success, the XML component replaces the previously enabled + * component (if any), but the topology is not actually modified until + * hwloc_topology_load(). + * + * \note If an invalid XML input file is given, the error may be reported + * either here or later by hwloc_topology_load() depending on the XML library + * used by hwloc. + */ +HWLOC_DECLSPEC int hwloc_topology_set_xml(hwloc_topology_t __hwloc_restrict topology, const char * __hwloc_restrict xmlpath); + +/** \brief Enable XML based topology using a memory buffer (instead of + * a file, as with hwloc_topology_set_xml()). + * + * Gather topology information from the XML memory buffer given at + * \p buffer and of length \p size (including an ending \c \0). + * This buffer may have been filled earlier with + * hwloc_topology_export_xmlbuffer() in hwloc/export.h. + * + * Note that this function does not actually load topology + * information; it just tells hwloc where to load it from. You'll + * still need to invoke hwloc_topology_load() to actually load the + * topology information. + * + * \return 0 on success. + * \return -1 with errno set to \c EINVAL on failure to read the XML buffer. + * + * \note See also hwloc_topology_set_userdata_import_callback() + * for importing application-specific object userdata. + * + * \note For convenience, this backend provides empty binding hooks which just + * return success. To have hwloc still actually call OS-specific hooks, the + * ::HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM has to be set to assert that the loaded + * file is really the underlying system. + * + * \note On success, the XML component replaces the previously enabled + * component (if any), but the topology is not actually modified until + * hwloc_topology_load(). + * + * \note If an invalid XML input file is given, the error may be reported + * either here or later by hwloc_topology_load() depending on the XML library + * used by hwloc. + */ +HWLOC_DECLSPEC int hwloc_topology_set_xmlbuffer(hwloc_topology_t __hwloc_restrict topology, const char * __hwloc_restrict buffer, int size); + +/** \brief Flags to be passed to hwloc_topology_set_components() + */ +enum hwloc_topology_components_flag_e { + /** \brief Blacklist the target component from being used. + * \hideinitializer + */ + HWLOC_TOPOLOGY_COMPONENTS_FLAG_BLACKLIST = (1UL<<0) +}; + +/** \brief Prevent a discovery component from being used for a topology. + * + * \p name is the name of the discovery component that should not be used + * when loading topology \p topology. The name is a string such as "cuda". + * + * For components with multiple phases, it may also be suffixed with the name + * of a phase, for instance "linux:io". + * + * \p flags should be ::HWLOC_TOPOLOGY_COMPONENTS_FLAG_BLACKLIST. + * + * This may be used to avoid expensive parts of the discovery process. + * For instance, CUDA-specific discovery may be expensive and unneeded + * while generic I/O discovery could still be useful. + * + * \return 0 on success. + * \return -1 on error, for instance if flags are invalid. + */ +HWLOC_DECLSPEC int hwloc_topology_set_components(hwloc_topology_t __hwloc_restrict topology, unsigned long flags, const char * __hwloc_restrict name); + +/** @} */ + + + +/** \defgroup hwlocality_configuration Topology Detection Configuration and Query + * + * Several functions can optionally be called between hwloc_topology_init() and + * hwloc_topology_load() to configure how the detection should be performed, + * e.g. to ignore some objects types, define a synthetic topology, etc. + * + * @{ + */ + +/** \brief Flags to be set onto a topology context before load. + * + * Flags should be given to hwloc_topology_set_flags(). + * They may also be returned by hwloc_topology_get_flags(). + */ +enum hwloc_topology_flags_e { + /** \brief Detect the whole system, ignore reservations, include disallowed objects. + * + * Gather all online resources, even if some were disabled by the administrator. + * For instance, ignore Linux Cgroup/Cpusets and gather all processors and memory nodes. + * However offline PUs and NUMA nodes are still ignored. + * + * When this flag is not set, PUs and NUMA nodes that are disallowed are not added to the topology. + * Parent objects (package, core, cache, etc.) are added only if some of their children are allowed. + * All existing PUs and NUMA nodes in the topology are allowed. + * hwloc_topology_get_allowed_cpuset() and hwloc_topology_get_allowed_nodeset() + * are equal to the root object cpuset and nodeset. + * + * When this flag is set, the actual sets of allowed PUs and NUMA nodes are given + * by hwloc_topology_get_allowed_cpuset() and hwloc_topology_get_allowed_nodeset(). + * They may be smaller than the root object cpuset and nodeset. + * + * If the current topology is exported to XML and reimported later, this flag + * should be set again in the reimported topology so that disallowed resources + * are reimported as well. + * \hideinitializer + */ + HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED = (1UL<<0), + + /** \brief Assume that the selected backend provides the topology for the + * system on which we are running. + * + * This forces hwloc_topology_is_thissystem() to return 1, i.e. makes hwloc assume that + * the selected backend provides the topology for the system on which we are running, + * even if it is not the OS-specific backend but the XML backend for instance. + * This means making the binding functions actually call the OS-specific + * system calls and really do binding, while the XML backend would otherwise + * provide empty hooks just returning success. + * + * Setting the environment variable HWLOC_THISSYSTEM may also result in the + * same behavior. + * + * This can be used for efficiency reasons to first detect the topology once, + * save it to an XML file, and quickly reload it later through the XML + * backend, but still having binding functions actually do bind. + * \hideinitializer + */ + HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM = (1UL<<1), + + /** \brief Get the set of allowed resources from the local operating system even if the topology was loaded from XML or synthetic description. + * + * If the topology was loaded from XML or from a synthetic string, + * restrict it by applying the current process restrictions such as + * Linux Cgroup/Cpuset. + * + * This is useful when the topology is not loaded directly from + * the local machine (e.g. for performance reason) and it comes + * with all resources, while the running process is restricted + * to only parts of the machine. + * + * This flag is ignored unless ::HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM is + * also set since the loaded topology must match the underlying machine + * where restrictions will be gathered from. + * + * Setting the environment variable HWLOC_THISSYSTEM_ALLOWED_RESOURCES + * would result in the same behavior. + * \hideinitializer + */ + HWLOC_TOPOLOGY_FLAG_THISSYSTEM_ALLOWED_RESOURCES = (1UL<<2), + + /** \brief Import support from the imported topology. + * + * When importing a XML topology from a remote machine, binding is + * disabled by default (see ::HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM). + * This disabling is also marked by putting zeroes in the corresponding + * supported feature bits reported by hwloc_topology_get_support(). + * + * The flag ::HWLOC_TOPOLOGY_FLAG_IMPORT_SUPPORT actually imports + * support bits from the remote machine. It also sets the flag + * \p imported_support in the struct hwloc_topology_misc_support array. + * If the imported XML did not contain any support information + * (exporter hwloc is too old), this flag is not set. + * + * Note that these supported features are only relevant for the hwloc + * installation that actually exported the XML topology + * (it may vary with the operating system, or with how hwloc was compiled). + * + * Note that setting this flag however does not enable binding for the + * locally imported hwloc topology, it only reports what the remote + * hwloc and machine support. + * + */ + HWLOC_TOPOLOGY_FLAG_IMPORT_SUPPORT = (1UL<<3), + + /** \brief Do not consider resources outside of the process CPU binding. + * + * If the binding of the process is limited to a subset of cores, + * ignore the other cores during discovery. + * + * The resulting topology is identical to what a call to hwloc_topology_restrict() + * would generate, but this flag also prevents hwloc from ever touching other + * resources during the discovery. + * + * This flag especially tells the x86 backend to never temporarily + * rebind a thread on any excluded core. This is useful on Windows + * because such temporary rebinding can change the process binding. + * Another use-case is to avoid cores that would not be able to + * perform the hwloc discovery anytime soon because they are busy + * executing some high-priority real-time tasks. + * + * If process CPU binding is not supported, + * the thread CPU binding is considered instead if supported, + * or the flag is ignored. + * + * This flag requires ::HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM as well + * since binding support is required. + */ + HWLOC_TOPOLOGY_FLAG_RESTRICT_TO_CPUBINDING = (1UL<<4), + + /** \brief Do not consider resources outside of the process memory binding. + * + * If the binding of the process is limited to a subset of NUMA nodes, + * ignore the other NUMA nodes during discovery. + * + * The resulting topology is identical to what a call to hwloc_topology_restrict() + * would generate, but this flag also prevents hwloc from ever touching other + * resources during the discovery. + * + * This flag is meant to be used together with + * ::HWLOC_TOPOLOGY_FLAG_RESTRICT_TO_CPUBINDING when both cores + * and NUMA nodes should be ignored outside of the process binding. + * + * If process memory binding is not supported, + * the thread memory binding is considered instead if supported, + * or the flag is ignored. + * + * This flag requires ::HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM as well + * since binding support is required. + */ + HWLOC_TOPOLOGY_FLAG_RESTRICT_TO_MEMBINDING = (1UL<<5), + + /** \brief Do not ever modify the process or thread binding during discovery. + * + * This flag disables all hwloc discovery steps that require a change of + * the process or thread binding. This currently only affects the x86 + * backend which gets entirely disabled. + * + * This is useful when hwloc_topology_load() is called while the + * application also creates additional threads or modifies the binding. + * + * This flag is also a strict way to make sure the process binding will + * not change to due thread binding changes on Windows + * (see ::HWLOC_TOPOLOGY_FLAG_RESTRICT_TO_CPUBINDING). + */ + HWLOC_TOPOLOGY_FLAG_DONT_CHANGE_BINDING = (1UL<<6), + + /** \brief Ignore distances. + * + * Ignore distance information from the operating systems (and from XML) + * and hence do not use distances for grouping. + */ + HWLOC_TOPOLOGY_FLAG_NO_DISTANCES = (1UL<<7), + + /** \brief Ignore memory attributes and tiers. + * + * Ignore memory attribues from the operating systems (and from XML) + * Hence also do not try to build memory tiers. + */ + HWLOC_TOPOLOGY_FLAG_NO_MEMATTRS = (1UL<<8), + + /** \brief Ignore CPU Kinds. + * + * Ignore CPU kind information from the operating systems (and from XML). + */ + HWLOC_TOPOLOGY_FLAG_NO_CPUKINDS = (1UL<<9) +}; + +/** \brief Set OR'ed flags to non-yet-loaded topology. + * + * Set a OR'ed set of ::hwloc_topology_flags_e onto a topology that was not yet loaded. + * + * If this function is called multiple times, the last invocation will erase + * and replace the set of flags that was previously set. + * + * By default, no flags are set (\c 0). + * + * The flags set in a topology may be retrieved with hwloc_topology_get_flags(). + * + * \return 0 on success. + * \return -1 on error, for instance if flags are invalid. + */ +HWLOC_DECLSPEC int hwloc_topology_set_flags (hwloc_topology_t topology, unsigned long flags); + +/** \brief Get OR'ed flags of a topology. + * + * Get the OR'ed set of ::hwloc_topology_flags_e of a topology. + * + * If hwloc_topology_set_flags() was not called earlier, + * no flags are set (\c 0 is returned). + * + * \return the flags previously set with hwloc_topology_set_flags(). + * + * \note This function may also be called after hwloc_topology_load(). + */ +HWLOC_DECLSPEC unsigned long hwloc_topology_get_flags (hwloc_topology_t topology); + +/** \brief Does the topology context come from this system? + * + * \return 1 if this topology context was built using the system + * running this program. + * \return 0 instead (for instance if using another file-system root, + * a XML topology file, or a synthetic topology). + * + * \note This function may also be called after hwloc_topology_load(). + */ +HWLOC_DECLSPEC int hwloc_topology_is_thissystem(hwloc_topology_t __hwloc_restrict topology) __hwloc_attribute_pure; + +/** \brief Flags describing actual discovery support for this topology. */ +struct hwloc_topology_discovery_support { + /** \brief Detecting the number of PU objects is supported. */ + unsigned char pu; + /** \brief Detecting the number of NUMA nodes is supported. */ + unsigned char numa; + /** \brief Detecting the amount of memory in NUMA nodes is supported. */ + unsigned char numa_memory; + /** \brief Detecting and identifying PU objects that are not available to the current process is supported. */ + unsigned char disallowed_pu; + /** \brief Detecting and identifying NUMA nodes that are not available to the current process is supported. */ + unsigned char disallowed_numa; + /** \brief Detecting the efficiency of CPU kinds is supported, see \ref hwlocality_cpukinds. */ + unsigned char cpukind_efficiency; +}; + +/** \brief Flags describing actual PU binding support for this topology. + * + * A flag may be set even if the feature isn't supported in all cases + * (e.g. binding to random sets of non-contiguous objects). + */ +struct hwloc_topology_cpubind_support { + /** Binding the whole current process is supported. */ + unsigned char set_thisproc_cpubind; + /** Getting the binding of the whole current process is supported. */ + unsigned char get_thisproc_cpubind; + /** Binding a whole given process is supported. */ + unsigned char set_proc_cpubind; + /** Getting the binding of a whole given process is supported. */ + unsigned char get_proc_cpubind; + /** Binding the current thread only is supported. */ + unsigned char set_thisthread_cpubind; + /** Getting the binding of the current thread only is supported. */ + unsigned char get_thisthread_cpubind; + /** Binding a given thread only is supported. */ + unsigned char set_thread_cpubind; + /** Getting the binding of a given thread only is supported. */ + unsigned char get_thread_cpubind; + /** Getting the last processors where the whole current process ran is supported */ + unsigned char get_thisproc_last_cpu_location; + /** Getting the last processors where a whole process ran is supported */ + unsigned char get_proc_last_cpu_location; + /** Getting the last processors where the current thread ran is supported */ + unsigned char get_thisthread_last_cpu_location; +}; + +/** \brief Flags describing actual memory binding support for this topology. + * + * A flag may be set even if the feature isn't supported in all cases + * (e.g. binding to random sets of non-contiguous objects). + */ +struct hwloc_topology_membind_support { + /** Binding the whole current process is supported. */ + unsigned char set_thisproc_membind; + /** Getting the binding of the whole current process is supported. */ + unsigned char get_thisproc_membind; + /** Binding a whole given process is supported. */ + unsigned char set_proc_membind; + /** Getting the binding of a whole given process is supported. */ + unsigned char get_proc_membind; + /** Binding the current thread only is supported. */ + unsigned char set_thisthread_membind; + /** Getting the binding of the current thread only is supported. */ + unsigned char get_thisthread_membind; + /** Binding a given memory area is supported. */ + unsigned char set_area_membind; + /** Getting the binding of a given memory area is supported. */ + unsigned char get_area_membind; + /** Allocating a bound memory area is supported. */ + unsigned char alloc_membind; + /** First-touch policy is supported. */ + unsigned char firsttouch_membind; + /** Bind policy is supported. */ + unsigned char bind_membind; + /** Interleave policy is supported. */ + unsigned char interleave_membind; + /** Next-touch migration policy is supported. */ + unsigned char nexttouch_membind; + /** Migration flags is supported. */ + unsigned char migrate_membind; + /** Getting the last NUMA nodes where a memory area was allocated is supported */ + unsigned char get_area_memlocation; + /** Weighted interleave policy is supported. */ + unsigned char weighted_interleave_membind; +}; + +/** \brief Flags describing miscellaneous features. + */ +struct hwloc_topology_misc_support { + /** Support was imported when importing another topology, see ::HWLOC_TOPOLOGY_FLAG_IMPORT_SUPPORT. */ + unsigned char imported_support; +}; + +/** \brief Set of flags describing actual support for this topology. + * + * This is retrieved with hwloc_topology_get_support() and will be valid until + * the topology object is destroyed. Note: the values are correct only after + * discovery. + */ +struct hwloc_topology_support { + struct hwloc_topology_discovery_support *discovery; + struct hwloc_topology_cpubind_support *cpubind; + struct hwloc_topology_membind_support *membind; + struct hwloc_topology_misc_support *misc; +}; + +/** \brief Retrieve the topology support. + * + * Each flag indicates whether a feature is supported. + * If set to 0, the feature is not supported. + * If set to 1, the feature is supported, but the corresponding + * call may still fail in some corner cases. + * + * These features are also listed by hwloc-info \--support + * + * The reported features are what the current topology supports + * on the current machine. If the topology was exported to XML + * from another machine and later imported here, support still + * describes what is supported for this imported topology after + * import. By default, binding will be reported as unsupported + * in this case (see ::HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM). + * + * Topology flag ::HWLOC_TOPOLOGY_FLAG_IMPORT_SUPPORT may be used + * to report the supported features of the original remote machine + * instead. If it was successfully imported, \p imported_support + * will be set in the struct hwloc_topology_misc_support array. + * + * \return A pointer to a support structure. + * + * \note The function cannot return \c NULL. + * \note The returned pointer should not be freed, it belongs to the hwloc library. + * + * \note This function may be called before or after hwloc_topology_load() + * but the support structure only contains valid information after. + */ +HWLOC_DECLSPEC const struct hwloc_topology_support *hwloc_topology_get_support(hwloc_topology_t __hwloc_restrict topology); + +/** \brief Type filtering flags. + * + * By default, most objects are kept (::HWLOC_TYPE_FILTER_KEEP_ALL). + * Instruction caches, memory-side caches, I/O and Misc objects are ignored by default (::HWLOC_TYPE_FILTER_KEEP_NONE). + * Group levels are ignored unless they bring structure (::HWLOC_TYPE_FILTER_KEEP_STRUCTURE). + * + * Note that group objects are also ignored individually (without the entire level) + * when they do not bring structure. + */ +enum hwloc_type_filter_e { + /** \brief Keep all objects of this type. + * + * Cannot be set for ::HWLOC_OBJ_GROUP (groups are designed only to add more structure to the topology). + * \hideinitializer + */ + HWLOC_TYPE_FILTER_KEEP_ALL = 0, + + /** \brief Ignore all objects of this type. + * + * The bottom-level type ::HWLOC_OBJ_PU, the ::HWLOC_OBJ_NUMANODE type, and + * the top-level type ::HWLOC_OBJ_MACHINE may not be ignored. + * \hideinitializer + */ + HWLOC_TYPE_FILTER_KEEP_NONE = 1, + + /** \brief Only ignore objects if their entire level does not bring any structure. + * + * Keep the entire level of objects if at least one of these objects adds + * structure to the topology. An object brings structure when it has multiple + * children and it is not the only child of its parent. + * + * If all objects in the level are the only child of their parent, and if none + * of them has multiple children, the entire level is removed. + * + * Cannot be set for I/O and Misc objects since the topology structure does not matter there. + * \hideinitializer + */ + HWLOC_TYPE_FILTER_KEEP_STRUCTURE = 2, + + /** \brief Only keep likely-important objects of the given type. + * + * It is only useful for I/O object types. + * For ::HWLOC_OBJ_PCI_DEVICE and ::HWLOC_OBJ_OS_DEVICE, it means that only objects + * of major/common kinds are kept (storage, network, OpenFabrics, CUDA, + * OpenCL, RSMI, NVML, and displays). + * Also, only OS devices directly attached on PCI (e.g. no USB) are reported. + * For ::HWLOC_OBJ_BRIDGE, it means that bridges are kept only if they have children. + * + * This flag equivalent to ::HWLOC_TYPE_FILTER_KEEP_ALL for Normal, Memory and Misc types + * since they are likely important. + * \hideinitializer + */ + HWLOC_TYPE_FILTER_KEEP_IMPORTANT = 3 +}; + +/** \brief Set the filtering for the given object type. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_topology_set_type_filter(hwloc_topology_t topology, hwloc_obj_type_t type, enum hwloc_type_filter_e filter); + +/** \brief Get the current filtering for the given object type. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_topology_get_type_filter(hwloc_topology_t topology, hwloc_obj_type_t type, enum hwloc_type_filter_e *filter); + +/** \brief Set the filtering for all object types. + * + * If some types do not support this filtering, they are silently ignored. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_topology_set_all_types_filter(hwloc_topology_t topology, enum hwloc_type_filter_e filter); + +/** \brief Set the filtering for all CPU cache object types. + * + * Memory-side caches are not involved since they are not CPU caches. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_topology_set_cache_types_filter(hwloc_topology_t topology, enum hwloc_type_filter_e filter); + +/** \brief Set the filtering for all CPU instruction cache object types. + * + * Memory-side caches are not involved since they are not CPU caches. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_topology_set_icache_types_filter(hwloc_topology_t topology, enum hwloc_type_filter_e filter); + +/** \brief Set the filtering for all I/O object types. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_topology_set_io_types_filter(hwloc_topology_t topology, enum hwloc_type_filter_e filter); + +/** \brief Set the topology-specific userdata pointer. + * + * Each topology may store one application-given private data pointer. + * It is initialized to \c NULL. + * hwloc will never modify it. + * + * Use it as you wish, after hwloc_topology_init() and until hwloc_topolog_destroy(). + * + * This pointer is not exported to XML. + */ +HWLOC_DECLSPEC void hwloc_topology_set_userdata(hwloc_topology_t topology, const void *userdata); + +/** \brief Retrieve the topology-specific userdata pointer. + * + * Retrieve the application-given private data pointer that was + * previously set with hwloc_topology_set_userdata(). + * + * \return A pointer to the private-data if any. + * \return \c NULL if no private-data was previoulsy set. + */ +HWLOC_DECLSPEC void * hwloc_topology_get_userdata(hwloc_topology_t topology); + +/** @} */ + + + +/** \defgroup hwlocality_tinker Modifying a loaded Topology + * @{ + */ + +/** \brief Flags to be given to hwloc_topology_restrict(). */ +enum hwloc_restrict_flags_e { + /** \brief Remove all objects that became CPU-less. + * By default, only objects that contain no PU and no memory are removed. + * This flag may not be used with ::HWLOC_RESTRICT_FLAG_BYNODESET. + * \hideinitializer + */ + HWLOC_RESTRICT_FLAG_REMOVE_CPULESS = (1UL<<0), + + /** \brief Restrict by nodeset instead of CPU set. + * Only keep objects whose nodeset is included or partially included in the given set. + * This flag may not be used with ::HWLOC_RESTRICT_FLAG_REMOVE_CPULESS. + */ + HWLOC_RESTRICT_FLAG_BYNODESET = (1UL<<3), + + /** \brief Remove all objects that became Memory-less. + * By default, only objects that contain no PU and no memory are removed. + * This flag may only be used with ::HWLOC_RESTRICT_FLAG_BYNODESET. + * \hideinitializer + */ + HWLOC_RESTRICT_FLAG_REMOVE_MEMLESS = (1UL<<4), + + /** \brief Move Misc objects to ancestors if their parents are removed during restriction. + * If this flag is not set, Misc objects are removed when their parents are removed. + * \hideinitializer + */ + HWLOC_RESTRICT_FLAG_ADAPT_MISC = (1UL<<1), + + /** \brief Move I/O objects to ancestors if their parents are removed during restriction. + * If this flag is not set, I/O devices and bridges are removed when their parents are removed. + * \hideinitializer + */ + HWLOC_RESTRICT_FLAG_ADAPT_IO = (1UL<<2) +}; + +/** \brief Restrict the topology to the given CPU set or nodeset. + * + * Topology \p topology is modified so as to remove all objects that + * are not included (or partially included) in the CPU set \p set. + * All objects CPU and node sets are restricted accordingly. + * + * By default, \p set is a CPU set. It means that the set of PUs in + * the topology is restricted. Once some PUs got removed, their parents + * may also get removed recursively if they became child-less. + * + * If ::HWLOC_RESTRICT_FLAG_BYNODESET is passed in \p flags, + * \p set is considered a nodeset instead of a CPU set. + * It means that the set of NUMA nodes in the topology is restricted + * (instead of PUs). Once some NUMA nodes got removed, their parents + * may also get removed recursively if they became child-less. + * + * \p flags is a OR'ed set of ::hwloc_restrict_flags_e. + * + * \note Restricting the topology removes some locality information, + * hence the remaining objects may get reordered (including PUs and NUMA nodes), + * and their logical indexes may change. + * + * \note This call may not be reverted by restricting back to a larger + * set. Once dropped during restriction, objects may not be brought + * back, except by loading another topology with hwloc_topology_load(). + * + * \return 0 on success. + * + * \return -1 with errno set to \c EINVAL if the input set is invalid. + * The topology is not modified in this case. + * + * \return -1 with errno set to \c ENOMEM on failure to allocate internal data. + * The topology is reinitialized in this case. It should be either + * destroyed with hwloc_topology_destroy() or configured and loaded again. + */ +HWLOC_DECLSPEC int hwloc_topology_restrict(hwloc_topology_t __hwloc_restrict topology, hwloc_const_bitmap_t set, unsigned long flags); + +/** \brief Flags to be given to hwloc_topology_allow(). */ +enum hwloc_allow_flags_e { + /** \brief Mark all objects as allowed in the topology. + * + * \p cpuset and \p nođeset given to hwloc_topology_allow() must be \c NULL. + * \hideinitializer */ + HWLOC_ALLOW_FLAG_ALL = (1UL<<0), + + /** \brief Only allow objects that are available to the current process. + * + * The topology must have ::HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM so that the set + * of available resources can actually be retrieved from the operating system. + * + * \p cpuset and \p nođeset given to hwloc_topology_allow() must be \c NULL. + * \hideinitializer */ + HWLOC_ALLOW_FLAG_LOCAL_RESTRICTIONS = (1UL<<1), + + /** \brief Allow a custom set of objects, given to hwloc_topology_allow() as \p cpuset and/or \p nodeset parameters. + * \hideinitializer */ + HWLOC_ALLOW_FLAG_CUSTOM = (1UL<<2) +}; + +/** \brief Change the sets of allowed PUs and NUMA nodes in the topology. + * + * This function only works if the ::HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED + * was set on the topology. It does not modify any object, it only changes + * the sets returned by hwloc_topology_get_allowed_cpuset() and + * hwloc_topology_get_allowed_nodeset(). + * + * It is notably useful when importing a topology from another process + * running in a different Linux Cgroup. + * + * \p flags must be set to one flag among ::hwloc_allow_flags_e. + * + * \return 0 on success, -1 on error. + * + * \note Removing objects from a topology should rather be performed with + * hwloc_topology_restrict(). + */ +HWLOC_DECLSPEC int hwloc_topology_allow(hwloc_topology_t __hwloc_restrict topology, hwloc_const_cpuset_t cpuset, hwloc_const_nodeset_t nodeset, unsigned long flags); + +/** \brief Add a MISC object as a leaf of the topology + * + * A new MISC object will be created and inserted into the topology at the + * position given by parent. It is appended to the list of existing Misc children, + * without ever adding any intermediate hierarchy level. This is useful for + * annotating the topology without actually changing the hierarchy. + * + * \p name is supposed to be unique across all Misc objects in the topology. + * It will be duplicated to setup the new object attributes. + * + * The new leaf object will not have any \p cpuset. + * + * The \p subtype object attribute may be defined with hwloc_obj_set_subtype() + * after successful insertion. + * + * \return the newly-created object + * + * \return \c NULL on error. + * + * \return \c NULL if Misc objects are filtered-out of the topology (::HWLOC_TYPE_FILTER_KEEP_NONE). + * + * \note If \p name contains some non-printable characters, they will + * be dropped when exporting to XML, see hwloc_topology_export_xml() in hwloc/export.h. + */ +HWLOC_DECLSPEC hwloc_obj_t hwloc_topology_insert_misc_object(hwloc_topology_t topology, hwloc_obj_t parent, const char *name); + +/** \brief Allocate a Group object to insert later with hwloc_topology_insert_group_object(). + * + * This function returns a new Group object. + * + * The caller should (at least) initialize its sets before inserting + * the object in the topology, see hwloc_topology_insert_group_object(). + * Or it may decide not to insert and just free the group object + * by calling hwloc_topology_free_group_object(). + * + * \return The allocated object on success. + * \return \c NULL on error. + * + * \note If successfully inserted by hwloc_topology_insert_group_object(), + * the object will be freed when the entire topology is freed. + * If insertion failed (e.g. \c NULL or empty CPU and node-sets), + * it is freed before returning the error. + */ +HWLOC_DECLSPEC hwloc_obj_t hwloc_topology_alloc_group_object(hwloc_topology_t topology); + +/** \brief Free a group object allocated with hwloc_topology_alloc_group_object(). + * + * This function is only useful if the group object was not given + * to hwloc_topology_insert_group_object() as planned. + * + * \note \p topology must be the same as the one previously passed + * to hwloc_topology_alloc_group_object(). + * + * \return \c 0 on success. + * \return \c -1 on error, for instance if an invalid topology is given. + */ +HWLOC_DECLSPEC int hwloc_topology_free_group_object(hwloc_topology_t topology, hwloc_obj_t group); + +/** \brief Add more structure to the topology by adding an intermediate Group + * + * The caller should first allocate a new Group object with hwloc_topology_alloc_group_object(). + * Then it must setup at least one of its CPU or node sets to specify + * the final location of the Group in the topology. + * Then the object can be passed to this function for actual insertion in the topology. + * + * The main use case for this function is to group a subset of + * siblings among the list of children below a single parent. + * For instance, if grouping 4 cores out of a 8-core socket, + * the logical list of cores will be reordered so that the 4 grouped + * ones are consecutive. + * Then, if needed, a new depth is added between the parent and those + * children, and the Group is inserted there. + * At the end, the 4 grouped cores are now children of the Group, + * which replaces them as a child of the original parent. + * + * In practice, the grouped objects are specified through cpusets + * and/or nodesets, for instance using hwloc_obj_add_other_obj_sets() + * iteratively. + * Hence it is possible to group objects that are not children of the + * same parent, for instance some PUs below the 4 cores in example above. + * However this general case may fail if the expected Group conflicts + * with the existing hierarchy. + * For instance if each core has two PUs, it is not possible to insert + * a Group containing a single PU of each core. + * + * To specify the objects to group, either the cpuset or nodeset field + * (or both, if compatible) must be set to a non-empty bitmap. + * The complete_cpuset or complete_nodeset may be set instead if + * inserting with respect to the complete topology + * (including disallowed, offline or unknown objects). + * These sets cannot be larger than the current topology, or they would get + * restricted silently. + * The core will setup the other sets after actual insertion. + * + * The \p subtype object attribute may be defined with hwloc_obj_set_subtype() + * to display something else than "Group" as the type name for this object in lstopo. + * Custom name-value info pairs may be added with hwloc_obj_add_info() after + * insertion. + * + * The group \p dont_merge attribute may be set to \c 1 to prevent + * the hwloc core from ever merging this object with another + * hierarchically-identical object. + * This is useful when the Group itself describes an important feature + * that cannot be exposed anywhere else in the hierarchy. + * + * The group \p kind attribute may be set to a high value such + * as \c 0xffffffff to tell hwloc that this new Group should always + * be discarded in favor of any existing Group with the same locality. + * + * \note Inserting a group adds some locality information to the topology, + * hence the existing objects may get reordered (including PUs and NUMA nodes), + * and their logical indexes may change. + * + * \note If the insertion fails, the input group object is freed. + * + * \note If the group object should be discarded instead of inserted, + * it may be passed to hwloc_topology_free_group_object() instead. + * + * \note \p topology must be the same as the one previously passed + * to hwloc_topology_alloc_group_object(). + * + * \return The inserted object if it was properly inserted. + * + * \return An existing object if the Group was merged or discarded + * because the topology already contained an object at the same + * location (the Group did not add any hierarchy information). + * + * \return \c NULL if the insertion failed because of conflicting sets in topology tree. + * + * \return \c NULL if Group objects are filtered-out of the topology (::HWLOC_TYPE_FILTER_KEEP_NONE). + * + * \return \c NULL if the object was discarded because no set was + * initialized in the Group before insert, or all of them were empty. + */ +HWLOC_DECLSPEC hwloc_obj_t hwloc_topology_insert_group_object(hwloc_topology_t topology, hwloc_obj_t group); + +/** \brief Setup object cpusets/nodesets by OR'ing another object's sets. + * + * For each defined cpuset or nodeset in \p src, allocate the corresponding set + * in \p dst and add \p src to it by OR'ing sets. + * + * This function is convenient between hwloc_topology_alloc_group_object() + * and hwloc_topology_insert_group_object(). It builds the sets of the new Group + * that will be inserted as a new intermediate parent of several objects. + * + * \return 0 on success. + * \return -1 with errno set to \c ENOMEM if some internal reallocation failed. + */ +HWLOC_DECLSPEC int hwloc_obj_add_other_obj_sets(hwloc_obj_t dst, hwloc_obj_t src); + +/** \brief Refresh internal structures after topology modification. + * + * Modifying the topology (by restricting, adding objects, modifying structures + * such as distances or memory attributes, etc.) may cause some internal caches + * to become invalid. These caches are automatically refreshed when accessed + * but this refreshing is not thread-safe. + * + * This function is not thread-safe either, but it is a good way to end a + * non-thread-safe phase of topology modification. Once this refresh is done, + * multiple threads may concurrently consult the topology, objects, distances, + * attributes, etc. + * + * See also \ref threadsafety + * + * \return 0 on success. + * \return -1 on error, for instance if some internal reallocation failed. + */ +HWLOC_DECLSPEC int hwloc_topology_refresh(hwloc_topology_t topology); + +/** @} */ + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +/* high-level helpers */ +#include "hwloc/helper.h" + +/* inline code of some functions above */ +#include "hwloc/inlines.h" + +/* memory attributes */ +#include "hwloc/memattrs.h" + +/* kinds of CPU cores */ +#include "hwloc/cpukinds.h" + +/* exporting to XML or synthetic */ +#include "hwloc/export.h" + +/* distances */ +#include "hwloc/distances.h" + +/* topology diffs */ +#include "hwloc/diff.h" + +/* deprecated headers */ +#include "hwloc/deprecated.h" + +#endif /* HWLOC_H */ diff --git a/src/deps/hwloc/include/hwloc/bitmap.h b/src/deps/hwloc/include/hwloc/bitmap.h new file mode 100644 index 000000000..7a39fab01 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/bitmap.h @@ -0,0 +1,581 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2025 Inria. All rights reserved. + * Copyright © 2009-2012 Université Bordeaux + * Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief The bitmap API, for use in hwloc itself. + */ + +#ifndef HWLOC_BITMAP_H +#define HWLOC_BITMAP_H + +#include "hwloc/autogen/config.h" + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_bitmap The bitmap API + * + * The ::hwloc_bitmap_t type represents a set of integers (positive or null). + * A bitmap may be of infinite size (all bits are set after some point). + * A bitmap may even be full if all bits are set. + * + * Bitmaps are used by hwloc for sets of OS processors + * (which may actually be hardware threads) as by ::hwloc_cpuset_t + * (a typedef for ::hwloc_bitmap_t), or sets of NUMA memory nodes + * as ::hwloc_nodeset_t (also a typedef for ::hwloc_bitmap_t). + * Those are used for cpuset and nodeset fields in the ::hwloc_obj structure, + * see \ref hwlocality_object_sets. + * + * Both CPU and node sets are always indexed by OS physical number. + * However users should usually not build CPU and node sets manually + * (e.g. with hwloc_bitmap_set()). + * One should rather use existing object sets and combine them with + * hwloc_bitmap_or(), etc. + * For instance, binding the current thread on a pair of cores may be performed with: + * \code + * hwloc_obj_t core1 = ... , core2 = ... ; + * hwloc_bitmap_t set = hwloc_bitmap_alloc(); + * hwloc_bitmap_or(set, core1->cpuset, core2->cpuset); + * hwloc_set_cpubind(topology, set, HWLOC_CPUBIND_THREAD); + * hwloc_bitmap_free(set); + * \endcode + * + * \note Most functions below return 0 on success and -1 on error. + * The usual error case would be an internal failure to realloc/extend + * the storage of the bitmap (\p errno would be set to \c ENOMEM). + * See also \ref hwlocality_api_error_reporting. + * + * \note Several examples of using the bitmap API are available under the + * doc/examples/ directory in the source tree. + * Regression tests such as tests/hwloc/hwloc_bitmap*.c also make intensive use + * of this API. + * @{ + */ + + +/** \brief + * Set of bits represented as an opaque pointer to an internal bitmap. + */ +typedef struct hwloc_bitmap_s * hwloc_bitmap_t; +/** \brief a non-modifiable ::hwloc_bitmap_t */ +typedef const struct hwloc_bitmap_s * hwloc_const_bitmap_t; + + +/* + * Bitmap allocation, freeing and copying. + */ + +/** \brief Allocate a new empty bitmap. + * + * \returns A valid bitmap or \c NULL. + * + * The bitmap should be freed by a corresponding call to + * hwloc_bitmap_free(). + */ +HWLOC_DECLSPEC hwloc_bitmap_t hwloc_bitmap_alloc(void) __hwloc_attribute_malloc; + +/** \brief Allocate a new full bitmap. + * + * \returns A valid bitmap or \c NULL. + * + * The bitmap should be freed by a corresponding call to + * hwloc_bitmap_free(). + */ +HWLOC_DECLSPEC hwloc_bitmap_t hwloc_bitmap_alloc_full(void) __hwloc_attribute_malloc; + +/** \brief Free bitmap \p bitmap. + * + * If \p bitmap is \c NULL, no operation is performed. + */ +HWLOC_DECLSPEC void hwloc_bitmap_free(hwloc_bitmap_t bitmap); + +/** \brief Duplicate bitmap \p bitmap by allocating a new bitmap and copying \p bitmap contents. + * + * If \p bitmap is \c NULL, \c NULL is returned. + */ +HWLOC_DECLSPEC hwloc_bitmap_t hwloc_bitmap_dup(hwloc_const_bitmap_t bitmap) __hwloc_attribute_malloc; + +/** \brief Copy the contents of bitmap \p src into the already allocated bitmap \p dst */ +HWLOC_DECLSPEC int hwloc_bitmap_copy(hwloc_bitmap_t dst, hwloc_const_bitmap_t src); + + +/* + * Bitmap/String Conversion + */ + +/** \brief Stringify a bitmap in the default hwloc format. + * + * Print the bits set inside a bitmap as a comma-separated list of hexadecimal 32-bit blocks. + * A bitmap containing bits 1, 33, 34, and all from 64 to 95 is printed as "0xffffffff,0x00000006,0x00000002". + * + * Up to \p buflen characters may be written in buffer \p buf. + * + * If \p buflen is 0, \p buf may safely be \c NULL. + * + * \return the number of characters that were actually written if not truncating, + * or that would have been written (not including the ending \c \0). + * \return -1 on error. + * + * \note If the bitmap is a CPU or nodeset, it contains physical indexes. + * This should be clearly indicated when displaying such bitmaps to end users. + * See also \ref faq_convert_indexes + */ +HWLOC_DECLSPEC int hwloc_bitmap_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_bitmap_t bitmap); + +/** \brief Stringify a bitmap into a newly allocated string in the default hwloc format. + * + * Print the bits set inside a bitmap as a comma-separated list of hexadecimal 32-bit blocks. + * A bitmap containing bits 1, 33, 34, and all from 64 to 95 is printed as "0xffffffff,0x00000006,0x00000002". + * + * \return the number of characters that were written (not including the ending \c \0). + * \return -1 on error, for instance with \p errno set to \c ENOMEM on failure to allocate the output string. + * + * \note If the bitmap is a CPU or nodeset, it contains physical indexes. + * This should be clearly indicated when displaying such bitmaps to end users. + * See also \ref faq_convert_indexes + */ +HWLOC_DECLSPEC int hwloc_bitmap_asprintf(char ** strp, hwloc_const_bitmap_t bitmap); + +/** \brief Parse a bitmap string as the default hwloc format and stores it in bitmap \p bitmap. + * + * The input string should be a comma-separared list of hexadecimal 32-bit blocks. + * String "0xffffffff,0x6,0x2" is parsed as a bitmap containing all bits between 64 and 95, + * and bits 33, 34 and 1. + * + * \return 0 on success, -1 on error. + * + * \note If the bitmap is a CPU or nodeset, the input string must contain physical indexes. + */ +HWLOC_DECLSPEC int hwloc_bitmap_sscanf(hwloc_bitmap_t bitmap, const char * __hwloc_restrict string); + +/** \brief Stringify a bitmap in the list format. + * + * Lists are comma-separated indexes or ranges. + * Ranges are dash separated indexes. + * A bitmap containing bits 1, 33, 34, and all from 64 to 95 is printed as "1,33-34,64-95". + * The last range may not have an ending index if the bitmap is infinitely set. + * + * Up to \p buflen characters may be written in buffer \p buf. + * + * If \p buflen is 0, \p buf may safely be \c NULL. + * + * \return the number of characters that were actually written if not truncating, + * or that would have been written (not including the ending \c \0). + * \return -1 on error. + * + * \note If the bitmap is a CPU or nodeset, it contains physical indexes. + * This should be clearly indicated when displaying such bitmaps to end users. + * See also \ref faq_convert_indexes + */ +HWLOC_DECLSPEC int hwloc_bitmap_list_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_bitmap_t bitmap); + +/** \brief Stringify a bitmap into a newly allocated list string. + * + * Lists are comma-separated indexes or ranges. + * Ranges are dash separated indexes. + * A bitmap containing bits 1, 33, 34, and all from 64 to 95 is printed as "1,33-34,64-95". + * The last range may not have an ending index if the bitmap is infinitely set. + * + * \return the number of characters that were written (not including the ending \c \0). + * \return -1 on error, for instance with \p errno set to \c ENOMEM on failure to allocate the output string. + * + * \note If the bitmap is a CPU or nodeset, it contains physical indexes. + * This should be clearly indicated when displaying such bitmaps to end users. + * See also \ref faq_convert_indexes + */ +HWLOC_DECLSPEC int hwloc_bitmap_list_asprintf(char ** strp, hwloc_const_bitmap_t bitmap); + +/** \brief Parse a list string and stores it in bitmap \p bitmap. + * + * Lists are comma-separated indexes or ranges. + * Ranges are dash separated indexes. + * String "1,33-34,64-95" is parsed as a bitmap containing bits 1, 33, 34, and all from 64 to 95. + * The last range may not have an ending index if the bitmap is infinitely set. + * + * \return 0 on success, -1 on error. + * + * \note If the bitmap is a CPU or nodeset, the input string must contain physical indexes. + */ +HWLOC_DECLSPEC int hwloc_bitmap_list_sscanf(hwloc_bitmap_t bitmap, const char * __hwloc_restrict string); + +/** \brief Stringify a bitmap in the taskset-specific format. + * + * The taskset program manipulates bitmap strings that contain a single + * (possible very long) hexadecimal number starting with 0x. + * A bitmap containing bits 1, 33, 34, and all from 64 to 95 is printed as "0xffffffff0000000600000002". + * + * Up to \p buflen characters may be written in buffer \p buf. + * + * If \p buflen is 0, \p buf may safely be \c NULL. + * + * \return the number of characters that were actually written if not truncating, + * or that would have been written (not including the ending \c \0). + * \return -1 on error. + * + * \note If the bitmap is a CPU or nodeset, it contains physical indexes. + * This should be clearly indicated when displaying such bitmaps to end users. + * See also \ref faq_convert_indexes + */ +HWLOC_DECLSPEC int hwloc_bitmap_taskset_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_bitmap_t bitmap); + +/** \brief Stringify a bitmap into a newly allocated taskset-specific string. + * + * The taskset program manipulates bitmap strings that contain a single + * (possible very long) hexadecimal number starting with 0x. + * A bitmap containing bits 1, 33, 34, and all from 64 to 95 is printed as "0xffffffff0000000600000002". + * + * \return the number of characters that were written (not including the ending \c \0). + * \return -1 on error, for instance with \p errno set to \c ENOMEM on failure to allocate the output string. + * + * \note If the bitmap is a CPU or nodeset, it contains physical indexes. + * This should be clearly indicated when displaying such bitmaps to end users. + * See also \ref faq_convert_indexes + */ +HWLOC_DECLSPEC int hwloc_bitmap_taskset_asprintf(char ** strp, hwloc_const_bitmap_t bitmap); + +/** \brief Parse a taskset-specific bitmap string and stores it in bitmap \p bitmap. + * + * The taskset program manipulates bitmap strings that contain a single + * (possible very long) hexadecimal number starting with 0x. + * String "0xffffffff0000000600000002" is parsed as a bitmap containing all bits between 64 and 95, + * and bits 33, 34 and 1. + * + * \return 0 on success, -1 on error. + * + * \note If the bitmap is a CPU or nodeset, the input string must contain physical indexes. + */ +HWLOC_DECLSPEC int hwloc_bitmap_taskset_sscanf(hwloc_bitmap_t bitmap, const char * __hwloc_restrict string); + + +/* + * Building bitmaps. + */ + +/** \brief Empty the bitmap \p bitmap */ +HWLOC_DECLSPEC void hwloc_bitmap_zero(hwloc_bitmap_t bitmap); + +/** \brief Fill bitmap \p bitmap with all possible indexes (even if those objects don't exist or are otherwise unavailable) */ +HWLOC_DECLSPEC void hwloc_bitmap_fill(hwloc_bitmap_t bitmap); + +/** \brief Empty the bitmap \p bitmap and add bit \p id */ +HWLOC_DECLSPEC int hwloc_bitmap_only(hwloc_bitmap_t bitmap, unsigned id); + +/** \brief Fill the bitmap \p and clear the index \p id */ +HWLOC_DECLSPEC int hwloc_bitmap_allbut(hwloc_bitmap_t bitmap, unsigned id); + +/** \brief Setup bitmap \p bitmap from unsigned long \p mask */ +HWLOC_DECLSPEC int hwloc_bitmap_from_ulong(hwloc_bitmap_t bitmap, unsigned long mask); + +/** \brief Setup bitmap \p bitmap from unsigned long \p mask used as \p i -th subset */ +HWLOC_DECLSPEC int hwloc_bitmap_from_ith_ulong(hwloc_bitmap_t bitmap, unsigned i, unsigned long mask); + +/** \brief Setup bitmap \p bitmap from unsigned longs \p masks used as first \p nr subsets */ +HWLOC_DECLSPEC int hwloc_bitmap_from_ulongs(hwloc_bitmap_t bitmap, unsigned nr, const unsigned long *masks); + + +/* + * Modifying bitmaps. + */ + +/** \brief Add index \p id in bitmap \p bitmap */ +HWLOC_DECLSPEC int hwloc_bitmap_set(hwloc_bitmap_t bitmap, unsigned id); + +/** \brief Add indexes from \p begin to \p end in bitmap \p bitmap. + * + * If \p end is \c -1, the range is infinite. + */ +HWLOC_DECLSPEC int hwloc_bitmap_set_range(hwloc_bitmap_t bitmap, unsigned begin, int end); + +/** \brief Replace \p i -th subset of bitmap \p bitmap with unsigned long \p mask */ +HWLOC_DECLSPEC int hwloc_bitmap_set_ith_ulong(hwloc_bitmap_t bitmap, unsigned i, unsigned long mask); + +/** \brief Remove index \p id from bitmap \p bitmap */ +HWLOC_DECLSPEC int hwloc_bitmap_clr(hwloc_bitmap_t bitmap, unsigned id); + +/** \brief Remove indexes from \p begin to \p end in bitmap \p bitmap. + * + * If \p end is \c -1, the range is infinite. + */ +HWLOC_DECLSPEC int hwloc_bitmap_clr_range(hwloc_bitmap_t bitmap, unsigned begin, int end); + +/** \brief Keep a single index among those set in bitmap \p bitmap + * + * May be useful before binding so that the process does not + * have a chance of migrating between multiple processors + * in the original mask. + * Instead of running the task on any PU inside the given CPU set, + * the operating system scheduler will be forced to run it on a single + * of these PUs. + * It avoids a migration overhead and cache-line ping-pongs between PUs. + * + * \note This function is NOT meant to distribute multiple processes + * within a single CPU set. It always return the same single bit when + * called multiple times on the same input set. hwloc_distrib() may + * be used for generating CPU sets to distribute multiple tasks below + * a single multi-PU object. + * + * \note This function cannot be applied to an object set directly. It + * should be applied to a copy (which may be obtained with hwloc_bitmap_dup()). + */ +HWLOC_DECLSPEC int hwloc_bitmap_singlify(hwloc_bitmap_t bitmap); + + +/* + * Consulting bitmaps. + */ + +/** \brief Convert the beginning part of bitmap \p bitmap into unsigned long \p mask */ +HWLOC_DECLSPEC unsigned long hwloc_bitmap_to_ulong(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure; + +/** \brief Convert the \p i -th subset of bitmap \p bitmap into unsigned long mask */ +HWLOC_DECLSPEC unsigned long hwloc_bitmap_to_ith_ulong(hwloc_const_bitmap_t bitmap, unsigned i) __hwloc_attribute_pure; + +/** \brief Convert the first \p nr subsets of bitmap \p bitmap into the array of \p nr unsigned long \p masks + * + * \p nr may be determined earlier with hwloc_bitmap_nr_ulongs(). + * + * \return 0 + */ +HWLOC_DECLSPEC int hwloc_bitmap_to_ulongs(hwloc_const_bitmap_t bitmap, unsigned nr, unsigned long *masks); + +/** \brief Return the number of unsigned longs required for storing bitmap \p bitmap entirely + * + * This is the number of contiguous unsigned longs from the very first bit of the bitmap + * (even if unset) up to the last set bit. + * This is useful for knowing the \p nr parameter to pass to hwloc_bitmap_to_ulongs() + * (or which calls to hwloc_bitmap_to_ith_ulong() are needed) + * to entirely convert a bitmap into multiple unsigned longs. + * + * When called on the output of hwloc_topology_get_topology_cpuset(), + * the returned number is large enough for all cpusets of the topology. + * + * \return the number of unsigned longs required. + * \return -1 if \p bitmap is infinite. + */ +HWLOC_DECLSPEC int hwloc_bitmap_nr_ulongs(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure; + +/** \brief Test whether index \p id is part of bitmap \p bitmap. + * + * \return 1 if the bit at index \p id is set in bitmap \p bitmap, 0 otherwise. + */ +HWLOC_DECLSPEC int hwloc_bitmap_isset(hwloc_const_bitmap_t bitmap, unsigned id) __hwloc_attribute_pure; + +/** \brief Test whether bitmap \p bitmap is empty + * + * \return 1 if bitmap is empty, 0 otherwise. + */ +HWLOC_DECLSPEC int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure; + +/** \brief Test whether bitmap \p bitmap is completely full + * + * \return 1 if bitmap is full, 0 otherwise. + * + * \note A full bitmap is always infinitely set. + */ +HWLOC_DECLSPEC int hwloc_bitmap_isfull(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure; + +/** \brief Compute the first index (least significant bit) in bitmap \p bitmap + * + * \return the first index set in \p bitmap. + * \return -1 if \p bitmap is empty. + */ +HWLOC_DECLSPEC int hwloc_bitmap_first(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure; + +/** \brief Compute the next index in bitmap \p bitmap which is after index \p prev + * + * \return the first index set in \p bitmap if \p prev is \c -1. + * \return the next index set in \p bitmap if \p prev is not \c -1. + * \return -1 if no index with higher index is set in \p bitmap. + */ +HWLOC_DECLSPEC int hwloc_bitmap_next(hwloc_const_bitmap_t bitmap, int prev) __hwloc_attribute_pure; + +/** \brief Compute the last index (most significant bit) in bitmap \p bitmap + * + * \return the last index set in \p bitmap. + * \return -1 if \p bitmap is empty, or if \p bitmap is infinitely set. + */ +HWLOC_DECLSPEC int hwloc_bitmap_last(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure; + +/** \brief Compute the "weight" of bitmap \p bitmap (i.e., number of + * indexes that are in the bitmap). + * + * \return the number of indexes that are in the bitmap. + * \return -1 if \p bitmap is infinitely set. + */ +HWLOC_DECLSPEC int hwloc_bitmap_weight(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure; + +/** \brief Compute the first unset index (least significant bit) in bitmap \p bitmap + * + * \return the first unset index in \p bitmap. + * \return -1 if \p bitmap is full. + */ +HWLOC_DECLSPEC int hwloc_bitmap_first_unset(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure; + +/** \brief Compute the next unset index in bitmap \p bitmap which is after index \p prev + * + * \return the first index unset in \p bitmap if \p prev is \c -1. + * \return the next index unset in \p bitmap if \p prev is not \c -1. + * \return -1 if no index with higher index is unset in \p bitmap. + */ +HWLOC_DECLSPEC int hwloc_bitmap_next_unset(hwloc_const_bitmap_t bitmap, int prev) __hwloc_attribute_pure; + +/** \brief Compute the last unset index (most significant bit) in bitmap \p bitmap + * + * \return the last index unset in \p bitmap. + * \return -1 if \p bitmap is full, or if \p bitmap is not infinitely set. + */ +HWLOC_DECLSPEC int hwloc_bitmap_last_unset(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure; + +/** \brief Loop macro iterating on bitmap \p bitmap + * + * The loop must start with hwloc_bitmap_foreach_begin() and end + * with hwloc_bitmap_foreach_end() followed by a terminating ';'. + * + * \p id is the loop variable; it should be an unsigned int. The + * first iteration will set \p id to the lowest index in the bitmap. + * Successive iterations will iterate through, in order, all remaining + * indexes set in the bitmap. To be specific: each iteration will return a + * value for \p id such that hwloc_bitmap_isset(bitmap, id) is true. + * + * The assert prevents the loop from being infinite if the bitmap is infinitely set. + * + * \hideinitializer + */ +#define hwloc_bitmap_foreach_begin(id, bitmap) \ +do { \ + assert(hwloc_bitmap_weight(bitmap) != -1); \ + for (id = hwloc_bitmap_first(bitmap); \ + (unsigned) id != (unsigned) -1; \ + id = hwloc_bitmap_next(bitmap, id)) { + +/** \brief End of loop macro iterating on a bitmap. + * + * Needs a terminating ';'. + * + * \sa hwloc_bitmap_foreach_begin() + * \hideinitializer + */ +#define hwloc_bitmap_foreach_end() \ + } \ +} while (0) + + +/* + * Combining bitmaps. + */ + +/** \brief Or bitmaps \p bitmap1 and \p bitmap2 and store the result in bitmap \p res + * + * \p res can be the same as \p bitmap1 or \p bitmap2 + */ +HWLOC_DECLSPEC int hwloc_bitmap_or (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2); + +/** \brief And bitmaps \p bitmap1 and \p bitmap2 and store the result in bitmap \p res + * + * \p res can be the same as \p bitmap1 or \p bitmap2 + */ +HWLOC_DECLSPEC int hwloc_bitmap_and (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2); + +/** \brief And bitmap \p bitmap1 and the negation of \p bitmap2 and store the result in bitmap \p res + * + * \p res can be the same as \p bitmap1 or \p bitmap2 + */ +HWLOC_DECLSPEC int hwloc_bitmap_andnot (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2); + +/** \brief Xor bitmaps \p bitmap1 and \p bitmap2 and store the result in bitmap \p res + * + * \p res can be the same as \p bitmap1 or \p bitmap2 + */ +HWLOC_DECLSPEC int hwloc_bitmap_xor (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2); + +/** \brief Negate bitmap \p bitmap and store the result in bitmap \p res + * + * \p res can be the same as \p bitmap + */ +HWLOC_DECLSPEC int hwloc_bitmap_not (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap); + + +/* + * Comparing bitmaps. + */ + +/** \brief Test whether bitmaps \p bitmap1 and \p bitmap2 intersects. + * + * \return 1 if bitmaps intersect, 0 otherwise. + * + * \note The empty bitmap does not intersect any other bitmap. + */ +HWLOC_DECLSPEC int hwloc_bitmap_intersects (hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure; + +/** \brief Test whether bitmap \p sub_bitmap is part of bitmap \p super_bitmap. + * + * \return 1 if \p sub_bitmap is included in \p super_bitmap, 0 otherwise. + * + * \note The empty bitmap is considered included in any other bitmap. + */ +HWLOC_DECLSPEC int hwloc_bitmap_isincluded (hwloc_const_bitmap_t sub_bitmap, hwloc_const_bitmap_t super_bitmap) __hwloc_attribute_pure; + +/** \brief Test whether bitmap \p bitmap1 is equal to bitmap \p bitmap2. + * + * \return 1 if bitmaps are equal, 0 otherwise. + */ +HWLOC_DECLSPEC int hwloc_bitmap_isequal (hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure; + +/** \brief Compare bitmaps \p bitmap1 and \p bitmap2 using their lowest index. + * + * A bitmap is considered smaller if its least significant bit is smaller. + * The empty bitmap is considered higher than anything (because its least significant bit does not exist). + * + * \return -1 if \p bitmap1 is considered smaller than \p bitmap2. + * \return 1 if \p bitmap1 is considered larger than \p bitmap2. + * + * For instance comparing binary bitmaps 0011 and 0110 returns -1 + * (hence 0011 is considered smaller than 0110) + * because least significant bit of 0011 (0001) is smaller than least significant bit of 0110 (0010). + * Comparing 01001 and 00110 would also return -1 for the same reason. + * + * \return 0 if bitmaps are considered equal, even if they are not strictly equal. + * They just need to have the same least significant bit. + * For instance, comparing binary bitmaps 0010 and 0110 returns 0 because they have the same least significant bit. + */ +HWLOC_DECLSPEC int hwloc_bitmap_compare_first(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure; + +/** \brief Compare bitmaps \p bitmap1 and \p bitmap2 in lexicographic order. + * + * Lexicographic comparison of bitmaps, starting for their highest indexes. + * Compare last indexes first, then second, etc. + * The empty bitmap is considered lower than anything. + * + * \return -1 if \p bitmap1 is considered smaller than \p bitmap2. + * \return 1 if \p bitmap1 is considered larger than \p bitmap2. + * \return 0 if bitmaps are equal (contrary to hwloc_bitmap_compare_first()). + * + * For instance comparing binary bitmaps 0011 and 0110 returns -1 + * (hence 0011 is considered smaller than 0110). + * Comparing 00101 and 01010 returns -1 too. + * + * \note This is different from the non-existing hwloc_bitmap_compare_last() + * which would only compare the highest index of each bitmap. + */ +HWLOC_DECLSPEC int hwloc_bitmap_compare(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure; + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_BITMAP_H */ diff --git a/src/deps/hwloc/include/hwloc/cpukinds.h b/src/deps/hwloc/include/hwloc/cpukinds.h new file mode 100644 index 000000000..b50050ab2 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/cpukinds.h @@ -0,0 +1,194 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2020-2021 Inria. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Kinds of CPU cores. + */ + +#ifndef HWLOC_CPUKINDS_H +#define HWLOC_CPUKINDS_H + +#include "hwloc.h" + +#ifdef __cplusplus +extern "C" { +#elif 0 +} +#endif + +/** \defgroup hwlocality_cpukinds Kinds of CPU cores + * + * Platforms with heterogeneous CPUs may have some cores with + * different features or frequencies. + * This API exposes identical PUs in sets called CPU kinds. + * Each PU of the topology may only be in a single kind. + * + * The number of kinds may be obtained with hwloc_cpukinds_get_nr(). + * If the platform is homogeneous, there may be a single kind + * with all PUs. + * If the platform or operating system does not expose any + * information about CPU cores, there may be no kind at all. + * + * The index of the kind that describes a given CPU set + * (if any, and not partially) + * may be obtained with hwloc_cpukinds_get_by_cpuset(). + * + * From the index of a kind, it is possible to retrieve information + * with hwloc_cpukinds_get_info(): + * an abstracted efficiency value, + * and an array of info attributes + * (for instance the "CoreType" and "FrequencyMaxMHz", + * see \ref topoattrs_cpukinds). + * + * A higher efficiency value means greater intrinsic performance + * (and possibly less performance/power efficiency). + * Kinds with lower efficiency values are ranked first: + * Passing 0 as \p kind_index to hwloc_cpukinds_get_info() will + * return information about the CPU kind with lower performance + * but higher energy-efficiency. + * Higher \p kind_index values would rather return information + * about power-hungry high-performance cores. + * + * When available, efficiency values are gathered from the operating system. + * If so, \p cpukind_efficiency is set in the struct hwloc_topology_discovery_support array. + * This is currently available on Windows 10, Mac OS X (Darwin), + * and on some Linux platforms where core "capacity" is exposed in sysfs. + * + * If the operating system does not expose core efficiencies natively, + * hwloc tries to compute efficiencies by comparing CPU kinds using + * frequencies (on ARM), or core types and frequencies (on other architectures). + * The environment variable HWLOC_CPUKINDS_RANKING may be used + * to change this heuristics, see \ref envvar_heuristics. + * + * If hwloc fails to rank any kind, for instance because the operating + * system does not expose efficiencies and core frequencies, + * all kinds will have an unknown efficiency (\c -1), + * and they are not indexed/ordered in any specific way. + * + * @{ + */ + +/** \brief Get the number of different kinds of CPU cores in the topology. + * + * \p flags must be \c 0 for now. + * + * \return The number of CPU kinds (positive integer) on success. + * \return \c 0 if no information about kinds was found. + * \return \c -1 with \p errno set to \c EINVAL if \p flags is invalid. + */ +HWLOC_DECLSPEC int +hwloc_cpukinds_get_nr(hwloc_topology_t topology, + unsigned long flags); + +/** \brief Get the index of the CPU kind that contains CPUs listed in \p cpuset. + * + * \p flags must be \c 0 for now. + * + * \return The index of the CPU kind (positive integer or 0) on success. + * \return \c -1 with \p errno set to \c EXDEV if \p cpuset is + * only partially included in the some kind. + * \return \c -1 with \p errno set to \c ENOENT if \p cpuset is + * not included in any kind, even partially. + * \return \c -1 with \p errno set to \c EINVAL if parameters are invalid. + */ +HWLOC_DECLSPEC int +hwloc_cpukinds_get_by_cpuset(hwloc_topology_t topology, + hwloc_const_bitmap_t cpuset, + unsigned long flags); + +/** \brief Get the CPU set and infos about a CPU kind in the topology. + * + * \p kind_index identifies one kind of CPU between 0 and the number + * of kinds returned by hwloc_cpukinds_get_nr() minus 1. + * + * If not \c NULL, the bitmap \p cpuset will be filled with + * the set of PUs of this kind. + * + * The integer pointed by \p efficiency, if not \c NULL will, be filled + * with the ranking of this kind of CPU in term of efficiency (see above). + * It ranges from \c 0 to the number of kinds + * (as reported by hwloc_cpukinds_get_nr()) minus 1. + * + * Kinds with lower efficiency are reported first. + * + * If there is a single kind in the topology, its efficiency \c 0. + * If the efficiency of some kinds of cores is unknown, + * the efficiency of all kinds is set to \c -1, + * and kinds are reported in no specific order. + * + * The array of info attributes (for instance the "CoreType", + * "FrequencyMaxMHz" or "FrequencyBaseMHz", see \ref topoattrs_cpukinds) + * and its length are returned in \p infos or \p nr_infos. + * The array belongs to the topology, it should not be freed or modified. + * + * If \p nr_infos or \p infos is \c NULL, no info is returned. + * + * \p flags must be \c 0 for now. + * + * \return \c 0 on success. + * \return \c -1 with \p errno set to \c ENOENT if \p kind_index does not match any CPU kind. + * \return \c -1 with \p errno set to \c EINVAL if parameters are invalid. + */ +HWLOC_DECLSPEC int +hwloc_cpukinds_get_info(hwloc_topology_t topology, + unsigned kind_index, + hwloc_bitmap_t cpuset, + int *efficiency, + unsigned *nr_infos, struct hwloc_info_s **infos, + unsigned long flags); + +/** \brief Register a kind of CPU in the topology. + * + * Mark the PUs listed in \p cpuset as being of the same kind + * with respect to the given attributes. + * + * \p forced_efficiency should be \c -1 if unknown. + * Otherwise it is an abstracted efficiency value to enforce + * the ranking of all kinds if all of them have valid (and + * different) efficiencies. + * + * The array \p infos of size \p nr_infos may be used to provide + * info names and values describing this kind of PUs. + * + * \p flags must be \c 0 for now. + * + * Parameters \p cpuset and \p infos will be duplicated internally, + * the caller is responsible for freeing them. + * + * If \p cpuset overlaps with some existing kinds, those might get + * modified or split. For instance if existing kind A contains + * PUs 0 and 1, and one registers another kind for PU 1 and 2, + * there will be 3 resulting kinds: + * existing kind A is restricted to only PU 0; + * new kind B contains only PU 1 and combines information from A + * and from the newly-registered kind; + * new kind C contains only PU 2 and only gets information from + * the newly-registered kind. + * + * \note The efficiency \p forced_efficiency provided to this function + * may be different from the one reported later by hwloc_cpukinds_get_info() + * because hwloc will scale efficiency values down to + * between 0 and the number of kinds minus 1. + * + * \return \c 0 on success. + * \return \c -1 with \p errno set to \c EINVAL if some parameters are invalid, + * for instance if \p cpuset is \c NULL or empty. + */ +HWLOC_DECLSPEC int +hwloc_cpukinds_register(hwloc_topology_t topology, + hwloc_bitmap_t cpuset, + int forced_efficiency, + unsigned nr_infos, struct hwloc_info_s *infos, + unsigned long flags); + +/** @} */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_CPUKINDS_H */ diff --git a/src/deps/hwloc/include/hwloc/cuda.h b/src/deps/hwloc/include/hwloc/cuda.h new file mode 100644 index 000000000..db9778e58 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/cuda.h @@ -0,0 +1,227 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2010-2023 Inria. All rights reserved. + * Copyright © 2010-2011 Université Bordeaux + * Copyright © 2011 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and the CUDA Driver API. + * + * Applications that use both hwloc and the CUDA Driver API may want to + * include this file so as to get topology information for CUDA devices. + * + */ + +#ifndef HWLOC_CUDA_H +#define HWLOC_CUDA_H + +#include "hwloc.h" +#include "hwloc/autogen/config.h" +#include "hwloc/helper.h" +#ifdef HWLOC_LINUX_SYS +#include "hwloc/linux.h" +#endif + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_cuda Interoperability with the CUDA Driver API + * + * This interface offers ways to retrieve topology information about + * CUDA devices when using the CUDA Driver API. + * + * @{ + */ + +/** \brief Return the domain, bus and device IDs of the CUDA device \p cudevice. + * + * Device \p cudevice must match the local machine. + * + * \return 0 on success. + * \return -1 on error, for instance if device information could not be found. + */ +static __hwloc_inline int +hwloc_cuda_get_device_pci_ids(hwloc_topology_t topology __hwloc_attribute_unused, + CUdevice cudevice, int *domain, int *bus, int *dev) +{ + CUresult cres; + +#if CUDA_VERSION >= 4000 + cres = cuDeviceGetAttribute(domain, CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, cudevice); + if (cres != CUDA_SUCCESS) { + errno = ENOSYS; + return -1; + } +#else + *domain = 0; +#endif + cres = cuDeviceGetAttribute(bus, CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, cudevice); + if (cres != CUDA_SUCCESS) { + errno = ENOSYS; + return -1; + } + cres = cuDeviceGetAttribute(dev, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, cudevice); + if (cres != CUDA_SUCCESS) { + errno = ENOSYS; + return -1; + } + + return 0; +} + +/** \brief Get the CPU set of processors that are physically + * close to device \p cudevice. + * + * Store in \p set the CPU-set describing the locality of the CUDA device \p cudevice. + * + * Topology \p topology and device \p cudevice must match the local machine. + * I/O devices detection and the CUDA component are not needed in the topology. + * + * The function only returns the locality of the device. + * If more information about the device is needed, OS objects should + * be used instead, see hwloc_cuda_get_device_osdev() + * and hwloc_cuda_get_device_osdev_by_index(). + * + * This function is currently only implemented in a meaningful way for + * Linux; other systems will simply get a full cpuset. + * + * \return 0 on success. + * \return -1 on error, for instance if device information could not be found. + */ +static __hwloc_inline int +hwloc_cuda_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused, + CUdevice cudevice, hwloc_cpuset_t set) +{ +#ifdef HWLOC_LINUX_SYS + /* If we're on Linux, use the sysfs mechanism to get the local cpus */ +#define HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX 128 + char path[HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX]; + int domainid, busid, deviceid; + + if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domainid, &busid, &deviceid)) + return -1; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return -1; + } + + sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", domainid, busid, deviceid); + if (hwloc_linux_read_path_as_cpumask(path, set) < 0 + || hwloc_bitmap_iszero(set)) + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#else + /* Non-Linux systems simply get a full cpuset */ + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#endif + return 0; +} + +/** \brief Get the hwloc PCI device object corresponding to the + * CUDA device \p cudevice. + * + * \return The hwloc PCI device object describing the CUDA device \p cudevice. + * \return \c NULL if none could be found. + * + * Topology \p topology and device \p cudevice must match the local machine. + * I/O devices detection must be enabled in topology \p topology. + * The CUDA component is not needed in the topology. + */ +static __hwloc_inline hwloc_obj_t +hwloc_cuda_get_device_pcidev(hwloc_topology_t topology, CUdevice cudevice) +{ + int domain, bus, dev; + + if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev)) + return NULL; + + return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0); +} + +/** \brief Get the hwloc OS device object corresponding to CUDA device \p cudevice. + * + * \return The hwloc OS device object that describes the given CUDA device \p cudevice. + * \return \c NULL if none could be found. + * + * Topology \p topology and device \p cudevice must match the local machine. + * I/O devices detection and the CUDA component must be enabled in the topology. + * If not, the locality of the object may still be found using + * hwloc_cuda_get_device_cpuset(). + * + * \note This function cannot work if PCI devices are filtered out. + * + * \note The corresponding hwloc PCI device may be found by looking + * at the result parent pointer (unless PCI devices are filtered out). + */ +static __hwloc_inline hwloc_obj_t +hwloc_cuda_get_device_osdev(hwloc_topology_t topology, CUdevice cudevice) +{ + hwloc_obj_t osdev = NULL; + int domain, bus, dev; + + if (hwloc_cuda_get_device_pci_ids(topology, cudevice, &domain, &bus, &dev)) + return NULL; + + osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + hwloc_obj_t pcidev = osdev->parent; + if (strncmp(osdev->name, "cuda", 4)) + continue; + if (pcidev + && pcidev->type == HWLOC_OBJ_PCI_DEVICE + && (int) pcidev->attr->pcidev.domain == domain + && (int) pcidev->attr->pcidev.bus == bus + && (int) pcidev->attr->pcidev.dev == dev + && pcidev->attr->pcidev.func == 0) + return osdev; + /* if PCI are filtered out, we need a info attr to match on */ + } + + return NULL; +} + +/** \brief Get the hwloc OS device object corresponding to the + * CUDA device whose index is \p idx. + * + * \return The hwloc OS device object describing the CUDA device whose index is \p idx. + * \return \c NULL if none could be found. + * + * The topology \p topology does not necessarily have to match the current + * machine. For instance the topology may be an XML import of a remote host. + * I/O devices detection and the CUDA component must be enabled in the topology. + * + * \note The corresponding PCI device object can be obtained by looking + * at the OS device parent object (unless PCI devices are filtered out). + * + * \note This function is identical to hwloc_cudart_get_device_osdev_by_index(). + */ +static __hwloc_inline hwloc_obj_t +hwloc_cuda_get_device_osdev_by_index(hwloc_topology_t topology, unsigned idx) +{ + hwloc_obj_t osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type + && osdev->name + && !strncmp("cuda", osdev->name, 4) + && atoi(osdev->name + 4) == (int) idx) + return osdev; + } + return NULL; +} + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_CUDA_H */ diff --git a/src/deps/hwloc/include/hwloc/cudart.h b/src/deps/hwloc/include/hwloc/cudart.h new file mode 100644 index 000000000..25a92a098 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/cudart.h @@ -0,0 +1,184 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2010-2023 Inria. All rights reserved. + * Copyright © 2010-2011 Université Bordeaux + * Copyright © 2011 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and the CUDA Runtime API. + * + * Applications that use both hwloc and the CUDA Runtime API may want to + * include this file so as to get topology information for CUDA devices. + * + */ + +#ifndef HWLOC_CUDART_H +#define HWLOC_CUDART_H + +#include "hwloc.h" +#include "hwloc/autogen/config.h" +#include "hwloc/helper.h" +#ifdef HWLOC_LINUX_SYS +#include "hwloc/linux.h" +#endif + +#include /* for CUDA_VERSION */ +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_cudart Interoperability with the CUDA Runtime API + * + * This interface offers ways to retrieve topology information about + * CUDA devices when using the CUDA Runtime API. + * + * @{ + */ + +/** \brief Return the domain, bus and device IDs of the CUDA device whose index is \p idx. + * + * Device index \p idx must match the local machine. + * + * \return 0 on success. + * \return -1 on error, for instance if device information could not be found. + */ +static __hwloc_inline int +hwloc_cudart_get_device_pci_ids(hwloc_topology_t topology __hwloc_attribute_unused, + int idx, int *domain, int *bus, int *dev) +{ + cudaError_t cerr; + struct cudaDeviceProp prop; + + cerr = cudaGetDeviceProperties(&prop, idx); + if (cerr) { + errno = ENOSYS; + return -1; + } + +#if CUDA_VERSION >= 4000 + *domain = prop.pciDomainID; +#else + *domain = 0; +#endif + + *bus = prop.pciBusID; + *dev = prop.pciDeviceID; + + return 0; +} + +/** \brief Get the CPU set of processors that are physically + * close to device \p idx. + * + * Store in \p set the CPU-set describing the locality of the CUDA device + * whose index is \p idx. + * + * Topology \p topology and device \p idx must match the local machine. + * I/O devices detection and the CUDA component are not needed in the topology. + * + * The function only returns the locality of the device. + * If more information about the device is needed, OS objects should + * be used instead, see hwloc_cudart_get_device_osdev_by_index(). + * + * This function is currently only implemented in a meaningful way for + * Linux; other systems will simply get a full cpuset. + * + * \return 0 on success. + * \return -1 on error, for instance if device information could not be found. + */ +static __hwloc_inline int +hwloc_cudart_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused, + int idx, hwloc_cpuset_t set) +{ +#ifdef HWLOC_LINUX_SYS + /* If we're on Linux, use the sysfs mechanism to get the local cpus */ +#define HWLOC_CUDART_DEVICE_SYSFS_PATH_MAX 128 + char path[HWLOC_CUDART_DEVICE_SYSFS_PATH_MAX]; + int domain, bus, dev; + + if (hwloc_cudart_get_device_pci_ids(topology, idx, &domain, &bus, &dev)) + return -1; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return -1; + } + + sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", (unsigned) domain, (unsigned) bus, (unsigned) dev); + if (hwloc_linux_read_path_as_cpumask(path, set) < 0 + || hwloc_bitmap_iszero(set)) + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#else + /* Non-Linux systems simply get a full cpuset */ + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#endif + return 0; +} + +/** \brief Get the hwloc PCI device object corresponding to the + * CUDA device whose index is \p idx. + * + * \return The hwloc PCI device object describing the CUDA device whose index is \p idx. + * \return \c NULL if none could be found. + * + * Topology \p topology and device \p idx must match the local machine. + * I/O devices detection must be enabled in topology \p topology. + * The CUDA component is not needed in the topology. + */ +static __hwloc_inline hwloc_obj_t +hwloc_cudart_get_device_pcidev(hwloc_topology_t topology, int idx) +{ + int domain, bus, dev; + + if (hwloc_cudart_get_device_pci_ids(topology, idx, &domain, &bus, &dev)) + return NULL; + + return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, 0); +} + +/** \brief Get the hwloc OS device object corresponding to the + * CUDA device whose index is \p idx. + * + * \return The hwloc OS device object describing the CUDA device whose index is \p idx. + * \return \c NULL if none could be found. + * + * The topology \p topology does not necessarily have to match the current + * machine. For instance the topology may be an XML import of a remote host. + * I/O devices detection and the CUDA component must be enabled in the topology. + * If not, the locality of the object may still be found using + * hwloc_cudart_get_device_cpuset(). + * + * \note The corresponding PCI device object can be obtained by looking + * at the OS device parent object (unless PCI devices are filtered out). + * + * \note This function is identical to hwloc_cuda_get_device_osdev_by_index(). + */ +static __hwloc_inline hwloc_obj_t +hwloc_cudart_get_device_osdev_by_index(hwloc_topology_t topology, unsigned idx) +{ + hwloc_obj_t osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type + && osdev->name + && !strncmp("cuda", osdev->name, 4) + && atoi(osdev->name + 4) == (int) idx) + return osdev; + } + return NULL; +} + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_CUDART_H */ diff --git a/src/deps/hwloc/include/hwloc/deprecated.h b/src/deps/hwloc/include/hwloc/deprecated.h new file mode 100644 index 000000000..aef2716ae --- /dev/null +++ b/src/deps/hwloc/include/hwloc/deprecated.h @@ -0,0 +1,218 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2022 Inria. All rights reserved. + * Copyright © 2009-2012 Université Bordeaux + * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/** + * This file contains the inline code of functions declared in hwloc.h + */ + +#ifndef HWLOC_DEPRECATED_H +#define HWLOC_DEPRECATED_H + +#ifndef HWLOC_H +#error Please include the main hwloc.h instead +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* backward compat with v2.0 before WHOLE_SYSTEM renaming */ +#define HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED +/* backward compat with v1.11 before System removal */ +#define HWLOC_OBJ_SYSTEM HWLOC_OBJ_MACHINE +/* backward compat with v1.10 before Socket->Package renaming */ +#define HWLOC_OBJ_SOCKET HWLOC_OBJ_PACKAGE +/* backward compat with v1.10 before Node->NUMANode clarification */ +#define HWLOC_OBJ_NODE HWLOC_OBJ_NUMANODE + +/** \brief Add a distances structure. + * + * Superseded by hwloc_distances_add_create()+hwloc_distances_add_values()+hwloc_distances_add_commit() + * in v2.5. + */ +HWLOC_DECLSPEC int hwloc_distances_add(hwloc_topology_t topology, + unsigned nbobjs, hwloc_obj_t *objs, hwloc_uint64_t *values, + unsigned long kind, unsigned long flags) __hwloc_attribute_deprecated; + +/** \brief Insert a misc object by parent. + * + * Identical to hwloc_topology_insert_misc_object(). + */ +static __hwloc_inline hwloc_obj_t +hwloc_topology_insert_misc_object_by_parent(hwloc_topology_t topology, hwloc_obj_t parent, const char *name) __hwloc_attribute_deprecated; +static __hwloc_inline hwloc_obj_t +hwloc_topology_insert_misc_object_by_parent(hwloc_topology_t topology, hwloc_obj_t parent, const char *name) +{ + return hwloc_topology_insert_misc_object(topology, parent, name); +} + +/** \brief Stringify the cpuset containing a set of objects. + * + * If \p size is 0, \p string may safely be \c NULL. + * + * \return the number of characters that were actually written if not truncating, + * or that would have been written (not including the ending \\0). + */ +static __hwloc_inline int +hwloc_obj_cpuset_snprintf(char *str, size_t size, size_t nobj, struct hwloc_obj * const *objs) __hwloc_attribute_deprecated; +static __hwloc_inline int +hwloc_obj_cpuset_snprintf(char *str, size_t size, size_t nobj, struct hwloc_obj * const *objs) +{ + hwloc_bitmap_t set = hwloc_bitmap_alloc(); + int res; + unsigned i; + + hwloc_bitmap_zero(set); + for(i=0; icpuset) + hwloc_bitmap_or(set, set, objs[i]->cpuset); + + res = hwloc_bitmap_snprintf(str, size, set); + hwloc_bitmap_free(set); + return res; +} + +/** \brief Convert a type string into a type and some attributes. + * + * Deprecated by hwloc_type_sscanf() + */ +static __hwloc_inline int +hwloc_obj_type_sscanf(const char *string, hwloc_obj_type_t *typep, int *depthattrp, void *typeattrp, size_t typeattrsize) __hwloc_attribute_deprecated; +static __hwloc_inline int +hwloc_obj_type_sscanf(const char *string, hwloc_obj_type_t *typep, int *depthattrp, void *typeattrp, size_t typeattrsize) +{ + union hwloc_obj_attr_u attr; + int err = hwloc_type_sscanf(string, typep, &attr, sizeof(attr)); + if (err < 0) + return err; + if (hwloc_obj_type_is_cache(*typep)) { + if (depthattrp) + *depthattrp = (int) attr.cache.depth; + if (typeattrp && typeattrsize >= sizeof(hwloc_obj_cache_type_t)) + memcpy(typeattrp, &attr.cache.type, sizeof(hwloc_obj_cache_type_t)); + } else if (*typep == HWLOC_OBJ_GROUP) { + if (depthattrp) + *depthattrp = (int) attr.group.depth; + } + return 0; +} + +/** \brief Set the default memory binding policy of the current + * process or thread to prefer the NUMA node(s) specified by physical \p nodeset + */ +static __hwloc_inline int +hwloc_set_membind_nodeset(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_deprecated; +static __hwloc_inline int +hwloc_set_membind_nodeset(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) +{ + return hwloc_set_membind(topology, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET); +} + +/** \brief Query the default memory binding policy and physical locality of the + * current process or thread. + */ +static __hwloc_inline int +hwloc_get_membind_nodeset(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags) __hwloc_attribute_deprecated; +static __hwloc_inline int +hwloc_get_membind_nodeset(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags) +{ + return hwloc_get_membind(topology, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET); +} + +/** \brief Set the default memory binding policy of the specified + * process to prefer the NUMA node(s) specified by physical \p nodeset + */ +static __hwloc_inline int +hwloc_set_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_deprecated; +static __hwloc_inline int +hwloc_set_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) +{ + return hwloc_set_proc_membind(topology, pid, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET); +} + +/** \brief Query the default memory binding policy and physical locality of the + * specified process. + */ +static __hwloc_inline int +hwloc_get_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags) __hwloc_attribute_deprecated; +static __hwloc_inline int +hwloc_get_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags) +{ + return hwloc_get_proc_membind(topology, pid, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET); +} + +/** \brief Bind the already-allocated memory identified by (addr, len) + * to the NUMA node(s) in physical \p nodeset. + */ +static __hwloc_inline int +hwloc_set_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_deprecated; +static __hwloc_inline int +hwloc_set_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) +{ + return hwloc_set_area_membind(topology, addr, len, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET); +} + +/** \brief Query the physical NUMA node(s) and binding policy of the memory + * identified by (\p addr, \p len ). + */ +static __hwloc_inline int +hwloc_get_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags) __hwloc_attribute_deprecated; +static __hwloc_inline int +hwloc_get_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags) +{ + return hwloc_get_area_membind(topology, addr, len, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET); +} + +/** \brief Allocate some memory on the given physical nodeset \p nodeset + */ +static __hwloc_inline void * +hwloc_alloc_membind_nodeset(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_malloc __hwloc_attribute_deprecated; +static __hwloc_inline void * +hwloc_alloc_membind_nodeset(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) +{ + return hwloc_alloc_membind(topology, len, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET); +} + +/** \brief Allocate some memory on the given nodeset \p nodeset. + */ +static __hwloc_inline void * +hwloc_alloc_membind_policy_nodeset(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) __hwloc_attribute_malloc __hwloc_attribute_deprecated; +static __hwloc_inline void * +hwloc_alloc_membind_policy_nodeset(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) +{ + return hwloc_alloc_membind_policy(topology, len, nodeset, policy, flags | HWLOC_MEMBIND_BYNODESET); +} + +/** \brief Convert a CPU set into a NUMA node set and handle non-NUMA cases + */ +static __hwloc_inline void +hwloc_cpuset_to_nodeset_strict(hwloc_topology_t topology, hwloc_const_cpuset_t _cpuset, hwloc_nodeset_t nodeset) __hwloc_attribute_deprecated; +static __hwloc_inline void +hwloc_cpuset_to_nodeset_strict(hwloc_topology_t topology, hwloc_const_cpuset_t _cpuset, hwloc_nodeset_t nodeset) +{ + hwloc_cpuset_to_nodeset(topology, _cpuset, nodeset); +} + +/** \brief Convert a NUMA node set into a CPU set and handle non-NUMA cases + */ +static __hwloc_inline void +hwloc_cpuset_from_nodeset_strict(hwloc_topology_t topology, hwloc_cpuset_t _cpuset, hwloc_const_nodeset_t nodeset) __hwloc_attribute_deprecated; +static __hwloc_inline void +hwloc_cpuset_from_nodeset_strict(hwloc_topology_t topology, hwloc_cpuset_t _cpuset, hwloc_const_nodeset_t nodeset) +{ + hwloc_cpuset_from_nodeset(topology, _cpuset, nodeset); +} + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_DEPRECATED_H */ diff --git a/src/deps/hwloc/include/hwloc/diff.h b/src/deps/hwloc/include/hwloc/diff.h new file mode 100644 index 000000000..d13025863 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/diff.h @@ -0,0 +1,305 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2013-2024 Inria. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Topology differences. + */ + +#ifndef HWLOC_DIFF_H +#define HWLOC_DIFF_H + +#ifndef HWLOC_H +#error Please include the main hwloc.h instead +#endif + + +#ifdef __cplusplus +extern "C" { +#elif 0 +} +#endif + + +/** \defgroup hwlocality_diff Topology differences + * + * Applications that manipulate many similar topologies, for instance + * one for each node of a homogeneous cluster, may want to compress + * topologies to reduce the memory footprint. + * + * This file offers a way to manipulate the difference between topologies + * and export/import it to/from XML. + * Compression may therefore be achieved by storing one topology + * entirely while the others are only described by their differences + * with the former. + * The actual topology can be reconstructed when actually needed by + * applying the precomputed difference to the reference topology. + * + * This interface targets very similar nodes. + * Only very simple differences between topologies are actually + * supported, for instance a change in the memory size, the name + * of the object, or some info attribute. + * More complex differences such as adding or removing objects cannot + * be represented in the difference structures and therefore return + * errors. + * Differences between object sets or topology-wide allowed sets, + * cannot be represented either. + * + * It means that there is no need to apply the difference when + * looking at the tree organization (how many levels, how many + * objects per level, what kind of objects, CPU and node sets, etc) + * and when binding to objects. + * However the difference must be applied when looking at object + * attributes such as the name, the memory size or info attributes. + * + * @{ + */ + + +/** \brief Type of one object attribute difference. + */ +typedef enum hwloc_topology_diff_obj_attr_type_e { + /** \brief The object local memory is modified. + * The union is a hwloc_topology_diff_obj_attr_u::hwloc_topology_diff_obj_attr_uint64_s + * (and the index field is ignored). + */ + HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_SIZE, + + /** \brief The object name is modified. + * The union is a hwloc_topology_diff_obj_attr_u::hwloc_topology_diff_obj_attr_string_s + * (and the name field is ignored). + */ + + HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_NAME, + /** \brief the value of an info attribute is modified. + * The union is a hwloc_topology_diff_obj_attr_u::hwloc_topology_diff_obj_attr_string_s. + */ + HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_INFO +} hwloc_topology_diff_obj_attr_type_t; + +/** \brief One object attribute difference. + */ +union hwloc_topology_diff_obj_attr_u { + struct hwloc_topology_diff_obj_attr_generic_s { + /* each part of the union must start with these */ + hwloc_topology_diff_obj_attr_type_t type; + } generic; + + /** \brief Integer attribute modification with an optional index. */ + struct hwloc_topology_diff_obj_attr_uint64_s { + /* used for storing integer attributes */ + hwloc_topology_diff_obj_attr_type_t type; + hwloc_uint64_t index; /* not used for SIZE */ + hwloc_uint64_t oldvalue; + hwloc_uint64_t newvalue; + } uint64; + + /** \brief String attribute modification with an optional name */ + struct hwloc_topology_diff_obj_attr_string_s { + /* used for storing name and info pairs */ + hwloc_topology_diff_obj_attr_type_t type; + char *name; /* not used for NAME */ + char *oldvalue; + char *newvalue; + } string; +}; + + +/** \brief Type of one element of a difference list. + */ +typedef enum hwloc_topology_diff_type_e { + /** \brief An object attribute was changed. + * The union is a hwloc_topology_diff_u::hwloc_topology_diff_obj_attr_s. + */ + HWLOC_TOPOLOGY_DIFF_OBJ_ATTR, + + /** \brief The difference is too complex, + * it cannot be represented. The difference below + * this object has not been checked. + * hwloc_topology_diff_build() will return 1. + * + * The union is a hwloc_topology_diff_u::hwloc_topology_diff_too_complex_s. + */ + HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX +} hwloc_topology_diff_type_t; + +/** \brief One element of a difference list between two topologies. + */ +typedef union hwloc_topology_diff_u { + struct hwloc_topology_diff_generic_s { + /* each part of the union must start with these */ + hwloc_topology_diff_type_t type; + union hwloc_topology_diff_u * next; /* pointer to the next element of the list, or NULL */ + } generic; + + /* A difference in an object attribute. */ + struct hwloc_topology_diff_obj_attr_s { + hwloc_topology_diff_type_t type; /* must be ::HWLOC_TOPOLOGY_DIFF_OBJ_ATTR */ + union hwloc_topology_diff_u * next; + /* List of attribute differences for a single object */ + int obj_depth; + unsigned obj_index; + union hwloc_topology_diff_obj_attr_u diff; + } obj_attr; + + /* A difference that is too complex. */ + struct hwloc_topology_diff_too_complex_s { + hwloc_topology_diff_type_t type; /* must be ::HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX */ + union hwloc_topology_diff_u * next; + /* Where we had to stop computing the diff in the first topology */ + int obj_depth; + unsigned obj_index; + } too_complex; +} * hwloc_topology_diff_t; + + +/** \brief Compute the difference between 2 topologies. + * + * The difference is stored as a list of ::hwloc_topology_diff_t entries + * starting at \p diff. + * It is computed by doing a depth-first traversal of both topology trees + * simultaneously. + * + * If the difference between 2 objects is too complex to be represented + * (for instance if some objects have different types, or different numbers + * of children), a special diff entry of type ::HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX + * is queued. + * The computation of the diff does not continue below these objects. + * So each such diff entry means that the difference between two subtrees + * could not be computed. + * + * \return 0 if the difference can be represented properly. + * + * \return 0 with \p diff pointing to NULL if there is no difference + * between the topologies. + * + * \return 1 if the difference is too complex (see above). Some entries in + * the list will be of type ::HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX. + * + * \return -1 on any other error. + * + * \note \p flags is currently not used. It should be 0. + * + * \note The output diff has to be freed with hwloc_topology_diff_destroy(). + * + * \note The output diff can only be exported to XML or passed to + * hwloc_topology_diff_apply() if 0 was returned, i.e. if no entry of type + * ::HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX is listed. + * + * \note The output diff may be modified by removing some entries from + * the list. The removed entries should be freed by passing them to + * to hwloc_topology_diff_destroy() (possible as another list). +*/ +HWLOC_DECLSPEC int hwloc_topology_diff_build(hwloc_topology_t topology, hwloc_topology_t newtopology, unsigned long flags, hwloc_topology_diff_t *diff); + +/** \brief Flags to be given to hwloc_topology_diff_apply(). + */ +enum hwloc_topology_diff_apply_flags_e { + /** \brief Apply topology diff in reverse direction. + * \hideinitializer + */ + HWLOC_TOPOLOGY_DIFF_APPLY_REVERSE = (1UL<<0) +}; + +/** \brief Apply a topology diff to an existing topology. + * + * \p flags is an OR'ed set of ::hwloc_topology_diff_apply_flags_e. + * + * The new topology is modified in place. hwloc_topology_dup() + * may be used to duplicate it before patching. + * + * If the difference cannot be applied entirely, all previous applied + * elements are unapplied before returning. + * + * \return 0 on success. + * + * \return -N if applying the difference failed while trying + * to apply the N-th part of the difference. For instance -1 + * is returned if the very first difference element could not + * be applied. + */ +HWLOC_DECLSPEC int hwloc_topology_diff_apply(hwloc_topology_t topology, hwloc_topology_diff_t diff, unsigned long flags); + +/** \brief Destroy a list of topology differences. + * + * \return 0. + */ +HWLOC_DECLSPEC int hwloc_topology_diff_destroy(hwloc_topology_diff_t diff); + +/** \brief Load a list of topology differences from a XML file. + * + * If not \c NULL, \p refname will be filled with the identifier + * string of the reference topology for the difference file, + * if any was specified in the XML file. + * This identifier is usually the name of the other XML file + * that contains the reference topology. + * + * \return 0 on success, -1 on error. + * + * \note the pointer returned in refname should later be freed + * by the caller. + */ +HWLOC_DECLSPEC int hwloc_topology_diff_load_xml(const char *xmlpath, hwloc_topology_diff_t *diff, char **refname); + +/** \brief Export a list of topology differences to a XML file. + * + * If not \c NULL, \p refname defines an identifier string + * for the reference topology which was used as a base when + * computing this difference. + * This identifier is usually the name of the other XML file + * that contains the reference topology. + * This attribute is given back when reading the diff from XML. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_topology_diff_export_xml(hwloc_topology_diff_t diff, const char *refname, const char *xmlpath); + +/** \brief Load a list of topology differences from a XML buffer. + * + * Build a list of differences from the XML memory buffer given + * at \p xmlbuffer and of length \p buflen (including an ending \c \0). + * This buffer may have been filled earlier with + * hwloc_topology_diff_export_xmlbuffer(). + * + * If not \c NULL, \p refname will be filled with the identifier + * string of the reference topology for the difference file, + * if any was specified in the XML file. + * This identifier is usually the name of the other XML file + * that contains the reference topology. + * + * \return 0 on success, -1 on error. + * + * \note the pointer returned in refname should later be freed + * by the caller. + */ +HWLOC_DECLSPEC int hwloc_topology_diff_load_xmlbuffer(const char *xmlbuffer, int buflen, hwloc_topology_diff_t *diff, char **refname); + +/** \brief Export a list of topology differences to a XML buffer. + * + * If not \c NULL, \p refname defines an identifier string + * for the reference topology which was used as a base when + * computing this difference. + * This identifier is usually the name of the other XML file + * that contains the reference topology. + * This attribute is given back when reading the diff from XML. + * + * The returned buffer ends with a \c \0 that is included in the returned + * length. + * + * \return 0 on success, -1 on error. + * + * \note The XML buffer should later be freed with hwloc_free_xmlbuffer(). + */ +HWLOC_DECLSPEC int hwloc_topology_diff_export_xmlbuffer(hwloc_topology_diff_t diff, const char *refname, char **xmlbuffer, int *buflen); + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_DIFF_H */ diff --git a/src/deps/hwloc/include/hwloc/distances.h b/src/deps/hwloc/include/hwloc/distances.h new file mode 100644 index 000000000..302460ac9 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/distances.h @@ -0,0 +1,507 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2010-2025 Inria. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Object distances. + */ + +#ifndef HWLOC_DISTANCES_H +#define HWLOC_DISTANCES_H + +#ifndef HWLOC_H +#error Please include the main hwloc.h instead +#endif + + +#ifdef __cplusplus +extern "C" { +#elif 0 +} +#endif + + +/** \defgroup hwlocality_distances_get Retrieve distances between objects + * @{ + */ + +/** \brief Matrix of distances between a set of objects. + * + * The most common matrix contains latencies between NUMA nodes + * (as reported in the System Locality Distance Information Table (SLIT) + * in the ACPI specification), which may or may not be physically accurate. + * It corresponds to the latency for accessing the memory of one node + * from a core in another node. + * The corresponding kind is ::HWLOC_DISTANCES_KIND_MEANS_LATENCY | ::HWLOC_DISTANCES_KIND_FROM_USER. + * The name of this distances structure is "NUMALatency". + * + * The matrix may also contain bandwidths between random sets of objects, + * possibly provided by the user, as specified in the \p kind attribute. + * Others common distance structures include and "XGMIBandwidth", "XGMIHops", + * "XeLinkBandwidth" and "NVLinkBandwidth". + * + * Pointers \p objs and \p values should not be replaced, reallocated, freed, etc. + * However callers are allowed to modify \p kind as well as the contents + * of \p objs and \p values arrays. + * For instance, if there is a single NUMA node per Package, + * hwloc_get_obj_with_same_locality() may be used to convert between them + * and replace NUMA nodes in the \p objs array with the corresponding Packages. + * See also hwloc_distances_transform() for applying some transformations + * to the structure. + */ +struct hwloc_distances_s { + unsigned nbobjs; /**< \brief Number of objects described by the distance matrix. */ + hwloc_obj_t *objs; /**< \brief Array of objects described by the distance matrix. + * These objects are not in any particular order, + * see hwloc_distances_obj_index() and hwloc_distances_obj_pair_values() + * for easy ways to find objects in this array and their corresponding values. + */ + unsigned long kind; /**< \brief OR'ed set of ::hwloc_distances_kind_e. */ + hwloc_uint64_t *values; /**< \brief Matrix of distances between objects, stored as a one-dimension array. + * + * Distance from i-th to j-th object is stored in slot i*nbobjs+j. + * The meaning of the value depends on the \p kind attribute. + */ +}; + +/** \brief Kinds of distance matrices. + * + * The \p kind attribute of struct hwloc_distances_s is a OR'ed set + * of kinds. + * + * Each distance matrix may have only one kind among HWLOC_DISTANCES_KIND_FROM_* + * specifying where distance information comes from, + * and one kind among HWLOC_DISTANCES_KIND_MEANS_* specifying + * whether values are latencies or bandwidths. + */ +enum hwloc_distances_kind_e { + /** \brief These distances were obtained from the operating system or hardware. + * \hideinitializer + */ + HWLOC_DISTANCES_KIND_FROM_OS = (1UL<<0), + /** \brief These distances were provided by the user. + * \hideinitializer + */ + HWLOC_DISTANCES_KIND_FROM_USER = (1UL<<1), + + /** \brief Distance values are similar to latencies between objects. + * Values are smaller for closer objects, hence minimal on the diagonal + * of the matrix (distance between an object and itself). + * It could also be the number of network hops between objects, etc. + * \hideinitializer + */ + HWLOC_DISTANCES_KIND_MEANS_LATENCY = (1UL<<2), + /** \brief Distance values are similar to bandwidths between objects. + * Values are higher for closer objects, hence maximal on the diagonal + * of the matrix (distance between an object and itself). + * Such values are currently ignored for distance-based grouping. + * \hideinitializer + */ + HWLOC_DISTANCES_KIND_MEANS_BANDWIDTH = (1UL<<3), + + /** \brief This distances structure covers objects of different types. + * This may apply to the "NVLinkBandwidth" structure in presence + * of a NVSwitch or POWER processor NVLink port. + * \hideinitializer + */ + HWLOC_DISTANCES_KIND_HETEROGENEOUS_TYPES = (1UL<<4) +}; + +/** \brief Retrieve distance matrices. + * + * Retrieve distance matrices from the topology into the \p distances array. + * + * \p flags is currently unused, should be \c 0. + * + * \p kind serves as a filter. If \c 0, all distance matrices are returned. + * If it contains some HWLOC_DISTANCES_KIND_FROM_*, only distance matrices + * whose kind matches one of these are returned. + * If it contains some HWLOC_DISTANCES_KIND_MEANS_*, only distance matrices + * whose kind matches one of these are returned. + * + * On input, \p nr points to the number of distance matrices that may be stored + * in \p distances. + * On output, \p nr points to the number of distance matrices that were actually + * found, even if some of them couldn't be stored in \p distances. + * Distance matrices that couldn't be stored are ignored, but the function still + * returns success (\c 0). The caller may find out by comparing the value pointed + * by \p nr before and after the function call. + * + * Each distance matrix returned in the \p distances array should be released + * by the caller using hwloc_distances_release(). + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int +hwloc_distances_get(hwloc_topology_t topology, + unsigned *nr, struct hwloc_distances_s **distances, + unsigned long kind, unsigned long flags); + +/** \brief Retrieve distance matrices for object at a specific depth in the topology. + * + * Identical to hwloc_distances_get() with the additional \p depth filter. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int +hwloc_distances_get_by_depth(hwloc_topology_t topology, int depth, + unsigned *nr, struct hwloc_distances_s **distances, + unsigned long kind, unsigned long flags); + +/** \brief Retrieve distance matrices for object of a specific type. + * + * Identical to hwloc_distances_get() with the additional \p type filter. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int +hwloc_distances_get_by_type(hwloc_topology_t topology, hwloc_obj_type_t type, + unsigned *nr, struct hwloc_distances_s **distances, + unsigned long kind, unsigned long flags); + +/** \brief Retrieve a distance matrix with the given name. + * + * Usually only one distances structure may match a given name. + * + * The name of the most common structure is "NUMALatency". + * Others include "XGMIBandwidth", "XGMIHops", "XeLinkBandwidth", + * and "NVLinkBandwidth". + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int +hwloc_distances_get_by_name(hwloc_topology_t topology, const char *name, + unsigned *nr, struct hwloc_distances_s **distances, + unsigned long flags); + +/** \brief Get a description of what a distances structure contains. + * + * For instance "NUMALatency" for hardware-provided NUMA distances (ACPI SLIT), + * or \c NULL if unknown. + * + * \return the constant string with the name of the distance structure. + * + * \note The returned name should not be freed by the caller, + * it belongs to the hwloc library. + */ +HWLOC_DECLSPEC const char * +hwloc_distances_get_name(hwloc_topology_t topology, struct hwloc_distances_s *distances); + +/** \brief Release a distance matrix structure previously returned by hwloc_distances_get(). + * + * \note This function is not required if the structure is removed with hwloc_distances_release_remove(). + */ +HWLOC_DECLSPEC void +hwloc_distances_release(hwloc_topology_t topology, struct hwloc_distances_s *distances); + +/** \brief Transformations of distances structures. */ +enum hwloc_distances_transform_e { + /** \brief Remove \c NULL objects from the distances structure. + * + * Every object that was replaced with \c NULL in the \p objs array + * is removed and the \p values array is updated accordingly. + * + * At least \c 2 objects must remain, otherwise hwloc_distances_transform() + * will return \c -1 with \p errno set to \c EINVAL. + * + * \p kind will be updated with or without ::HWLOC_DISTANCES_KIND_HETEROGENEOUS_TYPES + * according to the remaining objects. + * + * \hideinitializer + */ + HWLOC_DISTANCES_TRANSFORM_REMOVE_NULL = 0, + + /** \brief Replace bandwidth values with a number of links. + * + * Usually all values will be either \c 0 (no link) or \c 1 (one link). + * However some matrices could get larger values if some pairs of + * peers are connected by different numbers of links. + * + * Values on the diagonal are set to \c 0. + * + * This transformation only applies to bandwidth matrices. + * + * \hideinitializer + */ + HWLOC_DISTANCES_TRANSFORM_LINKS = 1, + + /** \brief Merge switches with multiple ports into a single object. + * + * This currently only applies to NVSwitches where GPUs seem connected + * to different switch ports. Switch ports must be objects with subtype + * "NVSwitch" as in the NVLinkBandwidth matrix. + * + * This transformation will replace all ports with only the first one, + * now connected to all GPUs. Other ports are removed by applying + * ::HWLOC_DISTANCES_TRANSFORM_REMOVE_NULL internally. + * \hideinitializer + */ + HWLOC_DISTANCES_TRANSFORM_MERGE_SWITCH_PORTS = 2, + + /** \brief Apply a transitive closure to the matrix to connect objects across switches. + * + * All pairs of GPUs will be reported as directly connected instead GPUs being + * only connected to switches. + * + * Switch ports must be objects with subtype "NVSwitch" as in the NVLinkBandwidth matrix. + * \hideinitializer + */ + HWLOC_DISTANCES_TRANSFORM_TRANSITIVE_CLOSURE = 3 +}; + +/** \brief Apply a transformation to a distances structure. + * + * Modify a distances structure that was previously obtained with + * hwloc_distances_get() or one of its variants. + * + * This modifies the local copy of the distances structures but does + * not modify the distances information stored inside the topology + * (retrieved by another call to hwloc_distances_get() or exported to XML). + * To do so, one should add a new distances structure with same + * name, kind, objects and values (see \ref hwlocality_distances_add) + * and then remove this old one with hwloc_distances_release_remove(). + * + * \p transform must be one of the transformations listed + * in ::hwloc_distances_transform_e. + * + * These transformations may modify the contents of the \p objs or \p values arrays. + * + * \p transform_attr must be \c NULL for now. + * + * \p flags must be \c 0 for now. + * + * \return 0 on success, -1 on error for instance if flags are invalid. + * + * \note Objects in distances array \p objs may be directly modified + * in place without using hwloc_distances_transform(). + * One may use hwloc_get_obj_with_same_locality() to easily convert + * between similar objects of different types. + */ +HWLOC_DECLSPEC int hwloc_distances_transform(hwloc_topology_t topology, struct hwloc_distances_s *distances, + enum hwloc_distances_transform_e transform, + void *transform_attr, + unsigned long flags); + +/** @} */ + + + +/** \defgroup hwlocality_distances_consult Helpers for consulting distance matrices + * @{ + */ + +/** \brief Find the index of an object in a distances structure. + * + * \return the index of the object in the distances structure if any. + * \return -1 if object \p obj is not involved in structure \p distances. + */ +static __hwloc_inline int +hwloc_distances_obj_index(struct hwloc_distances_s *distances, hwloc_obj_t obj) +{ + unsigned i; + for(i=0; inbobjs; i++) + if (distances->objs[i] == obj) + return (int)i; + return -1; +} + +/** \brief Find the values between two objects in a distance matrices. + * + * The distance from \p obj1 to \p obj2 is stored in the value pointed by + * \p value1to2 and reciprocally. + * + * \return 0 on success. + * \return -1 if object \p obj1 or \p obj2 is not involved in structure \p distances. + */ +static __hwloc_inline int +hwloc_distances_obj_pair_values(struct hwloc_distances_s *distances, + hwloc_obj_t obj1, hwloc_obj_t obj2, + hwloc_uint64_t *value1to2, hwloc_uint64_t *value2to1) +{ + int i1 = hwloc_distances_obj_index(distances, obj1); + int i2 = hwloc_distances_obj_index(distances, obj2); + if (i1 < 0 || i2 < 0) + return -1; + *value1to2 = distances->values[i1 * distances->nbobjs + i2]; + *value2to1 = distances->values[i2 * distances->nbobjs + i1]; + return 0; +} + +/** @} */ + + + +/** \defgroup hwlocality_distances_add Add distances between objects + * + * The usual way to add distances is: + * \code + * hwloc_distances_add_handle_t handle; + * int err = -1; + * handle = hwloc_distances_add_create(topology, "name", kind, 0); + * if (handle) { + * err = hwloc_distances_add_values(topology, handle, nbobjs, objs, values, 0); + * if (!err) + * err = hwloc_distances_add_commit(topology, handle, flags); + * } + * \endcode + * If \p err is \c 0 at the end, then addition was successful. + * + * @{ + */ + +/** \brief Handle to a new distances structure during its addition to the topology. */ +typedef void * hwloc_distances_add_handle_t; + +/** \brief Create a new empty distances structure. + * + * Create an empty distances structure + * to be filled with hwloc_distances_add_values() + * and then committed with hwloc_distances_add_commit(). + * + * Parameter \p name is optional, it may be \c NULL. + * Otherwise, it will be copied internally and may later be freed by the caller. + * + * \p kind specifies the kind of distance as a OR'ed set of ::hwloc_distances_kind_e. + * Only one kind of meaning and one kind of provenance may be given if appropriate + * (e.g. ::HWLOC_DISTANCES_KIND_MEANS_BANDWIDTH and ::HWLOC_DISTANCES_KIND_FROM_USER). + * Kind ::HWLOC_DISTANCES_KIND_HETEROGENEOUS_TYPES will be automatically set + * according to objects having different types in hwloc_distances_add_values(). + * + * \p flags must be \c 0 for now. + * + * \return A hwloc_distances_add_handle_t that should then be passed + * to hwloc_distances_add_values() and hwloc_distances_add_commit(). + * + * \return \c NULL on error. + */ +HWLOC_DECLSPEC hwloc_distances_add_handle_t +hwloc_distances_add_create(hwloc_topology_t topology, + const char *name, unsigned long kind, + unsigned long flags); + +/** \brief Specify the objects and values in a new empty distances structure. + * + * Specify the objects and values for a new distances structure + * that was returned as a handle by hwloc_distances_add_create(). + * The structure must then be committed with hwloc_distances_add_commit(). + * + * The number of objects is \p nbobjs and the array of objects is \p objs. + * Distance values are stored as a one-dimension array in \p values. + * The distance from object i to object j is in slot i*nbobjs+j. + * + * \p nbobjs must be at least 2. + * + * Arrays \p objs and \p values will be copied internally, + * they may later be freed by the caller. + * + * On error, the temporary distances structure and its content are destroyed. + * + * \p flags must be \c 0 for now. + * + * \return 0 on success. + * \return -1 on error. + */ +HWLOC_DECLSPEC int hwloc_distances_add_values(hwloc_topology_t topology, + hwloc_distances_add_handle_t handle, + unsigned nbobjs, hwloc_obj_t *objs, + hwloc_uint64_t *values, + unsigned long flags); + +/** \brief Flags for adding a new distances to a topology. */ +enum hwloc_distances_add_flag_e { + /** \brief Try to group objects based on the newly provided distance information. + * Grouping is only performed when the distances structure contains latencies, + * and when all objects are of the same type. + * \hideinitializer + */ + HWLOC_DISTANCES_ADD_FLAG_GROUP = (1UL<<0), + /** \brief If grouping, consider the distance values as inaccurate and relax the + * comparisons during the grouping algorithms. The actual accuracy may be modified + * through the HWLOC_GROUPING_ACCURACY environment variable (see \ref envvar_heuristics). + * \hideinitializer + */ + HWLOC_DISTANCES_ADD_FLAG_GROUP_INACCURATE = (1UL<<1) +}; + +/** \brief Commit a new distances structure. + * + * This function finalizes the distances structure and inserts in it the topology. + * + * Parameter \p handle was previously returned by hwloc_distances_add_create(). + * Then objects and values were specified with hwloc_distances_add_values(). + * + * \p flags configures the behavior of the function using an optional OR'ed set of + * ::hwloc_distances_add_flag_e. + * It may be used to request the grouping of existing objects based on distances. + * + * On error, the temporary distances structure and its content are destroyed. + * + * \return 0 on success. + * \return -1 on error. + */ +HWLOC_DECLSPEC int hwloc_distances_add_commit(hwloc_topology_t topology, + hwloc_distances_add_handle_t handle, + unsigned long flags); + +/** @} */ + + + +/** \defgroup hwlocality_distances_remove Remove distances between objects + * @{ + */ + +/** \brief Remove all distance matrices from a topology. + * + * Remove all distance matrices, either provided by the user or + * gathered through the OS. + * + * If these distances were used to group objects, these additional + * Group objects are not removed from the topology. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_distances_remove(hwloc_topology_t topology); + +/** \brief Remove distance matrices for objects at a specific depth in the topology. + * + * Identical to hwloc_distances_remove() but only applies to one level of the topology. + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_distances_remove_by_depth(hwloc_topology_t topology, int depth); + +/** \brief Remove distance matrices for objects of a specific type in the topology. + * + * Identical to hwloc_distances_remove() but only applies to one level of the topology. + * + * \return 0 on success, -1 on error. + */ +static __hwloc_inline int +hwloc_distances_remove_by_type(hwloc_topology_t topology, hwloc_obj_type_t type) +{ + int depth = hwloc_get_type_depth(topology, type); + if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE) + return 0; + return hwloc_distances_remove_by_depth(topology, depth); +} + +/** \brief Release and remove the given distance matrice from the topology. + * + * This function includes a call to hwloc_distances_release(). + * + * \return 0 on success, -1 on error. + */ +HWLOC_DECLSPEC int hwloc_distances_release_remove(hwloc_topology_t topology, struct hwloc_distances_s *distances); + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_DISTANCES_H */ diff --git a/src/deps/hwloc/include/hwloc/export.h b/src/deps/hwloc/include/hwloc/export.h new file mode 100644 index 000000000..908be2f95 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/export.h @@ -0,0 +1,287 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009-2018 Inria. All rights reserved. + * Copyright © 2009-2012 Université Bordeaux + * Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Exporting Topologies to XML or to Synthetic strings. + */ + +#ifndef HWLOC_EXPORT_H +#define HWLOC_EXPORT_H + +#ifndef HWLOC_H +#error Please include the main hwloc.h instead +#endif + + +#ifdef __cplusplus +extern "C" { +#elif 0 +} +#endif + + +/** \defgroup hwlocality_xmlexport Exporting Topologies to XML + * @{ + */ + +/** \brief Flags for exporting XML topologies. + * + * Flags to be given as a OR'ed set to hwloc_topology_export_xml(). + */ +enum hwloc_topology_export_xml_flags_e { + /** \brief Export XML that is loadable by hwloc v1.x. + * However, the export may miss some details about the topology. + * \hideinitializer + */ + HWLOC_TOPOLOGY_EXPORT_XML_FLAG_V1 = (1UL<<0) +}; + +/** \brief Export the topology into an XML file. + * + * This file may be loaded later through hwloc_topology_set_xml(). + * + * By default, the latest export format is used, which means older hwloc + * releases (e.g. v1.x) will not be able to import it. + * Exporting to v1.x specific XML format is possible using flag + * ::HWLOC_TOPOLOGY_EXPORT_XML_FLAG_V1 but it may miss some details + * about the topology. + * If there is any chance that the exported file may ever be imported + * back by a process using hwloc 1.x, one should consider detecting + * it at runtime and using the corresponding export format. + * + * \p flags is a OR'ed set of ::hwloc_topology_export_xml_flags_e. + * + * \return 0 on success, or -1 on error. + * + * \note See also hwloc_topology_set_userdata_export_callback() + * for exporting application-specific object userdata. + * + * \note The topology-specific userdata pointer is ignored when exporting to XML. + * + * \note Only printable characters may be exported to XML string attributes. + * Any other character, especially any non-ASCII character, will be silently + * dropped. + * + * \note If \p name is "-", the XML output is sent to the standard output. + */ +HWLOC_DECLSPEC int hwloc_topology_export_xml(hwloc_topology_t topology, const char *xmlpath, unsigned long flags); + +/** \brief Export the topology into a newly-allocated XML memory buffer. + * + * \p xmlbuffer is allocated by the callee and should be freed with + * hwloc_free_xmlbuffer() later in the caller. + * + * This memory buffer may be loaded later through hwloc_topology_set_xmlbuffer(). + * + * By default, the latest export format is used, which means older hwloc + * releases (e.g. v1.x) will not be able to import it. + * Exporting to v1.x specific XML format is possible using flag + * ::HWLOC_TOPOLOGY_EXPORT_XML_FLAG_V1 but it may miss some details + * about the topology. + * If there is any chance that the exported buffer may ever be imported + * back by a process using hwloc 1.x, one should consider detecting + * it at runtime and using the corresponding export format. + * + * The returned buffer ends with a \0 that is included in the returned + * length. + * + * \p flags is a OR'ed set of ::hwloc_topology_export_xml_flags_e. + * + * \return 0 on success, or -1 on error. + * + * \note See also hwloc_topology_set_userdata_export_callback() + * for exporting application-specific object userdata. + * + * \note The topology-specific userdata pointer is ignored when exporting to XML. + * + * \note Only printable characters may be exported to XML string attributes. + * Any other character, especially any non-ASCII character, will be silently + * dropped. + */ +HWLOC_DECLSPEC int hwloc_topology_export_xmlbuffer(hwloc_topology_t topology, char **xmlbuffer, int *buflen, unsigned long flags); + +/** \brief Free a buffer allocated by hwloc_topology_export_xmlbuffer() */ +HWLOC_DECLSPEC void hwloc_free_xmlbuffer(hwloc_topology_t topology, char *xmlbuffer); + +/** \brief Set the application-specific callback for exporting object userdata + * + * The object userdata pointer is not exported to XML by default because hwloc + * does not know what it contains. + * + * This function lets applications set \p export_cb to a callback function + * that converts this opaque userdata into an exportable string. + * + * \p export_cb is invoked during XML export for each object whose + * \p userdata pointer is not \c NULL. + * The callback should use hwloc_export_obj_userdata() or + * hwloc_export_obj_userdata_base64() to actually export + * something to XML (possibly multiple times per object). + * + * \p export_cb may be set to \c NULL if userdata should not be exported to XML. + * + * \note The topology-specific userdata pointer is ignored when exporting to XML. + */ +HWLOC_DECLSPEC void hwloc_topology_set_userdata_export_callback(hwloc_topology_t topology, + void (*export_cb)(void *reserved, hwloc_topology_t topology, hwloc_obj_t obj)); + +/** \brief Export some object userdata to XML + * + * This function may only be called from within the export() callback passed + * to hwloc_topology_set_userdata_export_callback(). + * It may be invoked one of multiple times to export some userdata to XML. + * The \p buffer content of length \p length is stored with optional name + * \p name. + * + * When importing this XML file, the import() callback (if set) will be + * called exactly as many times as hwloc_export_obj_userdata() was called + * during export(). It will receive the corresponding \p name, \p buffer + * and \p length arguments. + * + * \p reserved, \p topology and \p obj must be the first three parameters + * that were given to the export callback. + * + * Only printable characters may be exported to XML string attributes. + * + * If exporting binary data, the application should first encode into + * printable characters only (or use hwloc_export_obj_userdata_base64()). + * It should also take care of portability issues if the export may + * be reimported on a different architecture. + * + * \return 0 on success. + * \return -1 with errno set to \c EINVAL if a non-printable character is + * passed in \p name or \b buffer. + */ +HWLOC_DECLSPEC int hwloc_export_obj_userdata(void *reserved, hwloc_topology_t topology, hwloc_obj_t obj, const char *name, const void *buffer, size_t length); + +/** \brief Encode and export some object userdata to XML + * + * This function is similar to hwloc_export_obj_userdata() but it encodes + * the input buffer into printable characters before exporting. + * On import, decoding is automatically performed before the data is given + * to the import() callback if any. + * + * This function may only be called from within the export() callback passed + * to hwloc_topology_set_userdata_export_callback(). + * + * The name must be made of printable characters for export to XML string attributes. + * + * The function does not take care of portability issues if the export + * may be reimported on a different architecture. + * + * \return 0 on success. + * \return -1 with errno set to \c EINVAL if a non-printable character is + * passed in \p name. + */ +HWLOC_DECLSPEC int hwloc_export_obj_userdata_base64(void *reserved, hwloc_topology_t topology, hwloc_obj_t obj, const char *name, const void *buffer, size_t length); + +/** \brief Set the application-specific callback for importing userdata + * + * On XML import, userdata is ignored by default because hwloc does not know + * how to store it in memory. + * + * This function lets applications set \p import_cb to a callback function + * that will get the XML-stored userdata and store it in the object as expected + * by the application. + * + * \p import_cb is called during hwloc_topology_load() as many times as + * hwloc_export_obj_userdata() was called during export. The topology + * is not entirely setup yet. Object attributes are ready to consult, + * but links between objects are not. + * + * \p import_cb may be \c NULL if userdata should be ignored during import. + * + * \note \p buffer contains \p length characters followed by a null byte ('\0'). + * + * \note This function should be called before hwloc_topology_load(). + * + * \note The topology-specific userdata pointer is ignored when importing from XML. + */ +HWLOC_DECLSPEC void hwloc_topology_set_userdata_import_callback(hwloc_topology_t topology, + void (*import_cb)(hwloc_topology_t topology, hwloc_obj_t obj, const char *name, const void *buffer, size_t length)); + +/** @} */ + + +/** \defgroup hwlocality_syntheticexport Exporting Topologies to Synthetic + * @{ + */ + +/** \brief Flags for exporting synthetic topologies. + * + * Flags to be given as a OR'ed set to hwloc_topology_export_synthetic(). + */ +enum hwloc_topology_export_synthetic_flags_e { + /** \brief Export extended types such as L2dcache as basic types such as Cache. + * + * This is required if loading the synthetic description with hwloc < 1.9. + * \hideinitializer + */ + HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_EXTENDED_TYPES = (1UL<<0), + + /** \brief Do not export level attributes. + * + * Ignore level attributes such as memory/cache sizes or PU indexes. + * This is required if loading the synthetic description with hwloc < 1.10. + * \hideinitializer + */ + HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_ATTRS = (1UL<<1), + + /** \brief Export the memory hierarchy as expected in hwloc 1.x. + * + * Instead of attaching memory children to levels, export single NUMA node child + * as normal intermediate levels, when possible. + * This is required if loading the synthetic description with hwloc 1.x. + * However this may fail if some objects have multiple local NUMA nodes. + * \hideinitializer + */ + HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_V1 = (1UL<<2), + + /** \brief Do not export memory information. + * + * Only export the actual hierarchy of normal CPU-side objects and ignore + * where memory is attached. + * This is useful for when the hierarchy of CPUs is what really matters, + * but it behaves as if there was a single machine-wide NUMA node. + * \hideinitializer + */ + HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_IGNORE_MEMORY = (1UL<<3) +}; + +/** \brief Export the topology as a synthetic string. + * + * At most \p buflen characters will be written in \p buffer, + * including the terminating \0. + * + * This exported string may be given back to hwloc_topology_set_synthetic(). + * + * \p flags is a OR'ed set of ::hwloc_topology_export_synthetic_flags_e. + * + * \return The number of characters that were written, + * not including the terminating \0. + * + * \return -1 if the topology could not be exported, + * for instance if it is not symmetric. + * + * \note I/O and Misc children are ignored, the synthetic string only + * describes normal children. + * + * \note A 1024-byte buffer should be large enough for exporting + * topologies in the vast majority of cases. + */ + HWLOC_DECLSPEC int hwloc_topology_export_synthetic(hwloc_topology_t topology, char *buffer, size_t buflen, unsigned long flags); + +/** @} */ + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_EXPORT_H */ diff --git a/src/deps/hwloc/include/hwloc/gl.h b/src/deps/hwloc/include/hwloc/gl.h new file mode 100644 index 000000000..fc58377af --- /dev/null +++ b/src/deps/hwloc/include/hwloc/gl.h @@ -0,0 +1,138 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2012 Blue Brain Project, EPFL. All rights reserved. + * Copyright © 2012-2023 Inria. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and OpenGL displays. + * + * Applications that use both hwloc and OpenGL may want to include + * this file so as to get topology information for OpenGL displays. + */ + +#ifndef HWLOC_GL_H +#define HWLOC_GL_H + +#include "hwloc.h" + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_gl Interoperability with OpenGL displays + * + * This interface offers ways to retrieve topology information about + * OpenGL displays. + * + * Only the NVIDIA display locality information is currently available, + * using the NV-CONTROL X11 extension and the NVCtrl library. + * + * @{ + */ + +/** \brief Get the hwloc OS device object corresponding to the + * OpenGL display given by port and device index. + * + * \return The hwloc OS device object describing the OpenGL display + * whose port (server) is \p port and device (screen) is \p device. + * \return \c NULL if none could be found. + * + * The topology \p topology does not necessarily have to match the current + * machine. For instance the topology may be an XML import of a remote host. + * I/O devices detection and the GL component must be enabled in the topology. + * + * \note The corresponding PCI device object can be obtained by looking + * at the OS device parent object (unless PCI devices are filtered out). + */ +static __hwloc_inline hwloc_obj_t +hwloc_gl_get_display_osdev_by_port_device(hwloc_topology_t topology, + unsigned port, unsigned device) +{ + unsigned x = (unsigned) -1, y = (unsigned) -1; + hwloc_obj_t osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type + && osdev->name + && sscanf(osdev->name, ":%u.%u", &x, &y) == 2 + && port == x && device == y) + return osdev; + } + errno = EINVAL; + return NULL; +} + +/** \brief Get the hwloc OS device object corresponding to the + * OpenGL display given by name. + * + * \return The hwloc OS device object describing the OpenGL display + * whose name is \p name, built as ":port.device" such as ":0.0" . + * \return \c NULL if none could be found. + * + * The topology \p topology does not necessarily have to match the current + * machine. For instance the topology may be an XML import of a remote host. + * I/O devices detection and the GL component must be enabled in the topology. + * + * \note The corresponding PCI device object can be obtained by looking + * at the OS device parent object (unless PCI devices are filtered out). + */ +static __hwloc_inline hwloc_obj_t +hwloc_gl_get_display_osdev_by_name(hwloc_topology_t topology, + const char *name) +{ + hwloc_obj_t osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type + && osdev->name + && !strcmp(name, osdev->name)) + return osdev; + } + errno = EINVAL; + return NULL; +} + +/** \brief Get the OpenGL display port and device corresponding + * to the given hwloc OS object. + * + * Retrieves the OpenGL display port (server) in \p port and device (screen) + * in \p screen that correspond to the given hwloc OS device object. + * + * \return 0 on success. + * \return -1 if none could be found. + * + * The topology \p topology does not necessarily have to match the current + * machine. For instance the topology may be an XML import of a remote host. + * I/O devices detection and the GL component must be enabled in the topology. + */ +static __hwloc_inline int +hwloc_gl_get_display_by_osdev(hwloc_topology_t topology __hwloc_attribute_unused, + hwloc_obj_t osdev, + unsigned *port, unsigned *device) +{ + unsigned x = -1, y = -1; + if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type + && sscanf(osdev->name, ":%u.%u", &x, &y) == 2) { + *port = x; + *device = y; + return 0; + } + errno = EINVAL; + return -1; +} + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_GL_H */ + diff --git a/src/deps/hwloc/include/hwloc/glibc-sched.h b/src/deps/hwloc/include/hwloc/glibc-sched.h new file mode 100644 index 000000000..2d24a57d0 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/glibc-sched.h @@ -0,0 +1,134 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2023 Inria. All rights reserved. + * Copyright © 2009-2011 Université Bordeaux + * Copyright © 2011 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and glibc scheduling routines. + * + * Applications that use both hwloc and glibc scheduling routines such as + * sched_getaffinity() or pthread_attr_setaffinity_np() may want to include + * this file so as to ease conversion between their respective types. + */ + +#ifndef HWLOC_GLIBC_SCHED_H +#define HWLOC_GLIBC_SCHED_H + +#include "hwloc.h" +#include "hwloc/helper.h" + +#include + +#if !defined _GNU_SOURCE || (!defined _SCHED_H && !defined _SCHED_H_) || (!defined CPU_SETSIZE && !defined sched_priority) +#error Please make sure to include sched.h before including glibc-sched.h, and define _GNU_SOURCE before any inclusion of sched.h +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef HWLOC_HAVE_CPU_SET + + +/** \defgroup hwlocality_glibc_sched Interoperability with glibc sched affinity + * + * This interface offers ways to convert between hwloc cpusets and glibc cpusets + * such as those manipulated by sched_getaffinity() or pthread_attr_setaffinity_np(). + * + * \note Topology \p topology must match the current machine. + * + * @{ + */ + + +/** \brief Convert hwloc CPU set \p toposet into glibc sched affinity CPU set \p schedset + * + * This function may be used before calling sched_setaffinity or any other function + * that takes a cpu_set_t as input parameter. + * + * \p schedsetsize should be sizeof(cpu_set_t) unless \p schedset was dynamically allocated with CPU_ALLOC + * + * \return 0. + */ +static __hwloc_inline int +hwloc_cpuset_to_glibc_sched_affinity(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t hwlocset, + cpu_set_t *schedset, size_t schedsetsize) +{ +#ifdef CPU_ZERO_S + unsigned cpu; + CPU_ZERO_S(schedsetsize, schedset); + hwloc_bitmap_foreach_begin(cpu, hwlocset) + CPU_SET_S(cpu, schedsetsize, schedset); + hwloc_bitmap_foreach_end(); +#else /* !CPU_ZERO_S */ + unsigned cpu; + CPU_ZERO(schedset); + assert(schedsetsize == sizeof(cpu_set_t)); + hwloc_bitmap_foreach_begin(cpu, hwlocset) + CPU_SET(cpu, schedset); + hwloc_bitmap_foreach_end(); +#endif /* !CPU_ZERO_S */ + return 0; +} + +/** \brief Convert glibc sched affinity CPU set \p schedset into hwloc CPU set + * + * This function may be used before calling sched_setaffinity or any other function + * that takes a cpu_set_t as input parameter. + * + * \p schedsetsize should be sizeof(cpu_set_t) unless \p schedset was dynamically allocated with CPU_ALLOC + * + * \return 0 on success. + * \return -1 with errno set to \c ENOMEM if some internal reallocation failed. + */ +static __hwloc_inline int +hwloc_cpuset_from_glibc_sched_affinity(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_cpuset_t hwlocset, + const cpu_set_t *schedset, size_t schedsetsize) +{ + int cpu; +#ifdef CPU_ZERO_S + int count; +#endif + hwloc_bitmap_zero(hwlocset); +#ifdef CPU_ZERO_S + count = CPU_COUNT_S(schedsetsize, schedset); + cpu = 0; + while (count) { + if (CPU_ISSET_S(cpu, schedsetsize, schedset)) { + if (hwloc_bitmap_set(hwlocset, cpu) < 0) + return -1; + count--; + } + cpu++; + } +#else /* !CPU_ZERO_S */ + /* sched.h does not support dynamic cpu_set_t (introduced in glibc 2.7), + * assume we have a very old interface without CPU_COUNT (added in 2.6) + */ + assert(schedsetsize == sizeof(cpu_set_t)); + for(cpu=0; cpu +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_helper_types Kinds of object Type + * @{ + * + * Each object type is + * either Normal (i.e. hwloc_obj_type_is_normal() returns 1), + * or Memory (i.e. hwloc_obj_type_is_memory() returns 1) + * or I/O (i.e. hwloc_obj_type_is_io() returns 1) + * or Misc (i.e. equal to ::HWLOC_OBJ_MISC). + * It cannot be of more than one of these kinds. + * + * See also Object Kind in \ref termsanddefs. + */ + +/** \brief Check whether an object type is Normal. + * + * Normal objects are objects of the main CPU hierarchy + * (Machine, Package, Core, PU, CPU caches, etc.), + * but they are not NUMA nodes, I/O devices or Misc objects. + * + * They are attached to parent as Normal children, + * not as Memory, I/O or Misc children. + * + * \return 1 if an object of type \p type is a Normal object, 0 otherwise. + */ +HWLOC_DECLSPEC int +hwloc_obj_type_is_normal(hwloc_obj_type_t type); + +/** \brief Check whether an object type is I/O. + * + * I/O objects are objects attached to their parents + * in the I/O children list. + * This current includes Bridges, PCI and OS devices. + * + * \return 1 if an object of type \p type is a I/O object, 0 otherwise. + */ +HWLOC_DECLSPEC int +hwloc_obj_type_is_io(hwloc_obj_type_t type); + +/** \brief Check whether an object type is Memory. + * + * Memory objects are objects attached to their parents + * in the Memory children list. + * This current includes NUMA nodes and Memory-side caches. + * + * \return 1 if an object of type \p type is a Memory object, 0 otherwise. + */ +HWLOC_DECLSPEC int +hwloc_obj_type_is_memory(hwloc_obj_type_t type); + +/** \brief Check whether an object type is a CPU Cache (Data, Unified or Instruction). + * + * Memory-side caches are not CPU caches. + * + * \return 1 if an object of type \p type is a Cache, 0 otherwise. + */ +HWLOC_DECLSPEC int +hwloc_obj_type_is_cache(hwloc_obj_type_t type); + +/** \brief Check whether an object type is a CPU Data or Unified Cache. + * + * Memory-side caches are not CPU caches. + * + * \return 1 if an object of type \p type is a CPU Data or Unified Cache, 0 otherwise. + */ +HWLOC_DECLSPEC int +hwloc_obj_type_is_dcache(hwloc_obj_type_t type); + +/** \brief Check whether an object type is a CPU Instruction Cache, + * + * Memory-side caches are not CPU caches. + * + * \return 1 if an object of type \p type is a CPU Instruction Cache, 0 otherwise. + */ +HWLOC_DECLSPEC int +hwloc_obj_type_is_icache(hwloc_obj_type_t type); + +/** @} */ + + + +/** \defgroup hwlocality_helper_find_inside Finding Objects inside a CPU set + * @{ + */ + +/** \brief Get the first largest object included in the given cpuset \p set. + * + * \return the first object that is included in \p set and whose parent is not. + * \return \c NULL if no such object exists. + * + * This is convenient for iterating over all largest objects within a CPU set + * by doing a loop getting the first largest object and clearing its CPU set + * from the remaining CPU set. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_first_largest_obj_inside_cpuset(hwloc_topology_t topology, hwloc_const_cpuset_t set) +{ + hwloc_obj_t obj = hwloc_get_root_obj(topology); + if (!hwloc_bitmap_intersects(obj->cpuset, set)) + return NULL; + while (!hwloc_bitmap_isincluded(obj->cpuset, set)) { + /* while the object intersects without being included, look at its children */ + hwloc_obj_t child = obj->first_child; + while (child) { + if (hwloc_bitmap_intersects(child->cpuset, set)) + break; + child = child->next_sibling; + } + if (!child) + /* no child intersects, return their father */ + return obj; + /* found one intersecting child, look at its children */ + obj = child; + } + /* obj is included, return it */ + return obj; +} + +/** \brief Get the set of largest objects covering exactly a given cpuset \p set + * + * \return the number of objects returned in \p objs. + * \return -1 if no set of objects may cover that cpuset. + */ +HWLOC_DECLSPEC int hwloc_get_largest_objs_inside_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set, + hwloc_obj_t * __hwloc_restrict objs, int max); + +/** \brief Return the next object at depth \p depth included in CPU set \p set. + * + * The next invokation should pass the previous return value in \p prev + * so as to obtain the next object in \p set. + * + * \return the first object at depth \p depth included in \p set if \p prev is \c NULL. + * \return the next object at depth \p depth included in \p set if \p prev is not \c NULL. + * \return \c NULL if there is no next object. + * + * \note Objects with empty CPU sets are ignored + * (otherwise they would be considered included in any given set). + * + * \note This function cannot work if objects at the given depth do + * not have CPU sets (I/O or Misc objects). + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_next_obj_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set, + int depth, hwloc_obj_t prev) +{ + hwloc_obj_t next = hwloc_get_next_obj_by_depth(topology, depth, prev); + if (!next) + return NULL; + while (next && (hwloc_bitmap_iszero(next->cpuset) || !hwloc_bitmap_isincluded(next->cpuset, set))) + next = next->next_cousin; + return next; +} + +/** \brief Return the next object of type \p type included in CPU set \p set. + * + * The next invokation should pass the previous return value in \p prev + * so as to obtain the next object in \p set. + * + * \return the first object of type \p type included in \p set if \p prev is \c NULL. + * \return the next object of type \p type included in \p set if \p prev is not \c NULL. + * \return \c NULL if there is no next object. + * \return \c NULL if there is no depth for the given type. + * \return \c NULL if there are multiple depths for the given type, + * the caller should fallback to hwloc_get_next_obj_inside_cpuset_by_depth(). + * + * \note Objects with empty CPU sets are ignored + * (otherwise they would be considered included in any given set). + * + * \note This function cannot work if objects of the given type do + * not have CPU sets (I/O or Misc objects). + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_next_obj_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_const_cpuset_t set, + hwloc_obj_type_t type, hwloc_obj_t prev) +{ + int depth = hwloc_get_type_depth(topology, type); + if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE) + return NULL; + return hwloc_get_next_obj_inside_cpuset_by_depth(topology, set, depth, prev); +} + +/** \brief Return the (logically) \p idx -th object at depth \p depth included in CPU set \p set. + * + * \return the object if any, \c NULL otherwise. + * + * \note Objects with empty CPU sets are ignored + * (otherwise they would be considered included in any given set). + * + * \note This function cannot work if objects at the given depth do + * not have CPU sets (I/O or Misc objects). + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set, + int depth, unsigned idx) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set, + int depth, unsigned idx) +{ + hwloc_obj_t obj = hwloc_get_obj_by_depth (topology, depth, 0); + unsigned count = 0; + if (!obj) + return NULL; + while (obj) { + if (!hwloc_bitmap_iszero(obj->cpuset) && hwloc_bitmap_isincluded(obj->cpuset, set)) { + if (count == idx) + return obj; + count++; + } + obj = obj->next_cousin; + } + return NULL; +} + +/** \brief Return the \p idx -th object of type \p type included in CPU set \p set. + * + * \return the object if any. + * \return \c NULL if there is no such object. + * \return \c NULL if there is no depth for given type. + * \return \c NULL if there are multiple depths for given type, + * the caller should fallback to hwloc_get_obj_inside_cpuset_by_depth(). + * + * \note Objects with empty CPU sets are ignored + * (otherwise they would be considered included in any given set). + * + * \note This function cannot work if objects of the given type do + * not have CPU sets (I/O or Misc objects). + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_const_cpuset_t set, + hwloc_obj_type_t type, unsigned idx) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_const_cpuset_t set, + hwloc_obj_type_t type, unsigned idx) +{ + int depth = hwloc_get_type_depth(topology, type); + if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE) + return NULL; + return hwloc_get_obj_inside_cpuset_by_depth(topology, set, depth, idx); +} + +/** \brief Return the number of objects at depth \p depth included in CPU set \p set. + * + * \return the number of objects. + * \return 0 if the depth is invalid. + * + * \note Objects with empty CPU sets are ignored + * (otherwise they would be considered included in any given set). + * + * \note This function cannot work if objects at the given depth do + * not have CPU sets (I/O or Misc objects). + */ +static __hwloc_inline unsigned +hwloc_get_nbobjs_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set, + int depth) __hwloc_attribute_pure; +static __hwloc_inline unsigned +hwloc_get_nbobjs_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set, + int depth) +{ + hwloc_obj_t obj = hwloc_get_obj_by_depth (topology, depth, 0); + unsigned count = 0; + if (!obj) + return 0; + while (obj) { + if (!hwloc_bitmap_iszero(obj->cpuset) && hwloc_bitmap_isincluded(obj->cpuset, set)) + count++; + obj = obj->next_cousin; + } + return count; +} + +/** \brief Return the number of objects of type \p type included in CPU set \p set. + * + * \return the number of objects. + * \return 0 if there are no objects of that type in the topology. + * \return -1 if there are multiple levels of objects of that type, + * the caller should fallback to hwloc_get_nbobjs_inside_cpuset_by_depth(). + * + * \note Objects with empty CPU sets are ignored + * (otherwise they would be considered included in any given set). + * + * \note This function cannot work if objects of the given type do + * not have CPU sets (I/O objects). + */ +static __hwloc_inline int +hwloc_get_nbobjs_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_const_cpuset_t set, + hwloc_obj_type_t type) __hwloc_attribute_pure; +static __hwloc_inline int +hwloc_get_nbobjs_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_const_cpuset_t set, + hwloc_obj_type_t type) +{ + int depth = hwloc_get_type_depth(topology, type); + if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) + return 0; + if (depth == HWLOC_TYPE_DEPTH_MULTIPLE) + return -1; /* FIXME: agregate nbobjs from different levels? */ + return (int) hwloc_get_nbobjs_inside_cpuset_by_depth(topology, set, depth); +} + +/** \brief Return the logical index among the objects included in CPU set \p set. + * + * Consult all objects in the same level as \p obj and inside CPU set \p set + * in the logical order, and return the index of \p obj within them. + * If \p set covers the entire topology, this is the logical index of \p obj. + * Otherwise, this is similar to a logical index within the part of the topology + * defined by CPU set \p set. + * + * \return the logical index among the objects included in the set if any. + * \return -1 if the object is not included in the set. + * + * \note Objects with empty CPU sets are ignored + * (otherwise they would be considered included in any given set). + * + * \note This function cannot work if obj does not have CPU sets (I/O objects). + */ +static __hwloc_inline int +hwloc_get_obj_index_inside_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set, + hwloc_obj_t obj) __hwloc_attribute_pure; +static __hwloc_inline int +hwloc_get_obj_index_inside_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set, + hwloc_obj_t obj) +{ + int idx = 0; + if (!hwloc_bitmap_isincluded(obj->cpuset, set)) + return -1; + /* count how many objects are inside the cpuset on the way from us to the beginning of the level */ + while ((obj = obj->prev_cousin) != NULL) + if (!hwloc_bitmap_iszero(obj->cpuset) && hwloc_bitmap_isincluded(obj->cpuset, set)) + idx++; + return idx; +} + +/** @} */ + + + +/** \defgroup hwlocality_helper_find_covering Finding Objects covering at least CPU set + * @{ + */ + +/** \brief Get the child covering at least CPU set \p set. + * + * \return the child that covers the set entirely. + * \return \c NULL if no child matches or if \p set is empty. + * + * \note This function cannot work if parent does not have a CPU set (I/O or Misc objects). + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_child_covering_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set, + hwloc_obj_t parent) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_child_covering_cpuset (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set, + hwloc_obj_t parent) +{ + hwloc_obj_t child; + if (hwloc_bitmap_iszero(set)) + return NULL; + child = parent->first_child; + while (child) { + if (child->cpuset && hwloc_bitmap_isincluded(set, child->cpuset)) + return child; + child = child->next_sibling; + } + return NULL; +} + +/** \brief Get the lowest object covering at least CPU set \p set + * + * \return the lowest object covering the set entirely. + * \return \c NULL if no object matches or if \p set is empty. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set) +{ + struct hwloc_obj *current = hwloc_get_root_obj(topology); + if (hwloc_bitmap_iszero(set) || !hwloc_bitmap_isincluded(set, current->cpuset)) + return NULL; + while (1) { + hwloc_obj_t child = hwloc_get_child_covering_cpuset(topology, set, current); + if (!child) + return current; + current = child; + } +} + +/** \brief Iterate through same-depth objects covering at least CPU set \p set + * + * The next invokation should pass the previous return value in \p prev so as + * to obtain the next object covering at least another part of \p set. + * + * \return the first object at depth \p depth covering at least part of CPU set \p set + * if object \p prev is \c NULL. + * \return the next one if \p prev is not \c NULL. + * \return \c NULL if there is no next object. + * + * \note This function cannot work if objects at the given depth do + * not have CPU sets (I/O or Misc objects). + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_next_obj_covering_cpuset_by_depth(hwloc_topology_t topology, hwloc_const_cpuset_t set, + int depth, hwloc_obj_t prev) +{ + hwloc_obj_t next = hwloc_get_next_obj_by_depth(topology, depth, prev); + if (!next) + return NULL; + while (next && !hwloc_bitmap_intersects(set, next->cpuset)) + next = next->next_cousin; + return next; +} + +/** \brief Iterate through same-type objects covering at least CPU set \p set + * + * The next invokation should pass the previous return value in \p prev so as to obtain + * the next object of type \p type covering at least another part of \p set. + * + * \return the first object of type \p type covering at least part of CPU set \p set + * if object \p prev is \c NULL. + * \return the next one if \p prev is not \c NULL. + * \return \c NULL if there is no next object. + * \return \c NULL if there is no depth for the given type. + * \return \c NULL if there are multiple depths for the given type, + * the caller should fallback to hwloc_get_next_obj_covering_cpuset_by_depth(). + * + * \note This function cannot work if objects of the given type do + * not have CPU sets (I/O or Misc objects). + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_next_obj_covering_cpuset_by_type(hwloc_topology_t topology, hwloc_const_cpuset_t set, + hwloc_obj_type_t type, hwloc_obj_t prev) +{ + int depth = hwloc_get_type_depth(topology, type); + if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE) + return NULL; + return hwloc_get_next_obj_covering_cpuset_by_depth(topology, set, depth, prev); +} + +/** @} */ + + + +/** \defgroup hwlocality_helper_ancestors Looking at Ancestor and Child Objects + * @{ + * + * Be sure to see the figure in \ref termsanddefs that shows a + * complete topology tree, including depths, child/sibling/cousin + * relationships, and an example of an asymmetric topology where one + * package has fewer caches than its peers. + */ + +/** \brief Returns the ancestor object of \p obj at depth \p depth. + * + * \return the ancestor if any. + * \return \c NULL if no such ancestor exists. + * + * \note \p depth should not be the depth of PU or NUMA objects + * since they are ancestors of no objects (except Misc or I/O). + * This function rather expects an intermediate level depth, + * such as the depth of Packages, Cores, or Caches. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_ancestor_obj_by_depth (hwloc_topology_t topology __hwloc_attribute_unused, int depth, hwloc_obj_t obj) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_ancestor_obj_by_depth (hwloc_topology_t topology __hwloc_attribute_unused, int depth, hwloc_obj_t obj) +{ + hwloc_obj_t ancestor = obj; + if (obj->depth < depth) + return NULL; + while (ancestor && ancestor->depth > depth) + ancestor = ancestor->parent; + return ancestor; +} + +/** \brief Returns the ancestor object of \p obj with type \p type. + * + * \return the ancestor if any. + * \return \c NULL if no such ancestor exists. + * + * \note if multiple matching ancestors exist (e.g. multiple levels of ::HWLOC_OBJ_GROUP) + * the lowest one is returned. + * + * \note \p type should not be ::HWLOC_OBJ_PU or ::HWLOC_OBJ_NUMANODE + * since these objects are ancestors of no objects (except Misc or I/O). + * This function rather expects an intermediate object type, + * such as ::HWLOC_OBJ_PACKAGE, ::HWLOC_OBJ_CORE, etc. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_ancestor_obj_by_type (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_type_t type, hwloc_obj_t obj) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_ancestor_obj_by_type (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_type_t type, hwloc_obj_t obj) +{ + hwloc_obj_t ancestor = obj->parent; + while (ancestor && ancestor->type != type) + ancestor = ancestor->parent; + return ancestor; +} + +/** \brief Returns the common parent object to objects \p obj1 and \p obj2. + * + * \return the common ancestor. + * + * \note This function cannot return \c NULL. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_common_ancestor_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj1, hwloc_obj_t obj2) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_common_ancestor_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj1, hwloc_obj_t obj2) +{ + /* the loop isn't so easy since intermediate ancestors may have + * different depth, causing us to alternate between using obj1->parent + * and obj2->parent. Also, even if at some point we find ancestors of + * of the same depth, their ancestors may have different depth again. + */ + while (obj1 != obj2) { + while (obj1->depth > obj2->depth) + obj1 = obj1->parent; + while (obj2->depth > obj1->depth) + obj2 = obj2->parent; + if (obj1 != obj2 && obj1->depth == obj2->depth) { + obj1 = obj1->parent; + obj2 = obj2->parent; + } + } + return obj1; +} + +/** \brief Returns true if \p obj is inside the subtree beginning with ancestor object \p subtree_root. + * + * \return 1 is the object is in the subtree, 0 otherwise. + * + * \note This function cannot work if \p obj and \p subtree_root objects do + * not have CPU sets (I/O or Misc objects). + */ +static __hwloc_inline int +hwloc_obj_is_in_subtree (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj, hwloc_obj_t subtree_root) __hwloc_attribute_pure; +static __hwloc_inline int +hwloc_obj_is_in_subtree (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj, hwloc_obj_t subtree_root) +{ + return obj->cpuset && subtree_root->cpuset && hwloc_bitmap_isincluded(obj->cpuset, subtree_root->cpuset); +} + +/** \brief Return the next child. + * + * Return the next child among the normal children list, + * then among the memory children list, then among the I/O + * children list, then among the Misc children list. + * + * \return the first child if \p prev is \c NULL. + * \return the next child if \p prev is not \c NULL. + * \return \c NULL when there is no next child. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_next_child (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t parent, hwloc_obj_t prev) +{ + hwloc_obj_t obj; + int state = 0; + if (prev) { + if (prev->type == HWLOC_OBJ_MISC) + state = 3; + else if (hwloc_obj_type_is_io(prev->type)) + state = 2; + else if (hwloc_obj_type_is_memory(prev->type)) + state = 1; + obj = prev->next_sibling; + } else { + obj = parent->first_child; + } + if (!obj && state == 0) { + obj = parent->memory_first_child; + state = 1; + } + if (!obj && state == 1) { + obj = parent->io_first_child; + state = 2; + } + if (!obj && state == 2) { + obj = parent->misc_first_child; + state = 3; + } + return obj; +} + +/** @} */ + + + +/** \defgroup hwlocality_helper_find_cache Looking at Cache Objects + * @{ + */ + +/** \brief Find the depth of cache objects matching cache level and type. + * + * Return the depth of the topology level that contains cache objects + * whose attributes match \p cachelevel and \p cachetype. + + * This function is identical to calling hwloc_get_type_depth() with the + * corresponding type such as ::HWLOC_OBJ_L1ICACHE, except that it may + * also return a Unified cache when looking for an instruction cache. + * + * \return the depth of the unique matching unified cache level is returned + * if \p cachetype is ::HWLOC_OBJ_CACHE_UNIFIED. + * + * \return the depth of either a matching cache level or a unified cache level + * if \p cachetype is ::HWLOC_OBJ_CACHE_DATA or ::HWLOC_OBJ_CACHE_INSTRUCTION. + * + * \return the depth of the matching level + * if \p cachetype is \c -1 but only one level matches. + * + * \return ::HWLOC_TYPE_DEPTH_MULTIPLE + * if \p cachetype is \c -1 but multiple levels match. + * + * \return ::HWLOC_TYPE_DEPTH_UNKNOWN if no cache level matches. + */ +static __hwloc_inline int +hwloc_get_cache_type_depth (hwloc_topology_t topology, + unsigned cachelevel, hwloc_obj_cache_type_t cachetype) +{ + int depth; + int found = HWLOC_TYPE_DEPTH_UNKNOWN; + for (depth=0; ; depth++) { + hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, 0); + if (!obj) + break; + if (!hwloc_obj_type_is_dcache(obj->type) || obj->attr->cache.depth != cachelevel) + /* doesn't match, try next depth */ + continue; + if (cachetype == (hwloc_obj_cache_type_t) -1) { + if (found != HWLOC_TYPE_DEPTH_UNKNOWN) { + /* second match, return MULTIPLE */ + return HWLOC_TYPE_DEPTH_MULTIPLE; + } + /* first match, mark it as found */ + found = depth; + continue; + } + if (obj->attr->cache.type == cachetype || obj->attr->cache.type == HWLOC_OBJ_CACHE_UNIFIED) + /* exact match (either unified is alone, or we match instruction or data), return immediately */ + return depth; + } + /* went to the bottom, return what we found */ + return found; +} + +/** \brief Get the first data (or unified) cache covering a cpuset \p set + * + * \return a covering cache, or \c NULL if no cache matches. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_cache_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_cache_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set) +{ + hwloc_obj_t current = hwloc_get_obj_covering_cpuset(topology, set); + while (current) { + if (hwloc_obj_type_is_dcache(current->type)) + return current; + current = current->parent; + } + return NULL; +} + +/** \brief Get the first data (or unified) cache shared between an object and somebody else. + * + * \return a shared cache. + * \return \c NULL if no cache matches or if an invalid object is given (e.g. I/O object). + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_shared_cache_covering_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_shared_cache_covering_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj) +{ + hwloc_obj_t current = obj->parent; + if (!obj->cpuset) + return NULL; + while (current) { + if (!hwloc_bitmap_isequal(current->cpuset, obj->cpuset) + && hwloc_obj_type_is_dcache(current->type)) + return current; + current = current->parent; + } + return NULL; +} + +/** @} */ + + + +/** \defgroup hwlocality_helper_find_misc Finding objects, miscellaneous helpers + * @{ + * + * Be sure to see the figure in \ref termsanddefs that shows a + * complete topology tree, including depths, child/sibling/cousin + * relationships, and an example of an asymmetric topology where one + * package has fewer caches than its peers. + */ + +/** \brief Remove simultaneous multithreading PUs from a CPU set. + * + * For each core in \p topology, if \p cpuset contains some PUs of that core, + * modify \p cpuset to only keep a single PU for that core. + * + * \p which specifies which PU will be kept. + * PU are considered in physical index order. + * If 0, for each core, the function keeps the first PU that was originally set in \p cpuset. + * + * If \p which is larger than the number of PUs in a core there were originally set in \p cpuset, + * no PU is kept for that core. + * + * \return 0. + * + * \note PUs that are not below a Core object are ignored + * (for instance if the topology does not contain any Core object). + * None of them is removed from \p cpuset. + */ +HWLOC_DECLSPEC int hwloc_bitmap_singlify_per_core(hwloc_topology_t topology, hwloc_bitmap_t cpuset, unsigned which); + +/** \brief Returns the object of type ::HWLOC_OBJ_PU with \p os_index. + * + * This function is useful for converting a CPU set into the PU + * objects it contains. + * When retrieving the current binding (e.g. with hwloc_get_cpubind()), + * one may iterate over the bits of the resulting CPU set with + * hwloc_bitmap_foreach_begin(), and find the corresponding PUs + * with this function. + * + * \return the PU object, or \c NULL if none matches. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_pu_obj_by_os_index(hwloc_topology_t topology, unsigned os_index) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_pu_obj_by_os_index(hwloc_topology_t topology, unsigned os_index) +{ + hwloc_obj_t obj = NULL; + while ((obj = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_PU, obj)) != NULL) + if (obj->os_index == os_index) + return obj; + return NULL; +} + +/** \brief Returns the object of type ::HWLOC_OBJ_NUMANODE with \p os_index. + * + * This function is useful for converting a nodeset into the NUMA node + * objects it contains. + * When retrieving the current binding (e.g. with hwloc_get_membind() with HWLOC_MEMBIND_BYNODESET), + * one may iterate over the bits of the resulting nodeset with + * hwloc_bitmap_foreach_begin(), and find the corresponding NUMA nodes + * with this function. + * + * \return the NUMA node object, or \c NULL if none matches. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_numanode_obj_by_os_index(hwloc_topology_t topology, unsigned os_index) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_numanode_obj_by_os_index(hwloc_topology_t topology, unsigned os_index) +{ + hwloc_obj_t obj = NULL; + while ((obj = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NUMANODE, obj)) != NULL) + if (obj->os_index == os_index) + return obj; + return NULL; +} + +/** \brief Do a depth-first traversal of the topology to find and sort + * + * all objects that are at the same depth than \p src. + * Report in \p objs up to \p max physically closest ones to \p src. + * + * \return the number of objects returned in \p objs. + * + * \return 0 if \p src is an I/O object. + * + * \note This function requires the \p src object to have a CPU set. + */ +/* TODO: rather provide an iterator? Provide a way to know how much should be allocated? By returning the total number of objects instead? */ +HWLOC_DECLSPEC unsigned hwloc_get_closest_objs (hwloc_topology_t topology, hwloc_obj_t src, hwloc_obj_t * __hwloc_restrict objs, unsigned max); + +/** \brief Find an object below another object, both specified by types and indexes. + * + * Start from the top system object and find object of type \p type1 + * and logical index \p idx1. Then look below this object and find another + * object of type \p type2 and logical index \p idx2. Indexes are specified + * within the parent, not withing the entire system. + * + * For instance, if type1 is PACKAGE, idx1 is 2, type2 is CORE and idx2 + * is 3, return the fourth core object below the third package. + * + * \return a matching object if any, \c NULL otherwise. + * + * \note This function requires these objects to have a CPU set. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_below_by_type (hwloc_topology_t topology, + hwloc_obj_type_t type1, unsigned idx1, + hwloc_obj_type_t type2, unsigned idx2) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_below_by_type (hwloc_topology_t topology, + hwloc_obj_type_t type1, unsigned idx1, + hwloc_obj_type_t type2, unsigned idx2) +{ + hwloc_obj_t obj; + obj = hwloc_get_obj_by_type (topology, type1, idx1); + if (!obj) + return NULL; + return hwloc_get_obj_inside_cpuset_by_type(topology, obj->cpuset, type2, idx2); +} + +/** \brief Find an object below a chain of objects specified by types and indexes. + * + * This is a generalized version of hwloc_get_obj_below_by_type(). + * + * Arrays \p typev and \p idxv must contain \p nr types and indexes. + * + * Start from the top system object and walk the arrays \p typev and \p idxv. + * For each type and logical index couple in the arrays, look under the previously found + * object to find the index-th object of the given type. + * Indexes are specified within the parent, not withing the entire system. + * + * For instance, if nr is 3, typev contains NODE, PACKAGE and CORE, + * and idxv contains 0, 1 and 2, return the third core object below + * the second package below the first NUMA node. + * + * \return a matching object if any, \c NULL otherwise. + * + * \note This function requires all these objects and the root object + * to have a CPU set. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_below_array_by_type (hwloc_topology_t topology, int nr, hwloc_obj_type_t *typev, unsigned *idxv) __hwloc_attribute_pure; +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_below_array_by_type (hwloc_topology_t topology, int nr, hwloc_obj_type_t *typev, unsigned *idxv) +{ + hwloc_obj_t obj = hwloc_get_root_obj(topology); + int i; + for(i=0; icpuset, typev[i], idxv[i]); + } + return obj; +} + +/** \brief Return an object of a different type with same locality. + * + * If the source object \p src is a normal or memory type, + * this function returns an object of type \p type with same + * CPU and node sets, either below or above in the hierarchy. + * + * If the source object \p src is a PCI or an OS device within a PCI + * device, the function may either return that PCI device, or another + * OS device in the same PCI parent. + * This may for instance be useful for converting between OS devices + * such as "nvml0" or "rsmi1" used in distance structures into the + * the PCI device, or the CUDA or OpenCL OS device that correspond + * to the same physical card. + * + * If not \c NULL, parameter \p subtype only select objects whose + * subtype attribute exists and is \p subtype (case-insensitively), + * for instance "OpenCL" or "CUDA". + * + * If not \c NULL, parameter \p nameprefix only selects objects whose + * name attribute exists and starts with \p nameprefix (case-insensitively), + * for instance "rsmi" for matching "rsmi0". + * + * If multiple objects match, the first one is returned. + * + * This function will not walk the hierarchy across bridges since + * the PCI locality may become different. + * This function cannot also convert between normal/memory objects + * and I/O or Misc objects. + * + * \p flags must be \c 0 for now. + * + * \return An object with identical locality, + * matching \p subtype and \p nameprefix if any. + * + * \return \c NULL if no matching object could be found, + * or if the source object and target type are incompatible, + * for instance if converting between CPU and I/O objects. + */ +HWLOC_DECLSPEC hwloc_obj_t +hwloc_get_obj_with_same_locality(hwloc_topology_t topology, hwloc_obj_t src, + hwloc_obj_type_t type, const char *subtype, const char *nameprefix, + unsigned long flags); + +/** @} */ + + + +/** \defgroup hwlocality_helper_distribute Distributing items over a topology + * @{ + */ + +/** \brief Flags to be given to hwloc_distrib(). + */ +enum hwloc_distrib_flags_e { + /** \brief Distrib in reverse order, starting from the last objects. + * \hideinitializer + */ + HWLOC_DISTRIB_FLAG_REVERSE = (1UL<<0) +}; + +/** \brief Distribute \p n items over the topology under \p roots + * + * Array \p set will be filled with \p n cpusets recursively distributed + * linearly over the topology under objects \p roots, down to depth \p until + * (which can be INT_MAX to distribute down to the finest level). + * + * \p n_roots is usually 1 and \p roots only contains the topology root object + * so as to distribute over the entire topology. + * + * This is typically useful when an application wants to distribute \p n + * threads over a machine, giving each of them as much private cache as + * possible and keeping them locally in number order. + * + * The caller may typically want to also call hwloc_bitmap_singlify() + * before binding a thread so that it does not move at all. + * + * \p flags should be 0 or a OR'ed set of ::hwloc_distrib_flags_e. + * + * \return 0 on success, -1 on error. + * + * \note On hybrid CPUs (or asymmetric platforms), distribution may be suboptimal + * since the number of cores or PUs inside packages or below caches may vary + * (the top-down recursive partitioning ignores these numbers until reaching their levels). + * Hence it is recommended to distribute only inside a single homogeneous domain. + * For instance on a CPU with energy-efficient E-cores and high-performance P-cores, + * one should distribute separately N tasks on E-cores and M tasks on P-cores + * instead of trying to distribute directly M+N tasks on the entire CPUs. + * + * \note This function requires the \p roots objects to have a CPU set. + */ +static __hwloc_inline int +hwloc_distrib(hwloc_topology_t topology, + hwloc_obj_t *roots, unsigned n_roots, + hwloc_cpuset_t *set, + unsigned n, + int until, unsigned long flags) +{ + unsigned i; + unsigned tot_weight; + unsigned given, givenweight; + hwloc_cpuset_t *cpusetp = set; + + if (!n || (flags & ~HWLOC_DISTRIB_FLAG_REVERSE)) { + errno = EINVAL; + return -1; + } + + tot_weight = 0; + for (i = 0; i < n_roots; i++) + tot_weight += (unsigned) hwloc_bitmap_weight(roots[i]->cpuset); + + for (i = 0, given = 0, givenweight = 0; i < n_roots; i++) { + unsigned chunk, weight; + hwloc_obj_t root = roots[flags & HWLOC_DISTRIB_FLAG_REVERSE ? n_roots-1-i : i]; + hwloc_cpuset_t cpuset = root->cpuset; + while (!hwloc_obj_type_is_normal(root->type)) + /* If memory/io/misc, walk up to normal parent */ + root = root->parent; + weight = (unsigned) hwloc_bitmap_weight(cpuset); + if (!weight) + continue; + /* Give to root a chunk proportional to its weight. + * If previous chunks got rounded-up, we may get a bit less. */ + chunk = (( (givenweight+weight) * n + tot_weight-1) / tot_weight) + - (( givenweight * n + tot_weight-1) / tot_weight); + if (!root->arity || chunk <= 1 || root->depth >= until) { + /* We can't split any more, put everything there. */ + if (chunk) { + /* Fill cpusets with ours */ + unsigned j; + for (j=0; j < chunk; j++) + cpusetp[j] = hwloc_bitmap_dup(cpuset); + } else { + /* We got no chunk, just merge our cpuset to a previous one + * (the first chunk cannot be empty) + * so that this root doesn't get ignored. + */ + assert(given); + hwloc_bitmap_or(cpusetp[-1], cpusetp[-1], cpuset); + } + } else { + /* Still more to distribute, recurse into children */ + hwloc_distrib(topology, root->children, root->arity, cpusetp, chunk, until, flags); + } + cpusetp += chunk; + given += chunk; + givenweight += weight; + } + + return 0; +} + +/** @} */ + + + +/** \defgroup hwlocality_helper_topology_sets CPU and node sets of entire topologies + * @{ + */ + +/** \brief Get complete CPU set + * + * \return the complete CPU set of processors of the system. + * + * \note This function cannot return \c NULL. + * + * \note The returned cpuset is not newly allocated and should thus not be + * changed or freed; hwloc_bitmap_dup() must be used to obtain a local copy. + * + * \note This is equivalent to retrieving the root object complete CPU-set. + */ +HWLOC_DECLSPEC hwloc_const_cpuset_t +hwloc_topology_get_complete_cpuset(hwloc_topology_t topology) __hwloc_attribute_pure; + +/** \brief Get topology CPU set + * + * \return the CPU set of processors of the system for which hwloc + * provides topology information. This is equivalent to the cpuset of the + * system object. + * + * \note This function cannot return \c NULL. + * + * \note The returned cpuset is not newly allocated and should thus not be + * changed or freed; hwloc_bitmap_dup() must be used to obtain a local copy. + * + * \note This is equivalent to retrieving the root object CPU-set. + */ +HWLOC_DECLSPEC hwloc_const_cpuset_t +hwloc_topology_get_topology_cpuset(hwloc_topology_t topology) __hwloc_attribute_pure; + +/** \brief Get allowed CPU set + * + * \return the CPU set of allowed processors of the system. + * + * \note This function cannot return \c NULL. + * + * \note If the topology flag ::HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED was not set, + * this is identical to hwloc_topology_get_topology_cpuset(), which means + * all PUs are allowed. + * + * \note If ::HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED was set, applying + * hwloc_bitmap_intersects() on the result of this function and on an object + * cpuset checks whether there are allowed PUs inside that object. + * Applying hwloc_bitmap_and() returns the list of these allowed PUs. + * + * \note The returned cpuset is not newly allocated and should thus not be + * changed or freed, hwloc_bitmap_dup() must be used to obtain a local copy. + */ +HWLOC_DECLSPEC hwloc_const_cpuset_t +hwloc_topology_get_allowed_cpuset(hwloc_topology_t topology) __hwloc_attribute_pure; + +/** \brief Get complete node set + * + * \return the complete node set of memory of the system. + * + * \note This function cannot return \c NULL. + * + * \note The returned nodeset is not newly allocated and should thus not be + * changed or freed; hwloc_bitmap_dup() must be used to obtain a local copy. + * + * \note This is equivalent to retrieving the root object complete nodeset. + */ +HWLOC_DECLSPEC hwloc_const_nodeset_t +hwloc_topology_get_complete_nodeset(hwloc_topology_t topology) __hwloc_attribute_pure; + +/** \brief Get topology node set + * + * \return the node set of memory of the system for which hwloc + * provides topology information. This is equivalent to the nodeset of the + * system object. + * + * \note This function cannot return \c NULL. + * + * \note The returned nodeset is not newly allocated and should thus not be + * changed or freed; hwloc_bitmap_dup() must be used to obtain a local copy. + * + * \note This is equivalent to retrieving the root object nodeset. + */ +HWLOC_DECLSPEC hwloc_const_nodeset_t +hwloc_topology_get_topology_nodeset(hwloc_topology_t topology) __hwloc_attribute_pure; + +/** \brief Get allowed node set + * + * \return the node set of allowed memory of the system. + * + * \note This function cannot return \c NULL. + * + * \note If the topology flag ::HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED was not set, + * this is identical to hwloc_topology_get_topology_nodeset(), which means + * all NUMA nodes are allowed. + * + * \note If ::HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED was set, applying + * hwloc_bitmap_intersects() on the result of this function and on an object + * nodeset checks whether there are allowed NUMA nodes inside that object. + * Applying hwloc_bitmap_and() returns the list of these allowed NUMA nodes. + * + * \note The returned nodeset is not newly allocated and should thus not be + * changed or freed, hwloc_bitmap_dup() must be used to obtain a local copy. + */ +HWLOC_DECLSPEC hwloc_const_nodeset_t +hwloc_topology_get_allowed_nodeset(hwloc_topology_t topology) __hwloc_attribute_pure; + +/** @} */ + + + +/** \defgroup hwlocality_helper_nodeset_convert Converting between CPU sets and node sets + * + * @{ + */ + +/** \brief Convert a CPU set into a NUMA node set + * + * For each PU included in the input \p _cpuset, set the corresponding + * local NUMA node(s) in the output \p nodeset. + * + * If some NUMA nodes have no CPUs at all, this function never sets their + * indexes in the output node set, even if a full CPU set is given in input. + * + * Hence the entire topology CPU set is converted into the set of all nodes + * that have some local CPUs. + * + * \return 0 on success. + * \return -1 with errno set to \c ENOMEM on internal reallocation failure. + */ +static __hwloc_inline int +hwloc_cpuset_to_nodeset(hwloc_topology_t topology, hwloc_const_cpuset_t _cpuset, hwloc_nodeset_t nodeset) +{ + int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE); + hwloc_obj_t obj = NULL; + assert(depth != HWLOC_TYPE_DEPTH_UNKNOWN); + hwloc_bitmap_zero(nodeset); + while ((obj = hwloc_get_next_obj_covering_cpuset_by_depth(topology, _cpuset, depth, obj)) != NULL) + if (hwloc_bitmap_set(nodeset, obj->os_index) < 0) + return -1; + return 0; +} + +/** \brief Convert a NUMA node set into a CPU set + * + * For each NUMA node included in the input \p nodeset, set the corresponding + * local PUs in the output \p _cpuset. + * + * If some CPUs have no local NUMA nodes, this function never sets their + * indexes in the output CPU set, even if a full node set is given in input. + * + * Hence the entire topology node set is converted into the set of all CPUs + * that have some local NUMA nodes. + * + * \return 0 on success. + * \return -1 with errno set to \c ENOMEM on internal reallocation failure. + */ +static __hwloc_inline int +hwloc_cpuset_from_nodeset(hwloc_topology_t topology, hwloc_cpuset_t _cpuset, hwloc_const_nodeset_t nodeset) +{ + int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE); + hwloc_obj_t obj = NULL; + assert(depth != HWLOC_TYPE_DEPTH_UNKNOWN); + hwloc_bitmap_zero(_cpuset); + while ((obj = hwloc_get_next_obj_by_depth(topology, depth, obj)) != NULL) { + if (hwloc_bitmap_isset(nodeset, obj->os_index)) + /* no need to check obj->cpuset because objects in levels always have a cpuset */ + if (hwloc_bitmap_or(_cpuset, _cpuset, obj->cpuset) < 0) + return -1; + } + return 0; +} + +/** @} */ + + + +/** \defgroup hwlocality_advanced_io Finding I/O objects + * @{ + */ + +/** \brief Get the first non-I/O ancestor object. + * + * Given the I/O object \p ioobj, find the smallest non-I/O ancestor + * object. This object (normal or memory) may then be used for binding + * because it has non-NULL CPU and node sets + * and because its locality is the same as \p ioobj. + * + * \return a non-I/O object. + * + * \note This function cannot return \c NULL. + * + * \note The resulting object is usually a normal object but it could also + * be a memory object (e.g. NUMA node) in future platforms if I/O objects + * ever get attached to memory instead of CPUs. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_non_io_ancestor_obj(hwloc_topology_t topology __hwloc_attribute_unused, + hwloc_obj_t ioobj) +{ + hwloc_obj_t obj = ioobj; + while (obj && !obj->cpuset) { + obj = obj->parent; + } + return obj; +} + +/** \brief Get the next PCI device in the system. + * + * \return the first PCI device if \p prev is \c NULL. + * \return the next PCI device if \p prev is not \c NULL. + * \return \c NULL if there is no next PCI device. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_next_pcidev(hwloc_topology_t topology, hwloc_obj_t prev) +{ + return hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_PCI_DEVICE, prev); +} + +/** \brief Find the PCI device object matching the PCI bus id + * given domain, bus device and function PCI bus id. + * + * \return a matching PCI device object if any, \c NULL otherwise. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_pcidev_by_busid(hwloc_topology_t topology, + unsigned domain, unsigned bus, unsigned dev, unsigned func) +{ + hwloc_obj_t obj = NULL; + while ((obj = hwloc_get_next_pcidev(topology, obj)) != NULL) { + if (obj->attr->pcidev.domain == domain + && obj->attr->pcidev.bus == bus + && obj->attr->pcidev.dev == dev + && obj->attr->pcidev.func == func) + return obj; + } + return NULL; +} + +/** \brief Find the PCI device object matching the PCI bus id + * given as a string xxxx:yy:zz.t or yy:zz.t. + * + * \return a matching PCI device object if any, \c NULL otherwise. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_pcidev_by_busidstring(hwloc_topology_t topology, const char *busid) +{ + unsigned domain = 0; /* default */ + unsigned bus, dev, func; + + if (sscanf(busid, "%x:%x.%x", &bus, &dev, &func) != 3 + && sscanf(busid, "%x:%x:%x.%x", &domain, &bus, &dev, &func) != 4) { + errno = EINVAL; + return NULL; + } + + return hwloc_get_pcidev_by_busid(topology, domain, bus, dev, func); +} + +/** \brief Get the next OS device in the system. + * + * \return the first OS device if \p prev is \c NULL. + * \return the next OS device if \p prev is not \c NULL. + * \return \c NULL if there is no next OS device. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_next_osdev(hwloc_topology_t topology, hwloc_obj_t prev) +{ + return hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_OS_DEVICE, prev); +} + +/** \brief Get the next bridge in the system. + * + * \return the first bridge if \p prev is \c NULL. + * \return the next bridge if \p prev is not \c NULL. + * \return \c NULL if there is no next bridge. + */ +static __hwloc_inline hwloc_obj_t +hwloc_get_next_bridge(hwloc_topology_t topology, hwloc_obj_t prev) +{ + return hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_BRIDGE, prev); +} + +/* \brief Checks whether a given bridge covers a given PCI bus. + * + * \return 1 if it covers, 0 if not. + */ +static __hwloc_inline int +hwloc_bridge_covers_pcibus(hwloc_obj_t bridge, + unsigned domain, unsigned bus) +{ + return bridge->type == HWLOC_OBJ_BRIDGE + && bridge->attr->bridge.downstream_type == HWLOC_OBJ_BRIDGE_PCI + && bridge->attr->bridge.downstream.pci.domain == domain + && bridge->attr->bridge.downstream.pci.secondary_bus <= bus + && bridge->attr->bridge.downstream.pci.subordinate_bus >= bus; +} + +/** @} */ + + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_HELPER_H */ diff --git a/src/deps/hwloc/include/hwloc/inlines.h b/src/deps/hwloc/include/hwloc/inlines.h new file mode 100644 index 000000000..0391f73b4 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/inlines.h @@ -0,0 +1,147 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2018 Inria. All rights reserved. + * Copyright © 2009-2012 Université Bordeaux + * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/** + * This file contains the inline code of functions declared in hwloc.h + */ + +#ifndef HWLOC_INLINES_H +#define HWLOC_INLINES_H + +#ifndef HWLOC_H +#error Please include the main hwloc.h instead +#endif + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + +static __hwloc_inline int +hwloc_get_type_or_below_depth (hwloc_topology_t topology, hwloc_obj_type_t type) +{ + int depth = hwloc_get_type_depth(topology, type); + + if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) + return depth; + + /* find the highest existing level with type order >= */ + for(depth = hwloc_get_type_depth(topology, HWLOC_OBJ_PU); ; depth--) + if (hwloc_compare_types(hwloc_get_depth_type(topology, depth), type) < 0) + return depth+1; + + /* Shouldn't ever happen, as there is always a Machine level with lower order and known depth. */ + /* abort(); */ +} + +static __hwloc_inline int +hwloc_get_type_or_above_depth (hwloc_topology_t topology, hwloc_obj_type_t type) +{ + int depth = hwloc_get_type_depth(topology, type); + + if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) + return depth; + + /* find the lowest existing level with type order <= */ + for(depth = 0; ; depth++) + if (hwloc_compare_types(hwloc_get_depth_type(topology, depth), type) > 0) + return depth-1; + + /* Shouldn't ever happen, as there is always a PU level with higher order and known depth. */ + /* abort(); */ +} + +static __hwloc_inline int +hwloc_get_nbobjs_by_type (hwloc_topology_t topology, hwloc_obj_type_t type) +{ + int depth = hwloc_get_type_depth(topology, type); + if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) + return 0; + if (depth == HWLOC_TYPE_DEPTH_MULTIPLE) + return -1; /* FIXME: agregate nbobjs from different levels? */ + return (int) hwloc_get_nbobjs_by_depth(topology, depth); +} + +static __hwloc_inline hwloc_obj_t +hwloc_get_obj_by_type (hwloc_topology_t topology, hwloc_obj_type_t type, unsigned idx) +{ + int depth = hwloc_get_type_depth(topology, type); + if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) + return NULL; + if (depth == HWLOC_TYPE_DEPTH_MULTIPLE) + return NULL; + return hwloc_get_obj_by_depth(topology, depth, idx); +} + +static __hwloc_inline hwloc_obj_t +hwloc_get_next_obj_by_depth (hwloc_topology_t topology, int depth, hwloc_obj_t prev) +{ + if (!prev) + return hwloc_get_obj_by_depth (topology, depth, 0); + if (prev->depth != depth) + return NULL; + return prev->next_cousin; +} + +static __hwloc_inline hwloc_obj_t +hwloc_get_next_obj_by_type (hwloc_topology_t topology, hwloc_obj_type_t type, + hwloc_obj_t prev) +{ + int depth = hwloc_get_type_depth(topology, type); + if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE) + return NULL; + return hwloc_get_next_obj_by_depth (topology, depth, prev); +} + +static __hwloc_inline hwloc_obj_t +hwloc_get_root_obj (hwloc_topology_t topology) +{ + return hwloc_get_obj_by_depth (topology, 0, 0); +} + +static __hwloc_inline const char * +hwloc_obj_get_info_by_name(hwloc_obj_t obj, const char *name) +{ + unsigned i; + for(i=0; iinfos_count; i++) { + struct hwloc_info_s *info = &obj->infos[i]; + if (!strcmp(info->name, name)) + return info->value; + } + return NULL; +} + +static __hwloc_inline void * +hwloc_alloc_membind_policy(hwloc_topology_t topology, size_t len, hwloc_const_cpuset_t set, hwloc_membind_policy_t policy, int flags) +{ + void *p = hwloc_alloc_membind(topology, len, set, policy, flags); + if (p) + return p; + + if (hwloc_set_membind(topology, set, policy, flags) < 0) + /* hwloc_set_membind() takes care of ignoring errors if non-STRICT */ + return NULL; + + p = hwloc_alloc(topology, len); + if (p && policy != HWLOC_MEMBIND_FIRSTTOUCH) + /* Enforce the binding by touching the data */ + memset(p, 0, len); + return p; +} + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_INLINES_H */ diff --git a/src/deps/hwloc/include/hwloc/levelzero.h b/src/deps/hwloc/include/hwloc/levelzero.h new file mode 100644 index 000000000..1a3f976fc --- /dev/null +++ b/src/deps/hwloc/include/hwloc/levelzero.h @@ -0,0 +1,299 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2021-2024 Inria. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and the oneAPI Level Zero interface. + * + * Applications that use both hwloc and Level Zero may want to + * include this file so as to get topology information for L0 devices. + */ + +#ifndef HWLOC_LEVELZERO_H +#define HWLOC_LEVELZERO_H + +#include "hwloc.h" +#include "hwloc/autogen/config.h" +#include "hwloc/helper.h" +#ifdef HWLOC_LINUX_SYS +#include "hwloc/linux.h" +#endif + +#include +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_levelzero Interoperability with the oneAPI Level Zero interface. + * + * This interface offers ways to retrieve topology information about + * devices managed by the Level Zero API, both for main Core devices (ZE API) + * and the Sysman devices (ZES API). + * + * @{ + */ + +/** \brief Get the CPU set of logical processors that are physically + * close to the Level Zero device \p device + * + * Store in \p set the CPU-set describing the locality of + * the Level Zero device \p device. + * + * Topology \p topology and device \p device must match the local machine. + * The Level Zero library must have been initialized with zeInit(). + * I/O devices detection and the Level Zero component are not needed in the + * topology. + * + * The function only returns the locality of the device. + * If more information about the device is needed, OS objects should + * be used instead, see hwloc_levelzero_get_device_osdev(). + * + * This function is currently only implemented in a meaningful way for + * Linux; other systems will simply get a full cpuset. + * + * \return 0 on success. + * \return -1 on error, for instance if device information could not be found. + * + * \note zeDevicePciGetPropertiesExt() must be supported, or the entire machine + * locality will be returned. + */ +static __hwloc_inline int +hwloc_levelzero_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused, + ze_device_handle_t device, hwloc_cpuset_t set) +{ +#ifdef HWLOC_LINUX_SYS + /* If we're on Linux, use the sysfs mechanism to get the local cpus */ +#define HWLOC_LEVELZERO_DEVICE_SYSFS_PATH_MAX 128 + char path[HWLOC_LEVELZERO_DEVICE_SYSFS_PATH_MAX]; + ze_pci_ext_properties_t pci; + ze_result_t res; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return -1; + } + + pci.stype = ZE_STRUCTURE_TYPE_PCI_EXT_PROPERTIES; + pci.pNext = NULL; + res = zeDevicePciGetPropertiesExt(device, &pci); + if (res != ZE_RESULT_SUCCESS) { + errno = EINVAL; + return -1; + } + + sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/local_cpus", + pci.address.domain, pci.address.bus, pci.address.device, pci.address.function); + if (hwloc_linux_read_path_as_cpumask(path, set) < 0 + || hwloc_bitmap_iszero(set)) + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#else + /* Non-Linux systems simply get a full cpuset */ + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#endif + return 0; +} + +/** \brief Get the CPU set of logical processors that are physically + * close to the Level Zero Sysman device \p device + * + * Store in \p set the CPU-set describing the locality of + * the Level Zero device \p device. + * + * Topology \p topology and device \p device must match the local machine. + * The Level Zero library must have been initialized with Sysman enabled + * with zesInit(). + * I/O devices detection and the Level Zero component are not needed in the + * topology. + * + * The function only returns the locality of the device. + * If more information about the device is needed, OS objects should + * be used instead, see hwloc_levelzero_get_device_osdev(). + * + * This function is currently only implemented in a meaningful way for + * Linux; other systems will simply get a full cpuset. + * + * \return 0 on success. + * \return -1 on error, for instance if device information could not be found. + */ +static __hwloc_inline int +hwloc_levelzero_get_sysman_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused, + zes_device_handle_t device, hwloc_cpuset_t set) +{ +#ifdef HWLOC_LINUX_SYS + /* If we're on Linux, use the sysfs mechanism to get the local cpus */ +#define HWLOC_LEVELZERO_DEVICE_SYSFS_PATH_MAX 128 + char path[HWLOC_LEVELZERO_DEVICE_SYSFS_PATH_MAX]; + zes_pci_properties_t pci; + ze_result_t res; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return -1; + } + + res = zesDevicePciGetProperties(device, &pci); + if (res != ZE_RESULT_SUCCESS) { + errno = EINVAL; + return -1; + } + + sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/local_cpus", + pci.address.domain, pci.address.bus, pci.address.device, pci.address.function); + if (hwloc_linux_read_path_as_cpumask(path, set) < 0 + || hwloc_bitmap_iszero(set)) + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#else + /* Non-Linux systems simply get a full cpuset */ + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#endif + return 0; +} + +/** \brief Get the hwloc OS device object corresponding to Level Zero device + * \p device. + * + * \return The hwloc OS device object that describes the given Level Zero device \p device. + * \return \c NULL if none could be found. + * + * Topology \p topology and device \p dv_ind must match the local machine. + * The Level Zero library must have been initialized with zeInit(). + * I/O devices detection and the Level Zero component must be enabled in the + * topology. If not, the locality of the object may still be found using + * hwloc_levelzero_get_device_cpuset(). + * + * \note If the input ZE device is actually a subdevice, then its parent + * (root device) is actually translated, i.e. the main hwloc OS device + * is returned instead of one of its children. + * + * \note The corresponding hwloc PCI device may be found by looking + * at the result parent pointer (unless PCI devices are filtered out). + * + * \note zeDevicePciGetPropertiesExt() must be supported. + */ +static __hwloc_inline hwloc_obj_t +hwloc_levelzero_get_device_osdev(hwloc_topology_t topology, ze_device_handle_t device) +{ + ze_pci_ext_properties_t pci; + ze_result_t res; + hwloc_obj_t osdev; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return NULL; + } + + pci.stype = ZE_STRUCTURE_TYPE_PCI_EXT_PROPERTIES; + pci.pNext = NULL; + res = zeDevicePciGetPropertiesExt(device, &pci); + if (res != ZE_RESULT_SUCCESS) { + errno = EINVAL; + return NULL; + } + + osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + hwloc_obj_t pcidev; + + if (strncmp(osdev->name, "ze", 2)) + continue; + + pcidev = osdev; + while (pcidev && pcidev->type != HWLOC_OBJ_PCI_DEVICE) + pcidev = pcidev->parent; + if (!pcidev) + continue; + + if (pcidev + && pcidev->type == HWLOC_OBJ_PCI_DEVICE + && pcidev->attr->pcidev.domain == pci.address.domain + && pcidev->attr->pcidev.bus == pci.address.bus + && pcidev->attr->pcidev.dev == pci.address.device + && pcidev->attr->pcidev.func == pci.address.function) + return osdev; + + /* FIXME: when we'll have serialnumber, try it in case PCI is filtered-out */ + } + + return NULL; +} + +/** \brief Get the hwloc OS device object corresponding to Level Zero Sysman device + * \p device. + * + * \return The hwloc OS device object that describes the given Level Zero device \p device. + * \return \c NULL if none could be found. + * + * Topology \p topology and device \p dv_ind must match the local machine. + * The Level Zero library must have been initialized with Sysman enabled + * with zesInit(). + * I/O devices detection and the Level Zero component must be enabled in the + * topology. If not, the locality of the object may still be found using + * hwloc_levelzero_get_device_cpuset(). + * + * \note If the input ZES device is actually a subdevice, then its parent + * (root device) is actually translated, i.e. the main hwloc OS device + * is returned instead of one of its children. + * + * \note The corresponding hwloc PCI device may be found by looking + * at the result parent pointer (unless PCI devices are filtered out). + */ +static __hwloc_inline hwloc_obj_t +hwloc_levelzero_get_sysman_device_osdev(hwloc_topology_t topology, zes_device_handle_t device) +{ + zes_pci_properties_t pci; + ze_result_t res; + hwloc_obj_t osdev; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return NULL; + } + + res = zesDevicePciGetProperties(device, &pci); + if (res != ZE_RESULT_SUCCESS) { + errno = EINVAL; + return NULL; + } + + osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + hwloc_obj_t pcidev; + + if (strncmp(osdev->name, "ze", 2)) + continue; + + pcidev = osdev; + while (pcidev && pcidev->type != HWLOC_OBJ_PCI_DEVICE) + pcidev = pcidev->parent; + if (!pcidev) + continue; + + if (pcidev + && pcidev->type == HWLOC_OBJ_PCI_DEVICE + && pcidev->attr->pcidev.domain == pci.address.domain + && pcidev->attr->pcidev.bus == pci.address.bus + && pcidev->attr->pcidev.dev == pci.address.device + && pcidev->attr->pcidev.func == pci.address.function) + return osdev; + + /* FIXME: when we'll have serialnumber, try it in case PCI is filtered-out */ + } + + return NULL; +} + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_LEVELZERO_H */ diff --git a/src/deps/hwloc/include/hwloc/linux-libnuma.h b/src/deps/hwloc/include/hwloc/linux-libnuma.h new file mode 100644 index 000000000..c470a6d1f --- /dev/null +++ b/src/deps/hwloc/include/hwloc/linux-libnuma.h @@ -0,0 +1,301 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2023 Inria. All rights reserved. + * Copyright © 2009-2010, 2012 Université Bordeaux + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and Linux libnuma. + * + * Applications that use both Linux libnuma and hwloc may want to + * include this file so as to ease conversion between their respective types. +*/ + +#ifndef HWLOC_LINUX_LIBNUMA_H +#define HWLOC_LINUX_LIBNUMA_H + +#include "hwloc.h" + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_linux_libnuma_ulongs Interoperability with Linux libnuma unsigned long masks + * + * This interface helps converting between Linux libnuma unsigned long masks + * and hwloc cpusets and nodesets. + * + * \note Topology \p topology must match the current machine. + * + * \note The behavior of libnuma is undefined if the kernel is not NUMA-aware. + * (when CONFIG_NUMA is not set in the kernel configuration). + * This helper and libnuma may thus not be strictly compatible in this case, + * which may be detected by checking whether numa_available() returns -1. + * + * @{ + */ + + +/** \brief Convert hwloc CPU set \p cpuset into the array of unsigned long \p mask + * + * \p mask is the array of unsigned long that will be filled. + * \p maxnode contains the maximal node number that may be stored in \p mask. + * \p maxnode will be set to the maximal node number that was found, plus one. + * + * This function may be used before calling set_mempolicy, mbind, migrate_pages + * or any other function that takes an array of unsigned long and a maximal + * node number as input parameter. + * + * \return 0. + * + * \note On heterogeneous memory platforms, we may return multiple local NUMA nodes + * even if libnuma reports only one (usually the first one). + */ +static __hwloc_inline int +hwloc_cpuset_to_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset, + unsigned long *mask, unsigned long *maxnode) +{ + int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE); + unsigned long outmaxnode = -1; + hwloc_obj_t node = NULL; + + /* round-up to the next ulong and clear all bytes */ + *maxnode = (*maxnode + 8*sizeof(*mask) - 1) & ~(8*sizeof(*mask) - 1); + memset(mask, 0, *maxnode/8); + + while ((node = hwloc_get_next_obj_covering_cpuset_by_depth(topology, cpuset, depth, node)) != NULL) { + if (node->os_index >= *maxnode) + continue; + mask[node->os_index/sizeof(*mask)/8] |= 1UL << (node->os_index % (sizeof(*mask)*8)); + if (outmaxnode == (unsigned long) -1 || outmaxnode < node->os_index) + outmaxnode = node->os_index; + } + + *maxnode = outmaxnode+1; + return 0; +} + +/** \brief Convert hwloc NUMA node set \p nodeset into the array of unsigned long \p mask + * + * \p mask is the array of unsigned long that will be filled. + * \p maxnode contains the maximal node number that may be stored in \p mask. + * \p maxnode will be set to the maximal node number that was found, plus one. + * + * This function may be used before calling set_mempolicy, mbind, migrate_pages + * or any other function that takes an array of unsigned long and a maximal + * node number as input parameter. + * + * \return 0. + */ +static __hwloc_inline int +hwloc_nodeset_to_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, + unsigned long *mask, unsigned long *maxnode) +{ + int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE); + unsigned long outmaxnode = -1; + hwloc_obj_t node = NULL; + + /* round-up to the next ulong and clear all bytes */ + *maxnode = (*maxnode + 8*sizeof(*mask) - 1) & ~(8*sizeof(*mask) - 1); + memset(mask, 0, *maxnode/8); + + while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL) { + if (node->os_index >= *maxnode) + continue; + if (!hwloc_bitmap_isset(nodeset, node->os_index)) + continue; + mask[node->os_index/sizeof(*mask)/8] |= 1UL << (node->os_index % (sizeof(*mask)*8)); + if (outmaxnode == (unsigned long) -1 || outmaxnode < node->os_index) + outmaxnode = node->os_index; + } + + *maxnode = outmaxnode+1; + return 0; +} + +/** \brief Convert the array of unsigned long \p mask into hwloc CPU set + * + * \p mask is a array of unsigned long that will be read. + * \p maxnode contains the maximal node number that may be read in \p mask. + * + * This function may be used after calling get_mempolicy or any other function + * that takes an array of unsigned long as output parameter (and possibly + * a maximal node number as input parameter). + * + * \return 0 on success. + * \return -1 on error, for instance if failing an internal reallocation. + */ +static __hwloc_inline int +hwloc_cpuset_from_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_cpuset_t cpuset, + const unsigned long *mask, unsigned long maxnode) +{ + int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE); + hwloc_obj_t node = NULL; + hwloc_bitmap_zero(cpuset); + while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL) + if (node->os_index < maxnode + && (mask[node->os_index/sizeof(*mask)/8] & (1UL << (node->os_index % (sizeof(*mask)*8))))) + if (hwloc_bitmap_or(cpuset, cpuset, node->cpuset) < 0) + return -1; + return 0; +} + +/** \brief Convert the array of unsigned long \p mask into hwloc NUMA node set + * + * \p mask is a array of unsigned long that will be read. + * \p maxnode contains the maximal node number that may be read in \p mask. + * + * This function may be used after calling get_mempolicy or any other function + * that takes an array of unsigned long as output parameter (and possibly + * a maximal node number as input parameter). + * + * \return 0 on success. + * \return -1 with errno set to \c ENOMEM if some internal reallocation failed. + */ +static __hwloc_inline int +hwloc_nodeset_from_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_nodeset_t nodeset, + const unsigned long *mask, unsigned long maxnode) +{ + int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE); + hwloc_obj_t node = NULL; + hwloc_bitmap_zero(nodeset); + while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL) + if (node->os_index < maxnode + && (mask[node->os_index/sizeof(*mask)/8] & (1UL << (node->os_index % (sizeof(*mask)*8))))) + if (hwloc_bitmap_set(nodeset, node->os_index) < 0) + return -1; + return 0; +} + +/** @} */ + + + +/** \defgroup hwlocality_linux_libnuma_bitmask Interoperability with Linux libnuma bitmask + * + * This interface helps converting between Linux libnuma bitmasks + * and hwloc cpusets and nodesets. + * + * \note Topology \p topology must match the current machine. + * + * \note The behavior of libnuma is undefined if the kernel is not NUMA-aware. + * (when CONFIG_NUMA is not set in the kernel configuration). + * This helper and libnuma may thus not be strictly compatible in this case, + * which may be detected by checking whether numa_available() returns -1. + * + * @{ + */ + + +/** \brief Convert hwloc CPU set \p cpuset into the returned libnuma bitmask + * + * The returned bitmask should later be freed with numa_bitmask_free. + * + * This function may be used before calling many numa_ functions + * that use a struct bitmask as an input parameter. + * + * \return newly allocated struct bitmask, or \c NULL on error. + * + * \note On heterogeneous memory platforms, we may return multiple local NUMA nodes + * even if libnuma reports only one (usually the first one). + */ +static __hwloc_inline struct bitmask * +hwloc_cpuset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset) __hwloc_attribute_malloc; +static __hwloc_inline struct bitmask * +hwloc_cpuset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset) +{ + int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE); + hwloc_obj_t node = NULL; + struct bitmask *bitmask = numa_allocate_cpumask(); + if (!bitmask) + return NULL; + while ((node = hwloc_get_next_obj_covering_cpuset_by_depth(topology, cpuset, depth, node)) != NULL) + if (node->attr->numanode.local_memory) + numa_bitmask_setbit(bitmask, node->os_index); + return bitmask; +} + +/** \brief Convert hwloc NUMA node set \p nodeset into the returned libnuma bitmask + * + * The returned bitmask should later be freed with numa_bitmask_free. + * + * This function may be used before calling many numa_ functions + * that use a struct bitmask as an input parameter. + * + * \return newly allocated struct bitmask, or \c NULL on error. + */ +static __hwloc_inline struct bitmask * +hwloc_nodeset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset) __hwloc_attribute_malloc; +static __hwloc_inline struct bitmask * +hwloc_nodeset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset) +{ + int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE); + hwloc_obj_t node = NULL; + struct bitmask *bitmask = numa_allocate_cpumask(); + if (!bitmask) + return NULL; + while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL) + if (hwloc_bitmap_isset(nodeset, node->os_index) && node->attr->numanode.local_memory) + numa_bitmask_setbit(bitmask, node->os_index); + return bitmask; +} + +/** \brief Convert libnuma bitmask \p bitmask into hwloc CPU set \p cpuset + * + * This function may be used after calling many numa_ functions + * that use a struct bitmask as an output parameter. + * + * \return 0 on success. + * \return -1 with errno set to \c ENOMEM if some internal reallocation failed. + */ +static __hwloc_inline int +hwloc_cpuset_from_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_cpuset_t cpuset, + const struct bitmask *bitmask) +{ + int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE); + hwloc_obj_t node = NULL; + hwloc_bitmap_zero(cpuset); + while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL) + if (numa_bitmask_isbitset(bitmask, node->os_index)) + if (hwloc_bitmap_or(cpuset, cpuset, node->cpuset) < 0) + return -1; + return 0; +} + +/** \brief Convert libnuma bitmask \p bitmask into hwloc NUMA node set \p nodeset + * + * This function may be used after calling many numa_ functions + * that use a struct bitmask as an output parameter. + * + * \return 0 on success. + * \return -1 with errno set to \c ENOMEM if some internal reallocation failed. + */ +static __hwloc_inline int +hwloc_nodeset_from_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_nodeset_t nodeset, + const struct bitmask *bitmask) +{ + int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NUMANODE); + hwloc_obj_t node = NULL; + hwloc_bitmap_zero(nodeset); + while ((node = hwloc_get_next_obj_by_depth(topology, depth, node)) != NULL) + if (numa_bitmask_isbitset(bitmask, node->os_index)) + if (hwloc_bitmap_set(nodeset, node->os_index) < 0) + return -1; + return 0; +} + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_LINUX_NUMA_H */ diff --git a/src/deps/hwloc/include/hwloc/linux.h b/src/deps/hwloc/include/hwloc/linux.h new file mode 100644 index 000000000..fb3054218 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/linux.h @@ -0,0 +1,96 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2023 Inria. All rights reserved. + * Copyright © 2009-2011 Université Bordeaux + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and Linux. + * + * Applications that use hwloc on Linux may want to include this file + * if using some low-level Linux features. + */ + +#ifndef HWLOC_LINUX_H +#define HWLOC_LINUX_H + +#include "hwloc.h" + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_linux Linux-specific helpers + * + * This includes helpers for manipulating Linux kernel cpumap files, and hwloc + * equivalents of the Linux sched_setaffinity and sched_getaffinity system calls. + * + * @{ + */ + +/** \brief Bind a thread \p tid on cpus given in cpuset \p set + * + * The behavior is exactly the same as the Linux sched_setaffinity system call, + * but uses a hwloc cpuset. + * + * \return 0 on success, -1 on error. + * + * \note This is equivalent to calling hwloc_set_proc_cpubind() with + * HWLOC_CPUBIND_THREAD as flags. + */ +HWLOC_DECLSPEC int hwloc_linux_set_tid_cpubind(hwloc_topology_t topology, pid_t tid, hwloc_const_cpuset_t set); + +/** \brief Get the current binding of thread \p tid + * + * The CPU-set \p set (previously allocated by the caller) + * is filled with the list of PUs which the thread + * was last bound to. + * + * The behavior is exactly the same as the Linux sched_getaffinity system call, + * but uses a hwloc cpuset. + * + * \return 0 on success, -1 on error. + * + * \note This is equivalent to calling hwloc_get_proc_cpubind() with + * ::HWLOC_CPUBIND_THREAD as flags. + */ +HWLOC_DECLSPEC int hwloc_linux_get_tid_cpubind(hwloc_topology_t topology, pid_t tid, hwloc_cpuset_t set); + +/** \brief Get the last physical CPU where thread \p tid ran. + * + * The CPU-set \p set (previously allocated by the caller) + * is filled with the PU which the thread last ran on. + * + * \return 0 on success, -1 on error. + * + * \note This is equivalent to calling hwloc_get_proc_last_cpu_location() with + * ::HWLOC_CPUBIND_THREAD as flags. + */ +HWLOC_DECLSPEC int hwloc_linux_get_tid_last_cpu_location(hwloc_topology_t topology, pid_t tid, hwloc_bitmap_t set); + +/** \brief Convert a linux kernel cpumask file \p path into a hwloc bitmap \p set. + * + * Might be used when reading CPU set from sysfs attributes such as topology + * and caches for processors, or local_cpus for devices. + * + * \return 0 on success, -1 on error. + * + * \note This function ignores the HWLOC_FSROOT environment variable. + */ +HWLOC_DECLSPEC int hwloc_linux_read_path_as_cpumask(const char *path, hwloc_bitmap_t set); + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_LINUX_H */ diff --git a/src/deps/hwloc/include/hwloc/memattrs.h b/src/deps/hwloc/include/hwloc/memattrs.h new file mode 100644 index 000000000..aa69085e3 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/memattrs.h @@ -0,0 +1,672 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2019-2025 Inria. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Memory node attributes. + */ + +#ifndef HWLOC_MEMATTR_H +#define HWLOC_MEMATTR_H + +#include "hwloc.h" + +#ifdef __cplusplus +extern "C" { +#elif 0 +} +#endif + +/** \defgroup hwlocality_memattrs Comparing memory node attributes for finding where to allocate on + * + * Platforms with heterogeneous memory require ways to decide whether + * a buffer should be allocated on "fast" memory (such as HBM), + * "normal" memory (DDR) or even "slow" but large-capacity memory + * (non-volatile memory). + * These memory nodes are called "Targets" while the CPU accessing them + * is called the "Initiator". Access performance depends on their + * locality (NUMA platforms) as well as the intrinsic performance + * of the targets (heterogeneous platforms). + * + * The following attributes describe the performance of memory accesses + * from an Initiator to a memory Target, for instance their latency + * or bandwidth. + * Initiators performing these memory accesses are usually some PUs or Cores + * (described as a CPU set). + * Hence a Core may choose where to allocate a memory buffer by comparing + * the attributes of different target memory nodes nearby. + * + * There are also some attributes that are system-wide. + * Their value does not depend on a specific initiator performing + * an access. + * The memory node Capacity is an example of such attribute without + * initiator. + * + * One way to use this API is to start with a cpuset describing the Cores where + * a program is bound. The best target NUMA node for allocating memory in this + * program on these Cores may be obtained by passing this cpuset as an initiator + * to hwloc_memattr_get_best_target() with the relevant memory attribute. + * For instance, if the code is latency limited, use the Latency attribute. + * + * A more flexible approach consists in getting the list of local NUMA nodes + * by passing this cpuset to hwloc_get_local_numanode_objs(). + * Attribute values for these nodes, if any, may then be obtained with + * hwloc_memattr_get_value() and manually compared with the desired criteria. + * + * Memory attributes are also used internally to build Memory Tiers which provide + * an easy way to distinguish NUMA nodes of different kinds, as explained + * in \ref heteromem. + * + * Beside tiers, hwloc defines a set of "default" nodes where normal memory + * allocations should be made from (see hwloc_topology_get_default_nodeset()). + * This is also useful for dividing the machine into a set of non-overlapping + * NUMA domains, for instance for binding tasks per domain. + * + * \sa An example is available in doc/examples/memory-attributes.c in the source tree. + * + * \note The API also supports specific objects as initiator, + * but it is currently not used internally by hwloc. + * Users may for instance use it to provide custom performance + * values for host memory accesses performed by GPUs. + * + * \note The interface actually also accepts targets that are not NUMA nodes. + * @{ + */ + +/** \brief Predefined memory attribute IDs. + * See ::hwloc_memattr_id_t for the generic definition of IDs + * for predefined or custom attributes. + */ +enum hwloc_memattr_id_e { + /** \brief + * The \"Capacity\" is returned in bytes (local_memory attribute in objects). + * + * Best capacity nodes are nodes with higher capacity. + * + * No initiator is involved when looking at this attribute. + * The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST. + * + * Capacity values may not be modified using hwloc_memattr_set_value(). + * \hideinitializer + */ + HWLOC_MEMATTR_ID_CAPACITY = 0, + + /** \brief + * The \"Locality\" is returned as the number of PUs in that locality + * (e.g. the weight of its cpuset). + * + * Best locality nodes are nodes with smaller locality + * (nodes that are local to very few PUs). + * Poor locality nodes are nodes with larger locality + * (nodes that are local to the entire machine). + * + * No initiator is involved when looking at this attribute. + * The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST. + + * Locality values may not be modified using hwloc_memattr_set_value(). + * \hideinitializer + */ + HWLOC_MEMATTR_ID_LOCALITY = 1, + + /** \brief + * The \"Bandwidth\" is returned in MiB/s, as seen from the given initiator location. + * + * Best bandwidth nodes are nodes with higher bandwidth. + * + * The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST + * and ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR. + * + * This is the average bandwidth for read and write accesses. If the platform + * provides individual read and write bandwidths but no explicit average value, + * hwloc computes and returns the average. + * \hideinitializer + */ + HWLOC_MEMATTR_ID_BANDWIDTH = 2, + + /** \brief + * The \"ReadBandwidth\" is returned in MiB/s, as seen from the given initiator location. + * + * Best bandwidth nodes are nodes with higher bandwidth. + * + * The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST + * and ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR. + * \hideinitializer + */ + HWLOC_MEMATTR_ID_READ_BANDWIDTH = 4, + + /** \brief + * The \"WriteBandwidth\" is returned in MiB/s, as seen from the given initiator location. + * + * Best bandwidth nodes are nodes with higher bandwidth. + * + * The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST + * and ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR. + * \hideinitializer + */ + HWLOC_MEMATTR_ID_WRITE_BANDWIDTH = 5, + + /** \brief + * The \"Latency\" is returned as nanoseconds, as seen from the given initiator location. + * + * Best latency nodes are nodes with smaller latency. + * + * The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_LOWER_FIRST + * and ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR. + * + * This is the average latency for read and write accesses. If the platform + * provides individual read and write latencies but no explicit average value, + * hwloc computes and returns the average. + * \hideinitializer + */ + HWLOC_MEMATTR_ID_LATENCY = 3, + + /** \brief + * The \"ReadLatency\" is returned as nanoseconds, as seen from the given initiator location. + * + * Best latency nodes are nodes with smaller latency. + * + * The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_LOWER_FIRST + * and ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR. + * \hideinitializer + */ + HWLOC_MEMATTR_ID_READ_LATENCY = 6, + + /** \brief + * The \"WriteLatency\" is returned as nanoseconds, as seen from the given initiator location. + * + * Best latency nodes are nodes with smaller latency. + * + * The corresponding attribute flags are ::HWLOC_MEMATTR_FLAG_LOWER_FIRST + * and ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR. + * \hideinitializer + */ + HWLOC_MEMATTR_ID_WRITE_LATENCY = 7, + + /* TODO persistence? */ + + HWLOC_MEMATTR_ID_MAX /**< \private + * Sentinel value for predefined attributes. + * Dynamically registered custom attributes start here. + */ +}; + +/** \brief A memory attribute identifier. + * + * hwloc predefines some commonly-used attributes in ::hwloc_memattr_id_e. + * One may then dynamically register custom ones with hwloc_memattr_register(), + * they will be assigned IDs immediately after the predefined ones. + * See \ref hwlocality_memattrs_manage for more information about + * existing attribute IDs. + */ +typedef unsigned hwloc_memattr_id_t; + +/** \brief Return the identifier of the memory attribute with the given name. + * + * \return 0 on success. + * \return -1 with errno set to \c EINVAL if no such attribute exists. + */ +HWLOC_DECLSPEC int +hwloc_memattr_get_by_name(hwloc_topology_t topology, + const char *name, + hwloc_memattr_id_t *id); + + +/** \brief Type of location. */ +enum hwloc_location_type_e { + /** \brief Location is given as a cpuset, in the location cpuset union field. \hideinitializer */ + HWLOC_LOCATION_TYPE_CPUSET = 1, + /** \brief Location is given as an object, in the location object union field. \hideinitializer */ + HWLOC_LOCATION_TYPE_OBJECT = 0 +}; + +/** \brief Where to measure attributes from. */ +struct hwloc_location { + /** \brief Type of location. */ + enum hwloc_location_type_e type; + /** \brief Actual location. */ + union hwloc_location_u { + /** \brief Location as a cpuset, when the location type is ::HWLOC_LOCATION_TYPE_CPUSET. */ + hwloc_cpuset_t cpuset; + /** \brief Location as an object, when the location type is ::HWLOC_LOCATION_TYPE_OBJECT. */ + hwloc_obj_t object; + } location; +}; + + +/** \brief Flags for selecting target NUMA nodes. */ +enum hwloc_local_numanode_flag_e { + /** \brief Select NUMA nodes whose locality is larger than the given cpuset. + * For instance, if a single PU (or its cpuset) is given in \p initiator, + * select all nodes close to the package that contains this PU. + * \hideinitializer + */ + HWLOC_LOCAL_NUMANODE_FLAG_LARGER_LOCALITY = (1UL<<0), + + /** \brief Select NUMA nodes whose locality is smaller than the given cpuset. + * For instance, if a package (or its cpuset) is given in \p initiator, + * also select nodes that are attached to only a half of that package. + * \hideinitializer + */ + HWLOC_LOCAL_NUMANODE_FLAG_SMALLER_LOCALITY = (1UL<<1), + + /** \brief Select NUMA nodes whose locality intersects the given cpuset. + * This includes larger and smaller localities as well as localities + * that are partially included. + * For instance, if the locality is one core of both packages, a NUMA node + * local to one package is neither larger nor smaller than this locality, + * but it intersects it. + * \hideinitializer + */ + HWLOC_LOCAL_NUMANODE_FLAG_INTERSECT_LOCALITY = (1UL<<3), + + /** \brief Select all NUMA nodes in the topology. + * The initiator \p initiator is ignored. + * \hideinitializer + */ + HWLOC_LOCAL_NUMANODE_FLAG_ALL = (1UL<<2) +}; + +/** \brief Return an array of local NUMA nodes. + * + * By default only select the NUMA nodes whose locality is exactly + * the given \p location. More nodes may be selected if additional flags + * are given as a OR'ed set of ::hwloc_local_numanode_flag_e. + * + * If \p location is given as an explicit object, its CPU set is used + * to find NUMA nodes with the corresponding locality. + * If the object does not have a CPU set (e.g. I/O object), the CPU + * parent (where the I/O object is attached) is used. + * + * On input, \p nr points to the number of nodes that may be stored + * in the \p nodes array. + * On output, \p nr will be changed to the number of stored nodes, + * or the number of nodes that would have been stored if there were + * enough room. + * + * \return 0 on success or -1 on error. + * + * \note Some of these NUMA nodes may not have any memory attribute + * values and hence not be reported as actual targets in other functions. + * + * \note The number of NUMA nodes in the topology (obtained by + * hwloc_bitmap_weight() on the root object nodeset) may be used + * to allocate the \p nodes array. + * + * \note When an object CPU set is given as locality, for instance a Package, + * and when flags contain both ::HWLOC_LOCAL_NUMANODE_FLAG_LARGER_LOCALITY + * and ::HWLOC_LOCAL_NUMANODE_FLAG_SMALLER_LOCALITY, + * the returned array corresponds to the nodeset of that object. + */ +HWLOC_DECLSPEC int +hwloc_get_local_numanode_objs(hwloc_topology_t topology, + struct hwloc_location *location, + unsigned *nr, + hwloc_obj_t *nodes, + unsigned long flags); + +/** \brief Return the set of default NUMA nodes + * + * In machines with heterogeneous memory, some NUMA nodes are considered + * the default ones, i.e. where basic allocations should be made from. + * These are usually DRAM nodes. + * + * Other nodes may be reserved for specific use (I/O device memory, e.g. GPU memory), + * small but high performance (HBM), large but slow memory (NVM), etc. + * Buffers should usually not be allocated from there unless explicitly required. + * + * This function fills \p nodeset with the bits of NUMA nodes considered default. + * + * It is guaranteed that these nodes have non-intersecting CPU sets, + * i.e. cores may not have multiple local NUMA nodes anymore. + * Hence this may be used to iterate over the platform divided into separate + * NUMA localities, for instance for binding one task per NUMA domain. + * + * Any core that had some local NUMA node(s) in the initial topology should + * still have one in the default nodeset. Corner cases where this would be + * wrong consist in asymmetric platforms with missing DRAM nodes, or topologies + * that were already restricted to less NUMA nodes. + * + * The returned nodeset may be passed to hwloc_topology_restrict() with + * ::HWLOC_RESTRICT_FLAG_BYNODESET to remove all non-default nodes from + * the topology. The resulting topology will be easier to use when iterating + * over (now homogeneous) NUMA nodes. + * + * The heuristics for finding default nodes relies on memory tiers and subtypes + * (see \ref heteromem) as well as the assumption that hardware vendors list + * default nodes first in hardware tables. + * + * \p flags must be \c 0 for now. + * + * \return 0 on success. + * \return -1 on error. + * + * \note The returned nodeset usually contains all nodes from a single memory + * tier, likely the DRAM one. + * + * \note The returned nodeset is included in the list of available nodes + * returned by hwloc_topology_get_topology_nodeset(). It is strictly smaller + * if the machine has heterogeneous memory. + * + * \note The heuristics may return a suboptimal set of nodes if hwloc could + * not guess memory types and/or if some default nodes were removed earlier + * from the topology (e.g. with hwloc_topology_restrict()). + */ +HWLOC_DECLSPEC int +hwloc_topology_get_default_nodeset(hwloc_topology_t topology, + hwloc_nodeset_t nodeset, + unsigned long flags); + +/** \brief Return an attribute value for a specific target NUMA node. + * + * If the attribute does not relate to a specific initiator + * (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR), + * location \p initiator is ignored and may be \c NULL. + * + * \p target_node cannot be \c NULL. If \p attribute is ::HWLOC_MEMATTR_ID_CAPACITY, + * \p target_node must be a NUMA node. If it is ::HWLOC_MEMATTR_ID_LOCALITY, + * \p target_node must have a CPU set. + * + * \p flags must be \c 0 for now. + * + * \return 0 on success. + * \return -1 on error, for instance with errno set to \c EINVAL if flags + * are invalid or no such attribute exists. + * + * \note The initiator \p initiator should be of type ::HWLOC_LOCATION_TYPE_CPUSET + * when refering to accesses performed by CPU cores. + * ::HWLOC_LOCATION_TYPE_OBJECT is currently unused internally by hwloc, + * but users may for instance use it to provide custom information about + * host memory accesses performed by GPUs. + */ +HWLOC_DECLSPEC int +hwloc_memattr_get_value(hwloc_topology_t topology, + hwloc_memattr_id_t attribute, + hwloc_obj_t target_node, + struct hwloc_location *initiator, + unsigned long flags, + hwloc_uint64_t *value); + +/** \brief Return the best target NUMA node for the given attribute and initiator. + * + * If the attribute does not relate to a specific initiator + * (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR), + * location \p initiator is ignored and may be \c NULL. + * + * If \p value is non \c NULL, the corresponding value is returned there. + * + * If multiple targets have the same attribute values, only one is + * returned (and there is no way to clarify how that one is chosen). + * Applications that want to detect targets with identical/similar + * values, or that want to look at values for multiple attributes, + * should rather get all values using hwloc_memattr_get_value() + * and manually select the target they consider the best. + * + * \p flags must be \c 0 for now. + * + * \return 0 on success. + * \return -1 with errno set to \c ENOENT if there are no matching targets. + * \return -1 with errno set to \c EINVAL if flags are invalid, + * or no such attribute exists. + * + * \note The initiator \p initiator should be of type ::HWLOC_LOCATION_TYPE_CPUSET + * when refering to accesses performed by CPU cores. + * ::HWLOC_LOCATION_TYPE_OBJECT is currently unused internally by hwloc, + * but users may for instance use it to provide custom information about + * host memory accesses performed by GPUs. + */ +HWLOC_DECLSPEC int +hwloc_memattr_get_best_target(hwloc_topology_t topology, + hwloc_memattr_id_t attribute, + struct hwloc_location *initiator, + unsigned long flags, + hwloc_obj_t *best_target, hwloc_uint64_t *value); + +/** \brief Return the best initiator for the given attribute and target NUMA node. + * + * If \p value is non \c NULL, the corresponding value is returned there. + * + * If multiple initiators have the same attribute values, only one is + * returned (and there is no way to clarify how that one is chosen). + * Applications that want to detect initiators with identical/similar + * values, or that want to look at values for multiple attributes, + * should rather get all values using hwloc_memattr_get_value() + * and manually select the initiator they consider the best. + * + * The returned initiator should not be modified or freed, + * it belongs to the topology. + * + * \p target_node cannot be \c NULL. + * + * \p flags must be \c 0 for now. + * + * \return 0 on success. + * \return -1 with errno set to \c ENOENT if there are no matching initiators. + * \return -1 with errno set to \c EINVAL if the attribute does not relate to a specific initiator + * (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR). + */ +HWLOC_DECLSPEC int +hwloc_memattr_get_best_initiator(hwloc_topology_t topology, + hwloc_memattr_id_t attribute, + hwloc_obj_t target_node, + unsigned long flags, + struct hwloc_location *best_initiator, hwloc_uint64_t *value); + +/** \brief Return the target NUMA nodes that have some values for a given attribute. + * + * Return targets for the given attribute in the \p targets array + * (for the given initiator if any). + * If \p values is not \c NULL, the corresponding attribute values + * are stored in the array it points to. + * + * On input, \p nr points to the number of targets that may be stored + * in the array \p targets (and \p values). + * On output, \p nr points to the number of targets (and values) that + * were actually found, even if some of them couldn't be stored in the array. + * Targets that couldn't be stored are ignored, but the function still + * returns success (\c 0). The caller may find out by comparing the value pointed + * by \p nr before and after the function call. + * + * The returned targets should not be modified or freed, + * they belong to the topology. + * + * Argument \p initiator is ignored if the attribute does not relate to a specific + * initiator (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR). + * Otherwise \p initiator may be non \c NULL to report only targets + * that have a value for that initiator. + * + * \p flags must be \c 0 for now. + * + * \note This function is meant for tools and debugging (listing internal information) + * rather than for application queries. Applications should rather select useful + * NUMA nodes with hwloc_get_local_numanode_objs() and then look at their attribute + * values. + * + * \return 0 on success or -1 on error. + * + * \note The initiator \p initiator should be of type ::HWLOC_LOCATION_TYPE_CPUSET + * when referring to accesses performed by CPU cores. + * ::HWLOC_LOCATION_TYPE_OBJECT is currently unused internally by hwloc, + * but users may for instance use it to provide custom information about + * host memory accesses performed by GPUs. + */ +HWLOC_DECLSPEC int +hwloc_memattr_get_targets(hwloc_topology_t topology, + hwloc_memattr_id_t attribute, + struct hwloc_location *initiator, + unsigned long flags, + unsigned *nr, hwloc_obj_t *targets, hwloc_uint64_t *values); + +/** \brief Return the initiators that have values for a given attribute for a specific target NUMA node. + * + * Return initiators for the given attribute and target node in the + * \p initiators array. + * If \p values is not \c NULL, the corresponding attribute values + * are stored in the array it points to. + * + * On input, \p nr points to the number of initiators that may be stored + * in the array \p initiators (and \p values). + * On output, \p nr points to the number of initiators (and values) that + * were actually found, even if some of them couldn't be stored in the array. + * Initiators that couldn't be stored are ignored, but the function still + * returns success (\c 0). The caller may find out by comparing the value pointed + * by \p nr before and after the function call. + * + * The returned initiators should not be modified or freed, + * they belong to the topology. + * + * \p target_node cannot be \c NULL. + * + * \p flags must be \c 0 for now. + * + * If the attribute does not relate to a specific initiator + * (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR), + * no initiator is returned. + * + * \return 0 on success or -1 on error. + * + * \note This function is meant for tools and debugging (listing internal information) + * rather than for application queries. Applications should rather select useful + * NUMA nodes with hwloc_get_local_numanode_objs() and then look at their attribute + * values for some relevant initiators. + */ +HWLOC_DECLSPEC int +hwloc_memattr_get_initiators(hwloc_topology_t topology, + hwloc_memattr_id_t attribute, + hwloc_obj_t target_node, + unsigned long flags, + unsigned *nr, struct hwloc_location *initiators, hwloc_uint64_t *values); + +/** @} */ + + +/** \defgroup hwlocality_memattrs_manage Managing memory attributes + * + * Memory attribues are identified by an ID (::hwloc_memattr_id_t) + * and a name. hwloc_memattr_get_name() and hwloc_memattr_get_by_name() + * convert between them (or return error if the attribute does not exist). + * + * The set of valid ::hwloc_memattr_id_t is a contigous set starting at \c 0. + * It first contains predefined attributes, as listed + * in ::hwloc_memattr_id_e (from \c 0 to \c HWLOC_MEMATTR_ID_MAX-1). + * Then custom attributes may be dynamically registered with + * hwloc_memattr_register(). They will get the following IDs + * (\c HWLOC_MEMATTR_ID_MAX for the first one, etc.). + * + * To iterate over all valid attributes + * (either predefined or dynamically registered custom ones), + * one may iterate over IDs starting from \c 0 until hwloc_memattr_get_name() + * or hwloc_memattr_get_flags() returns an error. + * + * The values for an existing attribute or for custom dynamically registered ones + * may be set or modified with hwloc_memattr_set_value(). + * + * @{ + */ + +/** \brief Return the name of a memory attribute. + * + * The output pointer \p name cannot be \c NULL. + * + * \return 0 on success. + * \return -1 with errno set to \c EINVAL if the attribute does not exist. + */ +HWLOC_DECLSPEC int +hwloc_memattr_get_name(hwloc_topology_t topology, + hwloc_memattr_id_t attribute, + const char **name); + +/** \brief Return the flags of the given attribute. + * + * Flags are a OR'ed set of ::hwloc_memattr_flag_e. + * + * The output pointer \p flags cannot be \c NULL. + * + * \return 0 on success. + * \return -1 with errno set to \c EINVAL if the attribute does not exist. + */ +HWLOC_DECLSPEC int +hwloc_memattr_get_flags(hwloc_topology_t topology, + hwloc_memattr_id_t attribute, + unsigned long *flags); + +/** \brief Memory attribute flags. + * Given to hwloc_memattr_register() and returned by hwloc_memattr_get_flags(). + */ +enum hwloc_memattr_flag_e { + /** \brief The best nodes for this memory attribute are those with the higher values. + * For instance Bandwidth. + */ + HWLOC_MEMATTR_FLAG_HIGHER_FIRST = (1UL<<0), + /** \brief The best nodes for this memory attribute are those with the lower values. + * For instance Latency. + */ + HWLOC_MEMATTR_FLAG_LOWER_FIRST = (1UL<<1), + /** \brief The value returned for this memory attribute depends on the given initiator. + * For instance Bandwidth and Latency, but not Capacity. + */ + HWLOC_MEMATTR_FLAG_NEED_INITIATOR = (1UL<<2) +}; + +/** \brief Register a new memory attribute. + * + * Add a new custom memory attribute. + * Flags are a OR'ed set of ::hwloc_memattr_flag_e. It must contain one of + * ::HWLOC_MEMATTR_FLAG_HIGHER_FIRST or ::HWLOC_MEMATTR_FLAG_LOWER_FIRST but not both. + * + * The new attribute \p id is immediately after the last existing attribute ID + * (which is either the ID of the last registered attribute if any, + * or the ID of the last predefined attribute in ::hwloc_memattr_id_e). + * + * \return 0 on success. + * \return -1 with errno set to \c EINVAL if an invalid set of flags is given. + * \return -1 with errno set to \c EBUSY if another attribute already uses this name. + */ +HWLOC_DECLSPEC int +hwloc_memattr_register(hwloc_topology_t topology, + const char *name, + unsigned long flags, + hwloc_memattr_id_t *id); + +/** \brief Set an attribute value for a specific target NUMA node. + * + * If the attribute does not relate to a specific initiator + * (it does not have the flag ::HWLOC_MEMATTR_FLAG_NEED_INITIATOR), + * location \p initiator is ignored and may be \c NULL. + * + * The initiator will be copied into the topology, + * the caller should free anything allocated to store the initiator, + * for instance the cpuset. + * + * \p target_node cannot be \c NULL. + * + * \p attribute cannot be ::HWLOC_MEMATTR_ID_CAPACITY or + * ::HWLOC_MEMATTR_ID_LOCALITY. + * + * \p flags must be \c 0 for now. + * + * \note The initiator \p initiator should be of type ::HWLOC_LOCATION_TYPE_CPUSET + * when referring to accesses performed by CPU cores. + * ::HWLOC_LOCATION_TYPE_OBJECT is currently unused internally by hwloc, + * but users may for instance use it to provide custom information about + * host memory accesses performed by GPUs. + * + * \return 0 on success or -1 on error. + */ +HWLOC_DECLSPEC int +hwloc_memattr_set_value(hwloc_topology_t topology, + hwloc_memattr_id_t attribute, + hwloc_obj_t target_node, + struct hwloc_location *initiator, + unsigned long flags, + hwloc_uint64_t value); + +/** @} */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_MEMATTR_H */ diff --git a/src/deps/hwloc/include/hwloc/nvml.h b/src/deps/hwloc/include/hwloc/nvml.h new file mode 100644 index 000000000..c1badd13a --- /dev/null +++ b/src/deps/hwloc/include/hwloc/nvml.h @@ -0,0 +1,185 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2012-2023 Inria. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and the NVIDIA Management Library. + * + * Applications that use both hwloc and the NVIDIA Management Library may want to + * include this file so as to get topology information for NVML devices. + */ + +#ifndef HWLOC_NVML_H +#define HWLOC_NVML_H + +#include "hwloc.h" +#include "hwloc/autogen/config.h" +#include "hwloc/helper.h" +#ifdef HWLOC_LINUX_SYS +#include "hwloc/linux.h" +#endif + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_nvml Interoperability with the NVIDIA Management Library + * + * This interface offers ways to retrieve topology information about + * devices managed by the NVIDIA Management Library (NVML). + * + * @{ + */ + +/** \brief Get the CPU set of processors that are physically + * close to NVML device \p device. + * + * Store in \p set the CPU-set describing the locality of the NVML device \p device. + * + * Topology \p topology and device \p device must match the local machine. + * I/O devices detection and the NVML component are not needed in the topology. + * + * The function only returns the locality of the device. + * If more information about the device is needed, OS objects should + * be used instead, see hwloc_nvml_get_device_osdev() + * and hwloc_nvml_get_device_osdev_by_index(). + * + * This function is currently only implemented in a meaningful way for + * Linux; other systems will simply get a full cpuset. + * + * \return 0 on success. + * \return -1 on error, for instance if device information could not be found. + */ +static __hwloc_inline int +hwloc_nvml_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused, + nvmlDevice_t device, hwloc_cpuset_t set) +{ +#ifdef HWLOC_LINUX_SYS + /* If we're on Linux, use the sysfs mechanism to get the local cpus */ +#define HWLOC_NVML_DEVICE_SYSFS_PATH_MAX 128 + char path[HWLOC_NVML_DEVICE_SYSFS_PATH_MAX]; + nvmlReturn_t nvres; + nvmlPciInfo_t pci; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return -1; + } + + nvres = nvmlDeviceGetPciInfo(device, &pci); + if (NVML_SUCCESS != nvres) { + errno = EINVAL; + return -1; + } + + sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", pci.domain, pci.bus, pci.device); + if (hwloc_linux_read_path_as_cpumask(path, set) < 0 + || hwloc_bitmap_iszero(set)) + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#else + /* Non-Linux systems simply get a full cpuset */ + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#endif + return 0; +} + +/** \brief Get the hwloc OS device object corresponding to the + * NVML device whose index is \p idx. + * + * \return The hwloc OS device object describing the NVML device whose index is \p idx. + * \return \c NULL if none could be found. + * + * The topology \p topology does not necessarily have to match the current + * machine. For instance the topology may be an XML import of a remote host. + * I/O devices detection and the NVML component must be enabled in the topology. + * + * \note The corresponding PCI device object can be obtained by looking + * at the OS device parent object (unless PCI devices are filtered out). + */ +static __hwloc_inline hwloc_obj_t +hwloc_nvml_get_device_osdev_by_index(hwloc_topology_t topology, unsigned idx) +{ + hwloc_obj_t osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type + && osdev->name + && !strncmp("nvml", osdev->name, 4) + && atoi(osdev->name + 4) == (int) idx) + return osdev; + } + return NULL; +} + +/** \brief Get the hwloc OS device object corresponding to NVML device \p device. + * + * \return The hwloc OS device object that describes the given NVML device \p device. + * \return \c NULL if none could be found. + * + * Topology \p topology and device \p device must match the local machine. + * I/O devices detection and the NVML component must be enabled in the topology. + * If not, the locality of the object may still be found using + * hwloc_nvml_get_device_cpuset(). + * + * \note The corresponding hwloc PCI device may be found by looking + * at the result parent pointer (unless PCI devices are filtered out). + */ +static __hwloc_inline hwloc_obj_t +hwloc_nvml_get_device_osdev(hwloc_topology_t topology, nvmlDevice_t device) +{ + hwloc_obj_t osdev; + nvmlReturn_t nvres; + nvmlPciInfo_t pci; + char uuid[64]; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return NULL; + } + + nvres = nvmlDeviceGetPciInfo(device, &pci); + if (NVML_SUCCESS != nvres) + return NULL; + + nvres = nvmlDeviceGetUUID(device, uuid, sizeof(uuid)); + if (NVML_SUCCESS != nvres) + uuid[0] = '\0'; + + osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + hwloc_obj_t pcidev = osdev->parent; + const char *info; + + if (strncmp(osdev->name, "nvml", 4)) + continue; + + if (pcidev + && pcidev->type == HWLOC_OBJ_PCI_DEVICE + && pcidev->attr->pcidev.domain == pci.domain + && pcidev->attr->pcidev.bus == pci.bus + && pcidev->attr->pcidev.dev == pci.device + && pcidev->attr->pcidev.func == 0) + return osdev; + + info = hwloc_obj_get_info_by_name(osdev, "NVIDIAUUID"); + if (info && !strcmp(info, uuid)) + return osdev; + } + + return NULL; +} + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_NVML_H */ diff --git a/src/deps/hwloc/include/hwloc/opencl.h b/src/deps/hwloc/include/hwloc/opencl.h new file mode 100644 index 000000000..c4da40318 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/opencl.h @@ -0,0 +1,278 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2012-2023 Inria. All rights reserved. + * Copyright © 2013, 2018 Université Bordeaux. All right reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and the OpenCL interface. + * + * Applications that use both hwloc and OpenCL may want to + * include this file so as to get topology information for OpenCL devices. + */ + +#ifndef HWLOC_OPENCL_H +#define HWLOC_OPENCL_H + +#include "hwloc.h" +#include "hwloc/autogen/config.h" +#include "hwloc/helper.h" +#ifdef HWLOC_LINUX_SYS +#include "hwloc/linux.h" +#endif + +#ifdef __APPLE__ +#include +#else +#include +#endif + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* OpenCL extensions aren't always shipped with default headers, and + * they don't always reflect what the installed implementations support. + * Try everything and let the implementation return errors when non supported. + */ +/* Copyright (c) 2008-2018 The Khronos Group Inc. */ + +/* needs "cl_khr_pci_bus_info" device extension, but not strictly required for clGetDeviceInfo() */ +typedef struct { + cl_uint pci_domain; + cl_uint pci_bus; + cl_uint pci_device; + cl_uint pci_function; +} hwloc_cl_device_pci_bus_info_khr; +#define HWLOC_CL_DEVICE_PCI_BUS_INFO_KHR 0x410F + +/* needs "cl_amd_device_attribute_query" device extension, but not strictly required for clGetDeviceInfo() */ +#define HWLOC_CL_DEVICE_TOPOLOGY_AMD 0x4037 +typedef union { + struct { cl_uint type; cl_uint data[5]; } raw; + struct { cl_uint type; cl_char unused[17]; cl_char bus; cl_char device; cl_char function; } pcie; +} hwloc_cl_device_topology_amd; +#define HWLOC_CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD 1 + +/* needs "cl_nv_device_attribute_query" device extension, but not strictly required for clGetDeviceInfo() */ +#define HWLOC_CL_DEVICE_PCI_BUS_ID_NV 0x4008 +#define HWLOC_CL_DEVICE_PCI_SLOT_ID_NV 0x4009 +#define HWLOC_CL_DEVICE_PCI_DOMAIN_ID_NV 0x400A + + +/** \defgroup hwlocality_opencl Interoperability with OpenCL + * + * This interface offers ways to retrieve topology information about + * OpenCL devices. + * + * Only AMD and NVIDIA OpenCL implementations currently offer useful locality + * information about their devices. + * + * @{ + */ + +/** \brief Return the domain, bus and device IDs of the OpenCL device \p device. + * + * Device \p device must match the local machine. + * + * \return 0 on success. + * \return -1 on error, for instance if device information could not be found. + */ +static __hwloc_inline int +hwloc_opencl_get_device_pci_busid(cl_device_id device, + unsigned *domain, unsigned *bus, unsigned *dev, unsigned *func) +{ + hwloc_cl_device_topology_amd amdtopo; + hwloc_cl_device_pci_bus_info_khr khrbusinfo; + cl_uint nvbus, nvslot, nvdomain; + cl_int clret; + + clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_BUS_INFO_KHR, sizeof(khrbusinfo), &khrbusinfo, NULL); + if (CL_SUCCESS == clret) { + *domain = (unsigned) khrbusinfo.pci_domain; + *bus = (unsigned) khrbusinfo.pci_bus; + *dev = (unsigned) khrbusinfo.pci_device; + *func = (unsigned) khrbusinfo.pci_function; + return 0; + } + + clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_TOPOLOGY_AMD, sizeof(amdtopo), &amdtopo, NULL); + if (CL_SUCCESS == clret + && HWLOC_CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD == amdtopo.raw.type) { + *domain = 0; /* can't do anything better */ + /* cl_device_topology_amd stores bus ID in cl_char, dont convert those signed char directly to unsigned int */ + *bus = (unsigned) (unsigned char) amdtopo.pcie.bus; + *dev = (unsigned) (unsigned char) amdtopo.pcie.device; + *func = (unsigned) (unsigned char) amdtopo.pcie.function; + return 0; + } + + clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_BUS_ID_NV, sizeof(nvbus), &nvbus, NULL); + if (CL_SUCCESS == clret) { + clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_SLOT_ID_NV, sizeof(nvslot), &nvslot, NULL); + if (CL_SUCCESS == clret) { + clret = clGetDeviceInfo(device, HWLOC_CL_DEVICE_PCI_DOMAIN_ID_NV, sizeof(nvdomain), &nvdomain, NULL); + if (CL_SUCCESS == clret) { /* available since CUDA 10.2 */ + *domain = nvdomain; + } else { + *domain = 0; + } + *bus = nvbus & 0xff; + /* non-documented but used in many other projects */ + *dev = nvslot >> 3; + *func = nvslot & 0x7; + return 0; + } + } + + return -1; +} + +/** \brief Get the CPU set of processors that are physically + * close to OpenCL device \p device. + * + * Store in \p set the CPU-set describing the locality of the OpenCL device \p device. + * + * Topology \p topology and device \p device must match the local machine. + * I/O devices detection and the OpenCL component are not needed in the topology. + * + * The function only returns the locality of the device. + * If more information about the device is needed, OS objects should + * be used instead, see hwloc_opencl_get_device_osdev() + * and hwloc_opencl_get_device_osdev_by_index(). + * + * This function is currently only implemented in a meaningful way for + * Linux with the AMD or NVIDIA OpenCL implementation; other systems will simply + * get a full cpuset. + * + * \return 0 on success. + * \return -1 on error, for instance if the device could not be found. + */ +static __hwloc_inline int +hwloc_opencl_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused, + cl_device_id device __hwloc_attribute_unused, + hwloc_cpuset_t set) +{ +#if (defined HWLOC_LINUX_SYS) + /* If we're on Linux, try AMD/NVIDIA extensions + the sysfs mechanism to get the local cpus */ +#define HWLOC_OPENCL_DEVICE_SYSFS_PATH_MAX 128 + char path[HWLOC_OPENCL_DEVICE_SYSFS_PATH_MAX]; + unsigned pcidomain, pcibus, pcidev, pcifunc; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return -1; + } + + if (hwloc_opencl_get_device_pci_busid(device, &pcidomain, &pcibus, &pcidev, &pcifunc) < 0) { + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); + return 0; + } + + sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.%01x/local_cpus", pcidomain, pcibus, pcidev, pcifunc); + if (hwloc_linux_read_path_as_cpumask(path, set) < 0 + || hwloc_bitmap_iszero(set)) + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#else + /* Non-Linux systems simply get a full cpuset */ + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#endif + return 0; +} + +/** \brief Get the hwloc OS device object corresponding to the + * OpenCL device for the given indexes. + * + * \return The hwloc OS device object describing the OpenCL device + * whose platform index is \p platform_index, + * and whose device index within this platform if \p device_index. + * \return \c NULL if there is none. + * + * The topology \p topology does not necessarily have to match the current + * machine. For instance the topology may be an XML import of a remote host. + * I/O devices detection and the OpenCL component must be enabled in the topology. + * + * \note The corresponding PCI device object can be obtained by looking + * at the OS device parent object (unless PCI devices are filtered out). + */ +static __hwloc_inline hwloc_obj_t +hwloc_opencl_get_device_osdev_by_index(hwloc_topology_t topology, + unsigned platform_index, unsigned device_index) +{ + unsigned x = (unsigned) -1, y = (unsigned) -1; + hwloc_obj_t osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + if (HWLOC_OBJ_OSDEV_COPROC == osdev->attr->osdev.type + && osdev->name + && sscanf(osdev->name, "opencl%ud%u", &x, &y) == 2 + && platform_index == x && device_index == y) + return osdev; + } + return NULL; +} + +/** \brief Get the hwloc OS device object corresponding to OpenCL device \p deviceX. + * + * \return The hwloc OS device object corresponding to the given OpenCL device \p device. + * \return \c NULL if none could be found, for instance + * if required OpenCL attributes are not available. + * + * This function currently only works on AMD and NVIDIA OpenCL devices that support + * relevant OpenCL extensions. hwloc_opencl_get_device_osdev_by_index() + * should be preferred whenever possible, i.e. when platform and device index + * are known. + * + * Topology \p topology and device \p device must match the local machine. + * I/O devices detection and the OpenCL component must be enabled in the topology. + * If not, the locality of the object may still be found using + * hwloc_opencl_get_device_cpuset(). + * + * \note This function cannot work if PCI devices are filtered out. + * + * \note The corresponding hwloc PCI device may be found by looking + * at the result parent pointer (unless PCI devices are filtered out). + */ +static __hwloc_inline hwloc_obj_t +hwloc_opencl_get_device_osdev(hwloc_topology_t topology __hwloc_attribute_unused, + cl_device_id device __hwloc_attribute_unused) +{ + hwloc_obj_t osdev; + unsigned pcidomain, pcibus, pcidevice, pcifunc; + + if (hwloc_opencl_get_device_pci_busid(device, &pcidomain, &pcibus, &pcidevice, &pcifunc) < 0) { + errno = EINVAL; + return NULL; + } + + osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + hwloc_obj_t pcidev = osdev->parent; + if (strncmp(osdev->name, "opencl", 6)) + continue; + if (pcidev + && pcidev->type == HWLOC_OBJ_PCI_DEVICE + && pcidev->attr->pcidev.domain == pcidomain + && pcidev->attr->pcidev.bus == pcibus + && pcidev->attr->pcidev.dev == pcidevice + && pcidev->attr->pcidev.func == pcifunc) + return osdev; + /* if PCI are filtered out, we need a info attr to match on */ + } + + return NULL; +} + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_OPENCL_H */ diff --git a/src/deps/hwloc/include/hwloc/openfabrics-verbs.h b/src/deps/hwloc/include/hwloc/openfabrics-verbs.h new file mode 100644 index 000000000..9ba4888d0 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/openfabrics-verbs.h @@ -0,0 +1,156 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2023 Inria. All rights reserved. + * Copyright © 2009-2010 Université Bordeaux + * Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and OpenFabrics + * verbs. + * + * Applications that use both hwloc and OpenFabrics verbs may want to + * include this file so as to get topology information for OpenFabrics + * hardware (InfiniBand, etc). + * + */ + +#ifndef HWLOC_OPENFABRICS_VERBS_H +#define HWLOC_OPENFABRICS_VERBS_H + +#include "hwloc.h" +#include "hwloc/autogen/config.h" +#ifdef HWLOC_LINUX_SYS +#include "hwloc/linux.h" +#endif + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_openfabrics Interoperability with OpenFabrics + * + * This interface offers ways to retrieve topology information about + * OpenFabrics devices (InfiniBand, Omni-Path, usNIC, etc). + * + * @{ + */ + +/** \brief Get the CPU set of processors that are physically + * close to device \p ibdev. + * + * Store in \p set the CPU-set describing the locality of the OpenFabrics + * device \p ibdev (InfiniBand, etc). + * + * Topology \p topology and device \p ibdev must match the local machine. + * I/O devices detection is not needed in the topology. + * + * The function only returns the locality of the device. + * If more information about the device is needed, OS objects should + * be used instead, see hwloc_ibv_get_device_osdev() + * and hwloc_ibv_get_device_osdev_by_name(). + * + * This function is currently only implemented in a meaningful way for + * Linux; other systems will simply get a full cpuset. + * + * \return 0 on success. + * \return -1 on error, for instance if device information could not be found. + */ +static __hwloc_inline int +hwloc_ibv_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused, + struct ibv_device *ibdev, hwloc_cpuset_t set) +{ +#ifdef HWLOC_LINUX_SYS + /* If we're on Linux, use the verbs-provided sysfs mechanism to + get the local cpus */ +#define HWLOC_OPENFABRICS_VERBS_SYSFS_PATH_MAX 128 + char path[HWLOC_OPENFABRICS_VERBS_SYSFS_PATH_MAX]; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return -1; + } + + sprintf(path, "/sys/class/infiniband/%s/device/local_cpus", + ibv_get_device_name(ibdev)); + if (hwloc_linux_read_path_as_cpumask(path, set) < 0 + || hwloc_bitmap_iszero(set)) + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#else + /* Non-Linux systems simply get a full cpuset */ + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#endif + return 0; +} + +/** \brief Get the hwloc OS device object corresponding to the OpenFabrics + * device named \p ibname. + * + * \return The hwloc OS device object describing the OpenFabrics device + * (InfiniBand, Omni-Path, usNIC, etc) whose name is \p ibname + * (mlx5_0, hfi1_0, usnic_0, qib0, etc). + * \return \c NULL if none could be found. + * + * The name \p ibname is usually obtained from ibv_get_device_name(). + * + * The topology \p topology does not necessarily have to match the current + * machine. For instance the topology may be an XML import of a remote host. + * I/O devices detection must be enabled in the topology. + * + * \note The corresponding PCI device object can be obtained by looking + * at the OS device parent object. + */ +static __hwloc_inline hwloc_obj_t +hwloc_ibv_get_device_osdev_by_name(hwloc_topology_t topology, + const char *ibname) +{ + hwloc_obj_t osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + if (HWLOC_OBJ_OSDEV_OPENFABRICS == osdev->attr->osdev.type + && osdev->name && !strcmp(ibname, osdev->name)) + return osdev; + } + return NULL; +} + +/** \brief Get the hwloc OS device object corresponding to the OpenFabrics + * device \p ibdev. + * + * \return The hwloc OS device object describing the OpenFabrics + * device \p ibdev (InfiniBand, etc). + * \return \c NULL if none could be found. + * + * Topology \p topology and device \p ibdev must match the local machine. + * I/O devices detection must be enabled in the topology. + * If not, the locality of the object may still be found using + * hwloc_ibv_get_device_cpuset(). + * + * \note The corresponding PCI device object can be obtained by looking + * at the OS device parent object. + */ +static __hwloc_inline hwloc_obj_t +hwloc_ibv_get_device_osdev(hwloc_topology_t topology, + struct ibv_device *ibdev) +{ + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return NULL; + } + return hwloc_ibv_get_device_osdev_by_name(topology, ibv_get_device_name(ibdev)); +} + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_OPENFABRICS_VERBS_H */ diff --git a/src/deps/hwloc/include/hwloc/plugins.h b/src/deps/hwloc/include/hwloc/plugins.h new file mode 100644 index 000000000..ad6f28911 --- /dev/null +++ b/src/deps/hwloc/include/hwloc/plugins.h @@ -0,0 +1,704 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2013-2024 Inria. All rights reserved. + * Copyright © 2016 Cisco Systems, Inc. All rights reserved. + * Copyright © 2025 Siemens Corporation and/or its affiliates. All rights reserved. + * See COPYING in top-level directory. + */ + +#ifndef HWLOC_PLUGINS_H +#define HWLOC_PLUGINS_H + +/** \file + * \brief Public interface for building hwloc plugins. + */ + +struct hwloc_backend; + +#include "hwloc.h" + +#ifdef HWLOC_INSIDE_PLUGIN +/* needed for hwloc_plugin_check_namespace() */ +#ifdef HWLOC_HAVE_LTDL +#include +#elif !defined(HWLOC_WIN_SYS) +#include +#endif +#endif + + + +/** \defgroup hwlocality_disc_components Components and Plugins: Discovery components and backends + * + * \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified. + * + * @{ + */ + +/** \brief Discovery component structure + * + * This is the major kind of components, taking care of the discovery. + * They are registered by generic components, either statically-built or as plugins. + */ +struct hwloc_disc_component { + /** \brief Name. + * If this component is built as a plugin, this name does not have to match the plugin filename. + */ + const char *name; + + /** \brief Discovery phases performed by this component. + * OR'ed set of ::hwloc_disc_phase_t + */ + unsigned phases; + + /** \brief Component phases to exclude, as an OR'ed set of ::hwloc_disc_phase_t. + * + * For a GLOBAL component, this usually includes all other phases (\c ~UL). + * + * Other components only exclude types that may bring conflicting + * topology information. MISC components should likely not be excluded + * since they usually bring non-primary additional information. + */ + unsigned excluded_phases; + + /** \brief Instantiate callback to create a backend from the component. + * Parameters data1, data2, data3 are NULL except for components + * that have special enabling routines such as hwloc_topology_set_xml(). */ + struct hwloc_backend * (*instantiate)(struct hwloc_topology *topology, struct hwloc_disc_component *component, unsigned excluded_phases, const void *data1, const void *data2, const void *data3); + + /** \brief Component priority. + * Used to sort topology->components, higher priority first. + * Also used to decide between two components with the same name. + * + * Usual values are + * 50 for native OS (or platform) components, + * 45 for x86, + * 40 for no-OS fallback, + * 30 for global components (xml, synthetic), + * 20 for pci, + * 10 for other misc components (opencl etc.). + */ + unsigned priority; + + /** \brief Enabled by default. + * If unset, if will be disabled unless explicitly requested. + */ + unsigned enabled_by_default; + + /** \private Used internally to list components by priority on topology->components + * (the component structure is usually read-only, + * the core copies it before using this field for queueing) + */ + struct hwloc_disc_component * next; +}; + +/** \brief Discovery phase */ +typedef enum hwloc_disc_phase_e { + /** \brief xml or synthetic, platform-specific components such as bgq. + * Discovers everything including CPU, memory, I/O and everything else. + * A component with a Global phase usually excludes all other phases. + * \hideinitializer */ + HWLOC_DISC_PHASE_GLOBAL = (1U<<0), + + /** \brief CPU discovery. + * \hideinitializer */ + HWLOC_DISC_PHASE_CPU = (1U<<1), + + /** \brief Attach memory to existing CPU objects. + * \hideinitializer */ + HWLOC_DISC_PHASE_MEMORY = (1U<<2), + + /** \brief Attach PCI devices and bridges to existing CPU objects. + * \hideinitializer */ + HWLOC_DISC_PHASE_PCI = (1U<<3), + + /** \brief I/O discovery that requires PCI devices (OS devices such as OpenCL, CUDA, etc.). + * \hideinitializer */ + HWLOC_DISC_PHASE_IO = (1U<<4), + + /** \brief Misc objects that gets added below anything else. + * \hideinitializer */ + HWLOC_DISC_PHASE_MISC = (1U<<5), + + /** \brief Annotating existing objects, adding distances, etc. + * \hideinitializer */ + HWLOC_DISC_PHASE_ANNOTATE = (1U<<6), + + /** \brief Final tweaks to a ready-to-use topology. + * This phase runs once the topology is loaded, before it is returned to the topology. + * Hence it may only use the main hwloc API for modifying the topology, + * for instance by restricting it, adding info attributes, etc. + * \hideinitializer */ + HWLOC_DISC_PHASE_TWEAK = (1U<<7) +} hwloc_disc_phase_t; + +/** \brief Discovery status flags */ +enum hwloc_disc_status_flag_e { + /** \brief The sets of allowed resources were already retrieved \hideinitializer */ + HWLOC_DISC_STATUS_FLAG_GOT_ALLOWED_RESOURCES = (1UL<<1) +}; + +/** \brief Discovery status structure + * + * Used by the core and backends to inform about what has been/is being done + * during the discovery process. + */ +struct hwloc_disc_status { + /** \brief The current discovery phase that is performed. + * Must match one of the phases in the component phases field. + */ + hwloc_disc_phase_t phase; + + /** \brief Dynamically excluded phases. + * If a component decides during discovery that some phases are no longer needed. + */ + unsigned excluded_phases; + + /** \brief OR'ed set of ::hwloc_disc_status_flag_e */ + unsigned long flags; +}; + +/** \brief Discovery backend structure + * + * A backend is the instantiation of a discovery component. + * When a component gets enabled for a topology, + * its instantiate() callback creates a backend. + * + * hwloc_backend_alloc() initializes all fields to default values + * that the component may change (except "component" and "next") + * before enabling the backend with hwloc_backend_enable(). + * + * Most backends assume that the topology is_thissystem flag is + * set because they talk to the underlying operating system. + * However they may still be used in topologies without the + * is_thissystem flag for debugging reasons. + * In practice, they are usually auto-disabled in such cases + * (excluded by xml or synthetic backends, or by environment + * variables when changing the Linux fsroot or the x86 cpuid path). + */ +struct hwloc_backend { + /** \private Reserved for the core, set by hwloc_backend_alloc() */ + struct hwloc_disc_component * component; + /** \private Reserved for the core, set by hwloc_backend_enable() */ + struct hwloc_topology * topology; + /** \private Reserved for the core. Set to 1 if forced through envvar, 0 otherwise. */ + int envvar_forced; + /** \private Reserved for the core. Used internally to list backends topology->backends. */ + struct hwloc_backend * next; + + /** \brief Discovery phases performed by this component, possibly without some of them if excluded by other components. + * OR'ed set of ::hwloc_disc_phase_t + */ + unsigned phases; + + /** \brief Backend flags, currently always 0. */ + unsigned long flags; + + /** \brief Backend-specific 'is_thissystem' property. + * Set to 0 if the backend disables the thissystem flag for this topology + * (e.g. loading from xml or synthetic string, + * or using a different fsroot on Linux, or a x86 CPUID dump). + * Set to -1 if the backend doesn't care (default). + */ + int is_thissystem; + + /** \brief Backend private data, or NULL if none. */ + void * private_data; + /** \brief Callback for freeing the private_data. + * May be NULL. + */ + void (*disable)(struct hwloc_backend *backend); + + /** \brief Main discovery callback. + * returns -1 on error, either because it couldn't add its objects ot the existing topology, + * or because of an actual discovery/gathering failure. + * May be NULL. + */ + int (*discover)(struct hwloc_backend *backend, struct hwloc_disc_status *status); + + /** \brief Callback to retrieve the locality of a PCI object. + * Called by the PCI core when attaching PCI hierarchy to CPU objects. + * May be NULL. + */ + int (*get_pci_busid_cpuset)(struct hwloc_backend *backend, struct hwloc_pcidev_attr_s *busid, hwloc_bitmap_t cpuset); +}; + +/** \brief Allocate a backend structure, set good default values, initialize backend->component and topology, etc. + * The caller will then modify whatever needed, and call hwloc_backend_enable(). + */ +HWLOC_DECLSPEC struct hwloc_backend * hwloc_backend_alloc(struct hwloc_topology *topology, struct hwloc_disc_component *component); + +/** \brief Enable a previously allocated and setup backend. */ +HWLOC_DECLSPEC int hwloc_backend_enable(struct hwloc_backend *backend); + +/** @} */ + + + + +/** \defgroup hwlocality_generic_components Components and Plugins: Generic components + * + * \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified. + * + * @{ + */ + +/** \brief Generic component type */ +typedef enum hwloc_component_type_e { + /** \brief The data field must point to a struct hwloc_disc_component. */ + HWLOC_COMPONENT_TYPE_DISC, + + /** \brief The data field must point to a struct hwloc_xml_component. */ + HWLOC_COMPONENT_TYPE_XML +} hwloc_component_type_t; + +/** \brief Generic component structure + * + * Generic components structure, either statically listed by configure in static-components.h + * or dynamically loaded as a plugin. + */ +struct hwloc_component { + /** \brief Component ABI version, set to ::HWLOC_COMPONENT_ABI */ + unsigned abi; + + /** \brief Process-wide component initialization callback. + * + * This optional callback is called when the component is registered + * to the hwloc core (after loading the plugin). + * + * When the component is built as a plugin, this callback + * should call hwloc_check_plugin_namespace() + * and return an negative error code on error. + * + * \p flags is always 0 for now. + * + * \return 0 on success, or a negative code on error. + * + * \note If the component uses ltdl for loading its own plugins, + * it should load/unload them only in init() and finalize(), + * to avoid race conditions with hwloc's use of ltdl. + */ + int (*init)(unsigned long flags); + + /** \brief Process-wide component termination callback. + * + * This optional callback is called after unregistering the component + * from the hwloc core (before unloading the plugin). + * + * \p flags is always 0 for now. + * + * \note If the component uses ltdl for loading its own plugins, + * it should load/unload them only in init() and finalize(), + * to avoid race conditions with hwloc's use of ltdl. + */ + void (*finalize)(unsigned long flags); + + /** \brief Component type */ + hwloc_component_type_t type; + + /** \brief Component flags, unused for now */ + unsigned long flags; + + /** \brief Component data, pointing to a struct hwloc_disc_component or struct hwloc_xml_component. */ + void * data; +}; + +/** \brief Make sure that plugins can lookup core symbols. + * + * This is a sanity check to avoid lazy-lookup failures when libhwloc + * is loaded within a plugin, and later tries to load its own plugins. + * This may fail (and abort the program) if libhwloc symbols are in a + * private namespace. + * + * \return 0 on success. + * \return -1 if the plugin cannot be successfully loaded. The caller + * plugin init() callback should return a negative error code as well. + * + * Plugins should call this function in their init() callback to avoid + * later crashes if lazy symbol resolution is used by the upper layer that + * loaded hwloc (e.g. OpenCL implementations using dlopen with RTLD_LAZY). + * + * \note The build system must define HWLOC_INSIDE_PLUGIN if and only if + * building the caller as a plugin. + * + * \note This function should remain inline so plugins can call it even + * when they cannot find libhwloc symbols. + */ +static __hwloc_inline int +hwloc_plugin_check_namespace(const char *pluginname __hwloc_attribute_unused, const char *symbol __hwloc_attribute_unused) +{ +#ifdef HWLOC_INSIDE_PLUGIN + void *sym; +#ifdef HWLOC_HAVE_LTDL + lt_dlhandle handle = lt_dlopen(NULL); +#elif defined(HWLOC_WIN_SYS) + HMODULE handle = GetModuleHandleA(NULL); +#else + void *handle = dlopen(NULL, RTLD_NOW|RTLD_LOCAL); +#endif + if (!handle) + /* cannot check, assume things will work */ + return 0; +#ifdef HWLOC_HAVE_LTDL + sym = lt_dlsym(handle, symbol); + lt_dlclose(handle); +#elif defined(HWLOC_WIN_SYS) + sym = GetModuleHandleA("hwloc.dll"); + FreeLibrary(handle); +#else + sym = dlsym(handle, symbol); + dlclose(handle); +#endif + if (!sym) { + static int verboseenv_checked = 0; + static int verboseenv_value = 0; + if (!verboseenv_checked) { + const char *verboseenv = getenv("HWLOC_PLUGINS_VERBOSE"); + verboseenv_value = verboseenv ? atoi(verboseenv) : 0; + verboseenv_checked = 1; + } + if (verboseenv_value) + fprintf(stderr, "Plugin `%s' disabling itself because it cannot find the `%s' core symbol.\n", + pluginname, symbol); + return -1; + } +#endif /* HWLOC_INSIDE_PLUGIN */ + return 0; +} + +/** @} */ + + + + +/** \defgroup hwlocality_components_core_funcs Components and Plugins: Core functions to be used by components + * + * \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified. + * + * @{ + */ + +/** \brief Check whether error messages are hidden. + * + * Callers should print critical error messages + * (e.g. invalid hw topo info, invalid config) + * only if this function returns strictly less than 2. + * + * Callers should print non-critical error messages + * (e.g. failure to initialize CUDA) + * if this function returns 0. + * + * This function return 1 by default (show critical only), + * 0 in lstopo (show all), + * or anything set in HWLOC_HIDE_ERRORS in the environment. + * + * Use macros HWLOC_SHOW_CRITICAL_ERRORS() and HWLOC_SHOW_ALL_ERRORS() + * for clarity. + */ +HWLOC_DECLSPEC int hwloc_hide_errors(void); + +#define HWLOC_SHOW_CRITICAL_ERRORS() (hwloc_hide_errors() < 2) +#define HWLOC_SHOW_ALL_ERRORS() (hwloc_hide_errors() == 0) + +/** \brief Add an object to the topology. + * + * Insert new object \p obj in the topology starting under existing object \p root + * (if \c NULL, the topology root object is used). + * + * It is sorted along the tree of other objects according to the inclusion of + * cpusets, to eventually be added as a child of the smallest object including + * this object. + * + * If the cpuset is empty, the type of the object (and maybe some attributes) + * must be enough to find where to insert the object. This is especially true + * for NUMA nodes with memory and no CPUs. + * + * The given object should not have children. + * + * This shall only be called before levels are built. + * + * The caller should check whether the object type is filtered-out before calling this function. + * + * The topology cpuset/nodesets will be enlarged to include the object sets. + * + * \p reason is a unique string identifying where and why this insertion call was performed + * (it will be displayed in case of internal insertion error). + * + * Returns the object on success. + * Returns NULL and frees obj on error. + * Returns another object and frees obj if it was merged with an identical pre-existing object. + */ +HWLOC_DECLSPEC hwloc_obj_t +hwloc__insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t root, + hwloc_obj_t obj, const char *reason); + +/** \brief Insert an object somewhere in the topology. + * + * It is added as the last child of the given parent. + * The cpuset is completely ignored, so strange objects such as I/O devices should + * preferably be inserted with this. + * + * When used for "normal" children with cpusets (when importing from XML + * when duplicating a topology), the caller should make sure that: + * - children are inserted in order, + * - children cpusets do not intersect. + * + * The given object may have normal, I/O or Misc children, as long as they are in order as well. + * These children must have valid parent and next_sibling pointers. + * + * The caller should check whether the object type is filtered-out before calling this function. + */ +HWLOC_DECLSPEC void hwloc_insert_object_by_parent(struct hwloc_topology *topology, hwloc_obj_t parent, hwloc_obj_t obj); + +/** \brief Allocate and initialize an object of the given type and physical index. + * + * If \p os_index is unknown or irrelevant, use \c HWLOC_UNKNOWN_INDEX. + */ +HWLOC_DECLSPEC hwloc_obj_t hwloc_alloc_setup_object(hwloc_topology_t topology, hwloc_obj_type_t type, unsigned os_index); + +/** \brief Setup object cpusets/nodesets by OR'ing its children. + * + * Used when adding an object late in the topology. + * Will update the new object by OR'ing all its new children sets. + * + * Used when PCI backend adds a hostbridge parent, when distances + * add a new Group, etc. + */ +HWLOC_DECLSPEC int hwloc_obj_add_children_sets(hwloc_obj_t obj); + +/** \brief Request a reconnection of children and levels in the topology. + * + * May be used by backends during discovery if they need arrays or lists + * of object within levels or children to be fully connected. + * + * \p flags is currently unused, must 0. + */ +HWLOC_DECLSPEC int hwloc_topology_reconnect(hwloc_topology_t topology, unsigned long flags __hwloc_attribute_unused); + +/** @} */ + + + + +/** \defgroup hwlocality_components_filtering Components and Plugins: Filtering objects + * + * \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified. + * + * @{ + */ + +/** \brief Check whether the given PCI device classid is important. + * + * \return 1 if important, 0 otherwise. + */ +static __hwloc_inline int +hwloc_filter_check_pcidev_subtype_important(unsigned classid) +{ + unsigned baseclass = classid >> 8; + return (baseclass == 0x03 /* PCI_BASE_CLASS_DISPLAY */ + || baseclass == 0x02 /* PCI_BASE_CLASS_NETWORK */ + || baseclass == 0x01 /* PCI_BASE_CLASS_STORAGE */ + || baseclass == 0x00 /* Unclassified, for Atos/Bull BXI */ + || baseclass == 0x0b /* PCI_BASE_CLASS_PROCESSOR */ + || classid == 0x0c04 /* PCI_CLASS_SERIAL_FIBER */ + || classid == 0x0c06 /* PCI_CLASS_SERIAL_INFINIBAND */ + || classid == 0x0502 /* PCI_CLASS_MEMORY_CXL */ + || baseclass == 0x06 /* PCI_BASE_CLASS_BRIDGE with non-PCI downstream. the core will drop the useless ones later */ + || baseclass == 0x12 /* Processing Accelerators */); +} + +/** \brief Check whether the given OS device subtype is important. + * + * \return 1 if important, 0 otherwise. + */ +static __hwloc_inline int +hwloc_filter_check_osdev_subtype_important(hwloc_obj_osdev_type_t subtype) +{ + return (subtype != HWLOC_OBJ_OSDEV_DMA); +} + +/** \brief Check whether a non-I/O object type should be filtered-out. + * + * Cannot be used for I/O objects. + * + * \return 1 if the object type should be kept, 0 otherwise. + */ +static __hwloc_inline int +hwloc_filter_check_keep_object_type(hwloc_topology_t topology, hwloc_obj_type_t type) +{ + enum hwloc_type_filter_e filter = HWLOC_TYPE_FILTER_KEEP_NONE; + hwloc_topology_get_type_filter(topology, type, &filter); + assert(filter != HWLOC_TYPE_FILTER_KEEP_IMPORTANT); /* IMPORTANT only used for I/O */ + return filter == HWLOC_TYPE_FILTER_KEEP_NONE ? 0 : 1; +} + +/** \brief Check whether the given object should be filtered-out. + * + * \return 1 if the object type should be kept, 0 otherwise. + */ +static __hwloc_inline int +hwloc_filter_check_keep_object(hwloc_topology_t topology, hwloc_obj_t obj) +{ + hwloc_obj_type_t type = obj->type; + enum hwloc_type_filter_e filter = HWLOC_TYPE_FILTER_KEEP_NONE; + hwloc_topology_get_type_filter(topology, type, &filter); + if (filter == HWLOC_TYPE_FILTER_KEEP_NONE) + return 0; + if (filter == HWLOC_TYPE_FILTER_KEEP_IMPORTANT) { + if (type == HWLOC_OBJ_PCI_DEVICE) + return hwloc_filter_check_pcidev_subtype_important(obj->attr->pcidev.class_id); + if (type == HWLOC_OBJ_OS_DEVICE) + return hwloc_filter_check_osdev_subtype_important(obj->attr->osdev.type); + } + return 1; +} + +/** @} */ + + + + +/** \defgroup hwlocality_components_pcidisc Components and Plugins: helpers for PCI discovery + * + * \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified. + * + * @{ + */ + +/** \brief Return the offset of the given capability in the PCI config space buffer + * + * This function requires a 256-bytes config space. Unknown/unavailable bytes should be set to 0xff. + */ +HWLOC_DECLSPEC unsigned hwloc_pcidisc_find_cap(const unsigned char *config, unsigned cap); + +/** \brief Fill linkspeed by reading the PCI config space where PCI_CAP_ID_EXP is at position offset. + * + * Needs 20 bytes of EXP capability block starting at offset in the config space + * for registers up to link status. + */ +HWLOC_DECLSPEC int hwloc_pcidisc_find_linkspeed(const unsigned char *config, unsigned offset, float *linkspeed); + +/** \brief Return the hwloc object type (PCI device or Bridge) for the given class and configuration space. + * + * This function requires 16 bytes of common configuration header at the beginning of config. + */ +HWLOC_DECLSPEC hwloc_obj_type_t hwloc_pcidisc_check_bridge_type(unsigned device_class, const unsigned char *config); + +/** \brief Fills the attributes of the given PCI bridge using the given PCI config space. + * + * This function requires 32 bytes of common configuration header at the beginning of config. + * + * Returns -1 and destroys /p obj if bridge fields are invalid. + */ +HWLOC_DECLSPEC int hwloc_pcidisc_find_bridge_buses(unsigned domain, unsigned bus, unsigned dev, unsigned func, + unsigned *secondary_busp, unsigned *subordinate_busp, + const unsigned char *config); + +/** \brief Insert a PCI object in the given PCI tree by looking at PCI bus IDs. + * + * If \p treep points to \c NULL, the new object is inserted there. + */ +HWLOC_DECLSPEC void hwloc_pcidisc_tree_insert_by_busid(struct hwloc_obj **treep, struct hwloc_obj *obj); + +/** \brief Add some hostbridges on top of the given tree of PCI objects and attach them to the topology. + * + * Other backends may lookup PCI objects or localities (for instance to attach OS devices) + * by using hwloc_pcidisc_find_by_busid() or hwloc_pcidisc_find_busid_parent(). + */ +HWLOC_DECLSPEC int hwloc_pcidisc_tree_attach(struct hwloc_topology *topology, struct hwloc_obj *tree); + +/** @} */ + + + + +/** \defgroup hwlocality_components_pcifind Components and Plugins: finding PCI objects during other discoveries + * + * \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified. + * + * @{ + */ + +/** \brief Find the object or a parent of a PCI bus ID. + * + * When attaching a new object (typically an OS device) whose locality + * is specified by PCI bus ID, this function returns the PCI object + * to use as a parent for attaching. + * + * If the exact PCI device with this bus ID exists, it is returned. + * Otherwise (for instance if it was filtered out), the function returns + * another object with similar locality (for instance a parent bridge, + * or the local CPU Package). + */ +HWLOC_DECLSPEC struct hwloc_obj * hwloc_pci_find_parent_by_busid(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func); + +/** \brief Find the PCI device or bridge matching a PCI bus ID exactly. + * + * This is useful for adding specific information about some objects + * based on their PCI id. When it comes to attaching objects based on + * PCI locality, hwloc_pci_find_parent_by_busid() should be preferred. + */ +HWLOC_DECLSPEC struct hwloc_obj * hwloc_pci_find_by_busid(struct hwloc_topology *topology, unsigned domain, unsigned bus, unsigned dev, unsigned func); + + +/** @} */ + + + + +/** \defgroup hwlocality_components_distances Components and Plugins: distances + * + * \note These structures and functions may change when ::HWLOC_COMPONENT_ABI is modified. + * + * @{ + */ + +/** \brief Handle to a new distances structure during its addition to the topology. */ +typedef void * hwloc_backend_distances_add_handle_t; + +/** \brief Create a new empty distances structure. + * + * This is identical to hwloc_distances_add_create() + * but this variant is designed for backend inserting + * distances during topology discovery. + */ +HWLOC_DECLSPEC hwloc_backend_distances_add_handle_t +hwloc_backend_distances_add_create(hwloc_topology_t topology, + const char *name, unsigned long kind, + unsigned long flags); + +/** \brief Specify the objects and values in a new empty distances structure. + * + * This is similar to hwloc_distances_add_values() + * but this variant is designed for backend inserting + * distances during topology discovery. + * + * The only semantical difference is that \p objs and \p values + * are not duplicated, but directly attached to the topology. + * On success, these arrays are given to the core and should not + * ever be freed by the caller anymore. + */ +HWLOC_DECLSPEC int +hwloc_backend_distances_add_values(hwloc_topology_t topology, + hwloc_backend_distances_add_handle_t handle, + unsigned nbobjs, hwloc_obj_t *objs, + hwloc_uint64_t *values, + unsigned long flags); + +/** \brief Commit a new distances structure. + * + * This is similar to hwloc_distances_add_commit() + * but this variant is designed for backend inserting + * distances during topology discovery. + */ +HWLOC_DECLSPEC int +hwloc_backend_distances_add_commit(hwloc_topology_t topology, + hwloc_backend_distances_add_handle_t handle, + unsigned long flags); + +/** @} */ + + + + +#endif /* HWLOC_PLUGINS_H */ diff --git a/src/deps/hwloc/include/hwloc/rename.h b/src/deps/hwloc/include/hwloc/rename.h new file mode 100644 index 000000000..ef0355e0c --- /dev/null +++ b/src/deps/hwloc/include/hwloc/rename.h @@ -0,0 +1,923 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved. + * Copyright © 2010-2025 Inria. All rights reserved. + * See COPYING in top-level directory. + */ + +#ifndef HWLOC_RENAME_H +#define HWLOC_RENAME_H + +#include "hwloc/autogen/config.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +/* Only enact these defines if we're actually renaming the symbols + (i.e., avoid trying to have no-op defines if we're *not* + renaming). */ + +#if HWLOC_SYM_TRANSFORM + +/* Use a preprocessor two-step in order to get the prefixing right. + Make 2 macros: HWLOC_NAME and HWLOC_NAME_CAPS for renaming + things. */ + +#define HWLOC_MUNGE_NAME(a, b) HWLOC_MUNGE_NAME2(a, b) +#define HWLOC_MUNGE_NAME2(a, b) a ## b +#define HWLOC_NAME(name) HWLOC_MUNGE_NAME(HWLOC_SYM_PREFIX, hwloc_ ## name) +/* FIXME: should be "HWLOC_ ## name" below, unchanged because it doesn't matter much and could break some embedders hacks */ +#define HWLOC_NAME_CAPS(name) HWLOC_MUNGE_NAME(HWLOC_SYM_PREFIX_CAPS, hwloc_ ## name) + +/* Now define all the "real" names to be the prefixed names. This + allows us to use the real names throughout the code base (i.e., + "hwloc_"); the preprocessor will adjust to have the prefixed + name under the covers. */ + +/* Names from hwloc.h */ + +#define hwloc_get_api_version HWLOC_NAME(get_api_version) + +#define hwloc_topology HWLOC_NAME(topology) +#define hwloc_topology_t HWLOC_NAME(topology_t) + +#define hwloc_cpuset_t HWLOC_NAME(cpuset_t) +#define hwloc_const_cpuset_t HWLOC_NAME(const_cpuset_t) +#define hwloc_nodeset_t HWLOC_NAME(nodeset_t) +#define hwloc_const_nodeset_t HWLOC_NAME(const_nodeset_t) + +#define HWLOC_OBJ_MACHINE HWLOC_NAME_CAPS(OBJ_MACHINE) +#define HWLOC_OBJ_NUMANODE HWLOC_NAME_CAPS(OBJ_NUMANODE) +#define HWLOC_OBJ_MEMCACHE HWLOC_NAME_CAPS(OBJ_MEMCACHE) +#define HWLOC_OBJ_PACKAGE HWLOC_NAME_CAPS(OBJ_PACKAGE) +#define HWLOC_OBJ_DIE HWLOC_NAME_CAPS(OBJ_DIE) +#define HWLOC_OBJ_CORE HWLOC_NAME_CAPS(OBJ_CORE) +#define HWLOC_OBJ_PU HWLOC_NAME_CAPS(OBJ_PU) +#define HWLOC_OBJ_L1CACHE HWLOC_NAME_CAPS(OBJ_L1CACHE) +#define HWLOC_OBJ_L2CACHE HWLOC_NAME_CAPS(OBJ_L2CACHE) +#define HWLOC_OBJ_L3CACHE HWLOC_NAME_CAPS(OBJ_L3CACHE) +#define HWLOC_OBJ_L4CACHE HWLOC_NAME_CAPS(OBJ_L4CACHE) +#define HWLOC_OBJ_L5CACHE HWLOC_NAME_CAPS(OBJ_L5CACHE) +#define HWLOC_OBJ_L1ICACHE HWLOC_NAME_CAPS(OBJ_L1ICACHE) +#define HWLOC_OBJ_L2ICACHE HWLOC_NAME_CAPS(OBJ_L2ICACHE) +#define HWLOC_OBJ_L3ICACHE HWLOC_NAME_CAPS(OBJ_L3ICACHE) +#define HWLOC_OBJ_MISC HWLOC_NAME_CAPS(OBJ_MISC) +#define HWLOC_OBJ_GROUP HWLOC_NAME_CAPS(OBJ_GROUP) +#define HWLOC_OBJ_BRIDGE HWLOC_NAME_CAPS(OBJ_BRIDGE) +#define HWLOC_OBJ_PCI_DEVICE HWLOC_NAME_CAPS(OBJ_PCI_DEVICE) +#define HWLOC_OBJ_OS_DEVICE HWLOC_NAME_CAPS(OBJ_OS_DEVICE) +#define HWLOC_OBJ_TYPE_MAX HWLOC_NAME_CAPS(OBJ_TYPE_MAX) +#define hwloc_obj_type_t HWLOC_NAME(obj_type_t) + +#define hwloc_obj_cache_type_e HWLOC_NAME(obj_cache_type_e) +#define hwloc_obj_cache_type_t HWLOC_NAME(obj_cache_type_t) +#define HWLOC_OBJ_CACHE_UNIFIED HWLOC_NAME_CAPS(OBJ_CACHE_UNIFIED) +#define HWLOC_OBJ_CACHE_DATA HWLOC_NAME_CAPS(OBJ_CACHE_DATA) +#define HWLOC_OBJ_CACHE_INSTRUCTION HWLOC_NAME_CAPS(OBJ_CACHE_INSTRUCTION) + +#define hwloc_obj_bridge_type_e HWLOC_NAME(obj_bridge_type_e) +#define hwloc_obj_bridge_type_t HWLOC_NAME(obj_bridge_type_t) +#define HWLOC_OBJ_BRIDGE_HOST HWLOC_NAME_CAPS(OBJ_BRIDGE_HOST) +#define HWLOC_OBJ_BRIDGE_PCI HWLOC_NAME_CAPS(OBJ_BRIDGE_PCI) + +#define hwloc_obj_osdev_type_e HWLOC_NAME(obj_osdev_type_e) +#define hwloc_obj_osdev_type_t HWLOC_NAME(obj_osdev_type_t) +#define HWLOC_OBJ_OSDEV_BLOCK HWLOC_NAME_CAPS(OBJ_OSDEV_BLOCK) +#define HWLOC_OBJ_OSDEV_GPU HWLOC_NAME_CAPS(OBJ_OSDEV_GPU) +#define HWLOC_OBJ_OSDEV_NETWORK HWLOC_NAME_CAPS(OBJ_OSDEV_NETWORK) +#define HWLOC_OBJ_OSDEV_OPENFABRICS HWLOC_NAME_CAPS(OBJ_OSDEV_OPENFABRICS) +#define HWLOC_OBJ_OSDEV_DMA HWLOC_NAME_CAPS(OBJ_OSDEV_DMA) +#define HWLOC_OBJ_OSDEV_COPROC HWLOC_NAME_CAPS(OBJ_OSDEV_COPROC) + +#define hwloc_compare_types HWLOC_NAME(compare_types) + +#define hwloc_obj HWLOC_NAME(obj) +#define hwloc_obj_t HWLOC_NAME(obj_t) + +#define hwloc_info_s HWLOC_NAME(info_s) + +#define hwloc_obj_attr_u HWLOC_NAME(obj_attr_u) +#define hwloc_numanode_attr_s HWLOC_NAME(numanode_attr_s) +#define hwloc_memory_page_type_s HWLOC_NAME(memory_page_type_s) +#define hwloc_cache_attr_s HWLOC_NAME(cache_attr_s) +#define hwloc_group_attr_s HWLOC_NAME(group_attr_s) +#define hwloc_pcidev_attr_s HWLOC_NAME(pcidev_attr_s) +#define hwloc_bridge_attr_s HWLOC_NAME(bridge_attr_s) +#define hwloc_osdev_attr_s HWLOC_NAME(osdev_attr_s) + +#define hwloc_topology_init HWLOC_NAME(topology_init) +#define hwloc_topology_load HWLOC_NAME(topology_load) +#define hwloc_topology_destroy HWLOC_NAME(topology_destroy) +#define hwloc_topology_dup HWLOC_NAME(topology_dup) +#define hwloc_topology_abi_check HWLOC_NAME(topology_abi_check) +#define hwloc_topology_check HWLOC_NAME(topology_check) + +#define hwloc_topology_flags_e HWLOC_NAME(topology_flags_e) + +#define HWLOC_TOPOLOGY_FLAG_INCLUDE_DISALLOWED HWLOC_NAME_CAPS(TOPOLOGY_FLAG_WITH_DISALLOWED) +#define HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM HWLOC_NAME_CAPS(TOPOLOGY_FLAG_IS_THISSYSTEM) +#define HWLOC_TOPOLOGY_FLAG_THISSYSTEM_ALLOWED_RESOURCES HWLOC_NAME_CAPS(TOPOLOGY_FLAG_THISSYSTEM_ALLOWED_RESOURCES) +#define HWLOC_TOPOLOGY_FLAG_IMPORT_SUPPORT HWLOC_NAME_CAPS(TOPOLOGY_FLAG_IMPORT_SUPPORT) +#define HWLOC_TOPOLOGY_FLAG_RESTRICT_TO_CPUBINDING HWLOC_NAME_CAPS(TOPOLOGY_FLAG_RESTRICT_TO_CPUBINDING) +#define HWLOC_TOPOLOGY_FLAG_RESTRICT_TO_MEMBINDING HWLOC_NAME_CAPS(TOPOLOGY_FLAG_RESTRICT_TO_MEMBINDING) +#define HWLOC_TOPOLOGY_FLAG_DONT_CHANGE_BINDING HWLOC_NAME_CAPS(TOPOLOGY_FLAG_DONT_CHANGE_BINDING) +#define HWLOC_TOPOLOGY_FLAG_NO_DISTANCES HWLOC_NAME_CAPS(TOPOLOGY_FLAG_NO_DISTANCES) +#define HWLOC_TOPOLOGY_FLAG_NO_MEMATTRS HWLOC_NAME_CAPS(TOPOLOGY_FLAG_NO_MEMATTRS) +#define HWLOC_TOPOLOGY_FLAG_NO_CPUKINDS HWLOC_NAME_CAPS(TOPOLOGY_FLAG_NO_CPUKINDS) + +#define hwloc_topology_set_pid HWLOC_NAME(topology_set_pid) +#define hwloc_topology_set_synthetic HWLOC_NAME(topology_set_synthetic) +#define hwloc_topology_set_xml HWLOC_NAME(topology_set_xml) +#define hwloc_topology_set_xmlbuffer HWLOC_NAME(topology_set_xmlbuffer) +#define hwloc_topology_components_flag_e HWLOC_NAME(hwloc_topology_components_flag_e) +#define HWLOC_TOPOLOGY_COMPONENTS_FLAG_BLACKLIST HWLOC_NAME_CAPS(TOPOLOGY_COMPONENTS_FLAG_BLACKLIST) +#define hwloc_topology_set_components HWLOC_NAME(topology_set_components) + +#define hwloc_topology_set_flags HWLOC_NAME(topology_set_flags) +#define hwloc_topology_is_thissystem HWLOC_NAME(topology_is_thissystem) +#define hwloc_topology_get_flags HWLOC_NAME(topology_get_flags) +#define hwloc_topology_discovery_support HWLOC_NAME(topology_discovery_support) +#define hwloc_topology_cpubind_support HWLOC_NAME(topology_cpubind_support) +#define hwloc_topology_membind_support HWLOC_NAME(topology_membind_support) +#define hwloc_topology_misc_support HWLOC_NAME(topology_misc_support) +#define hwloc_topology_support HWLOC_NAME(topology_support) +#define hwloc_topology_get_support HWLOC_NAME(topology_get_support) + +#define hwloc_type_filter_e HWLOC_NAME(type_filter_e) +#define HWLOC_TYPE_FILTER_KEEP_ALL HWLOC_NAME_CAPS(TYPE_FILTER_KEEP_ALL) +#define HWLOC_TYPE_FILTER_KEEP_NONE HWLOC_NAME_CAPS(TYPE_FILTER_KEEP_NONE) +#define HWLOC_TYPE_FILTER_KEEP_STRUCTURE HWLOC_NAME_CAPS(TYPE_FILTER_KEEP_STRUCTURE) +#define HWLOC_TYPE_FILTER_KEEP_IMPORTANT HWLOC_NAME_CAPS(TYPE_FILTER_KEEP_IMPORTANT) +#define hwloc_topology_set_type_filter HWLOC_NAME(topology_set_type_filter) +#define hwloc_topology_get_type_filter HWLOC_NAME(topology_get_type_filter) +#define hwloc_topology_set_all_types_filter HWLOC_NAME(topology_set_all_types_filter) +#define hwloc_topology_set_cache_types_filter HWLOC_NAME(topology_set_cache_types_filter) +#define hwloc_topology_set_icache_types_filter HWLOC_NAME(topology_set_icache_types_filter) +#define hwloc_topology_set_io_types_filter HWLOC_NAME(topology_set_io_types_filter) + +#define hwloc_topology_set_userdata HWLOC_NAME(topology_set_userdata) +#define hwloc_topology_get_userdata HWLOC_NAME(topology_get_userdata) + +#define hwloc_restrict_flags_e HWLOC_NAME(restrict_flags_e) +#define HWLOC_RESTRICT_FLAG_REMOVE_CPULESS HWLOC_NAME_CAPS(RESTRICT_FLAG_REMOVE_CPULESS) +#define HWLOC_RESTRICT_FLAG_BYNODESET HWLOC_NAME_CAPS(RESTRICT_FLAG_BYNODESET) +#define HWLOC_RESTRICT_FLAG_REMOVE_MEMLESS HWLOC_NAME_CAPS(RESTRICT_FLAG_REMOVE_MEMLESS) +#define HWLOC_RESTRICT_FLAG_ADAPT_MISC HWLOC_NAME_CAPS(RESTRICT_FLAG_ADAPT_MISC) +#define HWLOC_RESTRICT_FLAG_ADAPT_IO HWLOC_NAME_CAPS(RESTRICT_FLAG_ADAPT_IO) +#define hwloc_topology_restrict HWLOC_NAME(topology_restrict) + +#define hwloc_allow_flags_e HWLOC_NAME(allow_flags_e) +#define HWLOC_ALLOW_FLAG_ALL HWLOC_NAME_CAPS(ALLOW_FLAG_ALL) +#define HWLOC_ALLOW_FLAG_LOCAL_RESTRICTIONS HWLOC_NAME_CAPS(ALLOW_FLAG_LOCAL_RESTRICTIONS) +#define HWLOC_ALLOW_FLAG_CUSTOM HWLOC_NAME_CAPS(ALLOW_FLAG_CUSTOM) +#define hwloc_topology_allow HWLOC_NAME(topology_allow) + +#define hwloc_topology_insert_misc_object HWLOC_NAME(topology_insert_misc_object) +#define hwloc_topology_alloc_group_object HWLOC_NAME(topology_alloc_group_object) +#define hwloc_topology_free_group_object HWLOC_NAME(topology_free_group_object) +#define hwloc_topology_insert_group_object HWLOC_NAME(topology_insert_group_object) +#define hwloc_obj_add_other_obj_sets HWLOC_NAME(obj_add_other_obj_sets) +#define hwloc_topology_refresh HWLOC_NAME(topology_refresh) + +#define hwloc_topology_get_depth HWLOC_NAME(topology_get_depth) +#define hwloc_get_type_depth HWLOC_NAME(get_type_depth) +#define hwloc_get_memory_parents_depth HWLOC_NAME(get_memory_parents_depth) + +#define hwloc_get_type_depth_e HWLOC_NAME(get_type_depth_e) +#define HWLOC_TYPE_DEPTH_UNKNOWN HWLOC_NAME_CAPS(TYPE_DEPTH_UNKNOWN) +#define HWLOC_TYPE_DEPTH_MULTIPLE HWLOC_NAME_CAPS(TYPE_DEPTH_MULTIPLE) +#define HWLOC_TYPE_DEPTH_BRIDGE HWLOC_NAME_CAPS(TYPE_DEPTH_BRIDGE) +#define HWLOC_TYPE_DEPTH_PCI_DEVICE HWLOC_NAME_CAPS(TYPE_DEPTH_PCI_DEVICE) +#define HWLOC_TYPE_DEPTH_OS_DEVICE HWLOC_NAME_CAPS(TYPE_DEPTH_OS_DEVICE) +#define HWLOC_TYPE_DEPTH_MISC HWLOC_NAME_CAPS(TYPE_DEPTH_MISC) +#define HWLOC_TYPE_DEPTH_NUMANODE HWLOC_NAME_CAPS(TYPE_DEPTH_NUMANODE) +#define HWLOC_TYPE_DEPTH_MEMCACHE HWLOC_NAME_CAPS(TYPE_DEPTH_MEMCACHE) + +#define hwloc_get_depth_type HWLOC_NAME(get_depth_type) +#define hwloc_get_nbobjs_by_depth HWLOC_NAME(get_nbobjs_by_depth) +#define hwloc_get_nbobjs_by_type HWLOC_NAME(get_nbobjs_by_type) + +#define hwloc_get_obj_by_depth HWLOC_NAME(get_obj_by_depth ) +#define hwloc_get_obj_by_type HWLOC_NAME(get_obj_by_type ) + +#define hwloc_obj_type_string HWLOC_NAME(obj_type_string ) +#define hwloc_obj_type_snprintf HWLOC_NAME(obj_type_snprintf ) +#define hwloc_obj_attr_snprintf HWLOC_NAME(obj_attr_snprintf ) +#define hwloc_type_sscanf HWLOC_NAME(type_sscanf) +#define hwloc_type_sscanf_as_depth HWLOC_NAME(type_sscanf_as_depth) + +#define hwloc_obj_get_info_by_name HWLOC_NAME(obj_get_info_by_name) +#define hwloc_obj_add_info HWLOC_NAME(obj_add_info) +#define hwloc_obj_set_subtype HWLOC_NAME(obj_set_subtype) + +#define HWLOC_CPUBIND_PROCESS HWLOC_NAME_CAPS(CPUBIND_PROCESS) +#define HWLOC_CPUBIND_THREAD HWLOC_NAME_CAPS(CPUBIND_THREAD) +#define HWLOC_CPUBIND_STRICT HWLOC_NAME_CAPS(CPUBIND_STRICT) +#define HWLOC_CPUBIND_NOMEMBIND HWLOC_NAME_CAPS(CPUBIND_NOMEMBIND) + +#define hwloc_cpubind_flags_t HWLOC_NAME(cpubind_flags_t) + +#define hwloc_set_cpubind HWLOC_NAME(set_cpubind) +#define hwloc_get_cpubind HWLOC_NAME(get_cpubind) +#define hwloc_set_proc_cpubind HWLOC_NAME(set_proc_cpubind) +#define hwloc_get_proc_cpubind HWLOC_NAME(get_proc_cpubind) +#define hwloc_set_thread_cpubind HWLOC_NAME(set_thread_cpubind) +#define hwloc_get_thread_cpubind HWLOC_NAME(get_thread_cpubind) + +#define hwloc_get_last_cpu_location HWLOC_NAME(get_last_cpu_location) +#define hwloc_get_proc_last_cpu_location HWLOC_NAME(get_proc_last_cpu_location) + +#define HWLOC_MEMBIND_DEFAULT HWLOC_NAME_CAPS(MEMBIND_DEFAULT) +#define HWLOC_MEMBIND_FIRSTTOUCH HWLOC_NAME_CAPS(MEMBIND_FIRSTTOUCH) +#define HWLOC_MEMBIND_BIND HWLOC_NAME_CAPS(MEMBIND_BIND) +#define HWLOC_MEMBIND_INTERLEAVE HWLOC_NAME_CAPS(MEMBIND_INTERLEAVE) +#define HWLOC_MEMBIND_WEIGHTED_INTERLEAVE HWLOC_NAME_CAPS(MEMBIND_WEIGHTED_INTERLEAVE) +#define HWLOC_MEMBIND_NEXTTOUCH HWLOC_NAME_CAPS(MEMBIND_NEXTTOUCH) +#define HWLOC_MEMBIND_MIXED HWLOC_NAME_CAPS(MEMBIND_MIXED) + +#define hwloc_membind_policy_t HWLOC_NAME(membind_policy_t) + +#define HWLOC_MEMBIND_PROCESS HWLOC_NAME_CAPS(MEMBIND_PROCESS) +#define HWLOC_MEMBIND_THREAD HWLOC_NAME_CAPS(MEMBIND_THREAD) +#define HWLOC_MEMBIND_STRICT HWLOC_NAME_CAPS(MEMBIND_STRICT) +#define HWLOC_MEMBIND_MIGRATE HWLOC_NAME_CAPS(MEMBIND_MIGRATE) +#define HWLOC_MEMBIND_NOCPUBIND HWLOC_NAME_CAPS(MEMBIND_NOCPUBIND) +#define HWLOC_MEMBIND_BYNODESET HWLOC_NAME_CAPS(MEMBIND_BYNODESET) + +#define hwloc_membind_flags_t HWLOC_NAME(membind_flags_t) + +#define hwloc_set_membind HWLOC_NAME(set_membind) +#define hwloc_get_membind HWLOC_NAME(get_membind) +#define hwloc_set_proc_membind HWLOC_NAME(set_proc_membind) +#define hwloc_get_proc_membind HWLOC_NAME(get_proc_membind) +#define hwloc_set_area_membind HWLOC_NAME(set_area_membind) +#define hwloc_get_area_membind HWLOC_NAME(get_area_membind) +#define hwloc_get_area_memlocation HWLOC_NAME(get_area_memlocation) +#define hwloc_alloc_membind HWLOC_NAME(alloc_membind) +#define hwloc_alloc HWLOC_NAME(alloc) +#define hwloc_free HWLOC_NAME(free) + +#define hwloc_get_non_io_ancestor_obj HWLOC_NAME(get_non_io_ancestor_obj) +#define hwloc_get_next_pcidev HWLOC_NAME(get_next_pcidev) +#define hwloc_get_pcidev_by_busid HWLOC_NAME(get_pcidev_by_busid) +#define hwloc_get_pcidev_by_busidstring HWLOC_NAME(get_pcidev_by_busidstring) +#define hwloc_get_next_osdev HWLOC_NAME(get_next_osdev) +#define hwloc_get_next_bridge HWLOC_NAME(get_next_bridge) +#define hwloc_bridge_covers_pcibus HWLOC_NAME(bridge_covers_pcibus) + +/* hwloc/bitmap.h */ + +#define hwloc_bitmap_s HWLOC_NAME(bitmap_s) +#define hwloc_bitmap_t HWLOC_NAME(bitmap_t) +#define hwloc_const_bitmap_t HWLOC_NAME(const_bitmap_t) + +#define hwloc_bitmap_alloc HWLOC_NAME(bitmap_alloc) +#define hwloc_bitmap_alloc_full HWLOC_NAME(bitmap_alloc_full) +#define hwloc_bitmap_free HWLOC_NAME(bitmap_free) +#define hwloc_bitmap_dup HWLOC_NAME(bitmap_dup) +#define hwloc_bitmap_copy HWLOC_NAME(bitmap_copy) +#define hwloc_bitmap_snprintf HWLOC_NAME(bitmap_snprintf) +#define hwloc_bitmap_asprintf HWLOC_NAME(bitmap_asprintf) +#define hwloc_bitmap_sscanf HWLOC_NAME(bitmap_sscanf) +#define hwloc_bitmap_list_snprintf HWLOC_NAME(bitmap_list_snprintf) +#define hwloc_bitmap_list_asprintf HWLOC_NAME(bitmap_list_asprintf) +#define hwloc_bitmap_list_sscanf HWLOC_NAME(bitmap_list_sscanf) +#define hwloc_bitmap_taskset_snprintf HWLOC_NAME(bitmap_taskset_snprintf) +#define hwloc_bitmap_taskset_asprintf HWLOC_NAME(bitmap_taskset_asprintf) +#define hwloc_bitmap_taskset_sscanf HWLOC_NAME(bitmap_taskset_sscanf) +#define hwloc_bitmap_zero HWLOC_NAME(bitmap_zero) +#define hwloc_bitmap_fill HWLOC_NAME(bitmap_fill) +#define hwloc_bitmap_from_ulong HWLOC_NAME(bitmap_from_ulong) +#define hwloc_bitmap_from_ulongs HWLOC_NAME(bitmap_from_ulongs) +#define hwloc_bitmap_from_ith_ulong HWLOC_NAME(bitmap_from_ith_ulong) +#define hwloc_bitmap_to_ulong HWLOC_NAME(bitmap_to_ulong) +#define hwloc_bitmap_to_ith_ulong HWLOC_NAME(bitmap_to_ith_ulong) +#define hwloc_bitmap_to_ulongs HWLOC_NAME(bitmap_to_ulongs) +#define hwloc_bitmap_nr_ulongs HWLOC_NAME(bitmap_nr_ulongs) +#define hwloc_bitmap_only HWLOC_NAME(bitmap_only) +#define hwloc_bitmap_allbut HWLOC_NAME(bitmap_allbut) +#define hwloc_bitmap_set HWLOC_NAME(bitmap_set) +#define hwloc_bitmap_set_range HWLOC_NAME(bitmap_set_range) +#define hwloc_bitmap_set_ith_ulong HWLOC_NAME(bitmap_set_ith_ulong) +#define hwloc_bitmap_clr HWLOC_NAME(bitmap_clr) +#define hwloc_bitmap_clr_range HWLOC_NAME(bitmap_clr_range) +#define hwloc_bitmap_isset HWLOC_NAME(bitmap_isset) +#define hwloc_bitmap_iszero HWLOC_NAME(bitmap_iszero) +#define hwloc_bitmap_isfull HWLOC_NAME(bitmap_isfull) +#define hwloc_bitmap_isequal HWLOC_NAME(bitmap_isequal) +#define hwloc_bitmap_intersects HWLOC_NAME(bitmap_intersects) +#define hwloc_bitmap_isincluded HWLOC_NAME(bitmap_isincluded) +#define hwloc_bitmap_or HWLOC_NAME(bitmap_or) +#define hwloc_bitmap_and HWLOC_NAME(bitmap_and) +#define hwloc_bitmap_andnot HWLOC_NAME(bitmap_andnot) +#define hwloc_bitmap_xor HWLOC_NAME(bitmap_xor) +#define hwloc_bitmap_not HWLOC_NAME(bitmap_not) +#define hwloc_bitmap_first HWLOC_NAME(bitmap_first) +#define hwloc_bitmap_last HWLOC_NAME(bitmap_last) +#define hwloc_bitmap_next HWLOC_NAME(bitmap_next) +#define hwloc_bitmap_first_unset HWLOC_NAME(bitmap_first_unset) +#define hwloc_bitmap_last_unset HWLOC_NAME(bitmap_last_unset) +#define hwloc_bitmap_next_unset HWLOC_NAME(bitmap_next_unset) +#define hwloc_bitmap_singlify HWLOC_NAME(bitmap_singlify) +#define hwloc_bitmap_compare_first HWLOC_NAME(bitmap_compare_first) +#define hwloc_bitmap_compare HWLOC_NAME(bitmap_compare) +#define hwloc_bitmap_weight HWLOC_NAME(bitmap_weight) + +/* hwloc/helper.h */ + +#define hwloc_get_type_or_below_depth HWLOC_NAME(get_type_or_below_depth) +#define hwloc_get_type_or_above_depth HWLOC_NAME(get_type_or_above_depth) +#define hwloc_get_root_obj HWLOC_NAME(get_root_obj) +#define hwloc_get_ancestor_obj_by_depth HWLOC_NAME(get_ancestor_obj_by_depth) +#define hwloc_get_ancestor_obj_by_type HWLOC_NAME(get_ancestor_obj_by_type) +#define hwloc_get_next_obj_by_depth HWLOC_NAME(get_next_obj_by_depth) +#define hwloc_get_next_obj_by_type HWLOC_NAME(get_next_obj_by_type) +#define hwloc_bitmap_singlify_per_core HWLOC_NAME(bitmap_singlify_by_core) +#define hwloc_get_pu_obj_by_os_index HWLOC_NAME(get_pu_obj_by_os_index) +#define hwloc_get_numanode_obj_by_os_index HWLOC_NAME(get_numanode_obj_by_os_index) +#define hwloc_get_next_child HWLOC_NAME(get_next_child) +#define hwloc_get_common_ancestor_obj HWLOC_NAME(get_common_ancestor_obj) +#define hwloc_obj_is_in_subtree HWLOC_NAME(obj_is_in_subtree) +#define hwloc_get_first_largest_obj_inside_cpuset HWLOC_NAME(get_first_largest_obj_inside_cpuset) +#define hwloc_get_largest_objs_inside_cpuset HWLOC_NAME(get_largest_objs_inside_cpuset) +#define hwloc_get_next_obj_inside_cpuset_by_depth HWLOC_NAME(get_next_obj_inside_cpuset_by_depth) +#define hwloc_get_next_obj_inside_cpuset_by_type HWLOC_NAME(get_next_obj_inside_cpuset_by_type) +#define hwloc_get_obj_inside_cpuset_by_depth HWLOC_NAME(get_obj_inside_cpuset_by_depth) +#define hwloc_get_obj_inside_cpuset_by_type HWLOC_NAME(get_obj_inside_cpuset_by_type) +#define hwloc_get_nbobjs_inside_cpuset_by_depth HWLOC_NAME(get_nbobjs_inside_cpuset_by_depth) +#define hwloc_get_nbobjs_inside_cpuset_by_type HWLOC_NAME(get_nbobjs_inside_cpuset_by_type) +#define hwloc_get_obj_index_inside_cpuset HWLOC_NAME(get_obj_index_inside_cpuset) +#define hwloc_get_child_covering_cpuset HWLOC_NAME(get_child_covering_cpuset) +#define hwloc_get_obj_covering_cpuset HWLOC_NAME(get_obj_covering_cpuset) +#define hwloc_get_next_obj_covering_cpuset_by_depth HWLOC_NAME(get_next_obj_covering_cpuset_by_depth) +#define hwloc_get_next_obj_covering_cpuset_by_type HWLOC_NAME(get_next_obj_covering_cpuset_by_type) +#define hwloc_obj_type_is_normal HWLOC_NAME(obj_type_is_normal) +#define hwloc_obj_type_is_memory HWLOC_NAME(obj_type_is_memory) +#define hwloc_obj_type_is_io HWLOC_NAME(obj_type_is_io) +#define hwloc_obj_type_is_cache HWLOC_NAME(obj_type_is_cache) +#define hwloc_obj_type_is_dcache HWLOC_NAME(obj_type_is_dcache) +#define hwloc_obj_type_is_icache HWLOC_NAME(obj_type_is_icache) +#define hwloc_get_cache_type_depth HWLOC_NAME(get_cache_type_depth) +#define hwloc_get_cache_covering_cpuset HWLOC_NAME(get_cache_covering_cpuset) +#define hwloc_get_shared_cache_covering_obj HWLOC_NAME(get_shared_cache_covering_obj) +#define hwloc_get_closest_objs HWLOC_NAME(get_closest_objs) +#define hwloc_get_obj_below_by_type HWLOC_NAME(get_obj_below_by_type) +#define hwloc_get_obj_below_array_by_type HWLOC_NAME(get_obj_below_array_by_type) +#define hwloc_get_obj_with_same_locality HWLOC_NAME(get_obj_with_same_locality) +#define hwloc_distrib_flags_e HWLOC_NAME(distrib_flags_e) +#define HWLOC_DISTRIB_FLAG_REVERSE HWLOC_NAME_CAPS(DISTRIB_FLAG_REVERSE) +#define hwloc_distrib HWLOC_NAME(distrib) +#define hwloc_alloc_membind_policy HWLOC_NAME(alloc_membind_policy) +#define hwloc_alloc_membind_policy_nodeset HWLOC_NAME(alloc_membind_policy_nodeset) +#define hwloc_topology_get_complete_cpuset HWLOC_NAME(topology_get_complete_cpuset) +#define hwloc_topology_get_topology_cpuset HWLOC_NAME(topology_get_topology_cpuset) +#define hwloc_topology_get_allowed_cpuset HWLOC_NAME(topology_get_allowed_cpuset) +#define hwloc_topology_get_complete_nodeset HWLOC_NAME(topology_get_complete_nodeset) +#define hwloc_topology_get_topology_nodeset HWLOC_NAME(topology_get_topology_nodeset) +#define hwloc_topology_get_allowed_nodeset HWLOC_NAME(topology_get_allowed_nodeset) +#define hwloc_cpuset_to_nodeset HWLOC_NAME(cpuset_to_nodeset) +#define hwloc_cpuset_from_nodeset HWLOC_NAME(cpuset_from_nodeset) + +/* memattrs.h */ + +#define hwloc_memattr_id_e HWLOC_NAME(memattr_id_e) +#define HWLOC_MEMATTR_ID_CAPACITY HWLOC_NAME_CAPS(MEMATTR_ID_CAPACITY) +#define HWLOC_MEMATTR_ID_LOCALITY HWLOC_NAME_CAPS(MEMATTR_ID_LOCALITY) +#define HWLOC_MEMATTR_ID_BANDWIDTH HWLOC_NAME_CAPS(MEMATTR_ID_BANDWIDTH) +#define HWLOC_MEMATTR_ID_LATENCY HWLOC_NAME_CAPS(MEMATTR_ID_LATENCY) +#define HWLOC_MEMATTR_ID_READ_BANDWIDTH HWLOC_NAME_CAPS(MEMATTR_ID_READ_BANDWIDTH) +#define HWLOC_MEMATTR_ID_WRITE_BANDWIDTH HWLOC_NAME_CAPS(MEMATTR_ID_WRITE_BANDWIDTH) +#define HWLOC_MEMATTR_ID_READ_LATENCY HWLOC_NAME_CAPS(MEMATTR_ID_READ_LATENCY) +#define HWLOC_MEMATTR_ID_WRITE_LATENCY HWLOC_NAME_CAPS(MEMATTR_ID_WRITE_LATENCY) +#define HWLOC_MEMATTR_ID_MAX HWLOC_NAME_CAPS(MEMATTR_ID_MAX) + +#define hwloc_memattr_id_t HWLOC_NAME(memattr_id_t) +#define hwloc_memattr_get_by_name HWLOC_NAME(memattr_get_by_name) + +#define hwloc_location HWLOC_NAME(location) +#define hwloc_location_type_e HWLOC_NAME(location_type_e) +#define HWLOC_LOCATION_TYPE_OBJECT HWLOC_NAME_CAPS(LOCATION_TYPE_OBJECT) +#define HWLOC_LOCATION_TYPE_CPUSET HWLOC_NAME_CAPS(LOCATION_TYPE_CPUSET) +#define hwloc_location_u HWLOC_NAME(location_u) + +#define hwloc_memattr_get_value HWLOC_NAME(memattr_get_value) +#define hwloc_memattr_get_best_target HWLOC_NAME(memattr_get_best_target) +#define hwloc_memattr_get_best_initiator HWLOC_NAME(memattr_get_best_initiator) + +#define hwloc_local_numanode_flag_e HWLOC_NAME(local_numanode_flag_e) +#define HWLOC_LOCAL_NUMANODE_FLAG_LARGER_LOCALITY HWLOC_NAME_CAPS(LOCAL_NUMANODE_FLAG_LARGER_LOCALITY) +#define HWLOC_LOCAL_NUMANODE_FLAG_SMALLER_LOCALITY HWLOC_NAME_CAPS(LOCAL_NUMANODE_FLAG_SMALLER_LOCALITY) +#define HWLOC_LOCAL_NUMANODE_FLAG_INTERSECT_LOCALITY HWLOC_NAME_CAPS(LOCAL_NUMANODE_FLAG_INTERSECT_LOCALITY) +#define HWLOC_LOCAL_NUMANODE_FLAG_ALL HWLOC_NAME_CAPS(LOCAL_NUMANODE_FLAG_ALL) +#define hwloc_get_local_numanode_objs HWLOC_NAME(get_local_numanode_objs) +#define hwloc_topology_get_default_nodeset HWLOC_NAME(topology_get_default_nodeset) + +#define hwloc_memattr_get_name HWLOC_NAME(memattr_get_name) +#define hwloc_memattr_get_flags HWLOC_NAME(memattr_get_flags) +#define hwloc_memattr_flag_e HWLOC_NAME(memattr_flag_e) +#define HWLOC_MEMATTR_FLAG_HIGHER_FIRST HWLOC_NAME_CAPS(MEMATTR_FLAG_HIGHER_FIRST) +#define HWLOC_MEMATTR_FLAG_LOWER_FIRST HWLOC_NAME_CAPS(MEMATTR_FLAG_LOWER_FIRST) +#define HWLOC_MEMATTR_FLAG_NEED_INITIATOR HWLOC_NAME_CAPS(MEMATTR_FLAG_NEED_INITIATOR) +#define hwloc_memattr_register HWLOC_NAME(memattr_register) +#define hwloc_memattr_set_value HWLOC_NAME(memattr_set_value) +#define hwloc_memattr_get_targets HWLOC_NAME(memattr_get_targets) +#define hwloc_memattr_get_initiators HWLOC_NAME(memattr_get_initiators) + +/* cpukinds.h */ + +#define hwloc_cpukinds_get_nr HWLOC_NAME(cpukinds_get_nr) +#define hwloc_cpukinds_get_by_cpuset HWLOC_NAME(cpukinds_get_by_cpuset) +#define hwloc_cpukinds_get_info HWLOC_NAME(cpukinds_get_info) +#define hwloc_cpukinds_register HWLOC_NAME(cpukinds_register) + +/* export.h */ + +#define hwloc_topology_export_xml_flags_e HWLOC_NAME(topology_export_xml_flags_e) +#define HWLOC_TOPOLOGY_EXPORT_XML_FLAG_V1 HWLOC_NAME_CAPS(TOPOLOGY_EXPORT_XML_FLAG_V1) +#define hwloc_topology_export_xml HWLOC_NAME(topology_export_xml) +#define hwloc_topology_export_xmlbuffer HWLOC_NAME(topology_export_xmlbuffer) +#define hwloc_free_xmlbuffer HWLOC_NAME(free_xmlbuffer) +#define hwloc_topology_set_userdata_export_callback HWLOC_NAME(topology_set_userdata_export_callback) +#define hwloc_export_obj_userdata HWLOC_NAME(export_obj_userdata) +#define hwloc_export_obj_userdata_base64 HWLOC_NAME(export_obj_userdata_base64) +#define hwloc_topology_set_userdata_import_callback HWLOC_NAME(topology_set_userdata_import_callback) + +#define hwloc_topology_export_synthetic_flags_e HWLOC_NAME(topology_export_synthetic_flags_e) +#define HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_EXTENDED_TYPES HWLOC_NAME_CAPS(TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_EXTENDED_TYPES) +#define HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_ATTRS HWLOC_NAME_CAPS(TOPOLOGY_EXPORT_SYNTHETIC_FLAG_NO_ATTRS) +#define HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_V1 HWLOC_NAME_CAPS(TOPOLOGY_EXPORT_SYNTHETIC_FLAG_V1) +#define HWLOC_TOPOLOGY_EXPORT_SYNTHETIC_FLAG_IGNORE_MEMORY HWLOC_NAME_CAPS(TOPOLOGY_EXPORT_SYNTHETIC_FLAG_IGNORE_MEMORY) +#define hwloc_topology_export_synthetic HWLOC_NAME(topology_export_synthetic) + +/* distances.h */ + +#define hwloc_distances_s HWLOC_NAME(distances_s) + +#define hwloc_distances_kind_e HWLOC_NAME(distances_kind_e) +#define HWLOC_DISTANCES_KIND_FROM_OS HWLOC_NAME_CAPS(DISTANCES_KIND_FROM_OS) +#define HWLOC_DISTANCES_KIND_FROM_USER HWLOC_NAME_CAPS(DISTANCES_KIND_FROM_USER) +#define HWLOC_DISTANCES_KIND_MEANS_LATENCY HWLOC_NAME_CAPS(DISTANCES_KIND_MEANS_LATENCY) +#define HWLOC_DISTANCES_KIND_MEANS_BANDWIDTH HWLOC_NAME_CAPS(DISTANCES_KIND_MEANS_BANDWIDTH) +#define HWLOC_DISTANCES_KIND_HETEROGENEOUS_TYPES HWLOC_NAME_CAPS(DISTANCES_KIND_HETEROGENEOUS_TYPES) + +#define hwloc_distances_get HWLOC_NAME(distances_get) +#define hwloc_distances_get_by_depth HWLOC_NAME(distances_get_by_depth) +#define hwloc_distances_get_by_type HWLOC_NAME(distances_get_by_type) +#define hwloc_distances_get_by_name HWLOC_NAME(distances_get_by_name) +#define hwloc_distances_get_name HWLOC_NAME(distances_get_name) +#define hwloc_distances_release HWLOC_NAME(distances_release) +#define hwloc_distances_obj_index HWLOC_NAME(distances_obj_index) +#define hwloc_distances_obj_pair_values HWLOC_NAME(distances_pair_values) + +#define hwloc_distances_transform_e HWLOC_NAME(distances_transform_e) +#define HWLOC_DISTANCES_TRANSFORM_REMOVE_NULL HWLOC_NAME_CAPS(DISTANCES_TRANSFORM_REMOVE_NULL) +#define HWLOC_DISTANCES_TRANSFORM_LINKS HWLOC_NAME_CAPS(DISTANCES_TRANSFORM_LINKS) +#define HWLOC_DISTANCES_TRANSFORM_MERGE_SWITCH_PORTS HWLOC_NAME_CAPS(DISTANCES_TRANSFORM_MERGE_SWITCH_PORTS) +#define HWLOC_DISTANCES_TRANSFORM_TRANSITIVE_CLOSURE HWLOC_NAME_CAPS(DISTANCES_TRANSFORM_TRANSITIVE_CLOSURE) +#define hwloc_distances_transform HWLOC_NAME(distances_transform) + +#define hwloc_distances_add_flag_e HWLOC_NAME(distances_add_flag_e) +#define HWLOC_DISTANCES_ADD_FLAG_GROUP HWLOC_NAME_CAPS(DISTANCES_ADD_FLAG_GROUP) +#define HWLOC_DISTANCES_ADD_FLAG_GROUP_INACCURATE HWLOC_NAME_CAPS(DISTANCES_ADD_FLAG_GROUP_INACCURATE) + +#define hwloc_distances_add_handle_t HWLOC_NAME(distances_add_handle_t) +#define hwloc_distances_add_create HWLOC_NAME(distances_add_create) +#define hwloc_distances_add_values HWLOC_NAME(distances_add_values) +#define hwloc_distances_add_commit HWLOC_NAME(distances_add_commit) + +#define hwloc_distances_remove HWLOC_NAME(distances_remove) +#define hwloc_distances_remove_by_depth HWLOC_NAME(distances_remove_by_depth) +#define hwloc_distances_remove_by_type HWLOC_NAME(distances_remove_by_type) +#define hwloc_distances_release_remove HWLOC_NAME(distances_release_remove) + +/* diff.h */ + +#define hwloc_topology_diff_obj_attr_type_e HWLOC_NAME(topology_diff_obj_attr_type_e) +#define hwloc_topology_diff_obj_attr_type_t HWLOC_NAME(topology_diff_obj_attr_type_t) +#define HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_SIZE HWLOC_NAME_CAPS(TOPOLOGY_DIFF_OBJ_ATTR_SIZE) +#define HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_NAME HWLOC_NAME_CAPS(TOPOLOGY_DIFF_OBJ_ATTR_NAME) +#define HWLOC_TOPOLOGY_DIFF_OBJ_ATTR_INFO HWLOC_NAME_CAPS(TOPOLOGY_DIFF_OBJ_ATTR_INFO) +#define hwloc_topology_diff_obj_attr_u HWLOC_NAME(topology_diff_obj_attr_u) +#define hwloc_topology_diff_obj_attr_generic_s HWLOC_NAME(topology_diff_obj_attr_generic_s) +#define hwloc_topology_diff_obj_attr_uint64_s HWLOC_NAME(topology_diff_obj_attr_uint64_s) +#define hwloc_topology_diff_obj_attr_string_s HWLOC_NAME(topology_diff_obj_attr_string_s) +#define hwloc_topology_diff_type_e HWLOC_NAME(topology_diff_type_e) +#define hwloc_topology_diff_type_t HWLOC_NAME(topology_diff_type_t) +#define HWLOC_TOPOLOGY_DIFF_OBJ_ATTR HWLOC_NAME_CAPS(TOPOLOGY_DIFF_OBJ_ATTR) +#define HWLOC_TOPOLOGY_DIFF_TOO_COMPLEX HWLOC_NAME_CAPS(TOPOLOGY_DIFF_TOO_COMPLEX) +#define hwloc_topology_diff_u HWLOC_NAME(topology_diff_u) +#define hwloc_topology_diff_t HWLOC_NAME(topology_diff_t) +#define hwloc_topology_diff_generic_s HWLOC_NAME(topology_diff_generic_s) +#define hwloc_topology_diff_obj_attr_s HWLOC_NAME(topology_diff_obj_attr_s) +#define hwloc_topology_diff_too_complex_s HWLOC_NAME(topology_diff_too_complex_s) +#define hwloc_topology_diff_build HWLOC_NAME(topology_diff_build) +#define hwloc_topology_diff_apply_flags_e HWLOC_NAME(topology_diff_apply_flags_e) +#define HWLOC_TOPOLOGY_DIFF_APPLY_REVERSE HWLOC_NAME_CAPS(TOPOLOGY_DIFF_APPLY_REVERSE) +#define hwloc_topology_diff_apply HWLOC_NAME(topology_diff_apply) +#define hwloc_topology_diff_destroy HWLOC_NAME(topology_diff_destroy) +#define hwloc_topology_diff_load_xml HWLOC_NAME(topology_diff_load_xml) +#define hwloc_topology_diff_export_xml HWLOC_NAME(topology_diff_export_xml) +#define hwloc_topology_diff_load_xmlbuffer HWLOC_NAME(topology_diff_load_xmlbuffer) +#define hwloc_topology_diff_export_xmlbuffer HWLOC_NAME(topology_diff_export_xmlbuffer) + +/* shmem.h */ + +#define hwloc_shmem_topology_get_length HWLOC_NAME(shmem_topology_get_length) +#define hwloc_shmem_topology_write HWLOC_NAME(shmem_topology_write) +#define hwloc_shmem_topology_adopt HWLOC_NAME(shmem_topology_adopt) + +/* glibc-sched.h */ + +#define hwloc_cpuset_to_glibc_sched_affinity HWLOC_NAME(cpuset_to_glibc_sched_affinity) +#define hwloc_cpuset_from_glibc_sched_affinity HWLOC_NAME(cpuset_from_glibc_sched_affinity) + +/* linux-libnuma.h */ + +#define hwloc_cpuset_to_linux_libnuma_ulongs HWLOC_NAME(cpuset_to_linux_libnuma_ulongs) +#define hwloc_nodeset_to_linux_libnuma_ulongs HWLOC_NAME(nodeset_to_linux_libnuma_ulongs) +#define hwloc_cpuset_from_linux_libnuma_ulongs HWLOC_NAME(cpuset_from_linux_libnuma_ulongs) +#define hwloc_nodeset_from_linux_libnuma_ulongs HWLOC_NAME(nodeset_from_linux_libnuma_ulongs) +#define hwloc_cpuset_to_linux_libnuma_bitmask HWLOC_NAME(cpuset_to_linux_libnuma_bitmask) +#define hwloc_nodeset_to_linux_libnuma_bitmask HWLOC_NAME(nodeset_to_linux_libnuma_bitmask) +#define hwloc_cpuset_from_linux_libnuma_bitmask HWLOC_NAME(cpuset_from_linux_libnuma_bitmask) +#define hwloc_nodeset_from_linux_libnuma_bitmask HWLOC_NAME(nodeset_from_linux_libnuma_bitmask) + +/* linux.h */ + +#define hwloc_linux_set_tid_cpubind HWLOC_NAME(linux_set_tid_cpubind) +#define hwloc_linux_get_tid_cpubind HWLOC_NAME(linux_get_tid_cpubind) +#define hwloc_linux_get_tid_last_cpu_location HWLOC_NAME(linux_get_tid_last_cpu_location) +#define hwloc_linux_read_path_as_cpumask HWLOC_NAME(linux_read_file_cpumask) + +/* windows.h */ + +#define hwloc_windows_get_nr_processor_groups HWLOC_NAME(windows_get_nr_processor_groups) +#define hwloc_windows_get_processor_group_cpuset HWLOC_NAME(windows_get_processor_group_cpuset) + +/* openfabrics-verbs.h */ + +#define hwloc_ibv_get_device_cpuset HWLOC_NAME(ibv_get_device_cpuset) +#define hwloc_ibv_get_device_osdev HWLOC_NAME(ibv_get_device_osdev) +#define hwloc_ibv_get_device_osdev_by_name HWLOC_NAME(ibv_get_device_osdev_by_name) + +/* opencl.h */ + +#define hwloc_cl_device_pci_bus_info_khr HWLOC_NAME(cl_device_pci_bus_info_khr) +#define hwloc_cl_device_topology_amd HWLOC_NAME(cl_device_topology_amd) +#define hwloc_opencl_get_device_pci_busid HWLOC_NAME(opencl_get_device_pci_ids) +#define hwloc_opencl_get_device_cpuset HWLOC_NAME(opencl_get_device_cpuset) +#define hwloc_opencl_get_device_osdev HWLOC_NAME(opencl_get_device_osdev) +#define hwloc_opencl_get_device_osdev_by_index HWLOC_NAME(opencl_get_device_osdev_by_index) + +/* cuda.h */ + +#define hwloc_cuda_get_device_pci_ids HWLOC_NAME(cuda_get_device_pci_ids) +#define hwloc_cuda_get_device_cpuset HWLOC_NAME(cuda_get_device_cpuset) +#define hwloc_cuda_get_device_pcidev HWLOC_NAME(cuda_get_device_pcidev) +#define hwloc_cuda_get_device_osdev HWLOC_NAME(cuda_get_device_osdev) +#define hwloc_cuda_get_device_osdev_by_index HWLOC_NAME(cuda_get_device_osdev_by_index) + +/* cudart.h */ + +#define hwloc_cudart_get_device_pci_ids HWLOC_NAME(cudart_get_device_pci_ids) +#define hwloc_cudart_get_device_cpuset HWLOC_NAME(cudart_get_device_cpuset) +#define hwloc_cudart_get_device_pcidev HWLOC_NAME(cudart_get_device_pcidev) +#define hwloc_cudart_get_device_osdev_by_index HWLOC_NAME(cudart_get_device_osdev_by_index) + +/* nvml.h */ + +#define hwloc_nvml_get_device_cpuset HWLOC_NAME(nvml_get_device_cpuset) +#define hwloc_nvml_get_device_osdev HWLOC_NAME(nvml_get_device_osdev) +#define hwloc_nvml_get_device_osdev_by_index HWLOC_NAME(nvml_get_device_osdev_by_index) + +/* rsmi.h */ + +#define hwloc_rsmi_get_device_cpuset HWLOC_NAME(rsmi_get_device_cpuset) +#define hwloc_rsmi_get_device_osdev HWLOC_NAME(rsmi_get_device_osdev) +#define hwloc_rsmi_get_device_osdev_by_index HWLOC_NAME(rsmi_get_device_osdev_by_index) + +/* levelzero.h */ + +#define hwloc_levelzero_get_device_cpuset HWLOC_NAME(levelzero_get_device_cpuset) +#define hwloc_levelzero_get_sysman_device_cpuset HWLOC_NAME(levelzero_get_sysman_device_cpuset) +#define hwloc_levelzero_get_device_osdev HWLOC_NAME(levelzero_get_device_osdev) +#define hwloc_levelzero_get_sysman_device_osdev HWLOC_NAME(levelzero_get_sysman_device_osdev) + +/* gl.h */ + +#define hwloc_gl_get_display_osdev_by_port_device HWLOC_NAME(gl_get_display_osdev_by_port_device) +#define hwloc_gl_get_display_osdev_by_name HWLOC_NAME(gl_get_display_osdev_by_name) +#define hwloc_gl_get_display_by_osdev HWLOC_NAME(gl_get_display_by_osdev) + +/* hwloc/plugins.h */ + +#define hwloc_disc_phase_e HWLOC_NAME(disc_phase_e) +#define HWLOC_DISC_PHASE_GLOBAL HWLOC_NAME_CAPS(DISC_PHASE_GLOBAL) +#define HWLOC_DISC_PHASE_CPU HWLOC_NAME_CAPS(DISC_PHASE_CPU) +#define HWLOC_DISC_PHASE_MEMORY HWLOC_NAME_CAPS(DISC_PHASE_MEMORY) +#define HWLOC_DISC_PHASE_PCI HWLOC_NAME_CAPS(DISC_PHASE_PCI) +#define HWLOC_DISC_PHASE_IO HWLOC_NAME_CAPS(DISC_PHASE_IO) +#define HWLOC_DISC_PHASE_MISC HWLOC_NAME_CAPS(DISC_PHASE_MISC) +#define HWLOC_DISC_PHASE_ANNOTATE HWLOC_NAME_CAPS(DISC_PHASE_ANNOTATE) +#define HWLOC_DISC_PHASE_TWEAK HWLOC_NAME_CAPS(DISC_PHASE_TWEAK) +#define hwloc_disc_phase_t HWLOC_NAME(disc_phase_t) +#define hwloc_disc_component HWLOC_NAME(disc_component) + +#define hwloc_disc_status_flag_e HWLOC_NAME(disc_status_flag_e) +#define HWLOC_DISC_STATUS_FLAG_GOT_ALLOWED_RESOURCES HWLOC_NAME_CAPS(DISC_STATUS_FLAG_GOT_ALLOWED_RESOURCES) +#define hwloc_disc_status HWLOC_NAME(disc_status) + +#define hwloc_backend HWLOC_NAME(backend) + +#define hwloc_backend_alloc HWLOC_NAME(backend_alloc) +#define hwloc_backend_enable HWLOC_NAME(backend_enable) + +#define hwloc_component_type_e HWLOC_NAME(component_type_e) +#define HWLOC_COMPONENT_TYPE_DISC HWLOC_NAME_CAPS(COMPONENT_TYPE_DISC) +#define HWLOC_COMPONENT_TYPE_XML HWLOC_NAME_CAPS(COMPONENT_TYPE_XML) +#define hwloc_component_type_t HWLOC_NAME(component_type_t) +#define hwloc_component HWLOC_NAME(component) + +#define hwloc_plugin_check_namespace HWLOC_NAME(plugin_check_namespace) + +#define hwloc_hide_errors HWLOC_NAME(hide_errors) +#define hwloc__insert_object_by_cpuset HWLOC_NAME(_insert_object_by_cpuset) +#define hwloc_insert_object_by_parent HWLOC_NAME(insert_object_by_parent) +#define hwloc_alloc_setup_object HWLOC_NAME(alloc_setup_object) +#define hwloc_obj_add_children_sets HWLOC_NAME(add_children_sets) +#define hwloc_topology_reconnect HWLOC_NAME(topology_reconnect) + +#define hwloc_filter_check_pcidev_subtype_important HWLOC_NAME(filter_check_pcidev_subtype_important) +#define hwloc_filter_check_osdev_subtype_important HWLOC_NAME(filter_check_osdev_subtype_important) +#define hwloc_filter_check_keep_object_type HWLOC_NAME(filter_check_keep_object_type) +#define hwloc_filter_check_keep_object HWLOC_NAME(filter_check_keep_object) + +#define hwloc_pcidisc_find_cap HWLOC_NAME(pcidisc_find_cap) +#define hwloc_pcidisc_find_linkspeed HWLOC_NAME(pcidisc_find_linkspeed) +#define hwloc_pcidisc_check_bridge_type HWLOC_NAME(pcidisc_check_bridge_type) +#define hwloc_pcidisc_find_bridge_buses HWLOC_NAME(pcidisc_find_bridge_buses) +#define hwloc_pcidisc_tree_insert_by_busid HWLOC_NAME(pcidisc_tree_insert_by_busid) +#define hwloc_pcidisc_tree_attach HWLOC_NAME(pcidisc_tree_attach) + +#define hwloc_pci_find_by_busid HWLOC_NAME(pcidisc_find_by_busid) +#define hwloc_pci_find_parent_by_busid HWLOC_NAME(pcidisc_find_busid_parent) + +#define hwloc_backend_distances_add_handle_t HWLOC_NAME(backend_distances_add_handle_t) +#define hwloc_backend_distances_add_create HWLOC_NAME(backend_distances_add_create) +#define hwloc_backend_distances_add_values HWLOC_NAME(backend_distances_add_values) +#define hwloc_backend_distances_add_commit HWLOC_NAME(backend_distances_add_commit) + +/* hwloc/deprecated.h */ + +#define hwloc_distances_add HWLOC_NAME(distances_add) + +#define hwloc_topology_insert_misc_object_by_parent HWLOC_NAME(topology_insert_misc_object_by_parent) +#define hwloc_obj_cpuset_snprintf HWLOC_NAME(obj_cpuset_snprintf) +#define hwloc_obj_type_sscanf HWLOC_NAME(obj_type_sscanf) + +#define hwloc_set_membind_nodeset HWLOC_NAME(set_membind_nodeset) +#define hwloc_get_membind_nodeset HWLOC_NAME(get_membind_nodeset) +#define hwloc_set_proc_membind_nodeset HWLOC_NAME(set_proc_membind_nodeset) +#define hwloc_get_proc_membind_nodeset HWLOC_NAME(get_proc_membind_nodeset) +#define hwloc_set_area_membind_nodeset HWLOC_NAME(set_area_membind_nodeset) +#define hwloc_get_area_membind_nodeset HWLOC_NAME(get_area_membind_nodeset) +#define hwloc_alloc_membind_nodeset HWLOC_NAME(alloc_membind_nodeset) + +#define hwloc_cpuset_to_nodeset_strict HWLOC_NAME(cpuset_to_nodeset_strict) +#define hwloc_cpuset_from_nodeset_strict HWLOC_NAME(cpuset_from_nodeset_strict) + +/* private/debug.h */ + +#define hwloc_debug_enabled HWLOC_NAME(debug_enabled) +#define hwloc_debug HWLOC_NAME(debug) + +/* private/misc.h */ + +#ifndef HWLOC_HAVE_CORRECT_SNPRINTF +#define hwloc_snprintf HWLOC_NAME(snprintf) +#endif +#define hwloc_ffsl_manual HWLOC_NAME(ffsl_manual) +#define hwloc_ffs32 HWLOC_NAME(ffs32) +#define hwloc_ffsl_from_ffs32 HWLOC_NAME(ffsl_from_ffs32) +#define hwloc_flsl_manual HWLOC_NAME(flsl_manual) +#define hwloc_fls32 HWLOC_NAME(fls32) +#define hwloc_flsl_from_fls32 HWLOC_NAME(flsl_from_fls32) +#define hwloc_weight_long HWLOC_NAME(weight_long) +#define hwloc_strncasecmp HWLOC_NAME(strncasecmp) + +#define hwloc_bitmap_compare_inclusion HWLOC_NAME(bitmap_compare_inclusion) + +#define hwloc_pci_class_string HWLOC_NAME(pci_class_string) +#define hwloc_linux_pci_link_speed_from_string HWLOC_NAME(linux_pci_link_speed_from_string) + +#define hwloc_cache_type_by_depth_type HWLOC_NAME(cache_type_by_depth_type) +#define hwloc__obj_type_is_normal HWLOC_NAME(_obj_type_is_normal) +#define hwloc__obj_type_is_memory HWLOC_NAME(_obj_type_is_memory) +#define hwloc__obj_type_is_io HWLOC_NAME(_obj_type_is_io) +#define hwloc__obj_type_is_special HWLOC_NAME(_obj_type_is_special) + +#define hwloc__obj_type_is_cache HWLOC_NAME(_obj_type_is_cache) +#define hwloc__obj_type_is_dcache HWLOC_NAME(_obj_type_is_dcache) +#define hwloc__obj_type_is_icache HWLOC_NAME(_obj_type_is_icache) + +#define hwloc__pci_link_speed HWLOC_NAME(_pci_link_speed) + +/* private/cpuid-x86.h */ + +#define hwloc_have_x86_cpuid HWLOC_NAME(have_x86_cpuid) +#define hwloc_x86_cpuid HWLOC_NAME(x86_cpuid) + +/* private/xml.h */ + +#define hwloc__xml_verbose HWLOC_NAME(_xml_verbose) + +#define hwloc__xml_import_state_s HWLOC_NAME(_xml_import_state_s) +#define hwloc__xml_import_state_t HWLOC_NAME(_xml_import_state_t) +#define hwloc__xml_import_diff HWLOC_NAME(_xml_import_diff) +#define hwloc_xml_backend_data_s HWLOC_NAME(xml_backend_data_s) +#define hwloc__xml_export_state_s HWLOC_NAME(_xml_export_state_s) +#define hwloc__xml_export_state_t HWLOC_NAME(_xml_export_state_t) +#define hwloc__xml_export_data_s HWLOC_NAME(_xml_export_data_s) +#define hwloc__xml_export_topology HWLOC_NAME(_xml_export_topology) +#define hwloc__xml_export_diff HWLOC_NAME(_xml_export_diff) + +#define hwloc_xml_callbacks HWLOC_NAME(xml_callbacks) +#define hwloc_xml_component HWLOC_NAME(xml_component) +#define hwloc_xml_callbacks_register HWLOC_NAME(xml_callbacks_register) +#define hwloc_xml_callbacks_reset HWLOC_NAME(xml_callbacks_reset) + +#define hwloc__xml_imported_v1distances_s HWLOC_NAME(_xml_imported_v1distances_s) + +/* private/components.h */ + +#define hwloc_disc_component_force_enable HWLOC_NAME(disc_component_force_enable) +#define hwloc_disc_components_enable_others HWLOC_NAME(disc_components_instantiate_others) + +#define hwloc_backends_is_thissystem HWLOC_NAME(backends_is_thissystem) +#define hwloc_backends_find_callbacks HWLOC_NAME(backends_find_callbacks) + +#define hwloc_topology_components_init HWLOC_NAME(topology_components_init) +#define hwloc_backends_disable_all HWLOC_NAME(backends_disable_all) +#define hwloc_topology_components_fini HWLOC_NAME(topology_components_fini) + +#define hwloc_components_init HWLOC_NAME(components_init) +#define hwloc_components_fini HWLOC_NAME(components_fini) + +/* private/internal-private.h */ + +#define hwloc_xml_component HWLOC_NAME(xml_component) +#define hwloc_synthetic_component HWLOC_NAME(synthetic_component) + +#define hwloc_aix_component HWLOC_NAME(aix_component) +#define hwloc_bgq_component HWLOC_NAME(bgq_component) +#define hwloc_darwin_component HWLOC_NAME(darwin_component) +#define hwloc_freebsd_component HWLOC_NAME(freebsd_component) +#define hwloc_hpux_component HWLOC_NAME(hpux_component) +#define hwloc_linux_component HWLOC_NAME(linux_component) +#define hwloc_netbsd_component HWLOC_NAME(netbsd_component) +#define hwloc_noos_component HWLOC_NAME(noos_component) +#define hwloc_solaris_component HWLOC_NAME(solaris_component) +#define hwloc_windows_component HWLOC_NAME(windows_component) +#define hwloc_x86_component HWLOC_NAME(x86_component) + +#define hwloc_cuda_component HWLOC_NAME(cuda_component) +#define hwloc_gl_component HWLOC_NAME(gl_component) +#define hwloc_levelzero_component HWLOC_NAME(levelzero_component) +#define hwloc_nvml_component HWLOC_NAME(nvml_component) +#define hwloc_rsmi_component HWLOC_NAME(rsmi_component) +#define hwloc_opencl_component HWLOC_NAME(opencl_component) +#define hwloc_pci_component HWLOC_NAME(pci_component) + +#define hwloc_xml_libxml_component HWLOC_NAME(xml_libxml_component) +#define hwloc_xml_nolibxml_component HWLOC_NAME(xml_nolibxml_component) + +/* private/private.h */ + +#define hwloc_internal_location_s HWLOC_NAME(internal_location_s) + +#define hwloc_special_level_s HWLOC_NAME(special_level_s) + +#define hwloc_pci_locality_s HWLOC_NAME(pci_locality_s) + +#define hwloc_topology_forced_component_s HWLOC_NAME(topology_forced_component) + +#define hwloc_alloc_root_sets HWLOC_NAME(alloc_root_sets) +#define hwloc_setup_pu_level HWLOC_NAME(setup_pu_level) +#define hwloc_get_sysctlbyname HWLOC_NAME(get_sysctlbyname) +#define hwloc_get_sysctl HWLOC_NAME(get_sysctl) +#define hwloc_fallback_nbprocessors HWLOC_NAME(fallback_nbprocessors) +#define hwloc_fallback_memsize HWLOC_NAME(fallback_memsize) + +#define hwloc__object_cpusets_compare_first HWLOC_NAME(_object_cpusets_compare_first) +#define hwloc__reorder_children HWLOC_NAME(_reorder_children) + +#define hwloc_topology_setup_defaults HWLOC_NAME(topology_setup_defaults) +#define hwloc_topology_clear HWLOC_NAME(topology_clear) + +#define hwloc__reconnect HWLOC_NAME(_reconnect) + +#define hwloc__attach_memory_object HWLOC_NAME(insert_memory_object) + +#define hwloc_get_obj_by_type_and_gp_index HWLOC_NAME(get_obj_by_type_and_gp_index) + +#define hwloc_pci_discovery_init HWLOC_NAME(pci_discovery_init) +#define hwloc_pci_discovery_prepare HWLOC_NAME(pci_discovery_prepare) +#define hwloc_pci_discovery_exit HWLOC_NAME(pci_discovery_exit) +#define hwloc_find_insert_io_parent_by_complete_cpuset HWLOC_NAME(hwloc_find_insert_io_parent_by_complete_cpuset) + +#define hwloc__add_info HWLOC_NAME(_add_info) +#define hwloc__add_info_nodup HWLOC_NAME(_add_info_nodup) +#define hwloc__move_infos HWLOC_NAME(_move_infos) +#define hwloc__free_infos HWLOC_NAME(_free_infos) +#define hwloc__tma_dup_infos HWLOC_NAME(_tma_dup_infos) + +#define hwloc_binding_hooks HWLOC_NAME(binding_hooks) +#define hwloc_set_native_binding_hooks HWLOC_NAME(set_native_binding_hooks) +#define hwloc_set_binding_hooks HWLOC_NAME(set_binding_hooks) + +#define hwloc_set_linuxfs_hooks HWLOC_NAME(set_linuxfs_hooks) +#define hwloc_set_bgq_hooks HWLOC_NAME(set_bgq_hooks) +#define hwloc_set_solaris_hooks HWLOC_NAME(set_solaris_hooks) +#define hwloc_set_aix_hooks HWLOC_NAME(set_aix_hooks) +#define hwloc_set_windows_hooks HWLOC_NAME(set_windows_hooks) +#define hwloc_set_darwin_hooks HWLOC_NAME(set_darwin_hooks) +#define hwloc_set_freebsd_hooks HWLOC_NAME(set_freebsd_hooks) +#define hwloc_set_netbsd_hooks HWLOC_NAME(set_netbsd_hooks) +#define hwloc_set_hpux_hooks HWLOC_NAME(set_hpux_hooks) + +#define hwloc_look_hardwired_fujitsu_k HWLOC_NAME(look_hardwired_fujitsu_k) +#define hwloc_look_hardwired_fujitsu_fx10 HWLOC_NAME(look_hardwired_fujitsu_fx10) +#define hwloc_look_hardwired_fujitsu_fx100 HWLOC_NAME(look_hardwired_fujitsu_fx100) + +#define hwloc_add_uname_info HWLOC_NAME(add_uname_info) +#define hwloc_free_unlinked_object HWLOC_NAME(free_unlinked_object) +#define hwloc_free_object_and_children HWLOC_NAME(free_object_and_children) +#define hwloc_free_object_siblings_and_children HWLOC_NAME(free_object_siblings_and_children) + +#define hwloc_alloc_heap HWLOC_NAME(alloc_heap) +#define hwloc_alloc_mmap HWLOC_NAME(alloc_mmap) +#define hwloc_free_heap HWLOC_NAME(free_heap) +#define hwloc_free_mmap HWLOC_NAME(free_mmap) +#define hwloc_alloc_or_fail HWLOC_NAME(alloc_or_fail) + +#define hwloc_internal_distances_s HWLOC_NAME(internal_distances_s) +#define hwloc_internal_distances_init HWLOC_NAME(internal_distances_init) +#define hwloc_internal_distances_prepare HWLOC_NAME(internal_distances_prepare) +#define hwloc_internal_distances_dup HWLOC_NAME(internal_distances_dup) +#define hwloc_internal_distances_refresh HWLOC_NAME(internal_distances_refresh) +#define hwloc_internal_distances_destroy HWLOC_NAME(internal_distances_destroy) +#define hwloc_internal_distances_add HWLOC_NAME(internal_distances_add) +#define hwloc_internal_distances_add_by_index HWLOC_NAME(internal_distances_add_by_index) +#define hwloc_internal_distances_invalidate_cached_objs HWLOC_NAME(hwloc_internal_distances_invalidate_cached_objs) + +#define hwloc_internal_memattr_set_value HWLOC_NAME(internal_memattr_set_value) +#define hwloc_internal_memattr_s HWLOC_NAME(internal_memattr_s) +#define hwloc_internal_memattr_target_s HWLOC_NAME(internal_memattr_target_s) +#define hwloc_internal_memattr_initiator_s HWLOC_NAME(internal_memattr_initiator_s) +#define hwloc_internal_memattrs_init HWLOC_NAME(internal_memattrs_init) +#define hwloc_internal_memattrs_prepare HWLOC_NAME(internal_memattrs_prepare) +#define hwloc_internal_memattrs_dup HWLOC_NAME(internal_memattrs_dup) +#define hwloc_internal_memattrs_destroy HWLOC_NAME(internal_memattrs_destroy) +#define hwloc_internal_memattrs_need_refresh HWLOC_NAME(internal_memattrs_need_refresh) +#define hwloc_internal_memattrs_refresh HWLOC_NAME(internal_memattrs_refresh) +#define hwloc_internal_memattrs_guess_memory_tiers HWLOC_NAME(internal_memattrs_guess_memory_tiers) + +#define hwloc_internal_cpukind_s HWLOC_NAME(internal_cpukind_s) +#define hwloc_internal_cpukinds_init HWLOC_NAME(internal_cpukinds_init) +#define hwloc_internal_cpukinds_destroy HWLOC_NAME(internal_cpukinds_destroy) +#define hwloc_internal_cpukinds_dup HWLOC_NAME(internal_cpukinds_dup) +#define hwloc_internal_cpukinds_register HWLOC_NAME(internal_cpukinds_register) +#define hwloc_internal_cpukinds_rank HWLOC_NAME(internal_cpukinds_rank) +#define hwloc_internal_cpukinds_restrict HWLOC_NAME(internal_cpukinds_restrict) + +#define hwloc_encode_to_base64 HWLOC_NAME(encode_to_base64) +#define hwloc_decode_from_base64 HWLOC_NAME(decode_from_base64) + +#define hwloc_progname HWLOC_NAME(progname) + +#define hwloc__topology_disadopt HWLOC_NAME(_topology_disadopt) +#define hwloc__topology_dup HWLOC_NAME(_topology_dup) + +#define hwloc_tma HWLOC_NAME(tma) +#define hwloc_tma_malloc HWLOC_NAME(tma_malloc) +#define hwloc_tma_calloc HWLOC_NAME(tma_calloc) +#define hwloc_tma_strdup HWLOC_NAME(tma_strdup) +#define hwloc_bitmap_tma_dup HWLOC_NAME(bitmap_tma_dup) + +/* private/solaris-chiptype.h */ + +#define hwloc_solaris_chip_info_s HWLOC_NAME(solaris_chip_info_s) +#define hwloc_solaris_get_chip_info HWLOC_NAME(solaris_get_chip_info) + +#endif /* HWLOC_SYM_TRANSFORM */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_RENAME_H */ diff --git a/src/deps/hwloc/include/hwloc/rsmi.h b/src/deps/hwloc/include/hwloc/rsmi.h new file mode 100644 index 000000000..a9e9ad28f --- /dev/null +++ b/src/deps/hwloc/include/hwloc/rsmi.h @@ -0,0 +1,207 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2012-2023 Inria. All rights reserved. + * Copyright (c) 2020, Advanced Micro Devices, Inc. All rights reserved. + * Written by Advanced Micro Devices, + * See COPYING in top-level directory. + */ + +/** \file + * \brief Macros to help interaction between hwloc and the ROCm SMI Management Library. + * + * Applications that use both hwloc and the ROCm SMI Management Library may want to + * include this file so as to get topology information for AMD GPU devices. + */ + +#ifndef HWLOC_RSMI_H +#define HWLOC_RSMI_H + +#include "hwloc.h" +#include "hwloc/autogen/config.h" +#include "hwloc/helper.h" +#ifdef HWLOC_LINUX_SYS +#include "hwloc/linux.h" +#endif + +#include + + +#ifdef __cplusplus +extern "C" { +#endif + + +/** \defgroup hwlocality_rsmi Interoperability with the ROCm SMI Management Library + * + * This interface offers ways to retrieve topology information about + * devices managed by the ROCm SMI Management Library. + * + * @{ + */ + +/** \brief Get the CPU set of logical processors that are physically + * close to AMD GPU device whose index is \p dv_ind. + * + * Store in \p set the CPU-set describing the locality of the AMD GPU device + * whose index is \p dv_ind. + * + * Topology \p topology and device \p dv_ind must match the local machine. + * I/O devices detection and the ROCm SMI component are not needed in the + * topology. + * + * The function only returns the locality of the device. + * If more information about the device is needed, OS objects should + * be used instead, see hwloc_rsmi_get_device_osdev() + * and hwloc_rsmi_get_device_osdev_by_index(). + * + * This function is currently only implemented in a meaningful way for + * Linux; other systems will simply get a full cpuset. + * + * \return 0 on success. + * \return -1 on error, for instance if device information could not be found. + */ +static __hwloc_inline int +hwloc_rsmi_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused, + uint32_t dv_ind, hwloc_cpuset_t set) +{ +#ifdef HWLOC_LINUX_SYS + /* If we're on Linux, use the sysfs mechanism to get the local cpus */ +#define HWLOC_RSMI_DEVICE_SYSFS_PATH_MAX 128 + char path[HWLOC_RSMI_DEVICE_SYSFS_PATH_MAX]; + rsmi_status_t ret; + uint64_t bdfid = 0; + unsigned domain, device, bus; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return -1; + } + + ret = rsmi_dev_pci_id_get(dv_ind, &bdfid); + if (RSMI_STATUS_SUCCESS != ret) { + errno = EINVAL; + return -1; + } + domain = (bdfid>>32) & 0xffffffff; + bus = ((bdfid & 0xffff)>>8) & 0xff; + device = ((bdfid & 0xff)>>3) & 0x1f; + + sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.0/local_cpus", domain, bus, device); + if (hwloc_linux_read_path_as_cpumask(path, set) < 0 + || hwloc_bitmap_iszero(set)) + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#else + /* Non-Linux systems simply get a full cpuset */ + hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology)); +#endif + return 0; +} + +/** \brief Get the hwloc OS device object corresponding to the + * AMD GPU device whose index is \p dv_ind. + * + * \return The hwloc OS device object describing the AMD GPU device whose + * index is \p dv_ind. + * \return \c NULL if none could be found. + * + * The topology \p topology does not necessarily have to match the current + * machine. For instance the topology may be an XML import of a remote host. + * I/O devices detection and the ROCm SMI component must be enabled in the + * topology. + * + * \note The corresponding PCI device object can be obtained by looking + * at the OS device parent object (unless PCI devices are filtered out). + */ +static __hwloc_inline hwloc_obj_t +hwloc_rsmi_get_device_osdev_by_index(hwloc_topology_t topology, uint32_t dv_ind) +{ + hwloc_obj_t osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + if (HWLOC_OBJ_OSDEV_GPU == osdev->attr->osdev.type + && osdev->name + && !strncmp("rsmi", osdev->name, 4) + && atoi(osdev->name + 4) == (int) dv_ind) + return osdev; + } + return NULL; +} + +/** \brief Get the hwloc OS device object corresponding to AMD GPU device, + * whose index is \p dv_ind. + * + * \return The hwloc OS device object that describes the given + * AMD GPU, whose index is \p dv_ind. + * \return \c NULL if none could be found. + * + * Topology \p topology and device \p dv_ind must match the local machine. + * I/O devices detection and the ROCm SMI component must be enabled in the + * topology. If not, the locality of the object may still be found using + * hwloc_rsmi_get_device_cpuset(). + * + * \note The corresponding hwloc PCI device may be found by looking + * at the result parent pointer (unless PCI devices are filtered out). + */ +static __hwloc_inline hwloc_obj_t +hwloc_rsmi_get_device_osdev(hwloc_topology_t topology, uint32_t dv_ind) +{ + hwloc_obj_t osdev; + rsmi_status_t ret; + uint64_t bdfid = 0; + unsigned domain, device, bus, func; + uint64_t id; + char uuid[64]; + + if (!hwloc_topology_is_thissystem(topology)) { + errno = EINVAL; + return NULL; + } + + ret = rsmi_dev_pci_id_get(dv_ind, &bdfid); + if (RSMI_STATUS_SUCCESS != ret) { + errno = EINVAL; + return NULL; + } + domain = (bdfid>>32) & 0xffffffff; + bus = ((bdfid & 0xffff)>>8) & 0xff; + device = ((bdfid & 0xff)>>3) & 0x1f; + func = bdfid & 0x7; + + ret = rsmi_dev_unique_id_get(dv_ind, &id); + if (RSMI_STATUS_SUCCESS != ret) + uuid[0] = '\0'; + else + sprintf(uuid, "%lx", id); + + osdev = NULL; + while ((osdev = hwloc_get_next_osdev(topology, osdev)) != NULL) { + hwloc_obj_t pcidev = osdev->parent; + const char *info; + + if (strncmp(osdev->name, "rsmi", 4)) + continue; + + if (pcidev + && pcidev->type == HWLOC_OBJ_PCI_DEVICE + && pcidev->attr->pcidev.domain == domain + && pcidev->attr->pcidev.bus == bus + && pcidev->attr->pcidev.dev == device + && pcidev->attr->pcidev.func == func) + return osdev; + + info = hwloc_obj_get_info_by_name(osdev, "AMDUUID"); + if (info && !strcmp(info, uuid)) + return osdev; + } + + return NULL; +} + +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_RSMI_H */ diff --git a/src/deps/hwloc/include/hwloc/shmem.h b/src/deps/hwloc/include/hwloc/shmem.h new file mode 100644 index 000000000..f35565a6b --- /dev/null +++ b/src/deps/hwloc/include/hwloc/shmem.h @@ -0,0 +1,143 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2013-2023 Inria. All rights reserved. + * See COPYING in top-level directory. + */ + +/** \file + * \brief Sharing topologies between processes + */ + +#ifndef HWLOC_SHMEM_H +#define HWLOC_SHMEM_H + +#include "hwloc.h" + +#ifdef __cplusplus +extern "C" { +#elif 0 +} +#endif + + +/** \defgroup hwlocality_shmem Sharing topologies between processes + * + * These functions are used to share a topology between processes by + * duplicating it into a file-backed shared-memory buffer. + * + * The master process must first get the required shared-memory size + * for storing this topology with hwloc_shmem_topology_get_length(). + * + * Then it must find a virtual memory area of that size that is available + * in all processes (identical virtual addresses in all processes). + * On Linux, this can be done by comparing holes found in /proc/\/maps + * for each process. + * + * Once found, it must open a destination file for storing the buffer, + * and pass it to hwloc_shmem_topology_write() together with + * virtual memory address and length obtained above. + * + * Other processes may then adopt this shared topology by opening the + * same file and passing it to hwloc_shmem_topology_adopt() with the + * exact same virtual memory address and length. + * + * @{ + */ + +/** \brief Get the required shared memory length for storing a topology. + * + * This length (in bytes) must be used in hwloc_shmem_topology_write() + * and hwloc_shmem_topology_adopt() later. + * + * \return the length, or -1 on error, for instance if flags are invalid. + * + * \note Flags \p flags are currently unused, must be 0. + */ +HWLOC_DECLSPEC int hwloc_shmem_topology_get_length(hwloc_topology_t topology, + size_t *lengthp, + unsigned long flags); + +/** \brief Duplicate a topology to a shared memory file. + * + * Temporarily map a file in virtual memory and duplicate the + * topology \p topology by allocating duplicates in there. + * + * The segment of the file pointed by descriptor \p fd, + * starting at offset \p fileoffset, and of length \p length (in bytes), + * will be temporarily mapped at virtual address \p mmap_address + * during the duplication. + * + * The mapping length \p length must have been previously obtained with + * hwloc_shmem_topology_get_length() + * and the topology must not have been modified in the meantime. + * + * \note Flags \p flags are currently unused, must be 0. + * + * \note The object userdata pointer is duplicated but the pointed buffer + * is not. However the caller may also allocate it manually in shared memory + * to share it as well. + * + * \return 0 on success. + * \return -1 with errno set to \c EBUSY if the virtual memory mapping defined + * by \p mmap_address and \p length isn't available in the process. + * \return -1 with errno set to \c EINVAL if \p fileoffset, \p mmap_address + * or \p length aren't page-aligned. + */ +HWLOC_DECLSPEC int hwloc_shmem_topology_write(hwloc_topology_t topology, + int fd, hwloc_uint64_t fileoffset, + void *mmap_address, size_t length, + unsigned long flags); + +/** \brief Adopt a shared memory topology stored in a file. + * + * Map a file in virtual memory and adopt the topology that was previously + * stored there with hwloc_shmem_topology_write(). + * + * The returned adopted topology in \p topologyp can be used just like any + * topology. And it must be destroyed with hwloc_topology_destroy() as usual. + * + * However the topology is read-only. + * For instance, it cannot be modified with hwloc_topology_restrict() + * and object userdata pointers cannot be changed. + * + * The segment of the file pointed by descriptor \p fd, + * starting at offset \p fileoffset, and of length \p length (in bytes), + * will be mapped at virtual address \p mmap_address. + * + * The file pointed by descriptor \p fd, the offset \p fileoffset, + * the requested mapping virtual address \p mmap_address and the length \p length + * must be identical to what was given to hwloc_shmem_topology_write() earlier. + * + * \note Flags \p flags are currently unused, must be 0. + * + * \note The object userdata pointer should not be used unless the process + * that created the shared topology also placed userdata-pointed buffers + * in shared memory. + * + * \note This function takes care of calling hwloc_topology_abi_check(). + * + * \return 0 on success. + * + * \return -1 with errno set to \c EBUSY if the virtual memory mapping defined + * by \p mmap_address and \p length isn't available in the process. + * + * \return -1 with errno set to \c EINVAL if \p fileoffset, \p mmap_address + * or \p length aren't page-aligned, or do not match what was given to + * hwloc_shmem_topology_write() earlier. + * + * \return -1 with errno set to \c EINVAL if the layout of the topology structure + * is different between the writer process and the adopter process. + */ +HWLOC_DECLSPEC int hwloc_shmem_topology_adopt(hwloc_topology_t *topologyp, + int fd, hwloc_uint64_t fileoffset, + void *mmap_address, size_t length, + unsigned long flags); +/** @} */ + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + + +#endif /* HWLOC_SHMEM_H */ diff --git a/src/deps/hwloc/linux/build_hwloc.sh b/src/deps/hwloc/linux/build_hwloc.sh new file mode 100755 index 000000000..d0d80e0ec --- /dev/null +++ b/src/deps/hwloc/linux/build_hwloc.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# Copyright (C) 2026 Intel Corporation +# Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Builds the static hwloc library bundled with UMF for Linux x86-64 and copies +# it, together with its headers, into src/deps/hwloc. Keep the configure +# options in sync with the hwloc ExternalProject in the top-level CMakeLists.txt. + +set -euo pipefail + +HWLOC_REPO=${HWLOC_REPO:-https://github.com/open-mpi/hwloc.git} +HWLOC_TAG=${HWLOC_TAG:-hwloc-2.13.0} + +SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +DEPS_DIR=$(dirname "$SCRIPT_DIR") +UMF_ROOT=$(cd "$SCRIPT_DIR/../../../.." && pwd) +TEMP_DIR="$SCRIPT_DIR/temp" +SRC_DIR="$TEMP_DIR/src" +INSTALL_DIR="$TEMP_DIR/install" + +if [ "$(uname -m)" != "x86_64" ]; then + echo "Error: the bundled hwloc is built only for x86-64" >&2 + exit 1 +fi + +rm -rf "$TEMP_DIR" +trap 'rm -rf "$TEMP_DIR"' EXIT + +git clone --depth 1 --branch "$HWLOC_TAG" "$HWLOC_REPO" "$SRC_DIR" +git -C "$SRC_DIR" apply "$UMF_ROOT/cmake/fix_coverity_issues.patch" + +cd "$SRC_DIR" +./autogen.sh +# -ffile-prefix-map keeps local build paths out of the committed archive +HWLOC_FLAGS="-O2 -fPIC -ffile-prefix-map=$SRC_DIR=hwloc" +./configure --prefix="$INSTALL_DIR" --runstatedir=/run \ + --enable-static=yes --enable-shared=no \ + --with-hwloc-symbol-prefix=umf_hwloc_ --disable-libxml2 \ + --disable-pci --disable-levelzero --disable-opencl \ + --disable-cuda --disable-nvml --disable-libudev --disable-rsmi \ + CFLAGS="$HWLOC_FLAGS" CXXFLAGS="$HWLOC_FLAGS" +make -j "$(nproc)" +make install + +unprefixed=$(nm -g --defined-only "$INSTALL_DIR/lib/libhwloc.a" | + awk 'NF == 3 {print $3}' | grep -v '^umf_hwloc_' || true) +if [ -n "$unprefixed" ]; then + echo "Error: hwloc defines symbols without the umf_hwloc_ prefix:" >&2 + echo "$unprefixed" >&2 + exit 1 +fi + +cp "$INSTALL_DIR/lib/libhwloc.a" "$SCRIPT_DIR/" +mkdir -p "$SCRIPT_DIR/include/hwloc/autogen" +cp "$INSTALL_DIR/include/hwloc/autogen/config.h" \ + "$SCRIPT_DIR/include/hwloc/autogen/" +mkdir -p "$DEPS_DIR/include/hwloc" +cp "$INSTALL_DIR/include/hwloc.h" "$DEPS_DIR/include/" +cp "$INSTALL_DIR"/include/hwloc/*.h "$DEPS_DIR/include/hwloc/" + +echo "Bundled hwloc ($HWLOC_TAG) updated in $DEPS_DIR" diff --git a/src/deps/hwloc/linux/include/hwloc/autogen/config.h b/src/deps/hwloc/linux/include/hwloc/autogen/config.h new file mode 100644 index 000000000..e44cb48aa --- /dev/null +++ b/src/deps/hwloc/linux/include/hwloc/autogen/config.h @@ -0,0 +1,243 @@ +/* include/hwloc/autogen/config.h. Generated from config.h.in by configure. */ +/* -*- c -*- + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2022 Inria. All rights reserved. + * Copyright © 2009-2012 Université Bordeaux + * Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/* The configuration file */ + +#ifndef HWLOC_CONFIG_H +#define HWLOC_CONFIG_H + +#define HWLOC_VERSION "2.13.0rc2-git" +#define HWLOC_VERSION_MAJOR 2 +#define HWLOC_VERSION_MINOR 13 +#define HWLOC_VERSION_RELEASE 0 +#define HWLOC_VERSION_GREEK "rc2" + +/* #undef HWLOC_PCI_COMPONENT_BUILTIN */ +/* #undef HWLOC_OPENCL_COMPONENT_BUILTIN */ +/* #undef HWLOC_CUDA_COMPONENT_BUILTIN */ +/* #undef HWLOC_NVML_COMPONENT_BUILTIN */ +/* #undef HWLOC_RSMI_COMPONENT_BUILTIN */ +/* #undef HWLOC_LEVELZERO_COMPONENT_BUILTIN */ +/* #undef HWLOC_GL_COMPONENT_BUILTIN */ +/* #undef HWLOC_XML_LIBXML_COMPONENT_BUILTIN */ + +#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) +# define __hwloc_restrict __restrict +#else +# if __STDC_VERSION__ >= 199901L +# define __hwloc_restrict restrict +# else +# define __hwloc_restrict +# endif +#endif + +/* Note that if we're compiling C++, then just use the "inline" + keyword, since it's part of C++ */ +#if defined(c_plusplus) || defined(__cplusplus) +# define __hwloc_inline inline +#elif defined(_MSC_VER) || defined(__HP_cc) +# define __hwloc_inline __inline +#else +# define __hwloc_inline __inline__ +#endif + +/* + * Note: this is public. We can not assume anything from the compiler used + * by the application and thus the HWLOC_HAVE_* macros below are not + * fetched from the autoconf result here. We only automatically use a few + * well-known easy cases. + */ + +/* Some handy constants to make the logic below a little more readable */ +#if defined(__cplusplus) && \ + (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR >= 4)) +#define GXX_ABOVE_3_4 1 +#else +#define GXX_ABOVE_3_4 0 +#endif + +#if !defined(__cplusplus) && \ + (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) +#define GCC_ABOVE_2_95 1 +#else +#define GCC_ABOVE_2_95 0 +#endif + +#if !defined(__cplusplus) && \ + (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) +#define GCC_ABOVE_2_96 1 +#else +#define GCC_ABOVE_2_96 0 +#endif + +#if !defined(__cplusplus) && \ + (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) +#define GCC_ABOVE_3_3 1 +#else +#define GCC_ABOVE_3_3 0 +#endif + +#if !defined(__cplusplus) && \ + (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +#define GCC_ABOVE_3_4 1 +#else +#define GCC_ABOVE_3_4 0 +#endif + +/* Maybe before gcc 2.95 too */ +#ifdef HWLOC_HAVE_ATTRIBUTE_UNUSED +#define __HWLOC_HAVE_ATTRIBUTE_UNUSED HWLOC_HAVE_ATTRIBUTE_UNUSED +#elif defined(__GNUC__) +# define __HWLOC_HAVE_ATTRIBUTE_UNUSED (GXX_ABOVE_3_4 || GCC_ABOVE_2_95) +#else +# define __HWLOC_HAVE_ATTRIBUTE_UNUSED 0 +#endif +#if __HWLOC_HAVE_ATTRIBUTE_UNUSED +# define __hwloc_attribute_unused __attribute__((__unused__)) +#else +# define __hwloc_attribute_unused +#endif + +#ifdef HWLOC_HAVE_ATTRIBUTE_MALLOC +#define __HWLOC_HAVE_ATTRIBUTE_MALLOC HWLOC_HAVE_ATTRIBUTE_MALLOC +#elif defined(__GNUC__) +# define __HWLOC_HAVE_ATTRIBUTE_MALLOC (GXX_ABOVE_3_4 || GCC_ABOVE_2_96) +#else +# define __HWLOC_HAVE_ATTRIBUTE_MALLOC 0 +#endif +#if __HWLOC_HAVE_ATTRIBUTE_MALLOC +# define __hwloc_attribute_malloc __attribute__((__malloc__)) +#else +# define __hwloc_attribute_malloc +#endif + +#ifdef HWLOC_HAVE_ATTRIBUTE_CONST +#define __HWLOC_HAVE_ATTRIBUTE_CONST HWLOC_HAVE_ATTRIBUTE_CONST +#elif defined(__GNUC__) +# define __HWLOC_HAVE_ATTRIBUTE_CONST (GXX_ABOVE_3_4 || GCC_ABOVE_2_95) +#else +# define __HWLOC_HAVE_ATTRIBUTE_CONST 0 +#endif +#if __HWLOC_HAVE_ATTRIBUTE_CONST +# define __hwloc_attribute_const __attribute__((__const__)) +#else +# define __hwloc_attribute_const +#endif + +#ifdef HWLOC_HAVE_ATTRIBUTE_PURE +#define __HWLOC_HAVE_ATTRIBUTE_PURE HWLOC_HAVE_ATTRIBUTE_PURE +#elif defined(__GNUC__) +# define __HWLOC_HAVE_ATTRIBUTE_PURE (GXX_ABOVE_3_4 || GCC_ABOVE_2_96) +#else +# define __HWLOC_HAVE_ATTRIBUTE_PURE 0 +#endif +#if __HWLOC_HAVE_ATTRIBUTE_PURE +# define __hwloc_attribute_pure __attribute__((__pure__)) +#else +# define __hwloc_attribute_pure +#endif + +#ifndef __hwloc_attribute_deprecated /* allow the user to disable these warnings by defining this macro to nothing */ +#ifdef HWLOC_HAVE_ATTRIBUTE_DEPRECATED +#define __HWLOC_HAVE_ATTRIBUTE_DEPRECATED HWLOC_HAVE_ATTRIBUTE_DEPRECATED +#elif defined(__GNUC__) +# define __HWLOC_HAVE_ATTRIBUTE_DEPRECATED (GXX_ABOVE_3_4 || GCC_ABOVE_3_3) +#else +# define __HWLOC_HAVE_ATTRIBUTE_DEPRECATED 0 +#endif +#if __HWLOC_HAVE_ATTRIBUTE_DEPRECATED +# define __hwloc_attribute_deprecated __attribute__((__deprecated__)) +#else +# define __hwloc_attribute_deprecated +#endif +#endif + +#ifdef HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS +#define __HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS +#elif defined(__GNUC__) +# define __HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS (GXX_ABOVE_3_4 || GCC_ABOVE_3_3) +#else +# define __HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS 0 +#endif +#if __HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS +# define __hwloc_attribute_may_alias __attribute__((__may_alias__)) +#else +# define __hwloc_attribute_may_alias +#endif + +#ifdef HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT +#define __HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT +#elif defined(__GNUC__) +# define __HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT (GXX_ABOVE_3_4 || GCC_ABOVE_3_4) +#else +# define __HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT 0 +#endif +#if __HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT +# define __hwloc_attribute_warn_unused_result __attribute__((__warn_unused_result__)) +#else +# define __hwloc_attribute_warn_unused_result +#endif + +#ifdef HWLOC_C_HAVE_VISIBILITY +# if HWLOC_C_HAVE_VISIBILITY +# define HWLOC_DECLSPEC __attribute__((__visibility__("default"))) +# else +# define HWLOC_DECLSPEC +# endif +#else +# define HWLOC_DECLSPEC +#endif + +/* Defined to 1 on Linux */ +#define HWLOC_LINUX_SYS 1 + +/* Defined to 1 if the CPU_SET macro works */ +#define HWLOC_HAVE_CPU_SET 1 + +/* Defined to 1 if you have the `windows.h' header. */ +/* #undef HWLOC_HAVE_WINDOWS_H */ +#define hwloc_pid_t pid_t +#define hwloc_thread_t pthread_t + +#ifdef HWLOC_HAVE_WINDOWS_H + +# include +typedef DWORDLONG hwloc_uint64_t; + +#else /* HWLOC_HAVE_WINDOWS_H */ + +# ifdef hwloc_thread_t +# include +# endif /* hwloc_thread_t */ + +/* Defined to 1 if you have the header file. */ +# define HWLOC_HAVE_STDINT_H 1 + +# include +# ifdef HWLOC_HAVE_STDINT_H +# include +# endif +typedef uint64_t hwloc_uint64_t; + +#endif /* HWLOC_HAVE_WINDOWS_H */ + +/* Define to 1 if --enable-32bits-pci-domain is called. */ +/* #undef HWLOC_HAVE_32BITS_PCI_DOMAIN */ + +/* Whether we need to re-define all the hwloc public symbols or not */ +#define HWLOC_SYM_TRANSFORM 1 + +/* The hwloc symbol prefix */ +#define HWLOC_SYM_PREFIX umf_hwloc_ + +/* The hwloc symbol prefix in all caps */ +#define HWLOC_SYM_PREFIX_CAPS UMF_HWLOC_ + +#endif /* HWLOC_CONFIG_H */ diff --git a/src/deps/hwloc/linux/libhwloc.a b/src/deps/hwloc/linux/libhwloc.a new file mode 100644 index 0000000000000000000000000000000000000000..71cfd1a4f746fbe79d093f4c1579c25146c70325 GIT binary patch literal 740764 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©+HcU-s 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

Ei&Gvpjz$OP+%{IK`vHYVEwx3V)!+Loa!|caF@p zQJFDwdbk-|<})M1_&rD2l1gszxvuc@lZBsc&M`kCJHK9p2>)ydp8xRbcU~1gj0)=c zIfLN%n2(#z@awXhh>u#~r$Sofr$Tn%Tch3$mjzK8{8kELeY50Pwvl<9847m-Ykx#< z0_PE$r{PUX;okEZcL>Gt?`j8P4jsT^FI|KEmBIWS-3qx^RtBF`8Z10Ja-sdir4)B! zmf^;0oS#>NHC?Vxj2P)}il(c$CYJJz%q}FP?%xhkVSj%HAD$45oU}*mn5t|{jc?`G zb`fF!T>S`z?cBV8AnP7}s_6UY>g6L3lZm&6$%hNOh4z$kjg$8)}DPH*>f{V9ZP2!5m{pATU!&M7ca-p!>%e>ps7 z{dwWo5nGfKKZ$!8oUS1?BMIoeVg=g~o^-Y&cz$05`y44$*(=d3om@qFkn_EemLp*! z{X-zR()zZr2eZI9aO30TZwG@Bx+v?RZ1XgVZ}ay!CqpYVpA*M#jC_q>_N5EOr0~K{ zJB|RATj0GYP?}BMXQ7o~{F|^>oC~RXAOni6G3Bx}TTdKo9=|57qfh>j39nHzGlY?2|F|3kN%9 zB2l7tQpb?>5RXFFYPAemi!qbq?o};{{94UawZUmLN8AXUhOHO0<_KZ@(2PEyTL1+A zdAMEz@MPBY)Bc$pea)Mc8k(p4Qi+ibYv2WbV&Lm4*vJ#TsOBG_bkhB`X!0WCuVNI7>@Ad=?=P}Go@XOzKp6Q? zM{JJF9kKn?t+$pgE~pjO6doF2Nhy&Iet0aeUwR9lI>-l3soIz~gq<)P6izi0%=cE=Kx)vumq0&amw#u@77) zu`XJsb?Z?F@9)vl#%tP)Lc2?D@_Vbu&0L_Um8kLIybfLV<5D`5Tg2Yx_(@vb)e;YW znTh^UK_U*eE%hYIWeeJ!IRX}`g1>TFX|T2#0ut%_%$`2bi0;^!_+bv8}Tqi zMx_y-r47qwuBW`SH*LpbG_w#rn*UgSY9UP4KEz=Wt*w}kcVsSU=naRPsc`-5X>Pme_M7rl8v{MWGVTN^Xn%|L z4>wQI&<0r7Obrt7hW1}XP<~Zj9gu<7W~ArTc>D%lB8@9^aK`0m$P3ddy%u_kebXKk zi)qJ62%65GmYlu6)sNNX+YlHB(^x4L{>9G1>&f22$(p+jjRUSzQ~2t%RcdWs($p_c zWF*6AOC2j$%&EO~gz2vL=y+DZlwXj6$109c0bJ}XdB7D1++ih)wo;^`FP7O0XAM1Y zWLY?N^dLK+>&Tt=smV#y9L8W4^e8_%(`G!yws#uL&ag4I*BF_rfwvtdJ>r!2r_N&CirK!=3faD=)~fJF6jM7 zAV85CpDg%(RCY=q@z_GKSTLvjeK+>e4m_oga#}u`(J>ZE??=#SN{>V3ev$1aBg6Gt z&Kw)uT^~kfF1g1~8oNdoi-McTPM%rprv*}K7_FF@gE#a~M&rRKZfeBzd$JunouxBL z-$_4!1r;c)RFx>i2ZO$`zg)>1zy&k+H6Y3S1a~jc)7DMPIh7VBc*q}2(|dEIk$4C( z?M$9VB}FzmvTHQ%XDCK`hgy;aWn(6GKJr&f+TpM~Wy~z-Jd!>4W6h6dBzFYXm9*Uk zOa9z*m_p*b?39{qV$F^~&2nFd$#wP<$k{8n7uV4@#sYQikL#t5_&EeUpd0CbfiAfA zn%fpc9;!C7Mw9U01ATyK3bLK!$tHZwV!7^ml%qcG7!S?o&$;f#4>Ud~v^5JdXQBUt zWJPbMgmU7JVtGg#!d;Zu`{Q7C` zw~)N+uS}J9GwFPRbe<<#QG56a-vGEWDY+48#%542)JPi6v1NI@t!40Pi1)!f-sKLS z8U@)8a!0-94?FlBag&_c*tKJgm%!+Fj>L-_4qv_-|+Z{?x1tZo%NFg7x~Z zwNDsO3gH$zR5CC286mxV{@ghL=i95$Hp9X|VA7?X%4(~J7E#wO>+0)H^9J;T88`_j zLUub0wMgO!j!`Ybq&=MjeawBZK%Y79cJ)1X2f9624`P#y7_lz>Q`MWV0*7(

2o^d8_H#A1d^1Xo#AD$+`5Up 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%0DmC>-);D}9j%fJnPftzW5}WWYYkqh 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ऎy;W=#Z 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 z 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ȴFa`0kF63Gh7~9~a;;$0r4N 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 R_*ER#B0QoGssEYr{|f_`#+m>C literal 0 HcmV?d00001 diff --git a/src/deps/hwloc/windows/hwloc.lib b/src/deps/hwloc/windows/hwloc.lib new file mode 100644 index 0000000000000000000000000000000000000000..1310b95cc917b74b1d25c8e7a410b3b28fee4b22 GIT binary patch literal 1024120 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

xwQa9Xql2IbRIEwq@h-9u4T06@7G(XRP1z`Z z#U*l!y>0AdyUpw(9VIplyA9FSBx}4oB~`tO{2|w62G3GDPTK08!Eth6$&L1KVGVi# zCXwQi*Nkd<^jK8zX`n;}=cLd|v3TVs5|gTajx!o~#+TD#t4L{u;*YrTI&#Z8OFvGm zmQXs|B~6NVCplDh+g$M*f|J%yM$)37Od3|iuU}R zrEiYLhQA*$iu4JJIDg=Ri|wsrpH zaW!JJi#Ab(K0y&Dt%gS`5z!_kI%I8b8gbu@R#=Z1gD^glU91ci8G_7i2^!U{NX#Tdk79e5l1({(Ylq=nz!2(CC-oI z1)W1s#BqV(z@e))qeZP8;>WRB=MWTe3}B94@IK5D{gkLT5F*WjB6&kt-hil9O4RHN8K`kktiZ+SRIJWHDEbv%?FuD(ILnTRX|2R8 z=9Jd9sucL!G&cNw2_KOvL6Kg13_emB5ErGyx!NcfWOY2=;$xyRPglF zDe9*LH|dCg9PJ9FCrRj$5G_?yV|{566loT6NhY5Jl3bzWUcquB@P@XIGoz11)wQWL zRf;mA`lVejgAh3v6y@A5Qq;YT(%scj=>Q+4^=y%Ajg!hi;3@xtqWlX^uD_6>U7>VL z6FMYBlS{ewr9)7pS;(cEGj`ef#D5HHZ>rA}G@8ZdL;QBC&SS5egwe zP$Ypi@Q{Y6NF{2msZQ&sC`P;903o;pMRBFVBHh|3-CR*9(T*t54$Po&QW*$5m7}1j z6$nm3eTk2DiFmT8peTNw&>3}+{^>`Y0SDl;kD!8e~6WoMq@0YqzdL9ybfTT;4OS$%? zMNpJ$A(vzhYew$lEH|PX(vH^Kt+-RIxw1o1%%b+`q{rgNy#?Pz?gd3@c$&Ef#F~`Y zlW4u)n~6#1qLc_MmAatF5`v3lpYp4Pq2#|HjM-{bQ z)P^}z5KH;pfsaUr4Os2k%Au44L6NNgiqv#$t#q6iUB{B*1^y!OhwrqMB2pnJ;;d%Q z0ez#Cz9&tJ8MEN%9WiKg?U_U4CYuW$s(pf@+9$XPb(LQVL+RNg^Z-ehCYN&ION*eW z9E4nwxuhAnAF){?Z#0M2-bTIsQqcsArVYb9Ohhxfmr1Wo|-0OP9t? zxfDE9-h!g?7TkoQveK?ldVUppsGorj1v(Vc0iATUOb_YkO*40Sh0=3E>Jbo4E?G;U zDbIo;3ybuV%!`_ldzR()8q!+n9+9HJkE=ALLjbNi#87?MfsbgN{+@d!hmw9lk^V-J z#wpRtl#`b$!#=q}>F=6?o_?}oO0**$zBu0%g{)nPPozTD7L)~)kU*&Pwz$cw5`RVc z3W{`L3WBf!py<-%8q-sW7@UvAUC1Sw>zk3=p5=y`z0E}Kw5tk)NRgl@MV$nv-%RHc z4UWInI)|W$qle(&`CeOnzL(?2Ma@I#5fpLt6*;FlSXLXxY8(_RaFl03Q3(nTLOp|z zc7>8XNXV8DO)gp0r{AYR$R(MyBA{KNxgd#FDqPps<*JGe(ad5v>d^8Cm2W?8Xzbej+Co zy7RLv1%)n4adu{wg(N`(vsrSW%`&(oj5t3bA<{M2?bB_+%ZrQivP)W!#1)poe*Y(2 z?*BC?*#$#fNMk`3K$mF$EqMioOk9F|x!lDCWQ_O{SYcB7oVnQrS%t+4Oo1k%%#~(7r2*YDwFUl zJ^9%y_^%rUG^ZfXr9h}VKUK>DJi}|AI-?YM!AcW#tuvx3G963SfeB#nz{ee{)T8>8O4^Iv#)X?h7Ay zYS+WJC?oSbWqxtAUH3;uyw%Hca_zlO-kQ^S*DtgFnfU(5qYq6?IH3J4NbQ+={ghVO zy%vwWXylj^`xoAQV)Brvhxb2q>!#NqsxRw*{q4Q>_j&57!`Aul-a9C*GUm?%V_&gk z#4h|@nKS-|v(NPHU-0zD%ZqQ$n^qHd;?>%{C$+z^cYSlqA1{12xMt#4&fD+XdRy(r zPufoFHlk}?`_gNFxaWaiI(*Tt?{}B?zhzcRyH{V|_{npZ%)P06?~7?)Z~5StUyi?W zi%a|4_wirf9@xfn_Q#~5AOG;o>c@|L_Uy2+OK&Q=YJc?=(OYMIHMj7<>gdr`hlYML zz_Me|)THtC&-{>a$Ml~Tu3VOXs_(UF2`**pnC{afzpUIor}CTE_PliJ)f;yXKDf2< z+5Zm9vJW`Z&6)ky(=&2v?%lfisXrUr+i zZ605H&);0#QefJI4svGXR;M3*L-_@o5;x5&{e>?C>E#C9+b;p(8iq>iJj+FlL&5n85FSpzL zXx6u_eqYeJa(8}XO48mW`+_*3*f^rGW$n;qY&?U&(fw5ws=)Zz2yjxC&!K6AnJCq~+$ z)vgCl+JA{1v--!@$0M_PKYuJSp>yMJhiBGp`nKC`S7tr*=-OBBS>Mn7?4S0=9dqt9 zT`}Ru%5|3Q4_w>PG4g>&hkW+LT6;TpQo^6tz5VXRKW#gEW>lx&{B6_TOR#j!tR3MMY*qJ?)>ka zzwIj>ws2tYoA+iHy&iklmKRcr|NL`Z+tLlMADg-5w-FyjC*E?~$p?>Jy?OTI|8#s~ z&x*}+uH1Ha?}r}!&%i}jXWa0gv)PZ_o>ckLdn0z%O=yVz$MH@3G0qnwweQwtA9rrJ z!u^OR;q%S!T~__DcWCiXtAFk{^`0B9ersd8YU#0l!tr0MW1d@i$>3))AG+!EJ0rH7 z{Q8OMD_!oJ?&|#W@2_k4n+E>at;-9qJXKP@YSddd)y&oKXZE!z>^C$mqsy^7hAv!m z>VkrY&mTWtG5V@!hTR=q+V9K1HvMYKEc)rv*S=```?^2p_gQ-J+z0;Czk8n-XMG&G z&w6=>U4OjN`Ths4sbBlV=plRGovS{!Zut2Zqu=cETlVm0`kPmri?}X1=A(uQ<_~*4 zxv{45Zrgzz%YZfQKiq%2<>0>u6?HMqkDWd~^U~{we{u4IC-0w9)Ahx_XaBIK$H-T! z{<^tskEdFl9;!^f!Mo$s)dL4EDDLfk;lNL&Z@u>1#;b37=-#9M>-0zCH(xD(?()2@ zm;7tukjTS1*^briek?6`<=rFe{@dlz3kH3&Y5cX%uJ69kk+A_~ha1C;fNR zRa$*sQ8nkc*6JUlwEDQ}xBuMLZ_nPx@>adOrNVUECle;Vb9nNh%d0w{`S-tX9p7*| ze#@rkUmJGe#^+16tvXP-A@@YbzisjJ+jUJ`xizKSTGP;H(2#Qv9l7e)`v*P}-S>l) zpS|s{T@v5xfnPIRUA+tLS^KYkRdaLR7_uv?Zb)@@?;jpZ{lHooxB2+b^-*69oHqE_ z<@0~3yZ7X<9*?~A?y2XZU;g+=_4+rLU;V?kIrm@j{WU$h#sB-zeGwOZYx?WGtFl&4 zJX16A!CUSW#6>$#=48|e)-YkL+jf= zwqt0or#}75v;M&++IC!ecFUBl&%9sT`f11gv*W(#zWVEY@0&jr%`-he`O%*qv)hHFGt_G0(axLFhkR}Gjq4Ds~E{}*madSpZ{ z?j-Tmf4cvPKk_1PkuJs{q;_sL&kv6(Uia$JOY^98FWv_6>Ei0fvn!rRx zkcUZgx43?rzYtpSg@2Zf{n88H-h(lDuflKj^S4vF%$uZ7g40->N5pyJF&!Om#f-$t#7#T51V$M9KUKflZdqWN~PIjs5 zarlg|f`5A0+mE2#0>WI7_WPk=49!6zBZlBkxjFs&XatZo{pECG4DGk{2Q~Mb&6t`8 zVrbPOGJ^EbRndRj@4*;4liVDJX8n;7G$W<-l>U1&YHy&OyD^4li-QRFjZ{OuT#!vtEY~F_enP z2wLYQO!n{VKMTeTVhpW{QqBJFsbf2WF>#EceE~{O`)`+Ei7YTZs4mb&J3@ddpSU)G1EI{Ca1MqiiT>?t7-Og< z(pB`sfe>~6BE&>SaHk9ElOMlCAqUE#Iu#i~xuYCEJ$}Z>U<}vf2xNw@Z)W{v55^2f zTx0~b4wCc9;GXM(F(VkW9Cu2^b%pOg9E^c_$k{}9d>o@H(RKpU9M2e38rD@>8-FSo zGm0@<`+DNydvQo2P|j$^TrK5vSoro^!I%WbPz|B0=h*CZVb3i&E1q#-EeY)}Zl00p6K6^l&cASw)8QF_P~GK4}!dT2b*E)lXgD5M}L zgdWk*F2QwMP{>m4u$CblOT{(ovSAw|cUFCGe=ong!rmMXk@}mrCr-vMq zA%qj@=^*|n9T-zmvLv%WC|54jxq3>BqK8}>6mn%y2pzi=mu6>gPzXKMZ^XPG6!K+I z2%W$;a`m8Qz?Y`$(x8xeK_T?S0A2COmmu#6!n`3vhU*wQOiR~jJ%rwuBQ8yQA5&lm z9j&EngwA!d3>m41yb{E8mMez7jcfw70Ki}a8z8FGmpvPOms)kB_>A-+=H z6BKeZD1?5jPFz~vhXsYC289#{g*+-lhUw{fU51R(L+I76bS3B^zsQhSJ%oOnhptX~ zNHh&sxXgOUKpE0e54lu^4Aw)^WJrHK1jmf{vgjeJWJsJIa)%5VpocsqLk8+0@5qor zddPkm(pL{TEJM2MA-~Iz9(st09B^Di^pK7+q@NzrONR8(Lq^Gv3-l1D4C$evxO2!5lzBpW`JxTr>zxQdr7!{}xR z$4qbg*y(AZ76n|Z0 zUcm)I`E2W$|8&)LT_U*{W6(ub@#*q@xH{9vHC}Qt#-NL`Y|Iz-ut_bhX_AXE23<*r z_33)z+^)Vpu0@iIF$P`Zn9JXW?R8x)$;B9hu4IF*`6q6F$j7x#axuoBYrH|%2U9=I zZ>Q^eNOCd8plgCbm-k0+D<9Vjl8Z40U6&hlQQg1^G=$OhuH<5jLDvtgCca52W9%Z5;2ogcjKs=*_4UGpRtV+^|NIv3^3``~?> zd|dZQF2)#iO=d1FU(b}z_;sYN>wx59j6v5FgRb_!4b1m(nW>Y*#TbJw2SUY44#j_* zw9|aCu4|g)VvIpoDsyT5#_0U}U-fa7N-oA2bWJtr>d@-kR|&eVEs~2d23^w(x;E#J zU+v>MEV&qC(B(Afdh*%N=?oIW=sGL87-P_thFD*npK<-`CwyG7lwDkmG3c6((8vf{ zLx{lV{&`A=PP(oOB^P51x@IsJMN{1(!jd zOMF}=8tQQ|#-M8+LVfwl`QWaVKCZ!%i!laW^O;L)%Y$bRz7Zz?Ndd0Ol8Z40T~{I2 zrz`2%l=pmGnUae!23<5y7xj?x_0jP5JAGU?OD@J3bX{Z6bx}_2OFpg#Bo|{0x)v}O z<%@J3n%JYQkLz{G#TbLGYYn#ys&NOCd8pevKPw0bz>ifa;mT&a?a zF$P_WnX4z=@%j4imj?N`mP#(h7<4T$=o;==z1GLIPI58Epeu{HC|{&&*`V+1d|b~+ zF2)#iWgB$$$(yjz$5kV_7-P_t!(3Y3c=Aw8g^%ke$;B9huB8TD3sZjavqoDpB5^Us zpeq-lk$A{iToF&cw9ulL*AU6Y7=x}n=F-Z`_1$Nid|Xo`7h?>%t_#u?r|Zg*T#Pa3 zy56Ac=RMwbKCU&Ai!laW`8pQ}<-UczlLzR!9+F&)G3Z*Rb5SY3dBG0{eOzxzF2)#i z6)+c#U&J+j)q=@Bu1_QvV+^_qnMI#Vz% z#u#+nfKXps9_N~VgO6*J&!*t2T7=x}7olCQ!kE>8}F~*?F z#atG;qW`M7=x}GnTw)H7unFqwNG*}#-MAt zL08*$GmrVWewAE|G3Z*sTv~s4Q|SX!2kAD1o5L4l47yetbbXr_k>TSSD!CYA&~+1Y zY5n0{|NFbMk87gjVvIr8%?4dxM#U}naV?Zwj4|k1#ax;VJ9_5+=;OLcaxuoBYqdd_ zsVwS!AJ_eoi!laWx9Ir-p-gzR*UNo%8@?vF7-P_Nt3lU*s+Zz?TyXmMVvIr88s;J! zk}sN6(BXydx~@Z#i!laWrOc((!zXJtw)b(Jlw6E4=vvEMvg#=Bz8-m54_#O1&WOat z7=tbkLVa!dv0Jv}`nX0)F2)#il`)rv?)VIPBDdbhHBE9c#-OX5xwL#$*7oe@=xPFvej4|j^4Z41MyT>FS*ICKM z7=y0cnM<>wXW{CreOxhJ5Q&R123-{h_0^5mb8dUo$JJkQF~*?l4(8J8;qYrpZ|tYr zaJ1xNj6v6(23;lFFZ;pAWtUuxG3eUBTo$_H^H;yci+o)3Bo|{0y6$2wtsZt6bL(Os z*Y%Q%F$P_CGna+#_%?q@Eok2?79{g-sp%j+Y_#TbLG2MoGsZtmmy zQF1ZHpzA^AilaL|pTE|-qmSz!$;B9hu7?b|u4o+kkB_UXY^;ni==wKvX*PVa^!uqk zu1h2rV+^_;Hs~t&Jt^JCWs_WtG3a_k*9AhMwXfc~4Hrl*#u#)xYS3kFbiL~1S}wU5 zW6<>&b48INT(p+bQ`dEuM?*FTbrF$P^vFc(D=SMJ>p_VjTL>V_a(j4|kX5~03)tse5z zQXiL7axuoB>nY~a>PGFPgD?BI+>(ni23=1ZbPY+Gb@LOjA^|0?QS4n2 z8w$LrSP(2=kYb@)@I|GF0)hom#G3#8oO5PoXJ;qbU-@6x_g&X_uFT|_=iK-6oPN&K zUCmgsbzhH`y;Rnnf<+iD>v_hqV^3k-`UhT6Sx*TTVYDoOkgrKZL3sMZ2ivNwF9nM* zTGkq9%y{>nhos8}Ba3o+FY3y*gwe9rLc^b`BE+Smk8e|1^974ATGl$oYDE-;W;Yz& zt+F->7Gboke?y}_p|r8(?sAp&v0xEK%UaJ^)aoegta$P>m32n22%}}a2#whkOB95A zCXR_$S#dOMBM?T*dI=h{sU<}sw0nEz)hcVaU=c>kdKnttn}~JO*xu19%PCld(Xuu$ zmRyFN-*LaLvgQgFVYIAQ7>i~`3IqRh%QY%%xnL1S%X$?WHD519w;rXkRtpwkw5-<{ zOYSKkTGnR9l1t<9OVdZItSN#; z7%l5f#*$mq%aaD-6hzKfwO|oO%X*8kkh#pjF$B_W63RQ-n%Ji{<5#t zf<+iD>mA0DaWA)+zFlQ)6D-1LSz9!$bE7j3tE_{9MHnq>D`Uwi{A$slB9(PUun41N zy~|h_a9L=#yYr1ItK~&pOBgMy9vZdH-}Tgc*Q%^c!6J;7h2amZcG$Dvn|_1JDiSQh zXj$(;V>Ze8TJi9vIV!70un41Np`e3U_NVMQD(eZsB8--`gRy#IPa*MOO_a*oELeom zvUWlfbdT)(p)!?qTCfPCW$j`txg7>Bt_bQW&3hmcfiPOu`_QN(z_T+uC8@r83l?Ft ztPdCq4p`{D=i6sg))j(97%l5VXw0S|oFqlJ?Q)gMDi$ol@b>+v&=8z!R%%OpQok73KtOI0i=Qg2F{!m#?tMlA4s7 zibqHMRW4UyMTv{OXy+<-&nhflWU-`JQl!*WSGvWOn3QMBuxI7v=2`G&oQ1#n=AxJ6 z=q&?JCEj#&l~sCug_XWCyq*~pUsC2RRzZ@#qSVFSpcH$J3CZOut3XQJ)zy_A`2bI{ zl;EX99)$x$;w46YSj^rB6$ho&ZnqFCg7tX8linH?QM24WcjbH>(2JzyF0Zeo%;Vw@ z54t>6zA{gxHzblh+ZPnalISWdu11zUMXpkRrEI&jxZLBF(@+XeWQyRWo+>qB37a zVU>%QU1+t5NLJ(qamAjhMMg$FmF0$U^dOUw$?|HWs4{OOyfW`~?rM(_wY03-Yv{7D zvIH*)8&UDdsk_>X7iPRV1Zv;q!~3YN5_gqvcG&1@kH_co6wL`63B9XmQ6ub1y!1kB zV-!VFGRi7TJ%p+(tZ?gm5vZ`Fgn@LCK2MdW+%sztGsAL&ccYPI9gy582`cu?chg(g zF1${SS}{&wQ!MhRb5+FO&^2h7Gzz)VGm$M+3%TZr(3xTF+Qo-H4%R_ zuG?KDTMe78(o%1^tD>;dU#Ra(rRBzPe8^>mE7vz`IJ)HU6thNyWb0cT&r6jb!}ol5 zm^6S-W#_6as;c%ByS-jdwcdyeuYY+eD^Yej|4K7)RpPboDqTEPb!DLs?`^y2{cLIg zvpt@)Mb=h@p zl^=}scrh&Xq*UA z@s6g}3aQ2!Jka#IU0OTVP89Kv;oht-2GOU5&rp9x^p$V4atcXzng4 z$Xy74_vA(Z+``DFEHnZL&VqKX2u^)S40k(%yA6rsX$~K!$#7Vn$ZJTPNTkv1B~oe_ zE$9Z5oM0Qp@-z=mFpB5-HIA3ds&W1ZL;G@>HO@~m^MWDbN z#fBw|rD9mB94FVF*03Ba*IoEnx#q&h%JmjLRwP(m#)?!1Ddai|Qpr^lq>^hSNX1bj z5`t8rBbP<6PA-999mkDI2-b0&R>yIp!{D?!P31A8w9wX6o2unTM<(!M zRrNdpdcB<3@c2v1Mdt z+Z>sh7SnU|fO7s3pmP)dtJPRq9xIP$Fdd5&zB+J&j3DBk#=EiW~}mfsjkv5hR*(=zkZ z^D}KB31eBROif0PXfZ2WOXRK-6$>eO>Dl&tXOBI{D^q;~luwD{-ai&?*v$AvP-a%>-n;w+NTuWYFPHw)it=Q#?pb24n{7XFPw zC1Pa0Gu`2^=Vn^ytA&a>E!~0)l<=M9ypa>vS&&Jc zCUg{%zZNOREtE5zIa_c6E2{!yd0HXAi{veI70$=EPsP`${ zId%a4#m5!Q48`Hrv2+fR(=OpSdL|+qj$Ezh~~P#i%9V>eM?srX>e5}J<~=;r~mNZ^qDu=$t& z1y0FFNcoKg?i?^f20=hD!d;0tD=>FAftw86v%vh>1kMgz?4|g8H8u)HesLRKnhne& zP2eoRtq11E2yo`Xl9Y~(f{|Z5Y$Qzq=JqCVX~3-n=2#QB=Ycy9%oEgb5Sn8P*Zxkn z#@oQayphac>^FJB;W{JQbvb_45gP@gcF+$IHvzNq3XX&MuzpWL-!2v3Ov6S24`_tN zO@zLWMUt@6V!^2VS|Ropf#JyT_S}eE0o<qaLGu}E?`U<3?|Vq6AtHx-kXVEal=NzsQgM17w5pw|6!wG zgsX?&$AKx#<~VwsESz7e)+=-H!+6*z7?n#E;+_Jgqm#i5+aKAp15+b#M)vLp?g3zi zr(U zw80h**ADt$fN3^~P{!i{m2(?lo)S2t`dA0tC%`PB0Uf~z7l*i41cm{z3zt6Xhub2+ zQE_|-T<@#6HKY2aewYEwT!BL|h4tGNdOt9?H-TFK-2K3`odN;DsNM#{QD0!3S92Ua z02nU6cOfBc2Z_H2(mGcyV;YbPVh(t^9S7k^~?PC^j zUV&xn2*QQfBivmP+ItMR=bNxc>Dv*Zz0ZLAIs$v9sW2K8jPlzaxLyKllwV5UxCrg# z05_!xdsKe@2<_brTwN3PD1B=pw6__!9TC|3CPI6^0%xKHBZ5)+QUC2DFbs&DQGHwj zTv7z~u8h#$HNd$euvZhIy#R0zL}2gL2<^QE+^z`horuuhkHG!eggt71-KWbn!T%f8 zM}Odk3#?K7Qv1t~(4Gspxe?f_jnLjhz&+E1J<4x=g!c9Tcc=+_l;7VYwAXS5exVK< zg~rM+NnkkAxPPPrm*0dvTJKc=vn&+HuC~h__;~*mFzZ8cA>%#e_ak7w48?`9_a`td zT-=9IekpzZ1x8MdQTw|bxU44Z(fBeeLVF(Iu5ZE~<@cco?L80Nt4-MJ1bYX7IU#Vg z-Z0AVSz!K-z+R7;_!>Dj3Q9SLsgK;5_}TzA3JNZyeyKhd%*1&BHVO(ZjJL}>3f;LIhwRLpX@gp?oEZ(m?iLUCc*%M@UWLvbPYs6K86 z=B`j&7<=o1*&K=sWAAf;;W;s`-&4T-+Jrq?A9QrfmiT|8_R>wEBm*(?P0>gmV z8P&(-z-2XIuP6AkBD7Zn+?`F>qx`Om(B50X?P|gv)yD~7{tU&1=^x!^VeN#Cf>HTV z`qF`!7>WyHZyqo=hT=l{8>R0NVAhA?!r1!=n9oCTA@(SJzX=RP7L4k*#ccFVY!r<0 zOX(X9j6D<=CVj=gctUYu(pLw}W1+Y(_BI2vBNP|L-ZuinGJ>5^et!kdL>HnFjPg4W zaeaWv6u8Fb-z$Nc-h{mv*t=d}$S(z>^wj`&X9V`vMQHC;;I>9!?{I|nP5^f<)LzhA zj+D0o+J%J0VeY@R1*ZKREil~uw_bqsjsQpV>bMASG+s@N07us+JrUw=i2z6Wcq{^3 zU*PDC-{26gTsi}AC<0t7;C_k#*8#XcBEUrh*JdtuL4mdBps!+36kYf3pu_3!uU-sX zd<3{;;L;<&QN3Ls0j>pbck6Jt9vhO6LBKtv!|C&J5peHDfNKrh7ZKoS+&B>-?#Bpl zl;7WUIDLL;T>K{j9JMP`Id(xITsw_Id}|#}@3$Fnu@U0hM}VVt+A#uLOW?ZeaQgbC z{Pv3gNA@m@0M{J2Q97KyTxgsetHbHjNA;Vj!|Cl&edI-eqw<>&0gm!KBnZcj8s)6DEaV^PRRlYp#7F)P?k-EZ&E7(`&b5@$Pr<(>s@k9LrDh#8ckSVtWBw zxnydOe^UC`Y1P&KlFG8;xzqfWWu;~Ak|FrT2mGw;kkV=xU*M^pJFUoHR$hWVy$)Bx zU#=HA_N3-e{1ol93GQ+?9xa+iPsh`1y+i07IL`v_P`v#mjg`i?mvHvKSL%r0XsHdL zPl*4yWyRGVucy=(KXAgJczW!#qU<{QVPSge4iCvyBaN1cj+!&^jyh_CQUlF6k|S`? zv2081(oH1S3Dr&!Cm(;{sHJ8hQ~u9U^JJZF;RvwwAt(Mp+Uzac;_Ir*7pG}~ft>;- z^3E|QDcea~95vhGr`FR@ums~;6#F5uIvho@pFvy3bc1nxJJXH8emT>PhqRDMX-aGs zqyW>=o#sVMqI;K|I}_3!Og9J8bxf*KVi!Q7AJvGGZiaLNlWtXF?|^hK(>)03MkYP3 z#6AP*0j66I=_V$Hqt>0zeZ4(WO(eW=79fb=h>`$CbZXdYv_A0YA4_yf{PrlX&2 z<2h;tiF4aSdWyw%g@m??eDsC%EYn>Ai8F>mqTw$}N`mwWlX%k&um+lRXxV<>u-HBp zskAh<&r-xwJLWAQ&<5>!m#;OeI1X>9ANQZ?!;V03tKY%UMC20uNW7A1o?guoL@Sx+ znKT^IDr`~G7$w%G#AZXfm&M{S1ICDv=!PI!iGkHK16g9IaW;pKf%T%{Icgmic1&q` zml^1SJ(Z?9xWa}+iIW4ht>9x>CZ>tqyru!yB#A+Tm7~mU>_252qph$(MP-uWvG2$v zM;$A#dRk2Qk)$ZeS!+w^=B#xl#7~@j)f8khIVN3SyVTl zX9X@e0zW$frDu~rJS)b)7DsF3Th4Snb&xeIanx*SMGz(F zGwcYQMHab%3zYTUj;$xSL2iq3Os03RY}a>JtPWBn2YOSttE^X9SrT&tKRHpufwRnL z&4mV^4_4WMqxd9q@O`v6-09eQDtg>0{{%{y1#xvfD_|DsydlBSSh_4cNddsJYNM03 zSZjwl0_6z>lt`<~I%5V(0*4!^2dg?db$=0C6nlto9g{|4PxDR`8yb0m&BZa7ER!d) zeATT@*!d4k-Fzk)ql`SJCv9`oE{jK#a|Eu5iJh_~w*4{_9r1OHqjvgAXlR<*zHB8- zN;rBF|ImGX*YU%b_`j|E-#-5DDF1gB|9E$^CpB2#h8YP%wXcICAeKQkwA?Bhylp71 zDn}r_o1^xXgxQq9+BXxb@ZVYcbOKHD=v2EZk37m!XFnd>-u?@=C~TduC14wg&4z6fwh~Hf zRKwoW(L4_|Hy&?Q-N70-PpO_pE@xT;4X4{W0``@tMjs6^Gbs;hA~xak!gaCB?r4cAeNw{stiT>&hnAJc zkqc&k{8}7=y^QP(T;Ld_{mlT(=LSw>nRhsAZ+y@>?m}$Mqc|6E1e^($thy=jwm<{C zCOT>-FLu;j4ttVyV+<7z=6`wi&nk{esJYNAc3E3gU(M!Znx|ry(x(=!FcbIN*1u_r zS$YBLn%_;a%Nj79y-kf4ZNvekgu-%KYi>x0Gg;pvvNiTKTSAOI)^^fnK5318-Ig#Q zaG?}gHd_P#QQ6YiWH89f9mQVE=}M-mJ(lW?{OT zO^qU%JS1Cb(*A%I3o0Pl6uYztHGtV5D8hlYMXh}~137AMp>CD51%{KCp;n*75ys<@ z&cL^Fd%$9T>(MBu`FCsJqpZLfxc?U~cpI8SvKTmQXn9UFNt&6cI{9!6Y-UVuU`$rv zl?3u*r)g<--FPYR8FQaSv(*$6S2GRFBs)0P{}ZlD6+i4|b&Ejy7yrj$o{xNIBy`W{E!0pU{jUTZ^KcZtDfxLkj$X1{|UhSwgy%A4&XR#E6A(j=Jqt+Vd2xI{1h>LA+ifzvi zZM9YCQW*mSlh;y=qqhC2M4GmsqCujKqc(=EM0wjC-{5P8R)ok}U5+!GY*3Wk^D&Q}5CQCu??CI#C}vwJt;n zopkC!D6Ih+*`j>o(UFPeYtJn0uta@H5I^yFRX|k=l_-zej2H$yHBoChica88T>&Le z-`6;_C!J5)QfeJ%OK25aLnHPIRxvqso#vyq(9+WD#*fCBofYtXjO9DJCa*Z&6L5%@ z!!)_ezW4Kf<_w(74eUVk$qIbLqR_UhB;Pfx+hg3Jr~Rc(G+4-uhxL75GWwN9t+cZ( z)Xp3OowaOI-C<=Jk;$iH4=x@>5l9GBfU5_Lv#dc=#(F*N!ulp zI9l$ICFrkS?r4Sr@>R-368MQ$Z4+o7Lm6(OX-CeFBXEJ08v1SRtuzA2y-+ER9cs4= ze5$eNe_1}XCw+f|Ow1U|3_qW;PXO!|vA8Pr*B zZTVj@j)v{_alci6h^Z43=&5&M4wGE8zW@`Q+22ykgr^7Nu$g+;6Ne`Cur1Ao{$BF5 zNozLwsuj8}U-AU(XGFX$kbB%wSGO1ijY(zTCb~x&u%Co1FVSfRUPkeHGmg4RSXR~5 ztwbzu5R2a;S@QLwbryJZr02!Hp1T?&M{>=n=Dtg5_~==4%Is@b^Sjw^l{48-7P`wq zoGi2u0$Y#j@|LvabaS>UcLw-+)ESVMsC>!l!1TtJuz@sKJ*|EqycYv>2Aqoia=YnikJ(u3Hd*y-m3O!^CZEMB0?z(7F@mni8bNZXmT9MUaJ zx)Tz=Rz+uQWGPD83+a9){i4KP3QxZ>Z`-lw7i-QyTE%dGDY_Qugj;bGCAEXJjY-`h zQ5TGo5|r4%kan=x(Ms%P*VV0hO^c>T@q)2AW&6}7#`XTLYOd1I3NhY}= zz0Rb0kX~loTOobKbk9M0o=I;g(kVzhZ+}C=WgGaNjRhYsgBu`m%TGXhigEu9i8Ee> zw2}FE7g9Zo{Q?r5FGWdTL*m>EkXADtt(^I_!#-GZ-pzEEL%NSidm+8gBnztVRc4uf zZ2D%Vy9*Mx_Yx$Yk9tM=NQwOl5>G(`BwkisV&t;w1!+CAJRTBHa|WbU%tr|%p10>A z@tS@^k}%Jw=z;;HHn=^19_GDw@5j}%DUM>?c`v)BocxVLIZ+nDY;NZd*Q z61Q?Uq_>%sCm?Yvbdl{t#uy4|FN?h#(g7wpA$`iEsgOQrQYj?*N#rPL9wgopuZQ#n z(>(%dC9}5<(qX3CsNmj*L<__y=^IGLSnN+qY{%BPjlpz1A)RJYe@MSDX(*&0m^22` zH%v-{bdpKAka${_LHddLcn}g!4blD{h4d$rRzmunNl!zfer=XkLuzg!X)UC`neIhM zobd{zf0%9~Bs$SIOK(DoX3`c&bZyxzZBwM3iu9o(?Ny|Y6^VXKm2AELfi22;gPcwb}`7CfA>-DG|(m-&0 z6}W|fQxuB>bEg9rN)lc5EZWzbV>wI@vM<{eyYyCAIEf95fW7kK66a@LS+2QY@(qyf zbYM7KV*Mb*;VEu`uT297Ii4NVvO_>5+8O|C>) zT?{LWu|-Mr@*tP|kltcCI^Mt}y4=q%6w$E1nCWQndxJ^uV9z`24oEdjcLMv{nA96p z#p}a@3((f9=sLSC(B2w2>7;AJzuR$-pocSHjlo*O8rX$18*9pCJAGbj!&dva_p8s) zrLcm4E6O(RfPa7^kRQX&naqb`Z3l6EPII<2*ioAqQ|pQf^ublYD2Lg_7c7q2^q4?b zM<6o>OJqmQ4SQoGew{kD@y#2gCX9U zsAJb+ixPK6|1Z3~#O{lTYr+d-2hsKZI^2|r9fZq!S#=8=as$8P+C480x;~IV=MA`O zdphg4^VY!jQfqAGKaRoQmBv;zNRGkpA=ZqRu>-NCj@ZgyH&J2XY@{@{{QO4rI0-9! z+XdwkABH}<%10-;wDg~f|EPkRhM3qTbnC9>axkQ3v9}MvL20aK2p!r2d#p7_FPw|L z=>)E1;NO>&h@D8mF3DQwFqOvs^MMuDozXnayAZvtG&b3S=;TrRN@G9%lxsfiwB1@~ zX;vER{ZCA3?5CY}gJ~{>8E}{-(8-W7H%h~8{$JuoYq%}KaIH04kgni#Q!2NsJo~t< zu}d0o8g3i6!#hB|k7*6;MCPrr>vtmu)&`WpM~>PyIGf#3eLQd&!;f5*sKZau*7+f( zgE&kF{D7_dPbc9nX@jpH#xnE%z@$%O&cAE&wcGk#98Q#Lj-|5s1UE(xSAV7OlD5PS zMEi*yh^B)cvye^#*!?(~!uWc75u|&tMM+O!e;zA==4?&$H(L{&qbg^y&2Y@``Nl%x z!v&pJtY)#9ithhCkif5AMgBknAIh+t{C`g(pbU5$qsILI_mc<~y6J|s9_~E9Ydya; z#@Cg1HokIWT@F=)bsb&d8c356E(^rVz0>!Vxbw#DZ^j1>u>R-J-bv*;OnMeJQ^8gz zWNa}ue!5JLcSN!0ai3*U3HHx3NlXHCqc%5iHY;$F-LB<#2I-1-l@mis&Cw`!-*>li zap@q2jn2-%d)6J%=#d!av25h)L)`FWsliNvsZ$IC-GF(L`J;yrjxi}0`?r}i8T(aC zqO9WbD&4G{Vx1)4uXOOq0N1zaM4lH+?CV>2%cn_X7SvRD1z3j`z>t)*pH6Zyp&XZs z(VtEi%lJ_Z-E^W!2A8f2)Eg;esgrDp?l+MMXW)oz!nc(_2eK&!dae`?H?f)Qb7)au zFnA`bE~*VK|9KbSwjeH#j~$s@IXrfE`QAlYy;S=53B~C#!3fJe|HaXkBt~=?eLR z`G5IQ7sX=GGcRavSJORQT4=Fby4Go~8SM5mT~}!?4M1w?)+WE7znV#tpyO9viXbh) z79}mjp07=5DbHh{gv1$ZA@O;G7XJL9nxl{i5yj5zcth@nn&VO*l9)FqBtC;og2e3= zE3xw+tzuRdD6vbGSX!8H?p;C`BR#I@o`yvB@Q@CgELO7e6AD(k}QpK41?` z>_ztoSstH)Yw03veBK)i=@>RzP_nZUcCQ}y7k-y-*Pjw?E^v@_u$mK5=$lv)v99?M z?sM^e$GRr2petPyb3MP1E_YGZH3uqlG(981({M4QCs`WQ)KKT--E=x6US9w6JTFze z9AZ+4Mc(0Y1^nmvDYPhc@T}AAlk9g;^inJ?)jJ#qaN4ok7T8hOQ&PsoANd0zJ5CSe z90pI?k6TBF9S6Q<_{&hjL>+pu^c+j` zRoE|Ml1I@khNK%+lR#(7faC#%CssFNqHM5^v2m%Zz#|drVWism==MIgr^7++~bMC7>#F z^`Mq6fK<9f(i?4wMDxqL{UF_lLgzErPdJLA$5ut5`ylZGu7kv5)!xS+?_!f|PhP^o zldM{?{2?8rA2}D(6}oNElRA4Tf33y2AnUll0f2^~o)x<4X;xc|4P6%dHB8FG{sksY z!~RYtQ9*@y`bJ#z@z1A|)${dn{tBA;aN3JowzzuZZ>F!Ko7Xnz)Xfbh; z>1w{lFz_D6nJmp5ECvax8Ftb}hFQ^zv3f>5FCV51E+i#>9Mb+KOTQg^J}l5>1iH2o zB~@Vm6_XZVzluo@V!xP4A>H|ZG$?W}%0qnUOjh|JKDiU^K>^2O#%52(iLnkR|LhE; zD-y&y1p6`uj@icJj2zHc!qC)#A}^S=N4l_FTfLK7+f47g9}C$lm+XQU38uD z6kU5_g9&c6@&Ge;KOBoPO*$lQCYQ3+t7F+Ae+QHj z4K(tK;^66)Dc2|ZuW$sWCL`WADlie(3HXGHGW*aOsM*MjVih857riE*^vLH2{Q8L?^5K}#dbh&Rzc zNzO=4sd{C_5x9qEg3lG`xh)0Ef1EPiN0aGAEB^=Cn~O}n%(Ax}`_)Vec}N!zL~p^6 z(ts1JGgq@qcDxPphwpGnfBrBBU-r{Q&K`A+hKBvIukYm1TaQH7Y}sO_C#J8i#{v6~ zCl@SCpcZ-y^C>TVqNH9p=C2wgLgI^PcpgY6To#;gSxctpgp8j$t zf56UJYjx1^H1SY7E@ES#plo0mvJO;4lOo|Fw-S#hNd)xf#l(=0tf)lU#>~^LZqPm&dmU^^Ob3`MOBajxi-O|eB>&geo)CKKS_=5nj zNBU_|+?+lB&s#<}M0|!Viru~9b9WMsk1-u}Pu!N0~&c zi*J}j4Twg&<`P}aILLGlVNd7XQ4$Rk|6vl1oV0#y&PF-D5Z(se7c6!U_FpoI&~y=~ zIZGSe9g1S(C5@#~>^35`y(pMY`?#? zcmkH%zdSQ^L8Lq)46N^oBVJUOKw6AVW6lxS>YF25EJVlgO{2BolyRMbl&X~p6bTA4 zD&A1R>nr|vN5ImJJ)PU$5xAR%Ej-CbIpOaj4Xh8m>j-q(ilM>(?dg}or?EfKJdHyj zEyfll*|6tl)kTn=Vmev`EM}6aWpk-zQS+*(ndX9KG)^Fl<^S0JEcRwt;V-|Lao&v2 zxuQ7DlBr7+KCs!Ls{PD3#FCL1%e#jhQOIzBIXc7<^wVf|7lsrnOq_!T@Qm#+|Z6n zaj1(PXMG)gRg~26ar0N*d(&X?S1nz@N#IUQ3RU9`#hU5PQY@ER* zV&rfJE=xv_;4P6oFeq5N6$Y1xaV2Mj)DaC@a-czj`{5F?rf^nlv=m#?LW)K0#*S#s zYS$vu@P98h&g2p?r$@xxr!cuhOuBZ3ItoeYD8$HNKLqZNOT;QO^d~Bskq;sf zkT{EM--k^O;p|_}?F)#U8X8~JG;oQ0al2%bE*;1roZXvwj=Qvyx=d;#bs5=O>N29k zPjN@uZD~{0dL}XJfsn%|5O~hHM7g|`TL@}@WilN9KUEl9B1Ro&glS3l2QfcWm|P;} zJ&f7CE5_3$QAe81=KG>Q!uj2%Y$sjH(~cBX4e#^wrO!B2U^tdTH+Gr;&sl9i#21$=6oOAK6NZu5LDy7}UlowQ3uG zfYc(;qK}sWm#7T(Fk4NP`xgq6OT_$yGsDcrrHGXSEh@QBE)nw(XO54S#?$PNc|u+R zER<>Z|CPez5;2cPlv-L!bDvxy<_XTEF&pI-JZ29j`a&Vt*+*9wzM#B9x( zP4xZa3X@C3Y|oi(TS#rwTK=S66G{?GHc%A4!NyC7OT_LP4cxD*G8GYIu0HaUc| zJ&M~F5ZNxZVAa3sf!igUZ^=d#q?R*I*u}s9Qkuywm6;sErP<1Co2VpA6HD$r*&2icJnYo^s43V&{q+bBt_Pi{a=tfN;BH z)6EHNAI|PXp4%`zY+?}ed&oSuT%r_R!$apZ+xrcrbMh-tf;I_F$wp~0`!M!M`-%%^&3@#DFtz(oyD~GlaID<>X zn9CVK=WiFwaQvs*;S4SjV;*D7#Yb%1db17 zzY4!ySLq8Asp!-F)z$7wpTf%XR}{Ic?F*%eZr`NY^b3B>jZz_M^p$xk0mw-jai!l~y=V$PmxHg@z%`Ur z-omOfmN$J|rH}GF!B-B`SGlXbFeC9F`~nw-i!PDK9}<#=Cqfcm36heB4#&GRW2CFfyuL!IzkewE13)PYkJm>ZHZP|Wr{9l1k+*k4t8*_d+O%xWfElkIf4udSmpZ1s zGwkF;X-WGlv$|!?&1~lGUNr2|VWZFOo^kiNj7wr3+5Pmtp55@!sil45?mBwY&uhN! ze}40|d-JDUi1tPTVF2!f6Y9m*JoD^p5F7q>P6SD{~xJ7VE*^aF%%9t% z+7-V2Mc;itx84{Rb2x8G(Z}=W`u9{^wDRmdV~Rd*_RqNGGdFi1eZC^;@<+$sJ$ByM ztUZq`_$y)U`RliS@WFDEoR1lQnycIYZCBWu{7 z-OnuOy{FT{!<|1lIQ*^2cV4ltZkoIJ`-@+E{B`;G{WZ^i_GOFG))kKxM|W-W_R$M# z=5!h3F+F`|_S?^1bN{NZZ}0B>{*~B`OJ#iJlgn?vVnyKt@^Q;^uRnkN@ppf_<=Wr+ zly7sdM{CFLz30z^$vFPsqnN?ltYad!BXcy!(25y5NPoI-VNbvHr(n{jN;0PfKtf`1q?A`kd|a?U#Qq zYPt5Yl4H$&oc7jj8*cmVP*RS3++*zGC1be|KXsVzAgV;edz4w)t}1tj~@JObMBp!=N@1G{&RQ5 zzc=Pg^BwI5TtDQY?q?7F{gOZT=9f1-X->E#CTDqFOwT~+qFM3FTYY%p&Gk7OUToFc zcgdZJvl8Bj&#rfVv#G}|cjWcCVT(0&eg35f$K=TNCw;K5a>T~MtJc0!Fev4LKhED= zHtMZn*Nr1*dnXjvT(siDvEwSNZ||Cwzxvne$$saktN|Yutg7gK^($@L&w6=CS=#$@ z{e;?+>+kZk%?C3+xnk?vLt@_e=8|7#FBuiL=gn27ZK3$=UYnckT57p{kZH-@pZ|XH z?u*;M`CWbN<#U?PxYGYiyJmMiT-E)l_yyf-J3jk)ryp)h?;*FZi*_%qeZzg#AIq-yqyz2C~-^HSF@7JNSa%yk8GR=Ib)F{xzA z?3@3Q>tn*1W(^4y?>fFXcH)k%6%THj`%KjG6Yuw2F@JQggk?r2?*J_7r z=c*qc|K^3mzrFnM^80TacyHp9UH;yAtakU$mhWR9{-!ARqapie{Q1cC2Ld1N8o24) zg)5)_GwRyR`W*91oxAlvT|J@bh7YDbabWo^U*A(?f4Jk6?)zVS?CBL3F1|JJ=Ki(C z*A90?%jpkPyMBKEncZ{loj>E29q+8}wfM{P@7^)8#XdQ`&1@U~+*aFln|v&{C%J$4 z$_`Y{ugEOMP|d=@M{@pYHfW7GpZO3|f6rRaM8!=UBg9`bhrW2gcpMGHUt< z{%fZ6AF#J}`A5r~C3V2D*WMq~v(?Mbcvc*Jbmfrl2e!WO zy8YQ1^N$QZHZA*+odavV->v_1mHYVJr=*yN?##IU+R<|-Z5Vdrn8GcUlh>plzU$$u zHq9IH?AL!s_bEU1*~89b*Q}d2I(Np{^S{4(Me7e|#`GP2Q=4mw9=mz*+`*eWU-3Y4 z?2;FTM$LTf!{qZn-+bNeKek4dFM00KMU{?jH=IgY_D6&N{e)Yu@;v$Dq7L#yZ+ANWc8q#c2FV>cZ6{Y*jsHa#aTx+3?oPsV!YwVQEM>f@u<%H_7{`;v=OZl2R1 zA6w{Wr-zo6)CQtV^u-giWGQtQ`i3SZt}vMv3(b5_`Ou0IHcxU*@Xv74ENV90D;re) z2mb^on`KQKmAGJmR?@V_qtHwW{((xGm(8YBI2Zuw^uOoX_?%71F0?~1OYzu(S!B=5 zzL!i^+r4@NmXVZ33i6fmC>^UgV$CL6hf-R-DgEJ6W=(>ILUYav`svPSXw9a}uqW07 z`{qzWMUbzXFpL!Zfz}p4m`!q?*FDyIFXt2SKEWmoN+amAu7o$62GSnelyjH=fqx>b z7yk*PEyI@3a9@<00|ni!+*fdkv9&z=#U{$d<>&g}qQ}r_gV{6|d%_ewbX}<)L+3wc z6WyUA%&A{SJM|cL7GRnzFuOi!wMUO>$L!bz=H`dj{;J2sG7Qxx`Knn{J%`se#K1~AP1*hgdg{mjc@`o$#-L-`_KM;FW)qxZ$eBGUti zCp&Mnetwf4GYBze6ODybhL`Lce3Kq?DZ{*mJ=wYMi^mq}F(}q1^K}`+(3Mmw!$0i1 zv-Ea`L|_L^0lwbBo<`yIn`WWNL+gDQ!^A_~22xi2*&FnjM24Z!jM!hsFT@Z+DGP3^ z!x@IkkjnYtuWHlum=O$vN@AF{FK^zi$IwV@M5t=VF7ue}4Fdz5tcB>wf%rFbEC-xlAI~ZF+ z?NDu+O@ra6JERTC?_wY!ufb(Vvy#~~4truxYJ1rodJM&yO)Idca{jDy53F^_4h3{; zC6EPvpF>u04Td5ma19J7forom1G&0{*vYdXzGI?XYi z=2xAj15YSRHW%sYupGFUqtg`WG&MTS3Z3Q=ora#}kpmZB(`o42C34{6ZlP%@#fy?Z zt;4j$EJ>j?!<1H4msR>`e4~&4%dE}m%fQ8YP1(@N1yR_w@@t96^Oc0u}(C}8bL}#e$qKo6saFm}`ZmkD{3`G_i_?zA!@}PSLz9H0>45 zKB4KLXif`FM@7?8EKxftnoEVIpQ6bUnqG>gOlSruntO$2n4)<}Xoe`7{X#QT(VP>S zfr=)sHP2UnMKfGzE>ScSgl3SUsSujMisp8qxm3|SCp4ESn(aapuV{`6O5&2l3#mo1!@+Fg+BFsVz$m z)&g?x9w0QG6-|oJs4YBOqe*b)(L#s?%5by<4J~O{pw$}FC>SDZF_bK(p#=;JRJBY) z%N`bJO~N$8X=O%%Rv=myt+kkDG+~yZ>vxtlBZecAzBEJ{Go^48p%-IFQ!t}xeYshq zq1EITjfU2aJ2e{0>fT_@h~da9eT7KzHHOj?jd4@)HHN$&(`aaAMq{FaNg?kSVGL3< zqp3J<3f7Dm0n?KeP4Lf%j|Wy=!M46+96nkk58Xwg1{p>Q{*m&_8H;KJS(0AOZ`(;_ z%@-_&k%E2E`H|TqnwRw1#?eox0jaBoG`{jRzRtd~c$msMDOe1n@l~MnHCpl2PgEnr zXnb9%@in6S{+CqN)q=$^8eeo?td`-tQV~F^tC7 zB#p19R)79WAH~;6!D1MVugMx;H>A6MQdw=-3Kqj?d|l00A_LNMH|KvJr}&yLSPY}_b&bZ?_wPP7NM$`PSPY}_b*;`< zd&Sp#g2gZzUsH9yRMr{6Vi=9DX$lL1L}OG3#aD+8q?6bifw)@{^rMl}q2(n{W!QcC zkdIW>NWo$ljjtJu65C7d#}TDDr=WuF^tAn5o2|uJ+`Uc$K|T5vx3Di8ehd4U-un;EM8^x=!i%J zhSB&cftIf~$k(x9_TDPXE?5ks@#SVLc|2Ux@+Paw@(32gXnd727Uhe=nTy(O=%%#lj3rLSBpNq*DZaiHEQZneD%1E{vH9seDyv;5 zL?SSZ#@8HZ)ioRSH4jju|@7qyMwF23_^mG!k?F^tBSN8@YW@q2z%SuJT% zjKDA&UsceWO>&$6%49pGvW5v3!)ScXV=TE0+l+ega+Nh%uoy<;tD3QB+@O3t)^3|q zWnC{=45RVo)%d#A{QGSx>q)_47>zHV#@APCN6l4PI|PeiG`{>AUzc_0^`pxAUa%NO z<7>X+3j&){hA3^LV;9m%62oYGEr3?-U-{O|6)J1IU@?rw*FwgU$KLZ#*m3KqIXOTm z5iEw$_*#Tm)z{aH?zvQD)d?2EXnbAASaREF_fuQD%6e6>7)ImkdX29EZ8pB3vJMLt z!)Scr28QU%)HY)8*>;c0YS|Sk1cuT0x)EA6U%zKQ`?tzU5-f(%__~R)C|}f@6k+J?&7BUlWh z@wG(bi_RS`QGER-SPY}_Rip7W{`sX{R8~9{5(2|$d@Y4m9eYo%%KUba;>#ge45RV2 zjIrc#qyKHM{!3-e6)c9)__{^oi^_1Y;;T-u7)ImkR*f$zLzVT4U@?rw*K&=o3ln;m zU8?x{k6G`{X(EV<27|58~cg2gZzU-xQ!QJcS5 z@pX$}F^tC7eHvfX=2g}@!D1MVulpIR6ZRCI>hn~W1jW|@!D1MVuLpot+u@443f8Ku zKLm?mG`=2WEO|V%^_Y5dSH)L+5Ax4{sX%+4@({GDuO})KdZ{dnU@?rw*TakzycX@L z_;Lvr!)WsLh{o4G>-W=C)=h%NFdAQvGFDIQDRj(S^ILDl*Q0{PFdAQv0juU~_B&V9 zt1R}>4a75y#@FMFC6}QTy?cE(#n&m}i(xdrp3wOEa_oq${H(J45RV&BxA{K{=DzpV=Ajeuoy<;YZYTrzQ|XX7k~XjW!)iI45RV&l*X57 z+{%Betc`-jFdAP^GnSmMUN+M@m32(87)Imk8I3PX=~werR-0akL|_<=uV#MR#1dCxbzE(4qoUg?Li@hrAF2Q0Ljj!i5zKWjR z?pIk`1dCxbzFtuBMfG*pj$0m7Sw9LE!)Sc1(fInZ;MgZBt9NfiA~1}`*IH=RGNkda zyHbX^g2gZzU+Wl4F2nx6Jby@KT_;!!qw)1`#u|vd30wZA*!MaszMd5 z&WH&rYpY-}jK%zDj3t*LotvwyT)|=(jjvZUzUX>ybH$fmuoy<;>s5`fSKYraP+3n37Q+CC zFV#aMmmHou4f^r)*O;9Gh6>%8n?pM!N#cIIB>fB)1;S{b%iRc#*(5rfG;74a zb5vHxzQp0bA);ly0WCl4r}$65$(y6HY=T7?Eo&2FiNR62W%s$`DyvGc2%}|fW~{E* zQ}|=SS`4er_<^)iun41Ny$KC}f{UR23zlG5m02GM7Gbokw-`$m6wLbFdWO?~D7EtE{PlMHnq>3p8d^E9@z}zhT)b zm978XDr<*e5k||ZhsJDb zM-&9>E753TAhK{+um~e`7fX@_M{1kz2o3cD@@vM1=Psdf;6KL%xA|?*^5@l@j zM-;nKDp(WMh=7c^$mMLb$+Ubik!Wu*uf zVYICG8LPEmo&CczUuBgE7Gbok4;U*(u>NeAjl|0NS}s_G(Xu|&u=brlRHm|42^L|r ztdAH=F2gRnmqn?pHwB9@TGnpHGGk9+(i=bip|U;^EW&76d!SMK*ZHegwp3Z)2^L|r zti6ndWU~bLF!$I|a>^`vi+H zTGr=`CAY)C#TD&UUuOl2Fk04s7)x#&FQ>c-QLg1y0}zQo7%l4%H0szp_0q8zyk%Cr zU=c>kLXm+bm&Tnx`fgWQ$$~`~ZYf`Apb(m=8cpzu=u2i<&IK`K4&I0tEW&WhHCj7C z?*V-UjJgj0>-Z=P5^}!o6D-0YU&XWMdd0iWhZ*ZaH2!JAn_y^OE2nq0rP&M0J;kmC z{LO3^y&~qR#7pxodL`a45--dbmX}@UHUyMa;_dB9Us<6q6jM^>Emqw~sj04Xiz{)A zJtx=Z%(FQyA|)2dUs3Afi8Dx|gr05eBkv}m-ws15xomv==IsFt3B1K zO8Z#=ot}RJK&Mt-Z0BDQP~#^q^7`Br^wPho6Yr|q7g~kxs6WeGOFG5 z9RZ$~V3>U&eRV*!$=}F#6jqj$yJfS;Af?M%Qc{iYA_%P0Q&{3GE2=K6UKD}@M*i4A zE?)K*czlvTWG;LpFOV>C@ScwL;`h0$={^1+X9nL(5DxLN1hp7Sk$<7D2-f5C3_++u zpQlWqX1RUt%K12ejly!5*H=>Jaq&mIU7jlX>VjMlE)j`FUE!&8&6ghpS0q=tuo;T< zibuv>^SzbAG@#0Xagi$)7~`4&~VT_x@+-|Vo_o}xLf zqD74WD7UUgQ54C%V93OWNpx-~zObYO69GoH&^(53-#$;3r`$7ZkxR)zX<0c+K}V-} zC56SF`EE*qtGLQf?Z_}+8uK($m18InES-z+;7WY8C0qj%uF(RUK(L--gpp@amc42W zN*?~X8rLlPUX8vT1mi=%M%gMVES~GGEHM~hP+4AgHLG|uJSs_^FMt+RMlb!i_nXZCK6T-yN_-7DLS#Km7P1k@Z zhE?NOFFIejTSrGZv-~LaB{ySbJ?5gBOyA7acs35qM$xgaExBlzr9x#>Hx*G($x-$M z42U8WyDn0((@mZYjZENrO{D@B%Y|Jprm!37EVd6%gf6u_CWBu})RY1nYD_JxooLOjIzc zLf8o%Y^k=Io~1>~{+nb2*XX0H->CDkftxVE#!YG_@Wzd5p$2B<*@zWZm^t6TMU%7$ z+))>1pTpw=GmSkcG`W65Du zg=ox#pTIR{3?PPPw3E4^sSsE=bJSHrV0_f!`4b5Xg9>L%vycdvDlNdkMAOO9ElcFl zQ5YB3Tdw>ctWn~@+jWr%(ne%YnTwlPX)Ec_x(XUzbn zGe@0?RtSb`I-TXF89FCy@aKz0dAX)D8xF&3CsEW66;e19?;K5`v^CwhExDGBP~28h zMCob@#chp@$W~J*gMwFTw~4~nxwDaI6(&Y1S>R@bOQqIGo5 zNwAKsjn$E<;B=?TIwRpxI%8qZcj>fQXU+)6n{@DmX@uk@9SKt3-5R$UJg^%f^h zsqcVB$VduPxx^4jiK^g;idBV2RJJNSq5@Xo+l6Uq#Z;jWA6ZQf_=VVNAs}VKDecc@s8+p{cHXeyek$&r@AE%WX*= zjyvg%+!D1|QY6I18*9)+}ef zC9{zq8&C;Z7F(vnnrF3Uhas>cQ?a?0Y^NjFo|$bWtWgoFc!woDyTF!{YfrO;FD(r; zD=#n0na$E2ru0;3o+T|k&0b*7a8fD^OH(1Fr&%2N*=cD71zALBtY#HXS_X3yI7=(!iBC%JW@e-?=T{ixED&5VJ_HJg}tigmD@_X&61Xx?sVGo zQ9x6i`ROjhpJhk0=r8*_Mp7Oj|~NrtQCwpd3qD zzB4~JH#bWqQ9o0Ek|Q;#%C9(aTJqD=94M%C6&@5l#%XhAlC0{|kq>*G&2AZ^=tgB^X5`v3vePZ>cPbQp za=tY$JxhdsL>6N3U0CLR@1;*xVSGP3h+`8JC~{LqCGH8Rhc z=gclB$hXi>UnpueycOhS=Q%CGzlNd2k9OD!@~t*&j)ng|h7ysKmt%FLA-fj*T85$> zm62<8IPAy*`wb06Khl|zlb!ECebKLKSa1_0tDmp5O5nx(elANTH`{f{*c> zLTRDD+^4y5!f%&2e_7-TqHFWAclW|nx| z(8wM==y?v9KLidmZZGH)>QJ#q)1xktBqufs^iZ@#vTO-{P@VJxu{{dRHi091z*$1e zkNCTR`7{U@E+2$D0?f%KaASe{8JNo`0SL{og|n9qy#<(>CUAD(9suTxCU9ROgFgZD z(WM|Dbj23VFMV2i!(e>kUug|e32?pBBxxmeD1^4y!nMB%(D$?9_sp?TFv{0q!+OZ1?M(OJgTz`RWEPd$_ z+RF!SY7_Qikgi1$+PfLJx+d&Ve%C~3Z!>T^BCz*Og!X;~&XmCm+Nk^}zkLLTBaPe3 zCBP*$VUPOjmB6?|aqKdT?18tx8er}W#f7v#vbPSHt)aLu_6`GcIusXTkF~!{H60`w zwm;zd3#?K3k-hW??M(#E)r38&j~gSjw+y(uny^RxcYTERHUqb#344^jZz8n!J#fD_ zVQ(Ppb#+KmDmDr`^eXcPnuBG+~dHxi10pk-#;UzR!U9 zx(R!fK2sK@N)1No>kM39fo&|mslZGO#f9k~^MJWA6c?s{JOa#`P+S;$yMXy56c@(c zIf0RLY?NPfHa^;fje=2rsXY%77zV`7$X*I?_9pDbgI^3xO(-r*exC$pT_`Rjzj&ig z`T&@(Lvdm3nR2i$z(&C+zcjuK24-9+E{wfvfN_W7LefX}YJj;X6c@(cOTfGpiVLwv z^>IjGAhKXoA18o27lFO@PT5l9_Id#~NMMc1kNR&WFvSAbSpTg6W>FLNsQ*47Fmfu5 z^1BAO*PF0M?d20-z7NHPsgKsV7%Q<+Fv>60??e` zBor4?epDZC0JAF;7slQRV9tf&!q{t{FXxp1H_C5c;D!jS(q4jI!z6ZdY&qfVh2W?k z73grdZV`ebd*wPD&OgH7=0$*ug1z|>;G%)ME&?3cTO1*7X#_aR@A3$61Awd3;q>K4 z{b7R+7pE(~7Qnrt!|BVpHE^4CIKAH2Wc9Z#if8YP}f1dw5&&-~^_jAs<=iYPAEi*f7!kO!jaCck4kssV|0Y`rIhy@(U zd&(m2SqnI_<3$TNipQ^5z>yuVTfkAj+-|~|{e|ScYr>h^BL=vGCY)Iw#naDBII}$J zM_*dNQN0|qfTQw#Yr>h!NB#Uq3piS~{b|DGnBoT6>!VG(po5LSA>$kMBiV#AmyhZt z$AmN2AMH<0FyT za^}P-$rC1pV6y|hEN^DY#J(=7lpk?Ei}Om!)(Ia{^5|Kmr4T7~XP@z2cS{L+%LlA>}~+=NSA^k~WA;+6PS zpo@OrU%UuEe3U#BCr_E`o#LG;SDlQLm5(y>&uxiC`TfdqS^24n_ID*&IV;!HJFCwS zU7MUE*L?4+zKwzQ2}EsLG$0itjuXD>Y%6D7J%}yTysC^{avhV#AhIGjPdo%jrm{0o zJ6={kkd<8`J1shChcB^7lIti$L9Jb*lB0DpHlbdw+8*c4_0GwiGka!3K-nqRqz6 zva|wR>2yd-aQzUo8i!N{Y7tAj8rNJ#Q6=8Qs7G+Uj#2-?^?F8a#&tELKE}0*QD5Q8 zb({i4-NGSJyU>kJhva}Ju9t4ue9ZKA$Cc~t3ySOItv*S#`%+oqm7K6$uJyU|0?MQA z{g4MA2q>?)4}+AI-vi2znKkw0Q~dcK$;uwJRZmm14^->eSyzZAkKF7hQjr}{8dy{F zCfeakXp$Op19d(({BNIJH_7c%+s>!U?EuFAgZA6WI8RW`%SyT1mGHf+e5U;6>{AV6 z@J6o9G*D>`zDFo5@9y19k=2w@(fbvau5cv0hINP{65rI&_?%x!g;UZbLn1?5WJSDO zD|Zu#EWcJpI>U&samKIl#;=LSuO7d$*IzrxTe~FAUppt(U%SMGvzsWnb1k`utOTID zX1BBY9o-5QQA6&;tC{Lpt_!&1Mc(pxavg3~WBWkBzsdu znOt=?y5gkPg-L6i=taC0&$3nw*0AC~e&wK^pd8MuX)5mm*NH_}_1BIUP212oFi7lP zEww99{EL>&yChWS$qDZ;JJ3IuQXufoVxizX*fS7b_UiC>|Lmfttl|3pL!;peTAdq`!z=)QSdS`-f)>NpR$KB29$a(24fs^ zB7g0;g!5N_O>LY$+lZ(o#(i~oXA^+(dz5!;P7BlJ_TzS|12~-hFYXxh#ybhqal%AkSj{`H0 zMebN~+it4cqFF4sZ6R+)a$XP3N|>{TwBzuW{In+;uQ?a>kax=DojIsLSEzSp!2(PN zVFlSTmr>M_xwRDFc&_kHOaWorkACGe^UaX{SUyVhLD6OS@U3^caiPX^*P2&#N|%_W z1zELM?Rb^r$Q`dWx#Q^|cT_zdu>u|CL2}2vx;qMI4RuFo5OX}u9R967@8=?+)}dS)JokRAG~W3m|nKPKPuQ*DDwmSsICogKznF*0cCkdo|65 zB8bgr!bae_m{D@=BzJ58^XP7YT1>|#PNAh$JSNa`T{(>;AF%?bBvpFO{m>h? z^0Qbh$vabCrDkPj)zmMKlk<1Uw#*H(lKJeIH?MAw`Dl6TI&V{BE3DP-mTi#pk6jS; zY@lv9>B&Ts)lJ64Uz?8}spzT|i4R0|nS2QJDJj><_#!KZn7XQK`k)48(lnhz;Qvk6%PL+>l;**EQ_Q7n*E*OHTD5O$}qsF{Vb{v2m z>14-lIsZ*kC);<)|JaXua5g&F_u33JbV?K!$%*)M;?slA4VXD2d$2Z9Ro1)XsqL=c zPEF{YGiP=KbtOJqB~My|ldmj$wIa%o?>DeCiZ^{&8u?u00hQP_Zm+zLxeDD0L197iNAx8KWur@s@CYJW^K9!L1s=hec?;=7P+NnZKtboPob@ zP`$CXf}HaPS@~F`knii>3i2*^s;{MDi51D9L0Z5}~e+XZ~A|^A+H>%>2 z@=i2v8N3w97aP2kD#?)ib`?(g zEO*k8s*?ul*1O3&{mRUEzfy*f`xQp-*$uQ#;_iMvw@sDH3Vp9qROQ6VVqo;2g& z?n#3uccRxpeFf#*`}D=r8|=PsvuJB8^&_zX>dD28rm{C0xa@DA}L7 zNphl+>>0C5uNhejlQy+#@L8LN@CdJ~O@rrAbzyFdFCLg0pWDz2#_$%tR5NQVDBi*{ zDBi-fK;{)O9~5t4TA1@RHcGM(!x|Tng!e~nNrUx|x>7kTkJ(Xi9)=}W5X_=wUg>gO z`(-ptU<;;wCbb`DU>jHH$=Dy{ODNg?hrg~%Z|5dwHTGO+@lLA+?BmcRLn?Ci@nK8l zjW?_6f2%q>+Y-L>yeaQBAo4(+Kcx@}^%dH(qE2>R$Y^FGO;t5R<3GB+{KwO}L(jip+KF4DQFbsOZZO=`oozZ$bNObGMvNEyAf3|%TKC>z}ChQ-QF zSm|IaXT!Ey&8V`yY!!2uH--HVS*x|0PyWWvDpoP@40wZI*%3fHz&+3yJ6cJ+Jy7W8 z4_j1JtEe!C9chj*=}}RwquO+a%v*3eq#n4QKSWZt91^WJ^BA=NS6VAMSezQb zI^JXWekV@5^faz_F^VQsCz+IbjXDVG2bMf|qiZ$v6P~5gUP~5irL2-)?g1Q%_uuF$Q-OZ>^K;6Tr zqoD3%)G<)^Gm5s9)-#H1{WqgdgL;5bEDTZai)FK33Nu(v{_jNBCj2~4%v5XpAbvz6 zbYQ1H8LRWOSbSn)k=6~LE_}N18HZ17DPy#&%?^q?6A^NzdX!|js=k%HlOB%3K$WJ( zK{ipOu~!d%m?iMIot>y;i}-(CNc=}&yA*LOIF2Bq^@C`7x4lCe1d7L}d7vCD?R8K* zw(Zw)J(DplsyZoCJ?3F?BV*~Y)Q^aRT`p`Rd>O#^_)M`^CAt~*hp>oNI~!u!&WdQv zk4~&Xs~~`3!WI9>|E z=3Ycf**j;p%y$T=t(ralM-h|8Wgao(LGh?UBQ%dHb3oFEZT|(uEuvcmQLO)xCf=ug_@0Z>V$TB9qoC|k0Mx^b z$^rEVqiA!TMh?3)4HS*-c4-!<#~GCeY6GJRKt0K*ngh!R%lX@6n>SkV#*W#4byvA+ zMXa=}V_i-YOSj3FdSe?B4g`IXl}<9ia&1yu3^KHNmBw$&K&|A66Hn^gf ztW0$Q(TXGBzVW{u?nyUiNdbM;HUV=R`as&#e;2vcZzJNCAk?lL3o1&|CSGeSz z_&-1#n~6uR#cF~omd$5aJyf1^RrFOWF1cGI7_X@iUM7pCsx&)d(uP0@uf@@zcr6xy z;-H8#@N^p>XK zT`!w^vwA{}c95$Y96KE2VouOd$@6q)&W!>ljDf3-br(ruOmGyURycoQPSmAuG7S;Zl7F%R{gTFSl8;?QazJTg9>U{z?Y~?;ca}e$WBSGDVis$!+ zcpCXS&1oGhe%^|24(TmiA7W|mg5qh7pdMvuKWk}pLzZ?098z~&Ic^xJr&t>8Ch#=6 zA^RVemaC<$1oa$CTdk$N28x$?7bw+lnX4<)b1)sngEG6zI|^^#nH-IhQ14=1FGg=_ zeLkL0eB_kqF3reb-9~3+!Beb(r{~cAMp)G~O)D-IURK^?3kDwTM&K^dYAlzBG8T7w zYGtC*mEv@;pUG0}aY!k+?qzk74r&og^YBe@#9OKXY}%irbu!4A(QJ+Uzw|f;O$6BE z7y;}hCbIU$o9fDVL&9 zbUVx;4FSbHJ_!_gvqPem*WfaB= z?x> zHszm{>#}X?nvHH}I;$zN2b6blM@ZaX-^KF-%Gn)`c!}0^nML|oWXHD2Ub$|nkb*ra zx+#iB13pi$Yo92;*T`h4_v*!-SHONY3DFanm3O%Ye_fi*Upvh0uT7Cq8Q7@S z?z9R7a~4{oQb(RWrxmS~aE#_3 z?0Ornb{LLF!x(h*~UEq)|m~h_GPI7=j{wd z`Zz_L*Ex0y}{CKZCXifhH}gLsBnBPXSt+@Q^c{IrPadbtB zdQkA-9GoJKLoDs0)~%%0&_jpHLAe~)UZY|`aSlR}t?Cg@_9w`+OBYEPTK|t^lianc zV0?y?{Uwvl+CM3{Zh6>LnJF}Ki#bI$9p{`~+elp}#YoXZ9ZT(byhR@ls@>}}PEHZ$ zDb5+>1D7C0Jt{$PU7R8g3hnT<7>5*t8i*O%hPBCbq^igDAUGGNi0gNj7VK;BDjc7y zSuXh+r-(yB$?a12+zwLiFYTr5V;!XQ@{ZEjg051#FQfLiuGf2G4!|y)>u^%Pg%t3r zM->QO8cvaH8kAr|hbXB-Qrpu;Pv)-$Qn_h-=iHnkZrZj$$$Cdi&I9dEw>=tFAKY4b zKy<;Wm*yCpMLo#xxI9jgJPL&r z?(HfE<#HV9;#920K`5Fes7E;2)Hli7`Ju|CcGC6h8hA-aCcTJ8J;KR#Gr2q(2x}+s zXh1gx)ng3^ZY`(Cp369Av|Wl`?Ks+snjQz`sK*T;I2WfVkG7Iv$A!_-g}=0s&fgv_ zb$~Cm9!B+|b5pBvo^Be|3l!%jIcssMM>st+oq-YAm!pSe<@&!bdOD(3Cfm5W5%O#n6 z1P6VDle>spO_6b)IWp3%EA==J1g|qrk=3*Ti#CXBEA=S2MCyTd=wWk79gntO+AgRa zsCTVn+_*>$K{DwcD3{48lDV9hh_you+M%t~d8pnF<4J@#XxYTMIYr#pGHyN>pzrw6 zG`n&y=Qye%PEl)c4no~8kn|Bwb~TqRP^w&N16{wafy*VC&kGLv2q*VOZgH4d)`iGX z52{6OEvLx3TNtOSZA=Gg?!0`w&~N^N;wu&|TD+uW>6Q4`#foKDEnl%RSGsse{1{vk za2Yj5y0W6Ae2laR=X{)V7ca#nBJ+@;3B!hu7@0UKJ{P~$9FJcuxumfd`LdHIP0vXI zss6CZg})0d!=Hy;-nU=Hpnes7$4P3Aju|J7rT?NEC(%_(#lO527P!hwTubNTFBx6a zG6SySCHUh~*H!qR5?A?xLf2ya-!1-s6mQut&gZDoK`wuhs~DKMWv(S98%1c+c3YW~ChrgSf?<%TTw1~+rt5~|Uq*O@fKfoF~C`KAwP`GR` z{a@)4Y=$ragO`ZkXN`90Wn`}vhaOSHc@;%Pg{3a~V^GM5%trq-AXtiEt}Cx!*(IZ0 z{mPo-2~ky0TvX)xALwIzAxhOYp**RyuxJT>%O=HiXxn$}xc*Xq<|eqpPx_Oi^yi+^ zpIoIs`AUE0EaPINewUSv?N=tj5VUt$Uuo>%eq|z=Q-kqsoCJvYDO|buJFuaH3P5r{ z(mZC!p!mLMu>2A`+JKIKa$>i+_7oz6-$!M36c56t*z-}DiwpT2PQmK(Nsx<9a~?VhV!Ri!Vz@8OAA zZ@lp9n&=+Odd^GQI{5fKNeKtk&+hXEUp9Ee&wCfH>%OUJ_@28wU4AS2^sj|8zdLz&!S=5b-aGx>xli`l?&|$y)G6N0L#r`mS? z>5~b=q8{#?^vslLy&s$2reneC3)TFp`>yy=I<@o$HUG%q5a969dpdvaRm@7sScruLEf_YXS%uZ&^C$~XMB_2$ZX z%Wrp0O<&gQ_@Eo6KlkIg8=n6r&}-!j(-t0Tml+p#N1I0*58f1i(bj42?VNGyr*(Tz zeC@xo;*x)!yL0H`VI$llr`J9Idzayb|9wHO`)JcRRsZEV6J}*SJlHoXWtKbe{=v^S zu6gR0l~aD4uI68O^L4#bwtU&Hpxe{;m(+Kdc~AEI&v*AO&)IYNt|bGPE_kjazjd-S z_1;q*-hO4kz{ieEtDANG{J(zQDGeBZd~e5(*8Hb9rBB}-&u-ZFdfKU7rzX8F<)1nH z%oFPz&yDEPBd6=2_-#AC*|KxY+p(1&%|5v@=Zc35izbd7HK^pk&+`)2zk0d9&7#`4 z(r>T%u6O!JKc3e(%>T>cSK_6@BS#wMocdbXvi;oF4O#2Y%$B#mdMsgL#(%qi@Xffl zlh>Vy+V{};D+cu2F!!F7zonjTy6~ zt9+wBf8q6$u1i#ZczgGul!Gt6d+M(W<+zKh^h*-%}55{MWh5XSv#4_wR3pTysbE)+^<)t)5)lYWdUOY<&Cmn0IE5 zSbu2l$4Y*&Yss*7>ziI!dH3&^e0Sd5o9^>`HDhz<=^Os_^)DlDOZ{bP8~0`3HaR~% z(6}gO#cN$Q&R91p`q1%PcD$64>c8x>r|x`iLC-^Vqd)EUzymdy?b3?Od-Pw12 z%!PYae7NA-i;iurNqZ)#?yVgY%QnSNDe+N9MxS&>X*qWMX_TnijoLfF9KK>S)tx}{cD_JyXaRKtM=gKg_ zF9D|MkKHz#iwn92zW|t)BzD_tLAjg^ekm(d1()^7MyX3+d z%tbkN8?EN!K)t-?#??BP3n_FsOkAyzYPZq6o2WbPc(_pK8iN!%TAR3NC2zOUe4932 zpMTABPUo6NEI8VjxT271x6%BPboKxBma*L#+9@hkNx5+!!Y`LToZBfl;GFy zv_q=hM(se_cg&kS2_NE!p(GrHX=P|Zn(5nZq?sV^=XCe-my`y#at8|-swcZ`G_K@r z^X^$$WR}BLSGHt0iy5P7Fh!1GWf5%fnVSWDGm%k54^q#&k!X-9{}- zN6ZhMzA|HaAjfW_R->cTvvQ6Z(-S#%+geYbM+!GAdMJ;K!O~;k&y7>36s?C^-8HV8q-8KPNs-II`7Ogb9#uh@;F@y>)j#d)>4>*58sruc;Wa6dT1`Oo}OewU# zqaIv#u_7}JSBT{;5Df>i9 zcP-^7k#eDyay|tP96hv@(IVwyEoGuexkyVX5h;DOl(izorKLP7Qrud~>msF_mhz=Y zIbTbOqRx!t0xcy@q;%C%WRcQEOSwX%bk8f>Fz0D02Skd56y9`S8B*}J zocyH}6xl%->bZ-ThNLViToRJ9LzE;hxNMND zW2ihm3@KC|iljP*%0rJ%=_$jJveb}5jX^t@95X2Bm5($A*=^KDbhNu<%u(Ef;a{Xb z1i>&;@C)8)j>pG$>ToY*cj%&X;dU}R7)A=#g@H$K5#YnkBOZ#?boCWn3}euBnZ`xB zYTvnLuFf@7a50QQ*FP9nuw70~msfBxj6v4`gRYKmowq^f5;yYL1GQL#1l8d{jSB>` ztDmN;Na$i1gRVgu7uogdFZQlFSB2nW7=y0CjEiQ=bUgCJN5AyebX5s1hB4?OU(?&` zhKuieOy_z|a50QQ7x|;^8-K3-{@;BxU7rXphB4?OpVf8!-KW=dovSrXA8;^?K^OV8 zu4}{f+28llbPW_-3}etmzOU>0Ph9FgoolM#ViK}Z?0YXYR(Ry`HO;@GhViO;D&p^4Wn)484$TnuB-HIi|4p)1Zw-~Mq%=Xy_YF^oYM1vFjPl$(Y}>0EyZE`~Aa zq99|psk+X-9QVA=)law#!x(hYib>a1SbX=xI#;&fViruhQFa}+h8+6^1apcs+ny$Tqi(w49#u;>_H1^5Txqc8_3}euR zg#qjm*{pwEr0H_f@)`%j7<74%s@Gxm!WVwlxe^2y!x(gVH7*cRzjvqi>#OOSBDfgF zpesq^B9Hq1cyYSUb(P>^7=x~4#uaRrOVf3i;9?kqE}ucyH51>h(Yam~TnuB-mBP5< zaK(@#y?@WmkGnNpp9wC8G3ZJ)=;~Zs{Ibr~B)AyHpev1Wku4KW*Fa}+I#zpH*vg@_E*oxhpRr`qH`SkGiD$+*LZ4qaBiP zFpNQ07E<*(JaGF<59?e*1sB5@bY(Lx8kb2|R&gEXQR;jnPjE4eL067JSF87reyDTZ zB)AyHpzEKSE)bHh=gjLb&~&{fxERKuYl1=7n(lwSpmTjKxERKuYof+Qx?Z~D-LkHl zt`1@&gkcQ2CTUz$8!z?z`hA^ixZq+KgRaSp%SBh5J>JScU+0=7xERKuYYO9{Y~s50 z_<=P#SB>Ce7=x~&or`T=AfI6jx@H)3dAjv|SLeF412S}6Je(6xV+lCE<- zAh;ODplc!Ha^Xs2<%?%C-a1dy^`_ur7=x}wj7zmEFJsOGo$Hj~Vi<$2#f(d}E4%Ll z+wq(q(&*?x;RFZ67<4T`sy=?b=ly<`&gBza3}et$!njBm^^}o&e(tJsEf!o1W6-tK zplg%!_|Q8wwieB&!$>$(~Q7sD8Il^S#%uDraH&UH#~F^oZ1nWhVb zL~Ffhtq!|)qBQ=7N<@I5Kb9y*s$Pd#gLiv%F0bHX7{uLj6$D^jOYQtY%*7Idh(I(O!YgfVheBE`<` zjS^zPaXCxZ)n9NC#>jO&QtUP{?UNcmZ-@A=>Pi({gfVihW?VgSrQ=%r_nA7^Lcv8C zBUcqt?6$VVf}?ow)0gX9{}o(>F>+NSMK58+%imx+rk3y>!9^G&R}JHe!j+DLTN9FX zuG4~xFh;I5NYQ=%{DPa0>s(F>iZ}>k=*1E)`eav+adCSEb-0jFIa`#x)XGI)2za8pTm%+%C8XW8_khV%P43 zF6z1UJ)P@a!9^G&*E+^E7FRmvulg~lHn7NJ2Vsm{bx5(>M)7QE)icjrtn2a!F2WeO zZem;=1XtHC)d&)*T`L3^VT@ciGcGk!C)|($TU4%l1Q%h9T(=mw?6dZb(Yam_T!b-l z-O9Ms$o8-PA4ln2p9wC)7`bjUaJ_x^`k-jTe{jct`DNt#7vlny9TOWnHtM=u7w}ZV z7`bjoiXJ!CR}A{6&gBtYgfVj6!MIdi8($xjqjTj7F2WeO?lf>cH9FW2uNGW{F>>9- zxYRn#i+$ptuInDbMHnO3-HgkQD;=?}9zk3$3ogPKx$Z%VUKp{k)+I8dgzr3Pzy(+i}W8{MIu&W)ebo`MzsK3s2Sa1=>$n`K%_!B|I^?LsH z)jHR2f{QRlu16S`T89aXUw&EV;;-%CuW2!IJ<7P$Xmk12pI*|rW^_X)4#F6@9z%+q z-u%RlAwOK3r*oAHF2WeO9!Cm)rh?c$=(OoYoolV&A`F*%P^1u+ryMn;1phV424L{? zn%d!sg&jYEgFUXCt3I)wJ8y3O!onp5xp;8CJT$L(F+KmD%bxuXVJlqDviMWxp?o5f z9wm>EMIv*XWoC$Q5{gO-3yrM!iGglUJ|2cAo5X|UdIq8B@xqcNg-gn%ip53z4_L(2 zC_{tg=AsUAa|=sLmy}5S3*D72Te?Ji%f;7%ilurUpe3dHR~<>^7U}qf!lIIV@dXe3 zi*HDqy9fdcic4~rmKHB5FUl>!f4Gz^DFZY(lRZ}vl*h`LJ2xL~Ra`PJx2R%?D!eFv zQAwGq7Qa8x%T`pf6nE0ONhsRf0+qh1w76X5$Q7kQy)7YEfk1dE0>nID z_y9dUGGbV9!cgJTx@QTM#q*bxlosZeEuEWRsCu6Xw4`u(dG6fua`DTNToa(E7@aYH z0sbf`k{;Hix#e@`HxFo5#{9x^bcQA6)D?KoHWh@cF@m(Hv8beEVc3un)H~HWFftXO z{|S{^h8lwkmz!e{xn^!q9MH=t+Ngqd074>y2~>zKvlMMpj&5bHHz8?B;Z+f8J_xY1 zv}CEN%0xcJQT#(wVZOOi1!8Ui8rN9wdRdp27UG9Z=oBors!Af|^RS$on>JCNOMfU; zn!KPee<8YKSz&$!`tS89}&~1+u}eWqBONZBK|)ucSCw zo&_M6INYj43qUS$gjIJQK;VQLZ&fB ziIHIjaaynzT|q1r4YDF(c#Eh#HWG>thb^JFEVYL=FRLX~vj(ymZnNfbgh5Eq>cLp) zd~RqE*AmtsIMmSK<+?#?vp`;X>WrgVsBv=AEVTLN4O7xcZES$HY<|lv!~`^mmY0;yonPn~KV!Ru zA31)+c(*spBS9@?CS`g8>E6_|q(GJ@@~aziHT`c$1kc=eR z>&^6LXL;ruGluyx{ob7HjC2p)F<_9DoaRYS3uL5ar=~PxEPGFdW>b7}R!&xuS5Ee5 zNh6XovjUm^>~vV-%fy+3&4=;Bwful5Jwx`TC*}ABAUR3A-q-JEM`1~G~U&{)3GJWaUIq9fWDyEtb zT4x`ToRr~B&q+;X5PFw}A$wR>QfhKqCOn6-G|7J1la?+gr=_7j`D-o44=*nnKb*aM zWBhQuePjG^_WF(S!|DASK}MryQghPM0zP=i5WFp8{1EoK3{CQo3}13iPMVzJDb><^ zq%9{qCnYt>!xl5+hp1s-e8TwQ!3ALZWjbSuCp$SUkR3?&wZup>-JoLnGCk-Kncl2) zZ%dpZD$_kley=|#-QN;lh{i0BKf{}ok(HLAH6#TM&6bhywzLd6Bh@2bwV~%^Bqb%w zndxXk*0a&Wxs#A%W`j=CpuNJFFA!eO>$aDpB|o` zk)E28jfSDj(0)BMD*!soUB1dq~;({%Bj4|B6gFY5S^m}S^jiin%^6uGb}hECppI($Vm^- zKwvEUker-sANm3}N-M%pUq*6<-=D=|Y>*YBGSd7>Nfdi|CmDt}j%Z8)Parup&Fjw= zemQi!AsclrC+DOm%Slw|ppX_4iiV6IhJcTdG+cefidt2ZHB|{|>G(7BtSqkwO5(NT zk;$+$JtrgJ5i+%$Az9g}es8ib$#a#KmYVKKPs+-Yvsugi4-1r=>tBo^Hfb)~=hipB z__kNf;2}d2T|vi?k)z^Aj2b?2$f%%1kVE3*M~oPO&k+gn2`n!!reMvWR+oJA>J|I$ zw@H7r;kQtNUp7D~vvK;S@;vPt6DtM3aDdWrZ%2A41m}@rlY)PwO}Gbak~Dc5es(sU zzVRP+xngtj1_k{@p3>uR?wEm}$Ks@eZV7oLPkrzMNR;lNyqQGlhbK1P6N)2wZGamj zuqXz}^Msa4+?ABx0j3Qx z;E067{cx!VFbiA2O$P2dU=Fr`%LeW^Fe9mM?d%MejgtBThCzZk;QPhSMiwCPGD9)$8mci$a?}0 zvMt?=$J+>i;~Sje{)ZS0FX{-7n*uwo0p|UWIBr-3+$i9V9D&TwIgXyE z3#Ydm?A-;-(W4v}NpD-=Mt_0VFnq~zk=oaT?5P67k>T~Og@C(&>+>~7b;3uu^4$SD zb^|l#1jk(%0au3f%I_rUXPk6IDqkY(h-!pSpX9hm_CDdnzjOiP{gdOUKZh&df7;;> z>|5hsdg+f2a9k4scNpW@c^BBE@93rLI4Ew0lb4TzcX8RItNLIQ5^n5Jo3sfh9g%RCBF~**lQMDA5viUjjLrpSYYVsuz`YMl zzhTYGYY*HgfdR>maP>#H6bm?XU+JF~aRnA|r1vTdxIbWK6>!&%;P&%oVE|TBJ0e7vyfMiFw@==_895_cZ zmq*jJaJb8n?E&T*AIH%=B^<5+>F)w_3;hBg2VKMAXuP-=n5`|~$iCeI1Ckx#K`${y#ma3fs17C4B++x6PMO}z0hzl6qt7O zhF=_!+V_3r6#|p!ZywhV*|!1nayrL#0AINJ>xk@8_)ELAK=Ziv$leXi2kZ|&BhQD< zBY9aiDI=T9qk0Obm;C5ifdR>mNVu0R;Hckh1@45v(mXz#JQ}Au<=CXYIO)*ZH|UiB zlumJbguu{uI@mgZZN2jEbfvhF3fu&NCBI_05P5`KYEjM7WKmuoaEn@yNA-83MS1rE_qYXl+bzmF z2;9*Y~VL_9g*y%_8kFCYA7y@yaHgBhT=lX=YqVO zfO#eq7e?MYz#I<6g~%g&&j54Y6mADyBeh2_VB!R>IeSwD2BO#zN!}FT=CvS?+P4yz z+e2|-?0p`XH$rhC_ELL%0?f%!To`#Vcq7vV^j0Puk?f`V8wN~{z%^HYGk_^-K^~Q_ zT3|>o9g*tqcHkatK_1oL8^9b0#f7o=G%$aL;=rr5K30!mSaR8XlT98M-75EdFF4MWa&B^Nx%w+~#qYNOnZ3zj)xrwjhuEZ-zyArNCWlLEd_c@?He4-h#Z(EXq3rT&r2l*WUox>jEYq zaLxJi6kz7HAdl*=QeaqP;1a1l?gsAB7UWTX+Xl>M0@qymjsx>c3-T!5pEuhk^~Xtv z=2v0jfe)CRP+UknAbXbpvnCW5M&6^qJQs=!kw^Z#7nsjNabe{B2~0F?P~p(*2qUjQ zFe5^7VdPB$CNC5hB9GeRT43%C#f6c#8JO*%xDa_{@0Y;*6p9NYFE$r(7bhK&>~$e; zG%zy+t~q}x0A^_m@~C__2@FVfMDpkRfqSY2c~pP9fH@Y53uAAqJe$-JCmoUOrSc5` zW^5=fjJz4Z6oukK+Joi?)xbONU> z0@qymWMC$>AdlLk6quVV$h#YuM_Z6b_HF~_<4|0f_BacSV_x(2Qv3D=W@sobjJzCR zW`*KH+Ly|=5}4aUabe^=2h3}sxDa_%zK?%Yk`9;F|N7=Ye^n1$i#W`vjOjEy!zAfOR8IIwIK{kGyzb@hD@$ zZVbhRX^$s>*&K=sBkvF}UxwmBw$SE6c=JI%@4i<=I>Bk7MYkjqZ=@8fs14>$x8xeh6Q;Az$|S+ z9@%@7z<^{&B>%e~xTji>$Hre^jtN|I_MQUf_ZH;2P@--NaGwb$9nHy00wzn~BGn)H z-y&ctLvdl+_kLiW3dM!AFV){JfuZuz5vl$T19z+ic~pO`@P7rpanjM8y>Y+{6SzqB zlD|v<<_Zh)%7LkDK_1oL{lGjQiVIVJ`+@l+6c0h&-ylH-On2iVGv}Brs<~aUt@^-U}Alq(M08XwKe5V0;4C zoW1jaSrdv2Q@%%mc`g(eQa-YGFEF2l;=;)L6PW15+>S`)BYXP;Gfv=|vsVUYQVa6f z{-nTA{m~IAzN`dpO$+kK-bXFUdl9($P#Pyv;~H9iCXT-quL(XTq7Ex25MHE;HfG@(7n;0XGu3u@-O+ z;L1!mbNPkX}R6#If_^d zI4a*o7I5STLrgfcy;QytCY;$`dj4&k1>EJp`7Pk6{?=H)d4apbgv&AYH|j@+OgOV0 zsla__!kOifz41$1Znwd}jj@2Edbz>^j^f4!3pldlMH9|!2R(=Oy9sCZgR#I#SGH^~ z`PEnx&Mc4Of!BmHw+H#(atk=>=am+4)NZd>z)^d=WdTReTeT`}xn5{oXm0^Wajmxn z+}prqn{ej#9S&UgvX;w7aXiZc&IR053%GdTuCjomadm?Q9L0kp7I5ST-&w%X^AYay zmg|N3N4yDV_U8oPMwoDBf2Q&kTfmW@K4Jk!_414b+)&_Nw}5*WxF1Y7vtNw@?zM`R z>yPaC)dG&@nbNXQdFFa1JM1Q$xt$tIjxUIuXUO*peWs+Z?Y zII}z%xHnBWvpjn4we9kj?WMSpV8WUGna0ae7I4&$#+h(tJ4l}2gbS}X%L0z;ITfosgVv_|N#kDsq;K<(JOgM8rQ#|;d)!ZQOPbf;bKkmY-+d5OgOV%8h=Mxz-0lKY{KQ3^wRwF zRuj&w_hR7QwSc2~K5fF8+k@sgznXAny%Z<=tqg77@VLPiaAfZ&3pk3W6&7$F;BGMC z%=Juha;F6xmCw1VWqV0ph6!iZOL6F5CY-rFs2|;90Y~%f2TeG0dypTzXTpWod&mNg z;?SoioLO%ia9>-%{R6lTSGQcxR4<7poY@ZY)A1&pxqLJZ`Yqr{UYP|P#mQ?d;Q9f# z#sY2}a2qY)$p225aAyCb-!l!lCbXW-I4^Kz7I5@?+80eYb3IeLeQCm(+ie7JCrmiA zJX&}6xi-`eGmh+?V#1m2rTx0QO*nJ;=y%)eO*pe&n%^I>fMb4tUCVZmA0%49QTdix zz|lJIB?~x;8^=vJbG;DmdkZ+K=btR#D88IA;mq|+djB@z%;h8hvsZ@Jvl&PIJjR4G z>!tE_v4ErXU@sHSte4uYj|peiOa3y)0*>Y{wH9zRkG<0Z?gHQ*vw)-fDX&_<^#JaD z3%Cn```#ih=K9d~HP;`>yTk&Hes}A$h?{Kz*9Y>JS;XC80Y|?de$gUsp9S0{koTPh z9L+mBt!}xVF9mLx1st`T*+7I4&VcUiTeX8}j|yYIDtqj>O!1suhf!xnJlSEnuDNM48PmfM5&uliZQ z(K>X51ss*nYXL{|$vGBqG|tR7;mqR<;jXZN>kr&w6V4n@UBLaz0*=-xFId3QxO&V2 zj>hSe7H|}=&RD=vyy{-lvL6sG$pWq~a0@NqXx&|B0Y~%Q*Dc_vzx`qXN9F6bre%9c z-e?Or@|QUlaAa?_1su(vU$lUu`=Q@hz{LXhy9FHe^Ozf2u9vRB^|XNN4BSu)IO-oM z7I1VQY?%cd?OSZLfTQ)%wsx8`6gJvk=|=8;AsEgF$*|~lW$wZ9khU>`uofR zj@A_?E#OGr9~N*_&uwpPx!nlY(*lm_d7uRxt&=BPz)}BQYXL|1iMLq5vGueGXZCxF zLqC~tX1}L#zpWBle`a|UPurVtW_je#E(k1 zBfnp00Z0D4)B>&*aAg*7WJiSs9L*0_nQ-QMrhc@}0*>Zk4_d%o4%{{iII8C+6VBXj zw63t%wd^lcFYQe@vpia_o@c_D>xKO99~N-bk49O*k-f<#oVk32OS6c}uz;humTkhB z?IpcaO}Oyon;8z5zhGh62pTo`u@nxN8-k;kjJjN|!M>DK@8rOwfIn$;--?RjfLeoH=ny@`Ont*zABW3ojp@*w;ly{D|{$oC_oy^#Lh)^sLg-ih?D@`3q-NEGaH3 zE-V573xrE?b-UR6@MaMrvE{J|Qo^v78R{4W4S8hfqspn~GkSrZBu72>7B zv(#6r55()=2jTC%q|wsYPSQL{+AnpMhDx;xZUl?Z%;NmglCqMba#!4hOI`FI0E>%P z;vdIc$@oV>{2O8^$|u*(a!1Rxb1&PqbPtju!9%SyRBQLftV%59L9_hn_@ablB|!(b>svSn?M zjI$);5>?`!o$N(l{A(CtwX5RgItqCxZn8%w6L%)lz$D2vXUcoLGMFf3FIQSqFW1R7 z+3DNc7-cMfZJNv=0fjbkq|BNFlg)!a-$`m$aP2spt#<}8byy5 z@id5I2NI+v9OA3g8w8~VA5MI+v3JE$9JWbtd5K0`D~Agpdg=i0+TyO$Kx5&<%#z@g zM_5Xr*5~dPs13MX6DLoho{;E=pVuvNFX!EXJ5}u>cU(Z(8$c87^tnj`n*T#tiI%H& z+jy(i)NdiHobsD!z{K1+vu8G31lY?s9a0LeuQSS{tNF;UoRyWIWaWf#%YD=*T>)i> ztb733!fjM()Ze%?@`zVjkVc|VWccKcpdyplW{a#Vp$Bd(6j>{+tW>)z!9(I@RB9YE zCSu*_is;T=ONxXwd*z)CRLOGf)l^UDFQEoG z+Q2Bec9J_b$d#BUAuRqb*Oj~TWaT5)!YK*6Dd3{yJ6V|2TR1*<&ddgy>hK1p%>>@S zWH_SqB6sYRsoqK6DP9q*J<)KUfbvtI&gaexDCgw5N$v%RSP5qmjx^@G#^p5tmZ>s1ZSDkBJagw5WUgL!c_0B%X zZ{JF8svjMQYpO_>tIoEm_@06kOiGJpx>dzY>52#awIfjqe{F99H08t*7?E@l!Yaa= zH`hDIJ1cii!)B`D#xJSqzh>Q#I>THLKC_#r|kZWIb=b#dt)o;M^l!Rk7P0ng^62X#^aE98##VuN!aK<<0 z+p_ecTdMw!DNFV%X^Ba7?fc70`(3hf4_T$OWi|qSI-u11?R$mJfU<{WH0_Y{cLnS} zCe=CmkJ(weIR$}4H9PaD&;E_5qLiarGJA>ggyuYecH+OlQhTzw$xTs6rgS--vk)SE2#4qP{~G-~gIOx_DxE@94NxgUb!(cxE6rP;qZ1}HACNK3mC6qk1^D9-yXs07G#NI!$(Ixa!&aCz~dxV&^wTpqp5o~O+P z#pPWOiu3X*#PuidhRooQSnaN4DNnnP;uF&t<##QdATaoqkDC4&O*7`s%*#ax6P?zF z(Nyi;>)e$vQ1lT<#TPA4z-yYyyK2IXl4v4uoC<=-cYaM13j;C+YG=w}4A}?}rhp(T z&`2D5k0IOG9ExUw+~o#=a%Bu`3BB_Bj?rosz8MPf0 zm+~nn-Yh9td0;UxNF5YYFzQ8n>%2$D&RNzGpTCW@EoaU&I&0o9l zsK2)Cu)lWI{><94T@>N`O3iU(XVkUds#P(%{VS=cabDvcGzF`Ng~@+w+QSP4(D%EoL3toSQOi za#KU~?ut)$w1U~GE=(8BMu!tg%f|8{kmuZFudXk5*U3jK&&^rZzE1wF@|S|ECaXO^6xW13j;gHsY;w!QLfZED%TS0BZ z>5%r~I)$ZCh#i5`A+^JmtaM0|w6r-|8imt`S)bYhiucC@p!hV7A^^{o;LBWZTaD@k zikEaTDBcUvjV4d=PVv`mlrb)%FFgnm!F{QQn($0gv;(0np#12prpFi1iDDCuct=fh zIoIT{@2gz!R3EXX#>sW<@6&t$eMqhwi$1j1+cYIw$%+=er#_^eJOL#uR_!XZOvNyN z3&+-_++qf2yDWnhXU*<%^hKMqrji6JQ=|2M%(|=$K(~PMW~iE={@f@Blx*t-RI{_Gf8tXu0ob zximH5e*PCI-qSjvJ_az3exSI=Q{3c|J)pSc3{Zm^ZWbtBmLgC?SsLw^@RB|Wiua7y zw6u3XagIZvcgx*9vCo`VMtqbG_yAUForV>X{&be-sr9R ztCe&0CX%82<$v?r)&cvghw%;R(Piztv?Ov?--QIxnPTBD~XkFxKRRi6&}MQ}l8M+yZQhCXvDaqiDj^ zv=mL6(HSNvqeH&VT`u?p0~(>m179jyC51d0!(v?AhDTbil((X`8#M?r8}0DE~Jy2#$DZ*AoRF|1d#6;9rGN!7W|`nT?N-ao6(MqQ<4YjY2O z-8Hd(0TJG&OYLUp>pkd_Y<%rbJUA&+K_Zs*WgwH*8|$8&#I$yx}OaWM!tTv=h1I-};r?nIM{ycx2^st`!AB zcV!&{+M7BPs-BpEk~N4N1nElQMcn>Cah%oL0H>QH!EzYL!)MQaEC9&@A#KfOGzaGT zvVzU3!z_{ZOQ}?vzDT0f#lwj@(#Z#j;7a=+CpC^It3-h_N1@d#2Fl8vtf-bsM)kH! z)LYAT5PH95G&TBUszp*D>S#^<|9ves=5tGj!BQs9lBJEUQJ#vpOl$<4W+tf7G`t`C zQLo)--rJ9rT--LqB)Hz_Q{wg+$sSBR*vqiW<5e8)s(N(6j?NqYpr|YY{N2jB)hMAP z+uv^b!VeF{Efd@rtZ%vVF|b$p+c#=yv~$e{$ke6^!7et*z0}(@8S8brA;Og^pJVWg zm+eOaiYFFZmfXPubt(F`a=^W`X>w&S6R~i-@34p+W(L(NG!po4Vf;-y$1IO_u3muY z@Ch4AnHf|P5}K(9e}TB*eiDjHQ9Qcd7Jy=ty=959+*Ml!cHy4EEARx(Urpsh4;Y;i z!5CH(zQm>Noz;J#Q-}r<)pg=)B*8p~)xw0YhaesIm~~u_BvX+U*#*5~b=GnvxWg8Z zdO}>)3YV>7sB@FIk1)#T+~n`=bH42DMU9Lh%N2ncep$7=8`h)8&<&Uk&P}qzxhcmE z5ppYtkTCGUcOiw{U0{7VvM?~kI$zG|2*#ZDxJ-+|MUKYB(*}aD_s0aOzV4&dgpY1} zMi!~Lb!Pm}&e)tT&KU=a{LX9lGY*kScX;$JMoLs)5CH05G<ckLRroC&gvr|oR_}n_Tcj;XY6no4Ckz*53e%0Jy^U-1rHUN99B3I z>KiYpI{SA;6u*@kL$f6=bG7wvEYLEKt5;icz2{*D54#45M^Zt^Oh#QIf74I-_ZI|k%ZDS6VHl`?rTyTQ6)zq|0KU9+)w%O3+Q^DWZak%U;+yKnG&r*l zGognX|Cs7N1kLoadJB^vc-_F%nqA{^=?ISuL zw1(kP12-hp4RAPirm|QjZ?5rUh3t&u-W*U0=n;iQ?i_#BYhnz;;yDLCMT_TY_@vFo zJofpbdjb38E1UA}^t=N4%W7KZPg4)EWn@Kdg4Rt37zS^bs(CZ=8v$&M0#!qP6% zsL`PKdOH;q->RRjr4@rZ#CYl5BYX``>-P#oVSY!Gr)@;qE+(0#>9m>eko1-OM@ajK zNuiA`&haCtoeW1)qAkp}C{!UYK`bbq)&msRMw@3mZ6GLKDq83BGzwf?M>Z&~V?HQu z8wDhuTczdRq2)dV>JwHzTJdw<1}%3VsLxsM=UVQMpt!wlki+fm42o;(1L{l0F&I}a zZzL#g?>|9t+-y)Bw^+kff#UlR>p;E9YUo~2+i^OijksQn`f^CGgW@|i^cU(}2bGfN z{s`(gPKVT_8=MZQ4A-8_*A!43_Yf$Kdm7YZ zI34WPCeJ;f<$en436^^jS1#pz$l|z*KyfL9K{c|HUJi=;Zn~B`4ODw3rAW&y({ir| zMV30Gn?dngO6#@Ur$GJ2ayM(aZ)v&jfclH&ehP}~J*DN+oo=qT3uu`;^^Ah-`2G%9K| zR0DCzKt?B;XcSOfkTpmuBr%zRxJM@u#@D!fU8=2BYqc)5m0A_VEeK_C1E~vYt7z?4 zVzl5=1hwY(Jms!;j571ZQb|laV((8u+ppogW$GB3rrJ$^Vp-8V73rM>!|Y_5nPRQ81nu_drB1nMX$Nou zy)S06ux4^zK^7OuT(Rs$iMFj<{RJ#s4Ugpmx15`$e6?I}dYoGdP~w|ty6a_aIKxV| zBF;p2C7kxk?y{p>$m7BVYkf>lDnxUNs9# zelo_5_9xcA+9FFGZHmb40X~iWVK7mX;0v)GmQ=gXhP$ev*8{D<|A2KDzF!t}Kfcvc z8&%hQ2AA_051$Mz5j0Mh4j?gXn=4ymR!>cR#3V?VYO@s|$mwN~Sg8SdTU z&%Lh(^0_4~pWfV_C7-t0og#^z+sP@0@DFJCaaMAcyo)Jas8nreis@x-u- z-$OzCOaXG~P5iM0(GvX!8U!Zh#fbvXS=&rvY_>XJxgs%kkUe1RQ2ftLTs{<%_o(=$ zjOf64dq%7zxsZ?;8>IAb1=VXf_?4?a+JZ3D%wK0bLG;_|Gv$&tiR50CQ-;?y(+;TBliL0+KY+Ydzf?h1AWk}A*TVH9Ke z%`-vgA!)i)5C@tjeb@m~Irdwi3UT|raeD=5mbm@ZxG^~wi`!=7_B~LQxKUmyzo9^v zh+ELO(I+ZyCm6TufK&o4H|Q-Om3LnNsoePns6l9dG`@q4R2l{}Pkd>Js)hqysqq@$vBsBX)t8Cy1RzZn zkJSwIi#+FZXrwhM+Td1K8(fHEJUC$!dO><_h;P1N5O{ zcDxCT{mP)LT#XrBd}w>Ducr)6TG)0Z6|f?ovV>ze_3-b(V>o3C^VfwIQ<>EcK(j|$ zK7|)TQ(-b(4e%C`7S|$NsBla4%Fwr`1T9ogtPVk2uyYPUA?+7`p)ZC@o6B0b-s$|+ zZPl?;i=9|YTe17oZfplN5Abvl3!eCR1KtkoVvrDzL)NI+!eYBPhUj=OD7+XcTt)Gw z%I6-S@J@SZ`Ak9xw~HI;4vX@#RY+OLdD}~JD_aMSO=(!8Z2CqPyNS&~inJBV-CD_W z^8^%885VYV5^Czqn^7MNw_6`L5yxXsZ3ptiQzMvh(?X6tg+`YKpj^f!0#z>4L~!YE z7_Y_$rP5x|!tf{ub;?UyBsXp2K)^sOq+C??R-+kV6cHBj#k>Hdy45Nm z)vaC!Qr+rrKq_@U22$N>BarG=U%76X7BwnOpA9rl(nkrS@}d}u?oe!1X448N3p2^2 zvV_UxN0>}5Kt4)%@C;L>{M9SNSBtbrlzobh@F9#DalRV*5|ySeM0KL{U|TsDaj<<( zO6umOKlCbfD&A?m0h~Mc73`Q`E>&l`hObA6fWbk%QfJOPZD*z-EhVWrh2d@+LHp{B zcKl8x5&pDopH5VEQv_vI>clX)l4%epgdZmLn$gHFCR29f1O($j$L0xF^IU~1dLVa3 z8}Xt`{b{t0G*iFUeDD*s=(nhQs5o}xF9AHkXw-(J!)q`gQF*x~JTDM&w%UyaLW-XJ z0L#)rrNDBex(r)OKhIxRoVaq6U&?CYdouBfFmxK7p;LEbTQ`~b6?mpm2Fkc$;|eyT zILSj&hLYBKX((N?*5ly4GQ0`j8W~dYEi|m;Ze1hC@*ObP0?HDePS&M_Vkdlcq&d9F znNZC+u2XgqkI&}G8C@P`WYExJZ zqyi=m#5LuBLLlWAHsRRqG#vM3 zLK3bXh`9<_*O_qKjnQ!2bt{%|i-C0d{Si=aq#|H#2GZ$m5JF7dMgVE5QWdZhg$s9H z)OQw;#!(0KGx5C&NYmV8!rg7c{T8S|!u`>N+tKOh^%0!7($mpjx`&is!ECi%b%MFB zHd5Mr0&?%|w0He<^#1!tV7U4G>{ z>nZ&k5H}4uE)T`8n%J#wsuAa^Mnb6f_a@M`XenQ`?JfK3Z6!v^c=9QB5Erv>MygB< z<9etJqAQgS+*a~Gb}#`3AI$l#FniAbCd_hBII3vUDI z%6vPJuJrdrYtSBW0FbUgbAgDeTfhndy(fq(uqor_ml!u!!7D}WhEf!s2LoJ;URU#W zgap<*oo)FoWr+~*y%=BTC&D+CIolH9MTzjO*a^q9Zo-QgZyt{%${yn8aQV>C3w^8KR0KDo1m|NAzyJU#>Pj6u!HE`q+;Z1Kg;?Gr zw6Z4)cxCujL}j&VhB}8Ez_F|8?+6o49MXFKcDQBZq;_sNaoozH00mXsmFc4N1)9k~ z6Vn93k|?4|a-*Krc2p>S5{Brv;DZqXg}9QV02EX-hVXnel~P`GLARjfn}y2)XW?qW zau|FPnyVAO36= zS6BtH=YP)dPT!p7(ASTAhoQ}GdJit~ZT;=WHvqi)Y>a0!t>G+&4LJuyoSKOEafsY1 z$esPT$^^$wUORzd)r>YP+)~o%RqH4SCd2u1GrsQHbsR#{RhKWS+OyYBy#IH<7%; zar;s?&79Ed2(7DNW|rSB<3#)-$RNn1D69~9_9e3nW@k83$TXh^xzyA@rVy z^4DSF8j>XriM_b~6-aj-`oV zt@|Sl-pLt+Z}Gxopls?UevNuW9c$^QM@H3W#Ul8g7#joO3o)@SIx2s)5ps>7<|36( z9#Q~dhq)u`hY*fAMn}I1d0rXjstW4yZOK6V%9}E9jG8V|7;r}*@!~0r#Ny5H@|Qv+ z5${+qaB9&|EDEJf#EJdIf>10KnV^l$EpgstVu}K--iTT1{3Cwltyc6fYAo^kLEW54 zR`Z$dvEK3Ty3Om?9Lj3LSNHgLfw`HQ(nQaYGbH}qfLL}({6(e-YuchVyj`Z1iLI+q zQq1;kOQAhBt+sD#DO?(z94dS}*82sPg3Pof!Kj4B_mLFs)^^C5mmP8HRUhcs)?eWb zPJSg|rLf>2dRP|PnKPexm)MzOH};m!v2*%kVy7kAZpQvtPqy-w=v3a|cLB56Q?l8X z>~-Hl!`RJOPDU(F>|RKM&@<4wpqjmIH$4KN6&IKlJ=|-thnp5_W;4n0yMIaH>ev^d z7xn-t>dmXfQ1i)O*-f9r5%R*m?sn9ZDWg%lpZW#RF>w^H*!hyD@vb+G4F2N;#t67O=ho78xKbDO4WLP84}%$n;1rtLO0S4bFy(g( zJa?n^jnqABE3QA%X3m|z3KQWfRGa0CF!*1J@S|@rio}2H7n{d*uoK)2MMp3*(mg}Y z)#$LEp+zyaJbk5;RC2FJgT)Hwi!e~YsjQQyK*K63S$RqUlTA0~rgv$gzMw2|RZUxe ze9saTAQ5Ni-R)~PpmH#(WZO+|1MwcJQndmq)hI)b^>FuSPb`MfI^p50Xqnd?PLS!3 z+XG+|lr1Xb=ZnDxFM8q2?~fgG_ck{1Z<|6BN~`VMP~*~QPjxDLI0y*2VYQ8UI6Io} z#d8q5ooH9d0Rrs$N{7?%1G$`Iwe@+pNQJ2#UK&cE2qt5s!M-z>uiO&!Djh|mM}(4n zn)*1m_i=X|^zlBLn^x}In=olZ+>{am3VVn7f%4;~492sz8HQPEeBP!_v8ifLvyGWU zwz)}FotsW>YDO2MH1-AiEG&_yoZs*=i|HW7OH2sL9&-Nb&g-SoIpJI5TQOpCDH?q? zHY@(U9Xpl60B4+fI7^pq%!2dWqvKoqL`N(MKvA4o_;U2XCA1+V8oHz#s*wolP>*P@ z_|}2ZK>q5sq0g`pv<--VpB)=ScKNI01p)i^r5LpuX>5ruW;YcAU>f}pW<|e%MqoG6 z;%H{l;>?tkdu}9I{j})f28xvF#wCM5rvtt>XP~;@w1t}+IJF7;va&_E)(qDd!3?03 zhj3phO%z2+T&)33VZlgn6R{`rCzwXbLcw+x0=PgF?dK)CX*{GUCO`$ew&mUpNXy(K zWYZKfWj%gjNgs!OyRXB6;k6K}gVsvXw=WA7O5ob{oRZO+)2l8_%~oR7VI}uGB~jQ< zYklJD_I8$9N5uI>i?}=d<4VE$eIm~HILFPPvA;7NvH+9Y z`X}&Z*q~VSS>ML$zj2jooZE?HExcw1`7G2C)`0K)N*h9gr@~QrsxNy@4K=Tpk3(NnXGz2GXV3^MTZecsh_$ z%mvz0QgAhp-kCPv_}&A=`V3f0fOP+LIgswZz6`|n5wO++>Hg~nK)V0>36So;(%_$N znN|RrnU;_Zv_ISf*4{u`l7|E7ZZFOJHMTQ=G`0yq8ryUr*Tw`$W2*+z*e-S5GOe3{ zG`3#?9U`&OWLs3E^(XN0-3Fp~BuZr7^K<^8B1V}l* z2&A0X8T3zswi+}PCNN(M?Hxc`E>8ey-dcb(M{fWfFY&$$q&XVY$D_ytQi>CSl;RAa zlZ4_NAf>nrs7+%7Qi=zFl;SC%F+%Y?kWy>`3X59-2KqLk9S@|m(}0w=4(K!qcR7&K zz6hig9|I}HW+0{b9w;Id{rhX*ObA;kjAfm#5^g67zkHAT=uAWEfxwHWAKDczTWcpxcY{R>Dbva>C#QrrrGl;62Pv&C&H zkjk~$#%&%@wfNovR4eG$KpNYFKq?(y0MfQwF~A#pegUMdcsbBsA_+$g^eDyyX&KxO zq;2;;AeCH?0;%L$2=uh%=mj8^T+4w}a=i?slIu;^Ez|l8NX!1;Kru-(?)`U5axWl_ z_Y9!5!uc|w|6oMOw5|pEO5E-M8Y*eN+x5+|9tPq{lw84#jk>cVViY$;E}Dk%N{efU zt}g|M)tYN9H5Qs?299yVye*?0=eFZpGh=PoN}Lk95cgV7O0Eu?6>uz|l$CoX8@iR2 zI0X};9gtkwnIw{!zZu!#r0|%H0NC)0!on$x{jdl$$MjZCJ|j(`E-Acj14!*_e~Ws= zRo5j6`Rz+f!-2m+7LKS}OIO(lL{_y`soBWCJ%Mrvk14@}_nQi5fGADpt_WZ@n4T@54??6Ju z!I@Cb#V%7btqA2!4!yNP5aGdt`7Iq8h(i|{43EUG<{|n0BwrKCOPm`y&Fv6zGCRJ# z7iIx-Ii!GtNlF&Pp^GVC7S?uTAP!w*;AP=Fh$KvQn1z-dWFa|mL-#TDaU?R6$;_NF zG-Y$BtlZniKV@jLP?jYNBy}R4!cPjP!)B9@AEwef=y#WQ?spCj%d|9~`U7U@b5D(b zH#i!Oe>X5%bLd$C|pH zvwbGT9ZcbpC26WVQ8Os%+PS*zrfbt?jJwhU(M4dYkm0AN2#F1Z1eXozWW|}(zSw7% zvTS;pS;+SKm)&$DQ%HktY-D#F)10+V&*q5qlZo-IgQMfP;B$Js<(o&aafN97UzNv*eV;FmAeo_y(;*7!+%wM-MCfUitV@*1I1??P)aiSaE|bxe=Q zryZonpE;ABZ!kUBh4duHYL`>2vU9zevRDxE_kR<2{eLNLyNSl0jva694;i{G!zV)r z?_w09j)XrK>rR-{e*!z7jTon~p1DEndffa=R^nR&QN5ak+YTQ1?(-W@$Nun>|`V^aGsJ}X417fUo&GXo|%Bsc1EuKboi46p>8hR zxFFQsg`Y1-X_=jB(r)4cQQFd6iP`aX^0p&Ur^;RU8Jhb2Cblzw=O}pX0X_ ztJ&je4u2xW?3Qm2U-^#Rej2>;9VkIi1dGC-&rF11<1Kh2uolgt@F&2q(-!v)z_=Mm z@MhrtZb5ysAhg5rB6dmILb@MI9J^FV-Vn%2w9i@nm3`i-uk8VmpAhX&LU6`U>hEjw z!*(?RG2G~bhd`v6f0Nq6yZLHhDP~LC$)HyQH%pK+a-Hxui4gYgi8d!fL4Q;A_LjWa zjP~Nxten05sJhVLU_>fyEXZu3ops1l_vopvD2k5Qaemx4tIV-9^g&rA_hrW^`{w_% z{v6rYZIPQ7gzzE|8tT(w^x^}2(WmLf4@$$x_BD(wOkcN?(Vr?!DLtczxZN_t*C-zQ zX|Z>?1kpy3qHlC;39%B|n>3z_@NNa!jiuY?zoWEcML+(1H#@!_tJ9s!sBuerXI_xg zDRk^$+)Yp(DzNOv7ybTglGUIJS*PqI3Axm67c2KTS)La#q~;&W}@WnNt%+x9otj%xH-EkEv91;z<4Na22jt= z=4iQ0T73<5@~%Z&(tHmy(uUJ2lXD}^Y1x?i#rApzQ(<$+b`{RHX0IH}qgB?@|Lu+A zd#S2#=Y;bBLps$aZNh&ifzz&>?5LIQWWpnfOVa3aJ1NAHYCTV;>0Z=0mI_KRV4V-7 z>wK30ag4#y27E6UUn=YB`vA~W;>+(gL7eRC+8U2{tQ3lmfpnFU`wuUR8*NvqxCN|p z@U2{C11T5YF`!)j2k14S;6>Z&%c~64_a&gU;=2||?>pcf3@aop`vJWyh?no_Wm`N| ztEuOyS`Bxh3CCOh^olLMsiEQSFuwN!{Y_%yy#q?S!T9oy0li{t6Ohsd5L&|x1JbnQ z0_lZWd>%lz!BrSYQ(6V2w9PKNNIlsq_htLex7*W^Pc+-X2ZNVsw!jpIBZQe;_=0O?g>e*)5!z6_+XwE}5MzXm#9 zxX{>Exf~00thf~eX-ZEAYLhh20aDs15cimIc_GkAg5Cqt*fs&R2}OUb{wT#zpfM7T zmt$#cBY~cfaAyPQwQ3gvDVG``<-+T)l*?T}rwffw1Myr*!1^VS#`XY^(!L0!v@3up zivrf0KuY@^(6dsj-LL|xwK@PuDfR(6PbhdzmQoxBM2ak{8fc36&I8gkCxA5Ghk=yK z6F`*`ZaI*0c^gQtBYPi6)BH~$r43*?T50SQEkK(3{{YbrFkoe3zei&`07#|9F+j@Y zOd#cQK2Wnz%mGp^Hv%n`mi;u)&Eoq4kn&p(r2N`|lwa?G9=}0Aw+h9~;0Bm(dLHRd!ReflCOFYQU*(?k1J?;BZ+hJlh?&{maQp?1^kAs!Q*umqeV4gXXnj z)Y$r_#FpgeGnVIdZ1T|U4LJ=Am2%5Qsk6E5D8DTxuH^WGtngx5o{k{mY{VNsD23EA z=j9x(eIb_D5|7dB3`aeW4Z+M3XMeJrFVDas?WG?F-1RbSUhWNx)NI)Hc3&MzT#aJ` zeDDw3qKVn7kUKAjJg8ZNxl&&8WXz;xA!I{MgCanxgq;DTra@-|=}n=Nfb>?-v(XH+ z>+s42MUMb!xYvOGgs=e^%>GR-hvMsoTs!a|)@;n#fG~LMDTurL$`Ti^)rV7XX#2B` z@IctpaLHNKXU|D`!o@L2GYqGTw2 z6oq#cZ-ygpsM<<0oXO}-T3tc)&UP5*0*OOd-jH)22yk<8lI!*tO1tF4Cy9#mfU#L- z<;~WSK6w^H1C#O=+7 z7doQh^>>f{70;B`q(>-uuT})rQiex6e#Yw$^S7VBwvtlkihpOd?unj)H>iP*BZ6J3 z9sbdkQQ#vCO6>55Uesx+kaYEa4c*dHFaU=E09TXF9%kPanx0KFw{zcp?&!dZ>~0qawPegNX6H6Zs7t8emV z>9fFJeJ26wphDBi^}?A`R~=O58Q*Jw-WOk94W+)f7~cnhJ`mq0jW4&lKN7c(Ot|lX zJ`p!gY?Vu2pijkZ7?7sraG=k`?Pow=2pSEf6z7<5Q-QXK?@Z%+Jl-h(BTG+ zG^iLz%^4wG@q%Sm>Ofwk135;Ok8uef9>Up%Tlmm7U*r7+7|P|qs=a_6%d|}kVzksz4})Hi@j2u z4_b%SotLOd_xA3GY0F%UMuYl@WO@C6 zJw&YC$kvCDrOlWeSk~gv5@;}SXz>yFhN1oI#WwHhdWDZAXVM1(Pp#hN={YRGwZ`E} z!|*%lOWX0A0C1rJ^4h5=UW;h*OWjmM5kU#mA8R-Miqy@gn}>Rt!YCHzA;?ObPtL%q ztO)JG6}&OeeQrsVskV9?Il{Z{G@9obCYXtb+JC_sG2z-mZWc>%Y5=3l7F3he1)nZX zRz&^dk|(|quZ-UG^Wr%wR9KNv5@9v;?wkfDJHEWgukeh8+w;;*PX$^gs0m2*Znmu! zabtn0D18@56(b&nP};u$@q9(V;)3x)ga}xl197D&U~L7WRdv7`h@7q#v=7iy30DuK z6uiZ*AHwP_b}9-eWE8CdS|haP;cn2Us!^$ z{3YVvM}eaZ^*kCdT2ySKGsmC30en!y2n{MO+&b^XdP<$PWy&A#qyWxe{`x+K1(zI8 zM^45>!j$lzAUreM_3-Y3G}EH*QLF0g8xC1D9p3mp1Wsz(9|p>iGOY(XSkTo#ynQkt zC97^98sAMoO3OuZ6|e3EG0~jtbL7V9_%m!7DC(`07|y$~eW0L~CVKOF5j4FE*u|qz zn{W-vWRyW-6#{EHOkcGm3qQQRy%s$uRv2;OfMP+(Ve#a$Kt; zb9jaD$}hO|a=GBrEnF~Q;anJ>F)3UY#k2>%qnq)2BBSU}@$Tb~zT3BC`sz^o(nuok za@(JwVUwlgB7wbNW+X90^TOhM4gUkyIDG$65L8u0ehpL1$S>2#&qCyHM6pMQ-;8`r zy2zK|^>b;?p|eAr8O%bFr#5L`Ra(YduD^>otujM|sFe9A+P0J_u78f;R_pksvoh@K z9z`N}w(7dy0ASk!9e*!0Hho3L?G%s=6z!W4Lf%w6ITC5sN6fJ~0#>h=IM*$PCmX&V zR7Nv~TMOLGG3D!6r})J`@LQ|D_(u{&GuOu?3Xer1-lAb#LIzDu(9Li`f^c978Z=VG z-|S0nAMygr2;zFg^0CutIXc zb6g+RBK_VCub6IZX37dTV#m)D8d|F;q-<$dH{{60xB0JXAzZVZ&5ff$2VMGjFv^8j zz?uW3!r%=c6(m0zH~v;PUbdj&s3WUeHINFIdktD+(1$=uvB{vLA>x&S8#5~Qc@Lh3 zivlIZQMO;#yXJGY6~6n_Ab+pmdqkOlc-RKV?}~F~nKhk{*@rL)w6YJOcf3wju-!gq zi+zsXX=N|qzE7l?N`-qTJ!JvT5}F#pqKj&SxP^3oPaA}QPE`fbC)>t(RpA(2a0vB; z4nYy}&`u#?7|nz*w2Dil5H=wYxw?LXKB75LJvMPR^gDT4><=hVDmk29*hl_&Sr5JI zFXXHY*^jTp#1ao!6+4@i=`%r=lC#m1$Xn%J(i(q=<^=k0y!E0Ylxsfdg^8#a3bM6`#)|CDlclzf-qboB3+RO9Uu|BY` zJrso*inn*GE0Ml}F(SfHGVM(sk*0|7c8pg^z_wx3yhJa>O+E@#^~=%s%c5s?4j}P! zy$|iN6!)BY9TYm-dKNQYfNGGxY}eN;XIuB{a3xL?y(2XJUwO(Dl< z4YCnN$1{$w$?=TWXh(1f?laH=??Y(+_!T}5Pq!_Qw(=fc6lf^0q7_CPny?a+8}myg zPcvRSnSh&1<0P`5&T4>7?C@eJwVq;7c8EwTSaltebQ2mA0>3_WIW*K~SkX!^4yvDs z^z5IAG?KB~v3A>qSi9|Ztlf7Z*6zCZmhf0f;HBiYQb)-yVHU-)}3m>Zmhf0f;HBiYQb)-yWN8E z4Bk%2LpRnQyW4N-d+tK4J$F0StX+t8cSano*Iv62Yp>nTYwul%wfAnsdgo5dLsIOX zJd`+hP9AEcyCn}b)}4}vZmhc_4>i`El80`ryCV-Z)}4}vZmhc_4>i`El80`ryCV-Z z)}4}vZmhc_4>i`El80`ryCV-Z)}4}vZmhc_4>i`El80`ryCV-Z)}4}vZmhd459|Bv zj1+cb?X$a5xZd7{Snb`8weK#(+IP2O?Y9fD_S@}P`|m=m{dYCiF3vDI%y-L<^RK?G z#1q+C8S=qsRG zh08V|<+3*x50%S7K+5GvAmu{ibLB!qX+^Vu?hr0CD^@NvpH(iTQ!WnxDVHaJl=d}) zXnS;*aN$7?<0YkaB4PQZ6hz<#G>@ za(Tv}mx1oZ|A58k1(eHIK+5HNAm!2ny-vCCMRVnHltD#6JTMZF_gj<;AN^AaH7OL*~K zz)HTZ&NtPS%K<>jg$GTPO97B_8E4Q8py!3l#Xy>t8-SDx-&9vF_W>!FKLRP2)dsx> z)FNCy0#YvB`gmOW04bL}fs{)Qka9W6pmLyP!i86{DHkYIZd$GZQZ6?DDVJXYDHmSK zrf3Dw3gPk^kaGDKkml%HAm!2xheec2HjvUDZqV^StA)#0Amzdr+?5NjJW($7K+5Gh zAm#EKgLuEntHOn^x+|CWfRxKWfRxL>fRxJ*K+0uEKM&;str0Fq0Vx+=@}^wQ1yU|N z%%WUsfs_kv&J^7Pv`)A@2&7zighjcm0a7mS0V$V_KuX&kM@ba%_4l`g3lFm>m*aty zOBhJGlmjW33xSlD*S#sa9%#LAxdlkM@K}p-c@{{ytN>CjZvrXpCW9;+7OKLfCy;W< z1yU|Y11Xo|ft1UsK+0vJL6txs2$vcl<#Ltry#*+_(-HLV++)XMEp|MpxuooPVE5=V zyhpSlzonRl@A>Nz;RRus8zss%@=n!|v$;4CZp2f72(*}6`Zf9Ouu7kejYwGkO}M!@ zF(YR@u5iUuGqbRVT-y9I=q%Xlv==;!&V_BLn?3zd6+oWQDCWwFv9pZf9xAo-ECutF zqYcH*1|({H>sLrM35(25xJ$1)(J?TP;}KxMo$=W)R>J*n8{L#7{tR;ON8@xPi#fv% zzS(4U%@|AVu)A5`@l`xppw}dA)m!&x-dv3~X>ov^YXpV}r1rQy1&sP~Xjp zWhG(@T4}t|P;immbRa=}MvdJxR1hy`qfK=p*4WwufAc+y)XtU=xC{DN$u8_-JCzp= zFr2Lq2kpid8l-V43LOY#_AEXJGOT`9Zrn)}Ia`Ia~z zxJ6tK%O|v26dKI=b+f+Xo$xTByg6CIc$5sLB)p`Vi9$P*TY`t8T_qmIT|{BtlzbjW zI@DsUPy7nBN4xP<{HDdk82-g?UKkp3{)Sh;Q3ewu&3*sQ6nHiRn;F@Zkh2`N8q392 zqdS_L>kF@Xu%_j1-(UNw&@qa^3-t`6C&V=yI)K=3Oa~xEFS!qS0)A=o!}lTen~{3h zLBsyVeP8xpP-xr}0`4&dTzPPxYmn+z6O1^LSFZ8xuPpazHM{A5Sdy$X>7&?OY(XRs zdqq?~nTB^09(Fq(I}ZDsu>^6?FMZxNtkVOsqf5Kv>TRlEa)hbX%|i1%HPtqznjAn_nr@MY2xHVdQSfPZlr6G zr&YMxd$VhrG6W%ztyTW~@Hm#;^dBhIhyf3C!4Pk)TZPlNf_@=+kq0i1cI~Qpn2vUO zi&2JXW#fwrzqR8hAo+NrXd&#w%0)iG9JsvUBs`MVKtX3Way|&D0+tQDS<<``YA<*h z{dI|0NqeRQ$WG%GaAgNYv#ZZ=!VO~*fj@yTwV@OtI+P(M+#RmDR$$ntXO9} z+GRWJjr+dWP!P16u7V>{8NHOeTBjjBNZpKZ;SYBF6^UljLNL7(md%L4Yu;t}y*5(# zO0=-lnVnOAT4MZvtWf*PhEc)TaF9lWk>+zVBrABDVZxmq$zrg^owI?(!Gw9G2utTA zl*;D;`=nD|YMZ798s~k8fIUFl{!IhXf4zcl;)5#8Nnk=IND^0A;c#cQ0N2`2hg zy}B_9l|-%F&5B>Sz=}n@1iY~83242H>Wx#jaZ4!JU^iWYUZ{P%en0OEhbVw^rJ z!cb74Ljh18(G(63xhynLz=(`7eag|^>__2!&A=vJd0loD)Fkz23$-HtGxwh#cMOf0E$VBZ>g=2(n zqk=Z)w&#?#0qaH}y({K+Ahq&)2}teuGQokid^qU=)F$X?ppS&M5J)ZN!a$#j+j&50 zF*g(FGjXc|QVYRlK$Mht6&*<97>W+16O6GydJ{C46ZIzOaX_>%3|Ktm_GdwSrdMx* zre&|*1U=7n%d~C-()8T}r0L^>y2-H(CTnPL@ zxV#9Y$BKI*H=6q20JV$nBS4y8Y7Cm@Y4FjKoCox%8-}3b@Rr6dwX9=T;!4*b2lYz<|{=%cIyE zNGXm2Qi@SPN`O3P)ggM{`)Af;Uc^tjXqZ&6Y7 z4}*AjigNCYMJDAu3`jX24y2ra1{4&|*8*jsod>Mjfs~dDS&E(mQZ8=*DVO(wlnd|s z=e;)pYZH)Cbi-^=DTV+k#V{bHI22e^Grmjh6Vj&S$1P1P{esFq6afKqO_nZ^VYfRXnb0QL%;Jt>XJyjDpi7mh0lQL}ZpbcFrW>*gmFb4; zLS?!kyHJ^K$Szc-8?p

4xk=Wx64|P?>JXpQubWIyYpW9apVSL?vXr3#q6yaG2A*@>FDL|?f^3b~KmJb4{-po-|^=9gjsy8n);Z_5w-n<4# z_2ze7w@hmjkdCq61J%nI%SB=xV^0UVT-?S1sdme2G1SO`%TVg}8=z|>-0zGVSC2TV z1gy2j?cYFZPVk*^I{+D1;{e|6sQgNRbgTb#<5ml#8~4=uHQe1mx()vu9#NLVN`y5Vs@aLxcitH1Mig6E!kq@#(T|lgSE=I@un=@F1^#ZagLyypD!6VUMZqm znV%cC0jLYznA{Uc(^3ee+l)oVtpZ3l4S#OjZUWLRz}t))H~n=(?*-%b4~Z= z7C~JA33k_EA61`x&*dpq;xy z8HMblUYgsZ*gmRd-acQ4?1^7~ZI4(HnZBwd(f0#f@bvfE6|Fpe3v%I&zrr_vT?y@r z_-Tm$CtzQ@6sWkl>_1$9&wV+6_1E^feebZ3T2TjV^=tdQb)Mpj)1bLCOYE!kq7JM#qm0~ja%#bt4q%C23Q-hVuK5*t zD<-AQcjw%P5-f4fF9_MWb(`^Z`G&BaJ9aI;PHVx}I4to0!#!BN>?nlQWt3u|>(KN9 z))_!5Zl?h0p~WkJXj>An765%A=oX;Q1U&-8vtxJ)5Qxv{1*{D~TLf`=Bq1mRVv6+( zTPL8m1o0Bw8^rfOp!dX$_e^_}pmCT5jSo$bI|y)UzaFKFJy}^5@|~g%Z!L9j?=ZF+ zBF-gwSaZb1BNKW12&M}s59Pum-)MJm02Y_7#}*_m#H! zsUb+NyaPP{EX@33y+&Plfj$2eKrGHJUbtH;!%NxWzMUz^obgdfGtw^Hm^^>YN)P+GBMW+>+k|Zw-5(_k*;pc zkY+}vd-ki+bPo%+RY`;e?XCFd~cgDh^!6a?Wy<@GjvJw2R!^iQX^aQm=8l4>6Y{ z?v}e1jH4{W!;zlGksDDANl!kZq!*u*I5*_1N^$X46t{Z)11pJaI?0tp|I=k&8N?0< zEk+=V_3SHx1^>ZSWvw^C$LuwG?-k2?!?;dE-l*z8wUSil`l)<-lxQD%S|5AV+o7LN zdOkj9V%<6VQ%FzM2y_2rdbtOAAA5jdF;s|9rWaxN7tJmIeVJz0*ZOS;*vyMM zFCxg5k=|?85lqP=Z3p`I9I>Uz2%p31y(}bbMdj{#jUdKab@Kmohy<~5UI9oM`&U)D# z|3;cM;%g)D4(~f#nFPvQXU&pq{L#Kw3R@I4E!bc`&g?Nu#~#n3cdvee!0Eoa zeFa9MHQbDe@Bn01qVN*o|22V`w-BIe0y|6UOl1hR56-an6jyNB3o4S;FRP#RlVomkj`s#Iq`LhB<;RGj9$%6)3MOhjR0^sJL+E6udPE!5YGH z752=y$REO}u=Jzuu2Q8#L=EgMUPWmaJKK_exWg2u+wI1)D41E@oL)qnvuDAOr|FaE zAib<8G3XWC9ps!<5Gs7N_RA6nh776{x>ZI(Dt$&FM1EVoDz?vS!R1Bqb|_?jL&C$& zXZ)vxqZdC7KKTRn0_q9WuE34=vEesIp{t{G}MBw%2kgKExprq|E zv}kD|S4-<+Xje_!Ug-EzsA(^$nzq`$b__f(IQPX*E&vUIbR5Jp?^lmp9W$xW~+(MRKU+Qe4h-w<J=ulJfU=-)>j_Ho(i3)6pbB zZ2JUfzzZ+a3k`c@R_u5P7p@dz3ByB0-814>O|hcGj6+7!uUirZGCXamXFdceRHgiu z)=QE}f+*jD9r6n=5T(hv3i57lL`$^TSp&T&m~17uTTc?zx)>zMoljogI~21h++qi$ z@6(P&+39ZHsX)5Uawd?jvrGrleUOWRbk=$;&_4Jdu}CIuz&?p(r${6i8Kj?tJQwNHvhAg*T#TT7CtjhMdm= z?Jcpr0d%{h<$EB$FCVZ5K(gN{ZiPVmiyMzD=tP1q0BC8P1*Cba0Mfi&0`x1Py#h${ z#&Xhd3r#rQ<#LaN`y0@21o0|UDpdjNOP~kDjaQ1Q8xJMude+fEf0S^OfSwZc2+%@7 ze*qdPY36Z)$Hi?1cTgYp}KeMd!S1L<_`0wA5v z@s$Ui&OMgpP06@pxK!eO9q27Ve*@Af*+)QHlKrrA*Gp1b0;H3@tAI4k^9{PgpnDD4 z3zH`;(>x$8`{RHfLb?MM-$Zy-;yu-bn`**whwo7d7X!+W6ufD|eQCnc7@aS^2dv&e zT9@2A^R}p_bsYAhhnOKRe|7TJI*f<6EltQu2d*T+-ViQPl3!-LjIDHB?tNki~j*@1QC3*EUt<^Dd9?h770pD#LqLn(+tHW#_j*# zeEuG3?MglwPV@Pg$>$Sk@~OVer&2JV>Q*#PE_ig#&Ex1a4l3knuEfM|R6+3kNc(Vv zmZH{%$)AcMiSaqvr5IF)^77IkmKDGZjNXehL(hyj+cuJt7Pc63b0aI4$rKlZaZufP zUl6Ar@zw6ts%R;ZWr#Ho?_V!F5P=rqKc0@k_w$0b7vpzsjPFW}5*_a5E?L=<5~EzS z)HpXKLlgZfd7vUAOq zc{vwW2HVfUwWi&@DGioOw1At#4aN=ifQtw7;)O7SD**dq2NMW)VzeUygd5bwa6`Ki z4p-P?b`grVW<-18iB7xe_sCkQGd5U;m5pSI+~mR|*Kkd`<+aTsiSgM%hEq7~I9y&= z_?a-8nj+lHmBqP1Qzdmkr&($$Ulkj!5V9(-(LgqwW5GLE1-uomKfi^09A-D$4KS;vGM%^h=<`| zTYf`3;`{k_AdSw@7`kRd>6v3-1(AoX=hFTI_<{J#x2V-^j^c##FKI%J{Jqo z9&iz2Y2rDV31Y}`#SA(Zt~rEW$O%|6BJz4qv)*fsE3Aqki<)(%tTcHqunC8b<9WL` zjq-9*v`k#*Nm6sWZ>*j-H6NTbG#ADQC090k)AP9#5h{i|fS4q+E-G( z}oV$w12G4&(NKaia;OQoIVJ<1APEhvR?1%0_AG{eCAJ#Es9t zOUD}zr0UQ#AXSGh0U9B+R{$L;Xg&}HLBQe)w02M#pgNq?dKVp*`SW+!@DOy-#Dotc ziSSC?1dTs<0t45_86i2_p`CrK4mE=|ak0SYAgK;Lk=(b@VCjtMy-6QQS zqf5KVxsR=QCGM-T4WL1{w*i#`^?8cMC1w;b`z=d6aQ)*d%!0pmoyTy(~zl|L# z9hnk!l!ORxf-d4r^pr$Ra_d0&JyU?W^ONaJvB^#rS;x$4svlw}~}>HhMC zK-j!U{K}P96t+EVtdsD6Vpar?f-+TY6>wQ8uAa*{H_K6^AiT+(nsAe%Ic_`13p9ND zfqXkPsKCb=5bIc|xLnysa>ioekUya^13Is?KL0~n|fm98dXx!!isZtR$Zr1^+DsiK6qmhV8v|i}+iuMN5 zN$@d1Itd;H)F9HZ1c+l;z?uQ16g39j1@xHs{?4F38^oI?bYbBwgZe>6X>2(_8r$JO zS4wQh7+)HMs4s7opqVyqN&wOc^z|m(Z%jB&#pX#kPEs}8Dj-)f`=;FCjx%RIL$OL* zW+D^WvC>YU(>lro8?m~!LD@iR8>lU+% z3tyTSXbxp9lXki+zO=gloY@K3Cof%QY;p@C&?Oo`UxFoh=d)7ST0nc+M>DrlCZO8V zrzarra<;ZPoUEHzVygarv;)XdbnA>wVxhT*nH}ShHV$l?bm$jx42$rZf3)G z{bHB3FLRca6t>iUz_&6MAYKePP*j2-IJ$YvhT|`s+qZelx5vA|PitR_#f!pawHxBk zFGicNqO~C|93=;nHLgU66-Am)OMPc0v;?i!a^DweJJ^*Z*ssI8;wP zXNVo%N?c(zI)XQ++VC&}Jva%@#jHBytdqw;aHuf3lntI@Lgp6Hf#CiK{s*kn@O>jF6c-8^;P_tG_osVLBrLT_*@a_X@1IEJb z(NUdh;}Dt5Zm%XTOx8pKw$i>AYG`c0)%kiZ+Cw$Rn=N>>2G6uKkGLHPM%kC8JjxO~ z+Dlzu_)4j^otG@_@{Xm=RC9*_@5N_`uzuTZLl{41vy3q?VAWV^&s)VdtN5I%Ncxaw zF62XsvjEsS!FQ-BP<9h7_=ka1B2i1zYN6Jsh*i*63ZA2>Rskn&-df8AIZ&~pIYZ@1 z4rerHLg+GIJ&Pcg^A6HkAc@C>rJ!(GY#@{8UJhM^MB!l$9G8n##@p@KI4q;*+KVDR zoTW=QX2E&xS@ErXqGd}0D7Kk}FGt5N>EWVLOS(a<(Cw)B)*jKr;#&tshvV@%lv@Yp z?b)%ulT@1Iw0WCcQ{UpXl&wwlTrc{jS-@{<;7a--_26 zr5gs%N3s7H>*Mus{Kk1$H;Pt}Tjcu&{s*jM@x4xvXffhT3Gk)tt0+!&}rPRj&qkG6hfS+hu+=m~qDgAH0CmwWv9|dw9pxNrPlZ^~UZV<#+ zjEX??VKrx9ya3bjn-Cmtt6(*xCH61&k31<;w_s%*w+w;t$PViH1O!Hvuw)OFx$#>N z4tQB9*I5s%gu}IO#tU*|!H5o04DQZ1On4|v&U$U!Ub~ykwvPs;E!*qjo@;79N7JWj zx()vW789h^h~+i68pi>#8Z+euIqi*CyS`c0^{#Kg;$qBq_#d#i1f${1@P$<$>;-R> z^CVt@4Vrm#`XVd$7n$1#*F{h0SY#t`rWmtt)+m22tE*!G0a@ka0A9_sCBz$X2t^~>!fm8#e0x1rpE%_-RZJ|qD-z?b@(#rV~ zZdy4%0O<(RAG~~vbvP$=O`4ZWHzT|pnBq}mU5WAP3D&WAA<8q0^;Zfu$vRicnMOrR zsg}_k>#^jf)l!VNi{#XmvjTUrc(rnTvR01Xeys>2FrXYEkNkCAtrV>cS3FYOYkeFJ z#A_z7!3L!DLA6Tj;~XHZ53U$#ebfPIeLMi9^+63lJIk}KZ@~HxNbBP>AgvG9jBjm* zZ7e8bfBczM@Pbv#R*}x{#)ft7%ov@EBDirOq5|?;TFkY_-eK!hHNiaYTC`j2{UndWj9MO2!6@SUPJE9mnUjN%PA$iBpq|qHYk_FZ6|kR1g(QxfwT@5 z11art*Eh>rubUjn41emRhqx;GF6tYoQkKC85Bw%YRl3Z#;Vea9>H zTX+r|^N3p(%3p7v8Ea=55uM$7CBa8ixZ)^k+_LU2H{CK-zC+x&GA*i|+7ckzT{bQu z$u&5ezXr+(!IP}9-Q$Rt$*a3(z-jEnq?`<0^)K;cPj%2HugMgV9kIj z*+LigQE~B1sT7gwLZwO*-vl4!XhW%plry$Vd8UuD&`>HOCGU4YO4G#2iuFFn8%jl_ ztWnAid8DZGK3wwAJSrm9T%{VAX$_p#zoy@mzU6(~GQGef!`~APr6N-D%uxE2j`dM; zAyea2M9OQGvO`MG@=8*Q1-&;~1@Xf335@Dup6aaB&J0IL6-Rn4TN_ zE#^F5T<;o6MWnn0u4Rt%{lB`v`xJlKhl%kU>L%l#-!z86E(i zbaA|_alqG~BDOsZ%{(e%E|f2M{uBSbPddJ9UA~}4+AZD)iL_fIQ_Cnd)yijIu+=hR z9F!{FCtW;mOFVlGLysDH2<)kXR#r{VDcURW*fmHQ$1xI$e1`k@oh+`*t0Lz0Z{n6= z_pt04=$*Lu!t0^Oklg*8Vki}n@?&w+mLL-n%cG#LhGQ8jV$CT9Ls3cbKIwRGRNih7 zk1tc6j6WHJ@+D77AMcZn@4tlaUcsJtRy}B?%CmH($LWIi;l7gg21U%}H{zB-sWB#1 zYItcTHCG#zQV}V?6E}Z9@+j!5;aGZ#Sb9p)vGmgMrnu;C4Fe579$%JTGX7)?%9o`_ zsqcN#@r5`A-;6+p6>!BVCu-h@cB7h0Ma%~ubnkBMbyy#3-;w)U`(_NXvN!kN(06U` z7JsX~86nvVlC5?NwH^0!n&GR6d29+yK1308gg71ClECbfMQp9pNO!)b0ceocl z{&I6nDHM?+PboavF%mMw9o?7tD7P9)MWj5oQ(Tw%C^*5?xD=7%_#IMEF;@yjq!^(=q+wfyu}Q8cIc^j3_1UOx_bRd{4;mJ&zfexw0&?ED01*W*>7(5^}#(2e?{a!C7H*O+18%5QbKF{w)C#) zH6=@0;V2&mo{rQ~QbZ0jHH8QE#F9eL>a`i#-IUDoKpwpC*?|A4E%-n>yPu(kpCa;` zE&PTBx>Tn^1K^X6H_zKcruGR~eLmUW3cPuM<)=#Js`N~| zQjzz5h|~L|<6p1*5ya1zQbI$g=0N$9=V_qxKI!;gW%x1_dGoV9zFLChN#uRf@ojYZ zV&q48SSSyxLz%ODl~UxTl=)D&X&n4+_=z~KcjM4>9Ox!z$7v_evwiI@UD|IJzIz?g z8)qN(vifcAv!U18o-HzpxDtY+A=8@d4bSf3Mvp&xNnV%^MXZ}Ugl9TUAU{bc=Ml6Q z>@7S<$y*!Hvi9p??FUIS;G2Mzxm-3FERT{Uso`0YikLd3WT+Ft&HJc7QKW8CSY8{X8 z@nql9no>lbe53=p&B?O%%ouF--ki0eM+;U^+%|J3LZr&8kKy8d_BZ?#kzb4O8#W|h z4S92rl@&!l!pEaxO=wuwzasKiDu%iqJiSjk{wtKf8^q(wl1`>U5#v(6cscW69{7|$mf4_;{4H{ul@Ki*ep9#-l zbF!^D>$9!%R}HXA77w(Jdw37)usa7?!xjv-hSu+CWzFKEB3AocZaKipBiA72MY%Cl zAD!aD%?rsEmW+3^#w-3wzNuj}G+UwaCC@#4GD7`RY4{WlG$c$)ytS+;ZXEn`kSPI0 zEP)@iR1e8S|2^HxT8rK*vP3mm_OfIR9YQAVC&%zoL|)y{QXsXT>1{nTa)Pz*H>X+y zKRM0n6D_p@Gs=X{t-}J;oA=>5i1so?%vW$Hcu|k=J_j3Kipc9=;ic;+T$@SGg?jlY za}A{;QgYNmjtS2l} zA8tnI)V4)C7VmR};iZVYXcmcn#kt7HQ4-Ljps$8wi76s)rC_L&@!$KT<4yh6mo}b`LD|wYOjNL1X?eW#JAkVXW ztvy|OX9?fEq|RnqJ=bRDd3A>9I@Fn0N=(6#;H~mN5%a~n&5%aUxxblaWq&f=>braf z^s)-b^w}gbHN)Pcbd>3ef-TZ!@|Pu{xbebVv0 zO!)3~AhroJ4yH6&o7v)qM~+k5aDm4Ne|c0w%R>>%qd|B{d3N_LH${If$ zZF+>zdK_3DO2_h06a-QZ3^mnPkLlvNPUAvIemuS`k7Rlju{@M7d0zb!d~eY5kntiv zb-d_Q9$zqO_mgMJLlMj4e}tD`XCJkQK7jQQ=;M_CCD;wCoj;@*bg# zoKt$n*vS*iN++KkK5NVwqQ0hLdbDCj@Un{9>Y(R2A{ec%sh(YZ(WSvTQ!fops|Z$B&7C^C z63>EFPy4x*ju(u=1j+ z>RLGVwx-v_>MEkv^y)b^vn!$%lilA_XV0#lS24r;SyerwA|;sT;Dz&kS52K$Vb#T^ zNtsNaI(=5fr6?3XK1%&Yeq#)bXIDr#Hj-l zUp+|!tBys360Wy(G5SL)1G;peXN_M}TOF%Ot#P!V&g8CR*Er0mu8N{WYA@>0_LA;h z<5M%ea`LoTT_v(oKYDoHG5U4n@VukzQ#0pPu_0iKo-;KXtV0V&_Zwc<+nO~G^>I}F zoY|v;C2kK4mX9q#iOsE?UZFjdC35t!(<)Jp)pMp+Rvp>991Sse#1R!$Q>V?YI3oWT z_|+YOXpYbT5GBFs)m1YqFN)Px@JC&&rlz_U5yz&_a#`2)&Yd^4whHM$ql^aURmWz} z2u`c5n0j$AI;$c$yK-9X)Y?mfp)n;R5N*{V(V)f#0XDk=u_NT{*_Q^ZDk^4F%sBMO z4$U>0<<8xi+0#bS+hREF8}-5Shv$uCS&poql!95r+b>w@5}nI6rSo{Pq^aMIiGkR- zcye70a+Mk-StR{_g3+|v${80`xEYHbF+7&a%WD_DU};)LN)G%%JC~^XnnHC0Bgt%` zDAr@@kKos&9VP?8)1)F@`*fp2yJG3dAoBlU6HS&4)2m}uQLAbigkqglTQQpoNX29wZtF^HD zJ$gnZbh;{x7Z_b?E9=<;gU}(|CtE@mj;hEEogQ{)kPTnk(TNi z7&9!U=h%@JT4$Auhfg0~XF-RYGj+B=9oo*WsI99+7-k#8hBTeS{)?a9)?q=BQNdYL z>o7z~Syt4dgr=f4V$mb2XC6^qJENjD2>m^&V$ZIgIs;?YVZk$0s~lbzR5dq9n?v+(_6}42{r_PLmp{wYCKne_hr$U(-UI)I%yY1mb>zE^t&Ob7*cKR{k zF&^V;MQttWrh58xjLb8@(M>#v!Mze{SB(~wXzL?_^Jby8dt13)`$~vr2e98p| zq1R8R>HziT(&|{Pn=~`0VH#&5FTu*XpiFCoc3ed?s1vN>@R$jwOdcBvk3H>#qggIY zUPaa1%G&CxIgA($egnZDEE>!bAx9U9!|Q<@K8@n-GMtX8XLEw$?e^~fL)=-%M|FIE ze?xF9?k>eGBsgT<4X4-=*@Qrh817yQ#T^P1hvM#9+@(mNKyh~p6nM^=J9B4ecf*(d z{(0`J4VyEc_ndLN_imCEurW)D3`+?UU{Xn8u`D5+!_-L~l7&IiBEsTf4~Y9qNth5t zR{B(z7?y;Ejb4$qk^RHB($LXrNaKGQuXs$g9RDQ}lzYUGR;Ok!mJ#xq_dGwjVa4GQ z!T)q`i%E{49s?^_;6XIaJg+_==d1>&VrN(OYe^PXd{0*2J zcIwdN=@>=!#bo=<5|CY?jS-uav}q;{7HXZ0P`rss`!>i4j#!cg&KbyzCLKDk;`WmT z+|Nnr5D8Z993f8qNx6gHS*aAm`a0dq>y{B;SI6iuG55Jpem zBBe%Lag#uyNWBB)BJ~cCljj}aRixg*%o|O!cQDd0XM|xJBUM5Ft%;o90J3cLkw?WO zC8wk$!1;tv5Ju}`jERSN8de^#Q1k%>uG&_Tt|wgKZwN($?Z%N5uzcBJS3Z)tr~lI4=&xlOmbMtY^2voHa{ zDEy7t(KC;KUEMcyQYW+a%FR8~d0D4$)Tf6~wC({ciw|qsm~$xEI`cMn%yZ zoUnm+wW*^uwQS{TsZm*Vii%MRxNVVEN6V(RmT<>O+Jn$tSxg+c>3~~*dTs%OcTE_` znw5bwk?e3&kldBPg$0Q zhTfi}U>|9dr`sNXu)HN8wV95vj5{td1#X8(cSWVnh#AMTB-p{g+y+YkX^Bq9BuF-t zAC_=cEd0@GrSPA{^&SH%!DkP+${o zpLpI@A-7WGBmG*^x}{cH9nW!+9V5O~^MC-+~S8xoaSPjS*bW;om-5_~43db6mQ|~K*&V!3SJGL#IJWo-mLfK*`2X@|gdv1=lYxApj*SbGLUH2^e zH{Mjl)ZLK5T{OH_)mrslo$NgEmA+EeStl0`T)ck9gJGq!^gR~$>+5}6y8l%4WQm18 zT*@=y=75(g{;v2z^R!ln)y~q@FN7Z})-_+1_ILknrk{MQd;68I>sE8zUN-7wR z7SHLUtH18wKjV`&C2d`Kw#eGY`$HCuj$9v@=Zx#!&qvNy*!J}GhK)ZTj=S38Y?e-A zLW@7WU-Eg?eF3wxOwZEf@$S7Da(}#U+;ZYfP}+oAqY^gHopScKsX0!(J3gXa=@CPh z8^<}fJ}tN~+;!yP&GX|LzN#1yTkL(mE@2DYtsjmmY??MCZ~j69D`*O2{yFz|#VZUN zU0E}y@~K+drqjn+E}d@tDtY1amnU*vHoUEUZRV(6w`Ytg5ZJO>wWVXe@0GId-ji#e zc7MLNZD{MGQN8=b_BA$dax*D+)0X4LPW~_;`;VJfvwtTxuNL=l@pfaD9gj2ez-8_MvjYZJMmv zsqU=?jIHd!-Ss~?Rt*J#_OK>|xpwv}@tZ)JGaG2foUv0s!8 zkGjr3daF2f)g5+l=g&`146d>?-<Ri&-G-&l z-!&Tk_+k8@O&|OGbfng!U+YAxzQo*^9k{wtiP|N1+*_J?+38{#%GJ-l>}1C>GoL8N zWIV3#)$FcX>+0QRN9yZKqax{a(_ElOv%k)}JPt|99)}!yTWdCzvgf|~_a;~#zRnvnSqoSWzel_>a zu8Hs0>6RlHq6ejGNX!aai#k^B*`f7hH09MvfNMDr_#depTd&t=cD{Q)4cK zKS;??_0^i{|JE+FwPq3b!9sJ4t4}T6*{ky_;}5w*>Lv-mr<7*c86 z^`yVw1ocy z1tjjc(tXN~KTH2oH^;hjC)n>3-uJCDGx(PdstrHPxv|ka`GYdD?WO&VAI$ykc-i2` zJ!}8CBh%DLGnW^MO^%Bw6uf3p#i*o_lg15LFt>-{{e~~k_HEG6yYwHtY3_YtQx% zdphG?+nl@lHGbSD9rrA7$>u!foG`ESUBAi;Wjj78O}A+45sf zco4kbk=6!QU!^kTIGOojyIcM5F8RllIqL3}Ggr?q-n_^*Y+1;&=~qkT`tW!7@r&J$ zC<@nIRw@77IyuAcZJ0YGzwOQ5%YO~2v9)0M)ymq;TZav*yKzWV;U!^Ldars~XhGNZ z11HZsnQ`Q(%2!^7YIj&~M|o@+0?+Q34^11o zYJ{^!!&8o28P4o1n|;dZ9d-98S@`O)K~v|4mwf-%g<8c%)*2Yv_3hBaVTac4>Fb*E z_oZ$FR|ME|WSM-s-oyp1c9wiJess?)Q(qrVj&{s3RMm~@TOj({_}-Ndw0PPkWnb%) zH3N4~O+0fe?D)|Fhi|a{SfKI3-x>@~TUa^1QcS-Y>jyM-w&-YIP)j@N#^$~`bJ{n$ zl7jx2{^On*Qwogio}xLT&Jx^UYm2K{qf);#-t%BeOz{_SeHN_FaBzL2+KR|tsyo$s zC;feI=wG|0mi(eDa@~3>B_Se{M$vZWQ}+Ar*55t(x5no+5vNX{&p!Is=(~wUw^~BF z?W>k;(Cs_--i|EM^X!3gS1MkatNr8U-7`CMOz*O;_+>|G-*Jl4Axm3l?*0ekRf~q| zUt~GGcU0=JRzJ+lcItA~=Ra;zHSA${``5EIcb?ul*D5&ozH-?Q*@AkEo>6i3$}gja z?rl&@<@o2%lAi|Lt#oa`;R^TSd#Xn7s@Cpwi-K>n75SsVj0>Oh)~G$d(5J({X8>4r{VZU9x6h zSBrm?vzuD}{B*c=-2!F*{H;ZZeM;kkcR65VZkjqQdWL? zH+I~TCN7Ppy=GaS&*O`({KKJ&j%@owhIJQTHg9#f>h)6ro#$k2{CdRGL*336sj+Zd z*=j| z_l#wRMGiLIUO6akSJd^zqXT3ALH_d@>kr9o{?fMHiS=FM zZVq)VOmi(CH{g1)C))3Cy`6c#>#{#{E*zSvCW?2Wiy^_{V7w`#g?Bl+*sCFJ-2e9Rb@`C{jS=bPmQ+J%=M35mvi2UO!HFVyFhzS zNU&!b+9JoFxn3Tuf7!S^;$6YXBfmT!+WU6aG8=={6lwm*2m)VDRW+UDlPX{=>mOjvKSiWv)G#!XmMB$7*^#F<-5y@%Sm{HDw+}dL8h-Nl zxT^c_^@yJHdG7owTkqySy+XYzI$vCZvv2LxFG-p~4exh3+4;-B_swkT`p?@PxVeAH zf&CwT9UJ@WiU)J-ODY~2)}d9SiLcxB9&)T$oBrYX0(&Ji>z1ulp-!Lo9G!o;Ys~5V z4^)%ao2x&|T4G?)T7@q~_gZuJY-)pUlQQe|gBo|4a>3qzRiBV)odL zXRZ(*oMZNv^?jyKS9UJDIdIY0J{_)Zy}733Zbi(B_d%OCPw%mBM$?^RPDJF|*`%_r z)aO#4w$Iu0bIElXI~BVdw{As3@=r^0H*R|4MYZvFKh@v;W$42l z>#5h8_6%+MxlZ_pr!`*A*izum2iKo@2i9CtbKL#AZNFcfb=};LiRZT&?^^Qb(jU6} zJn-7cL($)VeEfP$m2(qU&v{Y#L5{i0H|rL6PPpc7F z$6oEHl)UriUfIrFL+X4Q9@sRk&#tcJD%TAByJ!E0st=>iw2!j&`*P>R#SA@W=##Qv z>YHD4@=ezrou4lHvZ?mWYvJp6uipG?rAqItt#8ks-{|$mphDBmAKCFFZBN16udmj9 zbM55vX_+s-SawR+e+losrce$&rG&%Q~%|-tmb!`_e1`+obU!u$3)b4M|TFpZ=#R2y#qUHKA#Pq zal6**Rn_v2s{3SL(Q+yMh7~zs(T1q9)a|xzM9K08#wed(?YF(alLLXP+PC^`v%dS1 zURAd>d6{9+ix2;*vL}q3zHE1(E}?OYai@!&-ufcv<0si~_FDgbVsYz~d*^mV4Ox6q zIU{q$3cBA)-8}s7ze)GX&c7bv+`4Y-1zB5?WND(pO}2H z$m!4JiibQns4{IVH+IvV+70r~`1Q!&1zL}txchFCQzeYK&o0fidgslUzTIBxOiecL z%6Oz*v1gBVR^An~DpZC$9HC$8cXC9O7@l|#ZQgz z*wx;`IHcFUmnZreM^CdG{%vsMrmcO%ooDAMp5#W6XMo}r z)~yp8ZtJq_C+DTc)3n`c$2FOmW$KL~3+=-uo~WNc{95;2#lD=cA2Q*}#gXj}B^}CH z_QJ|GjSpXKll^V(FEiB*w6_K~JESiCYm0~f-u`&JsX|}nuZFr`OYSK4{fVMO^#_K8 z*sCs`ceLlWEYshgZP#Us!W>$!R+hHKmzBEOa?ijKJKkPRoxf*j*~!JbUvaI@)8o;P zbD!k;ckzU|^F}UhZ|u={&fIl2^SIG*zs0RoznR%_#rqMts=XPu{MTXD#}C#<-wvph z>z~1e&##T1P${rqZFDdjhi3;=S7ZQ zwe|<*+WG313+4@ymQMHrt=+Xrri-#PyF3)pi#N8%Yt|qlT9=&JnlGy0tK{xx2UXbIE zVMFKh4<}{~S#-GXyzG-M&uyn^p}G9|_~O=%W2&9gW1BRLzqoOKT$WM6gE#Iq=(kMP zDSNi7CV!8N5)Y_q#zc-DlQH1S7kn*38RZU3sad=B_<(>x)RLAETQe>a!r<>M5KYZU zcs3>_&5f%de6J!fK#mYiN{{9lti0wY;4Bru>d{6rsjv$Z}a+3{xu`jKc9HKiwK zh%FQR3=Ckgu6TVM-j`(WwKSy^YBC5^W)BVSp-5*UE5 zm>_k|SyUzY^3-7H|I(0GRRTJK5>wjrRmBm$@!)%{fdP29hMMpheWH9d_?B;A0Dh$( zY973T_Iu6*OG!Plq)1Mo{=kPdtI1{w>Nrl+sGM1wCs;>)j9zKq%FtHJM~ z2@Js3jv^ZmuOL)l)KXgWjDV(WK2D*;WwyPUD)0t4`?K#swu3Qwb_`D#iN4SvPYUHCM8(UH2o znleO#U*LniDC34ke%eM^qQMs|gW=Pi*9({X##4@H@N0IkC6&E*2nyai&E<&(U&KXU zn~tr70l-^>wH+9MFDhew6~Fc!eA%hD25TuWKnXwbN;s5K%UAO~gaiiQ3(DB~*AE{B zh2b3!)?{D+ez_2qc*LPE&3!dErUeEh!%s}lz5#_Hqu%jUA({qY#(e4D>>TT>sY*2X z+AsF8gGFyaWATos8qwevlJtj9OA?=gz*|$DXf9<|C?K(lmOs~x_SHbwg*4+AJK*S0 z|NEg`eKpwn0t4`i4KSV}mNBWm8YouK^nsrsQxt011uD=xJ+;3nhC1w;8@Byi>3yBtOtZ(lG3cxwJF2HnhCgRhTrU&E^R?Cq;*NHqARXgGpo+BW7- z-|}fhH26hqI9iSA?uKF5y9^r>&0A>C*xHI0{tKF#x26fvbb_DQR^2U*{N$@?N;KH= z@oL%h6AU)q`Dz9sfdM#1K~q!=Jh&dp(AyWz6oCOv!HnbBPyMcU^wlVdW(A{y-Vs9Ds+0S(hzqb3^66JBk{T<}xQ8VHfr0H_(>D;rd@cRY{{(2&^R(}>+4 zpu?e8&vppIF^vc5p1=3Y~GtuA|PUM15JF=dK#^SB95KV5Xd8?gR##dt{nw+4)ymk4# z#$;cOjcD>w&78bTq04&vvJ(xq3%pECzCaeeH4X@o)_$nTej{PDuf|C<*xob3|G)K~ z^sBE1N4P-v@+PTtM~pc*UDAL-(F1?bD}w?aV2|jU#C|UWtph9`CbZx+fJxwA$pYO- zz9h>m`FEyS>SI~&W7*?lIq74;*1#^w*KPJI{3}^r`d9+7ccf^99M*C1ps3oVY*+4BhWXo=9$we&i9IYI4 zkgPdIHQ8j#1!_URv^1zCH_;>~!($jy0^y6zSl&O$6tm#pJCiPE!7qyxEzNx__!l5W z&CfoT6+V_DK9+kv7W`@&G3K&97QK(f?PD2DEjq}%^l>G%=w-_hAL^lxB|COGaJe; zww$IGm2CM;ElSx^iB0KXk!sN3V~M7grZP32TI$P|4b)Okwp^l?2D0T7wS>r)k~qo1 z6)ann)WXZBi;rc9k7c%xWs8sHnvdl>Ty~R-<-L)QrJIjsf{$f~kL8|^C2LM^U)6jp zTG^tYb>XCz+H(0sQA;h^(vMn7%a)ncl1H|zqn47g)KXNoJf@anvLy@b8t|$iTPjma zP1#bPTJp=5Hq=r?wj@(aVc9Z;TB^vFHPljGwj86Din8T3wN#KTrC>*j*Y~nTM=g0} zOC+^amMuf5rK)V1ODzRu%Wi5ZBwMafO99#PhFbE;mOQv+g{zKisY)%p$2Ar#@Qh?c zBCPhM3wsK#;^Gp$Eb#QamnEKykg8y{SBy|;U0}x zf-q%xnc;s)Q=9ybvlX?}VNqL{r7qK$n1v+}W-CSo;Q;_#xIZN^*T)?=Ubw53yfX|v zNS0urUPA#E21_8;MF?st!>o@MqN#`8bHUuqEy!Q+wA9DEkAgW>*3`#JtqQXmw_wb7 z1q;TL8)hR(Q?nO8SZ@I#fdP5oCtf)!HNKG@{*s+^wWMaEQPfQ2R7(&@=KwexZgk{= zul8b8G^L0};pwZDOkw7QH2)^1vD9_h|PrsMs)GA65jo_;tp*(%%kbUi=W}*>%{UG>i_v)t^oVq|M zq7i)I{#vZBT(Ylwlp-3zR|mnD>h#X%occ&9q7i(-0S7G&_(19_NcNQ*H=uA4jo=GU zV|W?9zPVD#sZx|88o^g*LeZosj+rmUW|Mu@pcK&vzFdN@(RW8@;8ZB3h(_?$Mev1f zKDX@4NhzWce1!?Vav#jMgi{feA{xP0xJttUODMd7bFSpFQJsKr)dKwT4i5KN)e6VD~3=wui?1yvDBp( zoQkCs(Fne}5sLYGlNj~TCi|L3DWVa4br*cyYWiS0r;bpHXarxegz~H}t?cUqrHDrG z6({%_e{f58PL<6Mfp8Ix;0u=veBAhBbc-s@WM2kK5slz0fl#art2vfj;#4xFh(_?0 zNGL2rEcuJ(fRqrr?7@-~Q(4P`M0SP>N^-U#T*MrST!LO&LxNrxei$zS0PV!APxb z_Wh5X+Ds{;5q$L|6sxbuv!{n~>Jg=gM)1{(P$j6ZKB=uva;kJeFvCSOg0J3S2YDp=g5q$L_6pkC1uTc#~Hs#bvN)e6VtFPc|X0e>lIJKQpL?ig>N2oIR6aFt< zynG!_J);!S2)_Cgik0DwhNHW3s(c{`go|hdUwDQZ7=UFM0ROLxJO98ew~e-xA{xQh zKteHJBcg8>=F|vE5slz$5TV%E+fBEsqfz#?fl@>x_!=zuQnb2%h*NhcMKpr1A%tS> zFltPkfl~zwLm*s4BlsE$R^B#7y8}LP%0MZi5qu3J6l)ugckLd)sos<#8o}3a!B-9S zn(mxhK`EjUe2pL!tFJS$@9J9QGQ379q7i(J6nu>+`e{9<@)dzVxQIsZH43bJ>{Vnw zx!NTA(o>3P1Ye^G#o7ke7pMADif9C1KN5=7m!;VBI8Lpn6wwI2#t6Q!zBu)WQbZ&8 z`bo|g_Ajh2PL(eTCb)=3@HG~!ylvd+ocMuL9VkUKg0FFeVsqu0h6lfEBA4MLN)e6V z>u14N;k)Hea%u~uh(_==o=_FwC-&v>m&RUgEc^PCQbZ&8njrXcW_g^IQ<;iEAY4Qv z_?igTzyK^_^c7Nm#qmb6uNssh8o}2jLb0~-WZ#@BoN7-gq7i&emVIG;C7x?Ffm0(W zMKpr1DS|K6vtH0+|p5hP)7tsj5 zrh}D_y~Q7&de~4d!)BBs8o}2LLa{Pj8km-mQ_++n8o}30LV31BmF(+hN)e6VYnI?E zD0b>vP93Ba(Fnd~6AH@^uc}wHC6uzS50oMr!Pgwn^8R&RS>-jSs^NeK7tsj5=7N>q zoy7iCTlUp~QbZ&8`h`%e4BL$z-;`6mDMd7buX#ScYRSH)Qi^BN^-U%v{zuJ?E_np5v6MKpr1g@mHRrQ-98TBq{JzDksYK)8rT z@U;l6yuNBiPRq}!CX^x?!PjC!dHO0T`|3a`q7i&85qv2hUcJky0hA&d!Pip3SM9@x zQp(7_=241h1YgSpU&8};+c~wLQbZ&8T283y@DswzE%jnvd$aT zhEq98K_Fa2BlubgR%z_T@IE)1&MhbVs!b`P5q$kdDAwkWwdl5jQ!Ob)G=i^HguNur{M)0*( z@Kvly-F%#SPbs1ie61rCwnLm#j)$pUbL#ujV1kQi1YhgH%JWs}Wb*@@YDp=g5qxbR z6!vBG_4Z=q3Qi586wwI2HVVF!|2AL4soy9?G=i^9g0DkAXUxErl6L?igx4p#2#Q@!jnxv%YIkWnazM)0)*tbqY#;3u~ECb7*7rQ|k$ zAI)$Pjo@o1Sh=qS*5%hY1;t4&q7i)UA`~0vagAMF_Em*aL?igxE%=(-N}YpKHcAnV z;A;<|urFg7_Pbak3#Sq(MKpr1y@X=p#&@emw&v6nN)e6VYagLln@`$Ra2=<%QHp2; zU;71Lrtn=qa_TQi5sl#M0HN5rck!ftv#QBun6VrL!bLQKuY+La^|fTNqb{eaQi^B< zU%wNI&0oh#{TalU8WUgwI+zHU;AXarx!1Yae}z1hpD!15%4 zx_&Oo@I`dt*J)AO7if9C1Cke&c;q$`_dU2{7 zrHDrGbxQE{Jafe%oEl3hq7i(Z7V`Btb?Pxrt)Udr2)@n;zLIrA=5p#BrHDrGb@nUy zdP^yy5qzB!eC0h={WtEbD0U#Yh(_>r9;|%5F>OQ1+r{Lz(S%Y&Blx;NC^l}q8~(B= zr(BdG8o}2^LIuN5Z1ZdK+}>70_BEJNL?ih6L-5sO)5jy6T23jV5qw=DR2le*zIy%k zN>fwzb(T^@Blx;ZD3&kNwfuKD^?*`DBlx;PsM`1w{=YJ>>@7}xp%l>wzOD+smMywe zjZ=jyLLgj3Bl!9gtbDFqRA1YXQ?)2XG=i^dgkt&HGBri%?iGNaY`$V+f}{Qi^Bk=sT~N)e6V>k*+?8TQk-o^vXVQbZ&8dhFw?yzFZ_rHDrG^+fPhwQQAa zoZ3z)q7i&OB^1^dUP}f$o>Y*1U85Ay2)>?ymbdv|@-*1WsqZS2s1!sa_`Kmx5Ttp-IdJ9&5W{&k$ zSm8w3zLKZ@RgP0#C`B}auYU-|>g#@6-IJ=aui=y;8o}3l!Pn`ZZv4!t zWt1Ws!Pf^uv9Y(rtLn~zvajQmA{xQhN5R*J_6szedP6Cq5q$kiC{|yEBcB;KRkA7s z!bLQKuTNm*ZGK$4y9GF9pcK&vzCII*`C5OuSz}K1pcK&vzP<>)&My3YJf~(+if9C1 z*wp#F9KLStZ=5N$%l(*1Yh`e z0xv^n_kRy?N<%545qxDN6l)t}3x{qiB)5$?N)e6VE0f@>+p(9=I5nP9L?ighOei)l zE5DBoUx$sA+i=QFDWVa4Q} zp;#Gax?Xl{KDi7F*N{q{Xarw*1z&4wUns(LQ1JEOw?E)-sAiH1L2-yuL_=&(!IG7R zW+4Aotm$c~8J?U>gW->5W8Q<=ufo3_fWnJt$fqB{l2NvJe#=2&5>Gy&f;a1imde4N zXonL(8V_ou^!!EB!(+};OQFc=H)edhIWQm>jd}ODg!3#G_=D0w;e{IU`xA;13g-g6 zo-NA(i*Cs`{4riip+>Ux0t?m&PtQECAT3!ub6QM@dA)N@B8vsSy@1Ay8Y$)%V8K?* zW6oY%p(rC*%7O)#E?m3PbT&fN8q)-e63NO@%rBQ-V*`#2_Nb6r+ zI5m?}s1d1>0@d%qsMeg?NGa5aR4GE$r@m_JDP4+FrzwRRkt$6nY+HEM>zi>ir*hSi ztf&#GGK8YRikM%9!?K0da(QY-jYyRxR3j-;#i4&vdvK}?rBEYM`qauV;B`Ad&k*Y)}man)X`ATvM9=0VHYDB6sp;+s^I=3V&;#j`m z&sLEOH6m4oP%K}WX8iUur}|I|H6m4&P%sRU>&H9=VR&J_CQ}MEB2|r0O(`{H=X?jJ z)=>&IB2}GGtiFC}Gy@jh%-0i2p+=-?5K2XT{c!V-OPueE> zQm7HBAVRT{-?(8)V@_oXmLfxqNYy12n;oWP`cQ~dN=l(dq=E^>N@G*?j~*?m3#Cva zQXzzbPDQSh!L8bIU$ZEM8j-3;s3w$3Jh7rHr`A&nH6m4?P^_nP+*IHZr=C#?H6qo3 zP;Bfqro=$oVNjvsb+-A zN2%~m#s-|qRZlXbMx;UsMTcfZ+MMF&Ii;o)YD7v&sH4=^ApH*z0V~4+ltPV2sR%_g zpeXmaWgMrrPzp67r6v?x0|bq(Rh(0=D1{o4(h#Z)P2s&(p9^v-7j0;$5h*R9=wz?R zI=*r>PDN4*H6o=W6m8s!yw0i~WA8jlp+=|g&L7E5Q??lTxs}4 zO|0ZUQ3^F8Wh4}?Q}McfxXE2kHGp=47ivVxL?||HgbhE~j#F(Zg&L7E6N(O(isaYV zDsn1~Qm7Fr3!zxP&TLR7b80Q6P$N=SLa|=iqs1@LoO(DF>lWNRcWYP5B*m5Ujp>Q3^F8Nh#EbR3}2Q z`D@IFv|l;3jZ&x)sm_GbP+tqz~WrBEYM5rm>gtBP^= z)*a^*Jcvy$)QD6hq1cGM|3r+MQ`zY<1T`Y%CKOw&g0Hu&Z{Os;T2l%&BGpx(UOLxo^3B}q*mjPY-a%uymP$N>Ygkt?`(vZ5%ICYUys1d0+La~u8 zXh>671+jMcmQtt@sdz%M)$-P)9&l*ED0p3rT&NML1VYitL-A{5nV&dip%iLFDv?mE z3{U)`=*Fp$ltPV2^&k`*d#^rIoaNLnltPV2B?-O`ryY9Bscn=(jYuUEinaOo1v-1| zM$b_SH6oQlDAwk4PW-(J_w|rcs1d1DfvOQ+!DGjfJ5(xp)QD6Xq2Pzd#p)}FQm7HB zo`hm8O4+_!Tb@E4rBEYMy$HqDhkf7U{Rrj@zh4e7)QD7XLfNHYMT?3RJScd1j$Eh_ zsXm0FLzrUP-~%50tDsV%P$N=(2~}PSRxCCC?6Hn&K`GRTR6jzoT3*|BSZP#9*Az;j zMx^=^itPf%1^?o)cUVa&)QHpoLa|wIz@l^QxUa{QLXAib6sSWO(@o$EA;!|F+x_MODEKb)Q^N>DO^9i+eYq7Nh#Eb)EGjs`C`PLGahs950pZU zNc}{p%2HJ+suez$#(gDI3N<1%mQXN!kZb3clvbQtO)1of)Hp)1eC4Ry=Psw7Q3^F8 z^)sPZKP}X(zDMuQs+CfJ8j%`LD7GG}cJ`9Ts8ya)s1d0Ng0BI;1Wx8DbWsX5A~lgv zY#zLkaqA&Y^`#VQL~0VDD$+7+Hoh860vYIUQz?ZSk(x{>I&~>bZB9Emb(T`75veJJ zVm&VCpTCQ6D!)#0iW-rcN+{a66(xVD_<~cdD1{o4nnoxU%}JwI-?=z7l~Sk?sp*7* zNrGI9el{QB)OkvwMxZ{Vc4;D^+q7-UGYA&JZM6TG~ z>thI~@*AYcP$N>m5GsiJN-p~S7EZOI6lz3j9--I>aJ+ft>ztZKDb$G6d_u9-JFjMj zS)BTVQm7HB1%zVx`kcCX7^h0oMvWSg`jt?1X}&(kjrX7;D1{o4T1co&lxlEs;y&){ zS4yEqq!tO(@uk&jaB3T+P$N={3B_vpW$|oDoH|1()QHp)LS>~XJoENy45#i<3N<3N zlu#^R%}4a;^D6d7tnY8j!jP+!M2?Mrg12&GUXQp*X&M(iCqcTM3`9ZI1_q*f4$ z`h58j;!}PZ|_4J05G%wUk1QNNp3S`zMZlyfXeltPV29Uv5IQN3^X@>sK7 zq!emI>YzX^-rwdqPhobuR2rxesox33@>O=%P>(UH8KqDoQilX;lHy7M?kkp3s1d2d zgkmGxuO(tsoSH!?)QHp(La{bqacTA#P92~WYDDTNpNue)NWqFNAKsPal$}zj5vdb|Vq@>)(D&^)HI!1Q5vh}eV&nY4 zFH1bu8*3?r8j(6hDArTb=Kt<7ie9G_YDDU^;OkC~#~$r45A0d+LXAkBAyi%|Sg}X- z$7WPWS5r!%Mx@RXDhJhF$nk^6><~^V)QHqMLa}_Ag3Eb~*n=pA8j(6rsBF~N!oEe` z@D%Q$6lz530-@L{rSjq#9wXaTN})!iE(%o3g-gP@ujiCPjY$1LsPAbC8|+;%mQ$IU zOJ>xF)Fncdq1382$G3AzODWWd)MY}|q13UXYdzLc!zhIsk-9=Cw$eL4u{3NxSS=r* z6lz53DxtDdUoZOLyw9lXltPV2{YfY`r}PegxQA08D1{o4x<)8Ar>xmq_amnowUCm4 z8j-p#P^%{F*~h8AltPV2{Y9v9G+(u!kMTHj*g+}Oh|~>2)uz;|4>h1TS!pO*N@moE z)J;OMJ*;x&!WEoqMk&;Y)Gb1>G3rSE#l1N-fKsRtslN%u^0jbU>@rU6qZDdH>bBtP z*pyDYIh7f9_jsX3r0x)kwfV7ELmP0)Oexfe)LlZcGAvVJ!!AyZqZDdH>K>t>$&#zt z+*uPib&67`5vluxDnKd2gKC{QRj9ROMvX{4AXFYo>Feh6tS?HTMx-7RDlern9#_Fp z2WuPQltPV2Jt9G>8j*TRs1Qm8>&tqSeBL&a88ssHj8N>1y1;<`1-UOPrBEYM&k3cbzV_75e2P<} zD1{o4dO@g$lzP9s`4CR+rxa>L>LsC|$&#zw$&W`l^_fzr5vf;%3Z>MUa`y*us!?0X zj2e-8O{mP2`jmGdoEWf@PoorSMCuKps!{6qNBVP|8cQkEh}2s`<)&1(L$zTDVZM$~ z3N<42j!=~;wJQJoDV%yhDb$G6KZMFhsT1#xd93s*!s-Yw)QHr3La}`9z5CB3?#n_c z)QHpvLa`KPGXL=}r$$l=H6rzqP!*-5D2BJJ=&=UaPbt)h)W3vcvtE;Xo}!Z%{6c+zMN&;#`>NBBOebwJJ>@BD2QwlXA^@UL1(R?|Lou6>39i>nsQt&Ih zZNYpQ28`^)sXmlKjYtI$iq&#r-VBX6HH%WH5vdFUWtpysU_bwK-oHjJIGS*A+^kMx?S5sxZ}sty%5j)C)?XMx?S4imiLA z8u70@fQeisI!OPbMx?S6ip`ZB*6OcvsxGBaBT_jC#rpEX^6}R=)qzr|5viPn%1YDJ zHKGJen_wc>EJ~q9q;d&Vc(2#cOc=G1Qm7HB+yd39(>tP&e4U~cYD5bE!ed|nTW{1^ zH_T%l^?*{S5ve?cVy(B==!!jg3Tt$fe4<9A@)9bC6s#Crbic=5FNRX65vhEHVq;YG z3q|I0Un41n8j;FRD7MD_b;9+Xocfhgs1d0Ggn~r|xmGl34D%zH$n_VcP$Nfa zrBw^V(gRH7xoqp%kOG=?eq)HNsm4>FsY>!&b3@c~6P$N>M2n8LO zTv>_@N#?#PQVKO9Rhm$2w3*N++b2$SpcHCEstlpZQD3u)Z`#PI36w&ONR=g2Q%dbP zl;%+y_b7!Lkt#AM6Sk^LXAjOAQUV4 z?uVc3+HbH8|CWQm7HB?+L~F*M(gf)^KVGrBEYMl?cT~n|9BN zo#WJDN}&e+gX=c6;Ab(O$|N3Esy&A2mNQ17cupzQh*TAUYFZ;|6Q>ki&EA{x)4Z#8qrrZLb17N(D5q^I8}yHs1d2^gkt%6Qy^?1ry5WSH6m3*pxoB; zA30^D6l&lq#q7om-K546p!R5+MVK#PlI2;TUaavN5&+$q(7MG zN=QtJNr+GO3M798(IbrH%M})p1f`b{?utr{XUTTa=%9Gx65?HH>`y$(pImaXyp-%u zHoDT1<7r|*D*u8XxtU2=7QN$={%j*4Qp#g}YAQS?B`z${C6%RjHPS#*1?hxgC8iS; z#&VKQIQ^TF>4f%iCncm8b4>ErLVLPnqPwP~$A-m6rWX{G?Cy~omTnngPYFwMyP{%} zl6|9x#^g%ro#=K&x)W2n`nbU0`0#}AZpp6j-ruCb$oxi=l#r0(f|&dUf<1i)7)a6x zJs~DO+9v`YPFtRjLZYQsV;rqY^L;@nLbk89-53WF!&!#-5Ov5StL)n?yrg zMa9IXxRZQ@azbO0UGWJ?FfjN?;BTCTrKBX0sM1S}rzR>kEIK*eSd!e)G0FZ?lERYg z?vjshU^${>C}tS=lkksaxu|CxHN(Rqy8F1N;aFyj z`4){UJS^D_W2JXB`%eUngqZzw6CqQPF;P)4;D$why{L%nTgp_3?|+q>SFGvC$-J26 zP6|&*_HDo7xA}R?pkes7 z#;G|W$+z{xiogw(3N6PSk%C=A4`lXmf$!8rD)vc))RA2gUELAgU5OFkG|iQq z8csU7RGP5#_&Sx4{C|MDyWK2JWa#_43lFuAP+lk{!{8O;n^uqTC=mGaVUT%g_+>MI z{}f>nO1kt%H$el#SVB^7ABTb_Inf;v<7b!@L@~ZIt`Hu9S@7{A)jpY(pb7Z4B51t{ zNs;a(sQj4NNN7MlF{D2uxX6fzGm3A#Bq%jLHYUEiI}+0gjnpSnDGrD5{q=mFB8BsZDe5>jECLE5q(oHjrYI4y|c$*GCRdqQ%U+{!#dDaYzxs(X)^ z#c)3)Z4Q1y$P@@0J{lB}5Dzn53iLCm^|U&e8rW4Pgh4-+{KY0DbjLFEjEc@~(qK*} zQIFKo;N-92GVK=_pk?(ok^7yL?iH1qIJGC$QAGI1uO2~niP}Lo6h7B&^lt=iVCUm zJz?~z;JLf4K)%*jG*KDb3{#2xs~ij4*1{%Pj>gmGBlMMdq>1mBd1UeynkAiWR;fh( zmAPW>Wl!9|Bz%|6{jhzv>_*x_}WaT06{L^Uw>8Zada@s|{W#A!+@zkf+y2J!|66v+A z^a;sF9iN&=pOAd~7vh@=iq*o`2Rt!Z-pn^S;^p;UT=`P}wRS{rzT=~qwegRj}bLri-_(T$a&M(A`^69i;$KZE6ns}dy+yQZF-%-zdF5+;9o7p z?K^q-S4(k!tNI%X;VdG;Lm?Qc1Cdq!TEhq>gD5rn^jXxFC2>S0qN|DI>=XVkEx7B9411o)YPvhZuuj zMY@s5M;qxz!WF)e_&EgejmMwJH!7Mb`NYIG9v?-zk@%jiq#K(bDVrFimf=|;e#C6X z{w6USL%vDOhLCR(OEK52@J(VV=5G{BF$e#bn7>gh#T@cqV*W<46mz}*67x5T(`|C} zU@6^p#=?CgkdN)yagA>rz7i>iL7qAE75QmFz9K0mp)vT1{InQf(O0s@&#AtWIS-L< zRJ8N6gDdIy(l;{yvi}vGI2U;KcqGa`aV6y0t?#RCunOZrO5$5Xo0gpoOTurV}ERPpk!; zTcv`iPpg*Or84xjOZo=s=zZ-%Vo2+w%RP?+aUp5xY0`~|E^Fk&^K@hL5&CHaG;uys zsW^njke*bERT%HnlS;9ElT?aT80)_t>o-ZISXnK57JWJ;@J&+Rs*;cWrD*+h3m=7_ zNW^;;{vz>K{Le_dZ+Q4Np8s)&gdJsjEML3{&pRdmJAOeerk~W0Tu>g9j?|8564F&k zm0g>S;_2$7*#5UpOdKxW|7Y6L6MZGBudOX;50E9k(NG1OeCb^y-&#mV=T&5w{B)FF zh4vMt6sIs#el^Z-QA%+N^X6CM{1&AYr?9;GYMkGq{9hH6?59(UPC+3h%->i{t67fa z>l!H@f1|H=JYUzOn<=`KkdxyvM$k-gMf#cI8mW!>%M{n7pDC`9;_;U$t`RdulMACa zzf&r9BEJeD66_M*_f&;A{0e-cke@7q69oQqcm%s7OU23 zRT|q`9U50Vo7L4u*Fx=RsZ%OKJ<}kyKd*x*>YQ1L_pb>hw|1pQ=g?`5HVyS^HL1Zd zIHbwaDb+fS+GaP~1%bTGJ!v96uu*eh@B8BO-Q z0DW$Un?rksCB(K5w-j`tgr{mW#SGADzY&m99&B*hw0eWiti*fUa!EEY znl)yN(QZ&C;Inq{Bozfp&^V5tsNSYBF9_TV75B-R=ZvanUk$rwNh_%I1MVpSEG!HB#}u^0(01+ z)S2`;gI=TapB}(MLMs?lQeqo~hQueNgf@f@o+QUn&+Jf}EDoDZ3BwdT1ttfmRZ6wR zq_&$ZO6>Nr@Fs)HOX5^&EM}|Ss!}QO3B8{1jGULEzS*W#S=1V{5}%O~qE{=mYL!#3 zb@J$aG%BS-Z?M>GMmc_ONw7_4Q<)7~Z~)JO%ZabA)*Dq;Gt?7(0#pvMD$OQ?UGFfP zmE>7NS8_}r&S~vRgUzJX8ud0_qA}6%0609=7aGEe&=72!G2y9l#7?DMZPnWhCL@g) z9t3m?k?SDK76-VttJ9C1QN)29xmu^x8jU8q)u5xXhb1Q`z~h!FF=_CqjI7fcls1RT zrZXG9;=&V^Nf_vi&{I@46?Gu=7Y$Uk+3D0+;Dg-qdAY>I!vPF7HmQIF6pB=BvKqAx z<5!9l3Ev{MD;)--+G=x{l+yb%u!MleP~|j3ZcQqqL+>@X6{^usMu}KXXbPk`DnVw0?HZfe>aaSL_?)C{hEc#8 zsP&4G_s;qjlhLAAL#;zQ7Gt$2ZIA;qydmW;Rw@@FmQ!R^>TDXV!C-YNBjM>dc;E~k z`;tSU!c1zt#h`;(&|eYAgdDkyHncmOFl1;PN_hU-6`qXjy|N^8*BJqBgo+C7}nL4c2%4K#MMK?8$1iiCauGo4eb zvN|1BJl#tZRqByHl8e!#N zQRyB2YMNz1uICiqNSsQu-mZ6QtU8iYd_vj<4}imz&K4_Li_)&ssGvKf8#$+l3mLU3 z4H~tZON2+wQJ7FI z2AHn2ehZTm@?a&SR;XQvQH|9=Wl(%_s8eaOYcyIjtST_Eq`GMhL;EKgz>WZQFC&ly z1FZI70yO!n9Pey+db8P;7K7eyH#%(TwtOj(ut0$Yi<3JwEA?uv%C52ab;@%lw+R`A z0x;TD20Kiw(rXk#>kl&6j4F*&FSUI>YeFtz0bQbxwX2$~R<6zNKXS8EdZoB#_AtHtin z>WxaR&7?+28*hcfVbiP3Fy!!9g!PeKsdqYTb|bVc7Khz){nXIvgz?X=(kP`V*VSDu z=R&82Ds$@828Z7%QU>H==c6Oc0XmgMr-O;RYbtbWyq8QCU_$(`MAMmI5;piPdmqqa z;D%L-+HBRsEaMSBK2*sQZ&I2yMx9;{J3H)&WC_oQb{;uWBnL98fdS13omd4cVn1kV zeE0Z-p7Eg}(%wa6Lu`5-G;*hs+^CYH47R{d!)Vsom90E?Csw6aZ!(!-O|D6BCM84& zfx&i@7RFv!5#r+lJSr3PJ-rE5?ZTQf#N>b#vRS8rRd#ATuZenEBlI~9tN^4}M&)>% zO1&0dy4Dy?$|QFzt}p5Prn15gOH8Xti{mHS2Km?%gU@7>g&oU(>G zSUG4lPAp}ujSU7Bpt9NM-w?LDHisT6Bq%hvPTkPp+DQ>Xawrsw&8{~X4X}77brjO7 zD|8X^+9Y_5fOjG=6){jGw7f_PWFD8-*v=h#vUD-A6okM57`7Ksn`JR{B8}Dx#b6;* zCuBASoyEi_LTQJKF^iD{HvZm?r^lX5=0JLY?mP1;)K`fonX?5z>1{aL&*uJ&)I#OAY z?k+v2gU3y<*pN;k2ri>w1~Se^0+OrdogU&SF4JPB%;th9Eg)v8gZ)d__y zCmais`3NRt@++%zk95d13{TMeEk+X*?YFp%#TF;i^|S_~)dJl|2?r1@R5m$4Yf$Qp zPFS*9JhCNMidTZ1kT5MKE)~Wpcw>&oVuZDc(PGlkGX`muz*^I{#sZ5aSf}gZ*q;n= zbdC65W2tM_>(nMVi&JW2c$bFbPK^c*0qqvgV;dGXIX;6iker6m(#H&XG$0rZ^d>k% z#G@-o0S6j#L9vSTmsPoxpr6~#dWT96%X{A_d^!M2hs;AKFq+L~BkZ93@cvw56h3tY zM+jONVO7u=d{gnwv1nn;GTLoM&m(!cIB@8|*3AbG*zAHct(=!&r&Z^)JM0!^i-6{gGB|6-QLFI225Rx%?cAIY}3^3xVS!?>lo|?SYWB8??K?vz@h+VN~>0>X$=bu zwi2jkblTv|8kYTzM0Y$?2McHji+-!w3VTN@ZXDag?F2cjK5T4EFlu3YN=}Ro4jivM|a)igYF;oCkYOB7Bo1FD>XJ0=U(Y{laOl zMhp8Sm<3@}j!1yzNAJ+!M84yP4F-%I7CRhLcnEMuEytlYD6MevYl2%{-WvLHESH+# z*uh}Z%6AVPN1-Pb?>oD)wq3Pi5lyE%S4aQgNQ@TQ(!Rj3EkD%3)a2oX*n+j$znZTDa(|l*by7xu7=$sSyCbSm1~Sj9n3PYgM)1^s|KM^W5eK$YzT7k zsT~Fds~VC7CyOFPN{R#UMP9tM!wg~3!!fbhi}5HgMtW8`3^*#CQLn<&6+exHT0IGq z5q1Z#G311hA0NW3bU-Cq;l>LmUHxSBO`TH*c} z=oDrZ>=|fSXfVq`dW=~Kw0+?1o{hy#%+edCbx`k-?2u5#&wBqJ*6q>|{L35Wlw|oy41< z5Y1+r1;#Hq@o_QHxCit}kJ^qyuib35IJwxf$npLge#IS6j7e#++cjDT91%spz9k_p zG+27t05U))6E24JrP^lHIbo*=qp$QmDM4LfGvzTUT4BAXQS0EgtA~b10gp+jP1xu> z4vkXdJvT#iapSq-sweXe95x5APCXp8!6O2m2Shx1C7h1sNm8-US? zvJp;@9Ttn-qBnZ3_~biK@?=U=;(c2g&T#cGzBp}8k5lgd$J(0!L{+`-<9D1MlxJ%$>F-jHo`GD4V8Q6P!{6@KGSI49{6EVl=H#ii0ft`l}gt-vZl+nZa z#2#`$&vh(hINV9&aSIp_0b!s3t5q~(#NQ8syOdlQ(hVeGa|3EU-Kzvo0hXfS8uJyH zk|6{JxU87?4fb*El2hDcup|=PgfSBulx?gVV+ztfHZjd_m@V>v=b?7}v+zzk#3GZX zsPqHtEBlEeCY#Yq%Y$4iws;^Y>{}Py{gP#P1pWENYp7TQ3>? zOX9e3e)sN%NF=I8Ku>I7NHc?(drV~~y2fFc&$rI9cMYk#hIAa_>p~r)RXjhOVfqAj zBFTxVNmx&z7lvUwNFm;V)nFeFiV>PHOw73bK)An35A=wY9ajog#u_3GKGC9JrV;Il zJ?I*t)}WySp%w|RmC}-g6yvrcF%_#*dU4WoP-oypR1I(KQxm8ywqy29r~0>Jc;6e| zESrl(Bj<)D9nmbz?>+Sm7Fe@)2}bkfI+(>otvC6Hr0;#vf!Hu3|45V z0t*ltHx?6pDr`@cc!?~u&A#_r66a4 z5rzCsrn`Y8m){UYuOr&Ep{KLNC`C&vHfvyikIR7-bG@Kz{Tg1ah4+tQ%NLv6RCx)1*SYnN`oI;h5b?!ul0%;fo8sdQ%mJz3$F&a`M=O z$c2%bndsysbo6PW*UZn?C-H`1cl=n)ZS!tipUxU8yJYwH6s#-^)vOH1{^CUE7%Yv` zWzFWhopcI@FwW$$xQP?SBKc;xOYDxqAPP5? zuJP(q1t^A?qt)B0*wnN!Y1n<7NX1PpYU$~&d8liNSiHqc`!FSwpAeN96E$?$2zpIE z|D7Aj4*mDY+*vszN9w-?fWsnHeRTB5Oj4=8hwFCqmjm+G0=6D9ba<4_?-)8VHgZJl z@R37f{ge=gMn;YpF~VjW9uqwbUpO*aXD>e{^*j3RO=VU1^R4`^A4r4o`q(T_X^tcg z`a34>KI$*=-8u}ooLS!4;gi&mjS!w|fJ>0V5(l$4XsakmY7H^-O8qxU31JBdgFTp) z37=P>hFI`twdMj>7|u1J__BqiWelbla;qSG)1LwQ5g2Pb(NQ+f#;{!Wi{ zJ1}2g0_Ozo3@|bMAmC`sZ%>4|1%?4}3YLx`X8cJD;O-y5QQGxrkT3KHZ>$3)Y2YA^ zYtx9mZMXmr0yA?6$5|V}y#sq^fO&Bk$8~H3M}K(crYMe4&%x619sI5bP8rTom*FcI zZhsiA?+8g6F^1zx8o}kk-kT}-lRc>%*R~PdRluzSX8SmfYb;+Vd!xo9U+|#=*&Z~0 zi=n>-m~)rF^@88dX_7RI3K)*Y;x`0gZwd?p;uI`jCgFOV0B*!&j-v7t3|EPWk3(Vo zMEoH?`U5(_aOYY`(q8<@xosKT9$n^OxFV!u<1EzoY>w;D2rd))F9e1ogWIF>drgjt z;NQXgQh9SV0f#Cs%>Zthz#_Uq)6oTb1(+u;fup}W_aZPYav|VAwg9{=Ni`+UKy@u!#>Hjim#ZLJ9|Fxxh6Rztt8=S_@47d}dDSjW3qZ3ylpqs+&|Y zk7LwxLRe(NVD?<8s*xnRZsowO7Fenu4A;OO;a+N@y?21yehGUNzY|TgcLuonCfMtx z^>#3hqp|c30xniy8%r<6Z)y|m%?7UI680$n)-=)HBfve^1baK1Xzvr?zP^M#O7A~S zwAZ#!lDgqTM`QU%?bt|xVL+T3yB?E(OTUCY8b>T?qPwk1k=a zE9}(*V=97xgX(!>>1_i{7lCUm|H$5OU{V|6g4Ex+z$|EpYfyj5-o3!Q)DRcM-bcV3 zZis7OFAVnn1g80X2spHK1hID|Fhd&Rg4jz1W@bZN5PP=(v!WrcfxS+M)6)XOB8XFC z*W(@Fwl~4v31H4O#0808=VD3fjSn4KzBGs*<=<#v#y7+Tu{RHxMGbL5?Ad|`;lSB1VUMmy zIxq_w;)2BQUSJ+?hzpY54}jU<5EsPWFTh-Ah-+Yv;@4$?no|DV*!3L(T%5rESN>h! zM0`ybLtKOSk-d9?d95KXh`s&59BYVcFz+}5_AUqvM0T)w#|Ajcmm#+Z zfcOfA8-%d9Cg6qvH>U}>3Baulz@;TLoW~pjTwMST^Oz0NaRYGO7vto2B!mUp8;WpG z04~s8JaA7p0p|wpn*dy(-(=thEy2m}2o}FYgqJh{7YE#i09^2NoN5B@8rZvfsbAzE z1}g_tAMyfln73$fJunR-&QLO~8@8o11_mdrO;uBYVr5fXe`` zG5{A?URnV6eE=>npQ&H13%~`IgU-O6X#%bla3QziIvb~**%0^`>g zI9C&JR89+;fa?m}3r)aLJ+Em3ZZvT9O~9oAcWoI?en+r+-W=hp%KShOS^wLh9<_x2 z?k3=(fLj}Y3(RNg7xp#*N9i>$!^!UmRt~5gN^An|THuy60e2;E?=}G!1Kd|lz)}Bk z*=;!a9l_EOiEw8Va8#bXO~6q<^L!IVKyN-~!8m4BYJj zxWIOZ^7&u@F3?^_;96JUO~6q*Ik^cqYA0tj0Y~>A z^P7Nc2Hdg$Twps%xbi08C>@mnxWMZ{_NoGKfqtnSTHOR3*}JESxci!bGr`^i0l2V$ zaRiM|9}K_+rnen%Pd5QaaUbHdAJsEH99M#9` z&C4E)_g?mCk~($Lbx9K^H^Ab#(Q(*gHK~t{GWj$@EIBB*81M2~P*^;7#w;)X9x~4K2R5_Q*^48Dj>&_w^NMFo%wca} zn4$iSr9mZ&3h+h;PhQqw?D>>NN%8HaS(0=>>L?A9dVVo9?k$-WukA+paC9yV1j|JmkJPRq*YvT`A{a?7fTY8PGd?G9RPjbQ$5Io1;iHy)~ zoF^OoREr<&Wb3BcSyDpk!{1blcfKoetRrAGGM61g)8(V^r} z#95qe__-AArbW6660I9sBq~^Rt7?&^;=F=MH{qPgB+RpjPzuRlx~Fiymr1YToWZ0` znsfxxTBbXJ^FvI+i5=9$*5eRArOP3Z&i|lh#3WH?Mh&e=qTyy!4jVvLd`yzai5fG0 z?Sy%Y3e zM4MaLAuESqTU=+=8kIF}jixu~I{cS4GKDDbCu@3?$?ShdS$8rD4w?{UEw-{!5ncuk znU|5N5iBu{=8f)%2HV_`?3)}O=66BZ^+3hCC|7yHGi2o`%O_{lZmO%ur=6^#>G>3y ze&h6-J}}3#DHamXCRcfkX=z7UY35iNg7c09l!W?buKJLA6RN`ua*6`LJfjfUC)=mk zud`EONRSm%RDIN0*|#_x1*6vYW_TH_rYgrB%I|LFLTpi(wK50QW;2ylXVfoopIIxa zA?D^Dc&2#>VBa!#%aP4M-+-M9F5i#_hFwK5fD z7&(qic2=IXR(t|G)+-YH({t7tRULKAiFC2F*vtQER$QXgIjeH&2^n=Tr7CoyLvgIO z*p)5kqE`cW?vxXewpS&Z?ABL4v6pXcCRbS!9LkIp7WiLb{vF7ugXe}4^bDX!06Sp* z$r<-)@vCm-sqi}y3(5>wrH1y!@CTr9#vLl@%Dt(M&Usc_l+QsvmZF62w^vyr%{9m& zYvsGZ+v~SDiY6j-x;^e|hZ4G4v=%O_ zV~1O9LaAUYhbVO}We@Vv#>%9ewX3pvVPErUId1RbP`UD#rOm5S>+70D?WSw`Wl0Y? zYm3`_TpoC`Zk^VGZ>093u8sDa>ixsvD-jK}APM$#`;GRQ_8DkNY7}1V*aha7)1_GD z%H5tlBHnTpO*OD9C6_OXK_ae?aVV}Z5p5T5QmoFMh%{Y&9&40`l?xCD^C`sNFXm2) zd9|#xfeULz4iNGKBKD6{%RLJpi_{9mav44r>2jPanA9KV6-=_@yqe)kA!RUWxhB1? zNn0RsE4v`wj*mq;j&l{0&f(0h$f%(qQ?9d5p<3xuo~0szj@qI8gxvPFL3An4W+Jnw zLeHTJTO=#*g_i;6_GO1Jbfe9PaYmhWBP7y(cDuz|u@PbR@{M=k%Tzkm5&I@9XrAu0 ztx@ancgamZV>rG4B%Jn*x%9luOJ#A&>B}x?i@SdUgN7&z?#=@;^XYCz}07}^kyLm_53Wul` z4y2LHE4;T?z7)+$d0bmhlC$zV&#>}$c>?=m(D5Hh+ep5A!pcJw6S?x3ccZhi-qV@I zJak73#CiuJzM};y(+*WRT~ku|%&@a=ki{R}r5!yPHP#~X)|ET{MQO^~Rh8CEj@wUF zr5;sf3@>mG$S8>e&#Q)K`Wc=#&0+o>SK8CY{sBd_HWZ~2ZDZ{%ut#J5JbWzD5}Y@& zl5-oRe5Rw^;iDKcn2#}CA4qRA+&D;_I}OtNOg9q}=g!e^)sQ%sdT`b~Ec=<|lF0d} zZL+T-ybR`LRM+G9j;h{)<_ev~DXMZqm7j9)6^mYDr6WAfUVfq8bD5~0n?i|J2fbJDl1VX6NL6-hN`O=5o??|y7s6#_ zmugV1V(s=}*7P)pv2p}uI!S&&j@!AoomL!LL{--{Q)&{I*7;T8AGfx5glFQ%7JNR&=MTWe({0UG6%HNx{w zNI1LG;!Tm2aWcjjOYFzBF31u@Wd^6wIn4wlvxs zp|mJJZ}v1VKi}5dQ&#pV_GlV5q2qPMkiFmPTJUzbY)Q4`?N+v=O!9UtTO6Jsc|$P> z^0thsu06w2G_y$D4MHsj2X5p84MVNYEo#mnVv$r*QRow>#7D?g&N98%m9x%M$NMl@ zjQfkq{4q3vN%eKS%Bwvky@(JAYV$a4U(dG+s+(*>dlBX0lF2R6A`3w$RbXW6HYL%s>UY*V> zJGJVRs#hTlPNUASm+o?Jd_%09{LQV`&j6!koe$XE2Jlw?psK_iY4Lq(@ZxGXRf;y(xdQW zk=8=u)y`SDdr=G4dek^ftz1foD{G4!w`Flx6pp1~jw)9@DNM~={ZZj+Ff#W4Nu!Mr zcKhI8acLGI3+3XpQ#tQezI9hcm$|n5U~!v&cPa%juBsbj>`FnAOBpw(%4xFul8dOY zH&?EHuC9~4%1Nz#X$uUjL%q%4M?Y83ucdO{u25<4hSKdJzrb~aqK=_9T&dk|;Fix> zHOAypK1E4qJQ{)C7+L%Sd6kvP7zxph(}yg~jWSw<+e6yGFHv7DIOQ12n5-3tpmiwQ z{Q}_Et(<3Emv6;JVwL}c8c#zErd19>zYD)mLOG1?lRsjjn@^>rDm$YNs-9fsOVcDz z;U;R4?V<_i@rEl|Il_ptubf=Dl+|RJt5D~B<@D24H7N>mr+iR+ljBMEN zmrKms4BTawZ?pLo?OHgHa`Bmuk43r#XWHXtVTFi#2a81W8w;6q5NEpSvq*I~`QcwnUpYP67G1X;BFV4&By3$C@T$}O&9bYvM+UoGpb(pO?g|i zfDSf{R?b1S8Z#y0CKE-`iVM$wDW|9!(-`d+;uCJ*(Re^iv56v)R{waRCwURC@^zJGr>d;4W)#UJK`#TX( zYO!383xVnrjY_cuqO7E@uq)1JlRbptL`Gre2YEFN_p{Nis?>$PmTupzn1#3%Q&G3t zFzG;{?I}KTm5kpBHYn(>Aa>JCih-z5vd_5=0oIB?kQJLK8d?bWgJfmOIyr7@Nd$&f zo-1LA=c}?0+4=!m0WHp-v4~Dt=RoriBiC=mMO{}*<;$*Ym8;^*&>3&}(IT6dtdM>Ql_kPSB;FpcKU_dJwyu+v)jp`FAd1Cy40#etF2lWaJqN!QYgWDK`SA2%4y+X?gJv}M~gs%aJxcd=$-f+#^*RjTt^*86YhbzS$iC6#rs$JzdDiz13{2)L5<7Z z-(J2XMAGu_+2CO6&B~YTH!ZzFxcF z3e%0HRQbbPBSOI29@7>)Cnl9EXb@sY(~fbe8S&d<$GQBX8Ih^#6ym^?YjHRDLqX^M zsKs@`aXgh^|A^3C9ScBTfI;2GX2snxkxM0)#gm$FL}_n4oe~gkDemJJTNWo8Z&0-3 z=~n{TVXYf-r}%Po>UQ&fM9x1l1gSG4j~p~*hW4hCh9~w|Z-}*$ni!gVGF&)JDfrFC z(cGJ>s_FocuBv;>@a3+uyye<*+`_6na~@Ug@>No4L>mi<4I_Qb4SqdFdUVcqAKRq> zF%n`Kv`$}6q_fARj z(f9s3x0t>eoPq#Z^2QT1-X6Ed+a_hF0~+|N>u27Ls9_4=ljA8qDC;gOztGm(UQk+b zAU0j4D2|AQG&smpmk+|qFNS*CmM^r_d)+>q_hTl0?BC@VS}y1>moE&HydxADQ~P_o zt>v8wVa!>$c{d6#Ir~=jrG?dXD!(acE@kf+_>X3} zTVE6RmG!oNF#YCImV{x1VXZid>*-XyA)BbM*p-=G?aDsUk@}pgX#_J6R}^ay!1=W# zPR#8XYh>+eAT%BBI8F#NaW&S;%`om(a#qvjKo2z)1vgh;Zn1B~dN;T@gwfA z=LUP#ICQ6$hvm4Vo;GEpuJ(49t8O;cVSeKx#&j;My=+PK<=AT5Q#vT3^|;i25v3J6 zEus#khUG);=hWB``s1dcUj&Fv`XYMDSGjkxK@2m5=7=tAn5)VXFURdFX<1(*oA-IY zs!F0!1cozMsByj`Z}~>7=-@t#jr}BKfb}h_Q~A~By}ztBGU{yEg;v%TbSvOut*EJ) zWYO*q`4DHlU*@E)SB_vV)>`oeGOjFkfVJ`y2-J*H=P%c9q0u7Ie5vcTVbKR@ZsoWs z>pdRXy17~Ws0H~h>yz6`a-B#)B33*Q+fuu)=W2&FvCiqkYKb!Qe(PJ!Fk(95n|XhH ze@{n@vaOgz#s#3VQ<;t4*MWKT=-T^{`@GFAHsrl?y~zB!i9C3cU$7b!&4d2eu>%J4 z>fNd+G*rT9z=Z`9HPNYWbIIj%N*G|q)T1%7P*Y9KT_o~~=HoCePkpgl%mHKk(Zz2L zk}fpvE@xt)5(^c|*SH^HcLjXhJO!79-zn1w(To;anXaTyZ9BTY$y;K)9jGmsfDvuIC&d}(*b?t?u70n?B<|f8ewI^u4zN!;0ru+U7nzP<(9CoAZ;F4d)3+<5wZRPSBlc#0Q#9d`IEj51Uar5>RS?aPYlUIbGGxzp$#eL`* z$S$e1A`>wQjAQL+S^#K?E)?DER;1R2esq(pI9H(e@H*^9pjwW%tG3Z}&Owx6}<6v3>!gbiY_T>E?^AC!xe?O~`V9m>qQD zcI69X2Nge0D)K7@`GGugD#$8ii-l$f`}?(bYyq^wj=@iTH5N~41@(99D~C<(opC#g zzeRn!=&Il1j{B(iEzAk>^2?TXJ(u(RwktjFK(b1bvDjn5WN4@QE%vy5#V4ukv&PVZ zxQVp<{I?-3)L{Ab#kZxey?;zd7q(11Jc%1t~qIp=0bdRQc2+{}|adPqD)&9TFX zr|7v5)$bc5G2BK-9CsMf(=5HiG5WZZNwXlOGwD`HJkCByAEF##i3t+tJ_2bk(>(`? z7NIQC*N}3U6wyZI4ueFc(IQ;~iF2>hLNg#8V4-uh(B+VLse21jCbRc9q--WdhN{w2 zka+xFf%G-AQlsfUg!Bc|eWmHXhjf(bE@(O$Cx6CtZ6M_{ADtj&FsZL54S_^+SQcqE zq^Fp47o^*m)V`e>m#&cLF5Du;LE`DypoP8%sg8xtwWJrqO^|5Sffn%c!)S2Mb?1l6G~d!yZERAc#}aj{&LS(*V}S9rj4cWC zzK@+A$J|PZ3~ba{yK)_0fku~pJvtxy?ZD_<*s&|C?tsJCm2~#z%gO_Hl7HCh&f}*{ z!djiW@p1YzipkGp0|x4Mut>(8Dt=yt&=7L~x>of!hM06;#Wp350#bkAqaobX33>FliCa^sz{HGV$$246_Ts|+;T@Hzd4uHh% z(Q*`@Ex%Ed)O~zdn4BLXE7$XU!_s9}Sve^yt?*x5?^P?&T13?=hj*Avvci7tu=|P4 zOtF(9OM5C?G4IN6xP6O1!a^gPBZyu6QRIT}e78hs^Bz1f1=*AgS7D0Dtu(XyPzu;j zS?R#s#@-TH+KYeGp&W%oxBeFC8=QGw z{|w2?8rn0E7BcByNagro_YtndElk%164xb6qV2nMG1PH1_AsfV_m8NaVXsPG&?U4U zqJ!!JDFYwA@0Ck_*S0pQKKD+H>^{ImpJcmc3eDPq+YqqZ6xvahnc8W3FPqnFeC1N%j0U7vMq{*7JP?NCoZLR2t z1XFX-m2X3#B%|HIMvM!zIYM?}NKTs*Pon}WOHn?@*{~q!OU5d|ZjV`se@E%)P_Pk< zmjPO+R!;Jw%BM$|jO8<5dXPy^t@$0A*i zGj9~A7v%+zsf85hNNwF-e;WIL&AsDCAEgIjef;J!fUD?LANqo~ObsgC8*>zKY z7*AEcNkwO&T;Lgnm8v2)niiBPM{GrS84w=-d2m|QRqH6fm*s`dZ?hV*Dw6I#v8ix6 zoMVr3)GyTEM9{7{thiy*NZIKA){4tez#LU`|Hk$rtnRj4(9^!LIo!#7`Ibcou^1^= zjc;Dp-M*2wVK)ftfv}deI+npBkLkS(6th~Y?e>kGbOKzc_ApI3zEcB^%QvQL-E2FJ zv{V-=LnIavxlFEFfL2LNHMwc~c6^JvtI@6S9ALL!=mYt$z+==W( z6y4!-Tv+gzeJ0-5p>pCPP+v#QfPQT>v;X4-u6sTLk>O({7oc>K9w8cZ|4v&XMLkef1bQi=! z>E4H@k~QgkV>k5?ZsjM8kf^W~@lrt}5A?a$AZn8RJMm~U=5`!t-E37( zaxtOe7f+XpYEQ?6Q765F*=EI^a(SJ}d$6uKsd~s8rLd>Ji$k$NLwRm z>JJ}%$wF*^kJP-g(uZr~C>5QAn@-G)U%+3uI7UyH=4#B>f2ZeiO3w?hXGjmz-W%ZM z|CpYHL@Rd6Z>x0(H(GksfPn#?{?F;@MCmz(>ug95({6{BZy~Pg1yMpdQwv-h<&;|B z&U*Uc;#`?9>XdglwNse2F8>(?PQ3;vQHbR7>SlF|2!dT=C~~+ontE1KT!h1gjrc=U z7r&`4u!*TP?3?SlQ8>1GP?1)3&Dl@d{hUElq_pXr`et<(`}CTgNLMaC7KxgvbI4cz zWDIrJ7AXy9F40KvA`9K1>8dq})?a8c#v)Op!x^;Kl1mF9Nhq2YsZ!J3sY%p?m|1A8 zrlVUy&K-l07A$lM&RmzFNiRX7J?|FjElsyYlfsbm^wcr-4jXKq zMFjmf*i?kCWSUWSrPjfASSsH*Y0vQFaNI#*UEzTin927|w_!C!xq&aPxO^p|JEMJt zxaF(%4xq;wW&&!MZ46jhi37sz<4;g%@=o(Ik!^Bi<(R;EgvvVc6cOPYVo85 zuCh#K_pE|~%_EVt&T?bGI?ELe*I7QGqB70x%LuDoi=hQYowlC)MLqahOSS;dXbN~F zK{1Fyfl4*Yoc57mx#epGaz)H(E7PiuYp?5f~vmA2( z9;4K;)(W~He7(iG;tj~O=3*^>4ic@qEX9KYh`Zevy_zq%;Blb1(^z$}ChkM`hMm2y zoPy~X#5!DCfdNIVz|btW1LKhhdJd?9cG2^h?z3^btd-QM*p%NsRYN+|-k4xMo6#3IXnvB<(>$)7s)T*eFR zDOzONL5nQgYs1xRhUc%S6751!pu2vDatL$oSUZ>~7FwcL;K@%wXidR^^iercCa-3z zEd5<^TRnq#6#qm~^oycCSgxgUnBO`}wJUCW@kX}#!1fj>JK$+gG}cz^*czoSuOQn{ z@MG8l`8kg*+7b7$!*`i4*}}_X;)f`b_1o1#X^;EGdYc_ds$GOd2L@60)z0G!5H<;G zy~fxzSWMwFOtr%RV&#+`%ZbG1X1nqarF@#-stK*CAcG96Dp&i3Q^~J(RfV#J6}GBE zt1DPo`HU~De2u#FJ6l-UU;Ku)u)@}(`(Pi@o%G;Ke1$#k-x5b>#`zg%yyuu?al!8|wlL2w7JwccXeR0>@|&qzOzK-6_*A^!IgT7|>h zUcka9a!p(HbSu28aO1fOHraG)XK9W@`ZFTrm<8(s;CkJulC#Am}_g2ZRTk3-7A$07~JrR7{|I{9pP5+u%@u7%Pb zKt3B@q=ot*@jIhUkTRJ)8b;7$As%%`9puuVkhl*Mnh-u4-UAZX^?}4^!$)g6YJ~V~ zc$TK4#*5E}-vjA3=A%8j4{oI^BtEx23KEain_B2*NPKR4Vsn*29UhfCZPBtEwt3yI@Wwa}@M_}q577Fw)@E`r48w(rn%cSGWH+mAxx_SQqz!Tt1*pmy8L`Q>k68(6Y~V}0}iEP8Ss+Zyv1IBTviezb|zS` z>>(-RFhiXfQNP^@K2MdjROS947B%kC5}9*M-SjehOu3-vpyOijc5OVrYWqkESnRj>V@dqS7Fi zO0vaghb=$W*a#&##AnB?g_;O|QZ7}j|MSrs%$+E+7HJ?Psx@Zz7+fYKlxyV8YfMKq zhD-69MEB)fM|VG5k~PV#Nokri8Pdzl-ZV%wS7w%GK%!X$vqYO?xs>05Ngjpmu>k0`w)6ycD8JCg}Q-kU!mK4}SAZ*=-O}_FOJ3Qi8eo?H) zbiuHW)?+Z&N+ps?bS)Xgq72o5*w7w!kKgS0e>mSZ|1BG|Nwm{2Q@QhcPYog+4-!O~DyS{m9&?~33R z$gdXixasw>KdkTwjxk1%Wrv+6F!^KqJUbS&rI{}^4{FejQMP=ft5~+^sip}To@zuq z>L3e6QzLZRL_N#)i)d)*(XhddO*YtYW80H%y}S5NY_P26%N5qmyArIMw-2OOIB*T! zvhtg`ewxH?(!`7{e@y`9+|T1N9~MRI48^+^IiOx zazs2hYA^p_7hsZSsQuiIQy2$%BkbkxuOyZCT3TiE@7s-=FSsS+T(7J>$3nBcFY^8y ztusb`XUl&G!DAC-+FIEkHGoAO0~r=?<9g*O++A8Lt_DaQE8utK_e8y-3}>kMFjYC} zw<@XH3S5;`LmFF^oa?tL32f9a!B-`>t9Fd5lD9UpDyfd7{Z=Jmpnf|`aNJ2+mDFwt z*s7!hBOIEDQ1$pp*=0Yw15b`W4vAGWH4@lzY&K=#~hDm}~fnd%3V|5}XJD#E) zBgcKcm?j*Sj=}TT;(`D3byL-Z7)#$JRvKzkP+U;4_-g~s*R@Ael2yarA#lD9tI$!u z;JL~PN=0}Xj~z{7AaYoez{9H)K^9$J80itlr7howL8-3U!pF=<{T>`2uRhDjO=AP^ z94f3I0qat{3oC!Y@RhEbrz?A?Jj}ks5^i(VZ^J|EBudy~iOJUpG?I9a3B4x3=9fQo zb2u2a(2S=r@p^=Sr`5SnynSH2F(EL8ekFn;+%Pd@@)#Bq{@bLIj8u5Agj~9?)`196 zJ1nX%8r}pnPX1N9FZ}Q(axf&m<>^{Tv+=?EZE((F(lVU$n55ub&4vs#^5BCyTGZlG zV@w)};WpQqS~Zti&1zm`$uOrii$oxfQT&UY*W+wP4DiBlCWYWkGn8h@beToE zY+{F^_8DP}=Y&>0o`t|!Tq4%HOc%`G6qSbW=NO9oafz5)m@XJ|0z%Z|c?jGmmx#HO z=}aA(OC4slD{7k&n$||7afV96_X`X~KDk6pTK+^DTU(^oxW8yUtVIzNlATWCSb}fv zk4wa&rK3O=T?h5J6#{2*iC9OO&SY&NS+iS8R`|0Hqd#$iw;<3-9F_RyOfC_V+FAJ9 z(ni{n9U{Fqxr5a4HtVUj$J-oeRo$|vg-9#?$s_f6kugZYC9?88)0r$L$&v^WM_>NM z&bQ;t{c?#Ibxg;uNTRXq%wimVqB_T!Tq5Rart8+Hg%oD$EVVk`vKss}!mq?944)_Q zK|#ggpWAmbEybHlWa}K$_3mhqI%ap0EYZF2TW5tr=2)`ICAy8_EV8`{ANAnjM*GwP zn5Ev`EmHSCI!Ga(c4RS9S&iA}EJE$3QJXk|**BY*eIWc}V~hjmkuPqSY#zOYUApN+ zyoG17O-EyPd47;h+7755!QyLWc1_k0Dxb$&9bnf^Yd0QNsrX)l55MwUqN~-J$EtZV zsret29y|=s&Ul?MzB!KcTndB48H6h21p<;9PN~st_u#f!xNg^o(LHdxWRw0VoOkUC;#XecJ}n@`5RJRB;M zQpoXCD!J4Z5@!;s8`^aB29w z*rj11)kauCyruss-ejBp@S}PJi#KgA5Pc4M54ERCS1I_WaSqQ-E>UjMv@&8vwUOq} zaHtFlQf52MZwkR~CO&a<7 z&d#Eafz5!oOyX`>GJ6I(&fe7Pjx+h*?~^gY;?)eNq_EDJsyR?EpUk}+|4X> z8_-7T89fl!tB(|Rs@?I>1Ffq=idts0U^V~)3U$!0)nRw3(9p3CA8waRWcNXCx44y5 z?CB<1O&AB9YH{3uv|I*MSA6uAY#TW0@fZYdlS^cC9kXeo(pZdMRK(6dcOTbSTq4%f zjMY25wG{qG3#sRKEu}8otWs-FJJev_1gRD%Hk?Ok<&sUaK&W@{Q4bzYWtB_h>je|V zx;MQ?7rrF;lHf~%FX?~sMSgnv^)SJFy~cd8k@n*0f=>D5>fpP#o;X@K_Wz&3+eX8r~ z5zI#o^O2m1*YjrEJcYK*{QSbKOizwYdsVM3uOK^Tp)IqxICGJ$FxOU+cXN)dZ@#y+ z6ghNQRP^u>BV%H(mUIjFOW)Z6>?=XAWqNG=`j+%-Ev4p_l+b&DvkK?U%d}{ z!MKF^yaJfOTZ>D{YJOp15p!f)kms3G==InNyz^$k#jKp%!r~lTzX6DXtDrP9KQ9}J zYse&$t;Ca4WQ){e{Qr}G&w`ws0*Zhwvmo2nZ`7qDBBK8PB`TgpMM$)o@mV&!#2J6l z+{V<|c_nnk7vSRO6$D&^z|8TprDsVlN{B5#r!*(uh7A7StfZO_DfDFKqZDN0ic$g0E5LO{=|m}J1^7RxvvUe^ict?rY$!m33Udb)XBN!P z5p|(23V)Nh{;8r$gfi#NDQPWDPLw9+B}!xPA782XkFUA-PrpRv$n=M-e+w3g(l?(s?Kldc~( zS$0l#C8b~IoR~O%l2e+bzN;Knn8lK@{h~^#L<#V#16qWFbN#9a;`G1J8(b6hGG@#~ z^=EC~f7_dkHd#t7%=Y3dc+}Kn{ohj4G**K|WQ4+>iXPQa!n_ z&^9l#V3A+z!&;=0tD#zmy=Fb}gb3knK7Hg8Fet)Q@AP}&sUCQ=*5iW@T!gf~yr z(42y7D!Y1`(x#wp2c$!|VKuV^tz3XdYa+e~H9r&W&;LZq&ifw;P8RzE2do>_e^KvL!ulZ9 zj;o*~rFB@&#?ThgeTJ661 z`CiDP?Kb=}w%{VDZwdVaLu=4S_4P_g)P_MlsgQaT2xE#1y+sU%QxdNfISY#li!n$j z^s7*%Lv4Avwt3!sPhJtSjYq?lH3xrE0H%gjUef~kH7eTuW@EP}27h^ei@;%nM1zXbS$~;g=-^{cE5M=%=O#aZG3P4+*QjCzjV*$UY~FNu+p|+ zpzqffZR@`Ov+E0^@9(ki?>5f-T zxHsJU{>0MQ2fE&MRq{YP) zecNY3taC=V`;$+Qz?4cKr`u_TST+Zf{ zUu+Slwz_Y6&fTK^!Q#sYt(<)-;>@Fe&X{;xzg1rqpZNWbeYM}a=6kR0+waJic`sdf zE&0<2uXthYXR7^&Hymmo-c4D$_wC-lCz-bn996!i$Lep!wYzhqciOU3Ctm(xciF*b zQ=&?KO}g*Vn8!B!JgM)Ojz>1Po3?S*$ouyHu=JR9Rq4~)Ph8i1&aYMLH_wcj{?(Ab zdfjl%v*pjk+P>`3a_O2Q-PRq9?EKM{oo+rI^7%VC-73aEaPudp7p+>e_U+eGDmEUQ z9r8+5MA}<}f1Wh+)^T%|g&uqS)RP;&xN7;`cfaw|(ALSj)%eHv9RKaywF8$#ZnIwT z)L-{yeUdP?#4|Z%aYT!@9YX(ltsp+)rf;8m^q+5^=wUwpaoj%_KD&MJD;=-S7+?GE zD|IJ^@0oGrv)78hI@av_2cBJhdUl~#K zch~A&Q*T+lJZDS6me=O}lwuwEdTmt1W6xi1n>x0%=gGk<&gA?tIdbg5p$q>#^su-2 zt=r$0*PW<*`D1BH;i}hviT-Es6I)jGnv!w%cjF$Oo3+2?y3uOo-CDO| z?4YUF#T4EY7rMXh8tWeQdfxTw7L?Ze~mzG+bE>@Qz9^zCEmN#%JfnqS+z^M#GK zjeTUzg;{UrzifW^oymWNb-C{B;f0-d-1DRJ*UW7%Zdmisp^tNWJ$HK0{iEi`Ke6`Z zD^L8{@sH~t{;uHTw>!p+Ts?2_L$}`(KE2I=UB@3DcE_BTHvLu;Gx(M6QSIMyFZsOr zy<;Efd*~0#iNDj!--*AtXzqX;Uc0w&#}ap&CqEhYX+^8a?>&-#-8=6dc(pn=|I|wr zr?0;Hp{O}!$s4ZUeUJM$_p|rSdU?p%BWteBxgdZ0+qjH}d(;jne)Z7>2ReTG*Se6W z#=iTb>->NTUthh#+-*dz3H?+RPp5Ck3j~{&YtL6KHgM4+Z z?@!oJ>v`bk=<#QIWG;JiV(0sm!cp^Dv|9b^_}*bko6`qsLRRefe)po-Pi71$9_HCN zaD8Nt`B#3w{^Vybo-{pGnt!a*YLD&es=IFf?Ag=1hU~nihwb}ime%?485cH3k2y2# z*|p!j@%8&zbC)lEZ&;@`VOLz+ZT3BhZ!Gv>S;3SSlD=NE_PS-yZ{O^GyYp3tyLa30 z$GM{Ui@Rn-^}nHgOsQPAY+LQW=U#BEzb$Ll{(>VHhkcpw+Oi`{r!>o5yL@Zz@^!ub zdT_0C$agQKb@=VffC&ZBZ623FQe z*89(MU&*aL`>U+5(>kmBvHMrwRrlv}uTE&a=t6nd`(Hj)b;naj=ZEe4V#gylSPJ`w zg?5oJ`N)$jCcQrZS-^EzBQ0FB@U>$BPIv7^9CY zPiYQWq1i68X(ow=V{mrPEbr{_Nu+FskJ+@*5Kce*|3VpAH=8j1$c~p+?AXS6^pmD4 z=^#uqX|N|}p(lJ^0cj}2OzYU}k0re}`|ryxx@cJ9?b6%=YV z&A^#*>Y6ismj_~6G0Z4|nf2h!xq%qUJ+oX7{1i`vWm-n%?9T zm}P5U{4)?k6VPT8O*hlgA%1OCAO@4iz|cfKS?qJV_X9i^{L@ZLq_Bg8Q_OC*O!zGj zLle7Z6HT%c`j3xSV5bP>roWx`3`3Lq9U(ol@V&l)m<|kc4bF5dJ`o-y&crsGzJvM8 zAWi(a-ReL)G`(y#(K1~Lq*+IviwwkcW*C|brksi|e|&QwhCG-}v@AnupIc&nJP<=m zOJ);I;Zy0~88cu{AciKn&8Ecy)B3<`e+Oc^F$^s~QG7bAZBrJA>CP}iaHhlj(~y0E zm>v{jqD5r7_OF~9^;aNJv;kolq%pt!aWoKfIm6H*Azis) zuRItXh`EAcGI6G(&EJcIlrbAZ%qA*>bd)}@>eCrS6SGe0$xFfo`lr&v|l1m-DKfp5-wJwQ_(pxGOs`8+`LeSqfo z01e9yq2=D&PzD(^T>~`!OQ@VRG63TcnwFB9(#!zNf&k6ELeq+|a*HsP>d9rX31u1* z9}i%CAT(_>%pRd>t!WMmO^BxXMrb5W^KXErJ5L_Gs;L+rph*kR%ni`^0yNJAXsQD= z^td8FRPSbL{&4g|e7I;68a;+~p}9)KWD3odnr4O2gln1?1MKVx(EJ*p!9GE8s4?sp zprJR@(a~4)wM1z8L&KA}K7h47K=W&WrhRj6xsPUfw9rIon(0E*ThrVsG&W81gwW`D zxHUj?OlW#(tiOb&r>5!Eg2$(arim4rD>Th?q3Nn=76?rzO>>XXT&`(e5}NLsW|z=( z(=;cArlY3$S7;HfGZH`81|khJ z6vHL9xlz*$BMohX^}#wD`Iy4U2#z-W;*MiG5C0)KMUL^&(cmJTH4q5i<5R`m zFurXkoprrnF^uHz>uQZf4i0Y|@p!1_D_^h}M)LPHNMn&N-<~CzI%~0DF^s|2V8-%K zR~yZjB3KM#@I_-YJzY=yv!j>JdQ7kw#^8%`*KEkc)|#(31&d(}zJ?lnO*?bPgF0)c zU@?rr7nKp+*GFSNL&mAs>!@HcjKLQbH9cLvAAHSpR-IrmjKLQbKYd)+cklImuhM+| zEm#a=@I~cS_f@iWZLSPWzE70+1W!bl&-ZnyT)d=&{6!x((g{hID;SpI#l>8xi2 zi(w4Du4OE>etq%m`rHW3*D=9j7=y3T246eY@4HK9)e9EG7!7PMd8)YXAyDOn~gUX@K8Y@@~WAK&8SmcXX#VH56>#X^L#V`h6NsL83 z0vgRdip_OI4iKMNMa7rTO97=y2|jMWKeI{GG_xVEQOHr^2|hB5d`0aj1f=EsLD)LAD4i(w4D+>AxO zC=V-#eDku-3T+D&4u&!KN`+SU)n)eC2|8<}U@?rr*Eq&f^KfFy!Yw*$mS8cA!Pj_$ zuj!U9wK|Kxcu!(~tP(ZFZw!#8`GO$jKHvPo9$Fr56uub7;EU$L^mN%Pri|2CUkDb% z7<^4+EH;Ay>1^i27@buwSPWzEHOb&B>fKf2bXIsf1ma*AgRjZZ^0t?**UFEdovyQ7 zg2gZfUsD*13IVYmQ|c;pR)JtKjKSA+j78Ur4r&j(YI%6KU@?rr7meifJp8(%{x6;N zwqP-g!Phj#qCBMb@U1})dpl{qJ{K&8G5EUP;A`{OQD5k+dck5CgD;vzF`LvjD(9K< zr*+nqRs`Z;7=y3r(CX>h61n~to#hfNhB5e>!B|?EAD*3~vkC=^VGO=z8hkCzzOS>+ zx>v9m#^CEl#!}PuX2zUfb=JFr#V`h6=>}iVKHljDo%M}iF^s`ihQ@**jXZZ?@8#O{ zYAK2g!x(&JYAh;;H+|FM4xJStSPWzEHH)#-HY)Vm@=%>63l_r|d}SGY?NzS&U1!}S zSPWzEmCaZbOfg*EX2Nitb%$UvjKNoq!PlohZr-4?UKT8dG5E^Wd_j;l9k$Q!rsd%Q z!D1MLuh|A)!(x_}>a6pE#V`h6a~Ml48+E&0n4z<-XixqniD3-B@}Skr{F4Ju{He2K z!D1MLubUW)qC$E2)xrMzb=G{rVi<$3xdvZn(x&)y)>^@07=y2T#-eo5vB;78Tt_Vr z*-IjzWf+66dC=&z@Wn6&Uj>XMvY54pmubHK6)c7^_$oB`%E>5rP-pe% zfIu7!WAIf3Enfqo@F$-=`bQVd*GR!)7=y3*jHR~ok1l;{j?PLKEQT@oDrPJ-U3BkY z(R?izEQT@oDlzyP*Zi73I_pirVi(IvZ-FP$sIy$})EQT@o@*-5fUbAo7 zjMw3-tX3TvnLSEv90QaxRyfYor%V~Qtap2j6)9K@WAL?rvD7?#`irY>)LGXH7Q-0Q zwUDuFIFqmM=6TTwsxe$9SPWzEwTQ7)UyBkSnx?a!7A%G___|qRL6F|P@kG5<^R-K` z7{=i17L7%hL;vXWM2EoLpm!?un1#htz@i0M8Wamj5}V@S)oR|>mI=(jFELaG<=nuScm&QhC-^QYmZi3_YY0(rWTbs{PG>dm z!nK4kvhIM!Y@+ce9gnQ47^$(zp3zyQf<+i3YZWwRQ#?^{ zY&ty+XEj|f2^L|Dtkuw%O>Ug&@V#{kg;!<$AXtPkvhIY&Y)U2yj(tN%+^w^&5FG+x zjI1@#m`#a9!7=I1$9L$gX@W%gfX)2g9dw7 zc(C-P^QtX6%OzNZF|zJwEY;W6x7NO`v(g2NFhh| zYrsnd7{IEm4+V=bM%E*Ym4P!IPy8|$1zBYs7c9aUS&u?vHnkuMj<4o^8>_P}>&~@= zF|yV{qmTWPufK1v&KfFMgfX%nV=U2FOGn;W+FECg6D-0QS&uVTE1c>0#-3fLvu+kF z!WdakK%hm)>#h-7GaF6CmCxv&UE~H)AX@A>ovh5jFI&eG<*jIvC3Y#ajVX% z6)eISSx+;TS}S){UENV<_3lBI_+O?nvYvsK&kRubl;8HCTBuifnqU#e$Xd@>YP-?C zK=bN@txBEW#LB&qHH2 zspHY`#TO6itgCyHB}pQTk@W&JW>ZTF#PLSuO&fGpl3)?W$a)bPvnh%wIHt7-`$1>T z5G=wNSua7Oj~u>8dE{E1b&p^X#>je^vD7?FUHv95j(WX55-h?PSr{n5R~*iCge<)t z#YAOUdT}jbjI39oF`E!Ac62>8;9s2;FIa>zvR;G6Y`T(@q&KeotBcMm5iG(OS+6rz zj9`82dIkktjp0jzMHnON4aOQGSiM?SF49?8C}0O+jI1}IF`FWJu=ICEWvR~Uc{x`T z#>hfZ086dQdwjQlr?Vyt7GaF6w-{?E&U8HXm=8r&O_w5AgfX(vUBTB#qTsms{6fF0 zyj8FWV`OcFMjvmuHtj0YeO(kR!WdcaFxD`f>G-Y7RKNCc*cDt$7$a*FG-i{`gQeXa ze#XF4O;?^^5yr@Rm$B5V+-J%Yx9hCO1&c67)_aVF=8PSox&NHkS;qv6FhyjNh>np(`jFGj?z*_XxbA5HzpMpggBWpWjskza*?&%#mt95S# z;vkHX1rXAu#_;92Lt}MTq+k)o$lA$RYVYvfjgt#?mQ%0@V`S|z_Xs;Ed4g)W0TIBC|HCsvJNnoMX;8%pLRxPl?oPNjI56tOD%^HH~HV2-zivx zF|rOamYS}rma|Ynn?Xm%i-JWMBkL1r^l@+YXZLK;S-S;`Fh|DFSF>b8OAWb@fl;?sN%k~y`lSx7c9aUV|bXc+=6xF$R8(k zmRGO{V`Lp+tPH`*eg91qA2knO5-h?PSw|VmDOiKQ=ySKu`d+XIV`P2KSW^V+wRPKE zI;&SWR}+T&zfNdK&o#3Qn!#Cf=9Y|zX0&5Cn@vYrupfRW4;Z6Irza((N5+nGxgCl2 zBsoEQpf`cP(I8z@q|-wug#~!PGM(NJky+r$!+ReBPzustZ-I(uD3vSn=UByYL~)-^ip-}uqLHzt{Wgr#3tkP(vkw<5K!%hl&-1+ z@_tsHXI^GeI!}GW3nKzqrZo~qnchec9tCbJC@a6Xv7o$?n{$c_8w+KRJvSCu7-$ri zB%PjYPiIf32M{T^U>4rSP?A1t(SKm*spoXSf*OGSzu5vn@d#?508c@Y_5Zfwj|ysv zEU>hqT>d}q-UL3X>g)r)$qW#}G64~S8>0q|8-yfCLeR{b+(~AVND!i;5VA-lBr%yG z;2KE+OfPXkY;9{TZmqVyRr@OLG!SGFRNVIp)>besxS_Z--~V~ey?2&7L&mqu_x--} zOYS`Pod5HjeLwd(_&DF-Rmfc}BL;-v#)tV$^#(WMuCA>`J+C+Bj`p$m0zJL!8ycay z#2|$eJOE`AP?VrWxw#EOp}52V)}@LM>O;+r0l7#h3W!sTscnKL1M&|ayHP6Fv_Nr% zv2=1RSOAwmiwZXQB;vIIS^#R6ELc)krvW+T4QS*USo64wY& z)lbCrhU;Z0cZ>o6h|8?zuBL`U#fieLy6H+8&~+78%1};SY7p+a$e zs6lcz)JYkErgj87BfQ_r;Ny~!Rw_*E=2VFOs!P#|FuFfoOt_r^XoQ8rq%rE4kcBEI zx`t7kMX8K-gWFv-41>asAkNU1A3>%OdnCc}+SVg^5SJ&8NAcU`IKCW#A&wVEZf4_n zGYC^0ufp5tID#V}s+i~&Cb~IQMGXo=RiN=yJK zBu-CMVgkT;*<$F$;$@5xC<2*f45Se%GAALZkQyT&<4H{jdc^39F8YWOS0N&B*>R#A zA!iVfkQAdRa5N(%4FZZ2weaynoTx=WBE)E&c&JuJKTj=^YOx zWN8T=4<%%2)j1wY$Qle4kyxQb(uZCV2^Gs-1jbk)q9q&&5t-1je2GltSco_gi5?He ziH`vmFGvPpypS1yLZX(pp(q%Dk%iz0z=$YE4{;+RYH*BTjT#3>a7MdDFowdW6+&&S z93kTfusGskuQtUI8V4L9+BjO)hT9QBj{qA)oIW}qL|zCtxIk^>8gJr31Ac7?9uE^e z@E;_22Dm7-TElHj9|MCZy+46L_;9w`6D91!Phf~h={R$qh;)gEiLAo$P?7aF9x5_n zV!s%!RTMDO>n%uB}7M0pcOMFGL9X^Mr+~6^E*t}&vpWW;HN&dNf zwhFJe$RoSUewu%7pRJ_KC6{~3D=0;43a6v#zzP{M8cUUh(?j}WDc)f*bQjx7d|sE^ zSsqz7NSQSfg|t~0PKPR3El2dca64_zBB#By#9b1KqORyUI(2n6m)GWVdmY90B6o<5 zTk2>Q(pnv2^Vy2LUT3l0>llQMG**Y$%4}}8v(#B)FZ(HM*@%_fQ)Vx=&2i|mavT*U zWyM9VavOA3>$cfm+37B^qkt8MEOUy=T#k}5H!LHdrPzfjswlDf!k{jv$0wILku2d* zPqFNBR+M^eOTwUDxva=j<}0y5Keir#V!O>%Y?tK zUy;2iKA&E-b?=JMI?Baz5lTxeHdbX_n1?hVUCiPB<(7M$vh4Pu+(YTMF7NCzxuT@B z2(7kI!>v2GTsD`ZqO8=1JR3Y-%^|*GTZP-_C@U!|kI!d}7m~y4D0h^W7R5})`0+xc z<1TiUqalyw-4Xc8Z4RH;QR?x;^iXsb#&9}awsJ>>&*PQ7HYnsSoK70KwFcDRfW}#@ zl^14_Q$)w;v3Wct4u`8aW=OG{15Mp1_-)8GXb094l$sw`sjJ9U5|dBW)Ll4TsOr|) zTy~p`GVJt~#EhTjohT-4p#p*IM!~l`P<3Ktdwe!@-{r2Niqg`b#wOd`999^ExX^-1eA-Gm?v~;6&D{dm{8qKEmvE} zJCCijxTMGqAJIptdb&|73#XH&ZoLl{g$=eLPKV1@R%S0PvX}Tm8~cShX#H6|zwQGX z#0qaoX^GcU5(`(DqpIr;F`%Y9oSyO$UxeUjSbm9IUhZ&V^rx2sUBrwEm%X^G*e%-} zVna`NK^IcyDJpjP(4OdgVcNh$K)bC1onyJvS03HM>X>O2rRe;eaYady8>t@#HT2ZcKICE8<0`{&NpLZ1=%EM1Ybz-#Epa$2 zL_%s>)gyZM9A{a%3u7RpVh)K2MPr7;ZFiS?%WbTGoyF^t^L!=la$lLxCUmk#I?gEa zx=SjGE1Wh~)E?=WE4wgYC@JIQE^5;p+pAlf>S}F;XBQSGIDL+oI2D!KeB~~;1LIBv zSG2uib5Km6+CqK#vS}D4=n=tiyu#;ld5RIw(0Bzcc40mrdqBI-`pz*vBen55AN=un z&?3t&c`y%2x4X{g#@MI0)Z=rb-xwsI5qw3cix_*B$j(F~xL|>2DJGx}?1V>b8j9`0 zsnhavtzl-`jQp&#^QX_4mLFyba#~i_*=L_^wdQ1JXA75wskN)pq*LE~^0MFHB-7cF zFyT6F$p%LmrS;koEdi0F)HLXk4e7Nd>xc3Gc@)kjr8&ZNlM;@OYu#g#q#gJtLoC*` ziiP2NX~{kl|L*`}Hq)EH*(6(U_?LNPPlvG5RSdn8v883%qH!ee1mKEPERGjSkY|ey zUnlHIU){?pj?Un5_`>vXz>2>W9HJf2BMTVzmsc0WJ3U9@e-v;NRV+oDaZ&Qd!F~oX zrO~(;@*02%MB}35r9s}!z}yv$iy?0_FwaHfqU6zO$$k|Bl1;q$ehJ(_w7jtMbHv<% ze@$B+y|YP0T3fACUG5_L`QABRk7MRZfj~p;l*WcdCnaRgZ;+D4kf+X>^IKa3wM`8*OXdff_;Qc4L{o8AJ>4PH-rTxm{-OZd3_NN7 zzE&K(Q|-8sn^N1*I)8Q@?g4A7o3HKHp4HUc+%|>Q6K6`Z#z>3k>d&L3Y$>RaZeH>0 zYp7{$ZfmahTQg^$W~CLUr43im)hAIjrN)!a>#Btp6xA;(>zbi@5dKc~7Pg}jL#JDlq^9Nt&27>!(1{o; zKvc?;BwHl{Yn7D?Qe?%MjyvmRB}wjl>@kuOaOCWy>({e5F3Pu^-zHr(QdX2T2;jD) zr2ZkS!c*rPE?}?A$}SOkMPo%WTr*4#cG^&ra$eHhas7PfR_jH5r@*Up{F@~oo|GJB zX&#;vn5xEeB2(>n9>Y{p*gcO{*l325QQW;Js1&^8`vTbU-JyPJcqGZnPthC*93_RI zC_x1Wp%&s_GqGf6z>)6U6UM6kQbvaS5BVVEE`%#JSel6?_jEYoCQWnbj_Z>(IDRR^ zMJxqHvCLvS?WzxR;SE@`2M>9gI+#fwinvpet1pFPl2{`S+_RUcpc zy5UT7)%)*hR~1a3z2U<<(^oxP_UgM&-I0FXad!=U>&yD25g8MOhL@X`EiJBr=WPC)D%q*?iZtQff(cIIb0?}yZTZlyr&l4ZqM1+_gfvMBsY0u`x} zok~9$!hkDGX*^YMQxcUQlIR}U+#QP7GS~=X1p_m%Eg$7cu|)S zQg-o3-Qo5S*AS8Y+-)Gg!a8)F*}xv(wqqsB`ZOzyeSBk$3e> z{dBJjQ~eU`t#AirGo03p6mD?V_EUKi#^5^WQBXeE+7b|_E)DGU;3p4oB3eDn)Qp3j z(Z}3$6h;`d3~T_Dy z3>+~WB6b2JvmhdWBX$FifSa0~lZ8>BZU&ptWY5S}=Q=c_N#z;M476=0t7S0OjOK2& z;OoUS#*F5EIO?CBsX(65gf-V>?ZE&4s8vFRNj9m%Ftd0LetrhrQ)-_<4H?fY!kT2_ zr;Dpe({%&2*f12-SThi6Alg(6;mE`rkzWg(qGGAZi8lkeFF|=v1Gh6;URXmwVX46X zhf(tAUS(wLe}06&0iG}VPmS;wVVHk*?!P>=w>zAe=@iSJl2Wg)ti0m9*_Ct7pF6MW zf(xq`)!_K|rHdObThh3+sk!BHTvr!Z*1mkj6`@_>Gp0)C*eZdy&#}+7&!dsIWz)2r zPjUu)%C}zS3t4%y`;eu}iQ?n!nT+I+>Tgt@mk0U=XsRG}_gcF9@!R>&b1Yp$08(D_ zD7*KQldSB)AluUQHfZIU?oTXTG+*l6pX9%c9;adGZs~piR=(~-{;|q-Pr-Hzu2jR9 z`=`I+NEtU{V0+Fd2X0W^r?`5GlYE3&3maM4()<2U&ly|g&EFD1JiYHHJJyVw z@ibK;%cdNpNcT7Y92n^S#DCUf128meurIJ*VxPa@l8Z0u0|Y4q*Y`U=N%Fr-kMW&9 zCi!P5+oO>1W&+YvOH6;N%6cg95t1};r}pX}9|l^h*#8io>25_p`hP@9fBvbq2)Zp+5fWVy57WVdWQ3NOwi|^YVX`v=t|y9NYy17G`PKaCb_fMEO&mN+?e!EMd&fQ#Ma15_&#XoPAw~>b$veqi z3p)aq48|mHk2wzkObVDEJg0wL$NLt0??*#XPVC7qSvGF5Y&2)u*GO`YJ!zXc{~Wns zTWczp6fPgz%y|+MG!hhXs;I7I3p;V}fB4*nQq7b^sY%`Jwf~&> zrRYe*G2~)OqVARw{SP00_IE+yg=cT{OD5jMEn|foS{GzfX zW;+D=+XL6%8B%metvwmWMEDgsvzmRuE5#wMmjsi#q7XhSpt=%L@1nx+^8^0Hx1TsW zfP03GqhZ{*O`p2?n-_>K*Dzeh<>3UVZ*5+xLA1kr(L-;8EOk6OI8GhlMgwE{Er#I< zAXBGiPmfrkA8eGHo13Ms^V2BzC?4gK=6qRA&sd|}kyIkWO`K6~LliF7x;+(!qfus$ zr*aEJRVLQxl|-GYVhBej7VeL*KOMMNRV>Mmg=>OGlTmwaR!5Rl&|~4wgZ&7U^Z8WP zVQ4hKxTtk(>P=fz4B^Pc8#Q+Tw^qecyyA_T|B#@(O~5^yfV};{{1A?Y@Im4jUwR@m4dqm-9>=44oNc8WpleFGR6`!9K7KA7bmZ-#Y02;Ox#MecEBU|oNQ z0Lsc*mLcb;^M&iSk|%xgK<}U!jQZkmQ!nAhznQoGXvAZd&c%~@S+hjdo5oOPsTxmO z{Wi05Tw&L(+x=Fjyg^q+x;Kb;RGv?Br1RBTQia_8lDB6%a1zf7%g%k)P@AU7jZQ zoIfDfVA%SsrJEF4$U%RG>`~s4m9Mc?A)5|qNvO^oWaSN>Yu!y)H6$uTc)m?mUS|JY zL90ixc#(P=2pbjxxuy*+L?zwA+-7n!f@a<8eKGN8jvcI6paL6k5Xs^EFk#h5u^ z;xq|ia^c@B&BBw$xMte%Qukth2}*2G-3dzU%8)vzG59x2AK)qWY?4uogxx5engmMl z+CY&%W~nS>M>Al|ee*oZn>_o$y!U_zdvHEw-V0u3n~cea6^y6{uhOnmSlT^KnP-tV zBR+XNu&2O@;6p`@8my$@L!{x0!iVV+7f2FG#)^M2%okJ&-Y2tN(!>;L;<}>`9<_JO z9!u}2mXQ@Bc#^ORu9`U!gy0qwai76T6jV4WQBqrp8kV`VDC)SK`kL00Qt4W$TFp`qA_Nefv~udkVt zK!|t?ije29owoI)44HrZxyK!Uw04X9#$6wO{P}~|_)qI{=Ym;3R@?nMqVuHQ>Mhe zO_y>fq|b7S3_IC|4-;A8R`S8AlSsF+*7nF+Po=^x!PF*BROvO7%mh_*%?O)3?G?Ym#%ZvrP;F>CPGFWAFp6qJ+f4#< zi)tgLZS?Z6YBN;FJg3@(CVT%-ZK(bWIp0LsV2Qt`Wrb!%811GwvZEB^31LpI3ZZls zQ$*E*Cx4MsM9QU*jyJjmF0=(?NfLaFIl{D!ZZHdRov3p0)GlI*D5h=H5tEtmVZ$dw z_33D~%Eg!nzeWHX+Bmv+?VMXeT$L&pV8rl^Heh<^xe!;I%Eg!nzeYv)WwV}$ zCG#N^SQzadQN~30B{syU&7@lNP`&BQ5Z9xsUxRIkefHT)xU^C8>rIu5*5@KOFxeO0 z=p)EUzi^)ynw)>Ha*2?HZ}d@Z2&Lg$-=F$Th>LEBCc_w}X2FK?oD4R2!^YP%bTTEW z-mrV<(Wc5_3|s$7wV@Zt30uvlL6#|rM&Oa=esG8he1vi-Xzd77CskbM7iZXuaGs?M zJ6m>@hZQ3Uc3qoP0=l1sVkr7_iL^Xvx|>4UnxZG)Q9EkU&bk7NXb0@#T}m5q2<=bQ z+z|?ky2KD>5oawy4@I0siIBUtqZb|A5JId$WM#xhXnTC|5kkhaBglvo5k1x7L_~N0 zzkXl02w%(5r+D$gE>4q%D_2p^NoMEa^kc{jw%(GRlNYwDIEvR>)}bpqL#+a_)?2i? zsn?P?>n$t7Y8qi$Fdxa&>1u$+5TahJvXaxATv#$Ik#PycS#h8eZt=OIk_bW6; z9ia{b)p359Ut*juM%UO1f?pvnTGu0^j`PF%05Q%F_bap&RI75S6rkByI#l$ad&u zGj2ykfvRhvm((CBB!oUwWJtU%sVI4*DoqVuoYB(}7~+h_qBumn5|gfC6BDdPRE!%3 z$p(Qa!qvh4p<}U3d>jZEJ^jL3AF?NZaEWk)i8lf*0dB5})kkj@)ek89$#gM;b z;+2;hfx9gMc~2xL?^)npOF-UN3Cc5LfSRT*k;Y3u+ESUKVmPu#h;I>avlEcllAydb zz^#v#7uKUwcrwwT{5eYAf9-te?Fhia|J01CwxPcMU!PE6IyF=BALUW7i72Odf+_NL zJ9ia*axgXgRh$ByOD90F`Q=d#KTb>K9_64*`9e&`#4ckXO`DKe?U(Ro*LKPWNpWWd zooR|YH|QMa3bv)oIGQ*@){ZUqCu7ex=(Nh+17!PxkjS=*H=_kknR53|e@eLh+Kdj! zg;SQSxH6W@oq3XfIDHHjtV-!O$-#6vI1y5}J2^glvQh+yia-6E`L1eeV9inso`PDV zQygWQO5&7jScH|2L@2y`f;BK&i*F{!mUf;yAR_0bV4C90vIiab$;Hn&3T2BY=n%oR z2QN$a1Y511;1!v2ej10|8>~Rcy}>kZa7<3GCpa6sh+BnNbX97YWo$X7(2j2!AIFvH zK;|2q8M5-77P1}K?+qL+LZ-~eSw?K9;ymJ3>w>=R+{Y?K2%0@jDMHZfpoLG?)_pcFxp4r8veZv(xs2 z#O5e%Mf+DMW$B%NPwL)j>G~M9od=REU3U|4I4N+kOL=TBXgA8jc}TQRGjj&KN)w9R zuit>Rj4k&n?J%cH`NpHX>e>7cv)A;cM;Xn2AnIdfWllzwM=48DZTu$>Y_}H-v_7w= zNrkL5W-R1lK}T~hUT{et;j#7Hc`yl)-lncH=o{IdU{Oj=Z-1XxX-TJpwU5A$PcyY$ zY{V98_jR;HaKji+IPkl zISI8wxk$!2*1(rJy$9^TorPpL5&vfCCOoGwb(c=P2a0+}vqW(hg?cEOL4i8~lyE&2 zlyIe7wDM5~8AlmX#BpyeH*I#sp5;^ap>%nbhch08Os^tNGvqt6EZx^*#AR2K@{=vy zogihUJjI>!iAOmv1vS>KJcG@AyJbDj;l6~Ys{kj$=MxOId6b$rmhKXk;mSzMFGf<# zVlg*72A{z1QPyV=2@a#EG0~#B1~8J7l^c3P%tXdyeubdn;po~Tn0JJjiHyno3j=ev zVBQmACNd`Tg$8DsncLIt%5xr+OKKhwTg&>*GLFWt?=9F7AS+APDiTQt48++9RHb&V z`=a7&2R(41wB!nAD)X{}6=}-6++fAH?Y4B}x8w~jwnjC*CJ)LTH?W^j+xwi_#;Vp? zzWk~F;T~nEXjVPJNuJ;d-r$lHWmsqL51rqRw5EZT%Hw_)0Fbupp0H(F^<+CxWSf8c+LSqM}>e? zprab^4PKUVpcB$O!3pYXe>+MaYUCX9HAyZ&kvxcbgRIz7qewP8< z7Y6R1%yR6HWm2>tRxPakqbN2W^h%kERDf?3t_PE{dM{A+g02kuwRB$rJNmfc2YQ-n`E&n?9FKZ_3IPSvd;HuFAJ`pTnVWrpU@N{O>_l(|M{jVALR8 z>+uqih}5WBy3PQn+S^9vJnT^rBeGZTa1GrsIxzAqR-cQ$*27&zRC&-kS^K~BX`4E&p1C7lyUOJZ~E3X9` z)e~Zf-kMy-E~`RwSOp1zO(davG}}H(VkvHzmDD#62JTkWTzhTE!3Lh?a>ESvGhw~3oVmeM7`~wnV{U0!sTuw&e1+)n@7P% z?Jsb7p~G;uW!y?0bZ)ij$Ehy4xR1NS{(be7WIx%^nFGIz=bn zh22I_g5w!bV*GFzl<0%fP(}q+1geAOm4nI#Ws=%K364|HP*DG8mR5lh^6t~Ar$7nZ zXP|^Ud^(|0R-O7SDB5H*OaIiVi_w<|yGL~DO;DMPqjgwXlf{y}PNnG7NS#X4sc|}$ zu2aY9loix;mX`sF&h(q4Oi*Vth0_A6Z&{$kp(lLIlJn95I8#v6{@+FC54qFE@C!rL zs?NuE5W-GhXMKc0L|~$5&bRY{IBlp}h2c)0-1#^c5WfyVW=Ihb`!~Hft~n5Rl12#2 zbKaIwA1l<;hF{ZxL7Nu?(LAcHSw8xP>s5#t=<7UJ3f{(zh^6~3$aE=182#>0=7x^} zEnQc^3FAQJGj$|*Hkf%NNHvj0f|rDi1ZS%w!LU)Fwf;s~nQNsnpkV-bv`?u=>xq-6 z+6QOoDl5ep@L3FBI^YEl$Wb@efc6%A>Yvp4O_B>=by4@agOkRmEQJsZ+uAP%+#<*=W4T3;Tb9*XfRW||2=FSHJ}GHD&J@iu2Dm#s zK}kO2SvjfHs*f+Z%Rw_VMokrt`++l11~3(%DTG%+o{O`Y7^Pqcjbh;?tr=)rxKK?- zENQM{=5GcB^$^}qWV^A*VNqpi@F}Q^K%L31&7cIwI#6Pe`fE_48q@g~!SRXidPsNW zGq`eaPDUC{L{Jl2)S7^a8zv%N<$!;5=M!8v{6pL*3&+H&7cD#ukWqLyAVl=_7z+I2 zoR_GmFGNR7rM-$udxd8^yjFW;u9zNl>gu6hxyOr&q3oi1nMEf3IzA6e#8AMA66+LqoiWhSm*e zCrOAtwCVO1Kj_AWW6o~r`U@fg-76q( z*-RmN+j2{9!DdVM9{8pdkIZ+Dv~+JJpF6Ki!vN`VCa)#(PlRYoFKAD%N11|2$weo>;P&X(gr2}t7MD=0OU8-YjyVCs%oC{Xb)6z|& zT^!q{@z(!>*D|RC7LreSgk*S?P4r_&ldyT;5U=U5*M#Z$gwV{?(!B|2yHcED&o9D= zlsbO5Qk3Q{pqbB|m?J`cfL#(_(|AOM$(NQM64CVsyUUmI4Mz*>a!^_LxggR2=E{d|P^8ovb+6d&QQU zZ_f>^9Ox@RTviq!?dpP%2 z&VfBLbT2ZgU==+r-Di=coI@1YXMsi$a#0$0?}uw?&&Z8(&nzU(DteU_q*6~VUM*TV z?D`ZEMFwDg!Su-dVwCpRI0Qv$2pV#B2e~w-7c?Q5Pk}~@Eqj$~tvPRdm3nk!N}p`% z^(f=EdU|GUhj>pDjN6Klkf*RKwM~M$6O?G&YcXyU@~#GTBI6WLVpP|Pc2c;~ zCtZT$Bc0MzL%m5&U^y#->MTH}U6~R%Ln%$i*up=A#uX=^L9vR0N==JSWoeZ9>4L1h zhZYT^AL`-Is$u=?qQ0pJlIWZAb;_wzUY$xBYnH~oGPDY#k}3%^4-7smju5g_$B=$zsMijannpJzlzweB*h{rUk#O3eK1VAZflCP0$&{X=cGzY zb1l-CJ4fvq(IRBfKA&c?K!{Wl6r~cy4rgY<)M<^@;P{=!t|$*GMI5u)E?k|K#zC%v z194ZWG@XM`7vo+rW-318 z<`n7-p^=q)I2`9wnX7dd$J}z2omA!NW?@j%?KN{IqbUr6A_+8?2z|0X!aeqk_74ILL+=?m?(*D6 z_g;96P>a zDYe%(c0Bo)Jg?~=%`e`0+pQP+TJAgj_#1}bal+GA*RQL#rf1)A&$ObX)dlNo-h5!L z{7KP05BMzRanBn+xvO9Oab=KXBE_ib8Uvuxsyz=@#)|tjlTUdQ?RLu)} zUP%q!b?NGvQe*bT3-%tK*zBlXTuP$8u;+8MgK7Zivp34I}C!hNEzQT@C zBXXMF95?js!jUr;S1vDm`PJ(4ln3uv@l<1T+US?3oO|2HNF+8koNR8H(oh>z%t-?S zlybKEx@!NFtgIW8k~&nIWzCIKme#@zQ#!_kpM9Y0FeQc84dJ<( z4SipOn_*Q$;lXzYQ8qZgmz_h+I1J?%pWmA{jaG7CD3{qLo0faXP<{zaE+s3<5tk_X za)-ausY2qB4P$Z$@@%+GE(!i7+-7M1oWEd0S7uBjzynNd`eiq_-LFHmhgkR!Y z74nPB$i7rLRZqhoR4&Fu_(h|*kY7djJmL>=(dl|JjEV5;XxN5S>ydiGk-A@%Di>oS z{2I?(+%ka59{aPSLtNLXT#SkEYXWnLFi6sA8^2l*;`)=y#h3`cXgnH<*YN3MPYrRs zt8y_W!Y@8At*a;e>$mUTAL7!^$%`}9;b&IqSXaoebH09WW{9hRnm-uEMEFG$na~$) zzrU_L?DXknDi>oS;zgtDkYD*LAAUDxVU;{3dkz^bwVdF%f>z z^d{t2^+mg(-h%oxGViHejEV4zTJBK1-nsYp^`R5IDJnZ-BK)#4msU1zxpBQY#Fedb zF($&V6Pb(hk<8qemE9?N2rp8(7!%>wNx+8U_4ML-i$Yv}m5VVEex1x*nqTRS`^rM! z60TLb7!%=FMucB?-7N18aowkKF$OqEdPcP&I`T`j$*{qgL~RSnU6>ca5pfb&eTn!I z&G^At^g-1{4gRIoEejgj>Mjq&xKNx9=>Fd?v)7Ly)A67MtWnx!N4sh5L92UDx?gv z!ExtiR_NJ?JLnB~zWSMD(l>$7Yked{0O5c}Cn1B=$d60TwadRbEjSDdnwvtmWJl*< zWCDsrj&s~OCRBVHmuvX&Ehd-`B4#8A7Lw2YDUuTe$2p-L8DvqG5=sgcnvhtn_$4G* z2aB{Yexeu|WF0QjIbpbvZv1%hh|&{=tI1+4>fseZO^!i8aYbntT57c>t~dj5aFJ>? z8(gFYj1U=CFC!#`+ea`&*ISX7dcriW2-WHEi!ShWK<+eam>KMQ&FN>)P!(j+*8%_J zuLEW+m!w~)qnz*=GW8iWKi+z(=somjjIRS8gyV^sI)aHm&+7^!2ltq zJP+(Wz^qeo@zVKwIQ$NnJJi`EjY(tqdjsqrpebIMiG@o;xjYvu7-i~Ql*ZGsaHLsS z#zgaLTGEE0`9v(-(TMMM6qBOZd7QKe7D9!i^O0;%g23lZodq z%|Cam7zW}IOCEhw{4Q{>RtOXon^?FLVSfiDc9@BU%Z2-v1aMsl_#xn~m?H#Iy2q0D z3G9zKANob+3S7K=>wxn-U|v^o@zUiM;PwHtY~GRO{RQc=4VdnW1di4YVug>^FOHp$ zb#eTY(fy6_wMMpz5lAWS*BTDs%2X_Z5%c@3?T}^8O6mra|OU z_})oS-hSY|8blt2Z|uc*gqe6>yPO2v6crmU{YaiSL3#6mTRez7itnlf<*ftm_Ce$w z2YF8c^F}l-#@9lJfJvr}9GH0VC3#k0W<}#-$h#1j`eAD(*<(`v91OgUF-&9la2HW%wtfr%R0VlNTag@J~j^Mdb&@w{;=PH2%rxxES*8 zUMNWq;-8F;iy`m%g_86>{>kXL81kSSLK=zx2waprs=ucLGcy_&LtYgywb8g3@>T+~ zE*cj@-h;qA6^)A_?=4_HipIr|m$C?}vG_kyd?|mkfhmi|#gNws%<^blRQRYL{ke)^ zkMW3Co^J>44}-{~^0EV%ccO7I!uK68Lu-VudO3&+ALVZbFuBpV81iNVb4fHVhPmc%|z2BIiye+^zKZrb9E&Ldmv|1556Mo|5#}r^@M&n|{w+fiW(YP4t zw+fhb(YPpi6yFC`j0j=;@I3|GjzQ#6dHDx0-$mnMgfAVFvkaP`!RYA{6+SE69KbA! z#>J4=0nFNHT$DU2e}4exiD+C5d2ayoK{PH(UIyeP*W(Zp{>kX^h#}7fOhq&Ze$dfKb`;31wdOV`!ar+F+%xGK;c~!vFM&qL7 zS>e}86+`}#iB~`F1ny6R$fNk~PEg)n;65Hio)z*^7o$(YKN&q;V#HSlW==FND!!C{ zt-!2|#>J4g0hs%vaWUjQt715Sc*IM;w}AUc0`klank4ZXPu@7-tSVMdm#FYj`*LoA z@=Ac48!a#D7NeDr=Qqg1Ek;o|^7oJdXEWf21DAXm9%06oX2cDJ`v?Qhcz^4;z>P8B zjPlL{uH1k##={KU1_RFMFYOiIZNM4*m4SQIfHV3_^WOmj&M1${^T;K5gqc|BcLLmx zi-il*14$w%zR{*b%Ib~IUs^tz8B1PNIYN3Kl(N9Fu~3^-$clmPdj0cT8S zEUii38F0pQJ{!2R8u17-vC?@u+-nlRQ9pBQ0yxT#2Msu5e1`z{Z~{1z_jm%hVZc3| z0FLBsO#nyX+mQf{|8`&I(D6yWw5aK`dN?b?9^a8y6ONB~Fi z{lS1UmII1!(o#Ia4EG;V^^)WbNdQOjNHyS$@ul|pC07vQ9 zX}}rNkIKR71aOqUJqhC0CxD}P{Mvvs<_D$U?-Ia~yayA&QNRCW0yy&b`2=vIfO{hW z9Odud6TpoI?(+n30}0@0|7lbc9$_X{KS=%CDGA`H9Gq*w8Os&n+zH^Qz497x#&SUQ z^85sFRG#Y$IAi#zJzbIjj>g?Ilt;Mx62MWq{I3CL^p|i?B!HuGy4ip;hL6hMvj&{eUmBM@Z@?MlQGDM@07v=p zK>|2x?>|cbHy$|t+>L%!6KniJEIcqH1tCmWc2)P}4H#6b2T{#$~ zhH^N*PS-S0dNY;>GlMPW;Bu%85K1T0=#zLGG@(K1qyzsYNKQMn&h+}nLF**Ky~P_m zFI|`64c^S5j3EK|bgzb$M=8ndT#=sSKe2O#H7U?;dDMQKy`V49 zWZ7sx!CuhYUI$_li2e&biX+qVXqvs?<-l>4jdHRb3IQj8FcrKINXM_a;Ca6c*Y=XY zaMiuNkbDZ9*ts0CkF`81L-ww~Shzy=j&_1U_KvpUK4o^*fjOvU9_6hAZvNduH9%JS z#1HQClv65&S{3$M12Az`cG+S2x2``+1o!=&3?XxRar#z1K1?~Z}U0Di+QEe$M?9X}Bt*MR7v4iaVvvY!A9o{7chih4jkq^h0r=9Ys_Q zuBM_*Dj?v3Dj;0a*@a4NNa3e)F&Lp@E+2_PS~Q@s;6A^uQpPo?wRvCe>62 zyNpHz5SwS!W(X8O9AeQfuj>(Uy%B$urM8p>@d2^Cm5G64qteXiIj@gs6u})G4qtk)4U{Hjo|3G*c;_ z`K)E-^{`o%?&(=kbzlJ%#-7JFAT~bb#RC<1?K}rBq_yQjz_b!%=^@=C-r(J=?uAQ| z7v*DNNL`br*aO;IjwXKQWT5Wi?V(Y=rpPh|Ae>cJhRKS|sfD;)ZpLE;#i|<7ee^UI zY}r_aI4w6>Hnt>N9#xf$P+65#K`s<(8%nYZ%BAvL%JVJ+Im@LyLtP*BcY_2WGW6kr zi|<0ZUv5MsS@(;o7lzUa#rjrQZ|4+1Qc@jY?+du>>Q+3;Y!tDi`uyZ}H#Km1j^y@Po}SjK z{z<+d6nr|W-W0r5V(lYr-Blp zr?}F83QJv%IGd%_c<*KkjR*!*cIeT1G^O61pVE3odn?u31KZ>SL}vIl1-B_6*P_d!B4+wL+EG#tO4Nufp6q z?lGFXkh(9)QoOm3wQcp~^!C}%pWwP=QdtPyY-q~VdKgr*5Z520s#H)7mPz3n)I_;5 zpx{f>@1>S^T^$}Ya=G#{^8905YtU2Rx?$6HSDw{taqqQk95(A@OIJ0*J8PjM1J zP1CtxC7GGtp0z@0Xipbc0xul1$i*67r#iodDy@4E3yoK2Bc$L7Yg#(LH3g1>;$o_7 zF6G(adKTTk%nQ|U)^BSQqN7NF1nE(%WE` z`~WbnV4jNxu!}KJL}!J7FXhgfI>6us=n<*o?)8^qWP)LHX?p+Fh>oS3lw-T{OU=uM zQ?yoR<5f$#t80#!Z2c}zu!j?gq)mnTFYZ`X|Fl;c=#rPzJu@0VV#pv;%h&yZA3f|3 z2QL1R)Q@>dVIs;dj~!^-iP4kZL_u95ZneHh?aXN>$cKNkgxdoTwG-{Lsb^>T|F_Z%36A^1M0}B3k9StY7)!A>q8Y73j4wBPON>s$lL5YfZ6(~^=ZvrJMA`PrXMLY@>O!#psDB;I6P@*E{gA#rOL22_? zakqVD&L?uuRT)*#1&`@0Dp3_GA88it`UgT5>Uf_RjaR#Ri-IUDUZs}{Aw`e|cyiB; z8<_0Fi1-2;5s$$@Zs|R{pl?*^bLCx-?0*D{Et${}Pe0pjR-^%DFgAdK6~__bT2pm` z_?0JlgTp*M%c~&C(mfMJjFv^JP;S%}6BOSH6LmWuGKV#=j#?mV2_evD<_&M!Td(|3GnxnL9=B<;7~VegTDv|YZ}`hn2HsNOAuZ2OunNzv|_ znF@BQdu9oxZnItK-Ml}g^IKc{soow=7L=+kDkxZKSbrV;dQ2}4ypJS=wq5ExwG~hM zb-hq}HUNi|_9{-I~?Ab*CvbAOV5JVn`` zGFS|V3FCKvHZ%PsR!uaCKuP#(+rP_m68bF* z9ojDcyM$^Xr!*dpG`4Xz{R^3;3DkZm)L(O`ZS5Wkb*TFM8|ni||B9s#Z(sQDP7^H( z(ZA&Bm+a|@?dSd5qony}e~h%Dsbki9EVHT(vcqI~qM!VAN;EUZf;dGSviXE>p`uUBJ{epyo5R z3e*Cot_QVn`s`a#i@ z(JXxl>T0IG2i3up2|e;Erbd9GF{_y`^jpVN7VK_dDi0J*GO?ow%EwdmhJ`h2c{kb^?Rmh@O3v+v~KrjgwZ6u3+h3(`#Y%r zWs0W98=3kV6ir^t(vP5?Vv5%7{=(EKJhw1)G@j2eMbrKrOijjf7gJ~9`8-p!9{D0u zWq49ro1_atkz#W*=g;d*(PaEBrdsiQmnll)y-cmd^KVT349|Zsbr+u7S>6Mn4zS&$ zcz(ESS@ zvgpZF9-c`|+3-AysSELZiNm)D6qP8G)C7uDUSjNt=R~Hi!Sgt#Xhb`Ssq67PiK(CC zIhm>3@jQd6NAaX`X_ERtk-|)~vmygIfJRc;W?A3emu`%>PtL3IlkY6 zqHvof6UI$Wrbd7&V(KVR9;VI$^&$H^9TZK;O_Cjymt8%e%9%P3)NH0M0Chf7)u3pi zYnB>7UBuMope|u*1*mGKR)e~fsdb=8uew>f9n@t^{SMSprv3z~g{h68+L+n|iqh3A zZ39L5WR`Y=x|Kt^2h=Z_qAS$yX6g-4e`4w#P_%|;lJd-ayFt-{pGmqG)cZ``59)uI zdJxqAGW9U1hnac|6ivfT(o>)|GSv&}QKq(ndW@+ZpdM#xH>f9=+5_rIrd|Q{6jN`2 zdYY+sK=m@U7u05^J^;0asr{h(nEDvhR;CVudWNa5K@Ntrs!s+=b56Lm0n?L9H>{BqMMaoV~TE8dYvgND4Ir^B)VDYO{VB(C6VWJ zv(mS0=Lhu;Q_DfU%hXk%{>oGbsP~xa0=1W^HK6t}wHB1fj~hY#jqTQh`hclhLH(Vn z+d$Fe*CcHK^$}BdgQ9*9xeDrIrtSyz2~!V(`jn}ML4C&5W1tQ*WmE6`#GN)lUhKl| z^+~jtn5C_*T%ccUunVglflvARPRyCrUGL!Pg{aIlV_wjA3PhIS-z<^4dNk!a5{vB_ zUX#TVC9(e0vaay0QKoIcA}`YqpM{=Qgx*mzCdfK zihdj#2L(D+iCe+CAtsU=1CM3CKa4^*5 zAPZW}3$65O`z+<@bSYpGugl8HaeLIPAcprb(C`Ma8kRBuf3Sg?hO00+!-F!8XDqgA zue9a=9>8=Y0!4!$2kyZ;?ln9_*9}>^E~ZtoupKRk@Akls){qx+biC?L&|>hpu(@GX zV?-p@O|7&azX8E;D}TSyp>*8=Qj$%Z2lj621@-i1JnWlLvZekNo2bQjdK=peBb!S% z?I0U!D(st(3R3_1o2X@YnwkRpCInaNce<6YH&JKtH1!kxxtpkQc$!)R`z8cQ>OW}{ zWy#aj0@$fTlls#(QH6h+YPfw9m28iCc*xOn9CZ%#?&@(4Q(op6f-HtjPo<4t!!FfR z3#*qiLC*mHEL>r!ZCf27?W2#Phz!6rHEIgt3ZN9rO1d(JcIG#Pg_BmLv0X39BW)&8 z5v4`z#kAX0CFktskfMIK@Y$V+THn9zMxc*qM!@xEq^?;y9+VX+Z{~T$d3ZDP1tZrm zMekQI)r@C3Q>*d3nknibyO_EcPtn9Y2jvSP*lAU0#Im1K^+8@#MD=yNP)gdy6!Obr~aXj zS%AV$eaYyY-j03Ob{tN^-CUi$qjA6sTk2R~w@t)JpJkJRqJOLY<#5Go(>+OJzV>{UKjD-iF{cxlIJr~ec> zF_(W@AT@u5xqV3fij+3oKI@^QT7d)oSmnPQ`$&fZxQ6y?WwdgMxH^z}I<=BeheRj9 zaAO~xps^~iilR>kY4EDP9P|`C6S%q_duBG) zr4xtfv24_nRlsHij-zNBVrX-r(R{S)$XlGm5fc;r#=d5|r<2kCQtKw5uwOxw9RuYl!~@cq$U=5>O&}8bFCG zpv(}-vksKVg6%qv`Yn-+Z|XQ2%;9GD>prHY4o8-iH!yoq?@^cO9a z$k%Np;kW@*wXkgL)$ObZ$y)rIr5?vvmohTNuDod9e8AlKzQx|TudwsGtEilIFwQoQizzlcal1K=v|_)LRtI>0o`!l^xEZeV@%w>KqD?;8 z(nVQCF3agO`SP&sP;D%sZHL|qAYB~o?OC&d$=7*1)bi*=?1sLq-@|upl_xmH+f!17 zvsS*~G@K&m?NEm}TSw=0u^sv>R^GRW?a)2AlFX0xxj3^vKb>|%Uw7qICHpt>Rwqv3 z((m@L?a*LV)NW`6c0-4HdRnj>I$-Ihd-VEo*6v)o_=1D2X9tE9EHSrE)lNvf-hWoXb8RNvPHr!FWf{&R)R-}@4`obS z+JU7g`CerSjwayhQlGLcGt>`6oIIxu$go~OI}H`t3kX}UaxlCX2wAGV0B*+h=lKc( zX@P8eK|l(eX;*v{6MssNJ;_zDH*hQhZNas(_TW;S9uoW><=q3Dk)Ywt9{LJ&WSAj| zE)E@r+I4Uo!pEXGT2aMkqZkb)%2+R2<_<(e?kPqsLuprD zLx^N*1+_CPR1WXLi779p4LC7XOC2!ZE{h6B%@)pI&=^--GP_^_&JUsquCjxoaTT?; zW@$h2btO|KlwHxqoeoNLakO?Sx;Pss(Z!t)s)jihf)ZWaEudDi-F=`$Yfh`QF8rIN z?RbjToDMRHG2MrtgcNE}7BjCG-#sWV=IlIxH`^h zf3w55Zqm5~MO+gFSBzWdE)3(W(>Vo2oHWjWf1`#-qjFD0xHF`oErO*({P2@HPZ38! z5$9yVnPQSs?ld1vR=FmGaowzQ35vMRV6GD<4wWY22Ex=2aHC7^Xy(y4)9@zn<8&%r z=OomzkfE7aeoPa7(CvM%43koE+u;!0bQsPV&kw;#@^3?7(o8HrW(Yq3372cednm4g z8VNfgmt;ONh}?5@x#YW+Ch_Eo)FhdtnOQTj!s}$Y6RpFgFFdWhRXpCXHG-{NS*N+YZHYn&8C-kIpS9;w~29twq^NDiH##2t{w50#GpV3c&!D@RKybBZW(8b>_Yf`d>r3(-t0*_R60fP{x6GW|lK7jjAFZw8S|ow&GnGdwNg$rWiqGXFe? zT-qQE-RG(0Up%=Y|48QcLFBGbkz2<|DYa>md5(qoGznCr1>bQxWd$W95b6}j(u_b-dI*aA zx=Z+_LWqM*Bu1bqSA<-WIdu@Z_p#ih;U;PLoz&)%RIwQ*D2(Mnh?onCLi2zK4VMnl zLw>Eo$yMMe9D<_KAvg#{Tl1QUCHoN}+m<5Pkg9n|)u~%?7ameHoSRxp!A)r^C`wzw zO@4egh(AvXf4~zimr_(ni;RhoOENvlfT$)`_&2L^Q?a`U83@0G@Jm!8)X{{NR*@kW zvaFCS(u(}KZ4keW|B$AFfBFS-+A-1?NEo$6Ya1||)mZUMV|c+WDB}LRh~IH3(s5s5 zgok^y$G$QW{itZ$HEzle!9%4%P*jcuH=$;P#W$8e{SoP?$)$7*g+)+Q9)w(yNyjlX z6HD&rBK9#_)1%>{nbjaf%mqa;|3+}exS^UxPMTQ*LU0O-IDZtJX4toAqb{*Ys&NH% zEfcEmbNQl`0tpBGc1rNtLpvOv{;))moD+oo?mywoY!dw$|0uH7u*EMT#s#F{tGt z(a==i+=`n98=9M@q)Mmb&pM}d1?33}L__lt1nVvNA(5E0Bpb&UvvDvg-xo1r>HEx;lBxy5#=(pl+|JTA9X z)Y#n8vO@Ayc%<2Ok4wV0m{O&9R7z!YeeUHgQl-DSwffRJ$&DJ(+EnM4<}@#Q|T&$CaBiN+MZYc;M%5M7Qm1@Q zkH%CMK+dQRPLy_s{x;k0bhlTpP~9r)mNv|3t!`=)%|=LCC^29c7A~EywE=g4R#dlE zH#XKaipaGzxB4sV*umFa3)|ufk3*_lTHWfWFi6hkrAwhariKeQB|0jjU7CZWY?Wru zaZ2oyzoId4sZ{AAKP6AO&v(95xuVTqx3mJ1TacshwzO`=BC5m4kxS8fUQyRt0d0jo zw3KyHWlePxvRx`h{iXmRTU!Et$<ik?)NNmgLDUN9_D{jg1YLA|6s@HPe0+{id4M6)n_;NR_DM)s1TS zsSboldrb`lwN|6PKo0I8MJSro1S+S>gZ`_d0FQH@+wCosB&!Xy9sf>j)#AU^**NFJ zx}U#t)0Bzlo^;oetG|52@t3Llf9c41N&B6+XzJ-x&;IiHC2J=>f85;{ypeX(zH7et z)cR!!pF>dYbb$_0D=_5xU zf5M;VUcY(qC66C^r+3Twz5D*W^PuOU#`Uk8w;b)Qd-R_2`t5JMaKncwwbwV!Tlf69 z>xOJT-u>MlS1y}&)7wou#-)9K-l4P$kNx7q<9)Ygy}Wb7&1KzBd}lrRfuYiv9hX0p zRrE#9Df}h?cLEhV9S5@X45?n{o>{y_PTD|)a!cc zsqe?n`l7G&?XM*3ypmnP0)(L1O?H#r zWH$*N6$vE?AT6X&6c9+F#ABq01$*yeLF{Nk=%_#_QY?TdB_aqaC?)^>%*;7wXR~Y8 z_y6AO`>*RC*pu03?)!PB&zzZac6PtB|0Bn!mZd_KiBaC$2KG;?~>V96ap7JGU!SPxNkTyjpan z(`$~9GuJ&+eE(ZDeYQRkySvqGv%7pVc;&|B4_bn%W0Q717gKR;*oOG1r9~f4&EL6u z-FtoaHjJG3T#fUOe+Gtr{`0=bQ8&-&=J@o@2eRf5D*tC;{`{ZTJlkyM=0nG3PCqwj z{@z{VdL3@rKYQ)SgjX+oxpd+9IV;1LfB2>)|Ia^{RE`g|*M$A~#P)f2Eim8zLEBYN zKi_%m?OAQEq$Xta{-)~OgWsI|**UXl%z>6e2VZG5@YZjh@7%WQTRopNR($``qko&- z`|ngrKfl-7B-gp2!}*(k`2I{)$#1JJjO_AV*q%1_jc2|b4(Mc)O(a40GY* z!<_v`CRAMB|JEBXZ20vVN6@X-=U47~;OopDjb{%T@IjH`;DbxAOgbKN;B5OW=QXx& z>$-jVN7QZiw*7PWuE!1*{`Qff>3!}cFNc2ldg1H0-FdXhiFGRuKeukqhUVi8x3&G} zmX8g+RFA^MFTNzSqLh;nM!ek(Lej-H&HCK3|tvcxL1B*jMIsozZJ1`VQt6cK*@6WNS_A zvR|(B|FX9Dy|e4fKfW%z=Vx*5hnt=b9^d-F-KT#DdFzM6?^c(8^LJuNlm6w+rYu z$4)1VAKQA=i0PdN&L4Ss?Aj~y`**q;oq6N8$q%$WKYjOZ_x%l*cG~;P%5{_D=AUc3 z@Rk#8LhfAF)HwG2J|zP#O#1Q09@n>iWYMH?z1=tWIJN4ot*LwZZSI_8H&%bu&)B!k zvYijU@%-AgDZ|&?xO?WcO%MMv@y9Mv`BzV$I`z+;AMUte+PLx7hetiL6gQ{yo{}@Y=G{GVa)cmTb)mDsvWrOL;D2B^Pi_pvA(fn2H>LmFcu>Qd$GW|`>-!f?uXP>!b@2SfuZF()!jUJBUvuk< z@;@ejxM9dcSuYg*71I0g!3mDz{omdD;=Q*l8P(#!6_aN?{nh(}ubpNuESkRS-HyMO zo?E?U(3X%7wx0X$hv9$h{^ORrrZxU!{&m&MI-h@T&DP;rt_PkferCySyPn*$c5356 zUw+W~6~}km2M(B5^4GZqk1kEKygRGK=bM_HdhfPB{&{p|!{TdxJa%=VeeLm=zFxB7 zhXYHZUvIeRi|ZTx`EJsbYYRIbJh=C!6Km&eY~Jc}@w}T?cP;qqa$MURoFzxr9{O-h z@QwBz%ifs~`hHE{s;`D0%b0kVt8Jsqw)f{XyyxK^8;*VY;K$DIUtW^e`*>K#uD2YU znEd@)$wR)3pLOw`p^ta(UAg^}Up~9~-IWLa8gbiwO3N1(w_a^(Hzv2!mxZsdO51km znCa(r`##)l2z{q?!R?zmJacQ+b@!av`@=nJPe*KCaw)6L!`C}5{`K)aAHE%T@yA!Y zx4Cai#EOK;=l<@t*4q4+52tL&{9{oQ_pC)v-1o)$Atgb3cwyiqb>*t_#=tr|W%aaPo@qo3LL{V;sgy5NX0O*>mxY;~WTH@d^h z!RxPe_4#oAr}M5%?_~^ao4uz0rs&|_(WZA}y1ZokX?>zOGxz1UyG_mR-_O>{ke7No z|BV-RR6g@is3T-b3$@)^@RNOcy(edvDW;%WJbq&|SaNg5750vbS{4+vP)KIYnA&?< zHp1|@7sGg-E=;%Q#vt0#lwI%aobg2yBZrcdZvKry@5%st>s^>Lr!aEbbP6Et#vr=G zCXKr@ufx2Ac%B$qXQ&U;kYQ*yli1@|-JM%kPa}rGgoj}+KBL@K7Zc1dw7*Gu7CrG6 z7LB~)!`1_W2uX2%B`WBNx)|DZH3rc>Be@mRA9;zRJ=291J76~9N_yhcFO92>SAck#TaxFS8{#Z+VLb1Y4o&(RexY^hM02dE8EzebuqNcY7BDXN-3Tc zGY`v&-g;=w*%(CYI_=e83`)Wx)B7)l+vyq~Lm)D7CPGzL-0QY;qjjKWj@WYx1QXcf*FL_5=jX*%YU zkLqG5SByb){_j`tt!cmXNZoX`WfF zXbhtLo!;`JrN9Z8doZds!y(8Q5QooF$OKfm16PLIyza?J3gHm<`G;;&*^(YX4J)WVHnyy zrkeftmJVnr-g+V#1_3N&#DjZ(;Xd4HO_-DqF>?{DocVr!jn5yl3YiUT}QI8j^z0|l669Its#PqG)*Nz+3wF_P=7N$A0Cavd}Yy}U>6 zdQC#F%aM!JBw2>{FHM67D|PqoTol&TArsQ(v_}u(QGcz$N)({6+yEaCebit zK*qFEC4FNBt&=M06N7P+To-(}9lAqm$*QM}bt(kBM#nB=J^nqqi|CnlPbIzf`qzW)?SLUAsTByspgvjfd~ z45gx2l2FnWNkVacSdv8J+mn)nQt_szq)!YY{h((mNWflT)U8u0c6zcX3)yRjI)+kl zSi(>$PIyXUDHUfW38mtqB%wGPf;`e5OK}dDBxK9(Dd|V7C6a_s-DM>Qh)6<{g(*V7#E}>L}N)pQF7LtVW znVuceS(J*-l7!++k9z8uI7kM1O8UgWJiWq77?#ojl!}p_m;sau`oRND&j3orL`g!a zm?23h6|*G?rQ%*mLaA8lDd`gf)%04d9v@2ATb`H!l&%jX38jmENI;8W9HnA|B%xG% zB}ph1H1g>zO2v1Qgi=AT`)im!QBZvgh9D0KRNEy9HNq%#P=sN*%KD#hNfHI~QzTXt z%ooTKn7>DsAQS27eh=%&L`9Y$%jjt_4@?}MqLC!gkkE_1gyAvlgE&`6m_A6?7FmKg z@02Bo^L|-^I3JcJh%>#MrN^fa;(S(?AkH+?_rOpwi=LME#(fay5J}P(ac(0?qM_$= zDP7UfL$4d_Dea4N-72yAB3;R{1nEkbB}mr@S%P$pktIl1t}H=(rppq!j}v^mLV|mI9&BiGV?5s6N0-Cgcc>}k7{<`s8zH5#W0es z?u_M`E*2o}RgwrHND z+xqMe-@+yf1>`Y{oyZy#W0esM9J18^9PUAS=Tf{ARNO;wvr$<22r}G9>{0I6D)?2Y}pt~P1pEwO-giDfnYI=WXmqu`rwNbf9k9k1dCxLTgj5G%BOz2q_cJj z7Q;xkQW%T+UP{+P%II5k7JDHCQihRiIT%Y#S7!M)!8+?^62mc!WXlPu-oEBO*625# zHAb))MzWR4SgNfLdcXdS&MFryhLLQgNw&KF((q25^|@d%jAY9t+1mQ&=N6q+BUlV0 z*>W?MS`WXy_d<=%YTFcna10~aN{3W$UzZa7)G)+n6cD4-~I3pALy*F1&d)MTSFvUODfj1(^-ED7Q;xk zhBB5~4`19HR<5(UHbWpB!$`J*qS_CBb4C$<|1XMFt+aH?*XwW^0>ZF^ptul*Xb~*&}D@XFBV= zU@?qj>o&%Uq$@rhUzyTXXSFj!1jjIvt=l2h)77AB_B5Sk7c7R6Y~8_FYI$v5YHFaf zW(XF;NVY~xwjMqB;=4L)m0&T9WD8q9B8Ko79=fI38!favtP(7Sk!+38Sd<&R+bSRF ztTTeeFp{k-#!~D2fNcS*KZezDkt)wl%$ z;TT4;H3d?AtXzNgyJotreuBj?lC7zXrIwdFEpM{U$`&k!k!($4tO#7m#caKNvANd1 zRtOfuNVcW}tC!b@J%+k<)~ABSFp{kqj751!E~@jgFU^{*BZ9>+lC3;obzA-8KK(&w zT@@^bk!;OmtO&Z|^Vh+H9;~)4A%bHV$yPq3x~(^VUDiprH9)W!MzU4FSkxrQ)}h^} zC+e&bg2gbBtwPDxz4s&Z2W4e<>3m!Vi?KREXmfTn4W;Dqu$4Y z#W0es*^;eS7iFAoqOragEQXP6&5>-iSaoT=&T1eEpJ60hb2Sz`hRykJ$AxLOZV)Vn zk!;oJjS9nNbc_12kbhl#Wh??7@0L65@S$f9&C6db1;TM)s{uD2qUu= zFjgbMvK(K2TxaD97GY%8y^M9MU>$kl*?~H%RImsmvlcSeV8L4X;=YbLYn@;bMrJKy zER$f(HFemlv;Gt;!pJPjb7PRGUWSzi2HdW*nz!c42qUwK8OyRB`KJgu$HAAonBeO~wOALXAK`UA=(^*Rei!d_lKE}EpS8^-fZFfRvtraZ7 zfHfWu=nHp0{u+bSJXEFp?{UFm7^xmEVXSxoPk(jocHNfwS}rDx9K$lk3Kgu)`DLic zYCU{Tum~fw9$>8Ag7w~$GtsT8tSa5l@5r89%%qoY(7!*x`aGft~@u(Xk1dA{->mf*tLH&pVH*V8sQb{B>w zHHJe3i!d^41!Jkb|Fj#1exkD`2^L{w*29vmnldbbXtwSZEW*gFm5ddPE4lKV&ll^g zM+A#7GV2jY^mL_t-R@1DwOX(UBeNc5EHz#0p6!ZCr{=~6!6J;zdQ7sFxB1@Zb=D!l zB8<#>T(UJK|EnK#*6)Hv7@4(7venZ$D^6#Hv_&8sVPw`5kQmvMpA>%M^2a{XS=S2| zVPw{mj1@u@xc1+DI74Uk7c9catfwH+N1`)Thk|t0V8J4c%zB!!LUASc#xLJ_q-&~R z5k_V`1Bo$6Ew9~cPNPWG@>(KTgppa#GM3sO&Ren#owv$*Rm9f-*e#@=_@9V5=!6J;zdX2Hv+Ph+AsYgAWD_De)S+6seIxag# zd_P{d^{`+OMrOSsu^v2b+NrZX5-h^VEObf8L$%Hy-IQ6XvknOsVPw`@j1`6}xxQ~r z$55c=;RV4WjLdo)5@V2BH|FiEs?k~3pdThj7@4&i61^9Fw7D`|XGIGZVPw`jjHTAz zD|@zG(OFKxB8<#>m$B4-{=!#bwK{8@U=c=Uy(h8eJomspoprZh5k_XA0(s=d;{$GU z>#TLy?ne`zgdX4(~+1*QYR*MdtMHrcd!2qnLJlODD-=L77@74MV_kXFepYnWgWMrKt)VhmE- za@!9+cv5H05iG*Uto4kgj+N2j2cObe%LI!sGOLQQ)b@4L-Wvf?bN*GqB8<%1z*uVC z`1bD0f9tF&!6J;z+Q?YyNYvxy7Bh6#F~K5?%-STe*1a>rqsRV7um~fwHZzu*ho6tn zUZvX#?}$J+!pN*Gkm!AH@tr^K(plXEi!d^4D`Tns{Q1>GZqr$}2o_;v);7jcYwxVC z`9D4!6J;z`Wg~_R=NGI z_Wg9$dxAw6ne`20sXg1$Z8_*r)f)AcU=c=U?O-f5T~iLvLD!!6J;z+AFc%OzriZ&MFfu!pJNP-mss!WBb7NwcL#W_td3`KcgppbM8B4WwCiDDtI%}t35k_VmV629?lAHAA za10=-ty2+9$c|2tSqBlIkFdiJTn~!M3hKmJgppZ?7)$LBS6%biH9D)aU=c=UA)`HN z)ST9a^*ZYo!6J;z`kt}W9^iNj`;9tllwc7?X8pieYA<>uJ;I|#%@i!c$gCeF*44z^ zOx@P~f<+jab(pc#wmkB{%|~_C(}G19nRSG*)Vi_iFPB?qtrIN5$SkNv9;!JXZft$G z&e|hbgppZ4F_xBxn;)2}vwjyW!pN*+66@a1`=8QTjXNU{jxaLoXGruIo{ie=(pjAa zi!d_l7sgU+uk)4GZ|JOB1&c5;>o{YnW6J5)5tyzvfQ;O5!6J;zIsu6>$Vec#J6p8# zXq5$mMHrcN5)wUKuS89US=H7O!6J;zIwi3h&Dn^~SY^E=ScH*THH@W}SKrXJcj~MP z!6J;z`c-26e%s?7ebhn0B8<#B%~*|bC0F|Tri;3*KLm>~GV3=;^uD*asKtjm%iM)D z@k5Vf))`3o4itr7b86y)I;*Q-5k_X6Wh}MMH~S@clg>&KEW*gF-x*7-872^L{w)}M@}_8UJ(AIj2MX9bHeJk}u?>s2S~`3qvb1ZT`#@_@?0j*wsxMrK`* zSZ{V1SE;ii1&c5;3suU)*7m{yP^{)^j9?K)X8kR(`sR%KNoUyvi!d_lABojyrspc( zFu@{>%(^78ZVKOvYN*CATd)Wtvo1@l*YbbDK%}w?1&c5;>x#r0)8so;D3w(rScKuS zl|ljmBw4vr3-M!4+4PMZG*6f`rJ!F7`*syqW6)W(<6ttnyaF9rS(B&bWzpMf1$ooO zH~N}glqbIB=I7)H?=<{))r<+^3w{P^vhYsKDa@HZ3t!mp^MQ_E^~&New`R>?KdV&W z70BLU^$4R#WMz$;kYAWJdB*sx+@k5KnJl3Wzoam2#`LUN>PxelFKeoZg*Q^XD4R8l zdw?sNmYc#v*$t(&Weq1i6ZZcJ!g=k^OS^B9$N-V&W{YQX-#}yWin^3nDRfXI%sqvR{ zGV)(+W=%kCEAUq>vY;o6GA+w*u4Pg7)9-Q4MG`01tp}t*hu{}HsjPivss}1(jt@n= zVY8%*yrfQu{kkXRD*Y16RP<9>e(EE&^Q@xjl$e}sf3=DI=!)9iu-B&h#Z1NWMG;IpeZb|BO8R-X4!&7RxgcL-Bj2$p0Mt@?(w)p*$Ivoz1(`$%Vdx^YIIa zvvM?qClf!7H!&w`I)3{_4aV=K3IJ(_r3px)W*d1_kdrlIx@z7p#zP0?CbE{-RZry< zZQgEmG;4qqFbTg=$XkR;VVP04x{9n~F`>`X$XALuAqP*Nc`^3eg84AQS3f5|DZg>|eDAV{t=Hej8BAf<$}`I6t+os{-^plW5}$*%{@b0A8js~)hN zvGsuEysZZ;XKy`Vu363Ddca(B|G*N+H3tahng{$B%>jbB=D7c&IY2Pi+$X^D=GhS_ zII<4=(`cjHO&=qdTsQ4LSX%HV5&;-CRbLZ5_$e_JcGSmG>kh5%^NDxzQ| zWF=X$qMS(_|#UO+hs539)qGNJ1<>aYRRDSP~r>R!3sG(?=XVP9XsUYf3oSASc_B5SNhPt1pnM zj?HC3rO31;Cni!+rTyRfXi1Grv}U?9lIQ_NRta@llLaaD7h1GeD-q)S!bXn6;jaWMMN?=d3q^8+XU+p%bmmjN=5L-Bd zbkS<1Xg++sCxKbi6x(c;q|~J3y&({0aiq#_rGc|;_`k(lU6bEaD8C>R}_;c%y?q`DD5>rhSFFFo06 zcO|B!Som=`1ey{kqzH4oGw+r6)OE85Z?O8I2T|l$@68NKCR>v_odJ zu$VNr&FXU55-oJ>j3$mww>c6K*-WIttw{mS$VAiaH9qEPfWpCEUD-q#hEu+ zNVMJUO3p}1%e3GW98KESmE=sxbR;EPqV>}0pXy3>CMQCPjh~dG!O;gg5>r!ATaqkZ zr{{QL+%~&4*_M>zfng`;XqdQEYJ!O=E{k@?juz&&xa{`S&?p&taKg<@p0J2TT9 zX{qU!x`zX4u((uvT8h=_u+m77$o6`)uyjjWVp^ipm7b13{RAN`+>MOO%t&>nV?fsr z71Dw;ENMxu)a3M3i*(G8M|g_eZpA@BHe{{G$wL|-G1Zcil9rL_!bHK}X+%2MY00#^ zt;wk29@U$j8>F6`q+$CxlTuUDGtmcmrMO>8dS;5-hJltJ#G^3=q$H=iGn^R6GsU?^ zS`aF*Ju{sqQKJ6nXB}yn*z{y)YDStJ)t62`(&RB|$r#t2>4_FP4@ncprDr53*^|<2 z7VU&2Eev_>aN+nMwEHB_Lz6T>G*Gu){e=sq$n;_N9c zB-ZK3NO7cNzQ#_Y(&YV}wxkS))sbou=Tm7RG0r5XGtGt}i%zW4#MF{glT)loPSl=+ zIPL5z4G@Q(*qMYnT{mbzx+^m!Gd(HQq8@amvHIDQF@H%)NwM&wue5+@r#01;f&t!w z!>~N08R_XMnDbb0JeDR+wgQGjy!j90=#BnJpDYjI5YAR+4 zZf8OqovNh;_RC02&2S)I{Fp6Wo|$2HVcL;l;RkPN0dY9aFD1=^9OXR#j^fh7V$f7v zX&Gr4MsYZoCU!vw1~(@u)6VPCLi@T?(~@m4W*L&K3F8tSiLNw9Ql>>a(@PI?yIt0d zOw66MQ@*sYeyHs!Xf-wq&i%p+d7K`SXt%l?sp!Xf$apPeKt`g?YEMeHTh!CRw4mq| zC+2Rb4i=mjrb*ovr#(I0=1fLi*G>@ALgUgAZ}eGc=jxeaS{QC89L`j`(~)M;j~UZK z(cm$^$VhkFk-1(+kLjQkOGau+a2iI?`&frMVL^_e9CdN0e!p*u=z)l$3N= zs)Zd|X2Bk+a~ci+OdQ8Hud#1E)e=2^KomKI@$Wh8tNuMVW&#{-aI^53sJ;?D20trH zP79B&^PLg&@c!y|eLt7)A;&a6d7ZIL0)*IIixb8O)LwCM#qY*q9xVHtClHm*YI^>nW+;t<@=MOgn!3%&n zT@P*^a6yRVe2OUf@$qH%4#@8Z=BU6K{otlRZospQQ}7|@50{OAGGITggpt&4RH*{&L8&`zX=FV2j)G2^OrC0 z0{5A~aE-p}%Nhhu8K@%oUte~qx?dk}Fxc=R=Pw;Q5H<>!8wW9%UmPCwH^c+8O5psZ zgW~rhFe7gHcYRd|zDr;@(sz2-BCyx3DuVy@m0oH-M+3lZ0WLJ5etl7ZR0n_~yA3S3 zcsO72qw>AU;sJu!7w!$n4+emvc3EOYJI9BdzxEr2f@+e8vPxlafcehG zagF@odI8tQ&N1rMmp(ef$)2nt_+MYR#lRJ&;P;js9OJK^W+FJ$X)xT54>{0$reg`@ z*}(i-4{j_n>@Q$OxJjG;_CfvHUBDa@IDd8r1NR#+3F)NGfBc??0w*xPWN@6na-*|l zOh|MpDTecBm-Gz-=6CA2;F{p$E1yY0)=+$gF&O(*BVV}52!02cHp4m2U;KtbUq4{V zMsQp({`k`O4RAYvd3qGb;n9Dexc4CMejDmOKIAYw`NXw`yus~+(48;46rVN$;HV4g z7yxb{GGa7vkJ5w(j^3*AWj6v5-vZ2uaSUca@_phc_#7@n$NxKSI)d*M7>@L3|P8fAOPgGEQI^5EqtSk6%tFc?dphy>OQBD2wNBr4x?&opr!%6<8y_ zGn@~7#{<-N2DnQB=({ePVxT*J@#_R!FM<8H_@xD?ZzynC_2_GbXw3&^xi^k&3+i#E z{CfwO&%AM7`A7N=0CU@Lxf3d(>>(NK?%K~P$z)}C_ zuRbpVraS0jq}mojsSDo8|S0_HkpJm2_JG=zWC603ouS^oR>bzzlp%i_Qv_p z_Xsf0d*giQ`x2NP-Z&rnP6P9|H_l5RwU28t>4>I@2i(7(NK$aXdhM7l1R~#Z#f>i&uI{Unha#NdM{W1KceE=({68 zeN%v&U5`F$Z;u41?`_~dsYf5B_uByV9S81wJ^HA=G-rz|YVP^ZzYf547g&GgLH%h8 zFn4(4e6)|bz?6F9yvmpKy$H-l-Z&rn_5yRn8|S5u@~>84)D-(`ALgkzKNlZz{?beO z;sk~Paq*|m3Ec2{^o4<65TL$$fm7u z8x}Y%Uwovu4=`45oDY3jz)bPRdFcy*tuldOhH>$if6IY;Iskp21*oqIxE%rLI~}0D zKY^D7rTUiu%usKf4}CL%neUDBieEVNJqgU4-Z&rnwgR))8|Opcd0>n) zDHR^+@S(30FulBSUizp$rwI&Gh>O4aJQTRBdh}8L%@0uDa^Rk>M<12%XTa?C#`#F^ z@4#H~#(AYT9QxYjc#I;xGU12kzl|^ig`>17@o? z&PV)?19RRR=M_InZ}S4wdwj_KTY3|KN%O{e>7(>c78s@w7k}xU4_sM2`Y64x0`sLe z&PRH`2j-+V&MSVD-rz#a@$n(|Z|RK%#_Emp(nt3TSpvfp;^Hs8_W*Z)J^CnqF9)b^ zEpV0f=xYUiKLT^!8|Necnit{xY<$RR`QnvcieEf1Y2G*=`X&QYV z*1=`gDPPvV1c<8*5NDnX;~vfu?%Qt10C6|_!g>6n6PX%|f=lqi8A7qg6%lc>4Nsj8 zcMWqn69;xKDw>?#d+OxzodXiPhmJ@ZGRzB$_bAe>Zu`*Av^Qw@9iQj$8E*(`jz5N^ zfur;Di?XLro-k!}(e%l=lXJ3rO~cQV*hD=`c-3~CNT_#x7khQ5X}1-IwoFME8uU`B3X zM7JT`Bj^pYX_N29PZvet0pPsJ_n)g0@qMLtuCdMj{ zg*Sa-foL<^!rp8#QO_j8Q9Y>M!2WhF;Y#nQir!il;!vu}(!wdxcT_b6=RSN)hF+SF z9{MR|vj2mIH$x${iz+SYX(5|~C|?4L$nX&(ts|^d5xOZixs-EuWq?yTYmGl+E1MUY zXH|Z5D1Vz%zE^gu#nOToOYw$o)-3CotTA`qQDs#&yUMa7$M&dll}(L|Fm5!L+=Gg4 zkFGAh*ucCv1%8*35>oD{btz*)T;+qxDbB9)=^<(5tp=o(hsC?%D`z)$#_u*4w*}a( zq=&f6a}gRACqj0ai>Wx=@f!)Z*IaxK8r<<4=-VE1@iC_F-Vk^EW|DksF0O{8_+q$u z@j`fP$_Z=n&u4R&oli2)FfF&1r<%wY_ON-_mh)DK%JB8xuw~>AQ@HTnuqD8Sh~PQ_ zVbFeWeX*5;Suw~zZ>NDcPn;-veT`EMHU~u>Q*}Ds_hzP7r-p8 zrsXi3n`GV>_AoRzu*FyBAGO8rEQmFCv=}tJ6FHM!9`*>*gfbryf}X&xm>S!=m{27% zLhNOx#vtYIkDnTuXD-P^j>T^@7rzd4@q%!JxnvMYs?5dx@Ykjsvh~<+Exu&RpX37B zRc@l%iQFF%Ql3`pDxZi#Sb#$48RRYxD|42IJ&;k}vwkN!sDy*kDh!M zP%Dq=3V11|58|&!OviY})TPJN^=~mn{6tJUBBtj1N1}Bgw&um@@JRXV_}BQ=G$;#Z z(Q~24jc_Tb@`X()x`n|XBSQ@}=wr%K!dai7w~n3&;r&e(=BAVz)bsqGXm`2h8Ehy+ z`=h3Z=xFVaPAS3Q$=Y8A{BATn*8WnE|E*a2qZa1EI5x*sK7*QCOEks?dPBSpESItX z@G%s6tq4KWsznmq@l~S1(zHWwh(ED!Y9rl?Z>$j(!(&rW*?v0fQies&q1I=5z*_F) z?Qp4iIB$m!uy(kFwJRZH?a;~F;RAI8&<-nkJ6y`z;R9S1SoZksyd945XooGS8Jc)A zyi;#itR0f^1*RoXz}le#&1i?)s2y%8=wGLvq?emmK3Z!ltxBs9s@fN-6T7quqLyea zYZU@o{yyFk4JdhPiLX+IP)jWR71>Mm`xpH6sNcDs^}B9MM2qy%68mWN`$nxLcJR>> z?}jaOC74Im(+=s`XVDIABA&Ohc<#3K*l8{P2c3E-zEfPOr%;knOYUVg#Z}&ubt2C4 zp44M3$taKP?utJ$yD6$rH*_85;$5tU{50F_jIS{lSK*tZJR_vW=u~#Nyw9}RLTjg{Tj9@WdBeSv8qXt`GNKGUM&iU#rP^H0TB z72L%0)3e{8KCKld0~x3eR1IL_u-~4eD6pO*75Q-qb;x9xsr4aj&g(giJLph;cPZT|D=z%Mr)#PY0 ziUyxZ7S9bgD2T-0MXi;f%EJvY5Q!PFm3L4`XpW{%8b_;>MhE5##Xog) zh&fyo&EfV_hRWIUQ9;`5W==LU{BuW(`NOZRY^Gz~eb{&FeU5ZR}b$rKy zrUWW$^>}Sne8>FrWg|t8&*nm~7RIgZ&o`Ejs#VUD9Vx}lv>6m*kTRR{b@9&~t(7Mm za-+<=veQw#Ib`=yQb3pW?E9y0(I@e&MvzW zabw_6f+@Q8a%&Ls!xq1(V5qXs+GA(&Kc;-QOEG7Zw_41i`FLUFp$N8%Vx!5Y66a9P*_2S1^1DqL9Bz&O+os$eZdDGL zQ+~v~qP?`*YF=4EoY%2i-zDfXJ`HiXehkV zippL5By!NrYK}8JcNwCw(2lB?Us_!>8XXXNr(dHh;;i8;ldN$W@F16POQ6q7tjZQv zkXB{8P1(u3G(`7Uj~p-DYwxiecCBXndWpocOOjluMn`$!pd#a}@s;M{yOFCd+}+!i zktk1!VRcbwe8MP(mHEG(ybS=YF=)3FOrw{+*O1)LS*2N{`FJJ|quUpoGVn80D~zOl zT*^^<`~|D>8+t>G99DDk8PuZE)8>-?K;WK48$?pYMA{y|uOQTcLCmIv1=WNo$+*`> z1+e1=Jk+V!B14o`K{bu7@FAdGHRbaSrPbz=LojHi8CJTC!L$ZwR~%ibBwCN}ga8 z6Ry;two>crvLAU>4PTf2xVNz3PHXYrtF^T>XJHvo6p#DkaHgV7>7l|qtREBIs#H+v zSx2)*PgYO!T#y4GkJKZAdR9@ik>`Vq1IASJ=Ep|TtgH200%r>R6tO?!xV7S#|mx0)^(`>LT84mQrL#N#^{RNWw`xZOa*xzZ_{V3l}8$~CQY*ebRU&fR`W+&J|%ml zTdkkcVw%ltuf`%?$r%YT(EDUK4 ztQXd^ilJ-+q_Xm)CII2D${=gGBM3^jV7#y0VyvtZ@oncBUyPIY_l(M_{ z=;h)HlX4aV&IOyY-l=S*i2`N~o>K*7Q~ddY7UqsvvM?(#cv~DbphHDa(^H71IRn3z2w78a=;%0WKIvd8bTDwS4q;(GMt-5ko@A&4Hs)X_T+F z<0h`XQ^~?iZVR8x(tbm$;-YBW)?)?XcRP~Og6@|S<612$>VOP^B>$XMNyoIG&8$|k z!H?#j5U@4TJF2MnE9|H=$5aZlNGrNZ z!QAs~psBjB9^+iCm~gNW#%{LlL~mrRJQ2s8Xm9!wo&DfHeXr6~he^m~9wt8t~!9rVTf&+&iGXS&L5v&1prwccNlieqkqu zNX+q01$dGgH>?Ukc&$NsVi09QI? zT*ij1;Un>bXM7hT${t-CecG)YMugB99B4pB%aZOC(XpRmB3$cKzM@smNqkawvG^k9 z#+6X-D({7>LHQN{9(LBI>?lvcglKpC*`jMpPrJ$+62hr`<2Ktj^1e2?_-bv@^`)mB zJWPkU%=QWn=|Z7RiHZAV0VuO!{TI^@=whJKiaA*}<3-$EI^ws_3v-knTF?+TptK+i z1BHmg&Qlh4DL6eT9WcUG}#Q}g{m z#DiAHOa>ROJ2Brk8AibOE|byoz`L1@UfZl-vIlV8$7Gb_2bk|^_$u%*8D7KnJ0^P{ zz8{%yJ$x1Tm<*S2<<`V_I5n~j^~N;2;5B9)l?hAA!gy>jYy!dg1&y>p;aK+n&^V}P zp=nS=QA0;PVvd#RTW>Ip_MYV z+~;b3UO?Mus{9x}Cc_Y1moQ%;uFo>x7r63ekQT@!F1sE+&fuA>96<9fPYqHkSK&sc z_-IGt`pSz9agT0|ugGsfgD^9N>PNLCq{^k-f&0s?b6aB>0ILh8V)Qi=XlDqc-sze| zjP`8#sQ7Tl9$RRMNnd7Q_*TVORVZr8bnZTZMWppL4HQfciaH7%2dv0Z7EHD=xke99 zc0K0xq6@S0E)2Jl9<%yNHsK0EXDVj$G;h~BFq-dUYOi)+d}@yl%q}`GCII2JAnL&E zbvm#>Gt1_cS#8wJVqLSET{S+kOWnH?nRNkEhJVejZ@se1_Wzyi3a4(AKewQ?#e_rI zjXs|>UTMD_&k+==PchIs!40UO(G_%G5LJ8$YyZEa%xKY{t^L!+;VgWzXqvl(ZVlK@ zkvkq+wp##XJ4J5V+WnM$+cdkeJANNu;>QLS>sX5~h3Dtmu+(0B^sJiQY(ak!TjH-| zOZ*F&q|7{=e_f(3@q0?NC4OBFsqb~8&%?oB!SfS?Aq?HwA$+R%6XJuQYpU=-9hmSAk)1oz-Gla4R zhK{BiZdv*40aL=km_3B8z)A#`TrhVy_c4fctJ1BCm0EEH){Kuf#Bh$;7ZVReIIaAc z3|==d|KSk}OgFKRipMPQh>k_ux}{YDWgFIn%EFf5i3{9UvL`NV^vDBJjax_kaSQ5K zk#u%T)d8{Lsg@Q+|Nr=~!3e&|DL-t$guWg&@Cd-n(d%IYHSj+_Y_ObdaxOEE_@6#( z(A?g{)Y!+v1}=0Gw8gm!+ZkS^ptxX z&rQR+4@0o1>JJ(eg;J&#nW8Id8nPQNbsbY*(C>+)@RoKN(>Q%?&}(UzPe>pO^W0)Qj!1#XQa@V(416C(3ADh)<$emr`frZw@LP+xRQgH~z9Aqm93@ zem4H5k~QqX(asxnWqdkxxN!sQ_qEjq2?A|4Jx+68w)uAk3ouZO(UE#zu>n~4|7rt} zMF9JL*!9ykAlZ$N*aO^sO5Fl%V(qfC3ET0jX=-c2_5rc=*SMAE&fjot=Wm#woxee1 z=Z`J_=o^3HUd!*^-?id-Ot$g2*|dam1e<@qdE`WrR!p=%!V9bbx#hX}M`fp6ht)N@GG->bQBud>6x{r8bCtJWf_p+d>J)u)8DMtBh$SF%NeTRHrMWpg zSXWjm%=W#w|7T0g6(to#jd0hG73SC3gtI)+WK*_a-ii6-NfVc0(HJ+(Y`#f1(~6Ht zsHJ2h=H-~J)^1&Nq@%&GaDH&@*5a*)Yb%wF%3f>~ml+kBHQO-VS)7I(VRsLnpjEX+j^di2xqo7} zt@KxvgHX;ME#Nmy3M`n*b|Q==`6SH{p`f`?U?>V^3ToDg+j&=cS0K>C6Y4c5t=>-9 zUW*M&Jl}(5@=o^Bza%5tojp%PO;2j`;W`T88*0Mvz3_U8$I`ECLFAT9K>6UteXH@L zQi-kcd2J{YnwMwPIwn-|)St`)1Z#5I_p$h{Y^2V5EIk!AiY7$-rjb7)Sw+*bFW9|x z0(=$tnAk1fHYR&PlhIR)l}vU3zRk>c8NLn7*93)Kfo~>5XZScb2EMOZXo421^@>#Z zr~;_7tRa0$BZTrjFKeuuVt%&}65RAUf>>BBpH|W%t~J(=gIN%pprZsC3jv)L-W%Mr z5O>nNKt0+!J*`l?9a(pp?km(AICu1o9jU~ZQ7{_`I>&GOZl>p?_j#_nF18b~~ z3A@Wo%V}R=l=;KpK|PCFJ8CzBSoBrdbec@7oh;h332Q8P)PtMR+7Ii3BcPr71CwEp z=1YfjxPudmWf9ST(OMa`bA7F>4~@4LYg}Go!!2rzc3EhO-dfXv#YJz6>WUh*#W}Ycf9GuwD{9mcWw3^ccE=-GdT8!brGFK5 z^ub0_=LWM{fo^LPwMPrz@4_rXZ<$s7kOW>U;^C{n$7EQK>rvLCet_?1<~s>r1wJN2 zd#&Z&=+WM=CN>O18LD$bpbU=a4Gt_3!sPE>&FCMs8AS|833ilc1s9psIvibbayV34 zKgY#T(~obAi)i#Mr&rRE-k2%WTilku?D{L-o=w&i<4&?-l;PGAz zS%y{Wf|7zI@{1xmbNTJ($;|+$%{AWOD*GUk+K0L1d0dr^UC|@Zkhi6H%f;G?Qmo~< zBD;MVf-tPHn(Y@|6E3)wO-!Y;_-b==F`II;#-6yz7SoM2`3S~Rw=`Xm5m%Bf)Zv|ErA|W+ zuN}SM<9$XVe7w&X1K$aT%hf{X!^iuKr{Mbv9}|0Qh4(FHlo6kn$HKRSg}w>jR_3FI zz`0xDD`qmUsWTpw!aRxA#D~x(apO`Ee1c?FrPHsH6rc}F>tw?IG zWiIh#x)mEtcp}G1n?NBoxH`ix9B5ZvTai@Ostv94?8A;4nxTVMR6s7&7F8UysA7*k zgeQ>9C1IH3(SF=NA$U6gS?$8UA)d>^ViXlK?hy}PGx|Btl)`#?UsS9S`}j*tGFTr^eyIL8*|P1yMoNa zzRopY#h&AgO7pO9Alli$JZuw0l@RST58Dh;waGl}TZnc-w9RTBhQIl{Lf`@I>NcX1 zARGdChl)c6PTlNK#US_KjXRZXi;haRjN6zg< zEq%saq?uVeX4@ zaADoo76h6HU`0>7wxF;UtF!F!U;BG~sFlyxht$^=M%H<40fjt?-d(uaj>@J!_U|qq zf-O;cb*M5~v8}kA9Bo^Enbz}?%iy6W3GgoC8FNW!K<@?2z>`I;$Vv1nk-I#yF?)Q7zZ*dB1vICT zd6LtJeN(&}FppSx37{bs)C%(5@jsLAbipLNH)2+5tUYR2Ua{x?NAg{OMNG29EWUa? z_peK|O#vMizcK#-k!QRl&ewjpk4Ci$(q)PhLU{>Cq1#*>M;_p4mZ* z9-i63Uy~5oLGLU1$PPSNu4PBTOf4%WYFTlomK8M0{GZK^f=-?*k}Um+(faEwc=qT= zwjPP?fw*)$tcCZD%quIg+mRej4`^>G%MiC{{2>@T6{4?5vWX0PwDP|_qlg`2^uE}O zz&u0Ue=xEA2OFDvXcLd?k=ysR&6-yYj~?aOY#+^$ALwHXFB=s81YL z;{Ig46+4qOIPm8TvGrKV7KScV&{`0dg0L5f zw(VliatN!otzJ)bNS4pS6rS3EW%i&-n6PZqEt3d{3iU~jDw+Wr9knR5ZI0Tm2sJdr zhfls}2%sTj*NLudl3h0);2m;#CFcEH0K+((QCC>tYe_Ys4-GNYkW!v=6^_js-w z5YL#%>C-K6y`=Mndh|}x^pbV8-TKqZ^MZ7;F+fDvSA3@nz37#Y*9PQ=!7IPzT;@93 zKqI$7`oFu{)-UcJaTm4d(Dr3~$JheW?1kZ8kXRvt= zb04MYL(cS3qXv7}{6%AOA2De?Rjt9kbC{OIxjpV9)_R@`G*|GE3miu|%zc!@oZ+3r zzI1Qly8Yy^f8E|W>`OQG0!Xco9A1SG)t!KcrDM zPj$ZZ{=)PInSu@78{kpN(j1)>_8aZ3TF^%6S%75;c|Mzxo$u_VzRZ8^zytQopdme>U`;K&-4a))JHlROLeE=;kAqVD1SP0M$=$J)5OMSgAdEI za;HkgUs^2VZ0;j=H=YhE+dU>j!wr-R*c4<}ehd%CQrU7Jl`UrxD#0T?zV!Fj@`+Tc zdMTguIB*|X=6Xrz*n0HF1f1$K(92WJeU$2f^`@F*Db?IZspc$7Ly|}AeCfCNO|>2e z?xR$5y`+Y*wXf6wB>Q_X#pY8Q_c%}PAVT4hm8IF?e)eUxg>B2+^v zHsN?U3Am5+50O%>>Xk7ZO}4mR(s@HYdPnh84{u@^j(De|j{2(U5guB8hkl-V?xWa^ z;ab>S19QL_-1mxmUMoUXcMcxTwxaN6f{X>8JmqAFWZ{U+{1?_Yr%E&veqgv+6Fu z!&%%%tcN(ONwA^G*~W*1E95?tmcUha5gyLwK4P!rY#+1M_f#7G{;e^&kC;zzrq|ut zXb%>Z5VyyD#Cpzy6{6iuM0&6`Xe{m{)+>zFsj11(6l**Uhw+-LvZ%gtEY(-;qt?z@ zgn9uV)$wo>zH%Swe~asP1(T#kg4erS)Hr z4>sXE|Is#`r=u-BPe)6(o(?;MlAAj0c+R7HmiI16c{pKgO&imLi^j&})Glkff7~a> z@@rhr%!--(Rfh+sSvHzSm)$Ua^HYV^Axjn%R-JG2)w+JQr+)eC^_1w??|MJ6>Y+hr zyIJo2Xh5DJ_NJ40b3gs+3B$LGFa2}+?q?o4P(JXHF838#PA7b6nzA~s-K~38tv$Xv zbm@Jgn>;siZo~F34S4s%q)tz-OYZTFF=yL?UzV=C_Rn)^uVl8Vh|C<&V95H&!Y^9i z(e|m!Kfd<*%J+K|wVhItRr=S&{LFIubJwh1@b2bsy542!lDT>G&sS`Y^0h_ZrdAJb za=v!&>h1eYR~Gzv-Fr{mdZ>8Nq#mok>_2e(wNpb)qkk_vZGTc(e0TF~L&M%BXFr&< zCvWkV4(&{@R<0{7y!^qSV<8V-QsaH-jki9S^zEy7Qt-QOgG!1{N7dZa|IroS?kaix z@$6==zp^){@yD#Zjr#8oYccf7Fa$>_h%h?H+r_bzUj> z`k8fk-z~f5nG2)M?cH}QXuj<34uj+FXngCq=Ti2i?E8PH`wqCMj_&P?APN@jy`Z8J zD+(%hP|!seC3YhUNKq64VNone>`K;}9^b?myT;_z#Momn*t>}_8cU36mK0lJNetgP zXXehmb9e9VzVHA4{eIs!$-T^;d7kr3pSiQ^?vZc4{$N?%h> zhuib}v>ZAlJZnN><=DpECX7~JH~VEv&D@+@lO_!Rw%(V;ovuE=zrk;xdWUsg|M0UV zGe+mXy0vPJ#n|F4&4jo%yj(%9_6SzAB;ZS})$tqaEQKN35sO}D~JAswUR zgREbkyLxHnFW(&)n)>gBjkh$IQ>Xgc-_PtA;=ALol;qQA&iNOt9#ix0joUYv7!+w>WOW_7kL zAM@R&&zG(E<&8EYI_-X8^;?ItzQ6v@j_&Q6zYwF`A9-ZMb0b%OQG4OLH+|NpmC8sg z`eNyEG1!k0PI0 ze&X-4OVg+C-40&|aBll=75v6Nd+C|fs4AUn+-lMG__yhaTZ_Ygn(U# z`jZN)(zdJhYpnn0&v+eqd1B=L|JGlNTkS@6>+64Z%_r*zRcm(nK)V4ee_mB%-m%!R zM_=@>W!rskj#BfR52}`~ejw^zx$x<8)7~6>(>FanrR9P#cY^P)_(N&l@82uaXLj0r zzg@Gty8Yx!qRH@^OedcT+YC$peo)`w&2eRcNqvCr-PgAdi+aqW`- zm(w!q3@zRNrxM@Y4-Za?yY$JH9$$`l{IC4OO(NEHUS8p=bXC8fUz^` z9{<&_=eJCbR`F*$U)VRld$kfO-ky_i@7UT?<6cmj?EJF(*&h~UWt@EVnb*S}CxyQk zIC00Wdei$3oZ@6{Xos%+3YiKj4$=!uPT2>Lf^NP zKN?*-JN=a3-KEu!Y+kwO_v;Ox_4WO--D~$Z zrhIQNGePO4*qU@NJpNC7*v7ph>y8+ny*ef@X}I_1KGl~*-g{7g$=FIqRe$G8Szqo` zRKH`rfOfs7UHaR*bJ;N8_4VQ_F8zN0(StR*uj%^S$B$3Uy_^2(lY{LpF2CRG!jraF zBDT)FphTBARn9*ztW19EBJXma-Y;KfM3uFZlYf4;xL3v40b|~1@pQ-^*AM%j>YKfN zXzr1y=RYl~zwLDH-?8gnYW6VPUVUHE(1Zb(gKAvdSijW#(1(9EE>j}ub5gf!znbNf&nw z5oxJOwpJk_OTD~iaLc5uj8+p;AdRi_-b$;KoYZ97q*U~R+d^-zkr`^@e|n4pl>|}_d?!Y!3cox!q(dG*lEO+ zgcNTt+&!Y|c&|yr95J}-^Y+5M7GmCP{ZAi94D8+jgS#rk^jSN$&=G_CDsL}5t;bxP zZ}a38M+{cAw->&Pj3w;b??m;rD{KgG*h zL3cA^a4+xeWrsWVqz_J&geo^;suCs{?wE3L#Jh(bG1UmO1@0K8S^scS_Ue%0?e#Gs z;OX$&-a(FjY7nLg+%eCUzihY45mS>er#WWEtoiRbVrmfv-}}KlZ*IG?lOqP-*=PAd zt>90WH+96|$*Q+k5!^AXTssEt#`>uXHg7NW`L$y8dufiCdW2EOY11D!K!-B=sZW?A zaL4dMXrpzGm_SJJ_JYAcp=9=mPaQE02%~CM{&|g)zR{2{YI_a)WJwGDc)XP2?0MNz2u3L{J?Yr7(B(t)z_z9FX+6+a&;yQ zo=0LzrHm?%95G!8lLU9fY`jwrx|`7t=EU186Ydz!{dBo5>uvgdLN`e9_QF1f;k$uP zq8%|X1po$D7F76o{Sjzn?6rD75%AjEYY^Nq^y?eFnqlx2);tS=z{|DeB#+I}TQH7u zoEp%#qTonV1G8W|sexG_vm!9dK>pfKK`ji~+~O}RFLO%`Vfm0-stC(bZmBFRKXOYO zVZnc9iJ_dZH0GAJ!qSsl8Vd`4S_DIouq@)1Cc=X6h+_y7mJ8exDlEKsN;_d`!U_!k zzD+HA4{oU{EO?5Ip}DY3<(AUI@+P;`5|-WEQd3y2aZ7Ds@y5voLQ7$($1SaeMSZuY zm9VJqSd;={XLM`3BqEzN|b7qmhRlrU9g_xmi7WOgrIfIo;}#!b z`I%e1h2;siC}3d&q6{v36wm^{tdyKR#bC)zwdpM|A7-SglQj7OOJ?!}b>2chLDqh_ zxKQweyDwVWz%)$3U$uw{5_ijlX{%yzKTj515GhoKJ6XbUJ;s3RyNtmnAhLw2uF)T} z;0leQF^E{0Ln@wtHc2|)k^+@X=BovMXM* zkyv5a1{e^_v{cWy9x{yTx~XajRZD@p3mFrvTH3VXu5stdJgXVP-5j&D<*v&Li`vO> zPr^K_JqmZrWND}78J~${3$E&nrPeBJK{!V38x>Vcn2M>OTH3VXrb?l`(;=HuRw}#N7e`X8mgpss*Nm^&e*X*vbzUNwm zk+gbCTA?>f&Z;7`d~xD|Kp08O0#LY3Wy)I*y#>(O>!bn$~Q4FKDbCoJAN(D^{=| zqBK4^ym4hwhnF~uFp^e3!NS_u^T4~h#wzA4!bn>EiG|}1!-WRN!`le0hPW(1AdI9H z2Ue}UUfp!BlE#9MyHX&Gr1dPZaBN~&KePX@<%HHm&LWJYH2|=h*3vy|PHU{UIEyfn z7VhG`@w*}^T;8xgt*y{1na28=CtznWD)}h8)##w}sw1yK4 z#}|f48v@2P5n7*e7GWf<=K!lKS5ChOjdg>w2qS5YAXW_&g79INO}~W+txDJ+5C|h_ z#e-GTT2_4Zd5zVBvj`(;jU<-74nu|3M9w0Nq=hGbnikff#(Iyl2qS4F5DUu%+Y$J; z3w>e>jUUl2#J2PzzZZxBuN(V>QQ(7zDydTBE_L zm8p3->$^i^MROKmB(1T;Qrqjr z&_$gzmW{IrBWa}*3+D~g%I$HhNMo($EW$`y<0LJg>o0$&vA*Ce!bn=<1q&jyrgRbg z&ODHErqHr+ z7GWfSw06wB z^+aPW;w-{QTF*;bkE(vDE7w-eB8;T@b_ZPmUu_kjC zVI-~Df&~%k8|8)8YR)2zq%}vdaE`*hp|K8e7GWf!bn)(qoNvm$L{XX)Pj_T8ICn zhgZ~CHP8%!Fp}0{uxj(hv)3E=Yph7lB8;T9gjiUI*rRqYXb_>X#&H&5B(0^A*3jln zZ)>bqIEyfn)-qz1hC7C{9S;UH6Lq+kvj`(;y$o2bT!-#A8LYA3A(#STB&}D7rD~Nc z@$_m_p;fLbV-ZHudX-peKMbAjb3kLY;Vi;PTCYi3%l6-r1hSpl@<2+5{=ckIwV3MjHI;+tlIec=wDT%G?taK z2qS5&CYFAD1&cnP%UOhxwAM&k{iZdTr?KAQEW$`yYl+2&y0W_d>S`^7)*;R!jHIghU90k+imeRco&+ zJBIAhSiLxlFp}0*V(II!tf<3roJAN(>my04@q>+*G}cniB8;TC4M!&enx1$ z&RK+!v~~kl)5`t4!;czk7iSSh(%M5T>>JqU-}c+QR%2b_EW$`ydnK(0qjtZhv5Gm1 zFp}1%#8TVq-QdJ{jn$|&BtjsJq_q#MTDgwLRy(AzdUF zi!hQ_pe!+n0rvgqBZT z)MwuT3r~o;_bZQqRqKaSy3GGuW3}Tf!bn=jiKX@pd^T?{v{E^XFp|~@Nvq@e_*xok zA!iXr(mE+v5TWzKl0xev&LWJYbxN?X4hw!ND50?~au#7EtJ<2V?FHp zAXQ`Ka~5J`)(;Y^YTNp{+IWSt5F@jGB$it9nbj5*X<8q07GhW%7I6z041RtBi*~*` z%zEvn%2AZBI14ed`p*(;R0F?p8tZS)LX6D1A+i2y-fFtWYSaJ{As|L(L56fW95UO<^}6|%S6sXjLf<%vHCA64bvg3LHJinoP`)*C667S+dd59{M%)` z5=+qw-R(1ABqZddW@qKt5^|C<$D}5YO-&x3mXw~6my-%f=@YUO(sEMO=!B$w4f)DT6vhp&Nya{OuV1)oAR zq2*>~=cH%a(#+D6a$TqA<|Zd)nzA#}b8QLkBnaeAhk0@-W=qN)51+1dtEb}JNvb&4 zMVy+NlVw(UY3b%|nU$Gg+9=RXM(5c~z2;<1NXW~`${gbok!~C70gC+OnmNJ`tD1Ej zsA(E2t^jWHkercY#)l*~0_mA!GSbsbYtfeFy8MvtHh-!Q(;CXmVIro0^jsH}n4asZ z`=sZ(oD9-)a!p$&6aKxZS;b}~ne!&6rjHqG%1lGaguF}_B|>4>2$Xk?$TIB{Ntr2T zrGli)EYqCloBMRZf{8ITCl~$&uZz}A&rHt9OG!1&S9)&h#JnWaDINb=aZ*ld0#&V9 z**M4{IV~+WBVj^PrZfL(8RluMl@nY|A!@#;c)96WnGWKn(>knlkSSUsP38_n;CjVY zNWM0vW@aSij7d!xJw+W+QZip>&69EJH{mAGD3jblg~QyOkkEUe1$s_KYEDmF^1%Sj zotKkto033#fQ00%tnuloN>E>I(gx9!x*LoKj@TZ+18*GY+9hooTsvbB z*KV-ATzerz^4O&G%%BjnO3-<6jbVP;df>-3#&w}+XXLt64C3027z(akX)xFB#Ky$6 zI}PUA9pAsWcBX<{yOQ^Fu00yC9yrztX%`$ab+Q@?NYB)@Ej>Bgzp8LFFS*Pb2W zt}8>udsrWiaL?SUP42R?Rp%<0jmtJ>p3E8N{_4T5(;wVG!4D=)uXg8wPRhhCgGucBFz_yGqj@ z$XvVA13hr5J)L;qRtNULHGk~$z^{sQ?G&E~TstEK>&2!kzs`$m4D(|;@O6G%W84;s zKY_X}nu>GpP}fc_CtfIn?(x*kf`pIJuJcF;H`TB6Vp{z=Kc-cy^Wz%hy0*ZLTCFZ? zN{4gpFjqY=a9vdz%uRi1K$bt#O4ESMqv?960o^Q|8qjr-wc`obW!B-`IK+bmH@*ns z+6_NvaP3G1u}U*th*cP?GPf}1&2-_Fy}5-kZ|%+2W!als81vS_GjDET%v-o;-rT~N zw~n59a|?6bJ#?o?uDggH=-MS50J(OB09HoR;i>s>31MDLr#{V#ONi^@;7OS4@({vJ zfplI>OQiE-nqQqC*BG~j!qYgnOJ^m{v7mTo+1r;Oe@9^guT*VX5RNv~FDLfbLwfBVBj?ILfs% z^`Mm<0K0Z+z$zOghqaJV55o+@YK~ zb3AT#=FAC79Vn8h6P&uibBAO8LWA7l)ZLFeob$rs(}s36{4Xs+;fdkVJ!AUy?%OjmqI*b4e)piBz3@xXMRJF}y?RIWi|iE% zT!+N4=$PJ7QT=-LBW{Qwh4!^ZMfbDx>H{Rr+9t-*!xGcGZ+}2*P-}EdkG`?!0o|vF zgtk#}efvblM)!)4?P0OK;-dS;#>J?N?i~duv}f#&f} zKwW6lp<_t8LY8v`t7z`}XYv1H;<14`WG*{wec{l%^N=jPrdCzABD?f<*tN zz4$4Sk#OM`D@wt?0(`lz_Qk!Jh9Bm?X~0D&6?*8uC=YS|aJ>c}x_TEb3|?>rR)|Y9 z;;MihK98$>>IT;WaEAeNpX0C?&ivu$VoC+VSDM0w!4416L4GxpH!0oIX9Da!FM~;Cg z1!wh)xEmhgZhL@3$Zv29Xvj3p>IKW&2rxt3;4pvVIEHz2-d_+m!9!fOhqzo1ag#j2 zRfYUb@c@_U1wYvWxW5~*()z(4XYDo@>_dVSFxsD4}f{68M&j6GCTA4J0$M`%%Rw`4dU6Pz9FcED6? z#c*cjs0qnofQjWeD85r&oOg!;CdmzMH{iwtrg3YCKrn0HHy|wuFpoH{B)oQ3-Veau zECl|+DO?!LaM=8QZQ#q_;KE>54qO*H0j8fDTw8E33@|UXC3o~yy3X=v1>70H)M1~J zq_6IEhQp76X8Be}psm!+QM!Fh3b_^vH#tSU`V1J)xh%g#pX!%wG+#w*pKrBhHDx6u@K~ zaZd8Lm}5{EgIRf30q#RL{_r1zobb@!Wx(BVX~8UiQf0(}<5B*IA+&nk_u)nPF(BDqL9dP3h^LO1tf42blryGBmzbesi(*?8k z2nJjj$C|YV`WxV(zcj$*c;IiThyK<8Zi@&0P66h+5$9yQ!B5#JW#PhLR$lCX%>dKM zh;!m^7+_M2IK%kG`Ct~upe_cp_E-+Mb#DA&dmQl4-vz+^;DNsqyaA7bj zZ)r$t!7&7cn^}3o02krLAFivTJoGmXaFg8l!}7lBp}#eN+v0)0Qy%)e3bDfp$GmpdFXF9;10R*hvV%B5B)s? zoKIg?(Ps6B#^&fpL8cLFe%jW{R% zo&d%-7E7TkhZBE69K(?2?HdNT2si$)Jw^d0$B1*1zomeA+lVvd5B=>1%qb(ziN9X} z^T>#E;;&ji*u%hu!BzWO05iylbK)-tF!PK!C;3|gm@P(}6Mv@wbKQt@;t#*yx-48$ zISl@=zck|*hBR;APJrv>#viV4DIWUE09?Ksf0)15J@mH@a38txhxt3>p}z}&`@sW$ zCF0bYV}H%oBY(hE<5E%(6RP7nPR0`7zd z{%(2b?;ha(@xWi50cuIvU$gQC0WO4N&DsO&ub+qhh5&A~8-HcN-wY4^Ed<<~9{Aht zp})@ocgh2Qzj)~H5#W3VvN|@aKP+!Uj$ugi{?`g{o!t1t_88`&zeK=gc;N3P5BDehhCnql@Gd+2Hd|qaH zT6$_qOZd&Atehz=({hp~q)yJt86Q77FFhj#?)Z-+Q`ol|a2tKnq*Y3KPW*t>jMSvu z)cDcxPb6DqjUK0TQo2-BMnhF7m6f(ifgOIclmCrPPtM88%}TQc1`l{9uz$8KeM0(F z_*`~iPxypUI{Z6K$d|=_%u?JKa|ku1%!JEFvCRG@80^JW(HvT6nSCI*$Pc13;PO!- z210sZjQ!#bcnSP77W;7?jS7l8tQ12aQs9UpsA**lvC!8Xikb2~Azd(v>Pf2%N|u87 zpwdHGZXd_k9k>>Id{9Ve;o(x4WhiA}LJ_tV%Wxe-hAsAQ{#)%wPPqTyXgjGlS9Km* zSj7Hk&FrM)uGsn(`ybSr$OMbbe(XJ|-0a6CZKY@5^m%x(Hf0f|Y78C{IRyGgh}{;H z9c{mBvEQ=TFFrg}2>l^oZVNAX{|#sX^BY3US};9mSPb-b_!~z(!D@eGnOhhz=WFOG z5q};kZL7#e%weS(SZ)@=&0?R8pL7A3ty#4FRDmrhFxGz9V*d)pOfd``aAk$tFzgM9 z&;vsvM~xa;WSPAu4p@rK2K=#{@2|3M`&sNKnUaNaVCx2cgJbQdt@eXaD8a^L@hj*A zl$${2d~AU#<+Qy9i?Vw`jnKlIIXD39hi{Izx?Ge~b8)jfQFumf zwh=@s3abKYX;vh7OHBC?E+1tG++U7%7b6?p0f!GYVd=ww3bB3!eVlfb7j6uRi zUB&{%u0SK*Vt)cn$VcjNi~SCdp0@Du4;4~REh4rPWD=(V3v_{SHV0VjUs~*^i3eba ze{Hd!;%)#mx6l$0{TC-4W)yU^nzG#h?yD%)0`3ba)*kMxD8nHJ6EqZWtcd+TQ-HOU zF)RR^0X;21#K6HrhDHvF#QG18fi7vkWwqa>3X8Fyf>EMIJ!p-c*pHx2gCi3nM6oYmNw?_qy-H7v=t(v~~tMwgT6bpU*N2`6=uoCd;j=5jh$`k+tS|U8A z_`1pn26q|**GiV*o+5@)QT9PWiIERKccYe9iYh7`T6kt6h~gw!HmU%)sA?&`=3Es| zXqYMN2!|qVCY`hyI|soi}>@fm#qP0 zBba3)U=G$L&IobT6%h&f0ayuJU4Vu2+>UdAXg+K~#b@kypgWXd>a)XxZ58c@WCj#{ zw(6{I6iwhU*xg~?GH5d=WM(t7p&U4BSzWvz3nxBNFP(L*Tlxc~%1?3;tI zW5?LISe(&~T5jpQV9hwI9I_0W0HdT*fdS zRKPr1?T4V23YZ(LELt~_ZPIB}-_H7hnidUNVha?GG-Fj-7L^36Vkz*lF2Z?5;Rb6# zOleC&WCbfvXMd~(ku|^?Xjw!{sUSZa4Av0wGBR9?4%4EET6C-y&DNs%B06)1mK96E zOssA#ZK?F?P3hGJ>D3l^1tp1qd|NC9&&CybgJCaRKJbIf>??YG6gn9tTO+vdp;$Ax z4vlk+UDc#tvstOF>3Z z2=zIO{RZ^2yizo_Zuhf-i*TA7V7{Ln2)*$35S#<@V)#q!lwD!iM&Y<-Te>LYn6DdY zKV+r7g&kyY*ARiD*aDpv9yh>I2=Cn$WJkC8=EdQ@cXA)t?o!2A?S)v@UXa}gp4}>tT~=tE ztz8U0N-J_U^jJ!BkY`!O%@NCJu86^mq;7z{VRUOxt2nY|!Ua#O&Yoalb6)|wKn-w>yTus~Ocv)G~a<8kY6<6D2+@f5X!GU0B+ z2cGNUqY4!33-^ChEFbQy)Jq`7aLXZva~3|C(?$&16>@VAN=kbmi~T0gz$w@RvCSCl zZK9y(s~aIG1KYm9CK)zD(?asPsT-kou(?sUNl*|*w}LfpyXb;^7N;pa zkiVz}c(!3_0x|5EJ_h8r%2EcG9Vt%u7;@%2(|H6f-BH)FkH#+}!Dz#JU5p4NR{CFtPBCee1u z)EcNIwT9UI{MW593|a%F4V4Si{(N8^$wo< z?$XMBi{`ogfwuC{iujB-YUE9*A=u=_^Tj>Neo9^6#hDOp+VaX?_7Pk@N(kIp2ZhCy+lE1mb<0GEv55knasuYSD>%Lcz9QxGMWcc8mfEsW!Yl z^IwDavj5yaY#nrqAv}ZfIoW;%`iEEwBmO)XXiIlL9n<-fcqXn651@u=SNF_mHtq6L z26Yj<&Kq8o$_C|oi>BPu{<3ohCt8FkFno`wzJ}{{qCPdfwszUmX!@7 zCKxvbG)7?`p*xj_UH2I{v4z8NN`zUv6xGn}`be}w1p^o60N6mVZ3U}1JM7QZp%3Ts zY}ml|JVV=_kD>=Ge0=m#BH_-eZve#D_IxVDSSk*8UTI=%&)#(atnh@s>j(}X`$bz7 z%c5lqu)4VL&EF^;CkB|YN*PZTdc#>m?+V6Kg`sfP&>PMg$`MOFsOS%84ZXFqhThs) zLvQV@p|^I{&|5oe=&hYK^w!QA=Fh-PsqW`5kY3TK5NWvm)R5S_v{zf;m9?OEgr#68 zoHg{1o4toBC1B3ySSPc)1Ju40s>J4Nv3ng-yx_eMTzeH;DSRE_g@zksfCbpgvgj2A zABrg9b=%uwKMRRCH7PcDVh6OhuwGDolsFXOgFbK_R&3y-1Q$FMQIgQdAn}pv1JJ(0 ziXB_cM=A7yYajX0@=;nS;uNOl!%tXoEhHb{*&lrbq5-n-Cj8ZvIatN1Wey<&FEfI% z9BP@vDUp?#l>%!bLiGV!B~S||8Bu2DgVhk0IZpKp@rxZP&QN%+|JDcPdozMEo$;Eo46KJ>fw`zSUJ?w?U?BHRlpHUsYaDQ1Uz z5yf7IJN6$R`n|w|6x$4U+%WnmJK%npVxPnP2*u989Zy7jl&f$*MzLSuew<=Y;LeVd z@bp}FoTTj{;aHh%A?v7%o_4GZvz2c57=8o1!Pvfohe}oPIX|55?Q}3W6rxRLP1qaK zv;fo9Fxng9IWX)i zj@tsZY#@S-d_lx_s_9J*bwMlxOAKEKtsX6e)$zS(;8^X4=_%T*x}i@P7r>T~xsTyu zN4~Qt)(7sa;&I%vR2#%t#sAN18mHs`%Qfxg@1yvKl~(-Q`esAUm3DaJ;WYg9h5{=J ziAHr4+<92BtDxSrMxMF~&f@c;cl7XTEPiqPNnZq>oZ^kS~1vRrW7? zW&A3@VE)nfUDY}Kb>{yL*u536-ldh^DZWa;pwdb}SScl-Z5b;0S333?LSo5T49oT> z*}MXP2{{W0gTI_PA5zqC79y<9SPYqelg$g>*!Stda8~w*?q5(UYOxqH@L$(MPTgpI zDVQvVOq{-fX`*#bFjx#3FH-`QY#EQahrjUC3>+1`ojCx`QN>?4>ML0b-1SD4grm;LJDv zJ9_ZVA*x^O6`H=L!2F`mS5&70DRaVEiI@8+%TvlLn1`Ky%1#px zR-K0{!UKz;hj``zYduBkso9W78%z9)0k?BZpT&?pn%Gq9gIG@uLns7HWjL%87QfcuIXzE%rE-HO|Kf9`NeNgk!P-^DjfcP3l}RTi(xrzj6o}y zuUNq*>sapz7KE`k(U{%9+5Mc}!L&nRD;bh&ItJ2^vmXk4A44H3w#KiY2 z8I#43xq>mvl~T&}@Vg_|sG{Ka)2QL!5MgW&U{0v z-YT(?w}y3bt2aU<701Pb%MTe##e(g|DTI|BTDsa zmT%@4eg367g}=`H;=><|d;gMbFQ8kQI_a1nL7epf7QEH{f` z4`2*LrNN~JXTHzz(!vl;`A>YK-vZS!{B`F0oBz@``rYNmHy-ccKH@*kH~PKq#`jPE zrEm0G0=Q~$RwuuZZ!f=+ir;AcoXkEDs4_o>2#h0&2U3hIQ-oP7h|v( zGVrkqdK|6*1LXNiU%Q_OCW|5S9|x_WU{%9*h%hY{LxvAD1Ygy7?)V=f?GOwWLxw+N zl=D@}g_Tvx4e+~GD$zF%;UReAVJG}$S}cZ4JY$2lF9)Aqg8ga92W1GWvT!6YERF;g z!x@0F5cMy()Zom2HRd08Sm>MYfj#q&z6U_wb*qj1sPxB8Tlj6bx8_U&I) zIP2QJX^ng2t=~HTds}|_iF-o_eEnYP%P*9Od$GalD=C$XuT^~C!$J4Ao;miw_}7Rx zrklO4JZ1RBThnU~iu!r$=oxMMR=L~h)^nF8EPSH=J(>O0+6fO!|FvSr-S@)!yp$TU zxI*!xL!sVxR$iPo?XTi4V}5H>ENIOnT+d+H6JcHIB_r@@=<)JwTjlsLb| z)LID%_MQW*CpULF^U7Zr!msS?Q(c^BP2b->Af!r|bWA>f+;R zV^`f+lt1If;1;!RzxmpTOCz$sn_l>p?RIg+le^bG-}Ppr5jSpMXnOYkgy|Ev)&HUO z$cia-AEhonGN(z4+>iH$zFneLZ(rXp+r4&wV@l4`k7iB$ce_cgrv&sGHEG!27Zc{k z9V_+=?A2^hxd#h(kDa}v&)r+=7WCbC=z|wuu3prjW3{A``HjFd`{q^XUou427Tj#MuK0YxhFMeTX@aMVxf9qX;-I+lj{m?q= zx6zwo!v;?DNAJ?Auy?<|c<(Lv-c|P+hcik4AHTSjqhqpZVwd%4i=R0Nn+%am* zpv7BrHr;Lh>zcpDJ*$?tYuteNeydtXb&QS=vVM8)>Zba4>;H7+=@h@s@1$HW@q7HI zFMa&dtxKVO)z`H<&6ssJa_3bQf2r47A5D(E_>SuDrJsZ5Y-`m0j#~c(qf+AU-55XE z`1*L)BbhC;$8IT+TRq`U@UDt$Zm^|x4hQ> zec$IxHqNOy^ueOnPB%V!y2ADR`@Wkq+vnwX&u+c?H^1ulE)STsYrDP8*{UOp-l=in z)b}r+`(eq>%XeaJdqc1IU4D1T(Q)eQ$Ni7gpVhDBA@z0R=MF91{%+;V>gz>8g@Y4k zzxdnxV^1u6@Z4uFpAP)|amM=Ka~qDNE_}At`EEnY2X_3m_6tqEJ6faKnJGuYPweXU z#_^|Z`l#vedkn?e*Ui7Z(WztuF%jz9HwnBZa=FixFU}2yTf!~7PDm|sZ z?&DQlj4M<`T56K5RY=HEFRvNgGAS#g)r1sCQxs;=e^0a*SiQYQGIzSW{yU;!2?ES! zT`G&}zxNrvdwbzi4SIa{BmWvKrpMr}%i9b0hln{Axe6ZmF{a0qBn+;+sJf`>A=u;@ zF}{Rpz%h?6N4@Kafu~i_QZWy$r{Mw3=m*zVZ!g@rpjP(*=Z`pI{3JiOCpL!7iO~<1 zTJuxCOz$U-7~D5&`El+CccAY4l#~28FIRcOV2fZ_RDbvHj`<0I6mKur7~Ipl!&D@U zTF=hQRf#ZaJv*Sk{yD{kbNjczfZ~ z1oot-*Fu&%wnZ(%;AtB6?5LY1n>k`?dw{7!7(5-rUeY)INj*nDbqRw{nAqpPnRGbM z5d$>H^JtC`~`QMW&V!%Hq{XmL>N2X;krE53e{xPf}(;S zY&A^zbNa?OM@$pKxSs2p5@t8tu}v*&^VT`~2`0=Na4!kh@~Z_s9Q)5Rg!zDD%6+uw zkRt}V3*;FUG0y`^?16z|ELU^FxSo4)*7f#k3sjsvyT8}>grlF9gu!g5%7K3{_ zVmc9KI^0pK#_%8Ba>R5d45ni}f4KHQV@FIE!axI1yZi5-2E)kMrd{l2g?TzmP_37jPU%FTY`n90S*iZokf27a7(zbWN?cjEQ`6NiLh+smgd4jACd>p zwZOv4^%cj|7M7p6rH-)B0tT!a!cqs9Gzg7^r6af07nUL15+p47+!81(%eke2ui@&hIhlwau6P7G)DJv{5aZ3eZd6!#C3(Gcc zDK9KXxuvAAT;&#DVR^_c-ooOCTUZD_!cvP{8j>Z*+OI9HTNrTN@r7^V?AI1oO$@jz zAWIuuvoYX$K^B!npM8-rxE9D5Ts_GmJmX$M#-JwigL?=JxWEpM*TgJpF>sH>EUJ1_)uKWa+_Mp;y=ubMoGfaEDY$3zRa)u3MXx(p zyuHf89mC+w1M7FBbrfHP@U|d~qW{f+2uNit9Q8Fvwmhk^25}Z)B&|qd;m!hCo#%HO zrLiV+7GWf<9>l^NBI}*?-itNX+nhxhNvkKZ=y?iaH5-=cqp|jL7GWf>6^Pl$9SgkpWFp^epVpTww z5Z2G^|7#baHGs1SBWYOxt7#Q2{Aakvn#Ng#k+fon#Rsi&w&THoP@%P&vj`(;^^vqz zeckp2jdg;v2qS6rC6>Ni-GtTy&LWJYWtFtBTpFu>8Ayac7)dJ@tlnPwa&fylGad3Yx5W1wCyUie&H;_NLs@rtrdfM zl+jpK%RwRp!bn=f!OH3oXSNMVN5^ZduAD^}N$WXcVOEfJWX$1e8fy$^5k}G)K`b0! z$jaGQ^&^e7jI#(MX~h#u)q3NDvkx`a9?l|+q&1RQIQL?(uDJj|lcdgvKXMjfB&|_^ z)#j)gp{wg?tn%f_l|mRvD}h+*_`>$;Ahgn!eTyJp}VI-|AV(Hh)W`b47S%i_avL&tl<3GNyv953yVI-}I zf&~$!@yX$h+X}76oJAN(D@U-f<_q3@ZJoyIP!T=Bd^oJR`Jh zoJAN(%SJ4<&yT!kX```La28=Ctvm;3d>Y+YW8LR0!bn<^1q&in zhv7o2UL~|C3SlIze6VW$&{A*DWQ}FvEW$`yQ;4PS8_k8*M9w0Nq%~F2I@|s3BaQV6 zXAwrynnoQ=KOK5H5EW$`y(+jHLCvgH~;!^)qJ?M$*EwJ*^H= zOJjLehC~R2k+fa}tG16?U4M18Izp=!XAwrynn5hJABG11;;peda~5GFt(nA9>oDca z!lR9Z)(FlbjHES7(t46TBv50`;4H#OTC<6Tb1#m{7jOM~U1P1`EW$`yb0n>^?_61` zv5s*TVI-}&l9pvhOsvMb!&!upwB|`#`O{~7tFfx_MT0Ps)_h`N9b&nHatPeShFp`#? zSZcYdE%$m$W1ZtH!bn;RC9P#&y;MbGJ>e|ENLq`87DSYFdEve4i+&hb6>aRBH(_uxjJ$lm6wZXsl??B8;T9gjkprtiuyO{t%+E(m9JTlGaj5Yxv~lH#F7~&LWJY zwM^1V{G@|TV|~I|gpssfmb7XPt!>v>mpF?slGZCOw7jZ8A_T%nTCajttHY;nejTQ1 zHRUYANLsHEORYn>T(O)*7)k4ONh>|_qhL)dm$L{XX}#e>>n+YAjHLCZq_uC^-w~SD zXPiYCN$V|QVV}oPrfKJEL82f2$XSGuw3Y)_tHXtFJzHL51ymiIg2oo);q*f%XOe$$CC|&mYuT*BWbOWv=*M+byQ=0 z!dZlowBB_nS6!iXm9q#VX|0sBzJ2n2g2pP16CQ+>aLIeN_s}BFZLkjO39UAqMHoqI z6|vN{^3eKIFKes>&LWIduGPd+>o6^#!3#Bo)2K}%yz=PbfVT3a2oN(rsEIg2oo)<+In8fzD45k}Jb z*g>nD(E5tA2qS52bI{UQ4>*f3lGZ1J1rd5CswA{3)kYipULbkDu^p^hd*PX$#_Ggb zgpss%2o`$9XIS_*E*OQ7#94%q%C!?xWi5?0i?awLY3&j$^p09(h1M$0B8;T9Td;6c zV!1TdLCzwKq_sz|AVONDh1SoUMHoqIuVATK8q22+dSYKaBhT}nf>oR6aV(bt2N7GacDx?k5RA{PF>jvS5yBOxJuLUuwzYEDjO7JreJ zlbXt-6OuAAvXYg&32E#nZuot4x@|&Ic7n@9@?t_v&dQ!*=5%UmPL^3(ZmP{JDLvO^ zqARaiIi^lCZK*lAsmZonQ$%ihW^zVeN@|J&Voa(n!8Rp3H6bN6+cwr|GW;e`!ssb3 z0GX-zwgi_bD0M<|b{_u3kW&e>G~{LHWF@;Ky9A&I+t{4cq!gDvJb+{*{Rq3qb436w%VHkOcNd8gGFsEmXMGllC@c-j!QEhw zQ0tB*Vh1oyM5cbUIH$Wtpb!0caqh!&ggT@g{YaxnpPZ7FX~S&fq}uXwG9CK6nrs`J zo@#ol?4nB#%u>&kPE24Pt)WfS9LHPdvE+nG_9c)lJbPh>07~wr+em;!GTh ze&NQUBhJJjDjUX(i>5RpO`M{-5$e2uI77N{>bMOu$t?PH0(Rk=Mw=6gdA`jUCL&nV z>NqpWwFEJ7gC%q0MuM2Q5k1b0FGrlKQ7lbaypYa^vW#Rt+c+K1GLkiiCrFcmW92w= zX`I{~aV8G2hNKDDMdQjiS2ZakT}_HI(p62$NLMu}BTWj9H6#Pg$BK;ez@b>ROlngv zu3=3a%d4J=M+3;LaSSlCmNCH0n#BM!YZC*^q?q)yV^TVnW*XJ+F8(6f2`U6!R7CkuP^BsS$CM>32Q)XMKm^XbO~EVo6Prthic(ngS)4m`nXm z!DTK@fs#wir76;wOH-h!OLgmEnp3^LQ?TS(TIWrDnxk0%X~X-EIgSi69*!7~bJ(6i;T_x^O6Lq)&B+0l&XF0yi4*GkhUayMb0m>&aNvq8 zrx}ROpT9L-={!t5;W4Ws^;}F>0XSBT^(|lydEp0sd>zrZh+2{Q8A8$LM+NW#xo}}b z7;+&iupywZb)`*5x!4qB`)+$XdG20qy;qlvc9)w+;&p3Dku)9Xf`z@7S(G zn~pjoMB9Xfv~S-&Ffg=TXh;W2O7u^e_p;LT;+}Co^@DE|^c7PZEhFLjfqxE+ zA>i&`LD7Gc5!&&S6p{S1PWT!_gi@i0{@WnXhM(fN3%JJ|i?V?g;u4LxPGI+jkLYy8 zkLf@t0hcpeG}xa7%K+fY#!BLIRwT+aNpgpA(zY{_s;Xy8tu3IieIL04`^`7oi+pE#SL%S`tjb>UM@(1Gu2p@NdR2qY%veU55;f zY6E?^9m65qnLnzp4)E`=;lcp!o#L>YgmVnyFgWw~A=rli&L^B8TD$4~y)vd$fGdJy z7!qDr2#L^tS{Uv4S&%ru#d9pyGvN&W5I5CBfAawMvIqXQc<660;EuTQho8Lt$wPln z0O#8g2oTK5TLaR9IEH|5GpoNYfU~&qhwYK(p}$Fho8`tI=5Hlnb{cWCZmBtD?Ry?D z*Nr$s`=USm=lV5pVuc{;#fiW6fazhxIq{dsG0dZR{pAC0jvIg2zN-MU-H3CNzjJ`O zX2cothwbqXV9Ix9xpP(C7Jvyi;tc+9-5SC%%%gdEM*(h}8-F<77I^6IRlu!u;}6?+ zA7IWKaZc**0b;taQiysnlo#u-9$;D-aZdbM0W-{qGx)>uPU0A*Y+iq}0JqqUKP>NN zz#K5*oaFC1V16^=4Ee+ImhGx2b>PAv>cxq_PJroU#KHGL+D2zEGTd>$lEN{oxnZmblp>ZKuIS{ZRp z>cz@2%p=^L)JqVU`x$U%^^ya)7mT`2%JH^`{x$<{ryGCRZs$GpcNK8A-1x(GE8QJ# zx?on`I)Dr2SkWGa@}j?9fO*b{bJ7p;0W-&lbK-9mV741^PW+t%%rzs4EdD)0_;%^IJ_8M_c{C&eQtR&{^(JjFJ>Bb+<2UU8ip4ea0@e8_q!d5vcNwy>{5ud|)Iny=ZdI7Gl11>JY=&uCemO0?yxx(Nt5pb_K z;2iz+0o;8LaLIt{8U;69h^XM`4{<9!zM zE)H-F9dJ+%x!II(z~umL6UXB7d4!YptqJy@9Q--v54Zot9^g$>IB&qs^8i;8a0MRV`~bJu0q0mRzJPnf0q0mR=_P0j$i;RsP*f0lgG#BWu~X4r>3-oQ~a!) zDJ|1-k|v~1&dM1dKRPcxBL(i6DH*9L>>n3#8@*-PDkVK9en4tQYEo`$JpPM-tjtvS zJa#Mi7cp>#)1{&^8h`G#veH&5u;bTvv%j(F$vIiMS!uSw-~rDB_RqGZPe`8%pVbfS z2_DijQghVbxG%!VGY(cr9|eCP8-F-FJjQ-8#{S4+haZ@}c>~K~wV%eHMTQ?>hTpsX z%3?3geoGvFHaa{3f8HA36NrM#N5LV3Gn0>EDHs$~!CDX%RKr?e4GJ7cu0t&LCzeIF zphS!PB6*GuJ&M0-jX&*dv45%e9Fj0mr&Bk5PsE%tA$_QyzAR28w54e-)3I<(NT z2)6*rzS3|@3#bo8>JhNr$2+FDut%pTui}8YD8Ea7ltPSOTJvNXSaySzxS--r(V zQ_T;k*G*eW`Uh2nK|glxpLqdR_`&dqeZ>%NPJ~-zz;@pl`>7ToUHm3jhbj#HLahvd z+3(zp1q`nhmH}E?X9o!fpSh+X-T|#i&-Te6yiyJtY!+`@pUWA?jLZ#TOEPVGC5EcW`k?h|D{rF9?Z zOVoJL_W5IBghoS4G>x?{$%c67(X=$^oO8f6{LJ22%l_*=eL8mWw~Z^_AKCdx&aW{H z7P%qYVTCsQ+S_-=Ck7Oe7s=&6tbYw9}#uPBMLi{0k zi^ZN16o*4BG9h79Q4c?xf9cyl)PoGHq^YA3#74p8qqKqhYO*~CvB3~4sf>jfZbyCS zd#Bb>>Qs1bA=^y2ZzS7dh~b{pM|lnI1Ie}S`;*HWO|y#8_RGftHM* z+#7zT9%eO*{VolD>NhwqR<^(--uxfS+)K9lmSSjW@7vYYnFW);UdnP9Jc4(7UHSv2 z25jQ9*egfjoP3Jhfj5|%M!-aL2__=y5-^q9g2J&&B*1)yQJlBpgF=|8Huz(0gtf!k z=vj!dHW~-9M7UsrwjZz*#8rqKOtbSaOTn8v=^J8OBCm|jhX$ZWZrE)!UE=WhMLn2G3@@jS^p;fbm4AXveY^YnEMUX zc#J(js>y)42bh&$kg8_Q{)i8&&W8i$;z)?J_b!d&D;?sqA9>lzY=j>Tg86zlyykUm zT|`Ti9c5wazhs*hWB*$l&{lhBti3f%Rx$Rkc-80ijcDXep>~Su_n$tQFs|!idfXPs7o~uzFLJ?jXlhoOs0{0DaFqQdW<-^@*vTn&#oCef{xxVp z?P#fyQ_i|55i$}1-Kj9|w-~!mP)tGZz|g|jf-XTf7f}HN=FEV%7#8aEHWW-WD(XFHnxv46k=>hr$dYlX*|`5r&L0jxv2Ac?UJ4;LnQULfoq4$mF_xDg7)uP-4r1d8 z*A-$67X>jZ>5dS%REVV#E*oO3u4anV#Sj}!sc%7yd7&L@>0I4c^AW;^7Sux-^sW#>+xi~YB}2=(O2)mL z3wCMO$+&%U!47nt9ATO)?c4S<1#FNWaQP_h;m)=a_%0$_`tiY;Z6!ts+eC=5tpsj$ z7;Y)V*jC~#Vf#14*j56^I>ViU7~4vGEo?aI*;e9DVJi#O&$bd(A;!4;iN_XH10Q!_ zmA(smgI#gJ;S)Em{Dpb-*sH_zp%AvB!~ABWOLbf_W+NgYQu(S*(HP!*iZ!< z3j{$C2!s|w*-hO|Hbn?kG=wBTBqWe*Xo>|9#)Nu9-diocn&B)8|Zms^^5et2@hY(jYti1)V`Tdz6Rc zSS-&9k3Z>)QD)L!Zut`3$odpe)}#5cK^a)IfOPuXsZNb{SEo9$xv>qy*10-0$}QK| zr}n047xj*OT#9^;#%5!m^XJPynos#`K{d;}It_%~tgGLJ81L#-6Li|g=8MXO(KwC$ z-IsY7>1?$5^y}lp@Xsb7{MB6DrJsl2-Fj;i{+wlFOG*3 zy*2N5Mt#u=p=!IYgGV0aj*Ih6$GK`}8sn(;<4V2xS-;uAtj8$Ucj*swIO%5AJvffz zP&!v#`+I8^K&`Vg>HVW&lA`$vkW1n-QbuxNOo675BS}YmO9-vm^Ee!(EI$*EayMQNY@yp@{KL!#cw_ zKI5&WM#8lXtiJ5aYe+o~1~G25;4rmvMQys}^3Fb-s99N0QM(9Tu29!LtaaRSBCk%I zJG1K%ydvGzZ*XJZxpDHmo>maUsKS`NDoU!ZqDrKSbJA3E9a}`xNU2`Rl9#e%mNHN+ zKV977<{BD^kan~<(zz79u^3Lwc1#YP#Lg_rep&K*6X62Z` zS@Ku)OSgan^~m6ET&e;2;<&V^ipa`Ey&HXD)iNc!R+uIe=eM zxgg2{`~rVG@3TLN%Ppd&0Jful@_*G#37>muCjEvLaXw;+*lbc2_AVCVS$>!D7+d?B z{S~%m^|j+_G)cv=%I1JbjTL2lSsHtQHMsmY?DqCMqwZ55yS*m6Q7m2?JM8B0#`^fb z$_}~Z)=UYza^$XNw)kHB5q$xzEW~v5+#Gwr|6g0E7|+Vn1u;5`*w~|>T-FEwbCB9x zqCs;L!%ar)Mi$FgWph;7Jj8f&FIHuhD(*JK_zG9-=k0Y zM#x+3U6&w}Qe&;W%@a3hYsD#HvDVl1op4Ivjls3Kc_LRJ1G0?En%mnUAz)zL*b{Qz%R?3S~`DNk3&Zg1RMRl6`cj%C(Y z;CK9^X`b_#fd(8?t>9tRxYu_P?>x$BQFVuHjjZn6aw{AlFp0Nz%N|GUUe0WT^T&#o zBw_y>>rwcB?Nx)7GZHqHh>Bv<3GZpA0z{#8Hyb?=$U2@)%0%oI*4-u{#s?f7bY0kN zk`MbuEcHe;wiGd%!EMq?#CTVwt2w;;zM#h5MQkKC8}ne#wQR?K&e)~menX5OImnM& zGGlZ=Y#Fn0DfVtA8;lsYn}8U{c@e9^W|OYLp5y2=gXg6fF>Y<1Dx;;_M5gaS#KyDO zTNJ})lRj2s>^d^m6YNq&Oy$OHKuQ_%8C)!vf2GBRgLj^K_C&5&Efk9bVlLJTm}jR% zXN$|hxTNljo_LsaxaIvcKAOAxeBXdUvP%`ptcT&y;k(@46|he1;xJDKA=WL=!%6h1 zik}q2y`fEAreI+L3v_hm$7G%bIVpNU23^p{Nex|6!T&jK`3tN7_$ki#C@)(g`rfLZ z8Rd~bV8<_99iFjTJtmg2V`2+&Ozg~!2cGY^WvuI1x#V4ROx(qRp6ZwQG4Y(c>S)FK z*ji8Z3KF=gS6q!Bk0^iT&EXb#e?_l=qeMq_8iDR`SLM^h`cU3{BphQS8Wq5g_~Q`c zC)RYeiJwkW-{q4bO^Z{p*`$ZD=Zt1(X}%7jwFK`?(TMTm>(z+486y!fKH=Vg7(bg@ zh}f&xY;5EtGF%P*yI4#t%K2@G99-;TYf>yhXxTVbS3=kOV9{aPzC4*ue3dEFD<5RS zSO}L4qb}pSL0zq=bCo#xVwd-7eQ`_T`&JCHzc~mOc*a`X^3JWc&iq;z9m^Yi9hJ+- zTWwvgZmg5*-0}5ge>hhT>gu+Bza(Drg}WO!?aK>*_n%6Yo@-y;3dKmWzd0h_TQewL&|O=@P%Z`IyDWCQl0V#qvAY}Vh9|XY ztcZ12o(Zowsw{W)cVGgRW&CQEGUUX-`VBQnqwTc+X#36YA}B6);_@dBQEFyJC>PFt zVmj!2|NNGdSB?_Z)Nlh`=G&GeSFua^v3u!i{uN%ihF{IMcXiTbeCu9M{H1$*E%{aa zV-3xd<(xg?E_oBKW+aCDUQU)jPL^?J1~B< z`YA0iM1S4G^gc#ITgpGpHeV|F7dN)-RdgFk=%SN|sXT*TnXR0IA6s!Z%9rJ?>5Iak zPlk!Bl{lGmB#SGSxLWzG-;#Zo`6ZtWd0yw_*rRlF>+RsyJn|>BMxRNuDP8Wv>7VO5 z*Oc7r#VyBf$i=(p?KY_wVtoA5i7OpdZBjn=xh%C9F@71Z2C-{d>R#;mJ(EL-aom3q z<2ag?_$5U;7EXoSCUr-Qt~cAHe%N2nWHfW}*()D0K6}kZ>;r5zsRDaGd(m-_-*2G{ ze|(0d%YA%?q`M+~hNRMPYdaC+N8@i1Iv=q~lM&;x zD#WF{A*P&3Rnu@4tsQ}~ad~WQ^->zvID=y8 z{HzWC=roxf@59+`XR%uF;7Bi@@rhNYZlR#wIyt=wgSJt_bb>MUm@aOwRGzg|eD8W2 zHk8ZO+CAHf?n`d84zIY>U6XD*41iR9D;*(e@ToS~JhDp@93k8#*!YoieI?`}Vg&`Pe8 z(#a-u8q;o0+o@5EM{T8qX^3zZj}eQG;a15KVUr>Tg-HU;cRB>hHW4IezjQ(RN%xa} zB{$Q5KhtmN6d`rWX(M$S)S6oRVASq5wUKjLO+_O7%xZ!98?QSaqZ)XG$+|UfCN=+) z%BwLbmE%axV^j~EL3(4+^Oazx`$;5H>3L9cLM@=#*DP?oq?6tWRDzja8X4%NxKSK7 zkdKFZ6gYlovQ)CdV^ofpnT+@AaO&6D5J;ENP6Rp!<8{Mh#Cns-y3uIx;XC66VGOIV zs8%?ZYK6zBcW@S=D4$9&)Bhe4wfa%?QqHwJ@EF81k&t zQHnyr?+pw=mUxUxyN$`ZwY5oYf5exwQDO=Ti*mrRR9YUR(sCA|w)*u|GyOCVXr)#3 z>hr*PWQ*%1ophyA31)gfN1|0~-PON8_|J~BSUTC^F)Hh~OvZY>D5t`pRF0!u@EDbt zGYIu0HYJ$pK7>TAoQht(ea!;bOFHTLtP;%h9zh~2=Wx3;94$0tOG{~>FGA{B&{n!Q zCrWBRsEuTQqSbFLcXKWDMzj*>44n6F9-~s8U^0t63^R5M%-HxH$Y<=wkfMZ1h;Sy4 z5%Vu5^RMr|er+^aW$+j={^g8z;Zi%y@9l7OXg9FUZ^|5X3aLtwL$IOCUn!e!2gnO(p%hw?m_>f zZqj>q6S{{B-MpVFQr!BQdX}q}1mqE1ZGvA{Ul93X00v z2gVmV)TekI^NV~lfhaF5n^#!iD8VDaj;W-hSA=x+1?%DTp5?t@pu~sI>(cYSs&ag8 zrz|g@zUA+j+B5%ZSYVGAhnCN&q?Kj1sAOJVaZ!O|&P+UyT<(Zj&~t&RDXFY<&Kxp2 zr>t;ZQE5ea@j|uuD4tmbkm9R>FDfl7@-1}qtZ)>U&PQeWX6BVRN($#Y@U%0estM1G z5+GrM(k@t`dA<}A5`Fs5F{ijDXhD+!MT6iMfec z8QEEx$(cE0bH^u-Nyr+TtQ1bIUS4`*PgNR!dU4*2a!1c%t?7djuXaq&!}I0^4qvGQ zJfQH`SY!;PU!avZ6G30eQ(_xiy&zSZ4i3)zvhLr{g>H zzH;7&3K`uv=2HA>7mZee3icHS9T^b;JwVCa1y?01u&`v_yu32U^wKhF19gmwiEnyQ zN$@eRg0)IfnjiIUZ%`eKw z2or@%ruw+B;`Pp(U5YWqYDwuaId0F`v6IH;Bxfj!lZwil(2PNq^Go5qpReh+{_x!g zT_0`uCgH>Whu0>=?(H(I|5g2m{PAhjnjdaH@%*8liyrl@T9f$qw0|?>kNmLv(OZw- z`r2D(Zu(>Mo&k|_Mot*@<|~ef!`nAqC530L?eydFzatNH=(}{~r~~u8Qx<;y^rZWa zHj7*P)ZJabK7HMtuOImN*}E(yd)L~QPO?4n+GoqBb)Puyig!=Pt}ot}x_{^QzrS^D z!I{5%<$L#^+;IHq`|ls#PHK6$@QpSPCOmWVx37NP_S1#?9)9h+=VyL$`=66PytDth zV=XT_@y(b)EuLtf@Y48+mp?TrtWCkP%i@x!M0-E`{JYQp?VUT!Htg}*DW5lNe)9Aq zFEsr2!ki_uA_f&q$lp45{lddr2VWL><)9I(_bi$4*e`94P~Pp8hB4zFk)h za!viud--i0$>EVBYJZ>d$-p<4dY|~vw_;`67V}pooG5zk`0AvLHWg2R!1-^Z;# zdloOdE^$YAhx*9A(=P2@dm#UF*;{#JeRP(zWBi`Uzvk^PA^Epo;yNjM<2UYppnc|F9k0Lt^mDI$ z@z9H1|DC_)?se~7Ql3BP>%!Fd-tjGLPY?NI_Ux^$)T|Gh|UFH9}dAp|7yy_`a{?9sm{F7RFgIoE( z5Z^JHpKnh| zcAr(s<16~CWZvx5d>o8f__4?3&NDl{i~jcCO{urPbo%1`X9s@kd}ZnWQ9t&tTJ?L+ zopr1Jy0s{$arB$7b$#as=bf+1qbAj)J38H1GN{!C~jv zU5XBGov`0tTQ=s4&zCNG$}_L`FK?|Ws&3x-k9VK3_1L!fr)y3u_~6QJt;SwI?qrvO zk)1oNFS_B5*AIk_I ztF-m^VVgFzyDe<;{dfI(ZSSwQ{`|??+mrtLbD#TGe{+1b@4YF<2VHsnCa)Zse9@}G zyCQ!qesl8Z6E}4$-u}?uv^5`0sX9@VQ0b{G+dk~d$#3SazU!NmCl?ov@qB%z&by$h zzU8D&SFL$|%ah}>dQQLR*NI2RZOzHN<&xi<-Lie+b z**I_V_;m+fu%F9)qWJsY6BnL)s_o!wf4b>~r~xZ-{~UGG>2Hs|e9xaJE+2VUJJ)Ny z;y!MC=#{4nuUG2ZNlWj3MFrKe4G-qiirqQAFwfU7CT6w8vP4Mmm6Cq53y_9qOBlxg zJ9t>;!}}Pm`}M*98+dfOW3{}j2Z(=kR-*)dTI7Fb!6hyQfL|`5>&QyrlG~NP_~jD+ zE8xu}|8M9~Nx1(w%Kc~AU0{GX{us)a)k0T-C}rB(MbiT@%^4IMtsAPKn$&Gt(M2Ir=0CQ^4x=g7+UdKEp!cu*}L>R zTrM)&qP4KqLg#xFyLs6tEQXC3S|wX8bbW}Pm6>yB?UjKTT0dJYbbXLYcwNIYe+FXc z*)XeRDfF~KY|P2Ojs;>U#cJ7tJ=NySn3q2c#Ml`o273w>J)c9?jd`XkNLCA7Q>NBk z|Kz*QKn#_}YN2a(Ok;}!Qv)&W7>2H2c0;VXYuPt}nDz`q*ZE0Led?5Z12J@+)oP)u z;*{?j9=;TNW1c%Q4AlUom24Xrf%;nfqxa7w-1_WX*LWb0@g(Omy zbmZ!!)~aNXkVvY8?gCS2uS#wbk`Ah5gOEh2k}rhBu1fwDl1{3m7j=4sHmbxcBpp>r zg^;vUCHDwPTUGLgkZ5`SCP2a_AlPaN7EipKrX+-LRf5|XEVNQ3*9b`qRpJwp2vu^o zkc2S__0`#PxE`J#NQw(f43ZKJMC~5!%^aj4NL?67hA0x6W0+)s0-~|QBykFcW;P~? z9VSFHk1@$$x(7^wW&oi_h-kcXmNHM#jKm}Z6$y=WCK;+&r`d+H6ba2yVY)A&(G?7< zg|ty1FXWnk&-J3l7)Iw6vk^ek{h|7k#d#X*2f<<(oh_OXc@7a_9%CTOu=FpovogXrIc&L)XR@)tV+RR7@e&v zbhdJa4qm6R-WDu|(b?*yv$ZK>zEfiz6)c9)*`lj~yj+M#o6<`!?x5CT_ZB3>7pbu6 z+Y3t~zxI-@`ZHf+T_;!!qqB7tV^Ke(krMyp@HaHpeS*a>x^nf=*(zCk$@3cPGr?jQ zovo`Gi~0uH`fu&JuQisPmXin!qq9Yik7@nT_l`S4W2Flg!{}`FV=R#@kw@kzwGM9; zVusP#>aVkP&pT6RXskB{i(z!OXg1|JL_~V{_L0$TR9oV9AX{_k+Y8GkzjB?8{@@pl z)wU&RlGwZYdQZ~>A=Uc)*2r6vG}cJLVi;YyVi`;6^W!fX{+z~|C0GojD;FIB_&iVT z)#=kC*K4e`g2ga8TZ47BUhmkqSYy=-7Q^Ul(E(Ab!~Bi5Bbx8>lY+%CI$Lz8)B45@ zJ5C(eSeMc11Omh8Yz>1{tHTMMqOvqrl3+26&K4bxHCr7f9Q;UQ%@!<%(b=N&HLVU; zbbD&N#=2Lq7)EC+UT5pIEd%Q`)`x<{Fj7CiFLsV#EU^@m-Y$Q77-!`IgVSXe7)F=F zk&NX(QrfD$_pq?VFuEL$Vl1Uc(a~IEMbYUR0>kKRjfRvT^{7YfkGN^G#u_SE45PE< zWGuy2`=MQSYpkh)#V|TsF2+)3n@LYieoW6pS5Va=FpSPtDx{jN+keSeud&>M#V|TsZpQNOQFtnj3?LK<7Q^Ul zd625vioMCUMPuD2SPY}HmBv`gI_l$`zCYm^D>8(zUa%NOXDc14nysCe+2Sh8DaXnuDs8W7tVY3N7@e&Qovp%yE81$TKD3ZWU>KdPOh~nn(&n=-Pid?Pg2ga8 zTUm@nS)uXu;w}4jX{<`YVi=vR?DN>#AXp5evvrNmR&mdm#hR@Hg2ga8TVu{+t3?|m zA~1~3)>ufj_WC#dct6cntY9&W&Q=a%Dea}N!(72)7@e(gI$JL$HXPS%$%4f&I$Pt< zW9u!!Vi=vR2|8QfHM3`Hwtf^WhSAxYcph7A?MOsm7@e(2kZN@}#NM}!W^0sSF^taE zWX3YD!&!pGFgjb;>TE4uz1VM5-Y-}Tqq8;TJhna(EQZn9x=v^7hS)rhR<09*#V|Ts z*E5!Kbm(?^>=KRDRZNo%qqCK(v(@{bo408!uV68Z&el}b79!G?%j0%NsB_dp!D1Ml ztvtq3#&X)IM<3Eyj|&#V=xj}6EdRMTOtrO5uoy;XD_>{pjlwhYHP+99#W2937vYkC zVgc8&{l0}uiwvv9fqh^Y4i*K5VX;V9(UFeAkIz{g8Vd^q76_wf&49#eQMA7_YXBB{%D603z) z{$bekp+vA4h9#|lq%&e#U&SQ>iDt^czB(6DtECI$p>?ibSFYvfBcYiv`cjlJ7P=Y> zuT6aJRgHB*un41PLA59a(eCJUHyTQ*v8yP12!zqIe2`czEhrJ;Kfesc>4n0YCRl{g zv(TZzvJnNL&HGpN*H||S7Gd3e{23z8mm^Y2%~2$ghZQLI{(ywlM*F|`vi+Hde$PwYKc9C>!S~2a4W0^ z!6J;Fbt5EJi_+r~W;}&XrLe*}k|w+ljZM$G2@#ivEl@aFnZR_j5QW}3bU70V46{KI7YAtqi5X$iB_(e)&W%->o&n6jGncGv0|{N zU`_8cLSsE4SWA$iXDubH+7GK&bZw=vz7;IO=vm7cs~h$d_D->5Oey91L$C;=XH`OC zwTvSQ!bR8p^{>Y2)rm_9qh~FL#A+GJlcnb>?J%p@$`vfa=vk;Tu$0;F@Y?xzYpnYP zi!gfD3dW-I7YfU3E;*;M-WM#w=vlWyf_tn)L5Qo}j452n;Yq7(J^R602npB_iDUe$9&-Yr0?&M$ftp5~~GG%fi-@Pv6#9j|moG^eh5iG*!Sv8PYEn|p+aQPo&QJqR1UW{=~ zfiQa39gtWp36zL%y6Sbmd48;55k}8i1&P(-CJMsYQ)``?t=k2QFnZQ%NVFbx>_092 zM&%a4B8;AeX#%W1*i-oT*qLiITSo+oFktz8>G@7btQPv#vp#ggd|xqpI{%Wg*q4-+ zmglOET?ZsDm|c9H)bfQTzL|x182CIG(oj;0Z%LnD)qFe?Svvo`Ss6CO&rEJ^(d;?7 zxrJqAC8ZMoL$?Xb=ah(lx%gX9F~{#;5#1l;(6M;9Fn?xFY0gY?@F|4!NONhv_(T39 zMRc~m9C$xep0Bh>pkU5dT2Uf#%ot(l6a4YiTz$=J8rV~@##E|9!Q;>7=F+PGG`8^I zthqw46p3iPm?P$&oQpsXSfTNq=gH&uV zbW_U36vHO*rc~>&!D>s*hz=dBpPQq(?tuY4z#PqWhl&nTA%4dhcGL?}7Xh$fSq%UN z%VhwNYYZHy0YI)X1YpxeW{1|Mi_Bp>gMnkrFN6O2LI84&fukpg#t?v_$fgHzb&((n z+yv-+s@Qtqd}=sAr^006pwnQMu2Wz*py(GEI#uUKD(z@mep9V6(V<|u-hm-ul~ED8 z-a!|jH#98I?~n`78yc4D9d-eFL&I{t143&IUcn)Ph2{%sx&fhqh33#2MC3U%u+SV@ zlL*bBfraLw7tnwMLIa;~IQyLpoNp}q!*uGzF_O+)=D--+Z!8Gxe!j8%t;BhCo zJ*nwg&e1WdFxBNuawVlEWoD#akh0`-XHsf%dU|$3`UUY)lbmVZ^dzr0)vfWAci~45 z)?Pa2MbYw^5`6@9cF*7?e!R1bLs-jG1cA^`F zPINoz)D>3QYwV*3tB8aIXHt4bW@18O0_t9Qw|(?r_Hw(5N^vS&&F|d&Y3EIZj*1eW(k~LyoT({kN$J@cna*JEuB&-Z zN^_>UJZ^Uy3ZZr)tv-1kQIEohn#S`u6EoA3k~5P0I$sF9At`C;$r)}mKYy8BRT!I{ zkd}~^nU(3p>+Py^h})Z<>`hBeaq<`5)r8n&Z(@34N|wioSKL+U!1R>N%=CoBbZ1ei zDjbxWl$w>9o$jQ!33y2mG|b=q`@hvX`ZCCge)g}lU|h%^SV-8iEeL} zQ+c;uO&aP=OG-<0r|=X%<0(nbtgK8=Rzi|rKUd!yN7qo_!Dp4MDjb~Qb!DVvCM9!? zsyqqfG$AF!foF`bBJJN_uj7YHGR@mmgFqdUjf>CnGH_ z-6eWU(3kR6PD+Y1H9f(dlH&23EYz3Mjs0Dlu}}vY*%@BE>+e??{AK*ngMFo=2m4*> zBQ2^yjKlQARCk&?Jw2dHtDt1BGs~5c>PboQ(;h-qCuTZRQoI@Ip43FGN|kw(7OjQ? zX$H}@=~=GiG-y!Aj$bvX>&8N+Lgk@R)3Q?1k~1-*tGpB%>!SzL8~LLLmrfr&m|wEd zGri8l3~y?pD>KD8Iyy0>T-kYI7EqLSX{wn4$;laMt`twYbMz2Zn4IQJPW5EEQ?tFA zZT>F5p_t5RqRLB2bb35Vndo_bbDUC1JgYjsN=#04rX(bxelfDu!WxNwRE_9ydR-X& ziT=%*EMCm_BZv;K^3YejNeO9L8R;3KuV}B~tDr=$GbPoNjU$lXw3np3oFAawDMj=j zG$hvH7X}QCiy0C(c<6vQKOv$6Vq%628RBpZ95x_sFiV;mQLv(1>h;yTH*~>0>!lWc z=f(g1Sd!55P?7C;n!1mO!qX6i(<){}E4O;t7w?J;IHweq;Qy{D@x!ro!QInt*eH-$ zM^yGyBW^h4eSj$xIJ!4xhD(NgAut~_fx}HXX)iF!oqTH$eX}9|4tLA{tqpi)c3*;ggTNrlf*I}u7`hI3 z+5CeUt`>kxP?!T$AcW@F%y3Ub-ug00dJP+eVD)?@()IvzR^Wp5gSEifF2}nP*eC?E z8-=u80>gmVndOh3s`x$xTm*2Fx=K<$HVVP=M|a0(1M`Q#1uO5JP|((a@8@Y@$DQMz9CcL?TsPo0T_H(_sKOCwn3(B%6}ZQtWNbeMV{f6D z;b@4*#^AYeY!uXbS>X406y($%Spq{i3d~gZbDxaG;|y&6p5c;`g#I4KwyK_ALTDA zM19u+H=_xCG?i8X^RN+TQh)CPQ*Xo>>W|9%6EG)@I1_#CW8nrF8--xyrTmQqW}Fdc zqOTm7TZ}l9{5>o%%rJJr+T%swHa4M;`rntpG#GIv`D-}{eE}PVVCALyiv=dph%?cb z2h40E&QRVC&?gHF*`*MyypIC+d=vVpJ+_Ca?+4(HhM=$2U>x_cQBdo}q`WR*GK@Gw zd8z(p0du1fXQFQ{Fi#nACi*rD49g&P!Rqfb;J$A{UkC8d0n>H}*LJ@0_6H{3h%?FG zBw&h+IFs_;3d~(boIxMu?-gJ^GU8119RlXK5oe;W^-x|`Wgo2mx&hZ$VAXmt=%eFX zdWibQ0+-u_z8L6R49ts0oJo0i0Q030XUHG*zmvc;AI3|omcv9}4`BKmaRz-<-VA}^ z8iV)0alqv@p^uIqw}hxq2JXHP^t}+_2zWVD6Oq>yCs6T3t z3Bb%S;!N733YaxUoIxM8#|DAnISk$&ZvnSC1bsh*sP71HCyo02-t3_KPaRU;l>xZGdcGLAdqcocJ--|Rj_P@12so<0%^~3I!0ibE*ABRYA>cX!cOnEF9%`3b z;0+7^VAfAZ0gz~h^Lxscbda}{r3M^*P79ZW`X?o)xW;*Nyq<*N-76}J3i{z0*zO^T zGsccj9Ft?fW_gn`T^Y$^yF2K)-ruo3fvrH|PpKykpHfynQ`ij+>`Myp8BqTGuaL28cKr&9%BGAdEH1?Ni>KiF{487*E$>%4 z?FP6j8PQgn20yYm;TGC%{t7PQ-0}%H{5p(eIHHC7HFz_JYgf0t&n<^@$7paX zG>mzj?gWern@z$K-olxXyE-R2$_uA$oxRoGXvbKlItJdZ-8DYA5R<=Rnwht1_+Tdo zrQ|9~(;Sm~{k5BM@-GzARF}w1c;#=Bs}nnWs>enlvlHP$+beIXg8Q*gknE|x79QcR zad@g{{S|xEQ(gX>r~1aj8P)j*Gpc9p_tq4_Gi>?pjOrWV0X`>s0r|3W$rTbDRat8@ zWM6G~hCHGcj+%ye+anM^nsXAb^)%X2$>3lE6;Vr9`MWi zzy5ju7v6(;_Tbv9BhNeh?Nn~*4X^Orlepq4Ta!@R@~qH6x{CD*k)fr7ok=s$tQ*DIZxfswhZfh2f1ukoxW9E z?v_)cP=ISaawdksh}FEn)v2~4uTu6D521>eIE4^-Ex;>@q!7Z7EHx#Rc;uU*nPzsB zR@Kv%8;-oT-nNno-H>vA3{5%>-2*Xjs7nQ4dZerj_AR zg|<4KcV1YgXNPm|33oMaNsfPtn%BPUMfj!C1{)2rsWiIaVG>>~nNKu$M7w_T zJSq#U*`#X3c)wnU*l27v=0YT$rM{!4ey*k-LM)S|HmIp*5hGWgHisfVD7?)28!wz>0@wnbL{)#xkq zR6C;@Hzmug&${Awm+hmm=!)I$lK-liWRW+!Fa)p8Q2RI^fV%P5O^iRGMBWkqy*db~ z@}m4kqWDjvKSSQ{mG@MhwN)&1RW5+9s^#}1hpx(DQbj8WY!KWE0i5Y2#j$z9zT#?X z9*jMYoEVi}6Y2EG5AagiR?6XZKXh~VM*}c-C)DsmSo+YUSnJ0lDE6ajjwle zRC4?>YUHx_j*z#@%Cpvr8=3WrwmQqL4VGU8Seu>xf3Z(q+bYjCuNWgr{{a5S9*A4Z z`rrx|8C2Xtl0E9(NwRGvjc<>W@4CeC62|6{%#+zWfXP)y&MhMffx(O;F>Jb5`2Uqi%mgX64!N3Xf=g8dZME2Kv{( zsxSO}`jTbV*wmwk!rQgdouf14+jzgBYU?FXF_l7*(VPOH<#q!cLn0sW@~rv9qthK)7I9a| zX)IQN{Wum|iak$#LXA1OYd_3`7hPrj<{s_PyHIc4J)QnZmxC9A1lq8rMM=94|#IDn(mcvk6uDFRs&V1>fwnPVAa};yNtaHo0nC zHdozY+v!ce0pqeK)d9E3b-I==4Ao>evnTDw>bmZ5Ga&+^_St4N2^OF>V?K}FdjvrC zd4Np(qHRzeQ8cVNvyK*f3MUY8udu-}jCUBmz(K!x(_M4vHn$wfdx|`^vs+Gguv%=~ z8vh2Hm2kW#|BrGFnG~={QlJC77^Z{qHx-+WojOcpF{)8IBNS&j z!YB4HKCjS8iTpdALL3CdEk757^$GQDcij(G_fcNoYB z>D9JT)G4p=%B#p~MonsGPt62JhIOmQ`UQ}Qa?*g#S+aM41Lt16MyqNU(D@0UcOKV!VY>z-m4xRkQU5 zyqbz0=~PZsSYzLS9Fx=fE^a=B#Wq$i2nQJxE%_gJ3is!3aV|kCcHa20jlu!C11E+x zbd^Z5zZu!y-MDGEH>%NI^%w+hIszV14gu7+)**xP9aK&4(D>r2$c1?fwdWvrO-{5! z!Fy}acJH7UqV4(NhGx(hc|T`W9k4H_)npv2b^D5Y5%+5{xxNv8rO|zP)72+!BTwUv zqK$qyLRE!%N-V$MrvkuXbt~quI-;?ng*$#{#j%Db)aCgO)<1CC+v0u7Qo~}i6k3Ed z*8hRkN*6H9 z>$K_x5afHQiPRHF)}8rDB(Hm3=ku=6)wf@5SKox%R>s3mG=*i0lMZw%Huk7v8O!IJ z5Gaaa<%8#Ld(G?TFp(o$qSpkvu0L`o5QdsLaz~&{DSB1yk&Q@oLFHuh1{?F2?8HAC z^Q(LvliiH}g-muI_QP51CG4lOSS|K5Sd1nqKJ>^B{Zz&!A8Gk4MyENm8IHQ_bS9gk z%1RI`VzPOvjGogfW-{{l%()LDR?1{Fj=1a%#LAfLeO2~3VmC7xeIq`P+5HtUo_n}E z6uIw!7|(q-#CYz9AU2aR$io~z#lHu!3a0O2#JJsO5nI4yFRLgF4#fm$cHF~ORix@q@!fPk?sJFTx+L-Yn`5gV&t6pKiyVB=y&r`gC zEEQpuH%B&B*pjMCB9U34_cO2cBWTZ(ZCq_b32S^8P3aw~-SRe1%?K<7aC*|BK9x=V zN!6v1UO9}xlH?RDw%|*9JYOBSWk2)$ijG@u!-@^zjifglcE_UJABBH3_$i|Ow zQPW{x7KY-`<;*$qd(lf+pez5&-J zxhc9b>Wr;Tu700Q$+!f8)gbj!Iu*hZTJ+}LFsH4e`3ixCJ74_AplL?pA69;d@l={z zikYk)v2iT+8)Eq^b~$>Lm&JM_mcn9Q#L`)83St~rs>T*0#u>62yB9H@t4(U`2x6Rj z3NfA+S{Gx@T+G+Z&e)^0y7($?BNf@cg4|Kk@+DinhTvAO0DZ`o;O?41SV!{;L%X5T zyz-K_kyTcokg#7&45O8}JRa?z$r~S+-D}48KD`?q&&nGyKvL z4sCzgm(53OR~@x4--b$~{$Gn*f8Vns=@SAB$p52y;Vvw7Vu--1J*QaAP$&7j<@ei}Ea zOJ`n3hmL$nOG*@zpYPJyIiD4#A;w3031WO?FG7r;o6y0Qu3*@tAF<~Pu3r&zG8vAQ z5?^pR(4>6%L|26KvDu_C*w1FT0>t?8iRLdZqh$kMKCMt?YY^khr?sl=dBphg=`~gM z5n_D#v{RM+h!|gr96>CP**%LGUp|o&6~6e3Mr;O49e@~LKBXWwlgTC_#+OfzBgU6c z&mqS1{1#%|#(Riy8(R?L%bmT5@x|5Gh;arT?m6QqVw~|OVtm16!#Gc1cH1Dv7hIhX zOJ=gm5#ySNBF4*+i5M@(RK$2WW+TSSLD#9Q?#6CdTDcp0LJ4z^#LrMIEt^X%r}?|) z^XzSh;b{ESt4vw1e}jY3=E?rRx|WVVJ)IgS=- zJQjr*XAtT!Y)UZGeHRjigXas<{TO()*py(Vdo2>Jk|ou*^@)$9nVlrO4ky1n%uU%SWD8YvaXYm-Zo@cUdZEaH99DKlg zPy_=jEUH(IrF!MD4v29Up{kl;Cjw8WLl=*c{#US34fCMr)nhoCY;nD$^Ufypz9sZR z6Y?!xP`*hwJ-V+1vwXkL^jqvs5CrACEmc^~32D$_pBp4(EI`(q2ZD78zSmvz{!%_JE4ej4Vh8hDH}9AL6;?QBxJ zKk+H!EhN)eR9hTNwZ&r{5aTS;-P*4;&Gi2Ov{r9QZm8b0Jn$IV;(AGEw53nlOP7BhCSAOxh1AIx zF10IYDMjW)NVY-L2AZ~L#JP^%YV2ynxHhuMZaCnVf|=d6+%5;Gxunu)dE+s%%=MDa zV}e0HW_mB;HGu0!%?BZhKu2mN6d=NDfXAo?F5?V38v8WXO9}R0yTPv=d=EemRTBh;=1nb?Xu#bwO=+KyBN7I7ay$aTE=mf#y7#-FVEQY9Q2m z(4_=3Tm88$0a5f)4Qu(~F{)vnGt#-W3B7}vUW;E1e}I0i1X`o3+(z3#wg>woePl>Ov z*ySso&0{3zF>mSo?9%yoj!wMfpFJ+!lbJL&cZ@3&kyNRmaC%-vu}>3O4yS9(6+YDB*C2 z=6xOB=Sydlz_q=@yaW}4DjouSo6Z7=phZCg9Lni#$@6^J{@lzi^ zvwZIA0Vh_C{N~ApvuF6zd>#3~i^)(aA2HLxRy8i23t9}VD zxTDzCd(7vHU!B--Uu=)72F%TIZt7fe^`8$UEx!0$_o;>J!gnvo>0MA)zv{vevTkk&}IeDdJ+3pkP9>4ScXIJfC|IGLE6_?r#<31i6 zRhludbGJq9mi2k~p*}BPlUQ=)H@|r9+x5u-{rmrpy0ycIuCdPB zrmQ~tMgC*6|2bV+omvyI;fsOrn zciObr1-nXbe0}(D6{E|o7ZOs~c*_Y36iS0h)vvY4e zc4F+^t#|Z)&|3TLllPvnubdKlBzF9Wb^AYgXv`DC8wY-SeDm^SYfn$;dec2W_I+&p zd-9)qdft7!W%Qx-Jr8e9{JO`Ek=si8&YAi0l7?|9VNvDlzl*%_k&bOMvK5!%k&T^q zM!nYT$-DB4!lNB`4OCo)58St+=ZHJo-}S;DgRlC1quu>Q3-6t2o4dw!%9;DfWo>?n zR9vE8^J~GAmw58rW#?X9Hh06|c{e_~|Jct{CS|o;*(&CdI7`d*e{b!R()|ADxpyCa zbJb<9+N53Hsb9y-G25RSl`!j%DqoMs`Yz4v^z}P`zjN-6{ZAZv@R5Ha-}f$E_WSX7 zEqgZo&~<-NR_rsq56Z8(uAj4Zb?+9p9liO57f;^z&7w;Oez$Ad$bart=0_)eSLFYh zYia*i;jJ`NTWEf!L&X0Lch7XRC#yeIJlC9my4gQJEhyDOYa%)TZRqkC9>AfPKZbH^ zwJ2+V7H?nOkLTVW(~@D7vxrMBx+oLL(e{G&Q<69wD)9STeN2wy4ptJ zhp}gq12J?yW3^CiQ+}52jyV;G>BulEXpimbSDrr@n4eAzLuYK%0}kG`_wzu^MGQlw zqmXt@*CT-#T8CLJbe4P-Vh^2Y_#zO~g<uMfmr z!Z1{mRQ6w<**1`u9e;3rQ44&zrR1CBTynVv5fW-wC2-6T0W9U!?jKr&NE ztdc|MsS3b67$DgwBsRuUJ~T|i=Bl2LRFLL)YfBe z7m^N=gY_;+dM*I-v5-Uo!|RZ4TvKSHO4{-SI5t->u|m>Tm5dV-NtMhM5^`)!eH+*C z0x)j|NOlKEjt59uadpx~s;z-S(pi;E5|WOpq*6#asgmb}q>C!~Tu3ffC5=LI2_!sv zvD$r=+K3a9b}A-INLr|pav=#*CASMnxGH%=NFr6qAt7m{N}AEMh0t1+^bnGksw7QF zBA5j4{^ZYD$XUE~AeoIX#0e3V0uuTvxSs?|ZOw-^^n~n0TRAynF9LEm))@LM&^*s1 z0~8R=>Rh6XWts`NBxVpJF$X_fA_Nl6nM^WB(M&TWlMEilNfOOtoHa0xi)hx;JJF`2 zq&Cm%ooLSzb;vL}M_qJ9Ky%`zccOiZU@?r&DHzRXoP~(NiT0g>#V|TsT~!wKJ-rj{ zCj^UObhaFfMaK#Xd*VK_Yc6zO5iAE%^v-a*k;KA|>4+^}827Wr`bw}EMrW(L%0fgM zdV2Rx&DAWbn+1l^m8%Ejnk{lRt+DzG7Q^UlMKe|h+G9I)@yG^^b)8@_jLue1ovlNk zcATfNY6Od6bhfV0*_xboY=g#PPm&>>VRW{7>1_4?BfFW#Ix1{2jLueXm4%2j^xF>O z>}+*H|1P72Ap*nbY|-&htHV~ux)*D#RKa2xoh>@@>-)UsTy>6MF^tYuADykQH|&bh zSPuvm!{}^Xt+Ei22HjTkWoNZqn+1zubhi4cENbQP?qv^XtP_I8FgjcP7>liN5X<`_ zrkTcah@rqRI$Qm9wwm3$rMbq+7A%I**`igC=1};ZC-&i+QDT5dO9YEybhZZQY~5`g zI9X%8ELaSqvqdwU<|z60)7xigtb>BZFgjbYI$I;|yu_xlqFN#mfnjvEXnxiD#tq3Y zP3fqX%PCk4qq9YGxz-O0qC51_SY?96FgjZ_-)qiQoBh4!d5yJBuoy;XYpBka>$;ow zYpgE>i(z!O=$N3j*UC>5@6=c=X?c#oFgjaw*wD(=@9355HP#5hVi=t*y4TCgMOsI8 zoBl{AwGK-Ki(z!O;&rx$y}fsb#(G$=7)EDn1Y=R3r*Pdp4Igz;ZG9|Q45PC(5?HNV z^KY$g)L7>Pi(z!OMlqH$zMlBcKNB@pe>z!2U>KdP(U5Ak4vimii^j?qEQZn9axzvF z?Xf*L`@0m4b)R4{jLw#ev6SQ2J6#uAHP#NnVi=vR1jZs;6vk|*`~70I4jToFVRW_< zfz`^@r*Q1M8fzeB0fAw3wvr&#`uvz(?>wrp3IvN`bheTiODWgWo1=SbtosFvVRW`q z7)z;KDSe~Ur$?^WSPKM;VRW{x(b>AH&GbZ#^?+b8jLy~= z#!~9Ab+dEdY3|G46D)?&*&3^}bBc+Ts&D-tx;KEYxbovleaTkh&7pVwID1dCyGwk9){(l<`NwaBNjdXgA{ zVRW|Wnu=D3kKgh6dX1GKSPY}HHHESK`$lWEy($EYVRW{x)7g4&-=Q3h^@w0GjLz2e zI$P_W{pwH6mGf4?Vi=vRT%D~Oeh9l=V;vVPh5-(aDBJQYbQFghKEDs+Ooc>SS!L{* zy^jz)WP(LuDmFbU4-(B$;Lj`Ut29=bU=c>on#NdSF(j>7_Ys;)v86a=CXAky&sgH{ zFRgyyof|aPtHKsx^sE9MD|uZqCQ-%Kr-DToJ*$wh#4yH#Mc3V=v3?aS!suDk8S5hK zDNO$U&8-@%RXZ*vjGi?E5`LYZ5RX5;;c<;MM6d{>XU$}+=0rhwWy12V8Y^3{2%~2e zL1MMECkn#uYqS2+STh8RFnSg$8mx+&H3z*HYdAitUAFW zjGk4@SV}8DyfNwxjrEma5k}9N%~(o%t-XEqa~kWUU=c>oDq$=!(MTUmIq6r2okS%O zM$al`ETL4|d3pybOzBa>1dA|w)*Qy_h&_enWAg9QSl0^{Vf3uIkXS9WLZ&eDtD~3z z6kE3n7Gd>86+vc6xT9?q!pDfDl97v zmYN6mg+Yi&Dk%;0_K2#>Eh{bc<dFq^ATwaW4JW49^0zFxZ=AfIld1ZxgiJ4zqQ4W_W z0S0pO3JQ>HlDS;;gj}>IOAYkA2_KS$qZE67M9^7`BXFP16077_~ZZk zSqy{~6yhRxX<%`7GZq++-W-$TY$41fs-M(4$8 zvqLCa{m}U{^NLEMO}x-4BZ@NXhiBiUyZ}7cALxEiSIPkWq2oiT9M(rdsTU4xN~JoA zn^LI(gQzqa_B1gC(HjiSt2of@Uobpx!qD--n(+Mk1Dh}yp6d_v)EErU^B+1s={%Is8`@wcl(tqWp;s4MsPyjPnn(UrMh-(|}+hlc7JoDah$asQ)pPT@Z@ z0S+2d6X8WL%k4~2-hbdPUZ@_y5)z!=w1jMrCp}rih?g-`(6HpBq@-j|hRdnEo}nhi zxl`dyFf$>|>A`s_dtpOMOL4=wW^zUbPb03HmgP)IOi0U4gdaslRNm@P0q~WV?9EDZ zC1)i#&0mvHp+l3r?nDo{8Wit-s40UI;Sw?>8{P=%Z4gzQkmStF^m?cW@otF+0KBOKtrWC6VuW>Z~*5* zeFUDOs=%ZSXL^dum7blJtvRprcUY*t!7_Rmz-5Ghqg(XkKkI9OJzsf`0W*34&tR~6 zrmsMGfH@P(aaZHVtQ?8xAFm9Sq(6so96i8ehHKtJlKw%XSQ0p{M-bdX$a51VX+Jg! z!SeSr68;0sHYzwmD{N+V5274H@FYSf4}&qkWo9^Pk2`>QSm1)$T@2haz(l8UeK!1< z>7$#)USJ**xM1yZ6%t+t<~uLf7pxrkW`g9+kfiKPj-#7LW_Iaz;WA);5V&A=9ng0Y zn2y<8Usw=*dm+CDm>x7x5Q5dqA4uy9jAIOgu?Ggs@<%sOMhOf@nwNuan~V(sM~^M7 z3IX>ya32Hr$XIT*Gk(nSN3T=ffyUcK10JCRHZvUAy$^Tb_tIT>gkbejgS2meDWd!C z2*LWx-AG#lOi#Mgju5QfqL3CRFbs&DS^hR4LmuG%qI>WNbQ|0ZM>jm(lQHJ7Q3zHJ zN-n}~v%m$*AC>n@U<&AdJVG#>3uz00+1Lb*^z8&@GEMvl!SqEStpu0_0vD_tG;Wpw zb88bg2NbLU<`ufvj}UCUZMDKjBQVe9aU8XeSv{YH+%pZ2ZRK-ZuyIcOR|JM5&GijO zVqFNh6)4Bwz%4E0+FIhrEPr1@egK$P=^i&iu=<;Yg!h2yMfax>g4IiVG}I(uif`b! zV0ITEc`GoZ=x#DXu=aH#Z45AX3S6-K-G_vSfQg+=+USvd^YS_&$2-u{27wEvk3JN% z5t!FXK|lyrj+Vf+o`d7eT#gH7cN}nIfO)3u{J3>UJ_HP0{jy-i-mKkdI6eu?zXBJm z9PNM$_u(TZ*eC?Up^HkogVD=bsCiy!K%-=?wA%CQ=%gvZ4u~AU##YA5^FcXY86MYrHR2y+7`kn#i zH6zZT&w)Jc5g5uJg<$pfJ8tf z#hK_^wFIxbV56Yo4Em`4HZH*&jg5keGtt+u1nUEA6jYpvzK%;VM`P3BO!TD!GuDVR z(KlCMxW?f9uL`&|P3XH6N;Uwq!-zA<-w|L=8gYjFQG2vshU+ERD5&*fqR$0Ph7o7b zN8@9bz%Yf_1sfmbz}?b>J}U3Sz-%<)O!D_7Fo%pdL;mRaVW~ua#zx_M{Xb1u~AUVVbDkYB@UQzMx2Sha$s&T z;tcwzJst+;MI+8c-wt5DG~x{UXndR$7(`hJ)*k18Yq^4Bf|Zx_^%5A44Bo!|fs1cK zp94xJg{W^Ka8*s{qxxGHqQ2LF`>+XpRNikx)b|r`zc-rmhvGWVT+T#-7dI@Z> z_K1d_WMGPnIFtTzD=>E%afbdv_4f)ebw-?tzVCr)FyajQsJty#`V|(@VCC%yTsMIY zR$d4Aqk+ja;!N_l7?^4!&X7MU?=!%>WyG22+Xu`KMw~$(<*!j-5M?1)dAn9iQXgy- zf|Zx@=MfkN#4eb=Nx&6`pszASeRl!(XcPLvk)QWN)b|l^dqU86JVbq`fwSJmYb99y z(R|+xn88MzN&AikCfA5Fv@f;CVqj{FI1_!(1M`**FsF?; zlltp;2j&iJ6x4b#l$ZL;XkfC8I1_!dfmvw88T3*9?h_cYOCebOJrCSlP3VgRe_x3D zegN)h6Z$BBtyW>)z(zr>7nAai1jb{;nUr@1FgF@;Ci>O_^OO;1qHi-WUm9^H`c494 zS#2nXK_9hmSApTk;O)^LxcDaY(R?~7M16U{&2B;;jW;<&ed~bR(1bo3Z##iGV#Jx$ zUyC)EH?UDq`+-UQ4FJYv#F^;J1!k5JXV6FexmsYDVeEp9k9&Z7ya|0#;C~pRzFoi_ zXhI*g$C(iIwY?J`n8HROSp7MW77xs|0%yVhVC5|YX0B16-)r!oviq~E1cv@oa7HA<_jm}nHo!d}0?rQH#t?8cj<$t>qyDlx1YB$2z6k->9JnI^xR`+Y zvjKN31RT}hi2z(+dyu|=0&wPbrMm$33#`AG^aEP}F3>L3bL$Xr)V>`&TlA>#Uk zfa?K$u_55P0XIGb9OZ9*2smoDTSCCm^IX*-;HY0c5`Z&r-*qA2T0!440l2{SrFMHY z1l$PVYD2{R69O(4`i9+&onJ7UhrCFi6@beQ7;o{wy%m59EN>s+PK1EF61dCm!Okz3 zm`Q$oPe{JuB<7udekZc74if#slflS9DKe7ZIS9L+D!2H*noN4OV4z|lB*IRJ-p z_;6f}DXwwe9Iq!~c=w8mqJnH32X(Dr7eD>#NkuQ$|?#P@-mjpjY|5Cz;zB$lKLzAGpRcUEAAP=HxHO_I zIak?@?>Y~Zs&Nvk{ALv8mz9>6PWL%_kGay3HOE&pyJ!)4TS&xf|3$^{H$e{eXnK$~ zvqb`SaNSG3VVRfMvE#;*36R#n?r{Ufxn=9O1oj@Md zE4OHW-KY0oQhR!T<2ELxC2|!u8#*XD4*IVv$2HD1-bMWw-Y8jLcgJp_=5Qy=KX_}X z=SUgyZ}P8R`An?lxA7fXwRvRjgR{ontn!S-zGCVBN8FphMOA)(z!zpvM09Y+(i{~N z%@oCraG8+-W@J#@%1Q+kRLTWmKrJm3HK!Y8{pwf!+RJv^H?>7va@R~Pw-zlcjVyCZ zt>pcl^E~(7xy(TL|Gb~~y&vXs<~-+n&a<9py>pRA?!{FlP4TK!b(a>3mylLAN=i@g zSre-&t#0+s{*V!GR8Ks#_=N90TRVrM-VlRVtKRIkob#yB=QzXgzT3#E^~v89{ZRRU zQ+1t-ui9L8zQ^psA+`?|#Z$DL>b;a0#ben~b;MoXhv>>t8ZlHOoEp(zBYJ4W)f&-O zBbsYOLyZVeJm*!1b46*Fy7*|x6)rU$ai#Pl*1fq*Ilh(s+>6iodYOaSQNR(fgd2Kf z8&!8o!k->l_7C#zHN5K5rEc>If3vzdw7bjk4pIRuf8;P2)GVnQy36n1kAGeYmjD(! zJ{d}&tu%|@RjU<%OWhHq)~)WBn*U?gtcKL=R=sgoCpgDD z$7N3#zaFf*Utv+% zEcYs?|1obns5hDS1*i(<9V0oWP7%eS)^H7RHK=!(cMT|k=nv{RBj{I~ngeA~#)6`> zSQL88ato$%K+)^9ElM6J@gAMbf0A-_yeI-<7=;Bu0R6d`w^@)P3`~U3ftoQD6~8~3@DieB2q|E)EZb-j>oV> z3y`EbAe1uZ_$gv*@AM4}r7_oWs`?>ABPsNQnnG!j=J=zbL+h{UfPl*RA=K7i)1HDR zh75|Mp!ASI@f6f8WDu27WfQ!vTYLTT9#P=sZKflHa@1}4#=Z6jtK0G|hxl)gulfw~ zev8|GJKp(yJNn1l?fArI!cRBwlurmdJ`fHQHA`frRv2z|qticKsVoVsmm*^;n+Ee} zjHilsD06?-f%-FByG0Z$WO+0?wJmNnT66*2q5XpQf16F}aS+{ifLFbFeQT&$ijP(4 zhC5C0tV&HY{~says2RZ#cfV^u!EUC3<$ z^*@#)Cnn^`g$Ntu7zIU*|0(dT{5rkom`VaqINHIW$hK7(4NACNdi}EC6@e1Y_jaAP z43u!gkLkQOKnaKZq0S@6C|vWGI`3yt!bzXhdEsa~!d*86CG55ZB^)<7OTi--DO|Wy z=h4eOp65Im4~p`^s>}xUBvUVg5-yycNqmBN^lD|1f7?Jk!`S^g?>kUWGVd2qB2T07 zU0|;SCG>UFdEIm#4>R3JfReb=uGVAR$HuM%JV59Si5Z81Cwa;q0?UFO9( zxE;9QWks8D`IpCS20+w3xJqAB)Lik+c0<)E+fC;yEw=beQrr-W2@pF6v6F7~Zc5ZS zhd10?KF8tp&x^z8YHSV-D-%i@dT6R6#)juoqQmi;c^dHw2CBMy?U4wf+^Zf#G;E6+ z)0?oul_6Es6! z^)xyd&)T0NNSi&wZ|$Dq_jQlWz%7z)F)nrKVJJ(*9KhvOm(j?_rEb)ku2bEQcIvhq z@~F)Z+S)0$53Et{sS`ka+h6*EI~Ig?qFnPLuXY*YVz8moo@A84+ct+^h)b1 zr4!>KfD3P!vdPswmRvEs;^ITT@uXWg64M$XZIVi?6D1siL*Ht1#0<`}h#;L=gKgm;v|q1ircQOQbEO?Z z9(9LkCeGFHW{T5a(k3Us}amuKzah!oY; zB{oGJ*QHI0e_VWa^{qO{Z*Q*G;zd*lfF-X1x@n7>?1sGDi4@I!8ye|38e? zMlDvQk>x32DSlUc8)wxzPu2R=&M~vjehN#oJw5j?`D<({;*qhO7 zWz|cV+9q)`z{sS$Ihx9Dx8J&l1*kbzZGx}cgK>#(4+bW_Js6qz_Qc{7pZrhJCYO4S z-5+%kUiA{WI*gwKRsM@@{yL^BH>lJQl%h7+aB{bi^B9)=#(cMWZ*6;c& zz647iv@+oO3#~>F@aC?+V#)p2ADZOq9#b4O6w-(ZaS>!Uf=Z1byR&Mer)pDb@)_I0 zS?Fu@%1P@u)a3o~ZgqWSAByY(d{wZ{Q6B9OgP(02y{b(}+A)3Ts%yZYM}^yWtLOl{ zpr+d5(WBYo(Sy0~+Ca)MAfid;&Feek%PMq;iSoyu>g4%`eR1K|474CO3wi}9c1@qnkC59|C6scq$4M4>3 zgl1u4@RAN{A!BLACFI@!^&BIPgL;Xn!H^L=N`v6N07}^X5!4Zu`xDfCOyR}i%E$O- zRoa4D!_-q)x)B4o_d$svUpsWF&oJU4P-0;5DJU`6*rD^j(kbdzBWW!NzV?6{%VX4& zjdEjojH<*?ck*Uh)v~4ih0j4Zt%F!9+({{sr9GVID#Cn?-D<@L~3C;;vrMMZ(fpRs3CvZ;4*K=1@ zIIr_6RT!w0owt@$@)xSp+LY-dTB-G@J8h|A*+lP2%RUbWo1)|rO;G)=Y+D$A|E}y( zm~Bx6Ql7XwmHrOV2ri!20Y}H#(KQ!iR585V>VdbmdM%$hRYyFsxmDS*Fke5q^(s4G zucUdVx*txcGP>+ycrk`DuD$lEbCX>%c2%mb!R%3ECcXS2h>9w7u+NSV;?4 z^6rut4~@LgdAd|FK|Z%W+}AmAH>|gp6X@uXXrpEGcEm@PL~e5J;G(Kpm;6=H(R1s= zd~VEX&iRJuy*9kg&566&=>!ZQ>SNpxulSnrIO1zlc5ib1BdY<5S}OzELs`rf_exNr z$@T=blzCG?sZ3Gda353DMDE7Ns=S8#1I+ta=Q)wf_jBktP)C`f-x+w8DaV-WvC7G7 z^@%5FIgb`IG1@GoQD#z6jBUw_sHjx=bKDroCV2gMSPG{>qZsLU%X{-2)206CwVcI> z(wb>0iOp2gVw~#rk)E>iRkp=%!&2g*vWtyMGM(xj(IMAIX`X?xU(ovKeyoqC(E8{h zS|7a`>!XK!IZ3z2l&q?pT6WP=GKn+>)bZ6wJxzGIrHRGY(uBGyu1|_TskFfu#_2)_ zcU*@`(wyf~Bdxv!XVL_FX;))p?NQS(P;35p*??VPB~hqOyCQ`@U++wwU@toCQHRBg zig%nQer~nwBt_7l7US_>#X4<^4ug|em3YpXRBE>^`2gPn^-qBQ=r!*0ZaWa5U?Q(J zgy$KIRppX9JZd_+rHn|o8sk;N-Rc*a>H>X;NdeN~_~Ofw!%BwhoJx%8Q&9guS4YLN z2wJ7@YqvioGWnA4YL9w7+5Es3W9@2dV%=(s@pg@|HSunZ!Enme)qcv>#I@C4wUGv) zci3$U$HD=ie=2nPOVM}zF7EFrR`2Z>b(GcmNofMId;h;q9CmNCDj_#Z@5^e6H zuMbaM6AvZbWG{^qo>5Jw8iHECS=9Q?TCGpcwig`{y_q^Zo_jENRVOIsL5awMEPNBW zM2a!Enidy}?H20T?7WTlOQz~Th5kdmL3)rkfDj(!dUZCMyEZS8u0*UKX!3E>O7k6`Rc%a0)E8#JbODsU-TRDo!0vfcyDq8(EY zDB3J-0tnuFI`0rDQJd@O?XwjqQQuThqW(VwO4R=sbvYWe3M^I07#?VO)IXf+vE&E# zqGcDg5uQA7e-V*%Ba#Ud(9XuiIn;w#W{q%L9^)mT6!aKfF!6}PivZdOVkv58Lx|dzo$k!?`&4DfnTgBMrO|0_5hfy(3F>)iatv(Zn8ALx`V01{OIie)WMqGgYcYR}%W|qbdcn;{LzsCy z&g_hlXvsAm)y?Di4r~@`T4UKH(uInNOwWtUsqB%d7Gj_CT#2a)m~B+q;r) zk1eU^O`a6v`yDgH`Szku%{Hm?8%t44pbin4igZ$YvLjn5;YOZ~K*U6a_kj}mxIm|N zgQ6m}DraSB?YWMo5qFkrOI;+xS zD#N+(<4xNIcfk-ELD6ottSY_^C@JJNTjEKSni89o9!rD4lo)qXdW`Q|H5H?nC1CU#?yK)j-c{PZG6MgKuYgYvvo#6BKMx}5!AXy%&P@v3sKQvRm;l>>v0k;Q zubBtOMo>%*-2QM)4y@uvW>(dfvI{+C->NMEf3S!~Pl|f)Li*>nY^4(o5k#;5f9ro@ z#d^#)FYCI@O?pa#*qUz&%7QGi@aw4Q7XmFxC-B6c(6yk%P7v)@h{cqFpv1ySDk!m- zLM~A3@QeW^_I1XC61zG1pu`@|bWmdFW)3Lo6R`yiiss%HWdW%AOf3Qx$<$I%^t)IV zUg)8%eG4xLHDu}`ghn&NIv)X#t}VF- zY}hvBzN?mCYwhUB+Jj?i5AINVaQoVW<7y9%uQ51r3oo0}O37B0j=Ujn8bDf9392xD ze60MwXHhw5K|t`*L5XTY!)n2s3`$g(nL2MVC{cB2rA){z2PG=e>pE{eC{dlZ>%8wl ziHcRJ^JtS(R57X|LLZ&L5tXfr&cgvMS8{ks0(BM5=#&8mC@o-pH++2&AFJZT zT||(ENP?o?^<@s_NOOE?YJS0w(+daHDD)%PkP0j5OsDZ^sB@JT4{R8uAd%@bTO+$1 zjrD>3y&N&>VcP2BAt4VabJV3Y3UT{~Q>I4JILkjgR%q*jfagT)aHl#!=iN+a^wv8@ z>F3_!Y3^Q_sUFXy96#XvbK^-2*nMq-BPBaPC&nC^=;XeouEQ6RiG}_>G?>o9mPJWp z=edoTyHMRoJW)AN4X4^r&#m4PS($*kznIT((1L2&N-9#Nq?w#-Ixxf*EFVsIzD$8s z8OHMTFHszc(`J8fArMErXaJU@?y7#wq#U8Ngk?`ve{z-`wbIy(POeQr)FOSTD)+N; z^-HZ#QV|eF0gs4)9a=y)1cZk|1S|1HJCpkrM|k|$%&WqAR6gZbvXq8xb{fFt@Kh(U z!s+iv)od(^N{(A@mc`EkfzyrviB3q8D9Cp}y@HPw2YR(R5_x=4S=)gURkXiOWq=Zu z^?p!73r5j4>J1cUQdWY`f_CUp9sSow=qinR&BN{soFnB~;aJBIbLCci#u0nXMm6Tv zgoV5kw7r!624Adp^8f}*-%VgcB!D_UG0Cge^y!H2g~UVEmH@PUZI`;atb(dlX$q|X zG($w3>K9rlrsI{3T}c_$mJ?%X+P;!Taop;RhR)xqG3rg9nvaNJx;cV|TM{Q)MRv?? zWNOMTbraV}Bl(;yMyjc!uVbodnNv&G{~xL5QaFQ)5OJI9GD1XA{rS8HG&C`!t=#@@P!y%|^*%xxLiA z_Ge5s?ud1sOT+ZH8`h|>$kItHO^cN98Z>m2=sljVv979V-S#m$!*EhD5~#fLhzNvHnSseofH;(Wc^t-g|gs^G?2**#=|&e>!0)eXOkE)F$+ zN7WdmvYv>L8$0Vup-h~)D`~9F$lW|`ar-}|=%P}oWu(f#gzhf!#jXB_0?BncyzuA! zX&0S}4YTQaaq;W|QWMX){O`prfCX35y9Bl^`2%;O#JuYBq{WF{Aw<$^!6E8yNglO# zoYqCV%jaN&h~th^G8}iTX?`xF&vPW(BHFy*lj2`#XUm*r`O$xS{Nth76&FMP%LN%; zTwZ&`8agvP{?u5pc4AvJ0@4iiV6qeI#Uz%ton)e_Qj_MzVISlVq$^V`!3uWtogS2Z zEYg6jsXyG7KRlbL5h!Y!ootgEhHcF5j#z54jZFhyx3MkSAb@VHxx?@R7`CusRAuZm z6i|cEmpk3O*%19W=7*cb#>0Tkq8G&(7#dTF-igK#G&$_#^iQxm%hSVLIP$UpcCbzD z^ryyD`VbiD-jp5*o`QWTY*Z|F(*89ibYUyha1BAVdJbTE!6u7>EsLcL#(|Bc&~Q8s zt9BX!!m0lGF_qW_$dnDC(n@7RstU1u;Aah~i_h5>y$W#17VovZ%N2!Me2!6n{$FqL z9H-ivee!Euj~7lvp14(&A|)!LXgizAh(p&VZZkyD$^-cZtjM69P$%!86&ae0i-wjA zp?mQWTN1x8^$qU7GIbGm5lSbKMW`E;;LX%|8+6_=o!1eO*~VJl1tmO6Z@35HWl}*2 z-Z-6_rc-z86t9iIZKH}}l}GM0%O;3H{3se-iFuvyvv}wrTJcm>U|TsH$Fs2Kr)?|8 zvt#k9kRMH>9Bsw&Jgw?9L>}dQg19S{gF=N*p>SYTG;;w|ztTzcGZi~}yb+6YrqZqO;6ucedgAwy4_5wRuf|<$y^aI*6Z7Wb{sU7F zSyMCjk_p?N>HK{Ff6}|YM0x87u6!#d{@^dF{`v2mLt%u z(|M&#%TjI&sweu~T5C!DvLpXEu{eWm`Q!xzFWQF@J1xATxK`2Hi{|XPZX%~`i)iC_ zlY^%Ba7>MGhs{XrRQt2As3yK|azxVz5Brm3jMj-|$R-DGQM)%ey0L&itG^-S(1qL_ zxXIyVBmOM(hf>qh1*BJ)*|dQCg%DjpHCjk7dz3_Uz%%qs1H6nc60icK1c<@77S|k2 z+A)tjGsnygB9+*7z74FZ+M)L2j+rsjk4GW7ze;Y`t@`bef|L1+w9bgpJBQy59n05hJ( zQ5Upv)CYjjILbleC^wCxvUpz}HAkhx-Vq+l(^Qsx%Cvy?mod&Qy^;JawsO$R^}ds~ z>#@U-Y1ydlcB5lRz!q>_D0~YtJEw#;@mSQu9_HtU<^=;tf+hdAeE6a!u z_ZP>|Q0YzKG)s7>gne3?8sim;Fwb7bub+$*e2I_TIdEV)f%B#~K#D#7NV(+_ zatpyhEBaXY#(M4ApRwDriqn}+8zAS>ai$hM;XW!iG@%U4f$`iP@4BnaX!C^l9Ehf& zE$8zxx_N#D8|qm5;zPDYwE5`8z#;+1RA?V&YT|BM6iuLfN2&_rCoe-*VVA|V)1Hc` zH$9gg8Ro0+NvQP! z*syW=8_?<7E1kS|H<~*j+El3U`tb-~*#^o4iP4a{wN#x+IR_}n-o+5MH}fM ztS!DS#s`PaaTl98vp|W>9P(@;l*UAY(pLi6qR?Iujs~Yc6RT)kiR?W}rD|7Gu@7cjv>H*tkaF@e zxydWWHrh15J))P2{jgm)DJM#kpJ}lzqNUZuLs)1pX;ap}kxvfbMcG#NbmJV6TaB&6 zra@I$36}1cvL`{UGYiW7+exU9M}2Lv=Ng9d;K|?4Zc15B$Ni4eJOG^H-#E^0^|bS2 zSf(M?aoW@rn|ERv0Yka*7(hOVU}}AIOo-+!Zp-{w-WhJ4iRF4a7A{kQT7Wevhn-Hm zq{mVWuHqOpb0=?{jpYTz0Dai_n4JQ0h^?^ueU*l}JIw*aQy zemHJ90ib&3_9rA(R5lTHC9s-6KP2U$!>QC_b9je|>YOZIV{gz8&9C5NQ_gwYdR3IHkT6p;Vj=u%u>NM313~XxYkW`Bk>Ed2xk7F0rIR z;vuKM9g5mZzLA?^po1J1lX%FhE;$MP@RVvxv{$=qP{+ta_6g2KjB8OXU`($YZW`-4 zXqZc@mRS?lqxMo~)E|X0!He0)GN^YZe_cF6Zmd0yqjxy;TRvd3ijzNn*O!WFgHLG& zUstWkV*ZyN>45}ozxpEa&F=AAc}s15^8TV%X{g=b>93zyaeNZmT~KU~j|;^Wv82(P zsETia5+3kVP@>QhkgrGb}S=&U6=2Df@Cp!4LB zgPP8c_ci1ImDvLPr>4gKS94C9|0OqzbCa~5rF$*gq7#5nG3TMczCj&7=ex;MKHyvI zn|CB<93v7{wO+d87swq~AwgL7wpBht``{RP=q|aLS^Ri0N>Wr!Iu~H8T7Ntj9N}q2 ze~&Rvc1-ClZZsH*y_lb1q*F>G9j|3}EV^c^&z`u2)~MTNs+&ACYmf*1P*=OSRX5x& z%?K$Ou^zP^=Gxytl`_P$?q4eaapt^$+ZZsW~sJmsLgd5$j%TZ6udnF0j ze9ghBpFeQ0%B5lr9*)P?z*WnE78<1?f;fmwgG-O;L<=8L@wKDT5In#>C%hgH=#T*d zL=ImuA6%hbh;3f=Zt^f{tDq5Bjpt%CmFxLr3l3zUk3?;gb4a9Owqx0+Tw)oDw%_Dqu|h$TS|8^)BHaEqI0=v!iNzvUWHi)McNH0nR)N4WZ)9}1 zS`RBqN>x2_Y^N3rdMVCwKK!Ud(6m@kN65w9W z6fL}o88c-dT!pOKIb|Pnzk=GmpH6Q4QIbnDhjH|~6==C%&~F4dWVX#o<8N4-*+PS$ zM@i*Auc}g|bg38%x$w{wj%(l%!gwr3;;YsPV$q6HGY4%VCtDv`Yh3f30Rp|Da5p|y zWd`nIA)IzoMDk3do5Nsx)l(>S?1;WXRSu7#ohFZDIfog*SusmNMW>_V7|xi+E2!~j zX%?W3UwQy8GL!ZcE$%8DDB3DdUN%OUn3$R~(2f-Y{>_xF!mIM)>mgqhk43jtHLI+? z_UdbFUU#L8>922`ATrtfMDDM!XI1*>Rx?1!g)9^xGFhDWq@UN|eG@O0-UZqqmS-OW za}|{cHE9~^6eU(X>w?2}d|Vcz0YuTi68c37#3`DMF7>7J;0-PB_9Ol&dP@+GRMN>D z;YBK+z`h<${=MpF+B`yEVu}RPqwdw8#L=e69(4@(*xMQsNskzzs!V0$INc0OXtLV^ z4`Hu?c18WumHe}937s*fsohlSZL_FrRX3t@`i$b3p?1R>ZYu8xH=}uA4!j-f1zo=~ zlZIlLB$iWJwL^gj>6C$|o#-6*$QTwLu3Dj{dL*>;Vx+K`9>C>D(5?rbSDFh?rZ1JL z`?OTTTt1#sf+`t7kL9deZ5)`}FyA+bRnpN-enyXw7rvsF_>|PAL*#!KEumo?2FUWE zJ}tr+)cu9S-iFV(8L@v7AFFaZ?xIqYZxCy1PlFN_?L|=E;$u}P!^qQ!X$eVK*}Xr* z)Ni=Iz!Z)4L<1TM>Luol2lWh7#h`>7J&aA=hE<`1qt7z61(ZO1t%v>wN?_@DxWLjw z)&d&`isFq2*FlNchc$>$8cd8RwB}f{!V?gP>pJm|?=&8;0D+%FWr`}O9abz#SWBzY za%9uOCOI*TOGSuwQ3?f0P=vZ#phDOiqrve1cO5AxLeiQP?1ey%2tblo6*dJ$$X){3 zG(u@Qv2kIeoan5EGL7Q`kmTzHQc#4X?P}PJvMN!%>nTya>J<{eNjG^>=PgizBGjOe zsGBqh{=ccC1Vt#?H-arZbKS64{lkG}5r}+CM+%CNRBM2=)l+PF^%WapYU|aIV_J?- z?Rp!8h^e3mnN=qw?J5bRpa^+=jj^4BQ0+PeLLdc2NLmp_Y_aAWJtXpEy~EaBT8+!n zVE9juM+l^#2sx3F?Qgh|y6juc2s+AY@~7s=1CLsn77yu2A}?3jGn`N`x<3 z2}F=}fiPPU2-164Q>;r;Ycb+Z6K{*so^)@pa!fQtO}Yhwq^1L_U7_Ob6S^T17!$L7 zBlbcs>7<`|(5_H=Z`1V#=0#0}p&QUDz;(kaXx!yUu_RwMC3RHPFbzSWLXK*I zps2111WC0+lC&$7?gxc#DWd7695w747KC2XNiWaTu26a(WxedD@){^nBZZ%GX%PHB zi;qaDpeQX*87b{e-{FJ!E?)jCd|UwpJH zl7`n01E@j#LKkjZm)J5Un&A8FA8*6P`u6 zc#D>m_)pUiQ6~jOIrWo>86H7zchssxqb5Z37CufxQmqp5&2=hPN0QW60Wl0^<5yt= zl5}Z$sl<$U2#V^mh!N?$_%C`-vEDFhPY;IY0IFO`H+fyaf00^2QEJaKqJ67+N~^t* zO4AJul!!C5^J*X|wL+d!D=12>K$89(e6%Z+jZ4A?jSzi}k(<#Rs~icT6bh8tl0cEv zJyMeXh07->U z?FywgM%NpdgEi?Dc|kg9+^t=q^tP0GkzOiCl&OL;Rgmur@gmw(ymZ8==22Yjug@K)>IB6Ur6U8|Dv}$>kY$k0qYQ<+@VDS|1aVrTB4vRuX@*t z_)A9!iV)Wc#PmkW^fOjvvM-v){A1v)Fl#tmZ>x? zko2pbp=bXSH5mSH#YZ3oMaYE$8Bo8o0}wlOgrEqqG!Rip!Zy0eYZv|t8-gOleT?AQ z6xJo^(hw9XS(pW*eLg`*9 zbW0H}CR7%NeZzv#OFFy$i{4LJZ&}ukaD66%?gsgNTvl zTQ)>sgjSD7Xav;I%|Qzc`4&NuZxLvc+8z+YPZ2pr#$rxH0JD9VAagoZ&4l|krNlF+a8#+Zx5Kobp9bg#KRWmLi0p z%Pb?L$%4>JI_>|W_n1g|qxwptAq`HNS5wV>NkO=_CK0eQ*yxM9}%Jd zbREP;paeyzGe$ni{;M~M;-XL?N2w4L<&!{=R0%%X6-xI-nNRq4S-MFt?~6<2p>!i5 z_-n6Ru5Qu`XQyAGbk}3u|F$yy4Rnay6cpuGv_J;$EH33>7xf{Fzt zkcUB4*27I+BAjZopvcBm7LnURmvlzdm!kM5!p(Z)Sa0>6in#`e ze|}4(_$as-r{UgJplHuwq`8&Qyj;6}1R;=uA|yTfgHcB<-ib~jYu8U8ga$#8hQ6$! zb;l^BdG8iV^9N&2q9@xGRS{WOKc`+6A>H^;?jFNOD0>T)RJ(p=F6DxtNaq07nUY(W zJE_1oSMkoAlsk=xA-Oa1W*6l7rYa-zbMuUEHxw24@{OxJJ9PN4rO+j&kGGEY(H4&e5sEQf>?oa5=}0o?DntI$imt1(WitL(<2j zjvA%Rm^mX~$(=S$DK4CzT~M4ob>ejJ^70etOCDb3qTI|cYw3X(wD=10i;BnFC+Fft zD|vR`OnY8Q;k1HD$QQdg#`gRfrKPz=QMF-V69wRdqRBIhCXqhU-q}vZi}Nwquf=X? zYzWBog5qL&J50{N&i0A zns73z4CrRhoj9||2V+r+kwHcIlV(ntQE*$n3Fkw(NGo>x^xUFbDT<`b?(NvA#GXaB z++usDVtf2-{@*1^u?GoED?)9Z%Xs7-%XNd0&yL)qcmN-zbShCqRUD1n4Iqn$6;-Pb z%8u>Z2V&V^uxLUj2TvRQbN+w#KG6NW!`{xvUhMYskTpGyJvJn9_Y6<0=hpP_{MHkD zbnVgi^v($no=)o=`S{M|cfR=UW5*Y@o3*&{pR0Zzd-{*mGd=2mFl&)LZpDf#+YVSC z^T3fiPQCU+r+#<*=gj2w2VZ@3Tj85mgg4o^`s#wk+rF=O;@N99T)S&_zo*|jc;{QU zrEac&rf^orMk`J|zIT6VUdEPZpKpHf_*dbbUK`M)<4d>n>UhOBPbR*3ObJWkBYX4{A5^TZNZmTF!{UkG_BfWRd>$0xV z-0iPje__@}->kIHcg)I&AAY{6JyKhqIXPp;+H013eSC`&8_P`SjJLWz!{kN4_ou*uW)2f^?kBpmMKI3G` zfToFKzx;bk@%$&}zi{NXD`I+nnU$GZ-?}?pnfUOR15#5bW?y~Z`iG`Ozjg422X{8V zD`IWioc5V}M;0F1{ow0=cmKQTv{zr9@JY!dZ&a>&ZR+-W&)l@;!5+{5)}Ym?uSfQ- z|6H>nZ(Kk2suymo*EnxsTP^(Qtjf~YHoyP0_I>`Yu+0z7a;}~A@ReW9e)WN7$FFI& z{`c=Yj7Uly7w6rx_uJX83@T{e?Vcgp_ofw_r&T$Uwl-MtWZw7TzmL9)ZHTi{oVm|-)xv&lQ_q*fv5nGk6$~D8@e5T;8>t-Fhc6Hx_N4Di1 zC_3QXQ#J9L@7`&$;KL5@O!@qLSij6I_dWOV>5lCOtob9i$IR6;PoLYC{LRJUd%SL-1M{jGf-TwHj9iHq~oj=Jva?ew}Px@|rzvI|?gZFixGpWOX-WgG=qIPKCzyIWo zghiXWZ$Grw_V{xT{1bg7>9#xHh#7N#-+FEH2c(VrJ+a%JpY)zpc|iSn-|iE07yr@e zKl#4x3%h?Z)+ZDHl~RtKWsta4_g{s`I+|J@nQQPj*mQ_Ir7@)TIc<`YxTa2g3>R_=Gp7b z{o&&Ig&kk%U9=;6ob%oZ50*D{MRl)#+Y7&Sexlba*Dh2Jy*~B*TMIvXyG3lL%A%1I z>t%dA>D*U09DU4Q+VA#jOIkYzW&ZPSzh!fV|JJwpwfoY)`s>VZjVCRvKgv6N^2+x{ zeHuAE_Jx$m8;<^V>7glK?6&pEziIfi+i$lPK6%@(TUX!r&+RvEj$N}R?fg^zuHT2* zp6WZaWzMn1*?07Nt*NDS;(zbEC+Uq3$L8AKyJp+{pFH34yOr;Ci+=0L<;%`@yjvZ4 z=v(_aWTrmwC<(rmi>Ge0?+TisYdKO># zbNQ?$Yx5H|`^~a0HlGsL(sJ*nxVQJ6t$gNUPT9I^@~(N?`ut7j$LCy^@%NDYPg@MS z5bs#L|5*E$4{f;r&&g$z4}38ttifH64f<=^J;Ofvdg&dXcS|{S@6O{tdS;b8k+JEI zwY_tG)!N6PPM!CEQ}Fr)Eq*G_l$87KMwjN`^#@vKK6CJRk_DkJr~(?@Y>s_e!Jzs-@6O1-u>Mp z{jO^kF*EO`^3&@McH8{V_wn=Bw*T!DOYecZSKXcP{726oXtsF$J74tZS2Q|**o2a} z@2`!pcr!1xA2dGtm#mEU-#eSXYU<&CW{n;3@d#UZywdi-*Bg#pNXyGz6!TKqca<@R zV#a?zddHm6Tkj~2+x6k`(^Ds3{mbCdnGauGbnUi*n`c~GIQ1>(Zs*D;Ke{wHci8gi z84D&p?+Nc+VqMZ~V9u)xUte@>i+d0DKk!)5hO-d|zrFX7`;QHOG4+?_L+^dK`z7uB zr^{dN^5gYye5U2M=AX3u=r?eA$}dM7&p3PbyZ3sIjObL=u8;azR;yhN{#*S1>nWS> z*t;>Z>*+^+d-c%T$WP0b+|u~;qc<1XpO`RC%kR!3F8sIG^xl1sY>92TYwqU$t*^Qw z^4x=!Bee9_TR6L7*Om3t97kqsnm%;xM|TYFaLZNB%$GMcYiIkUMYkCbFI%zS@kd#+ zMm-9D_+?As%buifi>I|%H0_$DO1$7xCtd7t*VWSw&)NOyH}7WWPM#Rs zXw`y>>rds3T7KU@&6_?n`~K(bt5>xCvgqEgdp-;VX4tejrb??hSNy|2Hu=Z%VvzjQg;rS(1cyj5`Iim0W1$F=-2^@Y3M95H*= zk<_owy|s75qi-Gl;6y@F(@t++lXCd|*o^V7Cg;D^{=ffx^yCNkw|&PtZOaq8hd%J> zIM;_Qx?cD0>dG)*N!xF}Y`$-B*`xNjFWWUZmE5oDs_fM*POLlFWY42J-|aYKU+3>v zxK7^Iq5I80UU8{Q>$^WcUY7Rg17lyR_w>8>ZhK|Ms?108N1l5>^4ks>olXuKoAdQY z6LzhCx8oz7A8Fw{|6`+ju3EA3`W?$Y{Hw36$oW#?*M}QVSmkmqJUwkd(u}X(Uq4-p zhZMyz39lIJUXbTktzlJI<+dn}$@#gy?gr8w_>Zo;-;nN}=A%SBWpcMa+BORx-0^(|qv1wpn(yxTS{xJ+BKj2(KY z*6!+kE-zTm6)Z!GqZCum(Z3%GmZ6O=OW0|;JGUQR<6Qs-= zFKj?&kaS>tu4NfJ*d*8FDJOcJ>N4F~hBgo>ueYv>S`;ipUe^+K5qD~X&tAC!C(x_w zNnjbRyk4#viwvtS)01VWzo08_=*>ofb8x3pn$>0A(qNf>EaSkP;`7g; zJ$r*?`m+ojejwj+^u(;8!7@oKUzklpwE>u55z8?9V`QP44LQYj?bEHM??7eK`cXUhb%Ojup~tT(uP_`{>iFghqT}Z$tm-3RjAKMU$o$ ziEoe;954epL{pEbT@)i6vemxgzu-^{(JsN!ye)ABCruO3IirF&xj~%iL7cfk95hG$ z61Ej|0 zzeBz?ApleDHXJHWMnIH}wNfno-XI~KKOc1B3FbSZBN(ka)1aS(2 zIBF2*^&pP1p{v=d43e=?6~}cA;v>jzl4Ha$Q*yfKGW6r6bX~1;{v$b^b$>|G@i0l~2>7;Y!OO8|Lyec`#I%m7&^wBxk8Ro0E&S^*P7}s?= zCq;7l>zrF8CrRgsw^ZZctaKJ8NlrJNGf{GS=$uC+XD~RT=-!bWhtAm{IYzpE zm7F+TCOlGDkJUMyC8v$f86Y{$bk1&T7eN zsdIKpPE(z8RC2D+IhQ1-wa)26-5#zhbxx+_w9+{7a8yk(>rP zXP@M>(>Z@ij$P-ppkW%WNS)J9ac#_5G3J^}^KwEP)?oH*|=8b0wwO{ks%4h@9(qA?(I zbQ!9AW*KS>%%NcqU*rgw(^FGK{{@Q1b98mWhdF&T)lQAmOOv6#mt~SLh~SGxab^^u znbS{0(Wr?zy=ja^7e!2<_$zJ{V&>4ejyZ{1GHBGqoSvFy8Y3~MmlhxT&z##u>;*eGv1L}G>e)9MjMi+Z*LZ(;qvi%GPNG;w3AE+XQ6Q9kEBii+W5Gn?>L*bw zW3rWsP{Wpg`}|x3l`c^%W3rXTsK9j9*KJ)dQ7mJ!m2R^2+&>%J8mL<(ie*f;+(EW* zI1fC!?vyB&G1>AU)JWIZ)Av4RpdOScmND6)wqcalwxM55v+A~%OBBnPY-N~i`G4|< z8>kN?ie*f;ygCYm(rL$yox13@Hc1rAm~3V0D5@L9>-zm@pnjJqmND5HrlUZxtMjv5d*qaBz)0Z2bFA8w^y6M6ry?Ru-eQy7BkY6HgA(ZOxP@mND5H5oF6iJt0vn zW3n~UWb387hM(xF+uAHqEMu}Y%4DnIvO${-)SnW?GA3K2gKWj?wmOk}z{N5qTVudA z@{nv9sGB5;WlXlNXH;Mw_SJ3OCs8b8vUP*WR;PR3ztceR4bvQ_{~D+lC5mNCw#G9`vz2?#z6=AkPoh}HWNU)S)+ZnR zJkdZ!+7O6~WlXlR!8Phe-%p}nFi=Sn#WE&aIgFyZLAg<$v*470x<#T`#$<~+B*WI7 zJ!TCyP>)L#%b09UWRzy>-3zyTXrQ)B6w8=wO)}YPe)9)Y4Aego#WE&ad5qG^Yu(Eq zT`*AHWm8}oldXJ{t(%7b{fmLhmME4n*_zBKs)uxax@P*7PQA`AlPH!k*_r}bBM)B> ze`ke(`b?r&#$;)x{jh4 zw%We$bp!R6M6ry?)(l2zdH6@#mY)n%TvG(%Vi}XIncy1bwKFooYM_Qo6w8=w6*5Y* zHNNE)&l#xOB#LEBwq}`ZP2BzKBL?aPiDDU(t)g0N?UE>#G1)3M*=oG_zrPx`{*ow` zG1>Al%8ol-)w#k+<`q(A|wNj#3#$;;_qqOpJESPqkf%-+FSjJ>)uF2Mk7XLIcP*;&M zTr6XNkmE8I!F$7)8#ATIHS=&o4Jn9a?~ei)Bo3U#D3&qVDl^%N zb=?25Ve9Ia2*kxQCR>ZZ6?KEc2Tj>=@;bfF-y~5iW3siFQChl+KfcCkpq5A!%b08} zVN@Hsjdt!_Mh{k-!As$nYx;$j(- zEkC$M-MHx8v)VxQmnfDo*}8{On&0TRd}~^NJrDCGie*f;RFkdw*M8C7Ks_W;EMu~D zFQc?PoNj&Y4+FJMqFBactK4MEb3FHT19eKGSjJ@QK1ONd-kv|7ebqp9ki!s`G1K%z<8I!FC8Ku>Y zbL}pTGEm=36w8=w{l{d>zPZm41J$%O0&%g7$<{;Q8e^LmEPb0Bs38)?GA3IOGfHb; ztESDq#XuEF6w8=w{g+YkbjPRje@^Z(P|rye%b09EVzRYuWrO7gYPUqOjLFucjMB<$ zldUIBw&vBly@P@JQ=(YLWa}wLX@292 zq|a+kJ$DOY2;|4uDK)1DBqFBac>v_l;>1uiI?T-x9S&3p9lda{9qVl5a)3KLM z57ce7r7DAqWlXkS0N1cJ^YFSj1C=gOEMv0uBBQiCeE#JFXL{+j3MGnVOtxM!**boA z$3z45oJ6sV$=1s{3WW0gr5iG@)otyOD3&qVdPPT(2cSO1Kt;4AP2$IpEhby9f@=wj zqdPtWA8PZsf$A$!EMv0u8lyBHb@NR#q777mM6ry?)(S=iwl4$qgha87$=2&8TlK~? zoo1jumnfDo*?L1qflxkvGU2;KJrBdLBAz(8fZPaJ$9@xBqi!f&&rC8oDVVi}XIw;847;kkwVu*(zy9$k-06w8=wy@ODrPx-at`GW>(n?$jU z$=17!(ro4RKi1tqU6Lr4G1+>LQFh$v+CRDe!0vhsd$to?mND6S9|1-lUOT#dxq-@- zD3&qV`hZbdTmJgxmnQenZQUzTEMv0up~=?5$k%2Vs4Wu3GA3IqO}1za)}h;qupYET*KBaN9x^c zpk~_%qbMw6vh^{zhONZo5er-Bww|{W1}y;}bDjT$IQrhril+7h25OBRfw)-4Wb0FK zjd|tP9WUHypbpvz1CNZ4+1483=(Z-0O8L$}{b@%aE|xLbssPuh^N#bga|~4T_JmQC z3Vh7A))Ggz_3o?&-y5i&62&qmTkCWb2;O(-sORA@iDDU3d9Bw`x>cfB z#$;;)qqIJS#sJZ}t-B?PWlXj{GufhjA_MiJM6ry?)<%;ps)x;WTN@;bWlXj1 zjp=8gzLO}HG1=P8C>kHqr*@f|Cec?E=d&2m~8E4l$M7B?;5tmK(+0NKwKb&^|F?nqLZVp4WNSa8v^sCS{YaRBvd~Zt7t5Gz z9RSxzSFb-@iwsmhiDDU(t%Hox%IoFSUa1D^R*7O6ldVH$TWh=3Gf+=U6w8=wea$FJ z7hTV{d%oqBdLHhPD3&qV`UbK_x?X8^be4gtk|>rj+4@#Tk*yKO4n(!mZFTKLJn>WK z=04>+a1C2`kH0(2K#i6tmND5n%qXqAa`!zp)IiObD3&p$>xjwL{SQ8U+CaT5Q7mJ! z^}Wf~j=P68Hc)#cie*f;elXd3V{@t9KwXk3mND5nT8phNS0fM?%b0Ba2(FQb{RV{n zY1kSqQ7mJ!^%JA09@0f)whnrE-6>HlW3u%#WDQ%imu;Y)k|>rj**eB3tzV|T(yrV3 zSfW_QWb3%e)}}3v6a)3WM6ry?)-R0GeAG{0-ua46w^hG00&%g7$yOz}M!Ir4?J6@+ zT_lQSOtyYy6!|C%KKB3Knr)zlN)*eOY@IOK`q5T()<8{{D3&qV`i)VV-zfk5?&}QH zGKpdtlda!PwuX;CJI+A8D^VY_xk zjLFt1MrrkM!&ON;n&`IL#v>3H%b0AP2G=OBk)1dHV4zYZie*f;&M-==8`OW{XM4y1 zu4xj*GA3JR5o*}_&vzI9YoP9vD3&qVI>#tG?qT@syZxrvM!KyxC5mNCw*F+4HU_wF zQ-RY!9h4}RfgGNa=pvq#B05~@USymfI}Z+?8KD4N&Eq=5v4x8-N-|J%k&GF20UQHW za;&JzKwU3UBx6QhWKK{f$;!fA^G4;XFY<(_KBx6Qh0!NfPp$?Cjk!YZfOBBhN zQOGi&8W99n>)DPn0~Og-a7o6DqDms3|00QYzn@3pXfceJD3URw!Wd;0N|oNR1yc>w zV2L6bGm3u>GE6J45@pV325O8%k&GEdZ&I^_X|~>5vj+}9i{UJZA{jHvYC^fZ*IsX+ z?v^N$F{2_F)j*~zqvt2j8mK2Fie${FdW_Oa*?sdpPZ_9H5=Am*6rKJw>f!f|-5B<2 z>DnVvBx6QJnrv3}{ zXfeD-qDaP!YRIVe5;gDT)L#tL1c@RUGm4%NGGh3<=av2j>OqMj88fO8qoSm(2bAC4 z25N;wk&GGDm{Bbx>Z;R`UIVpRqDaP!vN1~Y+Hc>msGWiOL!wB=jG`00M(y=4Y1hy| zMRpTWAQ>~N38Ns&*ZCd4z_n;Of0aa$j2YFGQJQB*hzFe=b4e&MxB#LCrsFsZKN>u+_Tw@Je zt*#Ypk};!NF)CT2eofdi&_IooD3URwVi_fiQ`z+MA9ot4$0Ukm%qTjgZ3&aES?Rat zf3XJY3yC5bGwKRP^^-A-D(`!PfojuTut~;@x{^^e(xGc*gPqe1)I^CQ88fO4qqG{; zxXIltA#~g(Q6ytV(Hpr8A2oVKo8E@4Mh}ntSTtZpH-4OEhrc@Dw}>?Fgq{55Wih6|H(kfZE^^_suMv zIc?^YxvVTNe{ycgG!&8e3Cy5a1{yBSomLW@+(3zm`NgOVxkbpMS~am;!Hfc5L9TCR zQLUmvTW~4@&FY$J7YkWhfqEuS%bilQilY1}1;uDbHAWY$K09qS-;Jjtjse%;*=XbDJVNrfzZc%Uv220}CNqt2#=LV%TSaL>w zeqMG_KHP6{aN7?Sue)SjQl4FNjt85bQj%X>OnEl5Xl^$D@M}==(9LAa?zOrbqafK^ zR}Yfi6G?=MH2=_+BKk9}$hhfEnmMC1e?|d*;5T1Z8!3cTl@w~C8nR$|0lcRu7AaRS z-8V(&!9Przikg55N_B&O=oUXNtN3PyU`{TYiC^9glGXJV=tZitU`i`IoyRVz8aJ># zNlzf<14Hx{o6S+tV_QvBD3C5!^A?(UE&7^XqcTW|5;`N2pB?CwLWJm1QA8FB7fP*l zQXxiqK81dR4b4WlNb>r+OBdP#s+8ym^?^)H;bPDcs27DX8ET=NyHfHG6KCs|xwcZ^ z#M$gRxNnk4nNl=UR2HLJYav|W>GzcB7nWs}H-!bnyqFCaYqgDkAKBbkBr>eCaQ&$tn3la<#GvcHHbs2*p^;Gu&)!e%V{8zDB)CCPi zWV%A>43@1yame9I4T?j{)}WX&AjFWT2Guo5*P=XdL}O}#wV0?GQ-dMRkx=}!K~@d= zLyFd*mehqBm(`%UM)65ga|>p~^^6Nu1!~cM8319S*X3Hc41lnZc)1oX10XE)zFZ5J z0T34YT&{)700;~HF4w|k0BWeJwN4FcsIRqSL{buhl2SWLbOo1-61IZtdtGc@E~94dBT-^h6vpS|Otp z<~j=3AuIHTT3pj0Jun)9(jwZmJI6qI5%aps*CoS)_19ka1Lfb)vZ!a>0n$S4 zjy*&g>JF$w6XsRiI=C_+R|kb+)wd2BrQpA))R&3>MWZ42FA9xyt$)!NAXtM+eaTO@ znqqAIi8bLGRM!Hivk7h0vd$)SfT(Z5J}x*`Iz-gz%Yq0i!F|lXTDdGpowG|@Ppxxy z=>U#`tqFO+Il>QX2=q|VtzOYU{fDi*G@>JU2yb+!}=TZ7?%t%VxY z2TDjKay2%v_Y2-nkm~9tYgTO9TQKV}2Z`#C5GRe814Z?!Ay6QD)`qMhP)0T6)`pC0 z=r9SaVf#ZuYYMHNLB=LY_52A4sSXO*MyZYp3<{O2dfNz2<;gJAJg=tP@7qxjanhOcPmJZO1NjZiN;#tF7L31?>2mmDVOG za>VdLHE$eBopllwT6<~vTw4T0_SQ+XS}pl^t$O9CO;l!T4I7*?)is5hN(9wO+h~-V zonkZ7R2nr3nN($m*t#^S2`Nx5+iTXLXLl$Op+$FCp+u@VtxzJ>k`rpbwOWEgiiA=V zkcHaTY$#Qs#LVhK?Btpig%U8UsBO#FtgAN3!P&#b`NB~+@{>Cy-!Zu7;K8+>Lv%Qj z97zgfQXJU{{j)s7hGb@?ra82iDLeF_;pv`Krz<7Z;gzpf)`OC~St;)HbnkG7{!V2* zY`DXlmNqOkBgmivAuRAq0 z-Q#w$^6J6E9Bx;pH*($AGK#FdhjA%g;A zlj3p=88$RM1^>oQ;ngwKUsbJR`emfJQ`3i{2<5x0^^l~r z)S($e-9tQ-X7M&_J#0vtBP%7#l{qv$qq-%2!?iBhJ0(4BXj)d9%R%qF*4c@}(lSyr z(t*aAR-Nm0psZ3nuHjyX@nUQ}bhsle)$Pnmb$X#I;9c3efGg9HI?U@tZFe~a$EA6B zyfe5bJOm#f0c+UcKH@degZubq4(@}=kYOBX_s}6JUKi>~ozQd|*Rbt!q-3RJI^8Kl z{}1R?#N6$1xl&O_YP2n1t39~S;J9?>;5gT?!TksKnP}vx%j-zZa%CU|HS6HlX(JQ( z<=@BzJ^m?Phuh2{`M zrKKSgU{>dQ9jJy`X<0*tIWoBir+0Jfp>U5GX`Ymf^vr-zysldp$Z}+*JBJSSc&pcU z2afo7ro)>L$t|V>>U196k(f7$t~~ww-l8ZUo(Oy=CLPNk zj}Lxk+{GgUtBf=9_h+FgwZEr-km`Se7y z8svTkzfBK3?T`QhS54^{4!f-&Gr6abqi3o@r8f<7k3!~KJZni;P3g@*z%j@qiU%$@ z-$Uu6cNmpHCI`=!(N$A=haunz$ow)$$hE=0Q2N?~AMU^{;0h(@L3l?8p7h0suA1zg zK-kL;MS0jsQlkEZ(&tCmkC2%$76mW4@aRsKHl^dB7PDuCk2kWKX16c z@QV|e$O!--G{(mpj@+>Ym=+TWRlT2=;9e(SJ{P#^>{9XX1?KKaq^){=WVbso3v0o3 z1nxzFA$=6Q<>LXwZv^fSfvqlm=Yca|aJWPR1OmNp>P_D^#E+jWN%tfWs`~azZ-iw4 zvn-Lps@2yS748x+_oQ%Kb@kvb+&&J>MS+8Quj!*=y#>s;RIabO_ECh}Gl9A411@Nq zB)x(Uh3fR(gL|I}3P(95x;0A-oV2f zk`w~)@n-iX5hh%Y#a`mRKGt$=`xJMu7sOsv=R^0v;n7nL`t1iC- zaCFVVmZcgK0rmjTQ?cbr@LsJ^Ta z7_v*DI{&=|+$Xi@3ju$pkNSQE?rbgksC9p^>gDqz;S7)Fv6&Rkv>g&rU;I{jq?++jKT>$QOE&8Z@+dPSR zF+LP(^50NkCb;9=@=NV)4lqmHabEnl8klwNI5&Nv(6>)uD18*FYaf>g_Y{L@`Eb)m z<#CU|aAfuRIs@0I7JcNu(ZEc1$9c)`VqliLFTa$AJyk9AN3Ugx2zU@RG&Zd zQQtP;Dr(V3{yPs$&|;oj)h}Mkw=*z(+;MLHqx6jiCfyz9Mc-0jUUtX1>7()T3xVM& ztiC*of!ke+KFaT3zyv(Qwbhj0P+-E{ac=1&eM5nn;g0i?-zC7j=#F#KNB&zUFg%6T z=XWP?hkej@37DWIwdc1pFn!!{Zt0`?JX&CCOW$5}0;I`GGkNTHW zz}$4ldGTNCXEBe!heCD!qw=r-Guj>JMPD{BPr2i~lm-IEq!%h=D@Iz+;J|yk4|>#(02;a!O_vKzoSlZ zgnQEm9HsjM4;-Gqx!DZ>?qeTtb%6Wa2V6bi{^tXZ`j@XgaGv?4=eV1Fz)^kP?*q;N zT%`xj(=T@ccg6$fnZ9t~4A0@>61WM>$D<{own_k zoR&RlWJ-Dp4ns~##*alN;kW&Ay5Xm^q<&KWCejq_{o%wxPsxGaS@|2EHZ?mlCo|P< z3LDwUL}%n@rOivrm}ZK>@6M&+r_}I(yr?cEv6LGB-)ON0DSFhHvE!`ye@Dj2KgP*d zt?~t{TzQ&6HhHhrF)7q!lebyrLsmJ^*@B|2`CB3rCO=AZDhHr!6J`!5>DR~Wk;pI68Jka1kGweT26mlC?vD(}*vOMosm zhV8s)oV48-w)vv*(Ng2+J;v@OPt>*pK5V`qLDC}n(x5HXk!4>W#g`2JN zPMyLXP`HC@Ism05#?f1i-S<7w${KY&yScroa~owjue}ptYvuLZPG@Z46}#PB6z#W> z`fKAFn?Xu})QVN10yS~qmDi0IgR-9bU6-PL!0;j6& z9+m#4RUQ%|%*sQQey(W9RUYRoi@Kft1FJJto#b-Ld(Pb|UoLT$#FZJgAk%P5yp(;` z?8ucOifu9#2~uXVLW;D?sAM)7)r!@7s&}2ipohK&i5}&B!=x{8UBIO8RB5{^RjAT& zRr+0(dZE+_YmgR0qDMXkiP{O5N+E4yaR=16DmCt2R3dJ-t18inQXV&2l_skaT3Xl@ zb8uj8OYS9o%L*&C$bPXA6*l?N5VO297A0w-URd)xbwb89a9+Hld8s*Sd-hp$$;I*V zP61DoOXB3_rKq>|M)8F^>~-U!_UHK9x#lkm24n~Y6lTk8ia4WkPfI)^r*4s(dIF1 z@G;3fVk6Gj%7X)~NNKR>Oix3J1ZRXgOQU|yKJ3k= z$voNon0XS0z5E+a`%l!DjxU<;7j@g1Pjw<*o{jDaw`}{`)0!(GWkg(Xz|A*&_dFj;hG6%)eI0n0FRh%uzdy z1=NJ7>yIXHS|iR-*FT)R9TwrF{?rsNKM{iJgFYYnu1WUp5yv8m<$p0&UO+^NWN#rK zDhdi9cOmY8{{d%doFnM4v)CN9Ir}H)R%e+R!*D5e1g3}z%6S;3Irs)Iz#{bs(OiGL zY}gTxS`iTMFzk13rmDL$`>$9>yRVTQDNgpY$dbGnhDt1b{c`I&H=CmlWS^}HFtbj{ zEDsB&4*OjGj$m{CRi`m_yV)@;n0YzeoS;^0*O8Cn!=aq}IC?DAX6Dr}QJ)`2eV!Xq zc*R&i|KNlCG@ksFNDi7#!=q`49CVhdc3Ue-fQ07y+GZ@+jKs%AoQgPRmTwu?+y-;F z@TVN~GcnLLa_U`rYHqzEL%VqY&@$Fa_D47^QRnQBBmcLFg+|3$?u}|##F>a=)XMUYTj4!sC{zan#-OxMDSqx^f=(mm0@r zHkhNMvsv`_3PfXuYn6{$C+lZoBZ@Iw zGZrjFQn#4)TZ)rk{19$sU@;o0{gYj=+2R z>o(xk_=`3-6o1Wi_g5nPwb#X8SpE38SaI=}**Lnm7Kgnc9A8cPRRO{suco|I!jx~mno5SE#e5XoZ z6pJy9S6OrZtvWWDHwkhiEj_HbN7XyGVZ;uMN|utUI;d{OFtk?dqAk>l&68;f9SNxn zAA?i}g~L}sJuv^^QUsb?9=kgbQZsxE(okHfJ26Q4*XtM;e~#j|%3Ev>tI6hw4si?* zwmPhV)SHh(cTo)Bm4Z+Sx(!$i#mVO_@^xcD7Lgp|Psocd!Il{-+LDuXu!@T2uCqeK z2=xP-P4ovAb6GUgx1bE2Ic{1l=>9Ez3qt8%#u*m}0Ai6x(>VG`=vtttaesinHpdsC zlvk>xSxO~Mbg86Ygf67pyd$#0hctRyi~1KL7FsN!<1wb&2V3QUi^kwy-Hj8j$bqZ~ zS%D*oN?Gr6FY8!Q);wKUD2=DCdN@{w^l!K%W5FQ<-h43zx9J`mafLS&bJ1*U5d3S* z{{XjQI|f~_ckbH42o{DOYv;s2vu0yLEE zv`v7X&5m{(*d76Ibo-3Y+0q~GW97u0&dLBqfCvPj~}&=b%fai(v2sKvOLMitR!>WJMkTM^qw zvKeDfr)uk$uW4n#Ctyex(}lFLzj5-=FiX*se$)+6hT|NIH{g$45K6bp%!UHEQf3tIo)nPd2+!{rh${UXIWHWD?i&`y67U8Max{ANfd`d}d;VEO`C49AD zk!p#kh?Tcsvnw8JGR!XgnSNpq$D)qSiDUBnzbx5%(;NfqJL8(YF>=si%+BtPk(|EBJygn$R}vq=f7Z9rYQ8vL`Y+h znkVrwNZ;bh#~-R2G-onM^nXb6m_+}NunlU9L23_)I%!q75R^H zWD6m-!^^$Fw}o7HJ$-c!=PO&an%>8dPF{Kb3yCjaX_CxcMiUS&eXUAcRHOs}Fg8(%6eO~ZZO@@OlCbL zO39G6;bV~OYTPrBc;QjaHu%Lh1zOz3aP$N=`GQ5B7h;nusTu}-JsfBZ zTh61bzt(vY9`t zG5_RHv_!y+IxL#&)lOYwdxEFBccVB~amEC<; zy-SZU_}%U5-F@oalj_|nNH-XlJjgZEzai&b+LOM`?uJ6*ccaz2gCY50aKI!`y*pLC zI|~xmoUPt{SH1hGdiOi^F5iQtqXy$Ko5Hg0s8#;QUY~8SkH>QwJmd++lL)Ik0R3M& zp3KrtHw`9Mn>;1bhA0fmGlFPz#FY+g0MD>R);jsu{EUlfrjMtmxlOU6llLiip{c4--vq-0Z&*X z=?Ux9zVm}~H&#uS`=8cKxGas~dpG^F!+q6Vk92>F4YOkwEOQs~RAH-*JVOhtupy2% z_nC`g@N6fx6e~jKR!0GYVGo)x7VKPML1Z#V9Wmx@#@+(0k>)5qwxO$!Hp}PCU8=Be zm(zd^0+qjk7fVn14>BV;^aMzrh|xF4M5|L2$0xXfhd#$Kfa9zR+YCK`f$<1i3J=Ne zzeTd&CGWv{wGNi3+proo`|mJ2ORxwp7mMDbPCRKaNBxq$A!0{F1UgX}D!4f!M4hpO%~w!>J-@y!VD755X%G*-C_k?u}0 zA^Agk`SC~6=zCEwsY}4R5p|Uw&Cw%is>h!K{2o3A=|@~?GG>te#g(4(8zlOnA09__ zlgH6>A=G57NXOxc=vcPZgNHEAc=?|=`3IZ)t4;oqt#)a&W3yVS|5(Oiqk=uC$?t!I zZ6fS&d9qe2*;||C3gyvSmm|hChs^%_;ZE)G+7HU(wQnf{;<*~0vc+R7AqxIEp!gH( zV8cQ36V+St=Q8+n3HN73Hl}TpX!i;eTRgs*lz<1foJy|U<(0x*>q6vvp+QH;tzUSL)wlH9hAaZD;g)GX#vOjm}|xY>hfp>XDpzt z3$t8|qeobP=Ff}7j@@Mt^EaMHKZq}@aHZ21EAbcigYg7~dSWpyVi>@7$aq9Z<}1Z@ z>_+)R>Y1%YpVO+mssWwG8qXf(-fOB3}t$Yvly7Y+TjY4p&JKxGCblkzY}_Y+Orf$QfYuerb{;+k=^b2YkHR3m4~Y*iYap#> zcaP%A_ZYe%vwQ*i5F|cR8>C7jRB56r(Wxem%TOid2ws?3KF!YG;ZgPu`&~Q-eErPp z4O>>TCC)~Wb!!`(6F`p=>avQ!G`%>tnNn0P3L=UfGqGZf33kNLdLBa-t?6UJ%3^v^ z!I#C*gHEUX%szah#e`hyWHQxUmV#D5@m%+VG#?*>G#uA?OiILcBa`^91iA&bFJYo; z9Y^~T=$|hb3-5t?UbCA+!p=N(-l((z^z8;7)ZaoLamd41a0vqKr!B;Nv~Od@p6{?|($1{YLaTv3Qbd zTyu;Mv)26nW$1e31337A<#W*PE{Cu$cUbLu4&vNHY4(rU7{^Ye1=hZdsEF8MlMQ>> zvwNGvaD<-SNA1e4>hhCCzA?Bc=oUs1-X+s>WA5_#4wL}q}+UO z-_E(cFlJa_>kJZ!C$G7Kpz2#!Rokg>u{9w!D=UA(&2OpLst#dnLQmHM!^B{0mdb%K zj-W+C-P!!1z5E=LQR+`&9x~hH$iSRrC^m6Y!{{`PA%AFiFs2&z!8FT=<%-g@VV(31 zE^5A&5@MBynxNGxFQn-ihPeim-k(@C<1461tgdh+p=_9R<%26*gRSyFRKK7)#69W3 zRm!g=v)5Q@(L>c%K2&YxL)C@NP_>l{-zW{-HC1`g$ZK!|l*W_zW{}3HQYs|gMrmEe zaU&q{xQVKiqDq;nG*^}KREbR=wIi@>%LY!zX;>V+D&R%k>@m4DzWw($Plb^=9jEG(m_^8Azja>=5TV-WVA_Akl5>Suh0X0`IR z{1ZX)_KxgErT_N)lQ;9P8H~@ofP3s2I_p`KZEyYnFgGCLiu`j`Z%0-*ZDV8wJF-xF zvQTJQ=rgjy%A$Fn5zYIILeXb9nSkNbSnvq6TcZA*eUDa;j4U!<-i`4n414D6;gtUHrpYS*?6RdJHoI8TX|i0^)`D3SjSS|0i?L7cv|IJn zQajD5R!g4-pQ=u}bj)c@8!vp*DWVvU{@K2a>zO*5#i9$w!5w}+49%-F3hCnY^KD4H zCpN+1yhis|B{~nv_ZHGsX)&a?!7@lML*jM&O;w`Z2(Edb8h2EcPN~vaRl2H5ernBc z4Cx(aqYWgQp%|q5AaTt!;|XLt1AMllczB{~=4lQ#>i>L<7n?jZ$-~x8LMf{dII|n< zeuLc4AC#~uA@7V5O7BLRd1|{u;$G^jN-?SwuS(-oDN&VjA#p#@F=Flqnl_3CZM=mnUZ}t6gyos?3Thc)Wmc9n`N|H_xAlnM>a9^Y}`)-#o@p>6tJbdqL=zpp|=f0 zp1ll6Z{fqYV|ko1fGeA>k!;MunQELhLXlz9)e==ayREvew8;Cg6xxrLP4+NamSz8K zlbyQrzZUsVjD#3;|BNd+h4!v)rkxjvD!%98q2a&QRRDR1{U;~pp^oNR|b)hCZe zWPsPHR;omfFYur(HM7VAu3GxW1ll``)AzamxOOuxy(~&GlB_1+ zKrB{x@+d2tHOD!IvnAjQdh~fd|WdLi@u&YWO zh6Z$oTIy)SlUEno>*qe87Rx1i8qK8-Rq21Kv`LkyrE}aqRibqxkBg?gM3bn4*h|dS zE%ubAW|~~84hkv&?OHvZP5?B#aHUL8Aj7HgM52eI*Hn}&x~ze{O;Xeuv+hNc+^=bq z2&%Y)9E({oI2N;VLOD(@rKft_Q@vG*8XM1Jjw(@4$m3}Hh)c9J!KGJK>Hnoyu%W{m zmwXysO>QgKI!R|z=|LvTgYe%QELSvNr6iIMqf?iW3;WIt%ALWhq|2K;+!r$bhk+bp zrQKLmRx_){+&%vnm6hJ{$t@(;L%FD%YHGcCoW>g7(28?}W6Y!3$gwGOA#O=l`7dMP1#F4XioCEA0$%Ab7VL*$&OhyEEU3V=4%;~x z1ZagY2gebopSC%&PS_lCe&C2FP<3%U-Ov7@YiY2`PLC{=jaiiYL}ho< zYM%61sf?}HQ#LspyLgyZ%nPwN_?`gm&o+Z{zKW*xK+rZSlAYsIbQzTxaME8 zd>rGJNu9*d%Nv|;Qa1FwoKC+do}V25C3~+~z7%!VK2OF09?q-weEQfp`EQuhEMUKe zZy9<$pI(N8hKiM4*!jlnW~+a>E$R%NPsdS?g~$avroN5N?9IXa5PRV~I_jJ;?;`fT zBZ@2E!XLRO^V|%0?l@*yT_^=M99)Exs!gnkoxMNA%gVfow3kUJWNboisT=~O^mfWg z@nXsr#M|WD5cWn*PuG_7gQFwZI!0u1(jHNH>QV& zEm6Dd4_c!3+IyPi{rFxK)Vj#fFTMzGnTR({u-o1s-eJOSO(*>eC>^j>Y>6t*-c;=? zDjnk3D=Nbrq3j)%@yHx?3e%M(7!FERPP^rFUKxNFoZ9MrK+|XV0R0E6l@_@UbM8ny zgx_8BdrqO)!&l#P+Rfp{0-6}Icb)LAX$|i>O$MGkE8cV3EZ%eKE#7mAmBqO^GaYb5 z_BNZHcrc~D=k!DNA1;a3=SY;Qk|Q`lh?Pj1*uK(FwOGzmaFh2pbeM+kXCH^O9Up^q z7g{8bqla}oj{b)Sj~lJV%~j)`QsZu_akQ4?+$NB?wZ|cGEwk0T^ti8t*=+%dGf4a{W*^1^FeG!|;o){VlM^RLN0!z_jDsoCmZx}>VU@3)CUDX4I{DZA_|vSr zu(?G~%COr&gD}l)n8Wb6EZ2yUfsdUm9wov1ay9{?*TiX@F-SCUx>(buS+xIiE#jEg zjKniLzC^`g$o%3u=u2nEU>26!3<*Ia(H5{jR5iBr9pd)TE~IZxaP9{7Rx%}5oAD@V z(_%WQ2^{2m0^x16>;E4Us7;KUP(#U2>~&k27hlATm^Rz^Rx}FcI^GG^cG9t)jaAMS z^Nlb2J#@+?7Wv^##p+=D>AjTwbUHA%jAd9|VhW@(dt+-vwg)OUknnDc!osS@hSPJ{ zk)p#p*a*Tmj5d4l2OG2V!*Gv$Q`)xDLm@(JNc_F@5d?*w=E#%b==&e^^NBieHfWrI+qD*hI4VBsMiy;&i425zB@cwChT!{g`-#*_GFkRF4?E5!mxyrY#NaokI)q-`{QsK)(Il{Tpo^})exv81eV zu=9jv&Md0@;WS16f3?t|MWB9-gC1L1B#=n=`BK!uj|8*z1G$Z7j@FG_dPtS1_vCRS zRB3`L;jK&BEs2!#=n*d7V0A1aA^&T-O7@54JbDuAU~lQjdGxr}v52n5;5>S0YizQJ z{>XVj=y@HB=ql&YQ%lDpy2^P}gUNwd6Q*Ma1s+ReziZ%F#O}!JXwgHbQ?T_xZ%WZo zs!F&X(;4=>CQkmIj#yf7u$1a`&4(+E1szD6+=sUDVw9R&^ZCisY(7Z8)q%aeI64Z+ zPaYxxRsNVOTOD0!xMJrfAI6EtPvI8j+$5gd(IRO(4@ML2!X}5U9(7Pe!(2rax!wD5w?WSSJ9j?hGSJk1G) zW9ovjf;JgY4*V4t*4tKXckOJ{M{mBLx~zJp6xrfk#xIa|;A4<(sBtY&gnX}*j&gBa zsv7s18b=Rx`CWQSQO2~;8imKvn{-@@S(Vm8;%7Cf^7FR2QDAHTGj}fPMdwOs|>yS zU@SL?$5Ya(Xo6!aA_!i?lZ@*P4XjvC^s@vya|5k-I+*)+RR{d$jK<)aa76xsal-bC z#wIc)LroL)SHc!@g*mXul_Q_-Xw&4X&SEe*j;J{3t1eE zLk(Em?~tBiaa3U%vABB3%|aGORflV-X6!H)ybd56KlBS#^@m;fxj3&s?D8Gen(DTL zv`2w=)+DU5_QNjJ0?`cBp(hGy{f1@Cjw`RPlzA>KQ6=goc-%@=dQX+Kr3}q{=~2J4 z33Z*y<@h&xUZg`jH@h3Uc&iGB#9JCE^0zwM(~lBq@33$bv#2d+*!wY9 z((L4YSkWAusy{{@;t_N#&SsuzY0Q2JN*xjSYDJf#R!9f$H)s*Xt<%q|KWAW4G8`CA9me|t3N6-es_&Yfw-Pxl3z=M)N*9gtR{)Uj2DYo zCG3L0SzIC(z5een`86;|4SEGg4SEJ-5t?QWN{}IN7MF;1p2hhY10-W|J;?~Bv1dcZ zEK+Fr`y4}2D!D{V+6RQaTA0tPOfC`gCTHRilpzly0?l-kup0tTC6|anZ#pZs8X}bq zBx5#D%J6s|bJ*D@T+J^*5A(sNA=BMgO!3P7S zAiGftOl~Y0dId4EqNNSKajr>~LLqT2gnAVpC3v%UAGb&UO%3)W*ppySf;|cLq&u=l zwy4`xf;W3zg*}c@@hG&ptZ&0~uvG~MAaD&_A`K674Q{P*l|sQ^+E3;zE)mPZS;Gv{ zFtkL}rbI+a6X_ztA^hbmE)k37JE#|R>qvF&C?f=gL3cThJjSJ9NSr~akMU80H{HXz zZUIsBlEXFongyfVifFN{FNN7Pwy0N&g#E3EuSDnO<-G`+0?izqE_XONvWmZ60T~ zY9O`hWt3WtY;nHXi6;Au#f`Fp5*xC>QwPcWV_I{{E;k zxkSvxBGrL3j-9W6Lf>xb|K}>PbvstTcBsIw9W9T@Ag1^U97MF;%oUz&y zD>+E2JGueGD=ex#97}bQOH_L}i%_TWQGz%9E4Y3EQS?#?YiZyT+2VRhXC8P;@TQj* z(P)EieN<-`)^X6ekGMp+UFE{6NArwCvOzN|CHw?|v$#a8j~I*hQD|WZ3WM%)9HpL1 z!wuv!3Vld873FDTB21U|ng>mH;Wo z9wcRqZYZT;77{qcaK26=S3`>$CHxG5dw@%nN7|rLysi1ItwO9vPe&Y;6eT|P2yy@P~bqk21mwcev*DP?oq;spHR7L7JQZ5nmZ^mqIsDs(t zT@0l#=q|@m>2irmmoo^Jj*k+&>At{q2iB1Sw=|br8P)0L4AM(0LnV0AeU4swglp=k z)^W5xM_e!ITwRM^I38uv9(r8;Q=MM!AJX|*EqWWMdMQ&%nO3KlmnrG|rWU=yLN96p zd@jM~68ta0?-I%wKQ4&5OH0hm^>vAS&HWUnN?jpwyJT}H?~)OxAoXdbAHhM3GGc{@ zxe;3>o@i9eS6~wRDQ8B-8DL(UW$ZL)?Q>qO9Pk47EcZ7#G+6Q-t>m?TsI1k8udgkw6AWle5@8rpK_$x=%vfG zqF0aMXv#HD5$U9UTnXOv_T#yBS_pvt{#o2-SwJaa0|c&xOQdCBjdnMx3@#DF#u+q94DcK!&H$kV8nw7RE)jbqXZNcw z_1jWk>TPczg^zA5HGHRDVn8_ODeacNeS;6zz$MZ!o@r>`EI?|8^>JgYkL%L<7(roD zDRVrPGMA{7Ig?PwTuQ^64f^d|s@o`6WepCNqMu5Zv-Fm@e$q`l(Ms^9Kbd=h&0XuO zyGC6U3jS`whv%G2l*1W3RZRn=rl$g>2Iv#mx(Rm_CZ&htDd$|GoO33j*5acCZ#JmD zP|ndc!3JBC(b^2bHyfmXAH(yDHyd;o1pV5C2GRt~>_%Y+Y!G%enr1iN7nH?UDs^4T z=UXV^p5PLBVgXMj>)Wt;JjFY3g+=AVvE&afkv}+#P+xvdfu-qTg;( zf;Ss4avOlSril7Hj;1_wi9FBslFsjI(M#(>Z3I!gTAg0*6VmxpEqdQ#di@#(NDZ^~ zv)J7(^{NvaB7QbzvL(!(Vx2dsjhR0>N;l;D#{NR5xnW&$Mp+@qSt`$9L;ioZ~n9^EA*01 zIwhwBZ+Z{&TnE*af(8Vh4>)1iS0|C<+bcBu-HH$Q7njJ|ah{^)fl~7=$h95&BBPP> zUJV&fVN)(ShiVs>sCEf9BzoIf3Eu4ds>`{emvXM9g-euku9tKUsYNf1fd107tc0|T z!Ar_V@D1cHY!#cojsTShl)MZG%Y(bH_L?o!ICo7o@2_*p=jlQvzTTj*|XE; z^g{v$X5zoPnC#g}898b8wAm@(C1p)FJ&|UgZt9q;^4a%UX&Gs=lF~Ib9n;fuO-WOy z=4K~Noonit3Vjyw?_Y!oQ&P^{S+i1LZK^43V#nOB9djRhh|$_VWODu9sjDezN@lhl z$#m6%jO3)GrkVo#rIQqrMU*uMsa?ruTOI_9XELk=>tlZD^1rq9huo9dFw z9PSKVHWf$a^h?dooRyoClHHH_Theau??cCqg6pPEmvH>)Y1dEs=s#0lKKMenw3Tg2 zA9%KX&jH_eKmE#ph>BKIx_9p0=VEzq*OT?me%Li4_=S^CUHJI7j<>$a9`9&8?eEuD z_ujli8qoO0;x_x5F8}G&hK75u-?Q%XBVE5-wX5^)7mf|=JLb_wb$4z1EF|QMRbz83 z_x!cA`GkA(l7>_St}4u15F|2=keL41Q_ht}lJ%WV65&MW1ezFqN{eE5ZHzYSP7a_fk>FKkHr+&Sy( zE|KT$BTv8EE9!sOK3g$4A^G@cA&Kqd501<_RdR&o4NNPHDM3A(-&pg& zl4<9|F1~TuF*$kCh0`;~B&0?hoO65I$j$dP{q8sO$aj?dy?1Nnpg~VQe&Qk1@`^Lf zpEy3NxLJJ1hi6TRoA>&-Hd7DwUv2s5ueIN9e(a$?cXxjK(2D=O-Q>QKfq!>>bNQdW z9=QJ6nW+EG&in1L2cG?7wX^x^&r0VU`la!@Zxb`>7tD#yO}NzakBd27?;RQ0aKp5L z-ILc0-`FxcV&}k@+hi4;{P0qnjTh>_b7;e>@4nZw?ds`@Kfj+MPigbpgL@nI?e(f( zVSMYg-w(O8s6*MQ3(uBU{vP*u?z!L3-55UInPdu`lG`;5j&fuyxH!=%D=LE?ru1t)%F3`#$QqL zKc+mX;+qGnzF#tV|Kwl3d-m7siTRtmBzO7zv0vY9{MCUbQ~noq{ln7F4!sp!_`~V; zEnnQy{opOzhl&CoI3w z;jiev1M7jZkjZllG! zT0T-|<@Tq#InB?H-?i%ey8m3AaI628n|qthSk>s{CvqF~s z{NkLH3j627dLPdI-ISiWe(kJf+j}G}Q|jxy-7_whAF?goe|q+wp$>bGPoMkZkvbhd zPukz`rPeP#?O65u+>nCeZtvwE8Im@8fBpi~AHQ$!9eMlrN5|c=nYwRiyK;F^Lra5h z_2#|hsPlZ$U$D0*y5G{PjmieE`)bfH^V%HQ?0$dOL)$YR$eO;k zQPL-?&OO{SJZ1UDHwUjYZ&Up9Z=d5orjD*^GpnHd&)cOfpNMF6J?`@zJ3ecD@$JUt zwsw^R?`i$c@+TY>>(2()pFZMPr~4|?mp%Jc&!aa^J^lOdlWzRgGvLh|7xNm{?{IF- zvKvKXKmMbv)m-O+SwCMkfAwXT51)H{_BUM<|N8x&7O4|o-uFOOymTNZ?!_fjua}Q_ z;q@(rJKx!~W&8AYRo!>S9hlRqUFUn+rM+Uv$!gmr>-Ca=hi~Mk<&IdkZp4Pb1>gNM z=h3Le^*{aP=%(J6zPqda)lH?7Z_Vj;`{2AMSFfDXV#~&Ir*-X;qW&MgzUbn|eHZsQ zXi)r<`^77rFP{7G(i2G^zt-W{pr`vbJ`(%+gk~?i*0FmB!|;*6EB(P2skc5(y*c~~ z<@-H#8cKv&yPqS?$eyh*E_{yH(Lx$hFj=Oqx{aq*4 z&RI8L#r>;)`}ou7dp1wG(fRzsR`ruR8UM~0)A5m=-TOWA+L+6~6x2O`D(1@#A%($R zMr@otVeGrHE9#xymhr&b&CcT~%8I&MD6V<0>D%lSQbDs#f4|2_)P-)zDN}N% zg^r>~%s7ErtGiEMy4h3a*h6P!kWAYB{b+(s8V?L_W#&9r3{8Ih{rcfb8mGK6FVz!M zmthn=pa0Z)k|&0?P5k|0g`P#Pesb9pLyy$`{b*TA=v|j4Oy((bO%GY|_oFQfY&c6( zpGmgVr@+T)3#<%Pc=Ef~o{<&?K4cw%TF z;O|EZ07}`DkA!aW#57_UTBuXLUI`zBQY4M8X+}1nhc>}!$ujt@53z=E#~2x=J+2hy zO}<>^iJ?WGzaK4!$<}9v;#WN}wC&>WN1KzB=G}k9E%C%OWf%vpl#2DcinBd2R095f zw5X<%TXDu*;fbL|nZF-xq!GGq?~hTN-SgFgVU#ov-DkPq6VsAmXydpwq^##c-}J=L zBL{y!T5M67rk*{N<%yxCp+B9)Vqy8p6{y7mEB{(cd-QvJDBxnQhkU8Pj``{jX3 zHK6z4O<|sTQ0;)BHpp7hpYy%sol4u^k2Zg(wk=uu(Q;2cZ5f72mO|F=6<*rTJ-FlV zH(2=jgQwpc=c%V1!>q!UTF8rC23+#Qm>8yzuJ~Npu{z!p)1G1I_z~6G--gZr)ZK?2 z7-j^nv`viW!*mxKa-?BeC>%PfRC<*@kN%K0S7=@9v4| z%rG6Gp7b=>-1=irOc#dfjLJi8XH)b@R805ubY&Q-`E=)C$B<_{>nh8U-vrzzAEx)I z^PwlE8}9h~6$#AGkL}3t#2_0kn85OS=p;y^Yd;pwFjN~UJpW>HAI~(SDnJiCLZ^P? z=bnL2dt!Pr3_YZ$Ua#40^UIzXYN7sqZ{tdRUE%8Qyy)r0FgKA*^5Ndz;cy0d$~Dcs z8HRjF;n&wY?)1bU8?e%^4x$64{!GL zVPA%Ub6HCNe1AKfL1@=BquWAyrqC6iUUB2scw(X$W;Cu8h7O5+mt*J~DwP^YwuX@C6 z5HSYEO3lhn%dn@ixBykp7L}!FKIsv|9L-`COgldXq{Kvvn6A)FKF0_nVjfUq=$$bh z6xPQcF%=@FyUMyIV!Ej@_wfu%9T3Asi-@^bjhQK8I;t@*h?r0{<|`3%pBi&i#N4mO zP}`u;MU64>?BTm&JyyiDS7WHpr_fG~Q68LhQe)N%OlLLbsE7$uWBf%$yhn{`FJdG$ zX0S)hED>|Jig{JUv{7TqL`-Wn=8}ksLJUtxa9y4Y%~ltWnDHW}x2k8Mi0Pxod@N!j z)R@B}rk5IXOT;{=#)MI~g%GaBOcyad)tD6`riU8yy@=_H7@muxA|_Iexh!J(sWHLS zB_XtBF{w#Ya#DE&=1NK_-zP9em1Pq#jn$ZGA|^zQafq0fYRnoD(?X5eBVwAXF=s_g zuo}~p21|q{YRtnT<}Nj6s)%W(#>^KnfojY$5z|zSc~8VNQe(D@n0ji=?;@t58WTj5 zB!v2E%mX5(l^WAm#9*UZl*Kd=6U1Wh|I?>t&E&1?J!m|pa4$Z3Oh=EHP$fpSb-xnRGeX4CoP_D= zL8C7P6Fw}ar;?!dN=y$L=_$}i!ZAvEI;k-8ynHA|y-{Fj5EeFH*z%qfX!1<4EvSuuIjm80jrE~mF^taE z!zv4cbYw%Hw*ypLn*@ttbhaK*S!Bzx`^hAYwOgH11FEfKg2ga8 zTV|C-wi=)NV~fTLq^T7G!{}@cK&4h~j-sqs(x-M7@qq8+gXKVb$ zXJ64+CR#=!FpSQY6|tHRmv`-Q{$ABqtY9&W&Q=^_DL%}6KdP!Hnga zua2s%cLa-Jbhd`*Y*D^6);_^v7@aMfhpkZ6)-Aze7@e(novn9{^n6NVb)oDcFpSRD zP{i^bGrIro2R~lAU$r$}uoy;Xi{`)nesr7a{4-DFOwm|*g2ga8TfaXsjcG#V|TsBN;1bs8ZGfnjvEMj=+qS46)X z$23-V!D1Mlty`(zL)Y<_TKp< zjkR8|7)EDnoX*yihrW1CWBn#r45PC(p0SiVzrXKRqe(5V;KsO#z%V*nk0Ms{;dk<} zyEWEBg2ga8TeN=i$3br%W}S>!(_XceCRhxkvo%p?>(`je{WaFhg2ga8Ta#24S)+cw zooZ{dU@?r&7VS=J`I=o>ubaj?Cs+)lvo%>|k*yzp?z69xYU^$z#Yqyw=xik*R>Uge(}>j}YP7@e(YI$Jl2hhETF9|;!2=xj}AEUNQV zUfW+CzCvUDBv=fivz4Z^H7_)Brp5|xf}02oqq8*wv0A=P9{TAojTIwU45PC(ld+V3 z{%qzu_iL=#g2ga8Tj`8N8K8Wu|5l=)^WjN7@e&Q)fNPa z=22m4-7q$#I7wm{ovlp7YIS39^O;VK6)ji{qqCL8SV|vt_4vH3s!{Cj-bkbOl3KqlYY|U0#r1!qHhDTbfwu%IcVRW{h zP+3%?e!2czg2vh`SPY}HHHWd3_BH>bwwE;46~ST{oh@42YWW&hbT~v~brnux7@e(o zjHT51h~O{&&{$Ihi(z!O=IdfAFgjaLt1Pl5b-pxJW2Fif!{}@+ zWGu=6vF?6uX(x@fLa-P{XKN8-DScG<#NQ1XYqwxAjLudbV=3kJck#PNHI~#8HxU>{ zXDc7ETHR>+K-)@<)l0A#MrW&lu|i2D!ipv1hxAf?I9;$9MrW%KSj|?~;E9iDtp5rY z!{}@+R#{|=%IiVZ)>gq{7@e(WR2F&udgyn5YOJe*#V|TsOBhQjuagUlKh;>B@4`(4 zhSAw_AXdxQllLt;q_HLo7Q^UlEoCgFyjqr5PS#k<1&d*Hwq%{H!&l$@L}P6eEQZn9 zdX}-2etzzMzjE|ceRy547)EESNN4NM0X<&SSUrU@hSAx2jxP*ct5UESMrUg| zV^MigpmDjMYO7%@9?LK~TmQigt!`|4zkIpI>LyqWqqFrQV=1;O3#b3mShY1=uoy;X z>m{A7Vdg>0G**saF^taE%Z#Pe`RgMuFV|Qv2^PcXZ2ebf>+JAJ^EB2*!D1Mltra?3 zk+csvSA2qRrUq!Nj)KK7I$N(X zmeTk3S$H5vW5o#;!{}_SWGpH#vQ;_fqiY&#mS8cA&erQXTXh}^!i!~f5l7(#!D1Ml ztv7I&?-7x$I$t*|)mUE&7Q^Uly~$WgzTTZS)y4Ba3KqlYY`vwk_3p>Poitmw1dCyG zw%*p+YTB(=Uyaq_Zrns*7@e(m5bN(3PFH+-{{F}}8f%bXF^taEyNspeEB=eWyJ)O* z!D1MltyPSr^ik5v!=)jb=LL&lbhh5p*`hrnjrEOSF^taEYQ~~&h4QsE?Bw?v>y%(I zjLz2kI$Md;9?#TR#x}T#z%V*nA0Sq%8#7-IJ*Khx2^PcXY< zFgjbG>TFHz_D~y*)w(TiA~1~3)@O*-eE8_62#FYZ=Rkl!Vy)Re{qqFrnur6cDj}?71)*iuP7@e(kj3t~U9l5Y?O>@=O z1;Jt%ovr`rY;9b)H%epOeGhITFpSRD7l_sG!3L|gVg!p}bhf@^EX9Z0kS~puDOe1n zv$dYFl(zhCyLVeQQEj~{SPY}H^_9-n+VDdm8mnBe7)EDn17lHJrjXyG*_U^zw*1=h zSccKr+K3xkdC|D6v9RUF0>kKRea%=(oe#F(TduJt2o}TWY<;7%b*dml(pXCbi(z!O zHZhjcN1eWLc#OtcFIWttv-Pdc)-Op7x@fFZg2ga8Ti>ZH2-2XJkN(?C^^GwRHH|gGgqsM(_~>nwP>gD8 z#D`pv#qD6b~E=BpI3nystdFJ^13FHFRdB!+Zjt~%ip$by{wU%ufc-FFuJ<2Luc#R z|GhU$W914K!{}`7WUNrS;&bk^ITnrereHCQ&ekrSt^ai!{FKJpC0Gojv$dPClzLd1 zbUjdG{VP}uqqDU~XKQwR*Vw(WhjM6?!itOAMp4b&#=?aXI4c8TU6-ZCM42VRW_*>1@&X zrLmq6EQZn9I?Px~J?y>o=ARntJ;7oaovkA}TTk9N^0CG`Bv=fiv-JaG1=AIu&Jl&r zYplAI1O$fB+4>Q&nh$$k?%P6R^%g9K(b+o6Sc(tnSzCS8hbe-^FgjbubhhSnZQ;;Z z&j}X8=xiPLu+>VnwO+6oMrZ3Movk-U55O{BsZl!xi(z!Oer7DCk80L`$ZHK$)=z@P zFgjbm=xkXEUwBhvHS36*2n?gMbpo+k-}~#QuQbwFR>5Kzovo9MrL^VXY3m9#*3*K; zFgjbmGL}*|KFHj5pT=4*SPY}H^_$MtBQHBIXsk1W#V|Tsr&L=Iq)$Jz(5vDkB81+@ z|1ylu*6+BX)x+&mj`!AB69kK4bhiFrEE8SvnU-iisj;3HEQZn9`jfE~A3lGyOO(di zCRhxkvvr!W6d#5zk)PFAw*-q}bhavWwmLqvwersU>GLNM2ym^>PX$Pwev`S z;l96LeTKr1hg2>ZgZ%;V?H!?qFnU&%j`fV~mqd;AtzZ#G&-$CO$fFb<{_Mqm8tVta zB8;AO1~LAA0YpJqmH%9k#yT%pgweCkBF3NoTMr9MPoKN4u^NT(SiO6ofNpLLSmsTLgDwX|rguueRdFnZR%h{2m&{I=Bk^Pp}B1XI*0~C57!jz1mu1;fMhXgweB5?U2G&{I*naEaoMR z)vhy-CXAkSgRz1I>qh&e#u{s=U=c>oy2)7e1#9($9W6Chj$jc+&$`7}immrvON-N3 zMS?|`I#NPvx*flSkSq+4o~hGk=Je^sB5pH1=at5zfTS;=BOxJeR#rknN_KWert$^n zW0P~U#5epLLwe>^@g+4oB}It%F$yg{$)1@i;vuF9aaxK!C1Wdp_1fDqen@CWCeQs7tLUKx$eYyviZnHZK%&b`OiXyVbkO1LoBW9;l3@S)RVqqiTUO8!9?DB2gOjFaW@LCvJvA)R%2_i_LQd3Q8*(ovydss7oq--u%PW4($I~TVa9PYfU~R&0Fn6$DbfZC3g*UOAKV*ZixZU{T6$0et!tv z>y-4gsS1ky@=y+Ih~meXa>Ok!d^nf=tWxy|HdrE4fX%5M#YW|73k5@YLS{yapnGo| za8Ab5l=K=gytQeiRINc#ZCs3M^`5mGH8Cy?g2ocAk$$WJRbJ^jh5J)cH4-%M;%BH- zvfw44!cCpYF&HxSUQ@w232Of?`oM&Y+;k=9USa8J88dUFw48*D**W|Nr9_&vY-u`Y zrDRV_N#MAIEc~dJQvP05Yrp-KFf~0hCl@U}G&kc31MExpm zyH{!Qzv~o*4ZDKt8@2|;US=9KsP=}gL3y?FlNwA^&#A_cR-#lNtI_NR@UzOKXj=J=cZVvWUHJecRnrsfPRkbn;t5vNEtW~Aj1Zyug7wFXKNog6Oy+hsW zzUDI*FmHuEg1P1g??khYV6HjxPBi-nuGPsdQ?y!(&K2vEVlkcbNwI?UNwJvv`J`CE z)~Z-cplemC;CQL^sG-ypB(G+^Ai2(-KI`-a>0`!S`Y4{>>RS-cmkWU>JG|CpyHL1| zJECwa5qECojwswpuRFJLM-*7ax$dJ-a-H9QE!z+_#|KdG)3X5C1Qx>=7+3)yb z>rPqKIMB<&OIcM{Qz2?%_-;g5kNa*!WpJ-~_I6$prgC`s+!?33nozqP&w5Z3=MJ2P zorybe7@>VvuIy*{Za`(+L5ZlGJ17yAa|b1&a;j^YUP?se`0g~C#;H3qzI#qjyCZXV zPyuQh3S9Pls!6shqM8&EMC=aLphQ6kC1QI(+pSPn6H3-#&A86KIo|#!}av_K~K#X;h%6H6!oYXBsBH#MN`cnT?O*me#MTV zsEoW!Y6ObJiL})S)z^j^ppa<8QU_G3>qJ~84;aqz}_3qHa zxptr7wYi1u|JLRX4ysL+vRPc4HWjB+=zUhFY%c3`)&liGEuS}gj7_{rcvtU1(V6jD z;n@=qww0|*er;G@A$nI|A;d`Rs@YdG*WKribo+|dIYb?{=t-|@O1Y1{+}5`;F93bJ z@&e!*dWp<=0dNg90CZV!*>!i>(G^3PPP-JUH|?FN*mb|FH(Jxf3SBiys1fOwpc=7y zxA>x09j$%P>l>D*R~@~5(CZtP>s3c{AN2Z$)fbxg$4CDkb8iA4HP!w9r%ZuTmMNPo zf)prF_Lj1hik-F1w9`(JU4a6nKn2>`PFYkGECp+*;)?6zF0K#a0w^NIihwAKsE9m1 zf}&C@3a)@+f1h)6lbK{POupa$@Be@OZ(qrrIrn|e-EVG^X`*eeFpSnwpj)Zejy1QM zv@Rpkx?T{G*Y$*myzF0@e1bamC3A0{k6bzO4YtVD!a43R_=X&})un=5Fm@C_v?eXNgZ0QNkjB-^!BFE)*<>uyjZ0RE? zCVj++Icj9G+ntkT&+ug1(nqSwkxqNIJuBOrMHZnpqp}^oJg+lT3^>FawN&doTSkV{ z=giBp+q7@aQVEC0mf_3tWM(?Dbcp)mEtO5la%K85v$C^ncomnbb%-{v-7UH@Gcxra z`0Ke;)MdB1b9_EuE?mg(rb-{-FG(N4PS?{%$Uj#qPanZv+m#+vH5qoBDni#*`Lv%-A`rUlIBp-FDrxlLbL}m~-%JKIoUR)3M!qx%wMfS%{4jf?xGP%2%+R)p0f< z&Jp~`aN=UHJ<&}Np2tQZ3R`?!-b_6=4f@x>Si2J?|IpWnqaR222IG&w;lBlh+rWGo zf$M?{odpxygHokOsT$|65c&+x5J$l%e{-RK(F8XHT-$g-NXJGY8k>Z?PD;1_F@?OcNin? zCPa7ajYm*mqd@)9h+7K%2{2O=hzj5T$loH)Fc3Qx$b;Y>lz;0l*nk>wG>*EAlKm+Aa9kggT(U`StO<_F z>oLhqGr`eYWlO;I8zYzYDts7~w=>%9o+~kDjg`59VYu1QPff?0x3N)xdqaQpVEO}K zZg4XUkD52;HbH+)CSF1#%ADH&f*xc|G4$^r9XTVDf?$hFvIYMuIO(Z<`+!U4EV`M@ z8Tj*=^p_8AfeC-rCjC7K?wJVws2p`B{T%>zEP}rd@OK_eYy9&J1+`w-LSELd(7O`uh@Gy$OHK@lTsQ zuu)L!#h|=n!FcqXuDn!#^S~_8a|ZtI1M`HQ)A{QLe>*rs`J)i7{*HnBK7v2WU(;OX zM%{(;*AZM#&Z_mI%U>&aNjK>)8{Fgw{-}K`O!}(<_n--XTfiL9a|Z2k8q9e;rz98yjmV|IvN9g=D19y`N zt_8STL%7g%iIYrlRE~R1aCDydNC+2N4)XVS2p5_^;+`|fy<(EvYLcrp!BPF~G07b= z$$ephqyF+u2p3w zdqTL-`lI$e7{Z07OZ9Tt1V`x}4dFu5rT%gvgbPiV+V{H58*=n5!cfMNAqr<5H2)b8b`xI zxX^T|U!|Jlt~AM|o8%lOIJ%YM4&g$}+XmcB6CCw}ViO#l|1LJcQNO?41V`sv_nP41 zz`bIEqsy1ICb&-EE|}n`zqGv?yP#mS&Y^j&vk8vIN7oPz?H2R^8cJ#fCYZiDj^6Bx zTXREQ?hN}x?*y;MF{W2VMbVrg3yWs=GNsNLKgoIZ1Rd+c?QMIGdwj2W8f<5=J%z1M zh-!-u!8vAHSy{!L;-Z2D(<+LK<`xys8H{&CmXs|UJhu$b7gi+Tcdw@knH{d_jnk-iSINBqf5o;DEEET0MMCtq~;>GHP35i~5zgMagce@henNB()N-<*P z-l)co^u4O~%|-;PxKpfrZ*=~Q>DSivgnAmbXu*yBbSBvX$sF}a=S1ljQL5*OOrt~& zc%}D)68SVzB6!jfPlS4Mq(r!XiMf?lC9HrAl|e)`B#PD365_*_CXf(a>gNefvQMy2 zvQxb!+AC9q9O-P1blfXl5T&!Xv`MK&RV3Q;?KAAtX4HvN^;Q_NvR2jl<2_Pzf>@oj zl@<)1%IJg`dt)07kKE*?9P^^?-%%9TG+9?%-s+P|MXTO)3?oJ)(5ZD@6|wrGq)r3KbNk+|nFre~$E?NX^=+KQ}qx zvYcX~z49u--@LIdZN~hv+eHb9ixOo+LLTkXE-${s2WNgbGISlbXyIY(=QC*o_UO3K zy@&l=CVheZ9ZdQb`&mq~ZjN%NeC(C>uB!F-we}FK@5GMT>5r|fkGH;4o3^u}yWP6k z9_4A=X>WX2Yt#Np7OpawRMPWQDcAX$}Wq4sj=_CN5hKqgZe%CvcGjhhi!K|o^&)!gz;`RpH7mbbIw;=<6BhTvx6WBoG%8dO(VXqPsVmOF(BD#&Y@?y6_z9V*+UxICSs&%^ zSb09mAES)EaGx}N#9&^G7U-#AO_@Yvs0ow$Luy24i5607D|h}~dA_;z{@OY&M=SE5 zmFJr%@-JMjJm1RKeq;^VYTRv4Yb<*S{-LwpT8c_#1DwYDd@pwK(k>eI zGl@>baOVZ5SxFx3RB=VvqJ=}MBuYDJu!)uL##CNtx@3%4@UB?H4jIzgTR{n;<%7l( zTWLL7x0P03bz7}$Pb-+Ztu!d=wzgw?>Qm@3w$5U~2biTW_M#-A4pT(9Ky&t7HhQ{4 zT93`bI>4h$nveY>Oj?LNO;i@46#Ivm~jh}%lJrg}_5jm78JRo;{!3b(XI&k5+fHQoeKln#4qTnRQ&ov~G$ zK}cP$SK7-HX63Tzi+1LGNtenu&p|INZY4@9>5iNz#Wi$E`M9AY%~_R8e-jovn`LsJ)~+t#9VH72x=EB4!^ z+Pba(P#bvVHoZJ(0&PW;rL>AopO}^EJd!OA%_K$NR+od>Fq`_opdj8RPq?mB*<^82 z@Pvy=741yZ?Yo$6R|t#SQTDT>R;aY7I(uqf5}UY?#^}1r3mwYmQKu@Huri^>LG#n% z$&_TKK1sVS$z-D>E3aH9Ebb)NR;zL;qrz=Dx9a_^U5n95SB!z9BbeScKe)SW8JCt zqzaoynu>Zq<{xG4VH4&m)37?y<-J&s}PXaHusbQOYrG36;XpAf~~L<*c-qT0JGGqa|R`gT}~6lRH{@2eHN;W0#dU zfMe7~@1YJ$IrbKOoRJp2uKWzOKN!TL3n1P$9*g6G3ts6^Wg{x>7K|}(f%nY>d*%5? z>#95|dn z1Jc^n6en8t^O>+=44VoYQrKMBFlZ}Hh7En#Y}jxGn+_W~vBBRE=fR;RctT9uT``yZ z50dKSwapZ{u#U>Np(s&GZT^gF>)dJk%7(EL+6Nx3{Hs~{RP;zxzPhYxE7myGWfev_ zTUlMkI}4Uo{i)*7QTAZq(Q={-KQ0=rt|&pOHKULLr9AP^hO{4>MR)+M@ClP1fkeO0 zvIvhu`j|;iL!yJ0MR*RU`Hm>xfw7W*{iV+x;-wf+fD!6`4Dz?}DYmromZ zvsdTQ)J}_IO!u_($KZ>l!DJJ0>=$W8kXK{>rShD`y80?4P*x0SBzg zi%?z|l}l~W+n5qPGuPAKqhOsKKTi?K9B()jnL`P4afC(T1Px#3eE8BOiJ81tRn z?C8>?MX57QLz!{Z5JexSu;HB0y6S2~#Tw5(Ose{!&z87NBSoyDp@ ztgE^+M4k`45~@>OX2NAvBaT6s23s%>fU6v|N*#VTDFy+~+irF^5M6Ln;CSt`Gc@|~ya*S*0^!4@raLQTp` zz+tL15z;j*b_t|=m{bLcmbTHtSv9sZ5|(58LXu;PAj!6sYV3MQlbP+4s`Ot-at?k} zB`gTanz6aD4$A@w$F(}!M9kl`l4s{PH7_M}rdnC~<0)i9l$ye+Af~)0R#(xu7prqt zc%-8=WS3&S&(7x0)0)ZheiWwpnmibJ;h^&3m>%xdM3-MCt|j z{WA^UbZj@@B|e`-Z`yghlwfNTi>*v%WiJuW={*i-+oA zB3d0gagm{+bq*mY3M&JxniIJ<$~(%5>?;diX%BLKTWeIKTFb0T19e%om!CU(rC(jr z39mKxj99SKleYV&))+81H?!CH8XKCV>?Ni2r#SFT%Ew|&tI>AJEmYS2En?wbT6wOG zb)6O|=!2tR)7#wZ z8oB{N*_1}qVyvZWCax2yX_dN^_OsL57|Di}bA1ceu2g^Zymf;r3a1;QgsihP>vy12 ziBdbIktTZHM3z|pqUP%ANjt=oP^!x6s13AQa`;w*rP69`6&GsDu?*l6k-h~{2svAc z$QG-(ArPp+8YgzJ4%u@<6Ms+ZH9Ldq z*ajP_<6o?8QKihiN6JaGZt*k=`ZBJW%euuLi`}>wmv!^hXlxei=4DNwX+h@H-18ye z1lvW|t6T|7(EwB4T0!oi%5z~S@{+o!ZAd%XMeAN{iFE4D(xdrrsVFU9(O|i4BIe?W ziIq3RM^y~4ZqB-bn_D+KdLZ4bZf{ZM;UdJ*sTNt~(h7wt7gdTnJbT;3gZMav?F2R!geC6uI(eD@8RhtY8|VtjJdDd|VFIMlOqu~nzMe=Iy=V;?&E6D$6_YkV z=VH=vNOXlKTDXXPCet}6k4#zzDT_%@LXtT;-I4u$1W8V#6Bv0x-V@Th@MIC(kaDm^ z3*)h$$3%jwGQ#%Vu&dWJSa_)y?ewQt-h9u{21|-?y zc}SC(m+g?`G(Lbt*EyqwE28m(4;DKHk{ml7(ln;KN!2|9DWB<{g(Q3445=m4ZBuoB zLy}XALwA$?b%(TyrB(t-PK}l!vX_`<(6QKdkY+P~T_DLd*$+}7(~XBDTRa1a7MHlR z4yg{3McAWCAF9$pRr*AgK3ApxsM2v&Itl50=I@j${RrtjraJ>^7n6QdW6!D5-;m_I z{J(R>nvRrlbTtD*^r%}pg*9nmoAnizS#B`Nu2cVqTd{?q7JRu+g?4oV<{Tqvnw z!5*Y$B_i)UTPk&g4$oez3yU;;1q7JTIOeJVR}Gt5*K9_9rM0|rv2?nW9j_&hpmOAr zd9Ci+Kp9wOFXiQb8>daZVFga%u$Z?9ENONTDJj2h?mBAO|1Ux>BqGm+{UN=E%_5{= zUxqDO7>m6;hg=Ow9^ca;$)kTUB>5iEEs*4UM7Keb?-4x!sSTSOo`lqvNpvD2dpQP4 zPJ>Q!JFwXEYHS?lYB^mxFv}K0A<@hoEsTUjg9>xC8hZ_-?o3yr>Q+N~3qCEv-H_s0 z>;^UV-;jDU-5ZeTbPsn5)Y#7<^=G=%s_r*PgP5)b_HwS`APr@@KB|tGVN92T{Rk$} zapZNDmkFvgMU`kimt$u_dV_IuRB65{(Gf|GEmbAIDlJu|n^cKT`)F`jgjJB_G;V`L zcSkJ3T1Z=&v{!be8k|KC6Vua8Z-#Uzix%OL#=n?>k_eFgekv@ihD zQYH<9bR(0-K)RVp4oEARlm%%OlW452VbV2_ZfDYLNHt8l4ic@DqS^SnheNMB^)(t*$mPX%BRd zVY3JyV*fOgXu0`sCVhfE*<09K9G_*>!Z4rLNp6*~; z1e!};V$yHezs#g_*gwIfzp;OcNpxRoBa@;by~3mzNSm0{3ew|DqIrl)Y7sg>dWK2L zuSRfX8h1$O*A=+I;~!#ur;TzA%qpEyu7REQ$Kx7UH`|y~6`jP!_vzwSWkXcO$84fc zWH*Pc@9eQz-`O>geybvDx*;9;;!;0VqV+{*I%$u?Ph-@pN4WlL-Q2~#1M7EON2|xr zWxUc+`#bd2Eq!m7e)iD4Zwqa!a3l9o6vB-w67mHj+&Hst#vRKQNW}1m4L1C+q1KKI z0sMyzxP@PqT>o4&*0|QqG4zXu)FrVZehA^QKJ{){C;DweJKSh!Vy#>Sh7ug4NiavM zLxQ+_jh{xu5~$e;gzEs2hlL>!W6jwIk*sL#WG2T8mPE@`)iU&p13tg+isQlWkT z2o7jtQPVX4p;B~*4v1|HH7*J3^T4Te;mW?JHVh5VDFW78>UDH zllm3_Ry273sQb!VMVGTNkepGTn(U}SNmsV8u315k^6+cXLr=0xb-LEQoV1&L+8ERL&YPin6)u?rGLNb$n83r!Fx>?xP3PzOY zC1XPJi>x*z*rnYKH*8~h=)A2R;D)x_=$xk^b~{z%wm9tQYTNv3x|!q8sd4^Yd9L}A zI8Wup&SkN#>c#j4#oP`JBP#!DRnZd4xUvDR>X8k7D*tLz(H`Fu%euO%Z|=N1Bc7$v zy7I5MiWuml%bHXVLGf_9R?6CpBmZ-YhAst}4 zyHy?CvG|zjUQl(lkUnL)J*tlGXVAEa7QRz;e?vOPbkUe<vQF zIaSvQWA_iH>j6pjHv`hOtj6DhMD>rQiW>U`q`#T&YgN|<{YkcK?A@W^%8@DDvZqbLD$^`E_(=SHTJ!)uO4;Vs_Kg=$V$hCP`2sOq4&^{$A`Ys0#e7 zn@Kc~>EfkDFtQwn7$wjQAzR84S^k&lqS`eT+RbiL+InWIyp}x8X^I&>?`IUHDNAH| zlIfyiqlMVvEri&so0USrZj;j|g`L>s^kj*weqg$uI1z0+hrS0a=$p*Zgd$5cHOLl+ zA+?Uejt4oOawJP+eFmFF=qaH8|Brl=-^2*M|KPsyfk3&TpiN)S3FThSGx=mQC}WkJ zYHet}YZ1B(jupB^jTKs-X?eWG!REEB^^=<9k>Npj>5R|27)cuT3?3%n{kQm(>sXek z9-6=cy`f92&}DcVq06w2XWAccd(c|jy0q2ImdqzT6hsMoAjlqMi9FCc8y>991nZpE zf^~Q+!FqSgQnH}cw-WY3kS%42EZfMI9ioK}!~T2y$AoL{?p8t7c7vX2Y7WbP^RDpLD%LwvZ*Vpd$o&2=zYXj)G!A zu`);PCrfdVWDBC`j9LjszWd6)srUVle3M_gU!w#g-?T=jo-GF@&(xD-TAO=0&*W3- zr(|d3mu|kJ-di^pT02^tX?|Qg>l`369>|+qo3cbHj+U+6v4Z=zXu)=}sgQ~{tz#xQ z7+u?BCK=|_j)xENDSMD5@<6|5LAj{i{jJd^v5Zx$s3l~UT0)jOs8&S9!d?k-Jk^OT zk$;!$pCgK2EhE#dz{t5FpM4_u&0>C|e60lEZ?QtwoECz6c#P0yLQA2|u-M}QR0=LTz{%s$r4#j zlda~r5axdpEzCk~w{pasX?9#`E&LiCloIZMAm>_MNWD%sE|7`$DWJV4GVd*3Krmjn1ZXQQ1B+pk=|kaGlhQ+=bt0^XL1o2hABb{ z7n~({hoYmbXbxQFIX$kz#e#1YCmlYM13v(9D66Tdw2n8jjWhDjp7)+mq<>e)1!XjQK<<)`$y)#+B{|^a6BOz9@kK%f zFG!zqf!9NyiazD|hFt{}+aWs@;gpL|3JzA{TwY>)3Ok4k5=OWIBWi4y3_e=RLO1LYAh##6N4H`~^|kZw!HUF5a-YZ15~pU_sF=f6?MX z=$6b{Rz9}R97yFwHxw$~@QB|+`8%8=jvo0tw$G4Zb2A-7%Z1r^Cg+^7eUgSR9n&Xi zn7kX(Cn^r@TKr!Lm?RjJcLf2h(mk5@6NViwR@-w}lhFFTDSg zyN1mD&OY-k_q@*>JBFTm(2??Sv8S_VL1vS}8F&Ah(J$uV{ZHTW>}wC!uj+AZ?xw!4 zZ+L&*0qbNb<*&c5AK!n`s<&#aV#c4b{WDX4bbk0nmkXcXb$ZxKNw23gyG*zvrb)u4 zp~p6y9{YO_&yZ!yzrSbR=NmuVvid#Y-t7J@uO3t^bonLu;@JldU%BGvwcoA$xbK3= zFJ0!|{pLq6-s2tR{-`pXRgZr5F1RUY&FI*Vl9%e#3x^U;Azuyy>f3UTXc_;moUhSLHQc zSy8cW=|8z`U!4Ep+TX6(ara|+4U1pg^TuP!_vHtp_S}8FedqP}UH;jU7w&3bKd^n> z&tLZ%ci^|ruDIp4+BIjT(c}L8-3Ckfk~Y)t9I)t?r%$i=XZ3>EUhc8qrcD{pqNcwq z{^G%t(o7-Yw}!Lv=f*Z&y6xl5ZGKK{GVznkXSW}-VCmEY$J%GU+~&KNU#qt6>|49; z$V;(H6X&)(|MjXdGqM~@7InMvnMb>Qygg;qoZWNt=YDqUh`0l9KNaX~Um8?p!f@>Afq9Mr<$0Up{=|g|1U>T3Fb)<=rP2U)l1GKj-~?rHO}xG(-*m3sGx^3lR~M!q_-ACLbEPNx`1bZq zFW=YYn`%a9}UvX8RexH9?^z!-TT{>l*>GXViSJdH8R(xO6DY@w< zz1oePw;em6?8ajDOCTw|g(2)Op*>6K)!^ z>(?D=bK}=;eWq&o-%IX{?!CZ&@1!PeKk!{x|H@^LR~5YX+>oal2hHj}qhf!r*T-Kq zb?3^t_dlI^r2YyaZR_Xf{uMpujZ;G&x^Lx2lUt2A-K~Chdhsi>VsiWWver&YnSJy0 zZysy)r>oZ|pLSUD;PSqk1{F_z^~A>87B6^Ys$~21#H*i5Et>xL%oTh7eWYON<KL6e1>;<206f-~He$NL-J{{{jKL5m3880^-z5X`enQ?92 ze!lr)%h4Cx|Fx-8pD%ZQ(zDqUH@?4g{XYkJN5a@_g!yB_WN$AqIxI(~o8GxNqB&v@Y2t#`G|efQhq z;VmC&eC>t@GNyd?;)f)R$1E$|I^o3c&-)gwyZnRf1@336e_p+HbTLbZx}vuq^&ffhnapM40?*5{HXj?4ytL-{m9z4aI~9C?*{By%OE<6R_UK(>g^O*a z-{)h6!GaC1oGTqtG^bjMj%sYAMUic8;Vl1B>H(nVN{2X6e zomisirmQvuKf@QN4Pai;0{9mETwd~SiK2xVc|4rg#g3Cb9Yc#HOB9{FQ_R?3`>YOS z=L%=|ReoAtRT|3Bg545D zC+w6{@!2gop-e}{kRJ+H2sP*?`n2dasoY+~jDG5!x=^MQV`dP5@YmZ3I2YE}4_*4O zM3pcC*Hcr!9T>`VVGLa^pj@o}=&V5>>&h59Att8s-4(k+{antNDcDnp&r4Vqn&)na z!8nBzs>6k4Zx@F$-5Eotf7AowufBX(D02m4ly+Zw?aSYWGCdeWjc$YVTj4!7gfj7r z(e`)t2}^)rAm zboq;NdSqqK&twT-*o;J<6v($A&}dXb69G@bFPIOXa){>)wXPCmE1KPuAZyb2SBs!n zDZP^-WM(mEnyE}B*ECf%cW_O#s(FBG&_B7K*F!Wk8onaaZL|Z(^YmS^j9?_xn_W>xt44CsG6I(rnjnjlxq@H zO)b~NtD3L5rl+cDN(W1XUaBUMYdWZ!$z0O~8reY&*K}1ibl-(STh;0Zu4$)gT4MZA z=&ou;a!sP@=W4DA^ty7ciBp;NTw_%=+qkBUsyW6rEmh4wT+>R`^ulU{LTgo%!8P5W zksGR+DxvKe$YhqLl{n(X4tg4BoLp2LZS{*eS%n1t%aqI{%3Ete{ z%6D?tOn_#jqM_n3&1gkK4Zt+XDUjx1qgmHNRwEz?eYqy!XHc+a6fu|#nN`3uxhFqN zlL~>&zp5sgW=Iz{RWppTxCa}XjVX0j3Yy(W!~C%P&^J}X$~81t!}3Erm0=~tlpfHq z{A31eSblsOO)|bs)@Z1d`5H|MzRlBUDAOex4P|{1Hl3`|P)W;!HN#2scyQ{&SlNS_VN`bdxtW@u6e>I2#SUnw?DXG#0S)D_HTTR) zkwRsspL(jyNV1}!YLbVe81!@Y9?-JdV6Ouh04vhSe#rAYOmeDbIQe-GLrK*nQ^Ed) z;TF)OQt}9@X4nX>p_PN|naV|h)(K3*dM{}@D4G=3eetcWqMj7cWXWx*QO$Cha{RMHh14SA;CtNIy6#iF%>s!3IHC~JlU zJw2G#T$ZRf>?ySDmv+3Fz$am0aC2G97$NxG05k{5=T>yAdGg}>-2+w*Zp9cOIIY3V zDmbmCYFd-H6=O7M(RwP7)|6k@J{Yhn;#Q2&q%~BN*1oLI7DlUS-N>yNqe+X}Kaf`S zchyY-RyEv;F`BffO#)|{2VejEk-lnL|Ke7R(WFJ~7D%h{`nzunSnc6fjM1b;ZEK05 z-bgh+ut&$7fYn)U#TZRm)c%3AmYvVLEMV1*PJs{@qe+YA&OlmgeDAjiSY>i6#%R)_ z=_@F$mv$WvSe0=r#%R)_c}VVuRIc_9?@A6>J<6>Zqe+X#P#~>~|4t98jXm6oF`Be! zoLQpcvB!WE_RZQ}+Cy!xU%3@yG--_i8%XPpt2XQkSaqk19|(-mq(y6gOH^kTi)ZN# zef6dOYFZiGiZPnBu4GnpK1j8({F5Hf1gx&(R*cc4HI`W^<7T~-Ww*;)Z$3lf* z!)DQ>Whae#MX1k5Q~PvL(;CmM7^6wcp;}Q|?|hZ=pMcd}+=?-pw4BU}cLE`$zUi%9 z)wK3=E5>NjqP0|@4!>D;&wzkc%a({lV2ma$H?)EARrTy;F9fVIxfNqHX=N}grEmN> z?}_^YR#n`JF`Be8HEH$#W7kgst2%DQ7)@HDCN1gNS9%4klm=mpCM^%MqJBsIX?1OlNCd`c(#nN4kk)l4nyn33Ik^>M zG->&m6{SUW`2Mob9t>D5;8u*$q?M;hE9&DZ%K}#SaVy4X(i+FCl=fQPa@>f3)edgO z7)@GNYtrhMH|5HJRXw+2j3%w|%!<|_6eessa%*?B4%@epwT#iEH31QUI!x|$r4+Er z;8u*$q&1OQQMoAm=eZ4Y6VCAg%W|?7ur;^$53Oj3%wgsuiWRyX@uE zZfaUPxD{hGX-!eBsFmA)xw151^&7Whj3%wA%u4BpQ%=>LY_6u2XhkFfV>D@918tyO z*FDxXF<>=`TQNqH*0sz^>4&d&d>%hDQr3r++=?-pw5Dm&O5c>WGGO&8w_=PYt?A54 z?S~aPcLl6Ya4W`W(wd=3%l}VnoU|)BjN^^Z7;tzi2sFy<-b4s~PenfSqr^>!yZ>o{ zUthpo2=0d%t<_9srKH#Gg8}~ptk!WWVzgGXm=#WQSSZ+Ty)$67fm;!ywVDl$C5j(h zg(ls8!+NiY>_XVVt%%WD6=jbil$w<1PsHHTR#wQ$U0uJ2rPdB7^2TM?tR zny<0i)&9cvfYnrPMU2*}NMn^fc>28t<>QLZbgjNYN5ue=Cj`00#@&GD`K=(i!@g4KdW96u=##W>!j{kNd73 zCmc!+&v7eav{og|3SE|kHyUG)2dvt(leNTXtxBP>L@8E}y!QKl0#^OF6){??>zS1@ zzREkk`eeY$#;u6aT9q*?nu#eqv8MFJfYlUkMU2*}9GXDyZPxp*pgzBdTM?tR@-r(X zhqtUd{azrgHQb6AtyP7_YI=v>n*&ylaVui9R*RXHGM3-VUJpcRuPxk)7_Ak$0?Ne~ zL&AUKbAAa}9pYBRXss|XV5Q6eJ7>RqTfpiJw<1PswM=6*b%6MIz^Yk$L?RHQwYmYC zK;M{j#EC*E^KfYN?H@S6){?? z<;+SM%eQ>DFQ{*na4TZ8RyQ*%Wqi&1xIOAkN$YlQMU2+!7EM~~AAbJUfYlS+iWsfc z3TDL{Mi|*@tt(*lHn$>1YqgSDDLqO|e|S{D>Lj-!Mr(x(1+~{>J3a@gl;L|ip#iI6ZbgjN3d0HIYKc9C!*?u2#V9#k z!>x$XT2(`1iHao?1e^Qy@_^Md+=>{j)$Py(##bwAr=WRbC$}O-Yb7x&WoG-=%|8c? zlrOjyF=sCC z6SpEpYjq#9Qu^Wf#|{Uz@_uebjMnOYW~KD`2S!iL38eJ{w<1PswVqii^Tv`r*F6xh zin$Dt2*hZu0HKwYI$Y59&P@TUE4URgTB`?{l~RXy_dkKIs?_{QZbgjN>LF&Ofmp&ManNzWv%dLpfT0NpkYx~AYn8p;VDsDxL*6LA>RiE!) zdpThBFt;K`YxOT?)f#&W6OUejgp{;4aVui9R*yjwm~Hm&Ovf@ovHF->5u>$woLMO& z{j)e{=44k@kQ3Rnr95Q#vH*6K-UEKy2Y?{0o*OTellw<1Ps^_0e{ z;l&Hj2doBgD`K=(Pcy5_v8QnS^@n@`t8{KfjMnNIXe?1}$OPe)pPP;iSgqz(#AvOa zg(k4J`EpWi(0uqBw<1PswSigjsaa^5c_S9oN_&0At%%WDJ;$t+8Q@{j)r-t(4E7XS-s9UA zu=*FbB1UWV5;T@5UTk4obdM1MtJBVilFVzgHOh9+?Q ziqCiz)vVNfF1I2^YqgPCDf7mRl^@mxtO~gmF|w!oxdsZZc~YavpS#eHe}9-m@f46& z(7SnFfyNTGLODDzf_AUNM}B_MqSAbS$-6)Y;{U-1nv zzOerg$uIZMDJsb?Eh{Sa&&@Bv`)*2#%N0W&iJ$r|Dk;uiTrN`rq+)IWKk64DUr`Gc zi{{GjLb|FY7;{5gfC{`rQ{^8YU7 zm(D6HEcTaQ0%R_jH$y+gv+*9J^8DG$F5v>ir2(qo{QnU}r3=Xqd0@q+j#@nL67js- z84|Pn{<82rQ1)M5FspcOh;>k0{;Y6ys%EmNJioZ4Y>`3p1tUczA;|W2iSEZKmiD4q{(|{}tf4%y zlFQjzSm?)8jAK>icoC`K-E7YJh4^pL{CqTJMHyN;AOFN!umByXWC8x8Gohk*3CfTV zIAY~56cX4Qy>+?}Fcb@TQ!7Am6;N@SE7xl!uWrgG&O=ULiMdprM*Kr?3@ZtR(}meUR$j^?bx zjZkyea@wJT)|_>i#tydt2-CB|;$hrV-ZblmFn&WhxvqwX%x0maTrXxw+2;t;KFyGq zD0rCl&?TxMoJE*Kf>%;uylRjzZm3ErWy1wX7{8ac;R%^rfAADc!payji7SJ~B(C&2 zlep6L%;D+z^nzQQ@Q?SGl;Qavw)Eum^h;eBu-Q^=sR9_MEk9|L%jfpG>^V*we};%n zi5Z?F=7~AZJfDr8Dx#`K6$wOmeaM!}k!zD5x}rvm@a1^&++Js%jXj1%)ep<|=J>K5?i^d*L{&K| z*Wt{xyRz&y{-_o;W`rjjuXOe~T{iacmViFbW7HvWJY zH73UGj4tK6SPs|nZ zAM5ml7&Ri-=JRHv5pxldo~k}PMvWhpBf4@koLO!gf1HdOGdjbGcUR{+eKzF*Giuau zCu%G=+mm6VN6x6~(OKRMbc&oz8_xdNDU2HBaN2TnGCi&w4-#T;xK2-{bMf>MT5eQ! zt~=9_m+Q0fht;SaMv4x%H!IKKv&oOIQ6o}Z8KTRXmzQnB18r38@EmVmMvfyd6Xg!- zHN!IPVvfrW_kp?_p6SZ;<-(pGf}=VZ>CSb!eVN%FoBRYEHNtDlvfJ%B__GC`l%vL` zX6EHMa-BI@Huc##YTQVN=y5yqJh>Eyr|GB>BOI<=r<3LwZEcLm$;|TkGVNJ5_QV~P zPjcqw~)zhdVR8o@`%6j_i_Q zs(oq}MupuY+G&{ThOpO`o8@$fNWm6(Zjfr3;?B%<_&n&cuvE1p^76b+cb-eMv1bdZ z`caNdJWeRf?zZu#4XH6H*>+c+7afjbRBeteOLW?^?LNCL=#fNfbV`QTm+Q&P@Y&!s zpcP$qPmYLc#bb+9EzLk#8JTwE(uu*RKFUZ1Mmn;yb9@eW9^xrhjTq+jxqO*fZm%ud z5v0uax*QpKS+<;DrRa2L;lN_c3{qxix!s;zd!}tdK2@XM3c&Oho9dTx`F%|NerO+Hl59epBltJGq=cYlw4NRwNAt2EGF(Yma^aH^ZM&QPQTL$KX2;4+){{@pm89)e^ZVuuy zIm1BgjPkbw`g_5RrwT_1=dUv=Vjh@VX2=}ft2OfHhW;BciTN@Y&Yu63;s71Ob>ofk$yj5#0|q;#V5cVE|UGx9cUvCw}^#@ufr=C7RX$ROZ6@yAjblI3ttB{%%AA zjKMwlH_Bxy4j)G8E`)v}3bT_6gn(=qa{Zy-#~I=%82MWR{cqrItYAo3e+7uH;*3lh z`+FK0It6a+5}BfD!zkS(^n;JVG+8cleZp|m5BxXdRqD6MT)2LKsuS)4(`1Frg{v3( zAL~|NhOd;laQ^;-{7nNhnkopvgUzTMl>K(M9|HcG(4VX#y${c=1Wa#fL=sVnp_bFqefMOYP8PtLAN4gIZ#okS6$R!}|10DdaYiPMIWICk0o>z{%Tzmj7^S-u`Uy|SjIuZ4;*p^b z!TtE8OvU2Ei2D}$yr=M*B`Od?G&Updd+4WwaXmv+c#gW=LSpErMF`>ijX`-6!OVV6 z=0@PdDBaId4*v^yU&Bi>*ES4S5AF{zU(ruw5W*d2z6Uo8KZp@GU7DjN`vA=RS7k0- zInE(^9hlo*leuv7+6+YR2Q%n(nG4tNzd^lZff>9-=DOm;s9vZ&lDFdV<8R7b(=Z$z zr?NOBlg9pNo|t5kD>A`Rx;L5Nt^#)(xc51W<}oa<4-p5!^wNZPR|J1{aL<7GE&@mM@dYr^A3;C}m+o}LwE?q$b1m@QsJwT>!7eb950E$cIVMKj zal}O(#M?!%Q3%&hZ-BpK45k-9mbq~AOE*M+3FbWK!j)qTA}ojT)XPs~f8o-di0B$H zUvn;8yU}s*4=}}_%KpOT&w=R2!FY7Of$?)L+&tb2+})g! zJsP*$I7I#n+|LpG(Mu9rAHg}-QP~^K*GBD2`MJOunKb5bC=xD$d*ut63fHghKy>Ue zJmm%(1uBGFLQ?cQ3#jr8zwk9j&28cgtOuD zN8AZ8e?{OZ-%Y>7E+`n~kGK{lI4W;z6CCBQBeXlqITg%$&ROu?D1RR!;ten>e@Z z!5njzsPOA&nuo@Kd4zM}`oXo}o&^*23waA)4j1A&f|<&>aQ+s8D*$tVbJV|$%8?5F zpJ0-Hg@6#Q{@jRjfvM(PxcbWkw*kyg5jg4}t$xEUC>Z6B((M3lDrdu`n*nYKnC%g` z@u;w4V21o5CmgO`{zUX7FgYY3gj)|?feclH*>FMT)cOm0$`{4NVcW(TnZ&v_F3A@B zTrbkoyuAIX^2SoP)ld9*~Z!Bb6+Ecqt22-Ht zbnQ$2R)V=t&l&i84a^Qbr}Ibc`z4sudd|RK%Zs?)j*UXN@{+$1VBC7nz+VBF52DvnBN6=3eEK_>)&k9>LH*ufJ{SmQ zl%CVg2jp)em_>Tdz@G$Wy`IzgqxOA+Gn79H;l|r`aC=So``)C#pTYfQ!e5stx$flL zh0kA4aDzD;u0K=zW}Eak8C*dGf7Bi;!91wv4BBH0m^wYDYY*~w0?c_mXW*|>lPIA# zHVWa&OUENSm~nc}z+VZN8}*z){vHIgNzWPhI{@aGp40iG{GA8W!lEmOfxmuWQuLh8 zUp)Mc19QEeGw^pOn1}V8&L8FPP0m1MA>8=b3+~eh{%HO3t4V*&qoaiO*eHZ+UmCy3 zoM9k#;qsRX&TYb9fk}T0z%7a3kLvF}lm4Cow<&@@s=otZzR`0A?HkoJN@$IZLb&=P ze*?j!>p25|)4>$!IfMSP2F!XrXW;J*Fgx{}&L7QJUvY-YK_OiGHh}vxfvc$M({`DcZo@VYrx$T!5@vcO<;EEIfL=>4Va(xoNj!O zzt%BPLQiZI)Os=SmkuUd&*}V8d5bv19AX!4ye$J)Wy0T6CjGqzZbt-vG~T{6>8~E# z?-Be_e`(*sWd8%#kF#n$>*|m7Ka>7)z)dybZ;45Nw}6u(_@nlH-lV@b!R?CRkNV#? zVE)u|2K}#NEcz)n3gPOH@|OOV!^%&M*+WaOF({ml?qy_2)v9{+5BOGU4wjlm51VtBc@| zogbO>cOG2R)|ak7DsOMjM5@10;G7ZsQTxs^>F;`Q%Om)s@%Av7Eqcyie0&P#gr3ul z5AxRt=JGbWdNJ^q3dXJHbpEKk1z^hcoPoc)z&xtw4E$~53|zAiu0QVscO-&8YTw_% zw4fjSBB#;mS+-OXds%u?yF}c5pc+{4Fr)??!NIBKV{6@eG(Z^_)Td z9Rc%=p3~JIwQp3rD4{zx3TnL=_)7zmspoY5XudB5vs}*^_+kSqPWE<>0C#_@nW=!KA;}!0m|OkMj4W zNq?uoosZy;=KD?^JgVmm{A~lXThHnI(Rllo zGZ0w_SKhPWE}HOnIsNE1D1`IZ4_pdo!}S*`?>I1pdd{G{m0<4FbGq_Ud%O&0m!325 z_YIhz^_(Uk1m9a%CZzh=Wdd|S#^_*c2u?yES!$v{vS2};x9?6_xAa>#U%UE!p2>udbKM%~Edd{G{FN1kg&*}0<!#PtH1T&o{Hd)%DWTHr+UsH zf4_oh)N{K0k-zToIDf-NL9G`9e?BnR>N%Z1s=sBNVGgkiSKexH_eJnW_4k@de>=eK zi{Ov)S8vkad2mg8>gvUyyuCRSsk|xR(j)kbhm+}Gmg_l#_IMb~20dqxzg=KH)pG{^ zeg)I0=M4OH?0h9iY zf&1Qszoxy-)n8k1-8p-y`bz`j({l#xy9mrOJ!jA!>%qLJ=M4Pq1@oz%Gw}B-nC1z( zab)1H513>HN|4oU@#P$U?aJ{yey*eRcgn=Z~(R z_6C!#=M3^U9ZZp))A@^szcpYs=s5#_yTBaMb2@+2Uw#JDsOJp)b?=9DJ2nd8+Lz9^ zGQs5QIRk&o!Bp!xUH)i3-2i5ro-^=w6wJ4JPUnxxYe~d95gP@y90vZ9!Hm^&2L7() z40DKGxc;&L+>!|XXnwxWq`xP?y&S}DIiTkZ{GA4KUeD?LQF%KJ!tbE4QBcca;Li$<)6hYwhtX3r)8>xYtc^x!?|kaCsr+rE>HbD)#}1 zEZ7X{c>rSio8YJ)jSt~M%i9Iqq!2E&yqAG1F~L#&Rhi)0gS*27X9M>{2p3v^^nb@E zOmKPN`X%Y>In*EhfA1;=K;hd>+=`d9yBgHn&5hX>t}-N z1unw`N9{J>1V{bgMiX2DxK$>&KH#1+!I8g@OmI}sXH9VQ+<|{gaGk&n92U9V`hjzp z;3(Z96CCxw`$M?U{zuPyc*q3T8{88iTxkF62<|--9Odt52p5_^nyFVXDUZ~6C8V9LePU zLOjz+M?@(`tlS&bNQVlcs`kxB1gp4HtbA{D{*39@*7by%e!USbxFON~#Av}5NamCS zkjNNwSypo^N~;o9z=qt5sMJJOn6PydNa!jxAyJBQr|iv<4vJN^{>$dB6KljNUa1yp zd*e>%Dt>CPxKr@`U9sw8f7f-cC^64lohOQtZ3;#IELOMmRy$_a;S<}mgcz~fpAbi_ z8ZSyy(V`c`s$>4;V$BGoDToCYvA|k+uGP)$E6=s}x2Zhe>gJ}E=i67bsoGm%qi^l; z4SEnwK~zK|jYLs8B(++d*6RL>?ue*xh>{Pw@rjZ>I@J+f5hK}SQXMh=0V4H}eXM0+ zcDX2Bi##5yxSjGpEg?yi{0XDcw(qzIa_(s|I60Rh_N? z{n$Ft)OfMmsiNvFh(YZovT;UBk`b(ivQ%l7DwRN@Yf#a`U8?ReRrfNaA{P4|B)WDJ zEgV**laLNEomf2~AuedLU~>gp@q$?6Pnao6M_EzOeW}Y~4DS}D!@*-XDSyVbb#x9Q z4`F&5R?rZ(Pq0t2vwoT*o$yGfywWdT>Abavi<+xu4`5HtJ5&WM73s{}xpS>OR^dCv z_h7x?ZYHyaW>DIhvK#!(#F`tYH2kM>xzJj&RK!-EYwhppm40n_q4He2im{^PPL#wL zQF11xiZT9fiw9EN9XZm6UU{BmW%!7>L$^g|wddPs*r%~dht(9Z+C2pk)g(R2TBv$~ zC{_<`=qy%GM@&OAighD)s90S^fVa9r6s2AE-D^I?H`FZV3ys^MP|+$XT9}|p4?wDA zv-MMuHnUhZWwS;RF?q+(tcpsU$g6R*r^dFFrdLcv@uGCiQg2P!QkpudS0zw3+|s!m z={vV{id9`F91gtFjWj;3t77p*ls49a601)8TZz(ZviwH{JZ)rsx$3la)mH>augTy4 zu&$!#w26{jSyi>xsvYe6epY$(eIxt+nSw}XNJ;(BB{jFxOfpTv$nz!I(+*bjr3uBl z+0n{2`ubMZRf|#LRkanff~J)ETXBe7v8ydeDRSCYZraK^a zmpu(vR;IP8=t&K|VkvAoAwd}V$Y?1ya)cN)etfQlC@xsFN~0Aw1h@P?pL5>3^9F{Z{=R?wegm2JdH3FP?tbpM=Pt7)C%oWA zH~}Ok$Q$-ESg9R3;g&zcxfWfu+;*>T1Ey3#(cPqYLvk?OwW!u6_J+IS4GCXP)Q0W% zBQUw3t()DLqjL&Kw? zSqB74-yiEb=9yOPez_$_O3+As8&0o+S=_z0=vF=heM&3Fb|<1?j%-H3)rM<6qjxl6e&_RAHb)|BgDuiecJ*SaUfQjbqiM#*Jy7d?V6 z=(I8CK--yR$K1h)I@yZ;S{-OMw%gu0%ukLc@tv3(DzcrCpgbARIVe#b^n(S_fgW8Z zg5rEnRNRK#a|Rl+{$$X@K=Z|o_o8w13t3z_Y!h^zL2H4^#ceKHyoURwLH`7LL?lBS zkV=Mw(Fc^`0-%*bE4qkC3(5%7>6LDusQGLAiq7vIl@!eg> zw&bMv9ftIb4EnSITF)9nsbnV^QGlqxglQxA@TcU5R+YzHW zxJHxYTr!wZ#NDg%(S*rL+fux>!DofQ9;>G^SoN=US4%|7N>h3X#Q#FFw%t+C7m-S& zUf)MV&`2V-JEAyTXodUbgbVG$aKBjL$Kk??$j9M+(MalteUfnoz$k(aA9c6bE8Yo7 zjzoo(WI*Ei$ygJ2S5pYtj*UV)vzT$(?pWYhp=Qs$MOw3$DI~>vwcT6VkVvl#Je}kj zxULDf5+m<$T_12Ij<=>Z*nme#$guCGQ?VwKPpXS_gd_Edkw6&sZc-64vzH}&r zLuX;k9RayFa1EY?)oy69TQ$sf_FstyDt4c)HDK+Apv$&FR611^cv)vV6Uy9C!^o_B z&8&S}qdA#@%Dg}o?uZ7^odn+%Z{~R={;XDfcdxjesz&fm?zIg0fOI<#Q<~JO6820C z;O$^g+T~O=xC^gEKAaT4-G#Rb=C`}>PQm=P-5Jds42SsAH10knviZ4~t0SDd9UWzH z3$ksymtr9OAo;58-m`?XphKZ%4Zm=w@Jsg)p4&nK{O`Y4!f#7J-+Fr2^fdRh-PuUX zw&Z3A`xe&l@XH$#XQ2f)Mjr$#@XEJ4qV+(QTh$OPUopEFdKHweID@pF-W7FMVCoTb z3)&$0*4s|B9^tCX*EGG}YNJR|z;3}B+i~ZCL+T+Gp_Mq)8k66e_U=)(R0 zv^Dh*i`YsWfv`&fH0(ZUrEZt-tOgCwOz$Z?ClU?FdEzimS=|>+HRYMfOmBBo9l9>M z`~GXFt?tx3hB7*oQOLRp=zT#{VYoXhWUU5zPtfbe_Y338)~~*l@JjJJ<8~j=-|!c* zDBBgiVbEs=9SW)YQwg^fNV%L3dHtxkwHow@K_3_t>V`{wB^>A5(K9gvEVf(!z7$EU z!Svoe5R-1v_SV3~cCIMGJaS6Wgy_Rom&)q;=p!^%#NideJh7&AM2;%M?iDQwwj{Kj zs^V&=u_)D*mmFuO9$HGrWXweg_f3?fwuh--R~3gJu)ALrJ@m5vX|XDYXT=kop~}GZ3?$cM|Y09NEpR+J>?YwAPeZ- z#nB6BcsK(|d0w*rbD+m%fTXI~DQ@(XF9fP7k5NO#l%F0%(d_wZ-Uy| z<~x;cu$@JGvxm!s5flIL%`4H+hYMNw<`w17hFkuD0OH1wa4T)Ys2#q!t$aneg@S!M;KUMnl?3P)7UcB1VH3G@(MPP<^rUsqURN8(>zG_Khfwb=>fpqS=*q}Fn znxy*r;Crj-GLb|yzx30K+MKUq( zvI359#nJHn6$Ocs1(=AgMSzS6PDjVWv?R*3S7B0A6Ll+S?wWOS22uO&i5O?{U`#uc zJ?CF0@*n}JrM9nt*^Bek3d&8Hr=F17!SFgoO`v52CRhI>E)HfTnCz!bY;j~y=MM7? z`oJLC1)>T3U12-(7qBFp`Pbs%%)gm09rG#lFa{BF-hv9TI_BSM5Nk=@mKwwcq;7vP zh$FYUu?~sEN;#NQ651%;k5Own5lQq}-i*;K=B|l$6?XQ1kS~7Y6cIJRXmynP(gwk7 zdQk<3EZATk;?%}#!M;^ZpEadjc1LQJmx5~N@<`lyh;11UcCU^+E0oI@Qsc1|4=R`w zmSY@2BY{%Coc4Pl=;w=3E^sI`4olR5xziB0ii7R`*O>)1`W*~o(9mB1=~D6NJoiEJ z)yzF8j6JS0LOv**os_Uu7h&zBgs->+c|YYd_I$Qd34?ueHRZWChr+N~fr;;6mkIiJ zuBSc2G~>-zjI`i5M&ic<#LndyH=c+)mnZOd1swo zR;_9x(A9`KWL*qIQ&Py933Q#H-uTvVJO!qR`%n}`4LaALMxg)TFJ#?n-0n7RLy@rC z#g{+%^=mTIbm`pns9S_W+bRMf{&i=4w zKFpPXkyJg%XK=Ms0qe^c%r8TjgFu*7l#%8= z=O9WpN@O895oywzK#~iqThHmLb~lW0LrX>s58axynez(UJ$-O#+h}*-hSBc+uf*J5 z)o#y=mSE6a8FL4=+vTU*$%9gtHRL4siHg8YEoWo4lD)dxqUCK(FP65oOG?|l!CEZU zkj6i5E=5_+ZNNH&yCX`y9D)L-P!~X^J`gd=2Jq6RXR=o&}xD8@Zu(1j-S@)bKU^)QiLmQa~@!kDT||wa`J8H*~Lju;qaa5od@m&8Jn;- ztv|QD4h~O9Q@$EVl@V5mHWH5W>egk#or=&Ng+Xbfx^Gf1!2(yj^~Zx{{Uwe?j%HN4 z`&#+x*$0FV!a&uRgL%OUZQ<_7P*;2T#-{f=yGc-ZSHq+cTd_IMPOZo<-5_OIjbN0l zV+x~PYv7j)zmWJiGea^=jVuz|MaRe?-gB7uJlT6zd(SwZ9V5rUWwL0#cyke9)aEM#k0MUgZ>)N7u@S?~@IlArAgjx$$2=OR4G$ii+ zPD12OXy`2TU)=Vt_FCuURg(D>niA~W1u^$Yt-o6LT}}oYkzwDy4QVqv*z==|ui)`` zYr*4aq)xOX=H^f$Q=T3Wb9>T2XSWW7BnUkY#j(P6VZ+6|I9kS%Dqr37sEwxJG*`6N zz)lo;9I!0v_LWrISm18$gG}l89Gl!dg_a3+1&fm15L;)rWtcv8Ing4Q#eoFm4<8u{ zx3DN}H(u1-I?%FL{0ptKr`OxYO!BY}x9G&Fs4x-m$Hd~;Y) zn%pZ7aVO?Kh$d#`ZPI|%kUDBg@wGcz#nJPSB;>Ca9VW!QGF_fV=xKLo4V~%E7MEhk++fG&)K=x{Bp_9OE;lHxLeVCoibfrf8p-YfYQtYh z3Q3pxU&gyi>>^}W(NrJ}_ZuLkeHlpOoq$d}O1NAIv;jIb)H$Gkh})llc+fCpwHfp| zkfyXS!5g{=8NGsJfh5GnGl8$7pe*6)D! zm2md}y&&Q42cjw&vR(kv*j_j2eS^L*hhKHlRTQ=rP2-t&KClull6Kv;1b}%r*_6}7; z%Mf*^B*J!A!5sQN0ybh_RsGg@>#vu>Gv*E}iaQP1*#N^U#)Tztvz-Pi&Q5bA?lf+O zh}>A~ewF%RVWNAy^{NS-r^DDb!A7dkobfG^-oqpqbTRit zE(hEZN5au=u7HgkdBbYvL1Ishx#u@CPxa&v-t#0vZ$R~ncyN>x!GEMmSJ5Dg& zrC~#AZd0cycz-)UhJa(H%j+WldLIh0^6Fu(GIfw>zW?{ERXI zgAAHSzKs#i^_QE&3l2eGuf>F02H{2dgaUlfgERP~9-2qiiD>GfRd`y7vTY;sbCW~2 zRYgL{gLWAZ_B8_nx)yALPjuZx`qb$BTuBm49cY+H7e+p3J^1;_S#S+r&gl;boEb|F4=`a{WpR;I44zxp$A@Mm`Y zJzGlevLT?B<1R|)Sp+ee^8DEVy$YnUejtw;(%2%tnR?kUW* zCul>+4>W{)Nv&y68lW%`pfFp2NFYEYTY!o{fQrljrq;7)8D47+<~Eoy?7l%mfs4N= z!0;F+dO>a`hf9uOakz3{(L{XxVNGyJhq9$iMYjk|Ow}*I^eElr(4G%AjGoQPsPmuc zY60mQWKSqST4YFX$x6C~gUE92;Qn+Vy!c``rdbM$T`ScTn=>ijNj^GWRpCEu6qtC^yL;{)=(Q!RvBHb`}$WHAh3Bta)WUhVw0 z`{+jawbtaPHg7L~FL5B$Wta?C{L51-b$JORt+SBfGC7NRAY|w5urXwyq>jq;_6#pr zTL^2tb@ptn$#E8Lmc;mCToSaMVQ;xqcQGHahnIUStx!5q{~GQ0KF}~YmD!If!-Cj zPk~ft%LSe4Y&@=~v?G9Ysc9n6(fA8lm*Bft5KVz4f)?TXKf;e@9$kKV3P_a^8pnSi z;UWfA7*uc2OrQ-C?kXVNSa}Q3bK?j|6m=mb)V&w#pwq7Oz#4YwDNhC3Wc!<7K#_F#Qf0%^IN4a7xr z)Dh4cL9>9?32FuECKPLd@&!Euq z+ENus9A>93udosa#$hj1!2xBY*7f@uSAn|5RX`&f3=J!ZNqFW06}#0&$;_cZ+J)jk zo5bxb<0ckUcO9&yi#e}93@eUeCoNd3DnG2FD{S|)V%cZu8ACg13`Mqe=_VtK=QN9U z4Kwg2*}cvU!2YVQYKHG~T0pf5Dc;+-Go;i5J?!VB8-Aqt%d??LT`CSAV~y7u~Nw*!jx8YtFn+__vPihk|j z){$M<21{8nx^>8EJS=x3t!|78(G1tDJ z`}EwPSXP<3;`fQ%RGWlZa8*E^$N85;|z8Vm2ITNVb-NvH^+Zd_cdh#z=NRlww z`M^X}4-b`vTaH3lCg+Exrpbh!K(kqAm)F_hmfrBDVLjZEqwMpNeLUlOxaGg-EEqSj znP^?qeNwuE`!x0%D7slH$Z!4VO%ZH}aPN@Xt~L`66baH8FDe^8Y;kzu4u}?6?TNc@ zn%T=4gJD?uj2Sr14V`4W`{&?^(+MZ%poGE;xW)rh4w~*L7|E;fTr>}1p}+Fsj%>gd zF@Fdf*+}geo1QvGHp0^yKCWRl_AJXTsP$bdZRc#ed|X4*2XXiMCGf7rEb~Hawj-v} zfQ2?_J+!i=+k@R&r$;<;^@PWVa>66#uJF>26CP;Qw%IrpcY4)w7uF)0+jC^o8e&`O z#Wo(X5u4Zsd~g2ja5=JK2mb7B%nkVy{~z$bQ~2{cEhL`Vl8*rm1!}XTeuPXna+8*G z@*20Q&KX&UZ>Xm5OJe)(WzC%fWD{CtBlj5E&RO+voWKAeg88&-P5ByZq;QtclSry; z&O<62QO+71)A-Bk8CfTEuUy-q+Tx5vQR^mZq@amiAAM+iQH9^WF2Bf|cZuH*kr6)~U0s-6#41Pptl;k+zfZMu{>5G5_d{gFPe(T;jbV{C244yFRvsvU zx*o4AAGS37ljFYX!s?z%=V}-sOFVf%b-NCtEWBVL*rmSA2`{`-@`58qHKm)Xhwp#y z?3un5t7b6ze=!yVH`chPfog4{f6T44x!Vz&wa}JA&vxcwx!4_R$DGP~X-L@dIIAxk zPqZ}#6TrYV2(cmNjGYjLi46&?F5my&rr+6aEp+8%C5ebiCoEtS=HOJz0QQdy0+ zR92%)Wi`4~RwGMgHN*SPPIy+%n!%%62R_BbLs>z^v=XA?(1mm2lLt$64-e(eKE#B_ z*4SLsKpR&+oLGrAh){0RTc@=a$jB+n8L2CdEb5AetGS`psXnr(ro3;{4K&0xLhj68 z#m+bJ{PrNO#L(0W&LJ^$juL(7Q+zARg{WMMQ8i@k1EfmcA|TaR-^Eb)fKp(XRrEEG z`aTajMgIlbBH{W#t5vig(38S>2#|&wV|-^CbS2O;60QYEQ*{%NrX@r9MNxWdo}&A0 zwcRCc$eFY^h&nVTD6#1Sff(*lj2ARhlN@12@|#HFj}{QS)xkq_c*jt@bCCUgt0jcK z@XUw?hrMpoX#I^?vZa8BWk*Vx90qifpmPnn1W0EsR{;$dU)m`BW0o)DOq|;*wWCk6 zp|q`|vV^8iKfEE+nm}b(4L8y&^03JRQXy5B$%C(*agPB5fq}Ro5rxT8F!(|lG>`!sMPq=0sUG@*QvBS% zFa5UF^J@nD7DZ&cP3UC1t?vi+&>kN6mI-2e3T$26O$)ggiPnXjmksKH{HxnsgPPIy z)a?#~)*7_Mpq`L{8tzDgpt;pje-ztfd%Qd+ndeVv_4xY86?$^o+u8JB8NuHb_sEsR&|^mFcd$E`xo7`&Y2}>4!inSWYu& zGLW7U3+xki&%vsB1S2Kdm7-6ni<^o8H0VS*p3gN}Pys03v-ACgM=SIxxC+$kr~q*>-wW zBjlFOJ2^n0JakjB-9-_MRD0&dXvae40!={*O#`);<8=+(LKgQG>k1&d?|b6514sw4 zT)Zoy!1gz<(J~_g5$6J&;ElAS%eI3E@0dU!f&bi$)iwaXYkWl7qzLMJPNO0FK=>q9dw)JEyV{WBwP8=qk20v zOUY_GF@iHK_PE5Qqg5(K!hk2uN_`n-xAHgXy=2ukI*JC-GQ)@Sh!zTG~EUYXaxTNV# z?!Sg2742GC4GYTO+vAgS;_f=^bc(yrVw+>ZRS|p-NbF14n|Bu+BR#Dh2{=>{eFihk z012Nj;a}!!;|R*tL%Z?1?{YvXpxouylOc1jv5w+Z#Ip7dNOw z@*}&oazc9r4|H=^bn3D~%uGJ!KC(J&IZJkTqlHc-4%Gc^GnmzszAbi)kAdUvH5>6@ zl()949a{5C zIODuF=2pLyA9JeL=GS0%)yr{5P9=hw^GoKyx4j@soI;_P{>aQ!JAb4vEH{IxLt{l8 zT4a3qMT3(tNshq6`^6B_vddJQ^TjzI&iN2UZC|Cf_Y5!kCmDE~XKr<`{Rv(zJ8xar zo1iS_iVP2av&Uf_zBoQS5^hQH#mTqb(eU?AXK3ir#coBu6NMjX>0eQZ?NEh$hdolB z)lPlB$Tr*{fO+GYV0s7+IC-%-KxYA?yCmTc^Qn^$E z9ge>|%f>gk=b>TaDhb{>0rLyCFSYT?lcM0!9P}4RfLb}$F`-sWF&mOwyc<$*78plN z*@At`2`@|W4Ktr$E*GOwLV_8C1S%{iWAvZD21TPAo0A1PM)-^4XW1ACnI_C#Ze%d= z?(C+aToJsuDTF>;HN{RVZ#msrM43#RlfSlY?)DhY^x~ob62;w=(3(&l#}uj4v}#w! zQtd>UEDfM6@hvFo_o44s?pr{<7k|#4L`~Tj@fV{dgskB}dSOTf5ZBZ~7UxMv3z`lz zOwf%6-D%J&pbg?n!KLBy@vbO1JkQ0T`!WWf2*T0u2%QU85%{)}F%dg&RK#}h2hD~` z&0DtnkaSuEEHZP){}Db_j;UH47f!_7{&wE8wlgjgbu07He#XY!)6o9r!9j%=%B%iJ{g_K^B4AS}B6@ z22syiFK)j8;&I=Q-k6lWASLb&jl2KCA+Z=H$g$R|q~5V~1O3`N@rRvCdT{b`=q>4k zlSv#C`z1@pyGn(V>tb0F`8K4ftD3E3JeHDMSgd3v&{FWSlGxVSontAk2^x^V@%`)A zY&&}ZECYCtVNjH?v8jnaa6*bwEPbEK5Cqh9M$Q8iJqn~M@j9SKq&TE)1dR(jWYx(# zxcMxv{y{j2*Ve?qsSQr)PIG~j*}i^%crM+Xw98z8f;i=G{j5|1F>NCSUILX8qfx+Eri`WCM|H zkb9$voG9aQG0-)zx^=TEfOOTIQum)|5+SS6pv!@DCA|fxRqS-v039IVerkNVk3v_z zsS(^H;qEfws2eDkHlSO?ceU|dZ+u??x=nolWqdy{zFz^|A-*|?T~km1q?``~`jz-{ z>ZZONP1Lsx=r`h9VSH(8RNpgzG*#yq->JrTCeZJNHer0PHogwfo#M+yK#lh{`>yf*2F$LLg1m zUO=q#eCsG6a>B)Z?yKW)3D^AhSuB}Cqy#S5W%szZOddW9X7TExdQ<`eV*l$7EN`@q zx;5NyLDApf22E>u1)h9gfhTT*SzKL&dFX;7o_r7YySC^CJfoPPF6PTpaf}!Jm@o73 zBGSaadPGWx+*k-pU=g4F z8jw-r!j%B=qI%DDRKAf9$fCDs0gWr}Zi>6l@i0ob=4I|yZfOHrkH3|1sFm1PD`J-` z4wyWw^`)QtB0{X;tY7`@aLq<8#Wct+02{Kb(OZ_&!sRtwWpU(bD-stMyEVRw8OBdH z%EO<;AlW{=wurS9=<2LS-jP-aM%vT4#2bfe$f7cEjG%jfE|a#?26V8vu@_z`Zk@)B z{Y)v?&*q8mV4yjIDuGghP6u)XT?n*L5L>=-z6aSeaR9qTa zQjMmCyw`JwGp3OZG51+cKTB$HG{(J-$*o1p+a&b{jR4ju(GYOIPkLnbf*F^G5EGUGH#Bit;-FSEh1odjH@ z!SU1#8(JIuaHLF13oVunjXG^DjiCPIO#%g6I;Ej4MKHgiHTVr}czVHv*L0u_MxevF zFYK|UJzKGDbs-P+cnW?-dn@JC<2&->f_X!_rO7H}wwA`?@^g=tmY3` zzk5q#J3GIf+OsyaaX{M8rW(ZcHub&Pxc$MPH-X-f#?lkt+R%;%QaA48)Q0v8AZ=dD z4dTe{H8igBz;axYFdGwsNXqU6NZ-y<@$)S2}o(wRL2U!|Nl1Zl%bh+Hpn#QJ#l* zSFwi@Kq{?uu^@dNByz$YaU=vVZn=rO|G@?+ogS;Ca&aTzi*_EjQhjDBycs80-)MT< z>-eDQiU6O+75D z`&Q!MG_~ABm%z5c_-CHg5hCC-7+E{pP*72)1}l7>|Kt)%rpmPkWfKI135=C9~YE1IC%RS5=;p)=xf?E*|H<#*q z3{Q8%Jcx7pFjczy$UN1z0BmI8k4cr~C2QQeLhsOu-;)t^#9((EoI%$!xGR5Wk2b_7 zRCf6rT%+`@C}y*_cYP1_78V#ZsSV*4YVk2W$KgduzLZ}~XXp8HmH;;oc~>C$hYXnJ zZ*}t!JJK$9>S8IYg)2SY4Nc(%@8c!wq>gXAh=Qcy?lybEo!!T~d%bY!;ZsQ;tarqM%qMo%DPl zis+Da84&ehy=_g=Qn=|N)SrN~yD~Nvn3DvZk8e)-Le@Ndt3mQ6 zgJ?@>65p@zt^D@K#7e^*1Eleu0HpC&8MnA`yAVjXf6M{u5PrV^($wE?P#ci)<07>Y z(823^BksNs%~1;I&2gTw_@dS=fgX(|o4nP!VuM@3V_4ua(l-uijQ(;0j&^^Li0tVW zC?lUm;&$3xhy5T?VpP>Ei!(1muCK%5%!^!{S(nc<-7nWVXP{?4?Hr_%57WqwP!TG^ zigv&@f##a>OnMaMxQC7MSfwy66q@ym3`!cb(xB3|)QXQ&J95Lfw6$XoO#&9y{t2^0 z52u2w;4~oMw%SzVnnu#{BHWI45a2t1#Vf;|f8NkLH{>h~dQ29P!l z7f2VIe*yHG_`U?h0fmdEIL@n=g!Af^cedz12+Gv-k5?@7vYWKisG{vnF7uYl)n&9EKtKT$~={3#qnn!7rp+k)N- z5$x@zjHVvt$ZYZY5ty8slLu%nGf&!i6ZwhlQTI%k%V3b=+5v4f(jq9oHo+Pebw{A| z&SS}<9Q9NSwL0`D6s}VhiG~YDBwz(h09?nJ19qM8f!Bqcl3}|FAN2j5`tm{Ff2c1X zQFq}gJRG@!4fk|0{V{i;XgiLqZsKh-9I-Wp50bAzk$^cLWWG^eT|Vf`qJ%FW^xdw$ ze9)Ii3gF8JeFw{{%LjeAehptf=*wklWQq^^+Um;(eJ7|dAM|ZdUq0yDtiF6;@oO<2 zFp2Wv<~X_G2cn^ioJ#BsU${hkTt0Ao8h`zA+=?Df6ia3cZ&g1&-~}JJEmb!@!uMN? zbD(C$a7{F_C$)!SB39S7fGaV`?Kh-Zh-G+yTwX>LIaNhy0;p&#ZH^e? zR1Lv{*L~x`yT9=$bE>f1H{xWc>SR1BoT>^us-3E8JZz^5J4Z&uovJtbv({H8azTyRVZ5CF?*(naDUk3 zJ<>Sbf!*ux;zZNZN+Q49A;Yfe9 ztK&3h$mZ(u%R^1S<*g>oD3k4=5JBRk2r)>Ugxzx76!)FjJ9k+qfAAZOhm+#>_h%JR zR%OD9-`}5Ag|eC;toZ%?S=B46W?{we@6T$Uvbq%y%K8%AZul+vZRaq)Q`I^TEd@0M zC5JxU4Z+{^a0Bn$_Fdf4)_ifsl~K*O0}IVZN#GmHd_4&oj_w9pBklZxc| zI|E|Q`Ba2xw#6W1Brh&V*52wqk?0|)^Ag`do*6GZb?vv^QQjr6*z8VW;ya7{FfSAs z=7o~Ne=(=Af9IoSqFp7-vpg#5DyLO_%{Ja$3Gqh zR<{R?8*idkx7?5)j%%6fR%_f+#_d+)_Ox+(%eWng;Yn#rfi&KcK$`lqfVk@w$AW=q zNydy4=nsN;m(pE=ZUN#Yo+0aApd-ZXWgsr=g{;j$R|Q3eywA-v#P_<)JL2bna_27@*5v=XIY zKtu-Kk3)Dnq0s%tn9WLo6f_S9F-LVPaU6(cd=CvWin*3~V}37I!p*svwuPm2V3Fw2kvI7%(TVbkF0BsN4!9IpynN^VMT~Oei3S<&HjC1SC{{`InU3?JUOl^z2mb^2S2t#!HBEjYUbsY~t+9fo2N>mGhg zV#FF=Rg#3+p~|xQ9WJ#JZviaHK#l;MQ-GMcp!sLk+h#XvLxklf1zT{APlJ15JY>Hy{^0vqkG8(;> zuMkMD<=YELNAn^ez2b#}R3b$sSdQ6_>A92LZo7L>EH<5p!<# zHZ>^aC^A!+tXI|Wih*>4C2LbV+63eKBOtZ=(}Jkzb`y?UX0$^-Z+y8SP1gswJ?3cX zDG_{YY~-)8k(c_~Kx}*=YZ4HxH6hu2mlPBjxUpon1FK(a5QFsU|Hz0y`6>kfnb7iE zyr3%A%R_##kcP&-T0m+8=~NRl`paDT5mOW;&2Sn7-4`2ttGID_49*%1)@zw$MbBZp zUZ~7PKE~#G@E6K-C{I^|nJA<^14I7dAl6bJ0i-3uo}=YD4X8uPfwnMR|G3kjhk;b0 zuLklZy8hTK_FO|0eO!afQ(@ptZSR*n!fyRJ3(FR3YIwm>;LFP`CrmJ#_qXf?H(Wr= z)17k|erX^)wY;6f{~K;#-X}2w-~AH}ILVJO_#6xX*qE$+FUTK(@Z*4g1Ch%Wu=K(p zf@AHpX0SM;yTQbezR`>xW<|9P#GOAv(v|>dRuY4QL(NX{^}#x=#AT{4TU^F7BQ91f zh_!BEb#~_1xS)i+!^+ssqc#3_IP03*GeBBb2ckUHjpk@|8*dPPZnoB4W9y|~{5e{^ z_e+HSVDPvRA!(gA^O@9gN&;k?C+j$Wna_8slm7fgm1_=<55dQ*1Y^ue&tHB`n$%-$ zc*yiaBoUeT(+}SvaTzywBNXoyHVm4lfS3iQ#6%gyopl<1!;OgraTnxiT3UAESjVik)oHy-L!!^I1HW7O(0x70$#c30^VgYF< zhMqKwkp=cja0}oS6y&&)b_wn#UJkjBdhrL3?eF2$!cw^Z^G90U-k{;#E2)98`Q-Jc zN4%{R8T%;Ohk!>y(lQK4vtI*roVdk-9_Y@La*C*eI$b1el*ndCmrl$+1{wKaMUsmx zHBp)R-G1Pu^O_PMo!5|2p51k@?XL55(Y_{>#27rK@UrZ@T_*)#%g-L-w|qshc%o|n zjg^^c!P*KoL1Ogu6C)#|HXLfd6WduMy6iv|Pt!IE=shU~H|H4sipl32_iMw_JM^&! z*~qQrfXwNSs9c!-O0p8h6D+*dy!N1?fKfwweHh+4DPmP9ss++Y*(vK@%qr+15W)+# zfW3*cpPwMcx#bmnZ;M8tq;Q8o^z#+lF`o#xaQKMI53Y_k=${CW?Zvs_mfPUQL+sU} zcWDW;=;WqWd8MS8g;1VW=O2)g3q$2dv#jbVC9jd;;J;H?=shx~8-6VDox-?naFdE# zvIeP>pnfkB)kYO{tX8(X1AiEl!!54@41aJHzQYStbj+UzbDPL2zi5i#yX7%_b*N*~t6wcS6)6bDm4WLTkmMLBv z4T&s!*gXRRGz@U|iu`(3mzL$G;S)o%_gVtc4C;cHwIm@ICx)6japSkYDiYXCFkHjf z=HhSndfvOsa@VUu0&?olk~>z*F9gvT{98dM13f6n2BHF{KSr&H%C^e?>kRs=?dfo>nMd7@Gi~H@~&P z0N(Nhp2|YhbkE4BjgkX`qR~JPNCM6R(!^08gA*9dXIqouA=v5XwIQes47~uf>2nCl z2qU73^YL^T9Dc_s{|L@&&F4bJu6#uc%%s_c@0#p!(|osAwh}8Avt68KyC@E3lY4Kl z(A*=38}ZVPlrJv?kUHrJpbH$F@JFQMdSjGmtXq;trTeWnCbGI=mSb$nQXOlarkz2 z9nEC@QIgcSeKm7qXCGL|5~0#fowzad+%g*aj==Odkly>e(l%=+x}U%EcGY>QK4@}M z+jEkGa6&3WIfX5!Gs|{ZZbMqZG?ss!=$ZNJMXlJ?Tn82Kjrixe%N`57jPgC?(XW(DQNIF9ZZ?%vZc0Tm|Hrr zmu;uw&TQk}wk6LV^_ z`MaV*RKMCBjx>liO?A82APRGx1l$Ou>AM|B)5n2KEuqf=X$n3A()n%}f=XviT zdW0AuW$8fIq_6>GD}IiaD^mw%){qYBzOn3rc29;SUN$nx5Fm1IO}flj*Dh#Z-Ve?) zUDKbh)gB3Z47xUcYrx+;;qZnH%tc^+(t$g@sBUMrDw(Arq)Y()UGMFOA{Nac$5BP| zfpoIKy8#AE;ZP`2M-N%|0BONe$Jaunoj?oGozG^|UO~ZKA3XPnTY8Ng-;pTtOREr} zJ)JWSv0dt&txc_}pV*G6#ys2kOVK=pk^5DWdVj;`BO?})f=ffZUQ+sj^Vc%eRO+z> z2%3{THTBqH0Vkv$yH>z4smItibCN}=$8Hv|U+S@21@uonc87qTsmGQQBzko$A~!^V zbI+7&{<0f2!;VGVkh6C=KmNa>PhRrBvM z_zU&FVxE@GLpaQsWB{*hsV+J>c`~m@Kh_?8Nksw+47eSA5Q6vxZ*EA}D&!sM*dU6^ z)O*tLlVm7lrr+!FD1kbhDB4*nP(#!cxQ7C%#3~1R7iFYYr8@+1CiELYPXG<^qtS4! zK!=OlO(xv$fcl9W2SE+D7U)QEd&Y$O$oOst;+>x%E6)sC{eg}Xw^M-TB1Fil0lG|3 zEzsqH&H(zEARdf(Q_u{cC4y!H=?sg%d_Yw&WGw{JIoZ#ERL=7Nh34`epg&2thk=#~ zS_Q<}ddPYiXsD#>Z6KxC4#Yg8)uQqIUeGB(e-v~Ukg5rdKx4%1CqP`z30cHPMm zCft2Mb>h3mgj;XI^+Ys3kQDIO!}MzX!9f2IiqnDK6~rkHG`ro*UND&YRyEF~w6Prq zqywN%8$XYVD4`Od;}d?7W*!BLcD~Q6A{;K#4rt<>bGHuwA1%UzfwbU;0%_66?qZIj zCEl=E!^0=A+3!g1=MSDV5BQT){@mMnfhms(gt&JO6#abFW?1f$4^Xb*2PP9m4K?nk z(bT{5!wcpkcy!w;Tnf*@-*#_k0|S4zIK=tY*yx^mON`1BCki|xPV(y0&iD6WyMN;Bj$Q*Y3Z+Rb2KS@%L3pmU1CTHnlW?}8`m)d}xOHJ+_ z+NHc$ekcgP6tuiF)80Hz%8RKJ`~E6M;0`sRqS?R31+N z(qXI~=o;ZN3uvjJ1wc9gaS-{7xcvcWji7%3arg~c4*}_Lw*u%0abrIm95hBz5`UD~ z-xmadX-q;76nmRZu*e5>xa^Uh5hU%I)R%qc#KXURZPrNaR`2T*Q;c`+-C89-9G+jg zHr16Eu6f3u-0s8|Cc4^FUkbY5xC!-l*skldBd`~@I$<}a3S z&bplWoN_tyIp1>TbF$^k=S<6)zZBmx3KqAg7puNST%WJBa5wbs25Wa^QU8+*6aT{V zkdq^cSDe!$yF_vfV%F?_i|Eo>`@cwh>Wkdu(ZMR;9rhCK-0&AECg+BG@pNwZ2fnF| z1d8k^lbaI^sx;_Z#~M;SrJX0x2&G zq?{3|^2_CnX6<8aY`eE4|IgTAX!aGgw1GKYJXMI~Ew3Zrun{jbfB#?SN2d-M`Powx zvB_;R`$u7UWyceS5#QvTS!Ty0-5Lj%LA1=w-bedf!wn@QkxMCI9eT5AwHnbVMlU4k+&n6 zSep=BXn4Y*on>td0AqivyIq1-6?O<0G;2qGe9}qTo9)P)_oc$WWBO^n*B;{2JjZ`icl1su!gKN3|eT=0|spd zdO*T`0;JYdzqRh;4oH2`FL^4O8f63T8;QfM z-%idJ8sSSPj{Q)n4YJ(cSUGLIYDGdxFmgYutKf<0NOR$X@+v&BQ?L zb31(kZm`BXu1dzWu^)Ek;h;Zu?|A%kqL@s@Y+OD(f!^JG>zrK=)+|f;Nh!mcE*|Us{I%`x%|Bh(Tfvrv zomtfTc&BW>YkA)eZfFTC1{UzpT?!aK%vO;;SiSr5O}B@{>Dk%>etx+caeT-0#hu(* zr>@?&4B#mu$Lm?WAr-a9>>}JeH;7K7u5Ck@_1f=k_Ir%qasp9g>oPK7~Yw0_p(kOUubpzdu}6% zZ2T4C@83d2muC>x|9otCDI%|t!t3B}xmLGfR7cYk^wn?$29dW?knd}I;7tQuo+Z4e z^p=$P6uaZC6bv;2t-$|eOZPbCjUd64uq~wXmQKC$CC_pO@jlu3o^ALtkY9Scg(6bWYUA~)vE8?Z+Em(34N!4CP3uAtsh$wGgIR-b_d#9I zijICQ-@VyIuy-T!3a&!1g}e3cebV09bcTX_3ayW_7^4E43oo6ju# zUsC??45mf|o%k@1O2@dAFL@q|5;UJId@0|NZnmK*p!`nhCU4I4%qI)~w>K^#==bM;rMxZ#AkTw3 z442)MLJ=vrYXtowFse=VBft}zygdp5w0!!XY`poyh39e845+D;2jaWr|4}c z6pA74n@ju)Mukk4&71u*D>;FhUIG+6sg(6bSRf^s8 zmpP{8DQV}U#p_CQ_ zdC!keL0=8W7NdwQMkyF-4*vX4Hr_WVZ!d_?mu)>Ae>w)`OPQxh_i=4YDQ-XW{^ zl%7`ap*^;e;LrfoK$BBN%*!t{H5?Nm{d*=L`&Xrq){RlpoBQ1th-WWD zrHEAjRH`ifkXuUp&)$Yo5h=OqhklWTa=`;8(}Kc&?DdRqM|`)uvKx##*GZJ8Xl z2RQ6!I4B~A=afTXzEwE1U~8|<`Rlv4L1KH>rgsC>yn|KaS48TUm3rUq*1lu+T0gL@ ze|^6?wKvrTC=W1{ib(l}P#(N@cWduYLsp-+yII{5Y*X0OBj0Mp(eP}|irAW!lA+EI zlx?;+-qAQL$OXht^SF8s}E-TzBR$8Wa(*mwoyfFqe{t8dk5+{TO9jo90N}BSZB(YJO}TA@4=eeowNh5sK5yl796xcD`HGXC{>nu*M&l(U-ueHMWj4N zDGRz;1sCRT?!Ml)5TKU^C=W5EtcaAQLMbEoFqHs41${Lf-4(IKm4cy~@#lZC@gApUfk|0P)eoDz2RKyxoO7dTfHt&D3#c`^}A#-_17{n3epPBM>Ov<0U zLm=`$+4$FZ{84nsLy-6G%13#VF9^&h8}CsbZ>=T2G~wu#L}m=impq@?17B{iq@4h1 z{!VpDzV)icNxHM8`7GhR&q3X+J~_o!_r`AZp%Tqx3ECy=Gj03d80aP3<)rOh5%YGw z@;bb`H85w9)u*wbzIR%l za+*@^)K?D*q%<;^|zdfCH*c^ityGy%Lknf5; z@LsFD5h}H$S`Mt93}8 z@jzS5mflUmH=Er$5=c=yu=YSjES)!%@}Qp9K^N|~b)U_9uOHMlpfNq4!j9E|j9z6p zC?bb!l)k+#u-Bl>C&Tk`L#c?Ap9rN|U$j5?6!g__Y`Kb9 z&Pu^hU*XUHWaGUNx;cye#EQYj+U z-b%F_+XF58{^topt%%eIDD?o?>&Aw+_SxKfeb2`H`W|)NOGtG}fci;8t%%fz3bpD4 zfB_2nYB;tWMQk}rLB1tQ05{*Cts>3)NKILmp75E_=+{#wRf-tzaZ1UxBL)=# zDHn!1j7+^xw)o05K5Ey9iyxmi36+9nr-)^zyvcX#9(YGR-XOxq=gaa{ZkaJCU-JBF z4}5taG^9!V;Ol>0F_el(dA(BZB;^6c z5P=X(74pKN^J^7w)i%E&?)@k4I>ke5L?{iIw z22;Wk)zFzSC|~jn+JLh0on-ieRfhd98(%F8@_cs>>AhI^GLU^%d`#6uJ62sYv1aVp zF=NMJW5c0`B_r0wO*4~?mrR>6C30Bu7&=5|%$zcH*3<-$H7j{xVs7Kqh;`VkNbzB_ z{C|@hlMJA*M_NbyAAWjSLytYa^w^T7$wRH9A`Nq<&zy{SB27~#Pn|Y<>XgW|8M7x% zpT_4!Gn+1*l$bVi#<9Juqwqg6V$!tf2r*|`q9HQ1scB}@NuZ?1oCbJ+V%F5A#IzX~ zd#;n10eVlKc`02lYMObePcgn>YUHAs)2GjzL!S}R(<4)7B%0=eMq^22opLHs^j6qyYbEeIj8flz9brK#*h$Kv#r8$gTI(62pNf%Fz zBxVK@hRSI=Vir;~Z8~{RpEfHog#0E=pNUr~pGh<3g4^_|vnS0+fVgqy^qChkd!|sO zI3jarCYuoXqy*hr&Jq4;_UBBSJ{@gkPGs7}GiEj+2~3q=Jy}^!LL-|za|SY;oC;=> zL3L7N5{Z~P-D{uKHI-+KoLFVoRE@Hx%}7jbnl*JYt5^~}GnoMY$U8CGpg?U=D=dv!71j*T04_PFsiwG*T9_?WY5swa-E88_yPu~jwW zwC<)%y=YQ$dSXWM(n&0ItF9_$#l~2*v2j&aboA&k)_395$&)Uf8ku@&V`A=*$fOI=N6>r^?zKz6DKn?eLNzC(F-=0w*_!Ll`0g}p zL(*O{NSiM;&2h}=@e`xf)f3OG89OdEX7t3^=n-QyIcK76vKiJj&76!rI2tLpX3d>} z9*b7!WqLwweBv47YQ|RM_jxCxI3`xtRE?>wsrJ09#?;o08C^4a{5a2H#JI6z#*DYn zX_L);%to+}WeY+co23Ro*+|84-*7MJ<(Op-p+dsMPT>q#w06 z0u^Xm=xbKIl*PeO*?o`RAn}1a~ zciPeKa>-n{DLyWTpiXzsuNJnYT*O{e{>@SeER`t#zu%(u2TZ;+(fyW1 zZ@m+FY44jKoP9{mp!{?0&tI|EG5>h*qN`qe`KkvGyydOK`<4Cj*a_F%UjD?}uf965=LN@}J@L^q+mHX?kAJ`AxA$I9dCBHMp}PAXe(L$JCryjJ zbk)y(bL+#G-CfkG4R zy|m=lPW@HaZ<}+@gV+7}jNUiCH^1cPtvOTL|6RWL*n*!I{bBIc)(rcK)Rw#dHD~(S zXFvVuoa(<6-tdm|M9r~#fA-Azi%x!JzdNoR*!z>;{Bclx>I1(Yb5X~H`deQwdFQ+> z@4Pkhi(lSz{j7@4A$y&3@h?{XWYdXz|LiH}ypewy5}&tVj5Fhr_b++4VEUxX_MJG< ztr{D@`idi0_L=+ST~GaZRPmVYsXxB*%=Pc)Pq}V-=$x7tj(+{I%@5x3m%~?{u-}v| z15UcV_Z26$z1g@VHSM^DiPtuanw?X*ddZ-7?-+CQUaxiAIAHMfyDwa`?coECsETjD z@Q8bEyh*`OT`_dP_T$cc&2jha`}MqMW@l#i_V)JPzE)^c`YGN`Jbm zL;0}k|4VN)VNBx{r*}44_0y-H)k!F|!)wLGmltj?to7EceqBcQul?TGx=R`y@UUI2 zG^E9mPy6n=(d)p;S4Wf|Hsr>&*Lrwnbp9}KZOGx8dpaac+_&oem&smho-{pmqtlp& zRaZTjda}uV_l8XhZGH8ho!`8h{zvc^eIus&9rBt}eQM}L8E+j`Y4Vn*ArA(uYwPo* z?t%r6Y7`o`vgE4hm;>d9^k1^I@P>q=GamNc{ciJ>cZyWJf4*z0LMzJpZSL8-`v3YA zEEzwsnq2=;%pb!y9NPAgd_DGr+o5-d`F=BO{;Q`)te;!)yp2Ox?AO6udv+5sH!{wZZUwOrHe!Yj`&9C@+j`L+GS+fTi^<<6_iRxfzEc240rO^%&Tk$mU6 z_0L{N-1Jnw{{C=CsYAn$ejs0aFYGxnth)W1AAe|EzGnaF9?crP`D1*)qJ9H!tn?Xm ztK_KbciPphH2a5*nMWV(5BYUK`0LFZ{~1}~>DvGGYyRur?>~Cp=97EwlcshVJ}dCc zkfb#u50(3J;LaOW=8Tc+Q|f-V+PC?${`U?I`ory?FDKde%^%h%Uu3KA7SFL;cYs#t8!`j_` zH7a5>vGKjggg3cwX$`|JQ`()mnD>(5F!IKOY57S`=`l(DE~_+-Bc6 z_GC`^1BHK>8!xx#kojKMj+GfOLFVs%DHi5t9(~&ThqNlqx1WQ{d0Upw=2EgecUtto#bl1pH{v#!T0k%_gZBPoz-V~t0_@l zBUCtn}B^nRyigRd4&{-D>!Np(&>E;V=i25b7GN1wmGXUgpUF2oi>+8s6{hkEwW~_`XNGqCWbqXv5IvyH;K<8+oMDp_Ha+37>5K-L3S= zUB1_g{~i;*?XySr^tq>Me|7NRM9V)bZk7q{GVilNFE$K%9`o6yn6GBuJKM3LrE%29 z%MvHF-%@aW+0jwEitifNze%&R@o|>t(w2~VcqgyU#MR4wKv~i{A28rHK7F_ zuZg`GI_;PBPfx!8sCoT1X)y)Ac>LLr_A928xHT^9%NwO5OEzm$H~Hwq36l>Vd82N( z@z>70tn>TMn0@^d3orWO*M>j#_VtYW{pjTGXEHArJZC$)>(GKC8<)gi&3Cu|#y|er zm^OZBQCa?c85M1RHMl%V_WyU!FAIKu(vmM_dxdSjvSo6Wm)i%AFTbn&p>4(FeDt7G zmnZppWt{u$bFc9a?zOsF^;o%!zFl|SU-B$IpMC!CF^3)p6nd~Y_RNI4lVj8B@36PM zKk>ri^Y{2e84+cF+EDvx^UIyT*!K0wwRiUVO)Yuj%~sWu z{`Q|!d(JnVigzA0{o(2t1-HrauCH;g#*GUvMy;yc`+kFmvzr9|z31N#Utbg3OZ=)@7B_oodlmiBw)0a-;?X5HKO={Iuw zrhM@4y?Zk~`>c4sz+eAtJ(+RDqhwa+awT@j@!|GQ#|1Ym6OO(7b)e6+503wQvfsYl zAAa`lrv=hi)g099{K`|lWfE>TnmKuL$8~{NK^P`|Mq}eMs1e^CenN|M$%*^W^sXeCe^PTPLg-Bip0Qx1q<|F8yPl9DnQX z&TQJj>*?s#Yv&hV^TzN_uUbD?^!WJ3Z~w6THhI?M0S~%9tTnn?#ygEuEwe~o(^M|)gZ+Bv1lsdk6 zxNhvQ11FZ3lk;K!rh)$c?gBO zTzjWjvL(opd8YNJ-)wk!G(Tt)EE&69XE<39j$W4S~05PrY6a$6)ME1PJ9}f@8G+EtM1oN ztL1m1NB-lVc1zrw*t7Vr{l70-rD(_WYNKbD4f*oRecN06+0Oa=>izrtxU}d|P3o?R zT{QY}`DqJhZ$1&aPqxq8#XGi!Pu_X1PV?$tbi9;5f13(T_w}i@=%?YAf4@-dg zFTOsu@1^JE{UT=A+Oe7aTr%W$@G+?ZTq-m-)Qw$F(|4d**ZFaIsE1 zAKeQI8#Ur~lLHH)N`3#$+Y|D)eRpHkb9Y;TG)>|DgHzK1uwkzWc21-M#8>syZ{S=EI;fYmb#K+w5^YZ#h3~tM{bbUtKE% z4&HDfy_CmaFX6;6EOVxg7?ON->X4LH#Xfxb>F9;C+qS=vZ_l6;weP){-Mw`0@0*_f z>7~!H4fm&fRPCQdivyeAj_BC>VdcSbZfXC_jp#Vz6-(lVr=B}@ESz)WMVs9(CvBlJC7d3@tP z&&M`dQEjEysB0e-S+y@_i+919wfB5+Ec3nJD%a@$cSOx?P3MH4{BYHPfOjm##`NDG zHRS7}zj!Px6+XOFvlHhkOb+T0w0^+UuX{h+viZ-yTiz_TGGxo9pArUmJ^l4basM4H z`q_&3eY-7xpUEd?MRw?#SoQ6Dc)r7!Ax|R{-3$M+>zi5&R+n9B`7C*4@y_0pDz{&~ z_^wA*%FLeIf;;WE{?TpInbHrt?|WIN`J#XR1`*_V97qu%yASdR}>B`idKEYFuA8^nafx9scmg zu(@CNpE}{-WZRPCZ+4%Q^2y47n~yYlgT-QnGkMJt&#r+_AKl&hi$^f&^q}q(vqpUOAvEntGjP%9L1qnnbnWg27g#}_TMt`D zm^Dxmcefs-Iee<9xML2evzG_HMBwfgDIQ@t+}^Qy1VTbk3etiFnyI- zQw%k5Q68vg*uMDKtbq@&+}#4jBjlN|c%!(o%&|NrQ1gn&1FdQ8Rp6#M4_vD0?gp1} zgL?V?C)>@MS5O0A^nj1!9<^L1zFF;9FZd|T-3=~p1FwCjeU_UwrBMTyD?`1`c&v3& z9{7OL-7OOy#oztwv&Hv@9KE2|xVym@n4lHPg}&CytbvlcyVVpZZ^WU9G+%A;nC zc!Z_lrBbcTdEh?C?r!jP52)d{CsRDknu@4N5|2>Q^fx?an>CeCBX4UEy|0RpJJt*C z^64(V@@1?Uw(Pv<+K!qksEHGgu#~FeE{f%-c~z`&cUvXG(6fEZt`9Y9;36J(H@IlI zu6P!n>ebP#sfHT4O`G@Gx4^8ajvBZG3QF-_4Z3H}uza@)?Y&2`2ce%U4W%*E^hKmA@m^F=1Q$uKAwz#>pb+TClmvy9b(zwrGmZ+&I3Ip51T43k<<~*LLxh@{_i@&hmL-(3BUZ}ZA znvZ|%f5EH~Q;De8Jkqo|RZuh-v_kfMfj4U4E1dAmv*VQUW=(6Z~5fA5{?yu+*!n@8k+?hW`AlLmjar zax4#wbayvV2wYkfs2E_L=b zD6_^7HBc%jY0K8Tg3V?2M@_U4KpT$Bx4xQLBdQ_F^MiPVJWao!D+VPz%ieziQL|2j z;fUeHrCXQHnjqA`*Oy@?@~_jPzF8xRD7;#WJaClrSBnyVn>8V*87v;5ZSYUB=A#^JIrarG{< z2KG4aZb{-1@^rR8yKOGB*gXhMMezu&@>AVPQ_Y%gsOc*nAx~24eCx~_u?rD-d`Z)H z*7QLQ+?)!=dqShnL`Q&&%CyyiqRglQIinKvBup^mihN5U*0!shB1v#2e@67W0})Y(?UGLnk8Rc+Gy5fphlKwccJ9! zW=$q);8+9ll&z2?5<7Zjp$2YASVue?P^Q8evt~GI#0nhCrOwv))vOtTnnL0cmiSc# ze9amd#qMr!J7_pMdE?U`oV4>O)HD>2qG2pwua0q2uhFQ1{SJ(ck8br6gWIuQVwwk#L8W_<)xB94Jh*|R{YWj&sDD(YO@GTcd zuW_ge5Rb5C;K5Wcvt~SMpjShAZVYh~0mnQOP$MQ>^y)r&l9PTo5jBDEDE?OAX(7iv zlTZ^(nu@*u*WBzi88xzxl_=-&wpsHQYI63Pf|?-mDzIRjzd4WC#ft6KO%xOAes051 zv0HE~^EA{v7LNtR-?gWE#DR>XW;$x%wk5DF&S&{jJBt_iE*t)Z1=fn=eS919Er2BoEoYbIgVg&9}oSwb54$DqVCjEnf9Bt;HUq>zf7 zq(}i3xj+&4$H?=WDe}k^ad*=pgMxEXaxo%ROp*F3B1;%xiVQMECYmBkOcA*0jIqef zKbs$LC4`$kbNBnENI4jCxJatCDFU}9<(knH ziLpp(F-5{uWG6*3Rpc~9Mykj|iVRW_xG@+kgH^lF}yrm-JC^AJwR#W6n6*)|i6cxEmkr66VmUft_D$mn&OM;5@q)3*EOrl6X6mp-2~@G5TR8csnJQp^6Hm zNScbIQzTJEmQo~1MUGNrn2J23$Pg8&U(E38sUrRq>8K(}6zQWP^C%LkB0DG&tRg>C zWR!|Lr$~f|7&UEF+;G>e(bE)}Zi;+jikvk?+~BYg7dgJ_nIh4qNUA9^+Z5SJ5v!`j zd5ZX`h`isSuZq+a?`vS`tRjIF2@w%v2C!4)H5Hjm5kD2#N|68+5qAf}WvYrir-)re zUVX*T_^U{3iu6{IeiYH$;!RUzl__$NBE3|ef^^cQor=_?NP88rQlyiL^ruLmij1L1 z2NhXB5naO1DH5$T7by~{B8A|Df>@$dq#Z?co>)_4hAFbc6uD@M6e(kP>CB;~NSZ0K z*c91kiaanys+D#0@;60Bnj#;WA_q*7zf6$|lvR;5iZoJ@85EhOBA-yCnTqVE zNDCD?N0A~b@)t#>t4PTTMwwqxk$M!VpduY8(o{vlDAGVhUZY5J6-lE=ITe{jk&-I1 znIdIW2QKXHExWj27v9wi@>J-s)U2_&mwkOA>jWQ@hBO>rcI10gDPejD`KeKBx zGSlOd(;Om6_LS@qkBF#N@--Zi7PN>+YZ-w<0gNaO9L#YI99&|gt)$?<8Y3+|J&o8% z8Bv)B$w6?w}PnIa?YBn9VWc;-nmqVlB6NGplK86m0# zso?yNkw=yp&g5XEjhA=^%Xsl;P%Ws<;OrAdyxWLpu*8W!Ln9-@Wkj{lKp9c(lb|Dn zWyy$_#NfP>k-4RK1`C`Y!-$lKBVoq~bP=veGDU{Th}z0MRYZ1lI3!38?HQ48um_=9~$M79{5iNT1c++G1P;w8PN%7~|=V7wSLmDTW<5l`7- zy=A1Wbnhi2E#+1QPt2pd+RKQi%-l&vT1zTWMpT{-G9sJM5-lTYdqt{@cyXYbrdAMz8s;^}(%?gj76F{OcZLE*Sko`dL0Qnog{uV0gS|QjwsYHulK}S?KS`9)Tt8BI{Yw;TnAd#fwKbq}D@}R4DpraGHO%XM5p{Pf z2an=!Ui^1eG!;q|YM9poq+l-wRKSdLX_`tS3N_4YAyU#S{9vcUnp!{;8y0I6+fY+|i9!wYT8b2%`mwBB`}4y=s&7mn3N_5@Bj)wnf-OOs zT2B;enAb8zi6@r2$NJRmuDpIE3N_4YxuT#oGWNE)uBm54p@w;_P?UIrUfq;et!fZ6 zZYt@{yjF^+9$zKz-q@$9D56lqyjCd+vO>N3E3eT+p@w<=Pf<`Wn4>hcf+*B5uhmG& z?e#;u{jW?=UWbW74f9&Vyn2RAT&$`4M4^Uxtz}*<$4zT9QF&FVE>?;KHOy>!Gd5tc*=Q~Z6uLX>8!zMmQeJ-NfYt-@{ zhcy*J6lz$#zCbE_-x#afa1v3dVfFfwc^z2u{kxj_k|@+LudhsAAnzwF_rv4@hHO%V}t5@2UZ$HsgEf29$ET~~#hecGkVX5(7 z_-HDEDAX{o?~rm{uMtF{hIt)fUWY4RdtH02APP0i>nKt+;ZgjF8x=Ow)G?w^!@Q0m zCHs8H-Jd6G>IqS(VP4-O1@(eu&4lPb<5ZuoQ`d;1hIt(qD|8#4j6J+VQ(;7*hIySp z3XbPtDYB^3q2bCajVRPGuOEa~dleXWwz#HN5rrD&^&?W*=fi=@>kLt-VO}Sh7rfWg zRIz$urC3nIynYf2W_JgMU zh(ZnX`UNTJl{x=x7fp>M3N_5@9P>&}TD(V7n~6dV^E!_dv?0{%-(^J;H1#V{s9|0g zm{;vbN5!T21w;&%Dh-T(QNz40iWNp{fCAn-^ixy}QK(^FmlOphbPE{0Ra4`LLJjk} zjFjy2&<{r|uT4auhIw5aEF3Rg)qEN%Ut|6Ji(v;VC zM4^Ux-86Y=>LpRAVP3zPypoicS0k}fET~~#w?tHrFQ}KM5{W_$^ZFgB!jMud(1yd5 z*HWTT!@T|wTJEK(pNK*Y^SX^xcCVhwt4L$;w^&fay#5qX?N#wco$oc(lql3NuRBP| z`LO1($~QYIuNb0G!@TY?uhj2a2Wx5qQK(^Fe<3C3sDs~({8&?4h(ZnXy2rexTMCue z)HR||!@TY@uc31{{GqAxO~gvEpoV!p5K-NRCD!*Frm0|}P{X_)A|>1K{Mt2x`lvP> zMHFh7*CXb2d&)G)8VOnu^IVP21!SD1BDTTQt)6)VMp8s_yxM2*&f z^)UAaE3c+Rp@w-qRTRuoQC&`5*HkZ}P{X{QA(g$)k5XRai9!wY`iFUq9o6oJrZy0T z8s_z!dBHp%p}bBJg&OAdf_cF_uc>0q#7eQChI#!fqI&KHuMp*BB?>jn>m^df;Zgjp zSl8?qO(hV88s-J3uk~jfgN{Ak{hIQcO%!UFmm5;jE83@DD@|=D3N_3tA5wBGcmJU7 zo0>XL6l$24JM*&VYv!q`{LMvG#ey2yxi2q{)zk)}P{X`RDhg^azIuT>cIEX8QK(^FuP6#yBjATo zy*1_55;BROPzDY2Duq-jW3>h5d4J_qpD5HYuhPux(Yfz>YATE<)G)6yCa>PgD~Tx7 zFt4)AE4J>5Nt#+j6l$1PIiz4L!(z=>@=`D5wVx=|Ft75=tL@Gok7%m6r;!Ua%&P+P zT3KUdg?7rTD^aLnUKN?wx2ub`*Hk7^s9|1}kg8-9#WHHaj_K`{*L8s=4tdHq;3q@AYzA__Ikt2R>5hA;y(syytrrYf~ES{^mbs}A#O zdA`9;O<9RT4fFC)UXb^3*Zo&JsMbgz3N_5DF7tx-DVmx=6l$1PJ*3JBAE?)p=>^tk z>SLl%!@TM>8`1#M4^UxHRN8kl77=vb#IYKET~~# zjgZQ|Pl;A-=uZ@Cm{()w^~~ezo0>`^3N_5D3G@1AO5uHx%Iia-P{X{Mn!Gf1j40GF zuV&2aO!*eeqmdHFN12eThH*IsjoLJji@KuXpt=u^M5n%Y4WYM56b^STh&_nM|I z5``M(6@(OQFY&~3^J)IhtyP~d&>mV){0tyym{&0Ksy1kLhNi^f8!o6}ULnk@>&XHg zyp>m1qEN%ULYdcx1KypasT876!@R1=+Puq zQ=5oF4fBdn6r_duu#xgQK@@73SEQm~qOQ4fBdYD*G|Obmf&o6l$1P7v?p&-Os%>HIFFNFt4siL7#`^&GRWu zUQu436NMV))s1<XXbi?`!G}qEN%U`Y^9+ zlW(SIY6(%OVP1WimsddlTAKQrDAX{oe$1=d@%Mhw)Fq-&!@T+{FKFdT%ZBf*p!$ZT zlhN|1VP3B>ua0LHZq-yZqEN%U1|TK(U(>!>K3`Mqh(ZnXvN5lIb&dyUsuxkHVP3Bz zCFl7AgX^u*R2EUFVP3J!Ye0p-zM6WEDAX{ofr^6mf;p;zYQrr=p@wD+;_CxBOC^{*yB{-XKauQNz3jAtl@J*3eTG zH1%p{@V8h{!@LGFuh13cD`~0?QK(^F2}sGlQDACF9Zhv33N_3tk$KJa-CRXesYIcM zc@1Ipx|%v+mZshz3N_4YDD#Tka=oag))0jn=9Pq$oHxd9c)C(k-x7ry=9SF6o<6vI zUQ?HdLJjjuVP5|W@msE`e~3a2^Gao2`Ik zN-D4IM4^UxWihV-zZE^Isf$FRhItKV^@4M-Wt3L|D;B_l8s;^Ec@6ofN&`)`A__Ik zYb5hZxOJmeY2`JLDAX{oQOxU5NQ0i5dWR^~Ft5=_$$8`7u`63^>Qkan!@R~Yua~}8 zzR=VKqEN%U-ca>|nayLxxVxGvEr~)6^Li60S+A~5)6zB7 zk0{hIuW`()!k!h$ntF>U)G)8{$_r|6?c-T1#E-SYQ?YzZ6l$2)1m;z#a<6fkxy@#5lBVtug&O8HmwEX=xtU*6RRTmJv7m-|y^EBbH}2mb z*h5o6M4^Uxy~n)9S3LE%rqYQ*4fC3Zlsw)Ty2Rt0rj``*~eEg z)rS5=p@w-aVP1`DH7ug3olRU{VP2bGpbDAX{oPnp+}QS)bN>HtxwVP2mxuYJGm_R-YuM4^UxZDU?< zO|LayQzb*8g~XLipkZFybMW#c3N_4Y2lHCw5mr@u^&|>4%xh;3UZaUZ4fFb(dF7iO z-&=bvB?>jn>kFjhF~Et$`bRajmnhUQuP>R`^Sb`EHFbk1)G)8Flozz|fcH~tRagD6 zXc)vS7Su4WUCe7^Qpd5H@+1m1%P3N_5@8|Jm7#}}Vy>L;R5!@Tw)RT$gKVtHrQ(}6Wq8@?b4HO%W< z=C$qB>nAl;Biu-a8s@bRsj6Z%)GIXO^-`L$5``M(wV!$YTe#E;O~ny~8s>EXshZ^V zcEa;znwmlsYM9qS=2d8$&s9yWBMLRl>kv}1&zHFx{Hmso5``M(b(nem{Z6dArtT7j z8s_yKQu18o!du=uHB}};R97shVO~d=*SUK4uV~7fDAX{oqe#g;=5?HTeqZVl~-M&P{X`VDhfu*;d-m5 zYN{hqs9|0|Atkrhs<<;Tn(9gvYM9q4<`r}1?LnFvLKJG4*JUHO%V_ z^E%n_@lZ`ICJHso>ue5QTZuvq^ZJ>2Szfs`QhR+z6l$2)FU;$$`SD+9>MBvFVP5B$ zSL*rAWi|DTDAX{o^GL})fBX8hZ!}dV3i^ws-$dwzpAU-w=fw=5>vE^=!Sgv!<>Qg&OAdD^ha*b-HodP)+5J27mD@6rf>V z*O^!G&&#jTRDGgQ!@O=FCC73tch8HO3L^?N%rTyLMKtvmQK(^Fe<3CNMy1`6;&L?E^6Q8~4fDFkyx#r!X#q_gBMLRl>poJYL}S68 zDBpMeKhe}ZqEN%U9x$)WA|F@QRQWDO%cF*QJ!D?+xt^xl5rrD&^@w@d-CLkrEHt7D=@s3N)O0hEzdfTF=<^i}ng5 z3N)Ph2dUCTO+0$Gj;0cc0u860BUO~BJMnH4G_`;z&~WMnQnDs1JSNZA)Hb3(!>NCf zDneeLjg7sosqcsa4X0irRgI|aj|yJa)D5CQW0asr=qL5fbuT8eM_`+H3#5Cs}e z6-A0BN6XkMS6Qs($yuw#m8K;$Rimd-FVJwR z1X6Tj#d7)hGSO}#giCv(K*On$NC^X6CM}!XT2mv40u85LL8=TQW&8^o zPL)MU_TJTf4_DAsSE4|}sd7kpQ1-`#c5c*E5>cSxRC%Q85;d~HqG_7iK@?~>Re^c^ zcIuU4ntDJKXgF07DY=zb>>9OIQ_XuDMF0(_;J2#W;Rm#E2_H~d6jp?A=|vQ1I8_;` zili%%Z`vYF%_RynoT`FUeWFT#6!w><_7epfPQm?5bqUKpubFK>Xz61l0}ZFDA|=OH zdfE@QwO3oBK*OnONEM}W*N8(y7HVogQJ~>eEu`c=<*n=M#et6q;c|{B&~U0YQesfy z@_L~k9%$+=QJ~>e9i-&=8dW7gbQ2N6rC?v~Gb^_o7VMz;OeVWL38sWwQ-eM)H7 z#tz!+5>cSxR9mFv_9{N!>!hZNisLs}KqLMaOKpn4b0gA>MViGW49#e5%na=?^C7uW z0l~#8h}3~YY?-6d?6%bOcze2jDSjj_H9awNl*MLCOir`e?CI$#sq%%mjemSrns}9z z8W)>n%gBsROtl$5D`!hh%S=p7$&gZ8Y+QP#EirYVZBSN9oQfJqT&noVfE3$s`IB_& znJvkMGJ}4+&Ne(Fg$#vMy|CD1nD{~Ib~`;yj!hE9r5EY;?5~Dpq^4)mn%KWJ?$!Sb7|on3)`#W-}7xv{F<#DajR%C38VTGd?VIaS2Q$BXSe$UKk%7lYB3ku}h%Jv3unTGqfsCj$u9iC=4Rx=w9C zNS>CMLl;8#Q7M@T_RPdMQ{h>jk;&$f;wTuHHE597B{|MKOg1Pfc5n^@0_v5EBr(I5 znINXIQ5l)`WY=bpDI+T_4R#bcmI!<5pu{9Gqqr7Awmb=;NyUx^#TjDq$T=;j<6^}? z`w#lW{|u!5hwNDycH{K1%Ql0i$X%5Vvr}SR4s8#+;}Nb~JTXO-M0E1Rj5wGm#9Z%M zi+gt4;Plk2v|P2Y8_%PZijZSo7{oBbQ^g=k2Xh$GIdt%JyC^`0dCmk9JDBL+VqmAH znpUr4%WtV#k$R znN>0Jq?YAyB~D0;x5M#pYPxyDh^ZO-nbE~yhvA|&CLJ6dq?p^@=!>F;uKObN7u=8{ zL9X2;E;S{^S?4#V7Goc78)~=9o{zoA)Fa|y7{NhFYKkbdZBS}@oM@7i*nvsrJt)^^ zKnrEYrer3@iavzh+}w%-W8;R}Q{sg-$H`gA28n%|nD~;CAYx9ZHoqz{l)}lOl1eDb z40VC2*Hm|B*+c;nO~TyVvaNT@)B6mN!I2{#fI2-o#CbxF_LS6g@lMB77^ZPCBQQ-y znmsNtw?v8N!w{px;sKe{smtifX<4=;`*6GSa*F;*!zKeend{?bTe=isI!0psOadqHJ6g5$EKLyaGSH`+EyxIj#W}Bmj~l%>8XQLVw26Y77Ttm z|7Ln4AXdSyTb!D6wu(+QIl}Iy~fqV;#|_VUlsS+F}eHTlP6b>^Q`EM6u5?)`_G^vEp#aVYb5A3#XavESq+y z9BNKV60?m3hKx8?vhiqanvq zB1XD+eup}5}VD~u*QL>Wl-WsvELT;$;eh?*-Gi6 z@x@L*D@D9>6rB)6MmjoKVH=p97(ZB?v^1hrY#Ailo}4B=X)qLGauMY=j$(~+VEf4g z@nSG#?>2N8X|VE8nOa3R2zHtbF*6x&XAJegEO_&aS}|Tzlf{S>=UTtaMOiif91E;6H0a+Mj`yz-VUSDBHmRo=4YDl@Wq=Pg^VvfMU- zJaWlxD=3|dgfJDt6etE4j0@Qr953$bwgq&uri^Nby7`*ZvzKfhDnTvF) zD??5=b?+jdS(lfD8R}GjUeab$=OsCOK#-TTsLNwQ`amI%X{9AaEzGswX{j-K za_DPXnrr{kQX^{)eM(D>tU2tywbaO(C#jJ&huyei);vj#tgT&-XUD90k{Vgt<~?hk zq`7q~ICC)~*FHt6+>*)ntJyxJ%xx?O5D&K#xGD9w`vVYR=q7F>rB8@sBgeO$9ozirX)3x3h%q>j&IM;+R zY5W($)#Q|$hk0UhO}J<%nu^2>03QLvnK1m+($((OrQAh&V<#q#!}YZkF1CO(rK_Z- zt1n#TGz(p%RQ*$b=*-4XTqHNiT%aLDsjATDa~U$eL68&*8TqENmkAukN2vj@bY`L5aR4#M1VH`|dZ3G9IkVAM2MnUT$W`qF8(TxHZfa=F%t`bTam*U4lLbCN-QT5lX}81pMl z2kPP}DnO1BayK->$jNn9ER73^958vfBufsPyhvT7*2Z52HWo{XA5EvOebIXu}z{ud0TZSA2ycyNxgxA#YHgs6$P<@BB#xPcO zcUbFCafh`At7`4AmK9ix5Pi8FD=uF{kdq7Y2y(W@C}j%|XX}hII$tMi=bH0$n$zIC zoUSwcoUb#uRylCa*BP954xICK2G=?V&iOjF<>ZMm$4emDMsz9SsichNOL5YSpWdZ0 z?pnsv<#u@`FJi80C&~FcUVes8&hGGi9_Kov{ngBr{r#=FfDyk)MFq`^(#WaCYpyx- zqBL@fN>lCKTYgzdvD%bH2=D1c)ecV>EPEF;NqEcj};0YWxED@cAHF(EMeOX;{RvI<) zru}8kTBDG8(;9hO|A)MJ(;9i({D-`G)3U~ePvG)&ku+=Qyi>e8<(=alE$^J+Cuftq zbB5o4=cqBWT_a8nl|4ctJ(@LY=)UhIs4tbqA zu`X8|bSrr%>YR4DnibnQYfKl8>v$s>SJCt4p%@8qFQhMnC#hqU703BS@~kagNLU)D z*UYml&J}$4IM?u@;#|Xrg>wxb0?svjLp#?PdF0l1t}*h+dCyobu$X zVH?Z%mV*3rHT$<1*cQt{W)w>vd*vYH+b##8kx?FbK?lo(ms(nOX+mK-HUmUg*k$x&itX~}z$ z)8@@t!#6a230r^9hHqx`YNt3q{8V4k@i5A)icHz0+8j6Zs(U!-&2d97=N9d2bTf0@ z(97dEN4+_2=v7B^D33XA=v9|;(3|6|G4=UM@oBHKtI>_UUJf!!C$ASZf4_+~ZVm#Y z2A&={NaPsKL1JX_$~{Yt5+h5i+_U5;F|v5)o+U?#>!x)$cyrP!N|8h3DoqZpt28+@ zuhJNKoVKshW&N4ta9a_}HS2yCrtZOihm+Y`6Nf^zq5*u8LM`J8L_O z4_tJHTF0+zWV;%Tqr;pe!G6wc5|m>K7Cl8tEVD zYsCw8;mhtm-iEB5qq<#KR7hYR6Div^Nop&4ie?^^l8=7%coU~^f*to)<4`D5fvR69ug5` z6xSQ)Vc8Vk;<6We;&8jza&$Wgcrr-go{=%35x!ADeg@oHt?&!828*p05ab&`d4pmT zlOWHC#LNUAZ~T6}kC*hx1_oQh{Q~{{LL+d~g$qF3x5^H-@a=N(Ep{{0Ho`Y3G%_TB zTHHG})2#6euttQ2MaKk2g;9aTMW~n!z7FiHB!RxxXy537m>4lca4ULuPY~r8lnUPh zKr+a;i>OJ8II|1I^YPA1Q1uTCwnqAe1Vlyq`w}dQEkV~w-w(R_7U3#?pOe}iK2rmHZaf{8WHK| z9}^ToY;000G@H@#u_>ao>2`63N!*x8!0-{LV!fgQ!h$3HqU1*N(HkZ(%o-CJ5F#c5 zKT1nIWkh095{%jrq7ep*?{bTh86`?gQF)`Rk-@$(eqk}u);LgjrDfqME+r6c91#-a z=NA5fUp>th@z~?v7*)Sa}pnK^baJ`}uX0qS^9vDEbyP@H zSVS;%E10VBEAe7%&;jNspH}#v?uz~)*3g*1kg&kWXqOBQNVv`%?^>qpL_wnif?~n~ z14FIB5z&6W5l;MQqzGDZUNMou;X%G(epdgO9xB>8BqlT_I3yy(8Y#-swU1iiA7Bj) z4)zU+hzz3c+&v_;Tem*lx(7zud?O;Fdj$sAx(0TO?$K2-enHl-(14ie;Lue& zN>*|#bXukK3Ji|&iw+G7w8r>{s;FnEUtnZFaHusjTE$vLhKoKN6Y6h`4DIHx!fm4? z{Kd2uYW0nZitg^)Jy5Oj6T9;OF-Q9Q`>}D@ExK!WF&IN50=fo9DYbu?H8MInCMqN- zP;d6`bkT&5_dt7`xDA7tBH@+~J}rE_V-*-Sx4X=<&g!F=9_dlAvx~qocd49Nv);zL7yuVuOgA)MSlR zad7|_77!zL20@WBcTA7a09%Z2_Yfr#`-`AJF}FrpN4C}DQ%nM)V@5{%i}7h3Q+DeU z)jcGzyXc2Id)n^30)53k#%2pm7RTj& Pa6gXhx4$rMeDVJP>so=; literal 0 HcmV?d00001 diff --git a/src/deps/hwloc/windows/include/hwloc/autogen/config.h b/src/deps/hwloc/windows/include/hwloc/autogen/config.h new file mode 100644 index 000000000..e1781eddc --- /dev/null +++ b/src/deps/hwloc/windows/include/hwloc/autogen/config.h @@ -0,0 +1,60 @@ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2026 Inria. All rights reserved. + * Copyright © 2009-2012 Université Bordeaux + * Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/* The configuration file */ + +#ifndef HWLOC_CONFIG_H +#define HWLOC_CONFIG_H + +#define HWLOC_VERSION "2.13.0rc2" +#define HWLOC_VERSION_MAJOR 2 +#define HWLOC_VERSION_MINOR 13 +#define HWLOC_VERSION_RELEASE 0 +#define HWLOC_VERSION_GREEK "rc2" + +#define __hwloc_restrict +#define __hwloc_inline __inline + +#define __hwloc_attribute_unused +#define __hwloc_attribute_malloc +#define __hwloc_attribute_const +#define __hwloc_attribute_pure +#define __hwloc_attribute_deprecated +#define __hwloc_attribute_may_alias +#define __hwloc_attribute_warn_unused_result + +/* Defined to 1 if you have the `windows.h' header. */ +#define HWLOC_HAVE_WINDOWS_H 1 +#define hwloc_pid_t HANDLE +#define hwloc_thread_t HANDLE + +#include +#include +typedef DWORDLONG hwloc_uint64_t; + +#if defined( _USRDLL ) /* dynamic linkage */ +#if defined( DECLSPEC_EXPORTS ) +#define HWLOC_DECLSPEC __declspec(dllexport) +#else +#define HWLOC_DECLSPEC __declspec(dllimport) +#endif +#else /* static linkage */ +#define HWLOC_DECLSPEC +#endif + +/* Whether we need to re-define all the hwloc public symbols or not */ +#define HWLOC_SYM_TRANSFORM 1 + +/* The hwloc symbol prefix */ +#define HWLOC_SYM_PREFIX umf_hwloc_ + +/* The hwloc symbol prefix in all caps */ +#define HWLOC_SYM_PREFIX_CAPS UMF_HWLOC_ + +#endif /* HWLOC_CONFIG_H */ From 47a19d623d224170eca30f4188e059cb32d13634 Mon Sep 17 00:00:00 2001 From: Rafal Rudnicki Date: Wed, 23 Sep 2026 12:55:16 +0000 Subject: [PATCH 2/6] Add CMake uption for using bundled hwloc --- CMakeLists.txt | 70 ++++++++++++++++++++++++++++++++++++++++++---- README.md | 1 + src/CMakeLists.txt | 15 ++++++++++ 3 files changed, 81 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4aa315d64..b5a7fe9cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,6 +80,13 @@ umf_option( UMF_LINK_HWLOC_STATICALLY "Link UMF with HWLOC library statically (proxy library will be disabled on Windows+Debug build)" OFF) +umf_option(UMF_USE_BUNDLED_HWLOC + "Use the prebuilt x86-64 static hwloc library in src/deps/hwloc" OFF) +if(UMF_USE_BUNDLED_HWLOC AND NOT UMF_LINK_HWLOC_STATICALLY) + message( + FATAL_ERROR + "UMF_USE_BUNDLED_HWLOC requires UMF_LINK_HWLOC_STATICALLY=ON") +endif() set(UMF_HWLOC_NAME "hwloc" CACHE STRING "Custom name for hwloc library w/o extension") @@ -295,7 +302,55 @@ if(NOT UMF_LINK_HWLOC_STATICALLY) endif() endif() -if(UMF_LINK_HWLOC_STATICALLY) +if(UMF_USE_BUNDLED_HWLOC) + if(NOT LINUX AND NOT WINDOWS) + message( + FATAL_ERROR "Bundled hwloc is only available on Linux and Windows") + endif() + set(UMF_BUNDLED_HWLOC_ARCH "${CMAKE_C_COMPILER_ARCHITECTURE_ID}") + if(NOT WINDOWS OR NOT UMF_BUNDLED_HWLOC_ARCH) + set(UMF_BUNDLED_HWLOC_ARCH "${CMAKE_SYSTEM_PROCESSOR}") + endif() + if(NOT UMF_BUNDLED_HWLOC_ARCH MATCHES "^(x86_64|AMD64|amd64|x64)$") + message( + FATAL_ERROR + "Bundled hwloc is available only for x86-64, but the target " + "architecture is '${UMF_BUNDLED_HWLOC_ARCH}' " + "Set UMF_USE_BUNDLED_HWLOC=OFF to build hwloc from sources.") + endif() + set(UMF_BUNDLED_HWLOC_DIR "${UMF_CMAKE_SOURCE_DIR}/src/deps/hwloc") + set(LIBHWLOC_LIBRARY_DIRS "${UMF_BUNDLED_HWLOC_DIR}/${OS_NAME}") + set(LIBHWLOC_INCLUDE_DIRS "${LIBHWLOC_LIBRARY_DIRS}/include" + "${UMF_BUNDLED_HWLOC_DIR}/include") + if(WINDOWS) + set(LIBHWLOC_LIBRARIES "${LIBHWLOC_LIBRARY_DIRS}/hwloc.lib") + else() + set(LIBHWLOC_LIBRARIES "${LIBHWLOC_LIBRARY_DIRS}/libhwloc.a") + endif() + + foreach( + HWLOC_REQUIRED_FILE IN + ITEMS "${LIBHWLOC_LIBRARIES}" + "${UMF_BUNDLED_HWLOC_DIR}/include/hwloc.h" + "${LIBHWLOC_LIBRARY_DIRS}/include/hwloc/autogen/config.h") + if(NOT EXISTS "${HWLOC_REQUIRED_FILE}") + message( + FATAL_ERROR + "Bundled hwloc file not found: ${HWLOC_REQUIRED_FILE}") + endif() + endforeach() + + message(STATUS "Using bundled hwloc from ${UMF_BUNDLED_HWLOC_DIR}") + + add_library(${UMF_HWLOC_NAME} INTERFACE) + target_link_libraries(${UMF_HWLOC_NAME} INTERFACE "${LIBHWLOC_LIBRARIES}") + target_include_directories(${UMF_HWLOC_NAME} + INTERFACE ${LIBHWLOC_INCLUDE_DIRS}) + set(LIBHWLOC_FOUND TRUE) +elseif(UMF_LINK_HWLOC_STATICALLY) + if(NOT DEFINED UMF_HWLOC_REPO) + set(UMF_HWLOC_REPO "https://github.com/open-mpi/hwloc.git") + endif() if(NOT DEFINED UMF_HWLOC_TAG) set(UMF_HWLOC_TAG hwloc-2.13.0) endif() @@ -398,6 +453,9 @@ if(UMF_LINK_HWLOC_STATICALLY) ) endif() + # All symbols defined in the hwloc library must have the 'umf_hwloc_' + # prefix, so that they do not conflict with other hwloc instances linked + # into the same application. ExternalProject_Add( hwloc_targ PREFIX ${hwloc_targ_PREFIX} @@ -412,9 +470,10 @@ if(UMF_LINK_HWLOC_STATICALLY) ${CMAKE_COMMAND} -E env "CC=${UMF_HWLOC_CC}" "CXX=${UMF_HWLOC_CXX}" /configure --prefix= --enable-static=yes --enable-shared=no - --disable-libxml2 --disable-pci --disable-levelzero - --disable-opencl --disable-cuda --disable-nvml --disable-libudev - --disable-rsmi CFLAGS=-fPIC CXXFLAGS=-fPIC + --with-hwloc-symbol-prefix=umf_hwloc_ --disable-libxml2 + --disable-pci --disable-levelzero --disable-opencl + --disable-cuda --disable-nvml --disable-libudev --disable-rsmi + "CFLAGS=-O2 -fPIC" "CXXFLAGS=-O2 -fPIC" BUILD_COMMAND make BUILD_IN_SOURCE TRUE INSTALL_COMMAND make install @@ -596,6 +655,7 @@ if(WINDOWS AND UMF_USE_DEBUG_POSTFIX) -DUMF_BUILD_EXAMPLES=OFF -DUMF_BUILD_GPU_EXAMPLES=OFF -DUMF_BUILD_FUZZTESTS=OFF -DUMF_LINK_HWLOC_STATICALLY=${UMF_LINK_HWLOC_STATICALLY} + -DUMF_USE_BUNDLED_HWLOC=${UMF_USE_BUNDLED_HWLOC} -DUMF_HWLOC_NAME=${UMF_HWLOC_NAME} -DUMF_HWLOC_SOURCE_DIR="${UMF_HWLOC_SOURCE_DIR}" -DUMF_HWLOC_REPO="${UMF_HWLOC_REPO}" @@ -1087,7 +1147,7 @@ install(TARGETS umf_headers EXPORT ${PROJECT_NAME}-targets) # Add the list of installed targets to the install. This includes the namespace # which all installed targets will be prefixed with, e.g. for the headers target -# users will depend on ${PROJECT_NAME}::headers. +# users will depend on ${PROJECT_NAME}::umf_headers. install( EXPORT ${PROJECT_NAME}-targets FILE ${PROJECT_NAME}-targets.cmake diff --git a/README.md b/README.md index ff277e3f0..ebfd99866 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,7 @@ List of options provided by CMake: | UMF_LINK_HWLOC_STATICALLY | Link UMF with HWLOC library statically (proxy library will be disabled on Windows+Debug build) | ON/OFF | OFF | | UMF_HWLOC_SOURCE_DIR | Path to local hwloc sources used instead of fetching them (with UMF_LINK_HWLOC_STATICALLY) | path | "" | | UMF_HWLOC_REPO | hwloc git repository URL or local mirror path (with UMF_LINK_HWLOC_STATICALLY) | URL/path | https://github.com/open-mpi/hwloc.git | +| UMF_USE_BUNDLED_HWLOC | Use prebuilt x86-64 hwloc from `src/deps/hwloc` (requires `UMF_LINK_HWLOC_STATICALLY=ON`) | ON/OFF | OFF | ## Architecture: memory pools and providers diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a35abd31b..f7963f601 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -137,6 +137,21 @@ if(UMF_BUILD_SHARED_LIBRARY) VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR}) else() + if(UMF_LINK_HWLOC_STATICALLY) + # Add the hwloc static library to the list of libraries to link against + get_filename_component(UMF_HWLOC_ARCHIVE_NAME "${LIBHWLOC_LIBRARIES}" + NAME) + set(UMF_LIBS + ${UMF_LIBS} + "$/${CMAKE_INSTALL_LIBDIR}/${UMF_HWLOC_ARCHIVE_NAME}>" + ) + # hwloc fetched on Windows installs its own archive + if(UMF_USE_BUNDLED_HWLOC OR NOT WINDOWS) + install(FILES "${LIBHWLOC_LIBRARIES}" + DESTINATION ${CMAKE_INSTALL_LIBDIR}) + endif() + endif() + add_umf_library( NAME umf TYPE STATIC From 42e78468fe65135e504dd9dd4abb23199956acba Mon Sep 17 00:00:00 2001 From: Rafal Rudnicki Date: Wed, 23 Sep 2026 13:03:58 +0000 Subject: [PATCH 3/6] Test bundled hwloc in CI --- .github/workflows/reusable_basic.yml | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable_basic.yml b/.github/workflows/reusable_basic.yml index a4108a9b3..e887238c4 100644 --- a/.github/workflows/reusable_basic.yml +++ b/.github/workflows/reusable_basic.yml @@ -33,6 +33,7 @@ jobs: cuda_provider: ['ON'] install_tbb: ['ON'] link_hwloc_statically: ['OFF'] + use_bundled_hwloc: ['OFF'] cmake_ver: ['default'] include: - os: ubuntu-22.04 @@ -135,7 +136,18 @@ jobs: link_hwloc_statically: 'ON' local_hwloc: 'mirror' cmake_ver: 'default' - name: Basic (${{matrix.os}}, build_type=${{matrix.build_type}}, compilers=${{matrix.compiler.c}}/${{matrix.compiler.cxx}}, shared_library=${{matrix.shared_library}}, level_zero_provider=${{matrix.level_zero_provider}}, cuda_provider=${{matrix.cuda_provider}}, install_tbb=${{matrix.install_tbb}}, link_hwloc_statically=${{matrix.link_hwloc_statically}}, cmake_ver=${{matrix.cmake_ver}}${{ matrix.local_hwloc && format(', local_hwloc={0}', matrix.local_hwloc) || '' }}) + # test static hwloc built from the bundled source (UMF_USE_BUNDLED_HWLOC) + - os: ubuntu-22.04 + build_type: Release + compiler: {c: gcc, cxx: g++} + shared_library: 'ON' + level_zero_provider: 'ON' + cuda_provider: 'ON' + install_tbb: 'ON' + link_hwloc_statically: 'ON' + use_bundled_hwloc: 'ON' + cmake_ver: 'default' + name: Basic (${{matrix.os}}, build_type=${{matrix.build_type}}, compilers=${{matrix.compiler.c}}/${{matrix.compiler.cxx}}, shared_library=${{matrix.shared_library}}, level_zero_provider=${{matrix.level_zero_provider}}, cuda_provider=${{matrix.cuda_provider}}, install_tbb=${{matrix.install_tbb}}, link_hwloc_statically=${{matrix.link_hwloc_statically}}, use_bundled_hwloc=${{matrix.use_bundled_hwloc || 'OFF'}}${{ matrix.local_hwloc && format(', local_hwloc={0}', matrix.local_hwloc) || '' }}, cmake_ver=${{matrix.cmake_ver}}) steps: - name: Checkout @@ -195,6 +207,7 @@ jobs: -DUMF_LINK_HWLOC_STATICALLY=${{matrix.link_hwloc_statically}} ${{ matrix.local_hwloc == 'source' && format('-DUMF_HWLOC_SOURCE_DIR={0}', env.HWLOC_SRC_DIR) || '' }} ${{ matrix.local_hwloc == 'mirror' && format('-DUMF_HWLOC_REPO={0}', env.HWLOC_MIRROR_DIR) || '' }} + -DUMF_USE_BUNDLED_HWLOC=${{matrix.use_bundled_hwloc || 'OFF'}} ${{ matrix.build_type == 'Debug' && matrix.compiler.c == 'gcc' && '-DUMF_USE_COVERAGE=ON' || '' }} ${{ matrix.llvm_linker || '' }} @@ -493,10 +506,11 @@ jobs: key: ${{ steps.cache.outputs.cache-primary-key }} windows-dynamic_build_hwloc: - name: "Windows dynamic UMF + static hwloc" + name: "Windows dynamic UMF + static hwloc (bundled=${{matrix.use_bundled_hwloc}})" strategy: matrix: build_type: [Release] + use_bundled_hwloc: ['OFF', 'ON'] runs-on: 'windows-latest' @@ -520,6 +534,7 @@ jobs: -DUMF_BUILD_CUDA_PROVIDER=ON -DUMF_TESTS_FAIL_ON_SKIP=ON -DUMF_LINK_HWLOC_STATICALLY=ON + -DUMF_USE_BUNDLED_HWLOC=${{matrix.use_bundled_hwloc}} - name: Build UMF run: cmake --build ${{env.BUILD_DIR}} --config ${{matrix.build_type}} -j $Env:NUMBER_OF_PROCESSORS From 63ef903a03061f95e8e69edbc687e3adde9e3cf1 Mon Sep 17 00:00:00 2001 From: Rafal Rudnicki Date: Wed, 23 Sep 2026 13:15:28 +0000 Subject: [PATCH 4/6] Exclude src/deps from code checks --- .github/scripts/run-codespell.py | 2 +- .github/workflows/.spellcheck-conf.toml | 2 +- CMakeLists.txt | 7 +++++++ scripts/check_license/file-exceptions.sh | 1 + 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/scripts/run-codespell.py b/.github/scripts/run-codespell.py index 14faf1e79..7fc4f5f3b 100644 --- a/.github/scripts/run-codespell.py +++ b/.github/scripts/run-codespell.py @@ -21,7 +21,7 @@ def codespell_scan(): "codespell", "-H", "--quiet-level=3", - "--skip=./.git,./.venv,./.github/workflows/.spellcheck-conf.toml", + "--skip=./.git,./.venv,./.github/workflows/.spellcheck-conf.toml,./src/deps", ], text=True, stdout=subprocess.PIPE, diff --git a/.github/workflows/.spellcheck-conf.toml b/.github/workflows/.spellcheck-conf.toml index bb0f480d6..bb35b3163 100644 --- a/.github/workflows/.spellcheck-conf.toml +++ b/.github/workflows/.spellcheck-conf.toml @@ -4,4 +4,4 @@ extend-ignore-words-re = ["ASSER", "Tne", "ba", "BA", "PN", "usm"] [files] # completely exclude those files from consideration: -extend-exclude = ["test/supp/*.supp"] +extend-exclude = ["test/supp/*.supp", "src/deps/**"] diff --git a/CMakeLists.txt b/CMakeLists.txt index b5a7fe9cf..1d3ef224f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -981,6 +981,13 @@ if(UMF_FORMAT_CODE_STYLE) "${DIR}/**/*.cpp") endforeach() file(GLOB_RECURSE format_list ${format_clang_glob}) + # exclude files in the src/deps/ directory from formatting checks + list( + FILTER + format_list + EXCLUDE + REGEX + "/src/deps/") message( STATUS diff --git a/scripts/check_license/file-exceptions.sh b/scripts/check_license/file-exceptions.sh index d3580f33d..d085b300b 100755 --- a/scripts/check_license/file-exceptions.sh +++ b/scripts/check_license/file-exceptions.sh @@ -17,6 +17,7 @@ grep -v -E -e 'benchmark/ubench.h' \ -e 'licensing/third-party-programs.txt' \ -e 'scripts/assets/images/.*' \ -e 'scripts/qemu/requirements.txt' \ + -e '^src/deps/' \ -e 'src/uthash/.*' \ -e 'src/uthash/utlist.h' \ -e 'src/uthash/uthash.h' \ From 273ab1b020d1ebb389493a594c5dad48456edcce Mon Sep 17 00:00:00 2001 From: Rafal Rudnicki Date: Thu, 24 Sep 2026 14:54:40 +0000 Subject: [PATCH 5/6] Add test for UMF w static HWLOC --- .github/workflows/reusable_basic.yml | 103 +++++++++++++++++++++++++++ test/install_test/CMakeLists.txt | 42 +++++++++++ test/install_test/main.c | 93 ++++++++++++++++++++++++ test/test_installation.py | 52 +++++++++++++- 4 files changed, 288 insertions(+), 2 deletions(-) create mode 100644 test/install_test/CMakeLists.txt create mode 100644 test/install_test/main.c diff --git a/.github/workflows/reusable_basic.yml b/.github/workflows/reusable_basic.yml index e887238c4..27bc1f905 100644 --- a/.github/workflows/reusable_basic.yml +++ b/.github/workflows/reusable_basic.yml @@ -251,6 +251,53 @@ jobs: --umf-version ${{env.UMF_VERSION}} ${{ matrix.shared_library == 'ON' && '--shared-library' || '' }} + ubuntu-static_hwloc_installed_umf: + name: "Ubuntu static UMF + static hwloc, installed UMF (bundled=${{matrix.use_bundled_hwloc}})" + runs-on: ubuntu-latest + strategy: + matrix: + build_type: [Release] + use_bundled_hwloc: ['OFF', 'ON'] + + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y libhwloc-dev ${{ matrix.use_bundled_hwloc == 'OFF' && 'autoconf automake libtool' || '' }} + + - name: Configure build + run: > + cmake + -B ${{env.BUILD_DIR}} + -DCMAKE_INSTALL_PREFIX="${{env.INSTL_DIR}}" + -DCMAKE_BUILD_TYPE=${{matrix.build_type}} + -DUMF_BUILD_SHARED_LIBRARY=OFF + -DUMF_BUILD_TESTS=OFF + -DUMF_BUILD_EXAMPLES=OFF + -DUMF_FORMAT_CODE_STYLE=OFF + -DUMF_DEVELOPER_MODE=ON + -DUMF_BUILD_LIBUMF_POOL_JEMALLOC=OFF + -DUMF_BUILD_LEVEL_ZERO_PROVIDER=OFF + -DUMF_BUILD_CUDA_PROVIDER=OFF + -DUMF_LINK_HWLOC_STATICALLY=ON + -DUMF_USE_BUNDLED_HWLOC=${{matrix.use_bundled_hwloc}} + + - name: Build and install UMF + run: | + cmake --build ${{env.BUILD_DIR}} -j $(nproc) + cmake --install ${{env.BUILD_DIR}} + + - name: Build and run consumer of installed UMF + run: | + cmake -S ${{github.workspace}}/test/install_test -B ${{github.workspace}}/install_test-build -DCMAKE_BUILD_TYPE=${{matrix.build_type}} -DCMAKE_PREFIX_PATH="${{env.INSTL_DIR}}" -DUMF_TEST_LINK_USER_HWLOC=ON + cmake --build ${{github.workspace}}/install_test-build -j $(nproc) + ctest --test-dir ${{github.workspace}}/install_test-build --output-on-failure + windows-build: env: BUILD_DEBUG_DIR : "${{github.workspace}}/debug/build" @@ -591,6 +638,62 @@ jobs: working-directory: ${{env.BUILD_DIR}} run: ctest -C ${{matrix.build_type}} --output-on-failure --test-dir test + windows-static_hwloc_installed_umf: + name: "Windows static UMF + static hwloc, installed UMF (bundled=${{matrix.use_bundled_hwloc}})" + strategy: + matrix: + build_type: [Release] + use_bundled_hwloc: ['OFF', 'ON'] + + runs-on: 'windows-latest' + + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 + + - name: Configure build + run: > + cmake + -B ${{env.BUILD_DIR}} + -DCMAKE_INSTALL_PREFIX="${{env.INSTL_DIR}}" + -DUMF_BUILD_SHARED_LIBRARY=OFF + -DUMF_BUILD_TESTS=OFF + -DUMF_BUILD_EXAMPLES=OFF + -DUMF_FORMAT_CODE_STYLE=OFF + -DUMF_DEVELOPER_MODE=ON + -DUMF_BUILD_LIBUMF_POOL_JEMALLOC=OFF + -DUMF_BUILD_LEVEL_ZERO_PROVIDER=OFF + -DUMF_BUILD_CUDA_PROVIDER=OFF + -DUMF_LINK_HWLOC_STATICALLY=ON + -DUMF_USE_BUNDLED_HWLOC=${{matrix.use_bundled_hwloc}} + + - name: Build and install UMF + run: | + cmake --build ${{env.BUILD_DIR}} --config ${{matrix.build_type}} -j $Env:NUMBER_OF_PROCESSORS + cmake --install ${{env.BUILD_DIR}} --config ${{matrix.build_type}} + + # The bundled hwloc uses the umf_hwloc_ symbol prefix, so a consumer may + # link its own hwloc alongside the installed static UMF. + - name: Install user hwloc + if: matrix.use_bundled_hwloc == 'ON' + run: | + vcpkg install hwloc:x64-windows + echo "$env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" >> $env:GITHUB_PATH + + - name: Build and run test of installed UMF + run: | + $extraArgs = @() + $prefixPath = "${{env.INSTL_DIR}}" + if ('${{matrix.use_bundled_hwloc}}' -eq 'ON') { + $prefixPath += ";$env:VCPKG_INSTALLATION_ROOT\installed\x64-windows" + $extraArgs += '-DUMF_TEST_LINK_USER_HWLOC=ON' + } + cmake -S ${{github.workspace}}/test/install_test -B ${{github.workspace}}/install_test-build -DCMAKE_PREFIX_PATH="$prefixPath" @extraArgs + cmake --build ${{github.workspace}}/install_test-build --config ${{matrix.build_type}} + ctest --test-dir ${{github.workspace}}/install_test-build -C ${{matrix.build_type}} --output-on-failure + macos-build: strategy: matrix: diff --git a/test/install_test/CMakeLists.txt b/test/install_test/CMakeLists.txt new file mode 100644 index 000000000..8eb3d76d3 --- /dev/null +++ b/test/install_test/CMakeLists.txt @@ -0,0 +1,42 @@ +# Copyright (C) 2026 Intel Corporation +# Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Standalone project linking only against an installed UMF via find_package. +cmake_minimum_required(VERSION 3.14.0 FATAL_ERROR) +project(umf_install_consumer LANGUAGES C) +enable_testing() + +find_package(umf REQUIRED CONFIG) + +add_executable(umf_install_consumer main.c) +target_link_libraries(umf_install_consumer PRIVATE umf::umf umf::umf_headers) + +option(UMF_TEST_LINK_USER_HWLOC + "Also link the system hwloc, as a user application might" OFF) +if(UMF_TEST_LINK_USER_HWLOC) + # Prefer pkg-config (Linux); fall back to plain find_* (e.g. Windows with + # CMAKE_PREFIX_PATH pointing at a vcpkg-installed hwloc). + find_package(PkgConfig QUIET) + if(PkgConfig_FOUND) + pkg_check_modules(USER_HWLOC IMPORTED_TARGET hwloc) + endif() + if(USER_HWLOC_FOUND) + target_link_libraries(umf_install_consumer + PRIVATE PkgConfig::USER_HWLOC) + else() + find_path(USER_HWLOC_INCLUDE_DIR hwloc.h) + find_library(USER_HWLOC_LIBRARY hwloc) + if(NOT USER_HWLOC_INCLUDE_DIR OR NOT USER_HWLOC_LIBRARY) + message(FATAL_ERROR "User hwloc not found") + endif() + target_include_directories(umf_install_consumer + PRIVATE ${USER_HWLOC_INCLUDE_DIR}) + target_link_libraries(umf_install_consumer + PRIVATE ${USER_HWLOC_LIBRARY}) + endif() + target_compile_definitions(umf_install_consumer + PRIVATE UMF_TEST_LINK_USER_HWLOC=1) +endif() + +add_test(NAME umf_install_consumer COMMAND umf_install_consumer) diff --git a/test/install_test/main.c b/test/install_test/main.c new file mode 100644 index 000000000..c2f9baec4 --- /dev/null +++ b/test/install_test/main.c @@ -0,0 +1,93 @@ +/* + * + * Copyright (C) 2026 Intel Corporation + * + * Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + */ + +#include + +#ifdef UMF_TEST_LINK_USER_HWLOC +#include +#endif + +#include +#include +#include + +#ifdef UMF_TEST_LINK_USER_HWLOC +// The user's hwloc must keep working next to the copy embedded in UMF. +static int use_user_hwloc(void) { + hwloc_topology_t topology; + + if (hwloc_get_api_version() != HWLOC_API_VERSION) { + fprintf(stderr, + "hwloc API version mismatch: runtime 0x%x, header 0x%x\n", + hwloc_get_api_version(), HWLOC_API_VERSION); + return 1; + } + + if (hwloc_topology_init(&topology) != 0) { + fprintf(stderr, "hwloc_topology_init failed\n"); + return 1; + } + + int ret = hwloc_topology_load(topology); + hwloc_topology_destroy(topology); + if (ret != 0) { + fprintf(stderr, "hwloc_topology_load failed\n"); + return 1; + } + + return 0; +} +#endif + +// The OS memory provider pulls hwloc symbols into the link of a static UMF. +int main(void) { + umf_os_memory_provider_params_handle_t params = NULL; + umf_memory_provider_handle_t provider = NULL; + void *ptr = NULL; + const size_t size = 4096; + int ret = 1; + +#ifdef UMF_TEST_LINK_USER_HWLOC + if (use_user_hwloc() != 0) { + return 1; + } +#endif + + if (umfOsMemoryProviderParamsCreate(¶ms) != UMF_RESULT_SUCCESS) { + fprintf(stderr, "umfOsMemoryProviderParamsCreate failed\n"); + return 1; + } + + if (umfMemoryProviderCreate(umfOsMemoryProviderOps(), params, &provider) != + UMF_RESULT_SUCCESS) { + fprintf(stderr, "umfMemoryProviderCreate failed\n"); + goto err_params; + } + + if (umfMemoryProviderAlloc(provider, size, 0, &ptr) != UMF_RESULT_SUCCESS || + ptr == NULL) { + fprintf(stderr, "umfMemoryProviderAlloc failed\n"); + goto err_provider; + } + + ((char *)ptr)[0] = 1; + + if (umfMemoryProviderFree(provider, ptr, size) != UMF_RESULT_SUCCESS) { + fprintf(stderr, "umfMemoryProviderFree failed\n"); + goto err_provider; + } + + ret = 0; + +err_provider: + umfMemoryProviderDestroy(provider); +err_params: + umfOsMemoryProviderParamsDestroy(params); + return ret; +} diff --git a/test/test_installation.py b/test/test_installation.py index cba8a4fb3..c06e5e68d 100644 --- a/test/test_installation.py +++ b/test/test_installation.py @@ -1,4 +1,4 @@ -# Copyright (C) 2024-2025 Intel Corporation +# Copyright (C) 2024-2026 Intel Corporation # # Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception @@ -107,7 +107,7 @@ def _create_match_list(self) -> List[str]: for pool in self.pools: lib.append(f"lib/{lib_prefix}{pool}.{lib_ext_static}") - if platform.system() == "Windows" and self.hwloc: + if self.hwloc and (platform.system() == "Windows" or not self.shared_library): lib.append(f"lib/{lib_prefix}hwloc.{lib_ext_static}") if self.shared_library: lib.append(f"lib/{lib_prefix}umf.{lib_ext_shared}") @@ -240,6 +240,53 @@ def validate_installed_files(self) -> None: print(line) sys.exit("Installation test - FAILED") + def validate_hwloc_symbols(self) -> None: + """ + Verifies that installed UMF libraries do not export unprefixed hwloc + symbols, which would clash with an hwloc linked by the application + """ + + if platform.system() != "Linux": + print(f"hwloc symbols check - SKIPPED on {platform.system()}", flush=True) + return + + lib_dir = Path(self.install_dir, "lib") + libs = [ + (lib, ["nm", "-g", "--defined-only"]) for lib in sorted(lib_dir.glob("*.a")) + ] + libs += [ + (lib, ["nm", "-D", "--defined-only"]) + for lib in sorted(lib_dir.glob("*.so*")) + if not lib.is_symlink() + ] + + failed = False + for lib, nm_cmd in libs: + cmd = nm_cmd + [str(lib)] + try: + result = subprocess.run( + cmd, capture_output=True, text=True, check=True + ) # nosec B603 + except (OSError, subprocess.CalledProcessError) as e: + sys.exit(f"Error: command '{' '.join(cmd)}' failed: {e}") + + symbols = [ + fields[2] + for fields in map(str.split, result.stdout.splitlines()) + if len(fields) == 3 + ] + + unprefixed = sorted({s for s in symbols if s.startswith("hwloc_")}) + if unprefixed: + failed = True + print(f"{lib.name} exports unprefixed hwloc symbols:", flush=True) + for symbol in unprefixed: + print(f" {symbol}") + + if failed: + sys.exit("hwloc symbols check - FAILED") + print("hwloc symbols check - PASSED", flush=True) + def uninstall_umf(self) -> None: """ Run the UMF uninstallation CMake target. @@ -359,6 +406,7 @@ def run(self) -> None: umf_installer.install_umf() umf_installer.validate_installed_files() + umf_installer.validate_hwloc_symbols() print("Installation test - PASSED", flush=True) From e03ee0c781e2df31546d287ade187300fc965e8e Mon Sep 17 00:00:00 2001 From: Rafal Rudnicki Date: Tue, 29 Sep 2026 19:36:56 +0200 Subject: [PATCH 6/6] x --- .github/workflows/reusable_basic.yml | 2 +- src/CMakeLists.txt | 22 ++- src/deps/hwloc/windows/build_hwloc.ps1 | 155 ++++++++++++++++++ src/deps/hwloc/windows/hwloc.lib | Bin 1024120 -> 1021706 bytes .../windows/include/hwloc/autogen/config.h | 120 +++++++------- test/test_installation.py | 4 +- 6 files changed, 233 insertions(+), 70 deletions(-) create mode 100644 src/deps/hwloc/windows/build_hwloc.ps1 diff --git a/.github/workflows/reusable_basic.yml b/.github/workflows/reusable_basic.yml index 27bc1f905..80a88db57 100644 --- a/.github/workflows/reusable_basic.yml +++ b/.github/workflows/reusable_basic.yml @@ -679,7 +679,7 @@ jobs: - name: Install user hwloc if: matrix.use_bundled_hwloc == 'ON' run: | - vcpkg install hwloc:x64-windows + vcpkg install --classic hwloc:x64-windows echo "$env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" >> $env:GITHUB_PATH - name: Build and run test of installed UMF diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f7963f601..557bcdcd4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -138,18 +138,24 @@ if(UMF_BUILD_SHARED_LIBRARY) SOVERSION ${PROJECT_VERSION_MAJOR}) else() if(UMF_LINK_HWLOC_STATICALLY) - # Add the hwloc static library to the list of libraries to link against - get_filename_component(UMF_HWLOC_ARCHIVE_NAME "${LIBHWLOC_LIBRARIES}" - NAME) + # hwloc fetched on Windows installs its own archive + if(UMF_USE_BUNDLED_HWLOC OR NOT WINDOWS) + # A UMF-specific name, so find_library(hwloc) never picks this copy + set(UMF_HWLOC_ARCHIVE_NAME + "${CMAKE_STATIC_LIBRARY_PREFIX}umf_hwloc${CMAKE_STATIC_LIBRARY_SUFFIX}" + ) + install( + FILES "${LIBHWLOC_LIBRARIES}" + DESTINATION ${CMAKE_INSTALL_LIBDIR} + RENAME ${UMF_HWLOC_ARCHIVE_NAME}) + else() + get_filename_component(UMF_HWLOC_ARCHIVE_NAME + "${LIBHWLOC_LIBRARIES}" NAME) + endif() set(UMF_LIBS ${UMF_LIBS} "$/${CMAKE_INSTALL_LIBDIR}/${UMF_HWLOC_ARCHIVE_NAME}>" ) - # hwloc fetched on Windows installs its own archive - if(UMF_USE_BUNDLED_HWLOC OR NOT WINDOWS) - install(FILES "${LIBHWLOC_LIBRARIES}" - DESTINATION ${CMAKE_INSTALL_LIBDIR}) - endif() endif() add_umf_library( diff --git a/src/deps/hwloc/windows/build_hwloc.ps1 b/src/deps/hwloc/windows/build_hwloc.ps1 new file mode 100644 index 000000000..e4886632b --- /dev/null +++ b/src/deps/hwloc/windows/build_hwloc.ps1 @@ -0,0 +1,155 @@ +# Copyright (C) 2026 Intel Corporation +# Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +# Builds the static hwloc library bundled with UMF for Windows x64 and copies +# it, together with its headers, into src/deps/hwloc. +# Requires git, CMake and Visual Studio with the x64 C/C++ build tools. + +$ErrorActionPreference = 'Stop' +Set-StrictMode -Version Latest + +$HwlocRepo = if ($env:HWLOC_REPO) { $env:HWLOC_REPO } else { 'https://github.com/open-mpi/hwloc.git' } +$HwlocTag = if ($env:HWLOC_TAG) { $env:HWLOC_TAG } else { 'hwloc-2.13.0' } + +$ScriptDir = $PSScriptRoot +$DepsDir = Split-Path $ScriptDir -Parent +$UmfRoot = (Resolve-Path (Join-Path $ScriptDir '..\..\..\..')).Path +$TempDir = Join-Path $ScriptDir 'temp' +$SrcDir = Join-Path $TempDir 'src' +$BuildDir = Join-Path $TempDir 'build' + +function Invoke-Native { + param([string]$Exe, [string[]]$Arguments) + & $Exe @Arguments + if ($LASTEXITCODE -ne 0) { + throw "'$Exe $Arguments' failed with exit code $LASTEXITCODE" + } +} + +# The windows-cmake build has no symbol prefix option, so patch the config +# templates the same way configure's --with-hwloc-symbol-prefix would. +function Set-HwlocSymbolPrefix { + param([string]$Path) + $content = [IO.File]::ReadAllText($Path) + $replacements = [ordered]@{ + '(?m)^(#define HWLOC_SYM_TRANSFORM) 0(?=\r?$)' = '$1 1' + '(?m)^(#define HWLOC_SYM_PREFIX) hwloc_(?=\r?$)' = '$1 umf_hwloc_' + '(?m)^(#define HWLOC_SYM_PREFIX_CAPS) HWLOC_(?=\r?$)' = '$1 UMF_HWLOC_' + } + foreach ($pattern in $replacements.Keys) { + if ($content -notmatch $pattern) { + throw "Pattern '$pattern' not found in $Path" + } + $content = $content -replace $pattern, $replacements[$pattern] + } + [IO.File]::WriteAllText($Path, $content) +} + +function Find-Dumpbin { + $cmd = Get-Command dumpbin.exe -ErrorAction SilentlyContinue + if ($cmd) { + return $cmd.Source + } + $vswhere = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio\Installer\vswhere.exe' + if (Test-Path $vswhere) { + $found = & $vswhere -latest -products * -find 'VC\Tools\MSVC\**\bin\Hostx64\x64\dumpbin.exe' | + Select-Object -First 1 + if ($found) { + return $found + } + } + throw 'dumpbin.exe not found - install the Visual Studio C++ build tools' +} + +function Get-NormalizedText { + param([string]$Path) + return [IO.File]::ReadAllText($Path) -replace "`r`n", "`n" +} + +if (Test-Path $TempDir) { + Remove-Item -Recurse -Force $TempDir +} + +try { + Invoke-Native git @('clone', '-c', 'core.autocrlf=false', '-c', 'advice.detachedHead=false', + '--depth', '1', '--branch', $HwlocTag, $HwlocRepo, $SrcDir) + # The UMF checkout may have CRLF line endings, the hwloc clone has LF. + $patch = Join-Path $TempDir 'fix_coverity_issues.patch' + [IO.File]::WriteAllText($patch, + (Get-NormalizedText (Join-Path $UmfRoot 'cmake\fix_coverity_issues.patch'))) + Invoke-Native git @('-C', $SrcDir, 'apply', $patch) + + Set-HwlocSymbolPrefix (Join-Path $SrcDir 'contrib\windows\hwloc_config.h') + Set-HwlocSymbolPrefix (Join-Path $SrcDir 'contrib\windows-cmake\private_config.h.in') + + # /Zl omits the CRT name, so the archive links into both /MD and /MDd builds + # of UMF; /Brepro makes the output reproducible. RtlGetVersionProc is a + # global missing from hwloc's rename.h, so it is prefixed here. + Invoke-Native cmake @('-S', (Join-Path $SrcDir 'contrib\windows-cmake'), '-B', $BuildDir, + '-A', 'x64', + '-DBUILD_SHARED_LIBS=OFF', + '-DHWLOC_ENABLE_TESTING=OFF', + '-DHWLOC_SKIP_LSTOPO=ON', + '-DHWLOC_SKIP_TOOLS=ON', + '-DHWLOC_SKIP_INCLUDES=ON', + '-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreadedDLL', + '-DCMAKE_C_FLAGS_RELEASE=/O2 /Ob2 /DNDEBUG /Zl /Brepro /DRtlGetVersionProc=umf_hwloc_RtlGetVersionProc', + '-DCMAKE_STATIC_LINKER_FLAGS=/Brepro') + Invoke-Native cmake @('--build', $BuildDir, '--config', 'Release', '--parallel') + + $lib = Join-Path $BuildDir 'Release\hwloc.lib' + $dumpbin = Find-Dumpbin + $dump = & $dumpbin /nologo /linkermember:1 $lib + if ($LASTEXITCODE -ne 0) { + throw "Failed to list symbols of $lib" + } + # Only the block after the "N public symbols" line lists symbol names. + $symbols = @() + $inSymbols = $false + foreach ($line in $dump) { + if ($line -match '^\s*[0-9A-F]+ public symbols\s*$') { + $inSymbols = $true + } + elseif ($inSymbols -and $line -match '^\s*$') { + if ($symbols.Count -gt 0) { break } + } + elseif ($inSymbols -and $line -match '^\s+[0-9A-F]+\s+(\S+)\s*$') { + $symbols += $Matches[1] + } + } + if ($symbols.Count -eq 0) { + throw "No public symbols found in $lib" + } + # COMDAT constants, string literals and CRT header inlines cannot conflict. + $allowedPrefixes = '^(__real@|__xmm@|__ymm@|\?\?_C@|\?_OptionsStorage@)' + $allowedNames = @( + '__isa_available_default', '__local_stdio_printf_options', + '__local_stdio_scanf_options', '_snprintf', '_vfprintf_l', '_vsnprintf', + '_vsnprintf_l', '_vsprintf_l', '_vsscanf_l', 'fabsf', 'fprintf', 'fstat', + 'sprintf', 'sscanf', 'stat', 'vsnprintf') + $unprefixed = @($symbols | Sort-Object -Unique | Where-Object { + $_ -notmatch '^umf_hwloc_' -and $_ -notmatch $allowedPrefixes -and + $_ -notin $allowedNames + }) + if ($unprefixed.Count -gt 0) { + throw "hwloc defines symbols without the umf_hwloc_ prefix:`n$($unprefixed -join "`n")" + } + + Copy-Item $lib $ScriptDir -Force + $autogenDir = Join-Path $ScriptDir 'include\hwloc\autogen' + New-Item -ItemType Directory -Force $autogenDir | Out-Null + Copy-Item (Join-Path $BuildDir 'include\hwloc\autogen\config.h') $autogenDir -Force + + $commonInclude = Join-Path $DepsDir 'include' + New-Item -ItemType Directory -Force (Join-Path $commonInclude 'hwloc') | Out-Null + Copy-Item (Join-Path $SrcDir 'include\hwloc.h') $commonInclude -Force + Copy-Item (Join-Path $SrcDir 'include\hwloc\*.h') (Join-Path $commonInclude 'hwloc') -Force +} +finally { + if (Test-Path $TempDir) { + Remove-Item -Recurse -Force $TempDir + } +} + +Write-Host "Bundled hwloc ($HwlocTag) updated in $DepsDir" diff --git a/src/deps/hwloc/windows/hwloc.lib b/src/deps/hwloc/windows/hwloc.lib index 1310b95cc917b74b1d25c8e7a410b3b28fee4b22..0ae1b425f6a7faad4332a9f6ee134fabf802dad1 100644 GIT binary patch delta 140786 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%0DaL1W~?Fpv<{MjMqtl9KD0Iy{+JEvb} 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 z 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 delta 143285 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 -#include -typedef DWORDLONG hwloc_uint64_t; - -#if defined( _USRDLL ) /* dynamic linkage */ -#if defined( DECLSPEC_EXPORTS ) -#define HWLOC_DECLSPEC __declspec(dllexport) -#else -#define HWLOC_DECLSPEC __declspec(dllimport) -#endif -#else /* static linkage */ -#define HWLOC_DECLSPEC -#endif - -/* Whether we need to re-define all the hwloc public symbols or not */ -#define HWLOC_SYM_TRANSFORM 1 - -/* The hwloc symbol prefix */ -#define HWLOC_SYM_PREFIX umf_hwloc_ - -/* The hwloc symbol prefix in all caps */ -#define HWLOC_SYM_PREFIX_CAPS UMF_HWLOC_ - -#endif /* HWLOC_CONFIG_H */ +/* + * SPDX-License-Identifier: BSD-3-Clause + * Copyright © 2009 CNRS + * Copyright © 2009-2026 Inria. All rights reserved. + * Copyright © 2009-2012 Université Bordeaux + * Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved. + * See COPYING in top-level directory. + */ + +/* The configuration file */ + +#ifndef HWLOC_CONFIG_H +#define HWLOC_CONFIG_H + +#define HWLOC_VERSION "2.13.0rc2" +#define HWLOC_VERSION_MAJOR 2 +#define HWLOC_VERSION_MINOR 13 +#define HWLOC_VERSION_RELEASE 0 +#define HWLOC_VERSION_GREEK "rc2" + +#define __hwloc_restrict +#define __hwloc_inline __inline + +#define __hwloc_attribute_unused +#define __hwloc_attribute_malloc +#define __hwloc_attribute_const +#define __hwloc_attribute_pure +#define __hwloc_attribute_deprecated +#define __hwloc_attribute_may_alias +#define __hwloc_attribute_warn_unused_result + +/* Defined to 1 if you have the `windows.h' header. */ +#define HWLOC_HAVE_WINDOWS_H 1 +#define hwloc_pid_t HANDLE +#define hwloc_thread_t HANDLE + +#include +#include +typedef DWORDLONG hwloc_uint64_t; + +#if defined( _USRDLL ) /* dynamic linkage */ +#if defined( DECLSPEC_EXPORTS ) +#define HWLOC_DECLSPEC __declspec(dllexport) +#else +#define HWLOC_DECLSPEC __declspec(dllimport) +#endif +#else /* static linkage */ +#define HWLOC_DECLSPEC +#endif + +/* Whether we need to re-define all the hwloc public symbols or not */ +#define HWLOC_SYM_TRANSFORM 1 + +/* The hwloc symbol prefix */ +#define HWLOC_SYM_PREFIX umf_hwloc_ + +/* The hwloc symbol prefix in all caps */ +#define HWLOC_SYM_PREFIX_CAPS UMF_HWLOC_ + +#endif /* HWLOC_CONFIG_H */ diff --git a/test/test_installation.py b/test/test_installation.py index c06e5e68d..33d2c96fc 100644 --- a/test/test_installation.py +++ b/test/test_installation.py @@ -107,8 +107,10 @@ def _create_match_list(self) -> List[str]: for pool in self.pools: lib.append(f"lib/{lib_prefix}{pool}.{lib_ext_static}") - if self.hwloc and (platform.system() == "Windows" or not self.shared_library): + if self.hwloc and platform.system() == "Windows": lib.append(f"lib/{lib_prefix}hwloc.{lib_ext_static}") + elif self.hwloc and not self.shared_library: + lib.append(f"lib/{lib_prefix}umf_hwloc.{lib_ext_static}") if self.shared_library: lib.append(f"lib/{lib_prefix}umf.{lib_ext_shared}") if platform.system() == "Windows" and self.umfd_lib: