[mpich2-commits] r6632 - in mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc: . config contrib/dist doc doc/images include include/hwloc include/private src tests tests/embedded tests/linux tests/ports tests/ports/include tests/ports/include/sys tests/xml utils
balaji at mcs.anl.gov
balaji at mcs.anl.gov
Mon May 10 20:47:13 CDT 2010
Author: balaji
Date: 2010-05-10 20:47:13 -0500 (Mon, 10 May 2010)
New Revision: 6632
Added:
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_check_attributes.m4
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_check_visibility.m4
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_internal.m4
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_pkg.m4
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/rename.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/cpuid.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/misc.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/misc.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-freebsd.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-x86.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/Makefile.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/README.txt
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/autogen.sh
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/configure.ac
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/do_test.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/main.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/run-embedded-tests.sh
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_below_array_by_type.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_insert_misc.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz.options
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz.options
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz.options
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/1alpha.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/1alpha.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2s390-2c.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2s390-2c.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/48amd64-4d2n6c.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/48amd64-4d2n6c.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/pthread_np.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/cpuset.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16amd64-8n2c-cpusets.xml
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16em64t-4s2c2t-offlines.xml
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16em64t-4s2c2t.xml
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/8em64t-2mi2ma2c.xml
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/Makefile.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/test-topology.sh.in
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.1in
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc.7in
Removed:
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/Makefile.man-page-rules
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/pkg.m4
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/hwloc.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/cpuset.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ibverbs.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/lstopo_xml.sh.in
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.1in
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.h
Modified:
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/HACKING
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/Makefile.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/NEWS
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/README
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/VERSION
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/distscript.csh
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc.m4
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/configure.ac
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/contrib/dist/make_dist_tarball
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/Makefile.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/doxygen.cfg
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/hwloc-hello.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/hwloc.doxy
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/diagram.fig
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/dudley.png
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/emmett.png
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/hagrid.png
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/Makefile.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/config.h.in
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/cpuset.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/glibc-sched.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/helper.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/linux-libnuma.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/linux.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/openfabrics-verbs.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/debug.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/private.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/Makefile.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/bind.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/cpuset.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/hwloc.dtd
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-aix.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-darwin.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-hpux.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-linux.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-osf.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-solaris.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-synthetic.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-windows.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-xml.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/traversal.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/Makefile.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/glibc-sched.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_bind.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_first_last_weight.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_singlify.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_string.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_cache_covering_cpuset.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_closest_objs.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_largest_objs_inside_cpuset.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_next_obj_covering_cpuset.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_covering_cpuset.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_inside_cpuset.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_shared_cache_covering_obj.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_is_thissystem.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_object_userdata.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_synthetic.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_type_depth.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux-libnuma.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets_noadmin.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-2m4c2t.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-2m4c2t.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.xml.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t_merge.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t_ncaches.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16ia64-8n2s.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/256ia64-64n2s2c.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2amd64-2n.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2amd64-2n.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2ps3-2t.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2ps3-2t.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ia64-4s.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ia64-4s.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ppc-4c.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ppc-4c.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4qs22-2s2t.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/64fake-4n2s2ca2c2t.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/64fake-4n2s2ca2c2t.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8amd64-4n2c.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8amd64-4n2c.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s2ca2c.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s2ca2c.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s4c-heterogeneous.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-4c2t.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-4c2t.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-2n2s2d.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-2n2s2d.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-4s2c.tar.gz
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-4s2c.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/96em64t-4n4d3ca2co.tar.gz.output
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/Makefile.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/README
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/test-topology.sh.in
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/openfabrics-verbs.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/Makefile.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/radset.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/lgrp_user.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/rset.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/sysctl.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/thread.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/windows.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/Makefile.am
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-bind.1in
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-bind.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-distrib.1in
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-distrib.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-cairo.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-draw.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-fig.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-text.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-windows.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-xml.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.1in
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.c
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.h
mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/test-hwloc-distrib.output
Log:
Upgrade to the 1.0rc5 release of hwloc. This is an intermediate step
for testing before we move to hwloc-1.0.
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/HACKING
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/HACKING 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/HACKING 2010-05-11 01:47:13 UTC (rev 6632)
@@ -53,10 +53,22 @@
"make check".
- For the windows zipball, make sure you have Microsoft's lib tool in
- PATH, and remember to copy README at the root of the zip into a
- README.txt file with CRLF:
+ PATH, and remember to copy README and NEWS at the root of the zip into
+ README.txt and NEWS.txt files with CRLF:
sed -e 's/$/'$'\015'/ < README > $prefix/README.txt
+ sed -e 's/$/'$'\015'/ < NEWS > $prefix/NEWS.txt
- make maintainer-clean can be used to properly remove the generated
documentations.
+
+- Silent rules are used by default to reduce the build verbosity:
+
+ shell$ make
+ CC src/topology.lo
+
+ To revert to the old verbose rules, pass V=1 to make:
+
+ shell$ make V=1
+ /bin/sh ../libtool --tag=CC --mode=compile gcc [...] -c -o topology.lo topology.c
+
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/Makefile.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/Makefile.am 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/Makefile.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,49 +1,66 @@
-# Copyright 2009 INRIA, Université Bordeaux 1
-# Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+# Copyright © 2009 INRIA, Université Bordeaux 1
+# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
-ACLOCAL_AMFLAGS = -I config -I m4
+# Note that the -I directory must *exactly* match what was specified
+# via AC_CONFIG_MACRO_DIR in configure.ac.
+ACLOCAL_AMFLAGS = -I ./config
-SUBDIRS = src utils tests include doc
+SUBDIRS = src include
+if HWLOC_BUILD_STANDALONE
+SUBDIRS += utils tests doc
+endif
+# Do not let automake automatically add the non-standalone dirs to the
+# distribution tarball if we're building in embedded mode.
+DIST_SUBDIRS = $(SUBDIRS)
+
+# Only install the pkg file if we're building in standalone mode
+if HWLOC_BUILD_STANDALONE
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = hwloc.pc
+endif
#
# "make distcheck" requires that tarballs are able to be able to "make
# dist", so we have to include config/distscript.csh.
#
-
EXTRA_DIST = \
README VERSION COPYING AUTHORS \
config/hwloc_get_version.sh \
config/distscript.csh
+if HWLOC_BUILD_STANDALONE
#
# Double check that we generated both the doxygen docs and a new copy
# of the top-level README file.
#
-
cannot-dist:
@echo "ERROR: Did not build both of the doxygen docs and README."
@echo "ERROR: This tarball is not complete!"
@echo "ERROR: Cowardly refusing to complete successfully..."
@exit 1
-if !BUILD_DOXYGEN
+# Refuse to make dist if we can't make the doxygen stuff (note that
+# BUILD_DOXYGEN will automatically be false if we're not building
+# standalone).
+if !HWLOC_BUILD_DOXYGEN
dist-hook: cannot-dist
else
-if !BUILD_README
+if !HWLOC_BUILD_README
dist-hook: cannot-dist
else
dist-hook:
csh "$(top_srcdir)/config/distscript.csh" "$(top_srcdir)" "$(distdir)" "$(HWLOC_VERSION)" "$(HWLOC_SVN_R)"
-endif
-endif
+endif HWLOC_BUILD_README
+endif HWLOC_BUILD_DOXYGEN
+endif HWLOC_BUILD_STANDALONE
#
# Build the top-level README file
#
+if HWLOC_BUILD_STANDALONE
.PHONY: doc readme
doc readme:
$(MAKE) -C doc readme
+endif HWLOC_BUILD_STANDALONE
Deleted: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/Makefile.man-page-rules
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/Makefile.man-page-rules 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/Makefile.man-page-rules 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,30 +0,0 @@
-# -*- makefile -*-
-# Copyright (c) 2008-2009 Cisco Systems, Inc. All rights reserved.
-# Copyright (c) 2008 Sun Microsystems, Inc. All rights reserved.
-# $COPYRIGHT$
-#
-# Additional copyrights may follow
-#
-# $HEADER$
-#
-
-.1in.1:
- @ echo Creating $@ man page...
- @ sed -e 's/#PACKAGE_NAME#/@PACKAGE_NAME@/g' \
- -e 's/#PACKAGE_VERSION#/@PACKAGE_VERSION@/g' \
- -e 's/#HWLOC_DATE#/@HWLOC_RELEASE_DATE@/g' \
- > $@ < $<
-
-.3in.3:
- @ echo Creating $@ man page...
- @ sed -e 's/#PACKAGE_NAME#/@PACKAGE_NAME@/g' \
- -e 's/#PACKAGE_VERSION#/@PACKAGE_VERSION@/g' \
- -e 's/#HWLOC_DATE#/@HWLOC_RELEASE_DATE@/g' \
- > $@ < $<
-
-.7in.7:
- @ echo Creating $@ man page...
- @ sed -e 's/#PACKAGE_NAME#/@PACKAGE_NAME@/g' \
- -e 's/#PACKAGE_VERSION#/@PACKAGE_VERSION@/g' \
- -e 's/#HWLOC_DATE#/@HWLOC_RELEASE_DATE@/g' \
- > $@ < $<
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/NEWS
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/NEWS 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/NEWS 2010-05-11 01:47:13 UTC (rev 6632)
@@ -14,7 +14,96 @@
0.9 (as initially released as "libtopology", then re-branded to "hwloc"
in v0.9.1).
+Version 1.0.0
+-------------
+* The ABI of the library has changed.
+* Backend updates
+ + Add FreeBSD support.
+ + Add x86 cpuid based backend.
+ + Add Linux cgroup support to the Linux cpuset code.
+ + Support binding of entire multithreaded process on Linux.
+ + Fix and enable Group support in Windows.
+ + Cleanup XML export/import.
+* Objects
+ + HWLOC_OBJ_PROC is renamed into HWLOC_OBJ_PU for "Processing Unit",
+ its stringified type name is now "PU".
+ + Use new HWLOC_OBJ_GROUP objects instead of MISC when grouping
+ objects according to NUMA distances or arbitrary OS aggregation.
+ + Rework memory attributes.
+ + Add different cpusets in each object to specify processors that
+ are offline, unavailable, ...
+ + Cleanup the storage of object names and DMI infos.
+* Features
+ + Add support for looking up specific PID topology information.
+ + Add hwloc_topology_export_xml() to export the topology in a XML file.
+ + Add hwloc_topology_get_support() to retrieve the supported features
+ for the current topology context.
+ + Support non-SYSTEM object as the root of the tree, use MACHINE in
+ most common cases.
+ + Add hwloc_get_*cpubind() routines to retrieve the current binding
+ of processes and threads.
+* API
+ + Add HWLOC_API_VERSION to help detect the currently used API version.
+ + Add missing ending "e" to *compare* functions.
+ + Add several routines to emulate PLPA functions.
+ + Rename and rework the cpuset and/or/xor/not/clear operators to output
+ their result in a dedicated argument instead of modifying one input.
+ + Deprecate hwloc_obj_snprintf() in favor of hwloc_obj_type/attr_snprintf().
+ + Clarify the use of parent and ancestor in the API, do not use father.
+ + Replace hwloc_get_system_obj() with hwloc_get_root_obj().
+ + Return -1 instead of HWLOC_OBJ_TYPE_MAX in the API since the latter
+ isn't public.
+ + Relax constraints in hwloc_obj_type_of_string().
+ + Improve displaying of memory sizes.
+ + Add 0x prefix to cpuset strings.
+* Tools
+ + lstopo now displays logical indexes by default, use --physical to
+ revert back to OS/physical indexes.
+ + Add colors in the lstopo graphical outputs to distinguish between online,
+ offline, reserved, ... objects.
+ + Extend lstopo to show cpusets, filter objects by type, ...
+ + Renamed hwloc-mask into hwloc-calc which supports many new options.
+* Documentation
+ + Add a hwloc(7) manpage containing general information.
+ + Add documentation about how to switch from PLPA to hwloc.
+ + Cleanup the distributed documentation files.
+* Miscellaneous
+ + Many compilers warning fixes.
+ + Cleanup the ABI by using the visibility attribute.
+ + Add project embedding support.
+
+
+Version 0.9.4 (unreleased)
+--------------------------
+
+* Fix reseting colors to normal in lstopo -.txt output.
+* Fix Linux pthread_t binding error report.
+
+
+Version 0.9.3
+-------------
+
+* Fix autogen.sh to work with Autoconf 2.63.
+* Fix various crashes in particular conditions:
+ - xml files with root attributes
+ - offline CPUs
+ - partial sysfs support
+ - unparseable /proc/cpuinfo
+ - ignoring NUMA level while Misc level have been generated
+* Tweak documentation a bit
+* Do not require the pthread library for binding the current thread on Linux
+* Do not erroneously consider the sched_setaffinity prototype is the old version
+ when there is actually none.
+* Fix _syscall3 compilation on archs for which we do not have the
+ sched_setaffinity system call number.
+* Fix AIX binding.
+* Fix libraries dependencies: now only lstopo depends on libtermcap, fix
+ binutils-gold link
+* Have make check always build and run hwloc-hello.c
+* Do not limit size of a cpuset.
+
+
Version 0.9.2
-------------
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/README
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/README 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/README 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,66 +1,89 @@
Introduction
-hwloc provides a portable abstraction (across OS, versions, architectures, ...)
-of the hierarchical topology of modern architectures. It primarily aims at
-helping high-performance computing applications with gathering information
-about the hardware so as to exploit it accordingly and efficiently.
+hwloc provides command line tools and a C API to obtain the hierarchical map of
+key computing elements, such as: NUMA memory nodes, shared caches, processor
+sockets, processor cores, and processing units (logical processors or
+"threads"). hwloc also gathers various attributes such as cache and memory
+information, and is portable across a variety of different operating systems
+and platforms.
-hwloc provides a hierarchical view of the machine, NUMA memory nodes, sockets,
-shared caches, cores and simultaneous multithreading. It also gathers various
-attributes such as cache and memory information.
+hwloc primarily aims at helping high-performance computing (HPC) applications,
+but is also applicable to any project seeking to exploit code and/or data
+locality on modern computing platforms.
+Note that the hwloc project represents the merger of the libtopology project
+from INRIA and the Portable Linux Processor Affinity (PLPA) sub-project from
+Open MPI. Both of these prior projects are now deprecated. The first hwloc
+release is essentially a "re-branding" of the libtopology code base, but with
+both a few genuinely new features and a few PLPA-like features added in. More
+new features and more PLPA-like features will be added to hwloc over time. See
+Switching from PLPA to hwloc for more details about converting your application
+from PLPA to hwloc.
+
hwloc supports the following operating systems:
* Linux (including old kernels not having sysfs topology information, with
knowledge of cpusets, offline cpus, and Kerrighed support)
* Solaris
* AIX
- * Darwin
- * OSF/1 (aka. Tru64)
+ * Darwin / OS X
+ * FreeBSD and its variants, such as kFreeBSD/GNU
+ * OSF/1 (a.k.a., Tru64)
* HP-UX
- * Windows
- * For other OSes, only the number of processors is available for now.
+ * Microsoft Windows
+hwloc only reports the number of processors on unsupported operating systems;
+no topology information is available.
+
For development and debugging purposes, hwloc also offers the ability to work
-on fake topologies:
+on "fake" topologies:
* Symmetrical tree of resources generated from a list of level arities
* Remote machine simulation through the gathering of Linux sysfs topology
files
-hwloc may also display the topology in a convenient format, either in graphical
-mode, or by exporting in PDF, PNG, FIG, ... format, or in text mode (see
-Examples below).
+hwloc can display the topology in a human-readable format, either in graphical
+mode (X11), or by exporting in one of several different formats, including:
+plain text, PDF, PNG, and FIG (see Examples below). Note that some of the
+export formats require additional support libraries.
hwloc offers a programming interface for manipulating topologies and objects.
-It also brings a powerful cpu bitmap API that is used to describe topology
+It also brings a powerful CPU bitmap API that is used to describe topology
objects location on physical/logical processors. See the Programming interface
below. It may also be used to binding applications onto certain cores or memory
nodes. Several utility programs are also provided to ease command-line
-manipulation of topology objects, binding of processes, ...
+manipulation of topology objects, binding of processes, and so on.
Installation
hwloc (http://www.open-mpi.org/projects/hwloc/) is available under the BSD
-license. It is hosted by Open MPI (http://www.open-mpi.org/). The current SVN
-snapshot can be fetched with:
+license. It is hosted as a sub-project of the overall Open MPI project (http://
+www.open-mpi.org/). Note that hwloc does not require any functionality from
+Open MPI -- it is a wholly separate (and much smaller!) project and code base.
+It just happens to be hosted as part of the overall Open MPI project.
- * svn checkout http://svn.open-mpi.org/svn/hwloc/trunk hwloc-trunk
- * cd hwloc-trunk
- * ./autogen.sh
+Nightly development snapshots are available on the web site. Additionally, the
+code can be directly checked out of Subversion:
-Note that autoconf >=2.60, automake >=1.10 and libtool >=2.2.6 are required in
-that case.
+shell$ svn checkout http://svn.open-mpi.org/svn/hwloc/trunk hwloc-trunk
+shell$ cd hwloc-trunk
+shell$ ./autogen.sh
-Installation by itself is as usual:
+Note that GNU Autoconf >=2.63, Automake >=1.10 and Libtool >=2.2.6 are required
+when building from a Subversion checkout.
- * ./configure --prefix=...
- * make
- * make install
+Installation by itself is the fairly common GNU-based process:
-Lstopo's fig support is always available. To get support for pdf, ps and png
-support, cairo is needed. To get support for xml, libxml2 is needed.
+shell$ ./configure --prefix=...
+shell$ make
+shell$ make install
+The hwloc command-line tool "lstopo" produces human-readable topology maps, as
+mentioned above. It can also export maps to the "fig" file format. Support for
+PDF, Postscript, and PNG exporting is provided if the "Cairo" development
+package can be found when hwloc is configured and build. Similarly, lstopo's
+XML support requires the libxml2 development package.
+
Examples
On a 4-socket 2-core machine with hyperthreading, the lstopo tool may show the
@@ -68,224 +91,300 @@
dudley.png
-System(15GB)
- Socket#0 + L3(4096KB)
- L2(1024KB) + L1(16KB) + Core#0
- P#0
- P#8
- L2(1024KB) + L1(16KB) + Core#1
- P#4
- P#12
- Socket#1 + L3(4096KB)
- L2(1024KB) + L1(16KB) + Core#0
- P#1
- P#9
- L2(1024KB) + L1(16KB) + Core#1
- P#5
- P#13
- Socket#2 + L3(4096KB)
- L2(1024KB) + L1(16KB) + Core#0
- P#2
- P#10
- L2(1024KB) + L1(16KB) + Core#1
- P#6
- P#14
- Socket#3 + L3(4096KB)
- L2(1024KB) + L1(16KB) + Core#0
- P#3
- P#11
- L2(1024KB) + L1(16KB) + Core#1
- P#7
- P#15
+Machine (16GB)
+ Socket #0 + L3 #0 (4096KB)
+ L2 #0 (1024KB) + L1 #0 (16KB) + Core #0
+ PU #0 (phys=0)
+ PU #1 (phys=8)
+ L2 #1 (1024KB) + L1 #1 (16KB) + Core #1
+ PU #2 (phys=4)
+ PU #3 (phys=12)
+ Socket #1 + L3 #1 (4096KB)
+ L2 #2 (1024KB) + L1 #2 (16KB) + Core #2
+ PU #4 (phys=1)
+ PU #5 (phys=9)
+ L2 #3 (1024KB) + L1 #3 (16KB) + Core #3
+ PU #6 (phys=5)
+ PU #7 (phys=13)
+ Socket #2 + L3 #2 (4096KB)
+ L2 #4 (1024KB) + L1 #4 (16KB) + Core #4
+ PU #8 (phys=2)
+ PU #9 (phys=10)
+ L2 #5 (1024KB) + L1 #5 (16KB) + Core #5
+ PU #10 (phys=6)
+ PU #11 (phys=14)
+ Socket #3 + L3 #3 (4096KB)
+ L2 #6 (1024KB) + L1 #6 (16KB) + Core #6
+ PU #12 (phys=3)
+ PU #13 (phys=11)
+ L2 #7 (1024KB) + L1 #7 (16KB) + Core #7
+ PU #14 (phys=7)
+ PU #15 (phys=15)
On a 4-socket 2-core Opteron NUMA machine, the lstopo tool may show the
following outputs:
hagrid.png
-System(62GB)
- Node#0(8190MB) + Socket#0
- L2(1024KB) + L1(64KB) + Core#0 + P#0
- L2(1024KB) + L1(64KB) + Core#1 + P#1
- Node#1(8192MB) + Socket#1
- L2(1024KB) + L1(64KB) + Core#0 + P#2
- L2(1024KB) + L1(64KB) + Core#1 + P#3
- Node#2(8192MB) + Socket#2
- L2(1024KB) + L1(64KB) + Core#0 + P#4
- L2(1024KB) + L1(64KB) + Core#1 + P#5
- Node#3(8192MB) + Socket#3
- L2(1024KB) + L1(64KB) + Core#0 + P#6
- L2(1024KB) + L1(64KB) + Core#1 + P#7
- Node#4(8192MB) + Socket#4
- L2(1024KB) + L1(64KB) + Core#0 + P#8
- L2(1024KB) + L1(64KB) + Core#1 + P#9
- Node#5(8192MB) + Socket#5
- L2(1024KB) + L1(64KB) + Core#0 + P#10
- L2(1024KB) + L1(64KB) + Core#1 + P#11
- Node#6(8192MB) + Socket#6
- L2(1024KB) + L1(64KB) + Core#0 + P#12
- L2(1024KB) + L1(64KB) + Core#1 + P#13
- Node#7(8192MB) + Socket#7
- L2(1024KB) + L1(64KB) + Core#0 + P#14
- L2(1024KB) + L1(64KB) + Core#1 + P#15
+Machine (64GB)
+ NUMANode #0 (phys=0 8190MB) + Socket #0
+ L2 #0 (1024KB) + L1 #0 (64KB) + Core #0 + PU #0 (phys=0)
+ L2 #1 (1024KB) + L1 #1 (64KB) + Core #1 + PU #1 (phys=1)
+ NUMANode #1 (phys=1 8192MB) + Socket #1
+ L2 #2 (1024KB) + L1 #2 (64KB) + Core #2 + PU #2 (phys=2)
+ L2 #3 (1024KB) + L1 #3 (64KB) + Core #3 + PU #3 (phys=3)
+ NUMANode #2 (phys=2 8192MB) + Socket #2
+ L2 #4 (1024KB) + L1 #4 (64KB) + Core #4 + PU #4 (phys=4)
+ L2 #5 (1024KB) + L1 #5 (64KB) + Core #5 + PU #5 (phys=5)
+ NUMANode #3 (phys=3 8192MB) + Socket #3
+ L2 #6 (1024KB) + L1 #6 (64KB) + Core #6 + PU #6 (phys=6)
+ L2 #7 (1024KB) + L1 #7 (64KB) + Core #7 + PU #7 (phys=7)
+ NUMANode #4 (phys=4 8192MB) + Socket #4
+ L2 #8 (1024KB) + L1 #8 (64KB) + Core #8 + PU #8 (phys=8)
+ L2 #9 (1024KB) + L1 #9 (64KB) + Core #9 + PU #9 (phys=9)
+ NUMANode #5 (phys=5 8192MB) + Socket #5
+ L2 #10 (1024KB) + L1 #10 (64KB) + Core #10 + PU #10 (phys=10)
+ L2 #11 (1024KB) + L1 #11 (64KB) + Core #11 + PU #11 (phys=11)
+ NUMANode #6 (phys=6 8192MB) + Socket #6
+ L2 #12 (1024KB) + L1 #12 (64KB) + Core #12 + PU #12 (phys=12)
+ L2 #13 (1024KB) + L1 #13 (64KB) + Core #13 + PU #13 (phys=13)
+ NUMANode #7 (phys=7 8192MB) + Socket #7
+ L2 #14 (1024KB) + L1 #14 (64KB) + Core #14 + PU #14 (phys=14)
+ L2 #15 (1024KB) + L1 #15 (64KB) + Core #15 + PU #15 (phys=15)
-On a 2-socket quad-core Xeon (pre-Nehalem ones assembling 2 dual-core dies into
-each socket):
+On a 2-socket quad-core Xeon (pre-Nehalem, with 2 dual-core dies into each
+socket):
emmett.png
-System(15GB)
- Socket#0
- L2(4096KB)
- L1(32KB) + Core#0 + P#0
- L1(32KB) + Core#1 + P#4
- L2(4096KB)
- L1(32KB) + Core#2 + P#2
- L1(32KB) + Core#3 + P#6
- Socket#1
- L2(4096KB)
- L1(32KB) + Core#0 + P#1
- L1(32KB) + Core#1 + P#5
- L2(4096KB)
- L1(32KB) + Core#2 + P#3
- L1(32KB) + Core#3 + P#7
+Machine (16GB)
+ Socket #0
+ L2 #0 (4096KB)
+ L1 #0 (32KB) + Core #0 + PU #0 (phys=0)
+ L1 #1 (32KB) + Core #1 + PU #1 (phys=4)
+ L2 #1 (4096KB)
+ L1 #2 (32KB) + Core #2 + PU #2 (phys=2)
+ L1 #3 (32KB) + Core #3 + PU #3 (phys=6)
+ Socket #1
+ L2 #2 (4096KB)
+ L1 #4 (32KB) + Core #4 + PU #4 (phys=1)
+ L1 #5 (32KB) + Core #5 + PU #5 (phys=5)
+ L2 #3 (4096KB)
+ L1 #6 (32KB) + Core #6 + PU #6 (phys=3)
+ L1 #7 (32KB) + Core #7 + PU #7 (phys=7)
Programming interface
-The basic interface is available in hwloc.h . It mostly offers low-level
+The basic interface is available in hwloc.h. It mostly offers low-level
routines for advanced programmers that want to manually manipulate objects and
-follow links between them. Most users should look at hwloc/helper.h which
-provides a lot of interesting higher-level traversal examples.
+follow links between them. Developers should look at hwloc/helper.h, which
+provides good higher-level topology traversal examples.
-Each object contains a cpuset which describes the list of processors that it
+Each object contains a cpuset describing the list of processing units that it
contains. These cpusets may be used for Binding. hwloc offers an extensive
-cpuset manipulation interface in hwloc/cpuset.h .
+cpuset manipulation interface in hwloc/cpuset.h.
Moreover, hwloc also comes with additional helpers for interoperability with
several commonly used environments. For Linux, some specific helpers are
-available in hwloc/linux.h , and hwloc/linux-libnuma.h if using libnuma. On
-glibc-based systems, additional helpers are available in hwloc/glibc-sched.h .
+available in hwloc/linux.h, and hwloc/linux-libnuma.h if using libnuma. On
+glibc-based systems, additional helpers are available in hwloc/glibc-sched.h.
For Linux systems with the OpenFabrics verbs library, some dedicated helpers
are provided in hwloc/openfabrics-verbs.h (this helper file is not yet useful
on non-Linux systems with the OpenFabrics verbs library).
-To precisely define the vocabulary used by hwloc, a Glossary is available and
-should probably be read first.
+To precisely define the vocabulary used by hwloc, a Terms and Definitions
+section is available and should probably be read first.
-Further documentation is available in html, manual pages, and pdf format in the
-source tarball in doc/doxygen-doc/ (after doxygen compilation for svn
-checkouts) and are installed in $prefix/share/doc/hwloc/ and the usual manual
-repository.
+Further documentation is available in a full set of HTML pages, man pages, and
+self-contained PDF files (formatted for both both US letter and A4 formats) in
+the source tarball in doc/doxygen-doc/. If you are building from a Subversion
+checkout, you will need to have Doxygen and pdflatex installed -- the
+documentation will be built during the normal "make" process. The documentation
+is installed during "make install" to $prefix/share/doc/hwloc/ and your systems
+default man page tree (under $prefix, of course).
The following section presents an example of API usage.
-Interface example
+API example
-This section shows how to use hwloc with an small example hwloc-hello.c that
-just prints the topology and binds itself to the first processor of the second
+The following small C example (named ``hwloc-hello.c'') prints the topology of
+the machine and bring the process to the first logical processor of the second
core of the machine.
-Hardware Location provides a pkg-config object, so compiling the example boils
-down to
+/* Example hwloc API program.
+ *
+ * Copyright ? 2009 INRIA, Universit? Bordeaux 1
+ * Copyright ? 2009 Cisco Systems, Inc. All rights reserved.
+ *
+ * hwloc-hello.c
+ */
-CFLAGS+=$(pkg-config --cflags hwloc)
-LDLIBS+=$(pkg-config --libs hwloc)
-cc hwloc-hello.c $(CFLAGS) -o hwloc-hello $(LDLIBS)
-
-/* topo-hello.c */
#include <hwloc.h>
-static void print_children(hwloc_topology_t topology, hwloc_obj_t obj, int depth)
+static void print_children(hwloc_topology_t topology, hwloc_obj_t obj,
+ int depth)
{
- char string[128];
- int i;
+ char string[128];
+ unsigned i;
- hwloc_obj_snprintf(string, sizeof(string), topology, obj, "#", 0);
- printf("%*s%s\n", 2*depth, "", string);
- for (i = 0; i < obj->arity; i++)
- print_children(topology, obj->children[i], depth + 1);
+ hwloc_obj_snprintf(string, sizeof(string), topology, obj, "#", 0);
+ printf("%*s%s\n", 2*depth, "", string);
+ for (i = 0; i < obj->arity; i++) {
+ print_children(topology, obj->children[i], depth + 1);
+ }
}
int main(void)
{
- /* Topology object */
- hwloc_topology_t topology;
+ int depth;
+ unsigned i;
+ unsigned long size;
+ int levels;
+ char string[128];
+ int topodepth;
+ hwloc_topology_t topology;
+ hwloc_cpuset_t cpuset;
+ hwloc_obj_t obj;
- /* Allocate and initialize topology object. */
- hwloc_topology_init(&topology);
+ /* Allocate and initialize topology object. */
+ hwloc_topology_init(&topology);
- /* ... Optionally, put detection configuration here to e.g. ignore some
- objects types, define a synthetic topology, etc.... The default is
- to detect all the objects of the machine that the caller is allowed
- to access.
- See Configure Topology Detection. */
+ /* ... Optionally, put detection configuration here to e.g. ignore
+ some objects types, define a synthetic topology, etc....
- /* Perform the topology detection. */
- hwloc_topology_load(topology);
+ The default is to detect all the objects of the machine that
+ the caller is allowed to access. See Configure Topology
+ Detection. */
+ /* Perform the topology detection. */
+ hwloc_topology_load(topology);
- /* Optionally, get some additional topology information
- * in case we need the topology depth later.
- */
- unsigned topodepth = hwloc_topology_get_depth(topology);
+ /* Optionally, get some additional topology information
+ in case we need the topology depth later. */
+ topodepth = hwloc_topology_get_depth(topology);
-
- /* Walk the topology with an array style, from level 0 (always the
- * system level) to the lowest level (always the proc level). */
- int depth, i;
- char string[128];
- for (depth = 0; depth < topodepth; depth++) {
- for (i = 0; i < hwloc_get_nbobjs_by_depth(topology, depth); i++) {
- hwloc_obj_snprintf(string, sizeof(string), topology,
- hwloc_get_obj_by_depth(topology, depth, i), "#", 0);
- printf("%s\n", string);
- }
+ /* First example:
+ * Walk the topology with an array style, from level 0 (always the
+ * system level) to the lowest level (always the proc level). */
+ for (depth = 0; depth < topodepth; depth++) {
+ printf("*** Objects at level %d\n", depth);
+ for (i = 0; i < hwloc_get_nbobjs_by_depth(topology, depth);
+ i++) {
+ hwloc_obj_snprintf(string, sizeof(string), topology,
+ hwloc_get_obj_by_depth(topology, depth, i),
+ "#", 0);
+ printf("Index %u: %s\n", i, string);
}
+ }
- /* Walk the topology with a tree style. */
- print_children(topology, hwloc_get_system_obj(topology), 0);
+ /* Second example:
+ * Walk the topology with a tree style. */
+ printf("*** Printing overall tree\n");
+ print_children(topology, hwloc_get_root_obj(topology), 0);
+ /* Third example:
+ * Print the number of sockets. */
+ depth = hwloc_get_type_depth(topology, HWLOC_OBJ_SOCKET);
+ if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) {
+ printf("*** The number of sockets is unknown\n");
+ } else {
+ printf("*** %u socket(s)\n",
+ hwloc_get_nbobjs_by_depth(topology, depth));
+ }
- /* Print the number of sockets. */
- depth = hwloc_get_type_depth(topology, HWLOC_OBJ_SOCKET);
- if (depth == HWLOC_TYPE_DEPTH_UNKNOWN)
- printf("The number of sockets is unknown\n");
- else
- printf("%u socket(s)\n", hwloc_get_nbobjs_by_depth(topology, depth));
+ /* Fourth example:
+ * Compute the amount of cache that the first logical processor has above it.
+ */
+ levels = 0;
+ size = 0;
+ for (obj = hwloc_get_obj_by_type(topology, HWLOC_OBJ_PU, 0);
+ obj;
+ obj = obj->parent)
+ if (obj->type == HWLOC_OBJ_CACHE) {
+ levels++;
+ size += obj->attr->cache.size;
+ }
+ printf("*** Logical processor 0 has %u caches totaling %luKB\n", levels, size / 1024);
+ /* Fifth example:
+ * Bind to only one thread of the last core of the machine.
+ *
+ * First find out where cores are, or else smaller sets of CPUs if
+ * the OS doesn't have the notion of a "core". */
+ depth = hwloc_get_type_or_below_depth(topology, HWLOC_OBJ_CORE);
- /* Find out where cores are, or else smaller sets of CPUs if the OS
- * doesn't have the notion of core. */
- depth = hwloc_get_type_or_below_depth(topology, HWLOC_OBJ_CORE);
+ /* Get last core. */
+ obj = hwloc_get_obj_by_depth(topology, depth,
+ hwloc_get_nbobjs_by_depth(topology, depth) - 1);
+ if (obj) {
+ /* Get a copy of its cpuset that we may modify. */
+ cpuset = hwloc_cpuset_dup(obj->cpuset);
- /* Get last one. */
- hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, hwloc_get_nbobjs_by_depth(topology, depth) - 1);
- if (!obj)
- return 0;
-
- /* Get a copy of its cpuset that we may modify. */
- hwloc_cpuset_t cpuset = hwloc_cpuset_dup(obj->cpuset);
-
- /* Get only one logical processor (in case the core is SMT/hyperthreaded). */
+ /* Get only one logical processor (in case the core is
+ SMT/hyperthreaded). */
hwloc_cpuset_singlify(cpuset);
- /* And try to bind ourself there. */
+ /* And try to bind ourself there. */
if (hwloc_set_cpubind(topology, cpuset, 0)) {
- char *str = NULL;
- hwloc_cpuset_asprintf(&str, obj->cpuset);
- printf("Couldn't bind to cpuset %s\n", str);
- free(str);
+ char *str;
+ hwloc_cpuset_asprintf(&str, obj->cpuset);
+ printf("Couldn't bind to cpuset %s\n", str);
+ free(str);
}
/* Free our cpuset copy */
hwloc_cpuset_free(cpuset);
+ }
- /* Destroy topology object. */
- hwloc_topology_destroy(topology);
+ /* Destroy topology object. */
+ hwloc_topology_destroy(topology);
- return 0;
+ return 0;
}
+hwloc provides a pkg-config executable to obtain relevant compiler and linker
+flags. For example, it can be used thusly to compile applications that utilize
+the hwloc library (assuming GNU Make):
+
+CFLAGS += $(pkg-config --cflags hwloc)
+LDLIBS += $(pkg-config --libs hwloc)
+cc hwloc-hello.c $(CFLAGS) -o hwloc-hello $(LDLIBS)
+
+On a machine with 4GB of RAM and 2 processor sockets -- each socket of which
+has two processing cores -- the output from running hwloc-hello could be
+something like the following:
+
+shell$ ./hwloc-hello
+*** Objects at level 0
+Index 0: Machine(3938MB)
+*** Objects at level 1
+Index 0: Socket#0
+Index 1: Socket#1
+*** Objects at level 2
+Index 0: Core#0
+Index 1: Core#1
+Index 2: Core#3
+Index 3: Core#2
+*** Objects at level 3
+Index 0: PU#0
+Index 1: PU#1
+Index 2: PU#2
+Index 3: PU#3
+*** Printing overall tree
+Machine(3938MB)
+ Socket#0
+ Core#0
+ PU#0
+ Core#1
+ PU#1
+ Socket#1
+ Core#3
+ PU#2
+ Core#2
+ PU#3
+*** 2 socket(s)
+shell$
+
Questions and bugs
Questions should be sent to the devel mailing list (http://www.open-mpi.org/
@@ -302,11 +401,11 @@
libtopology was initially developed by the INRIA Runtime Team-Project (http://
runtime.bordeaux.inria.fr/) (headed by Raymond Namyst (http://
-dept-info.labri.fr/~namyst/)). PLPA was initially developed by the Open MPI
+dept-info.labri.fr/~namyst/). PLPA was initially developed by the Open MPI
development team as a sub-project. Both are now deprecated in favor of hwloc,
which is distributed as an Open MPI sub-project.
-------------------------------------------------------------------------------
-Generated on Mon Oct 26 15:22:12 2009 for Hardware Locality (hwloc) by doxygen
-1.6.1
+Generated on Sun Apr 4 13:48:12 2010 for Hardware Locality (hwloc) by doxygen
+1.6.3
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/VERSION
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/VERSION 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/VERSION 2010-05-11 01:47:13 UTC (rev 6632)
@@ -5,9 +5,9 @@
# major, minor, and release are generally combined in the form
# <major>.<minor>.<release>. If release is zero, then it is omitted.
-major=0
-minor=9
-release=2
+major=1
+minor=0
+release=0
# greek is used for alpha or beta release tags. If it is non-empty,
# it will be appended to the version number. It does not have to be
@@ -16,7 +16,7 @@
# requirement is that it must be entirely printable ASCII characters
# and have no white space.
-greek=rc1
+greek=rc5
# If want_svn=1, then the SVN r number will be included in the overall
# hwloc version number in some form.
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/distscript.csh
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/distscript.csh 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/distscript.csh 2010-05-11 01:47:13 UTC (rev 6632)
@@ -128,12 +128,6 @@
exit 1
endif
- # Remove generate latex kruft; no need to ship that.
- echo "*** Remove generated latex kruft: `pwd`"
- cd doxygen-doc/latex
- rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out
- cd ../..
-
# Make new README file
echo "*** Making new README"
make readme
@@ -166,6 +160,15 @@
echo "*** Now in distdir: $distdir"
#
+# Remove all the latex source files from the distribution tree (the
+# PDFs are still there; we're just removing the latex source because
+# some of the filenames get really, really long...).
+#
+
+echo "*** Removing latex source from dist tree"
+rm -rf doc/doxygen-doc/latex
+
+#
# Get the latest config.guess and config.sub from ftp.gnu.org
#
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc.m4
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc.m4 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc.m4 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,23 +1,617 @@
dnl -*- Autoconf -*-
dnl
dnl Copyright 2009 INRIA, Université Bordeaux 1
+dnl Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+dnl University Research and Technology
+dnl Corporation. All rights reserved.
+dnl Copyright (c) 2004-2005 The Regents of the University of California.
+dnl All rights reserved.
+dnl Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
+dnl University of Stuttgart. All rights reserved.
+dnl Copyright © 2006-2010 Cisco Systems, Inc. All rights reserved.
+# Main hwloc m4 macro, to be invoked by the user
+#
+# Expects two or three paramters:
+# 1. Configuration prefix
+# 2. What to do upon success
+# 3. What to do upon failure
+# 4. If non-empty, print the announcement banner
+#
+AC_DEFUN([HWLOC_SETUP_CORE],[
+ AC_REQUIRE([AC_CANONICAL_TARGET])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AM_PROG_CC_C_O])
-dnl HWLOC_GCC_FLAGS
-dnl
-dnl Substitute in `GCC_CFLAGS' GCC-specific flags.
-AC_DEFUN([HWLOC_GCC_FLAGS], [
- # GCC specifics.
- if test "x$GCC" = "xyes"; then
- GCC_CFLAGS="-std=c99 -Wall -Wmissing-prototypes -Wundef"
- GCC_CFLAGS="$GCC_CFLAGS -Wpointer-arith -Wcast-align"
- else
- GCC_CFLAGS=""
- fi
- AC_SUBST([GCC_CFLAGS])
+ AS_IF([test "x$4" != "x"],
+ [cat <<EOF
+
+###
+### Configuring hwloc core
+###
+EOF])
+
+ # We want new Libtool. None of that old stuff. Pfft.
+ LT_PREREQ([2.2.6])
+
+ # If no prefix was defined, set a good value
+ m4_ifval([$1],
+ [m4_define([hwloc_config_prefix],[$1/])],
+ [m4_define([hwloc_config_prefix], [])])
+
+ # Unless previously set to "standalone" mode, default to embedded
+ # mode
+ AS_IF([test "$hwloc_mode" = ""], [hwloc_mode=embedded])
+ AC_MSG_CHECKING([hwloc building mode])
+ AC_MSG_RESULT([$hwloc_mode])
+
+ # Get hwloc's absolute top builddir (which may not be the same as
+ # the real $top_builddir, because we may be building in embedded
+ # mode).
+ HWLOC_startdir=`pwd`
+ if test x"hwloc_config_prefix" != "x" -a ! -d "hwloc_config_prefix"; then
+ mkdir "hwloc_config_prefix"
+ fi
+ if test x"hwloc_config_prefix" != "x"; then
+ cd "hwloc_config_prefix"
+ fi
+ HWLOC_top_builddir=`pwd`
+ AC_SUBST(HWLOC_top_builddir)
+
+ # Get hwloc's absolute top srcdir (which may not be the same as
+ # the real $top_srcdir, because we may be building in embedded
+ # mode). First, go back to the startdir incase the $srcdir is
+ # relative.
+ cd "$HWLOC_startdir"
+ cd "$srcdir"/hwloc_config_prefix
+ HWLOC_top_srcdir="`pwd`"
+ AC_SUBST(HWLOC_top_srcdir)
+
+ # Go back to where we started
+ cd "$HWLOC_startdir"
+
+ AC_MSG_NOTICE([hwloc builddir: $HWLOC_top_builddir])
+ AC_MSG_NOTICE([hwloc srcdir: $HWLOC_top_srcdir])
+ if test "$HWLOC_top_builddir" != "$HWLOC_top_srcdir"; then
+ AC_MSG_NOTICE([Detected VPATH build])
+ fi
+
+ # Debug mode?
+ AC_MSG_CHECKING([if want hwloc maintainer support])
+ hwloc_debug=
+ AS_IF([test "$enable_debug" = "yes"],
+ [hwloc_debug=1
+ hwloc_debug_msg="enabled"])
+ AS_IF([test "$hwloc_debug" = "" -a "$hwloc_mode" = "embedded" -a "$enable_debug" = ""],
+ [hwloc_debug=0
+ hwloc_debug_msg="disabled (embedded mode)"])
+ AS_IF([test "$hwloc_debug" = "" -a "$enable_debug" = "" -a -d .svn],
+ [hwloc_debug=1
+ hwloc_debug_msg="enabled (SVN checkout default)"])
+ AS_IF([test "$hwloc_debug" = "" -a "$enable_debug" = "" -a -d .hg],
+ [hwloc_debug=1
+ hwloc_debug_msg="enabled (HG clone default)"])
+ AS_IF([test "$hwloc_debug" = ""],
+ [hwloc_debug=0
+ hwloc_debug_msg="disabled"])
+ # Grr; we use #ifndef for HWLOC_DEBUG! :-(
+ AH_TEMPLATE(HWLOC_DEBUG, [Whether we are in debugging mode or not])
+ AS_IF([test "$hwloc_debug" = "1"], [AC_DEFINE([HWLOC_DEBUG])])
+ AC_MSG_RESULT([$hwloc_debug_msg])
+
+ # We need to set a path for header, etc files depending on whether
+ # we're standalone or embedded. this is taken care of by HWLOC_EMBEDDED.
+
+ AC_MSG_CHECKING([for hwloc directory prefix])
+ AC_MSG_RESULT(m4_ifval([$1], hwloc_config_prefix, [(none)]))
+
+ # Note that private/config.h *MUST* be listed first so that it
+ # becomes the "main" config header file. Any AM_CONFIG_HEADERs
+ # after that (hwloc/config.h) will only have selective #defines
+ # replaced, not the entire file.
+ AM_CONFIG_HEADER(hwloc_config_prefix[include/private/config.h])
+ AM_CONFIG_HEADER(hwloc_config_prefix[include/hwloc/config.h])
+
+ # What prefix are we using?
+ AC_MSG_CHECKING([for hwloc symbol prefix])
+ AS_IF([test "$hwloc_symbol_prefix_value" = ""],
+ [AS_IF([test "$with_hwloc_symbol_prefix" = ""],
+ [hwloc_symbol_prefix_value=hwloc_],
+ [hwloc_symbol_prefix_value=$with_hwloc_symbol_prefix])])
+ AC_DEFINE_UNQUOTED(HWLOC_SYM_PREFIX, [$hwloc_symbol_prefix_value],
+ [The hwloc symbol prefix])
+ # Ensure to [] escape the whole next line so that we can get the
+ # proper tr tokens
+ [hwloc_symbol_prefix_value_caps="`echo $hwloc_symbol_prefix_value | tr '[:lower:]' '[:upper:]'`"]
+ AC_DEFINE_UNQUOTED(HWLOC_SYM_PREFIX_CAPS, [$hwloc_symbol_prefix_value_caps],
+ [The hwloc symbol prefix in all caps])
+ AC_MSG_RESULT([$hwloc_symbol_prefix_value])
+
+ # Give an easy #define to know if we need to transform all the
+ # hwloc names
+ AH_TEMPLATE([HWLOC_SYM_TRANSFORM], [Whether we need to re-define all the hwloc public symbols or not])
+ AS_IF([test "$hwloc_symbol_prefix_value" = "hwloc_"],
+ [AC_DEFINE([HWLOC_SYM_TRANSFORM], [0])],
+ [AC_DEFINE([HWLOC_SYM_TRANSFORM], [1])])
+
+ #
+ # Check OS support
+ #
+ AC_MSG_CHECKING([which OS support to include])
+ case ${target} in
+ *-*-linux*)
+ AC_DEFINE(HWLOC_LINUX_SYS, 1, [Define to 1 on Linux])
+ hwloc_linux=yes
+ AC_MSG_RESULT([Linux])
+ ;;
+ *-*-irix*)
+ AC_DEFINE(HWLOC_IRIX_SYS, 1, [Define to 1 on Irix])
+ hwloc_irix=yes
+ AC_MSG_RESULT([IRIX])
+ ;;
+ *-*-darwin*)
+ AC_DEFINE(HWLOC_DARWIN_SYS, 1, [Define to 1 on Darwin])
+ hwloc_darwin=yes
+ AC_MSG_RESULT([Darwin])
+ ;;
+ *-*-solaris*)
+ AC_DEFINE(HWLOC_SOLARIS_SYS, 1, [Define to 1 on Solaris])
+ hwloc_solaris=yes
+ AC_MSG_RESULT([Solaris])
+ ;;
+ *-*-aix*)
+ AC_DEFINE(HWLOC_AIX_SYS, 1, [Define to 1 on AIX])
+ hwloc_aix=yes
+ AC_MSG_RESULT([AIX])
+ ;;
+ *-*-osf*)
+ AC_DEFINE(HWLOC_OSF_SYS, 1, [Define to 1 on OSF])
+ hwloc_osf=yes
+ AC_MSG_RESULT([OSF])
+ ;;
+ *-*-hpux*)
+ AC_DEFINE(HWLOC_HPUX_SYS, 1, [Define to 1 on HP-UX])
+ hwloc_hpux=yes
+ AC_MSG_RESULT([HP-UX])
+ ;;
+ *-*-mingw*|*-*-cygwin*)
+ AC_DEFINE(HWLOC_WIN_SYS, 1, [Define to 1 on WINDOWS])
+ hwloc_windows=yes
+ AC_MSG_RESULT([Windows])
+ ;;
+ *-*-*freebsd*)
+ AC_DEFINE(HWLOC_FREEBSD_SYS, 1, [Define to 1 on *FREEBSD])
+ hwloc_freebsd=yes
+ AC_MSG_RESULT([FreeBSD])
+ ;;
+ *)
+ AC_MSG_RESULT([Unsupported! ($target)])
+ AC_DEFINE(HWLOC_UNSUPPORTED_SYS, 1, [Define to 1 on unsupported systems])
+ AC_MSG_WARN([***********************************************************])
+ AC_MSG_WARN([*** hwloc does not support this system.])
+ AC_MSG_WARN([*** hwloc will *attempt* to build (but it may not work).])
+ AC_MSG_WARN([*** hwloc's run-time results may be reduced to showing just one processor.])
+ AC_MSG_WARN([*** You have been warned.])
+ AC_MSG_WARN([*** Pausing to give you time to read this message...])
+ AC_MSG_WARN([***********************************************************])
+ sleep 10
+ ;;
+ esac
+
+ #
+ # Check CPU support
+ #
+ AC_MSG_CHECKING([which CPU support to include])
+ case ${target} in
+ i*86-*-*)
+ AC_DEFINE(HWLOC_X86_32_ARCH, 1, [Define to 1 on x86_32])
+ hwloc_x86_32=yes
+ AC_MSG_RESULT([x86_32])
+ ;;
+ x86_64-*-*)
+ AC_DEFINE(HWLOC_X86_64_ARCH, 1, [Define to 1 on x86_64])
+ hwloc_x86_64=yes
+ AC_MSG_RESULT([x86_64])
+ ;;
+ esac
+
+ #
+ # Define C flags
+ #
+
+ # hwloc uses C99 style, so ensure that we can figure out which
+ # compiler flags will drive this.
+ hwloc_CC_save=$CC
+ hwloc_CFLAGS_save=$CFLAGS
+ AC_PROG_CC_C99
+ hwloc_CC_c99_flags=`echo $CC | sed -e s/^$hwloc_CC_save//`
+ CC=$hwloc_CC_save
+ CFLAGS=$hwloc_CFLAGS_save
+
+ # GCC specifics.
+ if test "x$GCC" = "xyes"; then
+ HWLOC_GCC_CFLAGS="-Wall -Wmissing-prototypes -Wundef"
+ HWLOC_GCC_CFLAGS="$HWLOC_GCC_CFLAGS -Wpointer-arith -Wcast-align"
+ fi
+
+ # Enample system extensions for O_DIRECTORY, fdopen, fssl, etc.
+ AC_USE_SYSTEM_EXTENSIONS
+ AH_VERBATIM([USE_HPUX_SYSTEM_EXTENSIONS],
+[/* Enable extensions on HP-UX. */
+#ifndef _HPUX_SOURCE
+# undef _HPUX_SOURCE
+#endif
])
+ AC_DEFINE([_HPUX_SOURCE], [1], [Are we building for HP-UX?])
+
+ AC_LANG_PUSH([C])
+
+ _HWLOC_CHECK_DIFF_U
+
+ AC_CHECK_SIZEOF([unsigned long])
+ AC_DEFINE_UNQUOTED([HWLOC_SIZEOF_UNSIGNED_LONG], $ac_cv_sizeof_unsigned_long, [The size of `unsigned long', as computed by sizeof])
+ AC_CHECK_SIZEOF([unsigned int])
+ AC_DEFINE_UNQUOTED([HWLOC_SIZEOF_UNSIGNED_INT], $ac_cv_sizeof_unsigned_int, [The size of `unsigned int', as computed by sizeof])
-AC_DEFUN([HWLOC_CHECK_DIFF_U], [
+ #
+ # Check for compiler attributes and visibility
+ #
+ _HWLOC_CHECK_ATTRIBUTES
+ _HWLOC_CHECK_VISIBILITY
+ HWLOC_CFLAGS="$HWLOC_FLAGS $HWLOC_VISIBILITY_CFLAGS"
+ AS_IF([test "$HWLOC_VISIBILITY_CFLAGS" != ""],
+ [AC_MSG_WARN(["$HWLOC_VISIBILITY_CFLAGS" has been added to hwloc's CFLAGS])])
+
+ #
+ # Check for inline compatibility support
+ #
+ AC_MSG_CHECKING([for inline compatibility keyword])
+ AC_TRY_COMPILE([static void __inline__ f(void) { }], [],
+ [__hwloc_inline=__inline__],
+ [AC_TRY_COMPILE([static void __inline f(void) {}], [],
+ [__hwloc_inline=__inline],
+ [__hwloc_inline=]
+ )]
+ )
+ AC_MSG_RESULT([$__hwloc_inline])
+ AC_DEFINE_UNQUOTED(__hwloc_inline, $__hwloc_inline, [Define this to a keyword that can safely replace inline in installed headers])
+
+ #
+ # Now detect support
+ #
+
+ hwloc_strncasecmp=strncmp
+ AC_CHECK_FUNCS([strncasecmp], [
+ _HWLOC_CHECK_DECL([strncasecmp], [
+ hwloc_strncasecmp=strncasecmp
+ ])
+ ])
+ AC_DEFINE_UNQUOTED(hwloc_strncasecmp, $hwloc_strncasecmp, [Define this to either strncasecmp or strncmp])
+
+ AC_CHECK_TYPES([wchar_t], [
+ AC_CHECK_FUNCS([putwc])
+ ], [], [[#include <wchar.h>]])
+
+ AC_CHECK_HEADERS([locale.h], [
+ AC_CHECK_FUNCS([setlocale])
+ ])
+ AC_CHECK_HEADERS([langinfo.h], [
+ AC_CHECK_FUNCS([nl_langinfo])
+ ])
+ old_LIBS="$LIBS"
+ LIBS=
+ AC_CHECK_HEADERS([curses.h], [
+ AC_CHECK_HEADERS([term.h], [
+ AC_SEARCH_LIBS([tparm], [termcap ncursesw ncurses curses], [
+ AC_SUBST([HWLOC_TERMCAP_LIBS], ["$LIBS"])
+ AC_DEFINE([HWLOC_HAVE_LIBTERMCAP], [1],
+ [Define to 1 if you have a library providing the termcap interface])
+ ])
+ ], [], [[#include <curses.h>]])
+ ])
+ LIBS="$old_LIBS"
+
+ AC_CHECK_TYPES([KAFFINITY,
+ PROCESSOR_CACHE_TYPE,
+ CACHE_DESCRIPTOR,
+ LOGICAL_PROCESSOR_RELATIONSHIP,
+ SYSTEM_LOGICAL_PROCESSOR_INFORMATION,
+ GROUP_AFFINITY,
+ PROCESSOR_RELATIONSHIP,
+ NUMA_NODE_RELATIONSHIP,
+ CACHE_RELATIONSHIP,
+ PROCESSOR_GROUP_INFO,
+ GROUP_RELATIONSHIP,
+ SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX],
+ [],[],[[#include <windows.h>]])
+ AC_HAVE_LIBRARY(gdi32)
+
+ AC_CHECK_HEADER([windows.h], [
+ AC_DEFINE([HWLOC_HAVE_WINDOWS_H], [1], [Define to 1 if you have the `windows.h' header.])
+ ])
+
+ AC_CHECK_HEADERS([sys/lgrp_user.h], [
+ AC_HAVE_LIBRARY([lgrp])
+ ])
+ AC_CHECK_HEADERS([kstat.h], [
+ AC_HAVE_LIBRARY([kstat])
+ ])
+
+ AC_CHECK_HEADERS([infiniband/verbs.h], [
+ AC_HAVE_LIBRARY([ibverbs], [hwloc_have_libibverbs=yes])
+ ])
+
+ AC_CHECK_DECLS([_SC_NPROCESSORS_ONLN,
+ _SC_NPROCESSORS_CONF,
+ _SC_NPROC_ONLN,
+ _SC_NPROC_CONF,
+ _SC_LARGE_PAGESIZE],,[:],[[#include <unistd.h>]])
+
+ AC_HAVE_HEADERS([mach/mach_host.h])
+ AC_HAVE_HEADERS([mach/mach_init.h], [
+ AC_CHECK_FUNCS([host_info])
+ ])
+
+ AC_CHECK_HEADERS([sys/param.h])
+ AC_CHECK_HEADERS([sys/sysctl.h], [
+ AC_CHECK_DECLS([CTL_HW, HW_NCPU],,,[[
+ #if HAVE_SYS_PARAM_H
+ #include <sys/param.h>
+ #endif
+ #include <sys/sysctl.h>
+ ]])
+ ],,[
+ AC_INCLUDES_DEFAULT
+ #if HAVE_SYS_PARAM_H
+ #include <sys/param.h>
+ #endif
+ ])
+ AC_CHECK_FUNCS([sysctl sysctlbyname])
+
+ case ${target} in
+ *-*-mingw*|*-*-cygwin*)
+ hwloc_pid_t=HANDLE
+ hwloc_thread_t=HANDLE
+ ;;
+ *)
+ hwloc_pid_t=pid_t
+ AC_CHECK_TYPES([pthread_t], [hwloc_thread_t=pthread_t], [:], [[#include <pthread.h>]])
+ ;;
+ esac
+ AC_DEFINE_UNQUOTED(hwloc_pid_t, $hwloc_pid_t, [Define this to the process ID type])
+ if test "x$hwloc_thread_t" != "x" ; then
+ AC_DEFINE_UNQUOTED(hwloc_thread_t, $hwloc_thread_t, [Define this to the thread ID type])
+ fi
+
+ _HWLOC_CHECK_DECL([sched_setaffinity], [
+ AC_MSG_CHECKING([for old prototype of sched_setaffinity])
+ AC_COMPILE_IFELSE(
+ AC_LANG_PROGRAM([[
+ #define _GNU_SOURCE
+ #include <sched.h>
+ static unsigned long mask;
+ ]], [[ sched_setaffinity(0, (void*) &mask);
+ ]]),
+ AC_DEFINE([HWLOC_HAVE_OLD_SCHED_SETAFFINITY], [1], [Define to 1 if glibc provides the old prototype of sched_setaffinity()])
+ AC_MSG_RESULT([yes]),
+ AC_MSG_RESULT([no])
+ )
+ ], , [[
+#define _GNU_SOURCE
+#include <sched.h>
+]])
+
+ AC_MSG_CHECKING([for working CPU_SET])
+ AC_LINK_IFELSE(
+ AC_LANG_PROGRAM([[
+ #include <sched.h>
+ cpu_set_t set;
+ ]], [[ CPU_ZERO(&set); CPU_SET(0, &set);
+ ]]),
+ AC_DEFINE([HWLOC_HAVE_CPU_SET], [1], [Define to 1 if the CPU_SET macro works])
+ AC_MSG_RESULT([yes]),
+ AC_MSG_RESULT([no])
+ )
+
+ AC_MSG_CHECKING([for working CPU_SET_S])
+ AC_LINK_IFELSE(
+ AC_LANG_PROGRAM([[
+ #include <sched.h>
+ cpu_set_t *set;
+ ]], [[
+ set = CPU_ALLOC(1024);
+ CPU_ZERO_S(CPU_ALLOC_SIZE(1024), set);
+ CPU_SET_S(CPU_ALLOC_SIZE(1024), 0, set);
+ CPU_FREE(set);
+ ]]),
+ AC_DEFINE([HWLOC_HAVE_CPU_SET_S], [1], [Define to 1 if the CPU_SET_S macro works])
+ AC_MSG_RESULT([yes]),
+ AC_MSG_RESULT([no])
+ )
+
+ # check for kerrighed, but don't abort if not found
+ HWLOC_PKG_CHECK_MODULES([KERRIGHED], [kerrighed >= 2.0], [], [:])
+
+ AC_PATH_PROGS([HWLOC_MS_LIB], [lib])
+ AC_ARG_VAR([HWLOC_MS_LIB], [Path to Microsoft's Visual Studio `lib' tool])
+
+ AC_PATH_PROG([BASH], [bash])
+
+ AC_CHECK_FUNCS([ffs], [
+ _HWLOC_CHECK_DECL([ffs],[
+ AC_DEFINE([HWLOC_HAVE_DECL_FFS], [1], [Define to 1 if function `ffs' is declared by system headers])
+ ])
+ AC_DEFINE([HWLOC_HAVE_FFS], [1], [Define to 1 if you have the `ffs' function.])
+ ])
+ AC_CHECK_FUNCS([ffsl], [
+ _HWLOC_CHECK_DECL([ffsl],[
+ AC_DEFINE([HWLOC_HAVE_DECL_FFSL], [1], [Define to 1 if function `ffsl' is declared by system headers])
+ ])
+ AC_DEFINE([HWLOC_HAVE_FFSL], [1], [Define to 1 if you have the `ffsl' function.])
+ ])
+
+ AC_CHECK_FUNCS([fls], [
+ _HWLOC_CHECK_DECL([fls],[
+ AC_DEFINE([HWLOC_HAVE_DECL_FLS], [1], [Define to 1 if function `fls' is declared by system headers])
+ ])
+ AC_DEFINE([HWLOC_HAVE_FLS], [1], [Define to 1 if you have the `fls' function.])
+ ])
+ AC_CHECK_FUNCS([flsl], [
+ _HWLOC_CHECK_DECL([flsl],[
+ AC_DEFINE([HWLOC_HAVE_DECL_FLSL], [1], [Define to 1 if function `flsl' is declared by system headers])
+ ])
+ AC_DEFINE([HWLOC_HAVE_FLSL], [1], [Define to 1 if you have the `flsl' function.])
+ ])
+
+ AC_CHECK_FUNCS([clz], [
+ _HWLOC_CHECK_DECL([clz],[
+ AC_DEFINE([HWLOC_HAVE_DECL_CLZ], [1], [Define to 1 if function `clz' is declared by system headers])
+ ])
+ AC_DEFINE([HWLOC_HAVE_CLZ], [1], [Define to 1 if you have the `clz' function.])
+ ])
+ AC_CHECK_FUNCS([clzl], [
+ _HWLOC_CHECK_DECL([clzl],[
+ AC_DEFINE([HWLOC_HAVE_DECL_CLZL], [1], [Define to 1 if function `clzl' is declared by system headers])
+ ])
+ AC_DEFINE([HWLOC_HAVE_CLZL], [1], [Define to 1 if you have the `clzl' function.])
+ ])
+
+ AC_CHECK_FUNCS([openat], [hwloc_have_openat=yes])
+
+ AC_CHECK_DECL([numa_bitmask_alloc], [hwloc_have_linux_libnuma=yes], [],
+ [#include <numa.h>])
+
+ AC_CHECK_HEADERS([pthread_np.h])
+ AC_CHECK_DECLS([pthread_setaffinity_np],,[:],[[
+ #include <pthread.h>
+ #ifdef HAVE_PTHREAD_NP_H
+ # include <pthread_np.h>
+ #endif
+ ]])
+ AC_CHECK_DECLS([pthread_getaffinity_np],,[:],[[
+ #include <pthread.h>
+ #ifdef HAVE_PTHREAD_NP_H
+ # include <pthread_np.h>
+ #endif
+ ]])
+ AC_CHECK_FUNC([sched_setaffinity], [hwloc_have_sched_setaffinity=yes])
+ AC_CHECK_HEADERS([sys/cpuset.h],,,[[#include <sys/param.h>]])
+
+ # Setup HWLOC's C, CPP, and LD flags
+ HWLOC_CFLAGS="$hwloc_CC_c99_flags $HWLOC_CFLAGS"
+ AC_SUBST(HWLOC_CFLAGS)
+ HWLOC_CPPFLAGS='-I$(HWLOC_top_srcdir)/include -I$(HWLOC_top_builddir)/include'
+ AC_SUBST(HWLOC_CPPFLAGS)
+ HWLOC_LDFLAGS='-L$(HWLOC_top_builddir)/src'
+ AC_SUBST(HWLOC_LDFLAGS)
+
+ # Set these values explicitly for embedded builds. Exporting
+ # these values through *_EMBEDDED_* values gives us the freedom to
+ # do something different someday if we ever need to.
+ HWLOC_EMBEDDED_CFLAGS=$HWLOC_CFLAGS
+ AC_SUBST(HWLOC_EMBEDDED_CFLAGS)
+ HWLOC_EMBEDDED_CPPFLAGS=$HWLOC_CPPFLAGS
+ AC_SUBST(HWLOC_EMBEDDED_CPPFLAGS)
+ HWLOC_EMBEDDED_LDADD='$(HWLOC_top_builddir)/src/libhwloc_embedded.la'
+ AC_SUBST(HWLOC_EMBEDDED_LDADD)
+
+ # Try to compile the cpuid inlines
+ AC_MSG_CHECKING([for cpuid])
+ old_CPPFLAGS="$CPPFLAGS"
+ CFLAGS="$CFLAGS -I$HWLOC_top_srcdir/include"
+ AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[
+ #include <stdio.h>
+ #include <private/cpuid.h>
+ ]], [[
+ if (hwloc_have_cpuid()) {
+ unsigned eax = 0, ebx, ecx = 0, edx;
+ hwloc_cpuid(&eax, &ebx, &ecx, &edx);
+ printf("highest cpuid %x\n", eax);
+ return 0;
+ }
+ ]]), [
+ AC_MSG_RESULT([yes])
+ AC_DEFINE(HWLOC_HAVE_CPUID, 1, [Define to 1 if you have cpuid])
+ hwloc_have_cpuid=yes
+ ], [
+ AC_MSG_RESULT([no])
+ ])
+ CPPFLAGS="$old_CPPFLAGS"
+
+ # Always generate these files
+ AC_CONFIG_FILES(
+ hwloc_config_prefix[Makefile]
+ hwloc_config_prefix[include/Makefile]
+ hwloc_config_prefix[src/Makefile ]
+ )
+
+ # Cleanup
+ unset hwloc_config_happy
+ AC_LANG_POP
+
+ # Success
+ $2
+])dnl
+
+#-----------------------------------------------------------------------
+
+# Specify the symbol prefix
+AC_DEFUN([HWLOC_SET_SYMBOL_PREFIX],[
+ hwloc_symbol_prefix_value=$1
+])dnl
+
+#-----------------------------------------------------------------------
+
+# This must be a standalone routine so that it can be called both by
+# HWLOC_INIT and an external caller (if HWLOC_INIT is not invoked).
+AC_DEFUN([HWLOC_DO_AM_CONDITIONALS],[
+ AS_IF([test "$hwloc_did_am_conditionals" != "yes"],[
+ AM_CONDITIONAL([HWLOC_BUILD_STANDALONE], [test "$hwloc_mode" = "standalone"])
+
+ AM_CONDITIONAL([HWLOC_HAVE_GCC], [test "x$GCC" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_MS_LIB], [test "x$HWLOC_MS_LIB" != "x"])
+ AM_CONDITIONAL([HWLOC_HAVE_OPENAT], [test "x$hwloc_have_openat" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_LINUX_LIBNUMA],
+ [test "x$hwloc_have_linux_libnuma" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_SCHED_SETAFFINITY],
+ [test "x$hwloc_have_sched_setaffinity" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_LIBIBVERBS],
+ [test "x$hwloc_have_libibverbs" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_CAIRO], [test "x$enable_cairo" != "xno"])
+ AM_CONDITIONAL([HWLOC_HAVE_XML], [test "x$enable_xml" != "xno"])
+
+ AM_CONDITIONAL([HWLOC_BUILD_DOXYGEN],
+ [test "x$hwloc_generate_doxs" = "xyes"])
+ AM_CONDITIONAL([HWLOC_BUILD_README],
+ [test "x$hwloc_generate_readme" = "xyes" -a \( "x$hwloc_install_doxs" = "xyes" -o "x$hwloc_generate_doxs" = "xyes" \) ])
+ AM_CONDITIONAL([HWLOC_INSTALL_DOXYGEN],
+ [test "x$hwloc_install_doxs" = "xyes"])
+
+ AM_CONDITIONAL([HWLOC_HAVE_LINUX], [test "x$hwloc_linux" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_IRIX], [test "x$hwloc_irix" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_DARWIN], [test "x$hwloc_darwin" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_FREEBSD], [test "x$hwloc_freebsd" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_SOLARIS], [test "x$hwloc_solaris" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_AIX], [test "x$hwloc_aix" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_OSF], [test "x$hwloc_osf" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_HPUX], [test "x$hwloc_hpux" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_WINDOWS], [test "x$hwloc_windows" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_MINGW32],
+ [test "x$hwloc_target_os" = "xmingw32"])
+
+ AM_CONDITIONAL([HWLOC_HAVE_X86_32], [test "x$hwloc_x86_32" = "xyes"])
+ AM_CONDITIONAL([HWLOC_HAVE_X86_64], [test "x$hwloc_x86_64" = "xyes"])
+ AM_CONDITIONAL([HWLOC_DOXYGEN_BROKEN_SHORT_NAMES], [test "$HWLOC_DOXYGEN_VERSION" = "1.6.2"])
+ AM_CONDITIONAL([HWLOC_HAVE_CPUID], [test "x$hwloc_have_cpuid" = "xyes"])
+ AM_CONDITIONAL([HWLOC_BUILD_UTILS], [test "$hwloc_build_utils" = "yes"])
+ AM_CONDITIONAL([HWLOC_BUILD_TESTS], [test "$hwloc_build_tests" = "yes"])
+ ])
+ hwloc_did_am_conditionals=yes
+])dnl
+
+#-----------------------------------------------------------------------
+
+AC_DEFUN([_HWLOC_CHECK_DIFF_U], [
AC_MSG_CHECKING([whether diff accepts -u])
if diff -u /dev/null /dev/null 2> /dev/null
then
@@ -28,3 +622,33 @@
AC_SUBST([HWLOC_DIFF_U])
AC_MSG_RESULT([$HWLOC_DIFF_U])
])
+
+#-----------------------------------------------------------------------
+
+dnl HWLOC_CHECK_DECL
+dnl
+dnl Check declaration of given function by trying to call it with an insane
+dnl number of arguments (10). Success means the compiler couldn't really check.
+AC_DEFUN([_HWLOC_CHECK_DECL], [
+ AC_MSG_CHECKING([whether function $1 is declared])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT([$4])],[$1(1,2,3,4,5,6,7,8,9,10);])],
+ [AC_MSG_RESULT([no])
+ $3],
+ [AC_MSG_RESULT([yes])
+ $2]
+ )
+])
+
+#-----------------------------------------------------------------------
+
+dnl HWLOC_CHECK_DECLS
+dnl
+dnl Same as HWLOCK_CHECK_DECL, but defines HAVE_DECL_foo to 1 or 0 depending on
+dnl the result.
+AC_DEFUN([_HWLOC_CHECK_DECLS], [
+ HWLOC_CHECK_DECL([$1], [ac_have_decl=1], [ac_have_decl=0], [$4])
+ AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_DECL_$1]), [$ac_have_decl],
+ [Define to 1 if you have the declaration of `$1', and to 0 if you don't])
+])
+
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_check_attributes.m4
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_check_attributes.m4 (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_check_attributes.m4 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,527 @@
+# This macro set originally copied from Open MPI:
+# Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
+# University Research and Technology
+# Corporation. All rights reserved.
+# Copyright (c) 2004-2005 The University of Tennessee and The University
+# of Tennessee Research Foundation. All rights
+# reserved.
+# Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
+# University of Stuttgart. All rights reserved.
+# Copyright (c) 2004-2005 The Regents of the University of California.
+# All rights reserved.
+# and renamed for hwloc:
+# Copyright (c) 2009 INRIA, Université Bordeaux 1
+# Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# - Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# - Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer listed
+# in this license in the documentation and/or other materials
+# provided with the distribution.
+#
+# - Neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# The copyright holders provide no reassurances that the source code
+# provided does not infringe any patent, copyright, or any other
+# intellectual property rights of third parties. The copyright holders
+# disclaim any liability to any recipient for claims brought against
+# recipient by any third party for infringement of that parties
+# intellectual property rights.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+#
+# Search the generated warnings for
+# keywords regarding skipping or ignoring certain attributes
+# Intel: ignore
+# Sun C++: skip
+#
+AC_DEFUN([_HWLOC_ATTRIBUTE_FAIL_SEARCH],[
+ AC_REQUIRE([AC_PROG_GREP])
+ if test -s conftest.err ; then
+ for i in ignore skip ; do
+ $GREP -iq $i conftest.err
+ if test "$?" = "0" ; then
+ hwloc_cv___attribute__[$1]=0
+ break;
+ fi
+ done
+ fi
+])
+
+#
+# HWLOC: Remove C++ compiler check. It can result in a circular
+# dependency in embedded situations.
+#
+# Check for one specific attribute by compiling with C
+# and possibly using a cross-check.
+#
+# If the cross-check is defined, a static function "usage" should be
+# defined, which is to be called from main (to circumvent warnings
+# regarding unused function in main file)
+# static int usage (int * argument);
+#
+# The last argument is for specific CFLAGS, that need to be set
+# for the compiler to generate a warning on the cross-check.
+# This may need adaption for future compilers / CFLAG-settings.
+#
+AC_DEFUN([_HWLOC_CHECK_SPECIFIC_ATTRIBUTE], [
+ AC_MSG_CHECKING([for __attribute__([$1])])
+ AC_CACHE_VAL(hwloc_cv___attribute__[$1], [
+ #
+ # Try to compile using the C compiler
+ #
+ AC_TRY_COMPILE([$2],[],
+ [
+ #
+ # In case we did succeed: Fine, but was this due to the
+ # attribute being ignored/skipped? Grep for IgNoRe/skip in conftest.err
+ # and if found, reset the hwloc_cv__attribute__var=0
+ #
+ hwloc_cv___attribute__[$1]=1
+ _HWLOC_ATTRIBUTE_FAIL_SEARCH([$1])
+ ],
+ [hwloc_cv___attribute__[$1]=0])
+
+ #
+ # If the attribute is supported by both compilers,
+ # try to recompile a *cross-check*, IFF defined.
+ #
+ if test '(' "$hwloc_cv___attribute__[$1]" = "1" -a "[$3]" != "" ')' ; then
+ ac_c_werror_flag_safe=$ac_c_werror_flag
+ ac_c_werror_flag="yes"
+ CFLAGS_safe=$CFLAGS
+ CFLAGS="$CFLAGS [$4]"
+
+ AC_TRY_COMPILE([$3],
+ [
+ int i=4711;
+ i=usage(&i);
+ ],
+ [hwloc_cv___attribute__[$1]=0],
+ [
+ #
+ # In case we did NOT succeed: Fine, but was this due to the
+ # attribute being ignored? Grep for IgNoRe in conftest.err
+ # and if found, reset the hwloc_cv__attribute__var=0
+ #
+ hwloc_cv___attribute__[$1]=1
+ _HWLOC_ATTRIBUTE_FAIL_SEARCH([$1])
+ ])
+
+ ac_c_werror_flag=$ac_c_werror_flag_safe
+ CFLAGS=$CFLAGS_safe
+ fi
+ ])
+
+ if test "$hwloc_cv___attribute__[$1]" = "1" ; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ fi
+])
+
+
+#
+# Test the availability of __attribute__ and with the help
+# of _HWLOC_CHECK_SPECIFIC_ATTRIBUTE for the support of
+# particular attributes. Compilers, that do not support an
+# attribute most often fail with a warning (when the warning
+# level is set).
+# The compilers output is parsed in _HWLOC_ATTRIBUTE_FAIL_SEARCH
+#
+# To add a new attributes __NAME__ add the
+# hwloc_cv___attribute__NAME
+# add a new check with _HWLOC_CHECK_SPECIFIC_ATTRIBUTE (possibly with a cross-check)
+# _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([name], [int foo (int arg) __attribute__ ((__name__));], [], [])
+# and define the corresponding
+# AC_DEFINE_UNQUOTED(_HWLOC_HAVE_ATTRIBUTE_NAME, [$hwloc_cv___attribute__NAME],
+# [Whether your compiler has __attribute__ NAME or not])
+# and decide on a correct macro (in opal/include/opal_config_bottom.h):
+# # define __opal_attribute_NAME(x) __attribute__(__NAME__)
+#
+# Please use the "__"-notation of the attribute in order not to
+# clash with predefined names or macros (e.g. const, which some compilers
+# do not like..)
+#
+
+
+AC_DEFUN([_HWLOC_CHECK_ATTRIBUTES], [
+ AC_MSG_CHECKING(for __attribute__)
+
+ AC_CACHE_VAL(hwloc_cv___attribute__, [
+ AC_TRY_COMPILE(
+ [#include <stdlib.h>
+ /* Check for the longest available __attribute__ (since gcc-2.3) */
+ struct foo {
+ char a;
+ int x[2] __attribute__ ((__packed__));
+ };
+ ],
+ [],
+ [hwloc_cv___attribute__=1],
+ [hwloc_cv___attribute__=0],
+ )
+
+ if test "$hwloc_cv___attribute__" = "1" ; then
+ AC_TRY_COMPILE(
+ [#include <stdlib.h>
+ /* Check for the longest available __attribute__ (since gcc-2.3) */
+ struct foo {
+ char a;
+ int x[2] __attribute__ ((__packed__));
+ };
+ ],
+ [],
+ [hwloc_cv___attribute__=1],
+ [hwloc_cv___attribute__=0],
+ )
+ fi
+ ])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE, [$hwloc_cv___attribute__],
+ [Whether your compiler has __attribute__ or not])
+
+#
+# Now that we know the compiler support __attribute__ let's check which kind of
+# attributed are supported.
+#
+ if test "$hwloc_cv___attribute__" = "0" ; then
+ AC_MSG_RESULT([no])
+ hwloc_cv___attribute__aligned=0
+ hwloc_cv___attribute__always_inline=0
+ hwloc_cv___attribute__cold=0
+ hwloc_cv___attribute__const=0
+ hwloc_cv___attribute__deprecated=0
+ hwloc_cv___attribute__format=0
+ hwloc_cv___attribute__hot=0
+ hwloc_cv___attribute__malloc=0
+ hwloc_cv___attribute__may_alias=0
+ hwloc_cv___attribute__no_instrument_function=0
+ hwloc_cv___attribute__nonnull=0
+ hwloc_cv___attribute__noreturn=0
+ hwloc_cv___attribute__packed=0
+ hwloc_cv___attribute__pure=0
+ hwloc_cv___attribute__sentinel=0
+ hwloc_cv___attribute__unused=0
+ hwloc_cv___attribute__warn_unused_result=0
+ hwloc_cv___attribute__weak_alias=0
+ else
+ AC_MSG_RESULT([yes])
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([aligned],
+ [struct foo { char text[4]; } __attribute__ ((__aligned__(8)));],
+ [],
+ [])
+
+ #
+ # Ignored by PGI-6.2.5; -- recognized by output-parser
+ #
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([always_inline],
+ [int foo (int arg) __attribute__ ((__always_inline__));],
+ [],
+ [])
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([cold],
+ [
+ int foo(int arg1, int arg2) __attribute__ ((__cold__));
+ int foo(int arg1, int arg2) { return arg1 * arg2 + arg1; }
+ ],
+ [],
+ [])
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([const],
+ [
+ int foo(int arg1, int arg2) __attribute__ ((__const__));
+ int foo(int arg1, int arg2) { return arg1 * arg2 + arg1; }
+ ],
+ [],
+ [])
+
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([deprecated],
+ [
+ int foo(int arg1, int arg2) __attribute__ ((__deprecated__));
+ int foo(int arg1, int arg2) { return arg1 * arg2 + arg1; }
+ ],
+ [],
+ [])
+
+
+ HWLOC_ATTRIBUTE_CFLAGS=
+ case "$hwloc_c_vendor" in
+ gnu)
+ HWLOC_ATTRIBUTE_CFLAGS="-Wall"
+ ;;
+ intel)
+ # we want specifically the warning on format string conversion
+ HWLOC_ATTRIBUTE_CFLAGS="-we181"
+ ;;
+ esac
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([format],
+ [
+ int this_printf (void *my_object, const char *my_format, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
+ ],
+ [
+ static int usage (int * argument);
+ extern int this_printf (int arg1, const char *my_format, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
+
+ static int usage (int * argument) {
+ return this_printf (*argument, "%d", argument); /* This should produce a format warning */
+ }
+ /* The autoconf-generated main-function is int main(), which produces a warning by itself */
+ int main(void);
+ ],
+ [$HWLOC_ATTRIBUTE_CFLAGS])
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([hot],
+ [
+ int foo(int arg1, int arg2) __attribute__ ((__hot__));
+ int foo(int arg1, int arg2) { return arg1 * arg2 + arg1; }
+ ],
+ [],
+ [])
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([malloc],
+ [
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+ int * foo(int arg1) __attribute__ ((__malloc__));
+ int * foo(int arg1) { return (int*) malloc(arg1); }
+ ],
+ [],
+ [])
+
+
+ #
+ # Attribute may_alias: No suitable cross-check available, that works for non-supporting compilers
+ # Ignored by intel-9.1.045 -- turn off with -wd1292
+ # Ignored by PGI-6.2.5; ignore not detected due to missing cross-check
+ #
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([may_alias],
+ [int * p_value __attribute__ ((__may_alias__));],
+ [],
+ [])
+
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([no_instrument_function],
+ [int * foo(int arg1) __attribute__ ((__no_instrument_function__));],
+ [],
+ [])
+
+
+ #
+ # Attribute nonnull:
+ # Ignored by intel-compiler 9.1.045 -- recognized by cross-check
+ # Ignored by PGI-6.2.5 (pgCC) -- recognized by cross-check
+ #
+ HWLOC_ATTRIBUTE_CFLAGS=
+ case "$hwloc_c_vendor" in
+ gnu)
+ HWLOC_ATTRIBUTE_CFLAGS="-Wall"
+ ;;
+ intel)
+ # we do not want to get ignored attributes warnings, but rather real warnings
+ HWLOC_ATTRIBUTE_CFLAGS="-wd1292"
+ ;;
+ esac
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([nonnull],
+ [
+ int square(int *arg) __attribute__ ((__nonnull__));
+ int square(int *arg) { return *arg; }
+ ],
+ [
+ static int usage(int * argument);
+ int square(int * argument) __attribute__ ((__nonnull__));
+ int square(int * argument) { return (*argument) * (*argument); }
+
+ static int usage(int * argument) {
+ return square( ((void*)0) ); /* This should produce an argument must be nonnull warning */
+ }
+ /* The autoconf-generated main-function is int main(), which produces a warning by itself */
+ int main(void);
+ ],
+ [$HWLOC_ATTRIBUTE_CFLAGS])
+
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([noreturn],
+ [
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+ void fatal(int arg1) __attribute__ ((__noreturn__));
+ void fatal(int arg1) { exit(arg1); }
+ ],
+ [],
+ [])
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([packed],
+ [
+ struct foo {
+ char a;
+ int x[2] __attribute__ ((__packed__));
+ };
+ ],
+ [],
+ [])
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([pure],
+ [
+ int square(int arg) __attribute__ ((__pure__));
+ int square(int arg) { return arg * arg; }
+ ],
+ [],
+ [])
+
+ #
+ # Attribute sentinel:
+ # Ignored by the intel-9.1.045 -- recognized by cross-check
+ # intel-10.0beta works fine
+ # Ignored by PGI-6.2.5 (pgCC) -- recognized by output-parser and cross-check
+ # Ignored by pathcc-2.2.1 -- recognized by cross-check (through grep ignore)
+ #
+ HWLOC_ATTRIBUTE_CFLAGS=
+ case "$hwloc_c_vendor" in
+ gnu)
+ HWLOC_ATTRIBUTE_CFLAGS="-Wall"
+ ;;
+ intel)
+ # we do not want to get ignored attributes warnings
+ HWLOC_ATTRIBUTE_CFLAGS="-wd1292"
+ ;;
+ esac
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([sentinel],
+ [
+ int my_execlp(const char * file, const char *arg, ...) __attribute__ ((__sentinel__));
+ ],
+ [
+ static int usage(int * argument);
+ int my_execlp(const char * file, const char *arg, ...) __attribute__ ((__sentinel__));
+
+ static int usage(int * argument) {
+ void * last_arg_should_be_null = argument;
+ return my_execlp ("lala", "/home/there", last_arg_should_be_null); /* This should produce a warning */
+ }
+ /* The autoconf-generated main-function is int main(), which produces a warning by itself */
+ int main(void);
+ ],
+ [$HWLOC_ATTRIBUTE_CFLAGS])
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([unused],
+ [
+ int square(int arg1 __attribute__ ((__unused__)), int arg2);
+ int square(int arg1, int arg2) { return arg2; }
+ ],
+ [],
+ [])
+
+
+ #
+ # Attribute warn_unused_result:
+ # Ignored by the intel-compiler 9.1.045 -- recognized by cross-check
+ # Ignored by pathcc-2.2.1 -- recognized by cross-check (through grep ignore)
+ #
+ HWLOC_ATTRIBUTE_CFLAGS=
+ case "$hwloc_c_vendor" in
+ gnu)
+ HWLOC_ATTRIBUTE_CFLAGS="-Wall"
+ ;;
+ intel)
+ # we do not want to get ignored attributes warnings
+ HWLOC_ATTRIBUTE_CFLAGS="-wd1292"
+ ;;
+ esac
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([warn_unused_result],
+ [
+ int foo(int arg) __attribute__ ((__warn_unused_result__));
+ int foo(int arg) { return arg + 3; }
+ ],
+ [
+ static int usage(int * argument);
+ int foo(int arg) __attribute__ ((__warn_unused_result__));
+
+ int foo(int arg) { return arg + 3; }
+ static int usage(int * argument) {
+ foo (*argument); /* Should produce an unused result warning */
+ return 0;
+ }
+
+ /* The autoconf-generated main-function is int main(), which produces a warning by itself */
+ int main(void);
+ ],
+ [$HWLOC_ATTRIBUTE_CFLAGS])
+
+
+ _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([weak_alias],
+ [
+ int foo(int arg);
+ int foo(int arg) { return arg + 3; }
+ int foo2(int arg) __attribute__ ((__weak__, __alias__("foo")));
+ ],
+ [],
+ [])
+
+ fi
+
+ # Now that all the values are set, define them
+
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_ALIGNED, [$hwloc_cv___attribute__aligned],
+ [Whether your compiler has __attribute__ aligned or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_ALWAYS_INLINE, [$hwloc_cv___attribute__always_inline],
+ [Whether your compiler has __attribute__ always_inline or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_COLD, [$hwloc_cv___attribute__cold],
+ [Whether your compiler has __attribute__ cold or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_CONST, [$hwloc_cv___attribute__const],
+ [Whether your compiler has __attribute__ const or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_DEPRECATED, [$hwloc_cv___attribute__deprecated],
+ [Whether your compiler has __attribute__ deprecated or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_FORMAT, [$hwloc_cv___attribute__format],
+ [Whether your compiler has __attribute__ format or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_HOT, [$hwloc_cv___attribute__hot],
+ [Whether your compiler has __attribute__ hot or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_MALLOC, [$hwloc_cv___attribute__malloc],
+ [Whether your compiler has __attribute__ malloc or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS, [$hwloc_cv___attribute__may_alias],
+ [Whether your compiler has __attribute__ may_alias or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_NO_INSTRUMENT_FUNCTION, [$hwloc_cv___attribute__no_instrument_function],
+ [Whether your compiler has __attribute__ no_instrument_function or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_NONNULL, [$hwloc_cv___attribute__nonnull],
+ [Whether your compiler has __attribute__ nonnull or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_NORETURN, [$hwloc_cv___attribute__noreturn],
+ [Whether your compiler has __attribute__ noreturn or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_PACKED, [$hwloc_cv___attribute__packed],
+ [Whether your compiler has __attribute__ packed or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_PURE, [$hwloc_cv___attribute__pure],
+ [Whether your compiler has __attribute__ pure or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_SENTINEL, [$hwloc_cv___attribute__sentinel],
+ [Whether your compiler has __attribute__ sentinel or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_UNUSED, [$hwloc_cv___attribute__unused],
+ [Whether your compiler has __attribute__ unused or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT, [$hwloc_cv___attribute__warn_unused_result],
+ [Whether your compiler has __attribute__ warn unused result or not])
+ AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_WEAK_ALIAS, [$hwloc_cv___attribute__weak_alias],
+ [Whether your compiler has __attribute__ weak alias or not])
+])
+
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_check_visibility.m4
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_check_visibility.m4 (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_check_visibility.m4 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,110 @@
+# This macro set originally copied from Open MPI:
+# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+# University Research and Technology
+# Corporation. All rights reserved.
+# Copyright (c) 2004-2005 The University of Tennessee and The University
+# of Tennessee Research Foundation. All rights
+# reserved.
+# Copyright (c) 2004-2007 High Performance Computing Center Stuttgart,
+# University of Stuttgart. All rights reserved.
+# Copyright (c) 2004-2005 The Regents of the University of California.
+# All rights reserved.
+# Copyright (c) 2006-2007 Cisco Systems, Inc. All rights reserved.
+# and renamed for hwloc:
+# Copyright (c) 2009 INRIA, Université Bordeaux 1
+# Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# - Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# - Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer listed
+# in this license in the documentation and/or other materials
+# provided with the distribution.
+#
+# - Neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# The copyright holders provide no reassurances that the source code
+# provided does not infringe any patent, copyright, or any other
+# intellectual property rights of third parties. The copyright holders
+# disclaim any liability to any recipient for claims brought against
+# recipient by any third party for infringement of that parties
+# intellectual property rights.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+
+# _HWLOC_CHECK_VISIBILITY
+# --------------------------------------------------------
+AC_DEFUN([_HWLOC_CHECK_VISIBILITY],[
+ AC_REQUIRE([AC_PROG_GREP])
+
+ # Check if the compiler has support for visibility, like some versions of gcc, icc.
+ AC_ARG_ENABLE(visibility,
+ AC_HELP_STRING([--enable-visibility],
+ [enable visibility feature of certain compilers/linkers (default: enabled)]))
+ if test "$enable_visibility" = "no"; then
+ AC_MSG_CHECKING([enable symbol visibility])
+ AC_MSG_RESULT([no])
+ have_visibility=0
+ else
+ CFLAGS_orig="$CFLAGS"
+ CFLAGS="$CFLAGS_orig -fvisibility=hidden"
+ hwloc_add=
+ AC_CACHE_CHECK([if $CC supports -fvisibility],
+ [hwloc_cv_cc_fvisibility],
+ [AC_TRY_LINK([
+ #include <stdio.h>
+ __attribute__((visibility("default"))) int foo;
+ void bar(void) { fprintf(stderr, "bar\n"); };
+ ],[],
+ [if test -s conftest.err ; then
+ $GREP -iq "visibility" conftest.err
+ if test "$?" = "0" ; then
+ hwloc_cv_cc_fvisibility="no"
+ else
+ hwloc_cv_cc_fvisibility="yes"
+ fi
+ else
+ hwloc_cv_cc_fvisibility="yes"
+ fi],
+ [hwloc_cv_cc_fvisibility="no"])
+ ])
+
+ if test "$hwloc_cv_cc_fvisibility" = "yes" ; then
+ hwloc_add=" -fvisibility=hidden"
+ have_visibility=1
+ AC_MSG_CHECKING([enable symbol visibility])
+ AC_MSG_RESULT([yes])
+ elif test "$enable_visibility" = "yes"; then
+ AC_MSG_ERROR([Symbol visibility support requested but compiler does not seem to support it. Aborting])
+ else
+ AC_MSG_CHECKING([enable symbol visibility])
+ AC_MSG_RESULT([no])
+ have_visibility=0
+ fi
+ CFLAGS=$CFLAGS_orig
+ HWLOC_VISIBILITY_CFLAGS=$hwloc_add
+ unset hwloc_add
+ fi
+ AC_DEFINE_UNQUOTED([HWLOC_C_HAVE_VISIBILITY], [$have_visibility],
+ [Whether C compiler supports -fvisibility])
+
+])
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_internal.m4
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_internal.m4 (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_internal.m4 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,289 @@
+dnl -*- Autoconf -*-
+dnl
+dnl Copyright 2009 INRIA, Université Bordeaux 1
+dnl Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
+dnl University Research and Technology
+dnl Corporation. All rights reserved.
+dnl Copyright (c) 2004-2005 The Regents of the University of California.
+dnl All rights reserved.
+dnl Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
+dnl University of Stuttgart. All rights reserved.
+dnl Copyright © 2006-2010 Cisco Systems, Inc. All rights reserved.
+
+#-----------------------------------------------------------------------
+
+# Probably only ever invoked by hwloc's configure.ac
+AC_DEFUN([HWLOC_BUILD_STANDALONE],[
+ hwloc_mode=standalone
+])dnl
+
+#-----------------------------------------------------------------------
+
+# Probably only ever invoked by hwloc's configure.ac
+AC_DEFUN([HWLOC_DEFINE_ARGS],[
+ # Embedded mode, or standalone?
+ AC_ARG_ENABLE([embedded-mode],
+ AC_HELP_STRING([--enable-embedded-mode],
+ [Using --enable-embedded-mode puts the HWLOC into "embedded" mode. The default is --disable-embedded-mode, meaning that the HWLOC is in "standalone" mode.]))
+
+ # Change the symbol prefix?
+ AC_ARG_WITH([hwloc-symbol-prefix],
+ AC_HELP_STRING([--with-hwloc-symbol-prefix=STRING],
+ [STRING can be any valid C symbol name. It will be prefixed to all public HWLOC symbols. Default: "hwloc_"]))
+
+ # Debug mode?
+ AC_ARG_ENABLE([debug],
+ AC_HELP_STRING([--enable-debug],
+ [Using --enable-debug enables various hwloc maintainer-level debugging controls. This option is not recomended for end users.]))
+
+ # Doxygen?
+ AC_ARG_ENABLE([doxygen],
+ [AC_HELP_STRING([--enable-doxygen],
+ [enable support for building Doxygen documentation (note that this option is ONLY relevant in developer builds; Doxygen documentation is pre-built for tarball builds and this option is therefore ignored)])])
+
+ # Picky?
+ AC_ARG_ENABLE(picky,
+ AC_HELP_STRING([--disable-picky],
+ [When in developer checkouts of hwloc and compiling with gcc, the default is to enable maximum compiler pickyness. Using --disable-picky or --enable-picky overrides any default setting]))
+
+ # Cairo?
+ AC_ARG_ENABLE([cairo],
+ AS_HELP_STRING([--disable-cairo],
+ [Disable the Cairo back-end of hwloc's lstopo command]))
+
+ # XML?
+ AC_ARG_ENABLE([xml],
+ AS_HELP_STRING([--disable-xml],
+ [Disable the XML back-end of hwloc's lstopo command]))
+])dnl
+
+#-----------------------------------------------------------------------
+
+dnl We only build documentation if this is a developer checkout.
+dnl Distribution tarballs just install pre-built docuemntation that was
+dnl included in the tarball.
+
+# Probably only ever invoked by hwloc's configure.ac
+AC_DEFUN([HWLOC_SETUP_DOCS],[
+ cat <<EOF
+
+###
+### Configuring hwloc documentation
+###
+EOF
+
+ AC_MSG_CHECKING([if this is a developer build])
+ AS_IF([test ! -d "$srcdir/.svn" -a ! -d "$srcdir/.hg" -a ! -d "$srcdir/.git"],
+ [AC_MSG_RESULT([no (doxygen generation is optional)])],
+ [AC_MSG_RESULT([yes])])
+
+ # Generating the doxygen output requires a few tools. If we
+ # don't have all of them, refuse the build the docs.
+ AC_ARG_VAR([DOXYGEN], [Location of the doxygen program (required for building the hwloc doxygen documentation)])
+ AC_PATH_TOOL([DOXYGEN], [doxygen])
+ HWLOC_DOXYGEN_VERSION=`doxygen --version 2> /dev/null`
+
+ AC_ARG_VAR([PDFLATEX], [Location of the pdflatex program (required for building the hwloc doxygen documentation)])
+ AC_PATH_TOOL([PDFLATEX], [pdflatex])
+
+ AC_ARG_VAR([MAKEINDEX], [Location of the makeindex program (required for building the hwloc doxygen documentation)])
+ AC_PATH_TOOL([MAKEINDEX], [makeindex])
+
+ AC_ARG_VAR([FIG2DEV], [Location of the fig2dev program (required for building the hwloc doxygen documentation)])
+ AC_PATH_TOOL([FIG2DEV], [fig2dev])
+
+ AC_MSG_CHECKING([if can build doxygen docs])
+ AS_IF([test "x$DOXYGEN" != "x" -a "x$PDFLATEX" != "x" -a "x$MAKEINDEX" != "x" -a "x$FIG2DEV" != "x"],
+ [hwloc_generate_doxs=yes], [hwloc_generate_doxs=no])
+ AC_MSG_RESULT([$hwloc_generate_doxs])
+
+ # Making the top-level README requires w3m or lynx.
+ AC_ARG_VAR([W3M], [Location of the w3m program (required to building the top-level hwloc README file)])
+ AC_PATH_TOOL([W3M], [w3m])
+ AC_ARG_VAR([LYNX], [Location of the lynx program (required to building the top-level hwloc README file)])
+ AC_PATH_TOOL([LYNX], [lynx])
+
+ AC_MSG_CHECKING([if can build top-level README])
+ AS_IF([test "x$W3M" != "x"],
+ [hwloc_generate_readme=yes
+ HWLOC_W3_GENERATOR=$W3M],
+ [AS_IF([test "x$LYNX" != "x"],
+ [hwloc_generate_readme=yes
+ HWLOC_W3_GENERATOR="$LYNX -dump -nolist"],
+ [hwloc_generate_readme=no])])
+ AC_SUBST(HWLOC_W3_GENERATOR)
+ AC_MSG_RESULT([$hwloc_generate_readme])
+
+ # If any one of the above tools is missing, we will refuse to make dist.
+ AC_MSG_CHECKING([if will build doxygen docs])
+ AS_IF([test "x$hwloc_generate_doxs" = "xyes" -a "x$enable_doxygen" != "xno"],
+ [], [hwloc_generate_doxs=no])
+ AC_MSG_RESULT([$hwloc_generate_doxs])
+
+ # See if we want to install the doxygen docs
+ AC_MSG_CHECKING([if will install doxygen docs])
+ AS_IF([test "x$hwloc_generate_doxs" = "xyes" -o \
+ -f "$srcdir/doc/doxygen-doc/man/man3/hwloc_distribute.3" -a \
+ -f "$srcdir/doc/doxygen-doc/hwloc-a4.pdf" -a \
+ -f "$srcdir/doc/doxygen-doc/hwloc-letter.pdf"],
+ [hwloc_install_doxs=yes],
+ [hwloc_install_doxs=no])
+ AC_MSG_RESULT([$hwloc_install_doxs])
+
+ # For the common developer case, if we're in a developer checkout and
+ # using the GNU compilers, turn on maximum warnings unless
+ # specifically disabled by the user.
+ AC_MSG_CHECKING([whether to enable "picky" compiler mode])
+ hwloc_want_picky=0
+ AS_IF([test "$GCC" = "yes"],
+ [AS_IF([test -d "$srcdir/.svn" -o -d "$srcdir/.hg"],
+ [hwloc_want_picky=1])])
+ if test "$enable_picky" = "yes"; then
+ if test "$GCC" = "yes"; then
+ AC_MSG_RESULT([yes])
+ hwloc_want_picky=1
+ else
+ AC_MSG_RESULT([no])
+ AC_MSG_WARN([Warning: --enable-picky used, but is currently only defined for the GCC compiler set -- automatically disabled])
+ hwloc_want_picky=0
+ fi
+ elif test "$enable_picky" = "no"; then
+ AC_MSG_RESULT([no])
+ hwloc_want_picky=0
+ else
+ if test "$hwloc_want_picky" = 1; then
+ AC_MSG_RESULT([yes (default)])
+ else
+ AC_MSG_RESULT([no (default)])
+ fi
+ fi
+ if test "$hwloc_want_picky" = 1; then
+ add="-Wall -Wunused-parameter -Wundef -Wno-long-long -Wsign-compare"
+ add="$add -Wmissing-prototypes -Wstrict-prototypes"
+ add="$add -Wcomment -pedantic"
+
+ CFLAGS="$CFLAGS $add"
+ fi
+
+ # Generate some files for the docs
+ AC_CONFIG_FILES(
+ hwloc_config_prefix[doc/Makefile]
+ hwloc_config_prefix[doc/doxygen-config.cfg])
+])
+
+#-----------------------------------------------------------------------
+
+# Probably only ever invoked by hwloc's configure.ac
+AC_DEFUN([HWLOC_SETUP_UTILS],[
+ cat <<EOF
+
+###
+### Configuring hwloc command line utilities
+###
+EOF
+
+ hwloc_build_utils=yes
+
+ # Cairo support
+ if test "x$enable_cairo" != "xno"; then
+ HWLOC_PKG_CHECK_MODULES([CAIRO], [cairo], [:], [enable_cairo="no"])
+ if test "x$enable_cairo" != "xno"; then
+ AC_PATH_XTRA
+ CFLAGS_save=$CFLAGS
+ LIBS_save=$LIBS
+
+ CFLAGS="$CFLAGS $X_CFLAGS"
+ LIBS="$LIBS $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS"
+ AC_CHECK_HEADERS([X11/Xlib.h], [
+ AC_CHECK_HEADERS([X11/Xutil.h X11/keysym.h], [
+ AC_CHECK_LIB([X11], [XOpenDisplay], [
+ enable_X11=yes
+ AC_SUBST([HWLOC_X11_LIBS], ["-lX11"])
+ AC_DEFINE([HWLOC_HAVE_X11], [1], [Define to 1 if X11 libraries are available.])
+ ])]
+ )],,
+ [[#include <X11/Xlib.h>]]
+ )
+ if test "x$enable_X11" != "xyes"; then
+ AC_MSG_WARN([X11 headers not found, Cairo/X11 back-end disabled])
+ fi
+
+ CFLAGS=$CFLAGS_save
+ LIBS=$LIBS_save
+ fi
+ fi
+
+ if test "x$enable_cairo" != "xno"; then
+ AC_DEFINE([HWLOC_HAVE_CAIRO], [1], [Define to 1 if you have the `cairo' library.])
+ fi
+
+ # XML support
+
+ if test "x$enable_xml" != "xno"; then
+ HWLOC_PKG_CHECK_MODULES([XML], [libxml-2.0], [:], [enable_xml="no"])
+ fi
+
+ if test "x$enable_xml" != "xno"; then
+ HWLOC_REQUIRES="libxml-2.0 $HWLOC_REQUIRES"
+ AC_DEFINE([HWLOC_HAVE_XML], [1], [Define to 1 if you have the `xml' library.])
+ AC_SUBST([HWLOC_HAVE_XML], [1])
+ AC_CHECK_PROGS(XMLLINT, [xmllint])
+ else
+ AC_SUBST([HWLOC_HAVE_XML], [0])
+ fi
+ AC_SUBST(HWLOC_REQUIRES)
+ HWLOC_CFLAGS="$HWLOC_CFLAGS $HWLOC_XML_CFLAGS"
+
+ # Only generate this if we're building the utilities
+ AC_CONFIG_FILES(
+ hwloc_config_prefix[utils/Makefile]
+ hwloc_config_prefix[hwloc.pc])
+])dnl
+
+#-----------------------------------------------------------------------
+
+# Probably only ever invoked by hwloc's configure.ac
+AC_DEFUN([HWLOC_SETUP_TESTS],[
+ cat <<EOF
+
+###
+### Configuring hwloc tests
+###
+EOF
+
+ hwloc_build_tests=yes
+
+ # Only generate these files if we're making the tests
+ AC_CONFIG_FILES(
+ hwloc_config_prefix[tests/Makefile ]
+ hwloc_config_prefix[tests/linux/Makefile]
+ hwloc_config_prefix[tests/xml/Makefile]
+ hwloc_config_prefix[tests/ports/Makefile]
+ hwloc_config_prefix[tests/linux/gather-topology.sh]
+ hwloc_config_prefix[tests/linux/test-topology.sh]
+ hwloc_config_prefix[tests/xml/test-topology.sh]
+ hwloc_config_prefix[utils/test-hwloc-distrib.sh])
+
+ AC_CONFIG_COMMANDS([chmoding-scripts], [chmod +x ]hwloc_config_prefix[tests/linux/test-topology.sh ]hwloc_config_prefix[tests/xml/test-topology.sh ]hwloc_config_prefix[tests/linux/gather-topology.sh ]hwloc_config_prefix[utils/test-hwloc-distrib.sh])
+
+ # These links are only needed in standalone mode. It would
+ # be nice to m4 foreach this somehow, but whenever I tried
+ # it, I got obscure "invalid tag" errors from
+ # AC_CONFIG_LINKS. :-\ Since these tests are only run when
+ # built in standalone mode, only generate them in
+ # standalone mode.
+ AC_CONFIG_LINKS(
+ hwloc_config_prefix[tests/ports/topology.c]:hwloc_config_prefix[src/topology.c]
+ hwloc_config_prefix[tests/ports/traversal.c]:hwloc_config_prefix[src/traversal.c]
+ hwloc_config_prefix[tests/ports/topology-synthetic.c]:hwloc_config_prefix[src/topology-synthetic.c]
+ hwloc_config_prefix[tests/ports/topology-solaris.c]:hwloc_config_prefix[src/topology-solaris.c]
+ hwloc_config_prefix[tests/ports/topology-aix.c]:hwloc_config_prefix[src/topology-aix.c]
+ hwloc_config_prefix[tests/ports/topology-osf.c]:hwloc_config_prefix[src/topology-osf.c]
+ hwloc_config_prefix[tests/ports/topology-windows.c]:hwloc_config_prefix[src/topology-windows.c]
+ hwloc_config_prefix[tests/ports/topology-darwin.c]:hwloc_config_prefix[src/topology-darwin.c]
+ hwloc_config_prefix[tests/ports/topology-freebsd.c]:hwloc_config_prefix[src/topology-freebsd.c]
+ hwloc_config_prefix[tests/ports/topology-hpux.c]:hwloc_config_prefix[src/topology-hpux.c])
+ ])
+
+ echo done setting up tests
+])dnl
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_pkg.m4
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_pkg.m4 (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/hwloc_pkg.m4 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,164 @@
+# Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
+#
+# hwloc modification to the following PKG_* macros -- add HWLOC_
+# prefix to make it "safe" to embed these macros in other packages.
+# Originally copied from the pkg-config package; see copyright and
+# license below.
+
+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+#
+# Copyright © 2004 Scott James Remnant <scott at netsplit.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# HWLOC_PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([HWLOC_PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^HWLOC_PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([HWLOC_PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_HWLOC_PKG_CONFIG_set" != "xset"; then
+ AC_PATH_TOOL([HWLOC_PKG_CONFIG], [pkg-config])
+fi
+if test -n "$HWLOC_PKG_CONFIG"; then
+ HWLOC_pkg_min_version=m4_default([$1], [0.9.0])
+ AC_MSG_CHECKING([pkg-config is at least version $HWLOC_pkg_min_version])
+ if $HWLOC_PKG_CONFIG --atleast-pkgconfig-version $HWLOC_pkg_min_version; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ HWLOC_PKG_CONFIG=""
+ fi
+
+fi[]dnl
+])# HWLOC_PKG_PROG_PKG_CONFIG
+
+# HWLOC_PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists. Similar
+# to HWLOC_PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to HWLOC_PKG_CHECK_MODULES, make sure that the first instance of
+# this or HWLOC_PKG_CHECK_MODULES is called, or make sure to call
+# HWLOC_PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([HWLOC_PKG_CHECK_EXISTS],
+[AC_REQUIRE([HWLOC_PKG_PROG_PKG_CONFIG])dnl
+if test -n "$HWLOC_PKG_CONFIG" && \
+ AC_RUN_LOG([$HWLOC_PKG_CONFIG --exists --silence-errors "$1"]); then
+ m4_ifval([$2], [$2], [:])
+ m4_ifvaln([$3], [else
+ $3])dnl
+fi])
+
+
+# _HWLOC_PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_HWLOC_PKG_CONFIG],
+[if test -n "$HWLOC_PKG_CONFIG"; then
+ if test -n "$$1"; then
+ HWLOC_pkg_cv_[]$1="$$1"
+ else
+ HWLOC_PKG_CHECK_EXISTS([$3],
+ [HWLOC_pkg_cv_[]$1=`$HWLOC_PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+ [HWLOC_pkg_failed=yes])
+ fi
+else
+ HWLOC_pkg_failed=untried
+fi[]
+])# _HWLOC_PKG_CONFIG
+
+# _HWLOC_PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_HWLOC_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([HWLOC_PKG_PROG_PKG_CONFIG])
+if $HWLOC_PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ HWLOC_pkg_short_errors_supported=yes
+else
+ HWLOC_pkg_short_errors_supported=no
+fi[]dnl
+])# _HWLOC_PKG_SHORT_ERRORS_SUPPORTED
+
+
+# HWLOC_PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# HWLOC_PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to HWLOC_PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([HWLOC_PKG_CHECK_MODULES],[
+ AC_REQUIRE([HWLOC_PKG_PROG_PKG_CONFIG])dnl
+ AC_ARG_VAR([HWLOC_]$1[_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+ AC_ARG_VAR([HWLOC_]$1[_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+ HWLOC_pkg_failed=no
+ AC_MSG_CHECKING([for $1])
+
+ _HWLOC_PKG_CONFIG([HWLOC_][$1][_CFLAGS], [cflags], [$2])
+ _HWLOC_PKG_CONFIG([HWLOC_][$1][_LIBS], [libs], [$2])
+
+ m4_define([_HWLOC_PKG_TEXT], [Alternatively, you may set the environment variables HWLOC_[]$1[]_CFLAGS
+and HWLOC_[]$1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+ if test $HWLOC_pkg_failed = yes; then
+ _HWLOC_PKG_SHORT_ERRORS_SUPPORTED
+ if test $HWLOC_pkg_short_errors_supported = yes; then
+ HWLOC_[]$1[]_PKG_ERRORS=`$HWLOC_PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2" 2>&1`
+ else
+ HWLOC_[]$1[]_PKG_ERRORS=`$HWLOC_PKG_CONFIG --errors-to-stdout --print-errors "$2" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$HWLOC_[]$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+ ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$HWLOCC_$1_PKG_ERRORS
+
+Consider adjusting the HWLOC_PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_HWLOC_PKG_TEXT
+])],
+ [AC_MSG_RESULT([no])
+ $4])
+ elif test $HWLOC_pkg_failed = untried; then
+ ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the HWLOC_PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_HWLOC_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
+ [$4])
+ else
+ HWLOC_[]$1[]_CFLAGS=$HWLOC_pkg_cv_HWLOC_[]$1[]_CFLAGS
+ HWLOC_[]$1[]_LIBS=$HWLOC_pkg_cv_HWLOC_[]$1[]_LIBS
+ AC_MSG_RESULT([yes])
+ ifelse([$3], , :, [$3])
+ fi[]dnl
+])# HWLOC_PKG_CHECK_MODULES
Deleted: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/pkg.m4
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/pkg.m4 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/config/pkg.m4 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,157 +0,0 @@
-# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
-#
-# Copyright © 2004 Scott James Remnant <scott at netsplit.com>.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# PKG_PROG_PKG_CONFIG([MIN-VERSION])
-# ----------------------------------
-AC_DEFUN([PKG_PROG_PKG_CONFIG],
-[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
-m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
-AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
-if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
- AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
-fi
-if test -n "$PKG_CONFIG"; then
- _pkg_min_version=m4_default([$1], [0.9.0])
- AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
- if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
- AC_MSG_RESULT([yes])
- else
- AC_MSG_RESULT([no])
- PKG_CONFIG=""
- fi
-
-fi[]dnl
-])# PKG_PROG_PKG_CONFIG
-
-# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
-#
-# Check to see whether a particular set of modules exists. Similar
-# to PKG_CHECK_MODULES(), but does not set variables or print errors.
-#
-#
-# Similar to PKG_CHECK_MODULES, make sure that the first instance of
-# this or PKG_CHECK_MODULES is called, or make sure to call
-# PKG_CHECK_EXISTS manually
-# --------------------------------------------------------------
-AC_DEFUN([PKG_CHECK_EXISTS],
-[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
-if test -n "$PKG_CONFIG" && \
- AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
- m4_ifval([$2], [$2], [:])
-m4_ifvaln([$3], [else
- $3])dnl
-fi])
-
-
-# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
-# ---------------------------------------------
-m4_define([_PKG_CONFIG],
-[if test -n "$PKG_CONFIG"; then
- if test -n "$$1"; then
- pkg_cv_[]$1="$$1"
- else
- PKG_CHECK_EXISTS([$3],
- [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
- [pkg_failed=yes])
- fi
-else
- pkg_failed=untried
-fi[]dnl
-])# _PKG_CONFIG
-
-# _PKG_SHORT_ERRORS_SUPPORTED
-# -----------------------------
-AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
-[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
- _pkg_short_errors_supported=yes
-else
- _pkg_short_errors_supported=no
-fi[]dnl
-])# _PKG_SHORT_ERRORS_SUPPORTED
-
-
-# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
-# [ACTION-IF-NOT-FOUND])
-#
-#
-# Note that if there is a possibility the first call to
-# PKG_CHECK_MODULES might not happen, you should be sure to include an
-# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
-#
-#
-# --------------------------------------------------------------
-AC_DEFUN([PKG_CHECK_MODULES],
-[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
-AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
-AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
-
-pkg_failed=no
-AC_MSG_CHECKING([for $1])
-
-_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
-_PKG_CONFIG([$1][_LIBS], [libs], [$2])
-
-m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
-and $1[]_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.])
-
-if test $pkg_failed = yes; then
- _PKG_SHORT_ERRORS_SUPPORTED
- if test $_pkg_short_errors_supported = yes; then
- $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
- else
- $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
- fi
- # Put the nasty error message in config.log where it belongs
- echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
-
- ifelse([$4], , [AC_MSG_ERROR(dnl
-[Package requirements ($2) were not met:
-
-$$1_PKG_ERRORS
-
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
-
-_PKG_TEXT
-])],
- [AC_MSG_RESULT([no])
- $4])
-elif test $pkg_failed = untried; then
- ifelse([$4], , [AC_MSG_FAILURE(dnl
-[The pkg-config script could not be found or is too old. Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-_PKG_TEXT
-
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
- [$4])
-else
- $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
- $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
- AC_MSG_RESULT([yes])
- ifelse([$3], , :, [$3])
-fi[]dnl
-])# PKG_CHECK_MODULES
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/configure.ac
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/configure.ac 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/configure.ac 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,32 +1,47 @@
-# -*- autoconf -*-
+# -*- shell-script -*-
#
-# Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
-# Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+# Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
#
# See COPYING in top-level directory.
+#
+# Additional copyrights may follow
+#
+# $HEADER$
#
-#
-# Initialize autostuff
-#
-
-AC_PREREQ([2.63])
AC_INIT([hwloc],
[m4_normalize(esyscmd([config/hwloc_get_version.sh VERSION --base]))],
[http://www.open-mpi.org/community/help/], [hwloc])
-AC_CONFIG_AUX_DIR([config])
-AC_CONFIG_MACRO_DIR([config])
-AC_CANONICAL_SYSTEM
-AC_CONFIG_SRCDIR([src/topology.c])
+AC_PREREQ(2.63)
+AC_CONFIG_AUX_DIR(./config)
+# Note that this directory must *exactly* match what was specified via
+# -I in ACLOCAL_AMFLAGS in the top-level Makefile.am.
+AC_CONFIG_MACRO_DIR(./config)
-AM_INIT_AUTOMAKE([1.10 dist-bzip2 foreign tar-ustar -Wall -Werror])
+cat <<EOF
-# Make configure depend on the VERSION file, since it's used in AC_INIT
+###
+### Configuring hwloc distribution tarball
+### Startup tests
+###
+EOF
+# This must be before AM_INIT_AUTOMAKE
+AC_CANONICAL_TARGET
+
+# Init automake
+AM_INIT_AUTOMAKE([1.10 dist-bzip2 subdir-objects foreign tar-ustar -Wall -Werror])
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
+# Libtool2 is needed
+m4_ifdef([LT_PREREQ], [],
+ [m4_fatal([libtool version 2.2.6 or higher is required], [63])])
+
+# Make configure depend on the VERSION file, since it's used in AC_INIT
AC_SUBST([CONFIGURE_DEPENDENCIES], ['$(top_srcdir)/VERSION'])
# Get the version of hwloc that we are installing
-
AC_MSG_CHECKING([for hwloc version])
HWLOC_VERSION="`$srcdir/config/hwloc_get_version.sh $srcdir/VERSION`"
HWLOC_MAJOR_VERSION="`$srcdir/config/hwloc_get_version.sh $srcdir/VERSION --major`"
@@ -63,7 +78,6 @@
AC_SUBST([libhwloc_so_version])
# Setup the header file
-
AH_TOP([/* -*- c -*-
*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
@@ -85,432 +99,54 @@
#endif /* HWLOC_CONFIGURE_H */
])
-# We only build documentation if this is a developer checkout.
-# Distribution tarballs just install pre-built docuemntation that was
-# included in the tarball.
+# Setup C compiler
-AC_MSG_CHECKING([if this is a developer build])
-AS_IF([test ! -d "$srcdir/.svn" -a ! -d "$srcdir/.hg" -a ! -d "$srcdir/.git"],
- [AC_MSG_RESULT([no (doxygen generation is optional)])],
- [AC_MSG_RESULT([yes])])
-
-# Generating the doxygen output requires a few tools. If we
-# don't have all of them, refuse the build the docs.
-AC_ARG_VAR([DOXYGEN], [Location of the doxygen program (required for building the hwloc doxygen documentation)])
-AC_PATH_TOOL([DOXYGEN], [doxygen])
-
-AC_ARG_VAR([PDFLATEX], [Location of the pdflatex program (required for building the hwloc doxygen documentation)])
-AC_PATH_TOOL([PDFLATEX], [pdflatex])
-
-AC_ARG_VAR([MAKEINDEX], [Location of the makeindex program (required for building the hwloc doxygen documentation)])
-AC_PATH_TOOL([MAKEINDEX], [makeindex])
-
-AC_ARG_VAR([FIG2DEV], [Location of the fig2dev program (required for building the hwloc doxygen documentation)])
-AC_PATH_TOOL([FIG2DEV], [fig2dev])
-
-AC_MSG_CHECKING([if can build doxygen docs])
-AS_IF([test "x$DOXYGEN" != "x" -a "x$PDFLATEX" != "x" -a "x$MAKEINDEX" != "x" -a "x$FIG2DEV" != "x"],
- [generate_doxs=yes], [generate_doxs=no])
-AC_MSG_RESULT([$generate_doxs])
-
-# Making the top-level README requires w3m or lynx.
-AC_ARG_VAR([W3M], [Location of the w3m program (required to building the top-level hwloc README file)])
-AC_PATH_TOOL([W3M], [w3m])
-AC_ARG_VAR([LYNX], [Location of the lynx program (required to building the top-level hwloc README file)])
-AC_PATH_TOOL([LYNX], [lynx])
-
-AC_MSG_CHECKING([if can build top-level README])
-AS_IF([test "x$W3M" != "x"],
- [generate_readme=yes
- W3_GENERATOR=$W3M],
- [AS_IF([test "x$LYNX" != "x"],
- [generate_readme=yes
- W3_GENERATOR="$LYNX -dump -nolist"],
- [generate_readme=no])])
-AC_SUBST(W3_GENERATOR)
-AC_MSG_RESULT([$generate_readme])
-
-# If any one of the above tools is missing, we will refuse to make dist.
-
-AC_ARG_ENABLE([doxygen],
- [AC_HELP_STRING([--enable-doxygen],
- [enable support for building Doxygen documentation (note that this option is ONLY relevant in developer builds; Doxygen documentation is pre-built for tarball builds and this option is therefore ignored)])])
-AC_MSG_CHECKING([if will build doxygen docs])
-AS_IF([test "x$generate_doxs" = "xyes" -a "x$enable_doxygen" != "xno"],
- [], [generate_doxs=no])
-AC_MSG_RESULT([$generate_doxs])
-
-# See if we want to install the doxygen docs
-AC_MSG_CHECKING([if will install doxygen docs])
-AS_IF([test "x$generate_doxs" = "xyes" -o \
- -f "$srcdir/doc/doxygen-doc/man/man3/hwloc_distribute.3" -a \
- -f "$srcdir/doc/doxygen-doc/hwloc.pdf"],
- [install_doxs=yes],
- [install_doxs=no])
-AC_MSG_RESULT([$install_doxs])
-
-AM_CONDITIONAL([BUILD_DOXYGEN], [test "x$generate_doxs" = "xyes"])
-AM_CONDITIONAL([BUILD_README], [test "x$generate_readme" = "xyes" -a \( "x$install_doxs" = "xyes" -o "x$generate_doxs" = "xyes" \) ])
-AM_CONDITIONAL([INSTALL_DOXYGEN], [test "x$install_doxs" = "xyes"])
-
-#
-# Check OS support
-#
-
-AC_MSG_CHECKING([which OS support to include])
-case ${target} in
- *-*-linux*)
- AC_DEFINE(LINUX_SYS, 1, [Define to 1 on Linux])
- AC_DEFINE(HWLOC_LINUX_SYS, 1, [Define to 1 on Linux])
- linux=yes
- AC_MSG_RESULT([Linux])
- ;;
- *-*-irix*)
- AC_DEFINE(IRIX_SYS, 1, [Define to 1 on Irix])
- irix=yes
- AC_MSG_RESULT([IRIX])
- ;;
- *-*-darwin*)
- AC_DEFINE(DARWIN_SYS, 1, [Define to 1 on Darwin])
- darwin=yes
- AC_MSG_RESULT([Darwin])
- ;;
- *-*-solaris*)
- AC_DEFINE(SOLARIS_SYS, 1, [Define to 1 on Solaris])
- solaris=yes
- AC_MSG_RESULT([Solaris])
- ;;
- *-*-aix*)
- AC_DEFINE(AIX_SYS, 1, [Define to 1 on AIX])
- aix=yes
- AC_MSG_RESULT([AIX])
- ;;
- *-*-osf*)
- AC_DEFINE(OSF_SYS, 1, [Define to 1 on OSF])
- osf=yes
- AC_MSG_RESULT([OSF])
- ;;
- *-*-hpux*)
- AC_DEFINE(HPUX_SYS, 1, [Define to 1 on HP-UX])
- hpux=yes
- AC_MSG_RESULT([HP-UX])
- ;;
- *-*-mingw*|*-*-cygwin*)
- AC_DEFINE(WIN_SYS, 1, [Define to 1 on WINDOWS])
- windows=yes
- AC_MSG_RESULT([Windows])
- ;;
- *)
- AC_MSG_RESULT([Unsupported! ($target)])
- AC_MSG_WARN([***********************************************************])
- AC_MSG_WARN([*** hwloc does not support this system.])
- AC_MSG_WARN([*** hwloc will *attempt* to build (but it may not work).])
- AC_MSG_WARN([*** hwloc's run-time results may be reduced to showing just one processor.])
- AC_MSG_WARN([*** You have been warned.])
- AC_MSG_WARN([*** Pausing to give you time to read this message...])
- AC_MSG_WARN([***********************************************************])
- sleep 10
- ;;
-esac
-
-AM_CONDITIONAL([HAVE_LINUX], [test "x$linux" = "xyes"])
-AM_CONDITIONAL([HAVE_IRIX], [test "x$irix" = "xyes"])
-AM_CONDITIONAL([HAVE_DARWIN], [test "x$darwin" = "xyes"])
-AM_CONDITIONAL([HAVE_SOLARIS], [test "x$solaris" = "xyes"])
-AM_CONDITIONAL([HAVE_AIX], [test "x$aix" = "xyes"])
-AM_CONDITIONAL([HAVE_OSF], [test "x$osf" = "xyes"])
-AM_CONDITIONAL([HAVE_HPUX], [test "x$hpux" = "xyes"])
-AM_CONDITIONAL([HAVE_WINDOWS], [test "x$windows" = "xyes"])
-AM_CONDITIONAL([HAVE_MINGW32], [test "x$target_os" = "xmingw32"])
-
-#
-# Define C flags
-#
-
-AC_USE_SYSTEM_EXTENSIONS # for O_DIRECTORY, fdopen, ffsl, ...
-AH_VERBATIM([USE_HPUX_SYSTEM_EXTENSIONS],
-[/* Enable extensions on HP-UX. */
-#ifndef _HPUX_SOURCE
-# undef _HPUX_SOURCE
-#endif
-])
-AC_DEFINE([_HPUX_SOURCE])
-
-AC_LANG([C])
-
+CFLAGS_save="$CFLAGS"
+AC_PROG_CC
AM_PROG_CC_C_O
-AC_PROG_CC_C99
-AC_PROG_LN_S
-AC_PROG_INSTALL
-AC_PROG_MKDIR_P
-AC_PROG_EGREP
-PKG_CHECK_EXISTS
+CFLAGS="$CFLAGS_save"
-HWLOC_GCC_FLAGS
-HWLOC_CHECK_DIFF_U
+# Define hwloc's configure arguments
+HWLOC_DEFINE_ARGS
-AC_CHECK_SIZEOF([unsigned long])
-AC_DEFINE_UNQUOTED([HWLOC_SIZEOF_UNSIGNED_LONG], $ac_cv_sizeof_unsigned_long, [The size of `unsigned long', as computed by sizeof])
-AC_CHECK_SIZEOF([unsigned int])
-AC_DEFINE_UNQUOTED([HWLOC_SIZEOF_UNSIGNED_INT], $ac_cv_sizeof_unsigned_int, [The size of `unsigned int', as computed by sizeof])
+# If debug mode, add -g
+AS_IF([test "$hwloc_debug" = "1"],
+ [CFLAGS="$CFLAGS -g"])
-#
-# Now detect support
-#
+# If the user didn't specifically ask for embedding mode, default to
+# standalone mode
+AS_IF([test "$enable_embedded_mode" != "yes"],
+ [AS_IF([test ! -d "$srcdir/doc"],
+ [AC_MSG_WARN([The hwloc source tree looks incomplete for a standalobe])
+ AC_MSG_WARN([build. Perhaps this hwloc tree is intended for an embedded])
+ AC_MSG_WARN([build? Try using the --enable-embedded-mode switch.])
+ AC_MSG_ERROR([Cannot continue])],
+ [HWLOC_BUILD_STANDALONE])])
-hwloc_strncasecmp=strncmp
-AC_CHECK_FUNCS([strncasecmp], [
- HWLOC_CHECK_DECL([strncasecmp], [
- hwloc_strncasecmp=strncasecmp
- ])
-])
-AC_DEFINE_UNQUOTED(hwloc_strncasecmp, $hwloc_strncasecmp, [Define this to either strncasecmp or strncmp])
+# Setup the hwloc core
+HWLOC_SETUP_CORE([], [], [hwloc_setup=unhappy], [1])
+AS_IF([test "$hwloc_setup" = "unhappy"],
+ [AC_MSG_ERROR([Cannot continue])])
-AC_CHECK_TYPES([wchar_t], [
- AC_CHECK_FUNCS([putwc])
-], [], [[#include <wchar.h>]])
+# Setup hwloc's docs, utils, and tests
+AS_IF([test "$hwloc_mode" = "standalone"],
+ [HWLOC_SETUP_DOCS
+ HWLOC_SETUP_UTILS
+ HWLOC_SETUP_TESTS])
-AC_CHECK_HEADERS([locale.h], [
- AC_CHECK_FUNCS([setlocale])
-])
-AC_CHECK_HEADERS([langinfo.h], [
- AC_CHECK_FUNCS([nl_langinfo])
-])
-AC_CHECK_HEADERS([curses.h], [
- AC_CHECK_HEADERS([term.h], [
- AC_CHECK_LIB([termcap], [tparm])
- ], [], [[#include <curses.h>]])
-])
+# Run the AM_CONDITIONALs
+HWLOC_DO_AM_CONDITIONALS
-AC_CHECK_TYPES([KAFFINITY,
- PROCESSOR_CACHE_TYPE,
- CACHE_DESCRIPTOR,
- LOGICAL_PROCESSOR_RELATIONSHIP,
- SYSTEM_LOGICAL_PROCESSOR_INFORMATION,
- GROUP_AFFINITY,
- PROCESSOR_RELATIONSHIP,
- NUMA_NODE_RELATIONSHIP,
- CACHE_RELATIONSHIP,
- PROCESSOR_GROUP_INFO,
- GROUP_RELATIONSHIP,
- SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX],
- [],[],[[#include <windows.h>]])
-AC_HAVE_LIBRARY(gdi32)
+# Set the final flags
+CFLAGS="$HWLOC_EMBEDDED_CFLAGS $CFLAGS"
+CPPFLAGS="$HWLOC_EMBEDDED_CPPFLAGS $CPPFLAGS"
-AC_CHECK_HEADER([windows.h], [
- AC_DEFINE([HWLOC_HAVE_WINDOWS_H], [1], [Define to 1 if you have the `windows.h' header.])
-])
-
-AC_CHECK_HEADERS([sys/lgrp_user.h], [
- AC_HAVE_LIBRARY([lgrp])
-])
-AC_CHECK_HEADERS([kstat.h], [
- AC_HAVE_LIBRARY([kstat])
-])
-
-AC_CHECK_HEADERS([infiniband/verbs.h], [
- AC_HAVE_LIBRARY([ibverbs], [have_libibverbs=yes])
-])
-AM_CONDITIONAL([HAVE_LIBIBVERBS], [test "x$have_libibverbs" = "xyes"])
-
-AC_CHECK_DECLS([_SC_NPROCESSORS_ONLN,
- _SC_NPROCESSORS_CONF,
- _SC_NPROC_ONLN,
- _SC_NPROC_CONF,
- _SC_LARGE_PAGESIZE],,[:],[[#include <unistd.h>]])
-
-AC_HAVE_HEADERS([mach/mach_host.h])
-AC_HAVE_HEADERS([mach/mach_init.h], [
- AC_CHECK_FUNCS([host_info])
-])
-
-case ${target} in
- *-*-mingw*|*-*-cygwin*)
- hwloc_pid_t=HANDLE
- hwloc_thread_t=HANDLE
- ;;
- *)
- hwloc_pid_t=pid_t
- AC_CHECK_TYPES([pthread_t], [hwloc_thread_t=pthread_t], [:], [[#include <pthread.h>]])
- ;;
-esac
-AC_DEFINE_UNQUOTED(hwloc_pid_t, $hwloc_pid_t, [Define this to the process ID type])
-if test "x$hwloc_thread_t" != "x" ; then
- AC_DEFINE_UNQUOTED(hwloc_thread_t, $hwloc_thread_t, [Define this to the thread ID type])
-fi
-
-AC_MSG_CHECKING([for old prototype of sched_setaffinity])
-AC_COMPILE_IFELSE(
- AC_LANG_PROGRAM([[
- #define _GNU_SOURCE
- #include <sched.h>
- static unsigned long mask;
- ]], [[ sched_setaffinity(0, (void*) &mask);
- ]]),
- AC_DEFINE([HAVE_OLD_SCHED_SETAFFINITY], [1], [Define to 1 if glibc provides the old prototype of sched_setaffinity()])
- AC_MSG_RESULT([yes]),
- AC_MSG_RESULT([no])
-)
-
-AC_MSG_CHECKING([for working CPU_SET])
-AC_LINK_IFELSE(
- AC_LANG_PROGRAM([[
- #include <sched.h>
- cpu_set_t set;
- ]], [[ CPU_ZERO(&set); CPU_SET(0, &set);
- ]]),
- AC_DEFINE([HWLOC_HAVE_CPU_SET], [1], [Define to 1 if the CPU_SET macro works])
- AC_MSG_RESULT([yes]),
- AC_MSG_RESULT([no])
-)
-
-AC_ARG_ENABLE([cairo],
- [AS_HELP_STRING([--disable-cairo], [disable the Cairo back-end of `lstopo'])],
- [enable_cairo="$enableval"],
- [enable_cairo="yes"])
-
-if test "x$enable_cairo" = "xyes"; then
- PKG_CHECK_MODULES([CAIRO], [cairo], [:], [enable_cairo="no"])
- if test "x$enable_cairo" = "xyes"; then
- AC_CHECK_HEADERS([X11/Xlib.h],
- [AC_CHECK_HEADERS([X11/Xutil.h X11/keysym.h],
- [enable_X11=yes
- AC_DEFINE([HAVE_X11], [1], [Define to 1 if X11 libraries are available.])],,
- [[#include <X11/Xlib.h>]])
- ])
- if test "x$enable_X11" != "xyes"; then
- AC_MSG_WARN([X11 headers not found, Cairo/X11 back-end disabled])
- fi
- fi
-fi
-
-if test "x$enable_cairo" = "xyes"; then
- AC_DEFINE([HAVE_CAIRO], [1], [Define to 1 if you have the `cairo' library.])
-fi
-AM_CONDITIONAL([HAVE_CAIRO], [test "x$enable_cairo" = "xyes"])
-
-AC_ARG_ENABLE([xml],
- [AS_HELP_STRING([--disable-xml], [disable the XML back-end of `lstopo'])],
- [enable_xml="$enableval"],
- [enable_xml="yes"])
-
-if test "x$enable_xml" = "xyes"; then
- PKG_CHECK_MODULES([XML], [libxml-2.0], [:], [enable_xml="no"])
-fi
-
-if test "x$enable_xml" = "xyes"; then
- HWLOC_REQUIRES="libxml-2.0 $HWLOC_REQUIRES"
- AC_DEFINE([HAVE_XML], [1], [Define to 1 if you have the `xml' library.])
- AC_SUBST([HAVE_XML], [1])
-else
- AC_SUBST([HAVE_XML], [0])
-fi
-AM_CONDITIONAL([HAVE_XML], [test "x$enable_xml" = "xyes"])
-
-# check for kerrighed, but don't abort if not found
-PKG_CHECK_MODULES([KERRIGHED], [kerrighed >= 2.0], [], [:])
-
-# disable C++, F77, Java and Windows Resource Compiler support
-LT_PREREQ([2.2.6])
-LT_INIT
+# Setup libtool, but disable C++, F77, Java and Windows Resource
+# Compiler support -- we don't need that stuff.
+AM_ENABLE_SHARED
+AM_DISABLE_STATIC
+AM_PROG_LIBTOOL([win32-dll])
LT_LANG([C])
-AC_LIBTOOL_WIN32_DLL
-AM_CONDITIONAL([HAVE_GCC], [test "x$GCC" = "xyes"])
-AC_PATH_PROGS([HWLOC_MS_LIB], [lib])
-AC_ARG_VAR([HWLOC_MS_LIB], [Path to Microsoft's Visual Studio `lib' tool])
-AM_CONDITIONAL([HAVE_MS_LIB], [test "x$HWLOC_MS_LIB" != "x"])
-AC_ARG_ENABLE([debug],
- AS_HELP_STRING([--enable-debug], [enable debugging messages]),
- [enable_debug="$enableval"],
- [enable_debug="no"])
-
-AC_MSG_CHECKING([whether debug is enabled])
-if test x$enable_debug = xyes; then
- AC_DEFINE_UNQUOTED([HWLOC_DEBUG], [1], [Define to 1 to enable debug])
- AC_MSG_RESULT([yes])
-else
- AC_MSG_RESULT([no])
-fi
-
-AC_PATH_PROG([BASH], [bash])
-
-AC_CHECK_FUNCS([ffs], [
- HWLOC_CHECK_DECL([ffs],[
- AC_DEFINE([HWLOC_HAVE_DECL_FFS], [1], [Define to 1 if function `ffs' is declared by system headers])
- ])
- AC_DEFINE([HWLOC_HAVE_FFS], [1], [Define to 1 if you have the `ffs' function.])
-])
-AC_CHECK_FUNCS([ffsl], [
- HWLOC_CHECK_DECL([ffsl],[
- AC_DEFINE([HWLOC_HAVE_DECL_FFSL], [1], [Define to 1 if function `ffsl' is declared by system headers])
- ])
- AC_DEFINE([HWLOC_HAVE_FFSL], [1], [Define to 1 if you have the `ffsl' function.])
-])
-
-AC_CHECK_FUNCS([fls], [
- HWLOC_CHECK_DECL([fls],[
- AC_DEFINE([HWLOC_HAVE_DECL_FLS], [1], [Define to 1 if function `fls' is declared by system headers])
- ])
- AC_DEFINE([HWLOC_HAVE_FLS], [1], [Define to 1 if you have the `fls' function.])
-])
-AC_CHECK_FUNCS([flsl], [
- HWLOC_CHECK_DECL([flsl],[
- AC_DEFINE([HWLOC_HAVE_DECL_FLSL], [1], [Define to 1 if function `flsl' is declared by system headers])
- ])
- AC_DEFINE([HWLOC_HAVE_FLSL], [1], [Define to 1 if you have the `flsl' function.])
-])
-
-AC_CHECK_FUNCS([clz], [
- HWLOC_CHECK_DECL([clz],[
- AC_DEFINE([HWLOC_HAVE_DECL_CLZ], [1], [Define to 1 if function `clz' is declared by system headers])
- ])
- AC_DEFINE([HWLOC_HAVE_CLZ], [1], [Define to 1 if you have the `clz' function.])
-])
-AC_CHECK_FUNCS([clzl], [
- HWLOC_CHECK_DECL([clzl],[
- AC_DEFINE([HWLOC_HAVE_DECL_CLZL], [1], [Define to 1 if function `clzl' is declared by system headers])
- ])
- AC_DEFINE([HWLOC_HAVE_CLZL], [1], [Define to 1 if you have the `clzl' function.])
-])
-
-AC_CHECK_FUNCS([openat], [have_openat=yes])
-AM_CONDITIONAL([HAVE_OPENAT], [test "x$have_openat" = "xyes"])
-
-AC_CHECK_DECL([numa_bitmask_alloc], [have_linux_libnuma=yes], [],
- [#include <numa.h>])
-AM_CONDITIONAL([HAVE_LINUX_LIBNUMA], [test "x$have_linux_libnuma" = "xyes"])
-
-AC_CHECK_DECLS([pthread_setaffinity_np],,[:],[[#include <pthread.h>]])
-AC_CHECK_FUNC([sched_setaffinity], [have_sched_setaffinity=yes])
-AM_CONDITIONAL([HAVE_SCHED_SETAFFINITY], [test "x$have_sched_setaffinity" = "xyes"])
-
-AC_CHECK_PROGS(XMLLINT, [xmllint])
-
-AC_SUBST(HWLOC_REQUIRES)
-
-AC_CONFIG_HEADER([include/private/config.h])
-
-AC_CONFIG_FILES([hwloc.pc
- doc/doxygen-config.cfg
-
- Makefile
- doc/Makefile
- include/Makefile
- src/Makefile
- tests/Makefile
- tests/linux/Makefile
- tests/linux/gather-topology.sh
- tests/linux/test-topology.sh
- tests/lstopo_xml.sh
- tests/ports/Makefile
- utils/Makefile
- utils/test-hwloc-distrib.sh
-])
-
-AC_CONFIG_HEADERS([include/hwloc/config.h])
-
-AC_CONFIG_COMMANDS([linux-topology-scripts],
- [chmod +x tests/linux/test-topology.sh tests/lstopo_xml.sh tests/linux/gather-topology.sh utils/test-hwloc-distrib.sh])
-
+# Party on
AC_OUTPUT
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/contrib/dist/make_dist_tarball
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/contrib/dist/make_dist_tarball 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/contrib/dist/make_dist_tarball 2010-05-11 01:47:13 UTC (rev 6632)
@@ -10,7 +10,7 @@
# University of Stuttgart. All rights reserved.
# Copyright (c) 2004-2005 The Regents of the University of California.
# All rights reserved.
-# Copyright © 2008-2009 Cisco Systems, Inc. All rights reserved.
+# Copyright © 2008-2010 Cisco Systems, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@@ -22,9 +22,9 @@
# Version of auto tools that we want
#
-AM_TARGET_VERSION=1.11
-AC_TARGET_VERSION=2.64
-LT_TARGET_VERSION=2.2.6
+AM_TARGET_VERSION=1.11.1
+AC_TARGET_VERSION=2.65
+LT_TARGET_VERSION=2.2.6b
#
# First things first -- check that the auto versions that we have are
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/Makefile.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/Makefile.am 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/Makefile.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,17 +1,17 @@
-# Copyright © 2009 INRIA, Université Bordeaux 1
-# Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+# Copyright © 2009 INRIA, Université Bordeaux 1
+# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
-include $(top_srcdir)/hwloc.am
+AM_CPPFLAGS = $(HWLOC_CPPFLAGS)
-DOCDIR = $(top_builddir)/doc
-DOX_CONFIG = $(top_srcdir)/doc/doxygen.cfg
+DOCDIR = $(HWLOC_top_builddir)/doc
+DOX_CONFIG = $(HWLOC_top_srcdir)/doc/doxygen.cfg
-DOX_DIR = $(DOCDIR)/doxygen-doc
+DOX_DIR = doxygen-doc
DOX_HTML_DIR = $(DOX_DIR)/html
DOX_MAN_DIR = $(DOX_DIR)/man
DOX_LATEX_DIR = $(DOX_DIR)/latex
-DOX_A4PDF = $(DOX_DIR)/$(PACKAGE)-a4.pdf
-DOX_LETTERPDF = $(DOX_DIR)/$(PACKAGE)-letter.pdf
+DOX_A4PDF = doxygen-doc/$(PACKAGE)-a4.pdf
+DOX_LETTERPDF = doxygen-doc/$(PACKAGE)-letter.pdf
DOX_TAG = $(DOX_DIR)/$(PACKAGE).tag
#
@@ -25,22 +25,20 @@
# tree (e.g., everything in the man and latex directories).
#
+PREBUILT_IMAGES = images/dudley.png images/emmett.png images/hagrid.png
image_built_sources = images/diagram.png images/diagram.eps
EXTRA_DIST = \
hwloc.doxy \
doxygen.css \
doxygen.cfg \
- images/dudley.png \
- images/emmett.png \
- images/hagrid.png \
images/diagram.fig \
www.open-mpi.org.cfg \
www.open-mpi.org-css.inc \
www.open-mpi.org-footer.inc \
www.open-mpi.org-header.inc \
- $(image_built_sources) \
- $(DOX_HTML_DIR) $(DOX_MAN_DIR) $(DOX_LATEX_DIR) $(DOX_TAG)
+ $(PREBUILT_IMAGES) \
+ $(image_built_sources)
#
# Files where the doxygen inputs live (i.e., dependencies). Make the
@@ -51,13 +49,13 @@
dox_inputs = $(DOX_CONFIG) \
$(srcdir)/hwloc.doxy \
- $(top_srcdir)/include/hwloc.h \
- $(top_srcdir)/include/hwloc/helper.h \
- $(top_srcdir)/include/hwloc/cpuset.h \
- $(top_srcdir)/include/hwloc/linux.h \
- $(top_srcdir)/include/hwloc/linux-libnuma.h \
- $(top_srcdir)/include/hwloc/glibc-sched.h \
- $(top_srcdir)/include/hwloc/openfabrics-verbs.h
+ $(HWLOC_top_srcdir)/include/hwloc.h \
+ $(HWLOC_top_srcdir)/include/hwloc/helper.h \
+ $(HWLOC_top_srcdir)/include/hwloc/cpuset.h \
+ $(HWLOC_top_srcdir)/include/hwloc/glibc-sched.h \
+ $(HWLOC_top_srcdir)/include/hwloc/linux.h \
+ $(HWLOC_top_srcdir)/include/hwloc/linux-libnuma.h \
+ $(HWLOC_top_srcdir)/include/hwloc/openfabrics-verbs.h
#
# Create the images that we need for the PDF output and the HTML
@@ -65,14 +63,17 @@
# AC_PATH_PROG found something in configure.ac (!), so we have to put
# a run-time check here to see if fig2dev was found. :-(
#
+# Note that BUILD_DOXYGEN will automatically be false if we're not
+# building standalone.
+#
-if BUILD_DOXYGEN
+if HWLOC_BUILD_DOXYGEN
BUILT_SOURCES = $(image_built_sources)
images/diagram.png: $(srcdir)/images/diagram.fig
$(MKDIR_P) images
@if test "x$(FIG2DEV)" = "x"; then \
- echo "ERROR: Cannot find the 'fig2dev' exectuable -- cannot make $@"; \
+ echo "ERROR: Cannot find the 'fig2dev' executable -- cannot make $@"; \
exit 1; \
fi
$(FIG2DEV) -L png $< $@
@@ -80,7 +81,7 @@
images/diagram.eps: $(srcdir)/images/diagram.fig
$(MKDIR_P) images
@if test "x$(FIG2DEV)" = "x"; then \
- echo "ERROR: Cannot find the 'fig2dev' exectuable -- cannot make $@"; \
+ echo "ERROR: Cannot find the 'fig2dev' executable -- cannot make $@"; \
exit 1; \
fi
$(FIG2DEV) -L eps $< $@
@@ -89,22 +90,66 @@
#
# Rules for running doxygen. It depends on the built images and the
# dox_inputs.
+# Remove useless manpages, they have too long filenames anyway because
+# of nested structurre/union declarations.
#
-if BUILD_DOXYGEN
-$(DOX_TAG): $(BUILT_SOURCES) $(dox_inputs)
+if HWLOC_BUILD_DOXYGEN
+$(DOX_TAG): $(BUILT_SOURCES) $(dox_inputs) $(PREBUILT_IMAGES)
rm -fr $(DOX_DIR)
$(DOXYGEN) $(DOX_CONFIG)
- -sed -i -e 's/__hwloc_restrict/restrict/g;s/\\_\\-\\_\\-hwloc\\_\\-restrict/restrict/g;s/__inline/inline/g;s/\\_\\-\\_\\-inline/inline/g' $(DOX_DIR)/html/*.html $(DOX_DIR)/latex/*.tex $(DOX_DIR)/man/man3/*.3
+ -sed -i \
+ -e 's/__hwloc_restrict/restrict/g' \
+ -e 's/\\_\\-\\_\\-hwloc\\_\\-restrict/restrict/g' \
+ -e 's/__hwloc_attribute_unused//g' \
+ -e 's/\\_\\-\\_\\-hwloc\\_\\-attribute\\_\\-unused//g' \
+ -e 's/__hwloc_attribute_malloc//g' \
+ -e 's/\\_\\-\\_\\-hwloc\\_\\-attribute\\_\\-malloc//g' \
+ -e 's/__hwloc_attribute_const//g' \
+ -e 's/\\_\\-\\_\\-hwloc\\_\\-attribute\\_\\-const//g' \
+ -e 's/__hwloc_attribute_pure//g' \
+ -e 's/\\_\\-\\_\\-hwloc\\_\\-attribute\\_\\-pure//g' \
+ -e 's/__hwloc_attribute_deprecated//g' \
+ -e 's/\\_\\-\\_\\-hwloc\\_\\-attribute\\_\\-deprecated//g' \
+ -e 's/HWLOC_DECLSPEC//g' \
+ -e 's/HWLOC\\_\\-DECLSPEC//g' \
+ -e 's/__hwloc_inline/inline/g' \
+ -e 's/\\_\\-\\_\\-hwloc\\_\\-inline/inline/g' \
+ $(DOX_DIR)/html/*.html $(DOX_DIR)/latex/*.tex $(DOX_DIR)/man/man3/*.3
+ @echo "Work-around spurious leading _ in doxygen filenames..."
+ (cd $(DOX_DIR)/man/man3 ; \
+ for i in _hwloc* ; do \
+ [ ! -f $$i ] || mv $$i $${i#_} ; \
+ done)
+ @echo "Removing useless manpages..."
+ @mkdir $(DOX_DIR)/man.tmp
+ @mv $(man3_MANS) $(DOX_DIR)/man.tmp/
+ @rm -rf $(DOX_DIR)/man/man3
+ @mv $(DOX_DIR)/man.tmp $(DOX_DIR)/man/man3
+if HWLOC_DOXYGEN_BROKEN_SHORT_NAMES
+ @echo "Work-around buggy doxygen filenames..."
+ - at mv -f $(DOX_DIR)/html/termsanddefs.html $(DOX_DIR)/html/a00001.html
+ - at mv -f $(DOX_DIR)/latex/termsanddefs.tex $(DOX_DIR)/latex/a00001.tex
+ - at mv -f $(DOX_DIR)/html/tools.html $(DOX_DIR)/html/a00002.html
+ - at mv -f $(DOX_DIR)/latex/tools.tex $(DOX_DIR)/latex/a00002.tex
+ - at mv -f $(DOX_DIR)/html/envvar.html $(DOX_DIR)/html/a00003.html
+ - at mv -f $(DOX_DIR)/latex/envvar.tex $(DOX_DIR)/latex/a00003.tex
+ - at mv -f $(DOX_DIR)/html/interoperability.html $(DOX_DIR)/html/a00004.html
+ - at mv -f $(DOX_DIR)/latex/interoperability.tex $(DOX_DIR)/latex/a00004.tex
+ - at mv -f $(DOX_DIR)/html/threadsafety.html $(DOX_DIR)/html/a00005.html
+ - at mv -f $(DOX_DIR)/latex/threadsafety.tex $(DOX_DIR)/latex/a00005.tex
+ - at mv -f $(DOX_DIR)/html/embed.html $(DOX_DIR)/html/a00006.html
+ - at mv -f $(DOX_DIR)/latex/embed.tex $(DOX_DIR)/latex/a00006.tex
+ - at mv -f $(DOX_DIR)/html/switchfromplpa.html $(DOX_DIR)/html/a00007.html
+ - at mv -f $(DOX_DIR)/latex/switchfromplpa.tex $(DOX_DIR)/latex/a00007.tex
endif
+endif
#
# Rules for building the PDF
#
-if BUILD_DOXYGEN
-# Make both an A4wide PDF and a US letter PDF
-$(DOX_PDF): $(DOX_TAG)
+if HWLOC_BUILD_DOXYGEN
# The Doxygen config is set to generate a4 latex -- no transformation
# is necessary.
@@ -124,7 +169,7 @@
done=1; \
fi; \
done; \
- mv a4-refman.pdf ../../$(DOX_A4PDF)
+ mv a4-refman.pdf $(DOCDIR)/$(DOX_A4PDF)
# The Doxygen config is set to generate a4 latex -- slightly transform
# to make suitable for US letter.
@@ -144,7 +189,7 @@
done=1; \
fi; \
done; \
- mv letter-refman.pdf ../../$(DOX_LETTERPDF)
+ mv letter-refman.pdf $(DOCDIR)/$(DOX_LETTERPDF)
endif
#
@@ -158,7 +203,7 @@
# pre-bundled in a tarball).
#
-if BUILD_DOXYGEN
+if HWLOC_BUILD_DOXYGEN
all-local: $(DOX_TAG)
if test -d $(DOX_HTML_DIR) -a -f $(DOX_HTML_DIR)/doxygen.css; then \
cp -f $(srcdir)/doxygen.css $(DOX_HTML_DIR); \
@@ -166,10 +211,12 @@
endif
#
-# Un/install the generated PDF and man pages
+# Un/install the generated PDF and man pages (just like BUILD_DOXYGEN,
+# INSTALL_DOXYGEN will automatically be false if we're not building in
+# standalone mode).
#
-if INSTALL_DOXYGEN
+if HWLOC_INSTALL_DOXYGEN
dist_pdf_DATA = $(DOX_A4PDF) $(DOX_LETTERPDF)
endif
@@ -179,7 +226,7 @@
# in the Makefile.am... :-(
#
-if INSTALL_DOXYGEN
+if HWLOC_INSTALL_DOXYGEN
man3_MANS = \
$(DOX_MAN_DIR)/man3/HWLOC_CPUBIND_PROCESS.3 \
$(DOX_MAN_DIR)/man3/HWLOC_CPUBIND_STRICT.3 \
@@ -188,8 +235,9 @@
$(DOX_MAN_DIR)/man3/HWLOC_OBJ_CORE.3 \
$(DOX_MAN_DIR)/man3/HWLOC_OBJ_MACHINE.3 \
$(DOX_MAN_DIR)/man3/HWLOC_OBJ_MISC.3 \
+ $(DOX_MAN_DIR)/man3/HWLOC_OBJ_GROUP.3 \
$(DOX_MAN_DIR)/man3/HWLOC_OBJ_NODE.3 \
- $(DOX_MAN_DIR)/man3/HWLOC_OBJ_PROC.3 \
+ $(DOX_MAN_DIR)/man3/HWLOC_OBJ_PU.3 \
$(DOX_MAN_DIR)/man3/HWLOC_OBJ_SOCKET.3 \
$(DOX_MAN_DIR)/man3/HWLOC_OBJ_SYSTEM.3 \
$(DOX_MAN_DIR)/man3/HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM.3 \
@@ -203,11 +251,12 @@
$(DOX_MAN_DIR)/man3/hwloc_cpuset_dup.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_copy.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_all_but_cpu.3 \
- $(DOX_MAN_DIR)/man3/hwloc_cpuset_andset.3 \
- $(DOX_MAN_DIR)/man3/hwloc_cpuset_clearset.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_cpuset_and.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_cpuset_andnot.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_clr.3 \
- $(DOX_MAN_DIR)/man3/hwloc_cpuset_compar.3 \
- $(DOX_MAN_DIR)/man3/hwloc_cpuset_compar_first.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_cpuset_clr_range.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_cpuset_compare.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_cpuset_compare_first.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_fill.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_first.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_foreach_begin.3 \
@@ -226,7 +275,9 @@
$(DOX_MAN_DIR)/man3/hwloc_cpuset_isset.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_iszero.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_last.3 \
- $(DOX_MAN_DIR)/man3/hwloc_cpuset_orset.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_cpuset_next.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_cpuset_not.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_cpuset_or.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_set.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_set_range.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_singlify.3 \
@@ -240,7 +291,7 @@
$(DOX_MAN_DIR)/man3/hwloc_cpuset_to_linux_libnuma_ulongs.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_to_ulong.3 \
$(DOX_MAN_DIR)/man3/hwloc_cpuset_weight.3 \
- $(DOX_MAN_DIR)/man3/hwloc_cpuset_xorset.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_cpuset_xor.3 \
$(DOX_MAN_DIR)/man3/hwloc_distribute.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_closest_objs.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_common_ancestor_obj.3 \
@@ -248,6 +299,11 @@
$(DOX_MAN_DIR)/man3/hwloc_get_child_covering_cpuset.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_obj_covering_cpuset.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_depth_type.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_get_allowed_cpuset.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_get_complete_cpuset.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_get_online_cpuset.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_get_topology_cpuset.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_get_first_largest_obj_inside_cpuset.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_largest_objs_inside_cpuset.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_nbobjs_inside_cpuset_by_type.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_nbobjs_inside_cpuset_by_depth.3 \
@@ -258,12 +314,17 @@
$(DOX_MAN_DIR)/man3/hwloc_get_next_obj_inside_cpuset_by_depth.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_next_obj_by_type.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_next_obj_by_depth.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_get_pu_obj_by_os_index.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_get_obj_below_by_type.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_get_obj_below_array_by_type.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_obj_inside_cpuset_by_type.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_obj_inside_cpuset_by_depth.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_obj_by_type.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_obj_by_depth.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_get_ancestor_obj_by_type.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_get_ancestor_obj_by_depth.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_shared_cache_covering_obj.3 \
- $(DOX_MAN_DIR)/man3/hwloc_get_system_obj.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_get_root_obj.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_type_depth.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_nbobjs_by_type.3 \
$(DOX_MAN_DIR)/man3/hwloc_get_nbobjs_by_depth.3 \
@@ -275,22 +336,31 @@
$(DOX_MAN_DIR)/man3/hwloc_obj_attr_u.3 \
$(DOX_MAN_DIR)/man3/hwloc_obj_attr_u_hwloc_cache_attr_s.3 \
$(DOX_MAN_DIR)/man3/hwloc_obj_attr_u_hwloc_machine_attr_s.3 \
- $(DOX_MAN_DIR)/man3/hwloc_obj_attr_u_hwloc_memory_attr_s.3 \
- $(DOX_MAN_DIR)/man3/hwloc_obj_attr_u_hwloc_misc_attr_s.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_obj_attr_u_hwloc_group_attr_s.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_obj_memory_s.3 \
$(DOX_MAN_DIR)/man3/hwloc_obj_cpuset_snprintf.3 \
$(DOX_MAN_DIR)/man3/hwloc_obj_is_in_subtree.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_obj_type_snprintf.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_obj_attr_snprintf.3 \
$(DOX_MAN_DIR)/man3/hwloc_obj_snprintf.3 \
$(DOX_MAN_DIR)/man3/hwloc_obj_t.3 \
$(DOX_MAN_DIR)/man3/hwloc_obj_type_of_string.3 \
$(DOX_MAN_DIR)/man3/hwloc_obj_type_string.3 \
$(DOX_MAN_DIR)/man3/hwloc_obj_type_t.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_get_cpubind.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_get_proc_cpubind.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_get_thread_cpubind.3 \
$(DOX_MAN_DIR)/man3/hwloc_set_cpubind.3 \
$(DOX_MAN_DIR)/man3/hwloc_set_proc_cpubind.3 \
$(DOX_MAN_DIR)/man3/hwloc_set_thread_cpubind.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_check.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_destroy.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_export_xml.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_insert_misc_object_by_cpuset.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_insert_misc_object_by_parent.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_flags_e.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_get_depth.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_get_support.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_ignore_all_keep_structure.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_ignore_type.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_ignore_type_keep_structure.3 \
@@ -299,8 +369,12 @@
$(DOX_MAN_DIR)/man3/hwloc_topology_load.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_set_flags.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_set_fsroot.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_set_pid.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_set_synthetic.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_set_xml.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_support.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_discovery_support.3 \
+ $(DOX_MAN_DIR)/man3/hwloc_topology_cpubind_support.3 \
$(DOX_MAN_DIR)/man3/hwloc_topology_t.3 \
$(DOX_MAN_DIR)/man3/hwlocality_binding.3 \
$(DOX_MAN_DIR)/man3/hwlocality_configuration.3 \
@@ -332,7 +406,7 @@
# that we don't get partial target errors.
#
-if BUILD_DOXYGEN
+if HWLOC_BUILD_DOXYGEN
$(man3_MANS): $(DOX_TAG)
$(DOX_A4PDF): $(DOX_TAG)
$(DOX_LETTERPDF): $(DOX_TAG)
@@ -345,13 +419,13 @@
# Make sure that the documentation example works
#
-if BUILD_DOXYGEN
+if HWLOC_BUILD_TESTS
TESTS = hwloc-hello
check_PROGRAMS = $(TESTS)
+endif HWLOC_BUILD_TESTS
-hwloc_hello_LDADD = $(top_builddir)/src/libhwloc.la
+hwloc_hello_LDADD = $(HWLOC_top_builddir)/src/libhwloc.la
hwloc_hello_DEPENDENCIES = $(hwloc_hello_LDADD)
-endif
#
# Only remove the actual generated documentation files for maintainers
@@ -369,16 +443,19 @@
# Rules for creating the top-level README file. There does not appear
# to be an easy way to know if AC_PATH_PROG found something in
# configure.ac (!), so put a run-time check here to see if we have
-# w3c.
+# w3c.
#
+# Just like BUILD_DOXYGEN, BUILD_README will automatically be false if
+# we're not building standalone.
+#
-if BUILD_README
-doc readme: all $(top_srcdir)/README
-$(top_srcdir)/README: $(DOX_HTML_DIR)
- LC_ALL=C $(W3_GENERATOR) $(DOX_HTML_DIR)/index.html | sed -n -e 's/^ //' -e '/^Introduction$$/,$$p' > $@
+if HWLOC_BUILD_README
+doc readme: all $(HWLOC_top_srcdir)/README
+$(HWLOC_top_srcdir)/README: $(DOX_HTML_DIR)
+ LC_ALL=C $(HWLOC_W3_GENERATOR) $(DOX_HTML_DIR)/index.html | sed -n -e 's/^ //' -e '/^Introduction$$/,$$p' > $@
else
doc readme: no-build-readme
-$(top_srcdir)/README: no-build-readme
+$(HWLOC_top_srcdir)/README: no-build-readme
no-build-readme:
@echo "ERROR: You do not have the 'w3m' or 'lynx' executables to build the README, or do not have the 'doxygen' executable to build the docs."
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/doxygen.cfg
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/doxygen.cfg 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/doxygen.cfg 2010-05-11 01:47:13 UTC (rev 6632)
@@ -144,7 +144,7 @@
# (but less readable) file names. This can be useful is your file systems
# doesn't support long names like on DOS, Mac, or CD-ROM.
-SHORT_NAMES = NO
+SHORT_NAMES = YES
# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
# will interpret the first line (until the first dot) of a JavaDoc-style
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/hwloc-hello.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/hwloc-hello.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/hwloc-hello.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,99 +1,141 @@
/* Example hwloc API program.
*
* Copyright © 2009 INRIA, Université Bordeaux 1
+ * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
*
- * topo-hello.c
+ * hwloc-hello.c
*/
#include <hwloc.h>
-static void print_children(hwloc_topology_t topology, hwloc_obj_t obj, int depth)
+static void print_children(hwloc_topology_t topology, hwloc_obj_t obj,
+ int depth)
{
- char string[128];
- int i;
+ char string[128];
+ unsigned i;
- hwloc_obj_snprintf(string, sizeof(string), topology, obj, "#", 0);
- printf("%*s%s\n", 2*depth, "", string);
- for (i = 0; i < obj->arity; i++)
- print_children(topology, obj->children[i], depth + 1);
+ hwloc_obj_snprintf(string, sizeof(string), topology, obj, "#", 0);
+ printf("%*s%s\n", 2*depth, "", string);
+ for (i = 0; i < obj->arity; i++) {
+ print_children(topology, obj->children[i], depth + 1);
+ }
}
int main(void)
{
- /* Topology object */
- hwloc_topology_t topology;
+ int depth;
+ unsigned i;
+ unsigned long size;
+ int levels;
+ char string[128];
+ int topodepth;
+ hwloc_topology_t topology;
+ hwloc_cpuset_t cpuset;
+ hwloc_obj_t obj;
- /* Allocate and initialize topology object. */
- hwloc_topology_init(&topology);
+ /* Allocate and initialize topology object. */
+ hwloc_topology_init(&topology);
- /* ... Optionally, put detection configuration here to e.g. ignore some
- objects types, define a synthetic topology, etc.... The default is
- to detect all the objects of the machine that the caller is allowed
- to access.
- See Configure Topology Detection. */
+ /* ... Optionally, put detection configuration here to ignore
+ some objects types, define a synthetic topology, etc....
- /* Perform the topology detection. */
- hwloc_topology_load(topology);
+ The default is to detect all the objects of the machine that
+ the caller is allowed to access. See Configure Topology
+ Detection. */
+ /* Perform the topology detection. */
+ hwloc_topology_load(topology);
- /* Optionally, get some additional topology information
- * in case we need the topology depth later.
- */
- unsigned topodepth = hwloc_topology_get_depth(topology);
+ /* Optionally, get some additional topology information
+ in case we need the topology depth later. */
+ topodepth = hwloc_topology_get_depth(topology);
+ /*****************************************************************
+ * First example:
+ * Walk the topology with an array style, from level 0 (always
+ * the system level) to the lowest level (always the proc level).
+ *****************************************************************/
+ for (depth = 0; depth < topodepth; depth++) {
+ printf("*** Objects at level %d\n", depth);
+ for (i = 0; i < hwloc_get_nbobjs_by_depth(topology, depth);
+ i++) {
+ hwloc_obj_snprintf(string, sizeof(string), topology,
+ hwloc_get_obj_by_depth(topology, depth, i),
+ "#", 0);
+ printf("Index %u: %s\n", i, string);
+ }
+ }
- /* Walk the topology with an array style, from level 0 (always the
- * system level) to the lowest level (always the proc level). */
- int depth, i;
- char string[128];
- for (depth = 0; depth < topodepth; depth++) {
- for (i = 0; i < hwloc_get_nbobjs_by_depth(topology, depth); i++) {
- hwloc_obj_snprintf(string, sizeof(string), topology,
- hwloc_get_obj_by_depth(topology, depth, i), "#", 0);
- printf("%s\n", string);
- }
- }
+ /*****************************************************************
+ * Second example:
+ * Walk the topology with a tree style.
+ *****************************************************************/
+ printf("*** Printing overall tree\n");
+ print_children(topology, hwloc_get_root_obj(topology), 0);
- /* Walk the topology with a tree style. */
- print_children(topology, hwloc_get_system_obj(topology), 0);
+ /*****************************************************************
+ * Third example:
+ * Print the number of sockets.
+ *****************************************************************/
+ depth = hwloc_get_type_depth(topology, HWLOC_OBJ_SOCKET);
+ if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) {
+ printf("*** The number of sockets is unknown\n");
+ } else {
+ printf("*** %u socket(s)\n",
+ hwloc_get_nbobjs_by_depth(topology, depth));
+ }
+ /*****************************************************************
+ * Fourth example:
+ * Compute the amount of cache that the first logical processor
+ * has above it.
+ *****************************************************************/
+ levels = 0;
+ size = 0;
+ for (obj = hwloc_get_obj_by_type(topology, HWLOC_OBJ_PU, 0);
+ obj;
+ obj = obj->parent)
+ if (obj->type == HWLOC_OBJ_CACHE) {
+ levels++;
+ size += obj->attr->cache.size;
+ }
+ printf("*** Logical processor 0 has %d caches totaling %luKB\n",
+ levels, size / 1024);
- /* Print the number of sockets. */
- depth = hwloc_get_type_depth(topology, HWLOC_OBJ_SOCKET);
- if (depth == HWLOC_TYPE_DEPTH_UNKNOWN)
- printf("The number of sockets is unknown\n");
- else
- printf("%u socket(s)\n", hwloc_get_nbobjs_by_depth(topology, depth));
+ /*****************************************************************
+ * Fifth example:
+ * Bind to only one thread of the last core of the machine.
+ *
+ * First find out where cores are, or else smaller sets of CPUs if
+ * the OS doesn't have the notion of a "core".
+ *****************************************************************/
+ depth = hwloc_get_type_or_below_depth(topology, HWLOC_OBJ_CORE);
+ /* Get last core. */
+ obj = hwloc_get_obj_by_depth(topology, depth,
+ hwloc_get_nbobjs_by_depth(topology, depth) - 1);
+ if (obj) {
+ /* Get a copy of its cpuset that we may modify. */
+ cpuset = hwloc_cpuset_dup(obj->cpuset);
- /* Find out where cores are, or else smaller sets of CPUs if the OS
- * doesn't have the notion of core. */
- depth = hwloc_get_type_or_below_depth(topology, HWLOC_OBJ_CORE);
+ /* Get only one logical processor (in case the core is
+ SMT/hyperthreaded). */
+ hwloc_cpuset_singlify(cpuset);
- /* Get last one. */
- hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, hwloc_get_nbobjs_by_depth(topology, depth) - 1);
- if (!obj)
- return 0;
+ /* And try to bind ourself there. */
+ if (hwloc_set_cpubind(topology, cpuset, 0)) {
+ char *str;
+ hwloc_cpuset_asprintf(&str, obj->cpuset);
+ printf("Couldn't bind to cpuset %s\n", str);
+ free(str);
+ }
- /* Get a copy of its cpuset that we may modify. */
- hwloc_cpuset_t cpuset = hwloc_cpuset_dup(obj->cpuset);
+ /* Free our cpuset copy */
+ hwloc_cpuset_free(cpuset);
+ }
- /* Get only one logical processor (in case the core is SMT/hyperthreaded). */
- hwloc_cpuset_singlify(cpuset);
+ /* Destroy topology object. */
+ hwloc_topology_destroy(topology);
- /* And try to bind ourself there. */
- if (hwloc_set_cpubind(topology, cpuset, 0)) {
- char *str = NULL;
- hwloc_cpuset_asprintf(&str, obj->cpuset);
- printf("Couldn't bind to cpuset %s\n", str);
- free(str);
- }
-
- /* Free our cpuset copy */
- hwloc_cpuset_free(cpuset);
-
- /* Destroy topology object. */
- hwloc_topology_destroy(topology);
-
- return 0;
+ return 0;
}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/hwloc.doxy
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/hwloc.doxy 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/hwloc.doxy 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,10 +1,10 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
- * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+ * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
-/*! \mainpage hwloc
+/*! \mainpage Hardware Locality
<h1 class="sub">Portable abstraction of hierarchical architectures for high-performance computing</h1>
@@ -18,7 +18,8 @@
hwloc provides command line tools and a C API to obtain the
hierarchical map of key computing elements, such as: NUMA memory
nodes, shared caches, processor sockets, processor cores, and
-processor "threads". hwloc also gathers various attributes such as
+processing units (logical processors or "threads").
+hwloc also gathers various attributes such as
cache and memory information, and is portable across a variety of
different operating systems and platforms.
@@ -33,17 +34,19 @@
"re-branding" of the libtopology code base, but with both a few
genuinely new features and a few PLPA-like features added in. More
new features and more PLPA-like features will be added to hwloc over
-time.
+time. See \ref switchfromplpa for more details about converting
+your application from PLPA to hwloc.
hwloc supports the following operating systems:
<ul>
<li>Linux (including old kernels not having sysfs topology
-information, with knowledge of cpusets, offline cpus, and Kerrighed
-support)</li>
+information, with knowledge of cpusets, offline cpus, ScaleMP vSMP,
+and Kerrighed support)</li>
<li>Solaris</li>
<li>AIX</li>
<li>Darwin / OS X</li>
+<li>FreeBSD and its variants, such as kFreeBSD/GNU</li>
<li>OSF/1 (a.k.a., Tru64)</li>
<li>HP-UX</li>
<li>Microsoft Windows</li>
@@ -95,7 +98,7 @@
shell$ ./autogen.sh
\endcode
-Note that GNU Autoconf >=2.60, Automake >=1.10 and Libtool >=2.2.6 are
+Note that GNU Autoconf >=2.63, Automake >=1.10 and Libtool >=2.2.6 are
required when building from a Subversion checkout.
Installation by itself is the fairly common GNU-based process:
@@ -122,39 +125,39 @@
may show the following outputs:
\image html dudley.png
-\image latex dudley.png width=\textwidth
+\image latex dudley.png "" width=9cm
-\code
-System(15GB)
- Socket#0 + L3(4096KB)
- L2(1024KB) + L1(16KB) + Core#0
- P#0
- P#8
- L2(1024KB) + L1(16KB) + Core#1
- P#4
- P#12
- Socket#1 + L3(4096KB)
- L2(1024KB) + L1(16KB) + Core#0
- P#1
- P#9
- L2(1024KB) + L1(16KB) + Core#1
- P#5
- P#13
- Socket#2 + L3(4096KB)
- L2(1024KB) + L1(16KB) + Core#0
- P#2
- P#10
- L2(1024KB) + L1(16KB) + Core#1
- P#6
- P#14
- Socket#3 + L3(4096KB)
- L2(1024KB) + L1(16KB) + Core#0
- P#3
- P#11
- L2(1024KB) + L1(16KB) + Core#1
- P#7
- P#15
-\endcode
+\verbatim
+Machine (16GB)
+ Socket #0 + L3 #0 (4096KB)
+ L2 #0 (1024KB) + L1 #0 (16KB) + Core #0
+ PU #0 (phys=0)
+ PU #1 (phys=8)
+ L2 #1 (1024KB) + L1 #1 (16KB) + Core #1
+ PU #2 (phys=4)
+ PU #3 (phys=12)
+ Socket #1 + L3 #1 (4096KB)
+ L2 #2 (1024KB) + L1 #2 (16KB) + Core #2
+ PU #4 (phys=1)
+ PU #5 (phys=9)
+ L2 #3 (1024KB) + L1 #3 (16KB) + Core #3
+ PU #6 (phys=5)
+ PU #7 (phys=13)
+ Socket #2 + L3 #2 (4096KB)
+ L2 #4 (1024KB) + L1 #4 (16KB) + Core #4
+ PU #8 (phys=2)
+ PU #9 (phys=10)
+ L2 #5 (1024KB) + L1 #5 (16KB) + Core #5
+ PU #10 (phys=6)
+ PU #11 (phys=14)
+ Socket #3 + L3 #3 (4096KB)
+ L2 #6 (1024KB) + L1 #6 (16KB) + Core #6
+ PU #12 (phys=3)
+ PU #13 (phys=11)
+ L2 #7 (1024KB) + L1 #7 (16KB) + Core #7
+ PU #14 (phys=7)
+ PU #15 (phys=15)
+\endverbatim
On a 4-socket 2-core Opteron NUMA machine, the \c lstopo tool may
show the following outputs:
@@ -162,57 +165,57 @@
\image html hagrid.png
\image latex hagrid.png width=\textwidth
-\code
-System(62GB)
- Node#0(8190MB) + Socket#0
- L2(1024KB) + L1(64KB) + Core#0 + P#0
- L2(1024KB) + L1(64KB) + Core#1 + P#1
- Node#1(8192MB) + Socket#1
- L2(1024KB) + L1(64KB) + Core#0 + P#2
- L2(1024KB) + L1(64KB) + Core#1 + P#3
- Node#2(8192MB) + Socket#2
- L2(1024KB) + L1(64KB) + Core#0 + P#4
- L2(1024KB) + L1(64KB) + Core#1 + P#5
- Node#3(8192MB) + Socket#3
- L2(1024KB) + L1(64KB) + Core#0 + P#6
- L2(1024KB) + L1(64KB) + Core#1 + P#7
- Node#4(8192MB) + Socket#4
- L2(1024KB) + L1(64KB) + Core#0 + P#8
- L2(1024KB) + L1(64KB) + Core#1 + P#9
- Node#5(8192MB) + Socket#5
- L2(1024KB) + L1(64KB) + Core#0 + P#10
- L2(1024KB) + L1(64KB) + Core#1 + P#11
- Node#6(8192MB) + Socket#6
- L2(1024KB) + L1(64KB) + Core#0 + P#12
- L2(1024KB) + L1(64KB) + Core#1 + P#13
- Node#7(8192MB) + Socket#7
- L2(1024KB) + L1(64KB) + Core#0 + P#14
- L2(1024KB) + L1(64KB) + Core#1 + P#15
-\endcode
+\verbatim
+Machine (64GB)
+ NUMANode #0 (phys=0 8190MB) + Socket #0
+ L2 #0 (1024KB) + L1 #0 (64KB) + Core #0 + PU #0 (phys=0)
+ L2 #1 (1024KB) + L1 #1 (64KB) + Core #1 + PU #1 (phys=1)
+ NUMANode #1 (phys=1 8192MB) + Socket #1
+ L2 #2 (1024KB) + L1 #2 (64KB) + Core #2 + PU #2 (phys=2)
+ L2 #3 (1024KB) + L1 #3 (64KB) + Core #3 + PU #3 (phys=3)
+ NUMANode #2 (phys=2 8192MB) + Socket #2
+ L2 #4 (1024KB) + L1 #4 (64KB) + Core #4 + PU #4 (phys=4)
+ L2 #5 (1024KB) + L1 #5 (64KB) + Core #5 + PU #5 (phys=5)
+ NUMANode #3 (phys=3 8192MB) + Socket #3
+ L2 #6 (1024KB) + L1 #6 (64KB) + Core #6 + PU #6 (phys=6)
+ L2 #7 (1024KB) + L1 #7 (64KB) + Core #7 + PU #7 (phys=7)
+ NUMANode #4 (phys=4 8192MB) + Socket #4
+ L2 #8 (1024KB) + L1 #8 (64KB) + Core #8 + PU #8 (phys=8)
+ L2 #9 (1024KB) + L1 #9 (64KB) + Core #9 + PU #9 (phys=9)
+ NUMANode #5 (phys=5 8192MB) + Socket #5
+ L2 #10 (1024KB) + L1 #10 (64KB) + Core #10 + PU #10 (phys=10)
+ L2 #11 (1024KB) + L1 #11 (64KB) + Core #11 + PU #11 (phys=11)
+ NUMANode #6 (phys=6 8192MB) + Socket #6
+ L2 #12 (1024KB) + L1 #12 (64KB) + Core #12 + PU #12 (phys=12)
+ L2 #13 (1024KB) + L1 #13 (64KB) + Core #13 + PU #13 (phys=13)
+ NUMANode #7 (phys=7 8192MB) + Socket #7
+ L2 #14 (1024KB) + L1 #14 (64KB) + Core #14 + PU #14 (phys=14)
+ L2 #15 (1024KB) + L1 #15 (64KB) + Core #15 + PU #15 (phys=15)
+\endverbatim
On a 2-socket quad-core Xeon (pre-Nehalem, with 2 dual-core dies into
each socket):
\image html emmett.png
-\image latex emmett.png "" width=8cm
+\image latex emmett.png "" width=7cm
-\code
-System(15GB)
- Socket#0
- L2(4096KB)
- L1(32KB) + Core#0 + P#0
- L1(32KB) + Core#1 + P#4
- L2(4096KB)
- L1(32KB) + Core#2 + P#2
- L1(32KB) + Core#3 + P#6
- Socket#1
- L2(4096KB)
- L1(32KB) + Core#0 + P#1
- L1(32KB) + Core#1 + P#5
- L2(4096KB)
- L1(32KB) + Core#2 + P#3
- L1(32KB) + Core#3 + P#7
-\endcode
+\verbatim
+Machine (16GB)
+ Socket #0
+ L2 #0 (4096KB)
+ L1 #0 (32KB) + Core #0 + PU #0 (phys=0)
+ L1 #1 (32KB) + Core #1 + PU #1 (phys=4)
+ L2 #1 (4096KB)
+ L1 #2 (32KB) + Core #2 + PU #2 (phys=2)
+ L1 #3 (32KB) + Core #3 + PU #3 (phys=6)
+ Socket #1
+ L2 #2 (4096KB)
+ L1 #4 (32KB) + Core #4 + PU #4 (phys=1)
+ L1 #5 (32KB) + Core #5 + PU #5 (phys=5)
+ L2 #3 (4096KB)
+ L1 #6 (32KB) + Core #6 + PU #6 (phys=3)
+ L1 #7 (32KB) + Core #7 + PU #7 (phys=7)
+\endverbatim
\htmlonly
</div><div class="section" id="interface">
@@ -220,28 +223,23 @@
\section interface Programming interface
-The basic interface is available in hwloc.h. It mostly offers
+The basic interface is available in hwloc.h. It essentially offers
low-level routines for advanced programmers that want to manually
manipulate objects and follow links between them. Developers should
-look at hwloc/helper.h, which provides good higher-level topology
+also look at hwloc/helper.h, which provides good higher-level topology
traversal examples.
-Each object contains a cpuset describing the list of processors that
+Each object contains a cpuset describing the list of processing units that
it contains. These cpusets may be used for \ref hwlocality_binding.
hwloc offers an extensive cpuset manipulation interface in
hwloc/cpuset.h.
Moreover, hwloc also comes with additional helpers for
-interoperability with several commonly used environments. For Linux,
-some specific helpers are available in hwloc/linux.h, and
-hwloc/linux-libnuma.h if using libnuma. On glibc-based systems,
-additional helpers are available in hwloc/glibc-sched.h. For Linux
-systems with the OpenFabrics verbs library, some dedicated helpers are
-provided in hwloc/openfabrics-verbs.h (this helper file is not yet
-useful on non-Linux systems with the OpenFabrics verbs library).
+interoperability with several commonly used environments.
+See the \ref interoperability section for details.
-To precisely define the vocabulary used by hwloc, a \ref glossary is
-available and should probably be read first.
+To precisely define the vocabulary used by hwloc, a \ref termsanddefs
+section is available and should probably be read first.
Further documentation is available in a full set of HTML pages, man
pages, and self-contained PDF files (formatted for both both US letter
@@ -254,23 +252,61 @@
The following section presents an example of API usage.
-\section interface_example Interface example
+\section interface_example API example
-This section shows how to use hwloc with an small example \c hwloc-hello.c
-that just prints the topology and binds itself to the first processor of the
-second core of the machine.
+The following small C example (named ``hwloc-hello.c'') prints the
+topology of the machine and bring the process to the first logical processor
+of the second core of the machine.
-Hardware Location provides a pkg-config object, so compiling the
-example boils down to
+\include hwloc-hello.c
+hwloc provides a \c pkg-config executable to obtain relevant compiler
+and linker flags. For example, it can be used thusly to compile
+applications that utilize the hwloc library (assuming GNU Make):
+
\verbatim
CFLAGS += $(pkg-config --cflags hwloc)
LDLIBS += $(pkg-config --libs hwloc)
cc hwloc-hello.c $(CFLAGS) -o hwloc-hello $(LDLIBS)
\endverbatim
-\include hwloc-hello.c
+On a machine with 4GB of RAM and 2 processor sockets -- each socket of
+which has two processing cores -- the output from running \c
+hwloc-hello could be something like the following:
+\verbatim
+shell$ ./hwloc-hello
+*** Objects at level 0
+Index 0: Machine(3938MB)
+*** Objects at level 1
+Index 0: Socket#0
+Index 1: Socket#1
+*** Objects at level 2
+Index 0: Core#0
+Index 1: Core#1
+Index 2: Core#3
+Index 3: Core#2
+*** Objects at level 3
+Index 0: PU#0
+Index 1: PU#1
+Index 2: PU#2
+Index 3: PU#3
+*** Printing overall tree
+Machine(3938MB)
+ Socket#0
+ Core#0
+ PU#0
+ Core#1
+ PU#1
+ Socket#1
+ Core#3
+ PU#2
+ Core#2
+ PU#3
+*** 2 socket(s)
+shell$
+\endverbatim
+
\htmlonly
</div><div class="section" id="bugs">
\endhtmlonly
@@ -281,6 +317,18 @@
Bug reports should be reported in the tracker
(https://svn.open-mpi.org/trac/hwloc/).
+If hwloc discovers an incorrect topology for your machine, the very
+first thing you should check is to ensure that you have the most
+recent updates installed for your operating system. Indeed, most of
+hwloc topology discovery relies on hardware information retrieved
+through the operation system (e.g., via the /sys virtual filesystem of
+the Linux kernel). If upgrading your OS or Linux kernel does not
+solve your problem, you may also want to ensure that you are running
+the most recent version of the BIOS for your machine.
+
+If those things fail, contact us on the mailing list for additional
+help.
+
\htmlonly
</div><div class="section" id="credits">
\endhtmlonly
@@ -303,68 +351,534 @@
</div>
\endhtmlonly
-\page glossary Glossary
+
+\page termsanddefs Terms and Definitions
+
<dl>
<dt>Object</dt>
- <dd>Interesting kind of part of the system, such as a Core, a Cache, a Memory
- node, etc. The different types detected by hwloc are detailed in the
- ::hwloc_obj_type_e enumeration.
+ <dd>Interesting kind of part of the system, such as a Core, a Cache,
+ a Memory node, etc. The different types detected by hwloc are
+ detailed in the ::hwloc_obj_type_t enumeration.
- They are topologically sorted by CPU set into a tree whose root is the System object which always exists.
+ They are topologically sorted by CPU set into a tree.
</dd>
<dt>CPU set</dt>
- <dd>The set of logical processors logically included in an object, if any</dd>
+ <dd>The set of logical processors (or processing units) logically included in an object
+ (if it makes sense). They are always expressed using physical logical
+ processor numbers (as announced by the OS). They are just masks, they do \em
+ not have any relation with an operating system actual binding notion like
+ Linux' cpusets.</dd>
-<dt>Father object</dt>
- <dd>The object logically containing the current object, for instance because
- its CPU set includes the CPU set of the current object.
- </dd>
+<dt>Parent object</dt>
+ <dd>The object logically containing the current object, for example
+ because its CPU set includes the CPU set of the current object.</dd>
-<dt>Children objects</dt>
- <dd>The object contained in the current object because their CPU set is
- included in the CPU set of the current object.</dd>
+<dt>Ancestor object</dt>
+ <dd>The parent object, or its own parent object, and so on.</dd>
+<dt>Children object(s)</dt>
+ <dd>The object (or objects) contained in the current object because
+ their CPU set is included in the CPU set of the current object.</dd>
+
<dt>Arity</dt>
- <dd>The number of children of an object</dd>
+ <dd>The number of children of an object.</dd>
<dt>Sibling objects</dt>
- <dd>Objects of the same type which have the same father</dd>
+ <dd>Objects of the same type which have the same parent.</dd>
<dt>Sibling rank</dt>
- <dd>Index to uniquely identify objecst of the same type which have the same
- father, numbered from 0 to the arity of the father minus one.</dd>
+ <dd>Index to uniquely identify objects of the same type which have
+ the same parent, and is always in the range [0, parent_arity).</dd>
<dt>Cousin objects</dt>
- <dd>Objects of the same type as the current object</dd>
+ <dd>Objects of the same type as the current object.</dd>
<dt>Level</dt>
- <dd>Set of objects of the same type</dd>
+ <dd>Set of objects of the same type.</dd>
<dt>OS index</dt>
- <dd>The index that the OS uses to identify the object. This may sometimes be
- completely arbitrary or depend on the BIOS configuration.</dd>
+ <dd>The index that the operating system (OS) uses to identify the
+ object. This may be completely arbitrary, or it may depend on the
+ BIOS configuration.</dd>
<dt>Depth</dt>
- <dd>Nesting level in the object tree, starting from the System object.</dd>
+ <dd>Nesting level in the object tree, starting from the 0th object.</dd>
<dt>Logical index</dt>
- <dd>Index to uniquely identify objects of the same type. This index is always
- linear from 0 to the number of objects of the level for that type, to express
- proximity. It could also be called cousin rank.</dd>
+ <dd>Index to uniquely identify objects of the same type. It
+ expresses proximity in a generic way. This index is always linear
+ and in the range [0, num_objs_same_type_same_level). Think of it
+ as ``cousin rank.'' The ordering is based on topology first, and
+ then on OS CPU numbers, so it is stable across everything except
+ firmware CPU renumbering.</dd>
+<dt>Logical processor</dt>
+<dt>Processing unit</dt>
+ <dd>The smallest processing element that can be represented by a hwloc
+ object. It may be a single-core processor, a core of a multicore
+ processor, or a single thread in SMT processor.</dd>
+
</dl>
The following diagram can help to understand the vocabulary of the relationships
-by showing the example of a machine with two dual core non-SMT sockets, thus a
-topology with 4 levels.
+by showing the example of a machine with two dual core sockets (with no
+hardware threads); thus, a topology with 4 levels. Each box with rounded corner
+corresponds to one hwloc_obj_t, containing the values of the different integer
+fields (depth, logical_index, etc.), and arrows show to which other hwloc_obj_t
+pointers point to (first_child, parent, etc.)
\image html diagram.png
\image latex diagram.eps width=\textwidth
-It should be noted that for Processor objects, the logical index, computed
-linearly by hwloc, is not the same as the OS index.
+It should be noted that for PU objects, the logical index -- as
+computed linearly by hwloc -- is not the same as the OS index.
+
+
+\page tools Command-line tools
+
+hwloc comes with an extensive C programming interface and several
+command line utilities. Each of them is fully documented in its own
+manual page; the following is a summary of the available command line
+tools.
+
+\section cli_lstopo lstopo
+
+lstopo (also known as hwloc-info and hwloc-ls) displays the
+hierarchical topology map of the current system. The output may be
+graphic or textual, and can also be exported to numerous file
+formats such as PDF, PNG, XML, and others.
+
+Note that lstopo can read XML files and/or alternate chroot
+filesystems and display topological maps representing those systems
+(e.g., use lstopo to output an XML file on one system, and then use
+lstopo to read in that XML file and display it on a different system).
+
+\section cli_hwloc_bind hwloc-bind
+
+hwloc-bind binds processes to specific hardware objects through a
+flexible syntax. A simple example is binding an executable to
+specific cores (or sockets or cpusets or ...). The hwloc-bind(1) man
+page provides much more detail on what is possible.
+
+hwloc-bind can also be used to retrieve the current process' binding.
+
+\section cli_hwloc_calc hwloc-calc
+
+hwloc-calc is generally used to create cpuset strings to pass to
+hwloc-bind. Although hwloc-bind accepts many forms of object
+specification (i.e., cpuset strings are one of many forms that
+hwloc-bind understands), they can be useful, compact representations
+in shell scripts, for example.
+
+hwloc-calc generates cpuset strings from given hardware objects with
+the ability to aggregate them, intersect them, and more. hwloc-calc
+generally uses the same syntax than hwloc-bind, but multiple instances
+may be composed to generate complex combinations.
+
+Note that hwloc-calc can also generate lists of logical processors or
+NUMA nodes that are convenient to pass to some external tools such as
+taskset or numactl.
+
+\section cli_hwloc_distrib hwloc-distrib
+
+hwloc-distrib generates a set of cpuset strings that are uniformly
+distributed across the machine for the given number of processes.
+These strings may be used with hwloc-bind to run processes to maximize
+their memory bandwidth by properly distributing them across the
+machine.
+
+
+
+\page envvar Environment variables
+
+The behavior of the hwloc library and tools may be tuned thanks to the
+following environment variables.
+
+<dl>
+
+<dt>HWLOC_XMLFILE=/path/to/file.xml</dt>
+ <dd>enforces the discovery from the given XML file as if
+ hwloc_topology_set_xml() had been called.
+ This file may have been generated earlier with lstopo file.xml.
+ For convenience, this backend provides empty binding hooks which just
+ return success. To have hwloc still actually call OS-specific hooks,
+ HWLOC_THISSYSTEM should be set 1 in the environment too, to assert that
+ the loaded file is really the underlying system.
+ </dd>
+
+<dt>HWLOC_FSROOT=/path/to/linux/filesystem-root/</dt>
+ <dd>switches to reading the topology from the specified
+ Linux filesystem root instead of the main file-system root, as if
+ hwloc_topology_set_fsroot() had been called.
+ Not using the main file-system root causes hwloc_topology_is_thissystem()
+ to return 0.
+ For convenience, this backend provides empty binding hooks which just
+ return success. To have hwloc still actually call OS-specific hooks,
+ HWLOC_THISSYSTEM should be set 1 in the environment too, to assert that
+ the loaded file is really the underlying system.
+ </dd>
+
+<dt>HWLOC_THISSYSTEM=1</dt>
+ <dd>enforces the return value of hwloc_topology_is_thissystem().
+ It means that it 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.
+ 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.
+ </dd>
+
+</dl>
+
+
+
+\page interoperability Interoperability with other software
+
+Although hwloc offers its own portable interface, it still may have to
+interoperate with specific or non-portable libraries that manipulate
+similar kinds of objects. hwloc therefore offers several specific
+"helpers" to assist converting between those specific interfaces and
+hwloc.
+
+Some external libraries may be specific to a particular OS; others may
+not always be available. The hwloc core therefore generally does not
+explicitly depend on these types of libraries. However, when a custom
+application uses or otherwise depends on such a library, it may
+optionally include the corresponding hwloc helper to extend the hwloc
+interface with dedicated helpers.
+
+<dl>
+
+<dt>Linux specific features</dt>
+ <dd>
+ hwloc/linux.h offers Linux-specific helpers that utilize some
+ non-portable features of the Linux system, such as binding threads
+ through their thread ID ("tid") or parsing kernel CPU mask files.
+ </dd>
+
+<dt>Linux libnuma</dt>
+ <dd>
+ hwloc/linux-libnuma.h provides conversion helpers between hwloc CPU
+ sets and libnuma-specific types, such as nodemasks and bitmasks. It
+ helps you use libnuma memory-binding functions with hwloc CPU sets.
+ </dd>
+
+<dt>Glibc</dt>
+ <dd>
+ hwloc/glibc-sched.h offers conversion routines between Glibc and
+ hwloc CPU sets in order to use hwloc with functions such as
+ sched_setaffinity().
+ </dd>
+
+<dt>OpenFabrics Verbs</dt>
+ <dd>
+ hwloc/openfabrics-verbs.h helps interoperability with the
+ OpenFabrics Verbs interface. For example, it can return a list of
+ processors near an OpenFabrics device.
+ </dd>
+
+</dl>
+
+
+
+\page threadsafety Thread safety
+
+Like most libraries that mainly fill data structures, hwloc is not
+thread safe but rather reentrant: all state is held in a \ref
+hwloc_topology_t instance without mutex protection. That means, for
+example, that two threads can safely operate on and modify two
+different \ref hwloc_topology_t instances, but they should not
+simultaneously invoke functions that modify the <em>same</em>
+instance. Similarly, one thread should not modify a \ref
+hwloc_topology_t instance while another thread is reading or
+traversing it. However, two threads can safely read or traverse the
+same \ref hwloc_topology_t instance concurrently.
+
+When running in multiprocessor environments, be aware that proper thread
+synchronization and/or memory coherency protection is needed to pass hwloc
+data (such as \ref hwloc_topology_t pointers) from one processor
+to another (e.g., a mutex, semaphore, or a memory barrier).
+Note that this is not a hwloc-specific requirement, but it is worth
+mentioning.
+
+For reference, \ref hwloc_topology_t modification operations include
+(but may not be limited to):
+
+<dl>
+
+<dt>Creation and destruction</dt>
+ <dd><tt>hwloc_topology_init(), hwloc_topology_load(),
+ hwloc_topology_destroy()</tt> (see \ref hwlocality_creation) imply
+ major modifications of the structure, including freeing some
+ objects. No other thread cannot access the topology or any of its
+ objects at the same time.
+
+ Also references to objects inside the topology are not valid anymore
+ after these functions return. </dd>
+
+<dt>Runtime topology modifications</dt>
+ <dd><tt>hwloc_topology_insert_misc_object_by_*</tt> (see \ref
+ hwlocality_tinker) may modify the topology significantly by adding
+ objects inside the tree, changing the topology depth, etc.
+
+ Although references to former objects <em>may</em> still be valid
+ after insertion, it is strongly advised to not rely on any such
+ guarantee and always re-consult the topology to reacquire new
+ instances of objects. </dd>
+
+<dt>Locating topologies</dt>
+
+ <dd><tt>hwloc_topology_ignore*</tt>, <tt>hwloc_topology_set*</tt>
+ (see \ref hwlocality_configuration) do not modify the topology
+ directly, but they do modify internal structures describing the
+ behavior of the next invocation of <tt>hwloc_topology_load()</tt>.
+ Hence, all of these functions should not be used concurrently.
+
+ Note that these functions do not modify the current topology until
+ it is actually reloaded; it is possible to use them while other
+ threads are only read the current topology. </dd>
+
+</dl>
+
+
+
+\page embed Embedding hwloc in other software
+
+It can be desirable to include hwloc in a larger software package (be
+sure to check out the LICENSE file) so that users don't have to
+separately download and install it before installing your software.
+This can be advantageous to ensure that your software uses a
+known-tested/good version of hwloc, or for use on systems that do not
+have hwloc pre-installed.
+
+When used in "embedded" mode, hwloc will:
+
+- not install any header files
+- not build any documentation files
+- not build or install any executables or tests
+- not build <tt>libhwloc.*</tt> -- instead, it will build
+ <tt>libhwloc_embedded.*</tt>
+
+There are two ways to put hwloc into "embedded" mode. The first is
+directly from the configure command line:
+
+\verbatim
+shell$ ./configure --enable-embedded-mode ...
+\endverbatim
+
+The second requires that your software project uses the GNU Autoconf /
+Automake / Libtool tool chain to build your software. If you do this,
+you can directly integrate hwloc's m4 configure macro into your
+configure script. You can then invoke hwloc's configuration tests and
+build setup by calling an m4 macro (see below).
+
+\section embedding_m4 Using hwloc's m4 embedding capabilities
+
+Every project is different, and there are many different ways of
+integrating hwloc into yours. What follows is <em>one</em> example of
+how to do it.
+
+If your project uses recent versions Autoconf, Automake, and Libtool
+to build, you can use hwloc's embedded m4 capabilities. We have
+tested the embedded m4 with projects that use Autoconf 2.65, Automake
+1.11.1, and Libtool 2.2.6b. Slightly earlier versions of may also
+work but are untested. Autoconf versions prior to 2.63 are almost
+certain to not work because hwloc uses macros that were introduced in
+2.63.
+
+You can either copy all the config/hwloc*m4 files from the hwloc
+source tree to the directory where your project's m4 files reside, or
+you can tell aclocal to find more m4 files in the embedded hwloc's
+"config" subdirectory (e.g., add "-Ipath/to/embedded/hwloc/config" to
+your Makefile.am's ACLOCAL_AMFLAGS).
+
+The following macros can then be used from your configure script (only
+HWLOC_INIT <em>must</em> be invoked if using the m4 macros):
+
+- HWLOC_INIT(config-dir-prefix, action-upon-success,
+ action-upon-failure): Invoke the hwloc configuration tests and setup
+ the hwloc tree to build. The first argument is the prefix to use
+ for AC_OUTPUT files -- it's where the hwloc tree is located relative
+ to <tt>$top_srcdir</tt>. Hence, if your embedded hwloc is located
+ in the source tree at contrib/hwloc, you should pass
+ <tt>[contrib/hwloc]</tt> as the first argument. If HWLOC_INIT and
+ the rest of <tt>configure</tt> completes successfully, then "make"
+ traversals of the hwloc tree with standard Automake targets (all,
+ clean, install, etc.) should behave as expected. For example, it is
+ safe to list the hwloc directory in the SUBDIRS of a higher-level
+ Makefile.am. <strong>NOTE: If the HWLOC_SET_SYMBOL_PREFIX macro is
+ used, it must be invoked <em>before</em> HWLOC_INIT.</strong>
+
+- HWLOC_SET_SYMBOL_PREFIX(foo_): Tells the hwloc to prefix all of
+ hwloc's types and public symbols with "foo_"; meaning that function
+ hwloc_init() becomes foo_hwloc_init(). Enum values are prefixed
+ with an upper-case translation if the prefix supplied;
+ HWLOC_OBJ_SYSTEM becomes FOO_HWLOC_OBJ_SYSTEM. This is recommended
+ behavior if you are including hwloc in middleware -- it is possible
+ that your software will be combined with other software that links
+ to another copy of hwloc. If both uses of hwloc utilize different
+ symbol prefixes, there will be no type/symbol clashes, and
+ everything will compile, link, and run successfully. If you both
+ embed hwloc without changing the symbol prefix and also link against
+ an external hwloc, you may get multiple symbol definitions when
+ linking your final library or application.
+
+- HWLOC_DO_AM_CONDITIONALS: If you embed hwloc in a larger project and
+ build it conditionally (e.g., if HWLOC_INIT is invoked
+ conditionally), you must unconditionally invoke
+ HWLOC_DO_AM_CONDITIONALS to avoid warnings from Automake (for the
+ cases where hwloc is not selected to be built). This macro is
+ necessary because hwloc uses some AM_CONDITIONALs to build itself,
+ and AM_CONDITIONALs cannot be defined conditionally. Note that it
+ is safe (but unnecessary) to call HWLOC_DO_AM_CONDITIONALS even if
+ HWLOC_INIT is invoked unconditionally.
+
+NOTE: When using the HWLOC_INIT m4 macro, it may be necessary to
+explicitly invoke AC_CANONICAL_TARGET and/or AC_USE_SYSTEM_EXTENSIONS
+macros early in the configure script (e.g., after AC_INIT but before
+AM_INIT_AUTOMAKE). See the Autoconf documentation for further
+information.
+
+
+\section embedding_example Example embedding hwloc
+
+Here's an example of integrating with a larger project named sandbox
+that already uses Autoconf, Automake, and Libtool to build itself:
+
+\verbatim
+# First, cd into the sandbox project source tree
+shell$ cd sandbox
+shell$ cp -r /somewhere/else/hwloc-<version> my-embedded-hwloc
+shell$ edit Makefile.am
+ 1. Add "-Imy-embedded-hwloc/config" to ACLOCAL_AMFLAGS
+ 2. Add "my-embedded-hwloc" to SUBDIRS
+ 3. Add "$(HWLOC_EMBEDDED_LDADD)" to sandbox's executable's LDADD line
+ 4. Add "$(HWLOC_EMBEDDED_CPPFLAGS)" to AM_CPPFLAGS
+shell$ edit configure.ac
+ 1. Add "HWLOC_SET_SYMBOL_PREFIX(sandbox_hwloc_)" line
+ 2. Add "HWLOC_INIT([my-embedded-hwloc], [happy=yes], [happy=no])" line
+ 3. Add error checking for happy=no case
+shell$ edit sandbox.c
+ 1. Add #include <hwloc.h>
+ 2. Add calls to sandbox_hwloc_init() and other hwloc API functions
+\endverbatim
+
+Now you can bootstrap, configure, build, and run the sandbox as normal
+-- all calls to "sandbox_hwloc_*" will use the embedded hwloc rather
+than any system-provided copy of hwloc.
+
+
+
+\page switchfromplpa Switching from PLPA to hwloc
+
+Although PLPA and hwloc share some of the same ideas, their
+programming interfaces are quite different. After much debate, it was
+decided <em>not</em> to emulate the PLPA API with hwloc's API because
+hwloc's API is already far more rich than PLPA's.
+
+More specifically, exploiting modern computing architecture
+<em>requires</em> the flexible functionality provided by the hwloc API
+-- the PLPA API is too rigid in its definitions and practices to
+handle the evolving server hardware landscape (e.g., PLPA only
+understands cores and sockets; hwloc understands a much larger set
+of hardware objects).
+
+As such, even though it is fully possible to emulate the PLPA API with
+hwloc (e.g., only deal with sockets and cores), and while the
+documentation below describes how to do this, we encourage any
+existing PLPA application authors to actually re-think their
+application in terms of more than just sockets and cores. In short,
+we encourage you to use the full hwloc API to exploit <em>all</em> the
+hardware.
+
+
+\section switchfromplpa_caching Topology context vs. caching
+
+First, all hwloc functions take a \p topology parameter. This
+parameter serves as an internal storage for the result of the topology
+discovery. It replaces PLPA's caching abilities and even lets you
+manipulate multiple topologies as the same time, if needed.
+
+Thus, all programs should first run hwloc_topology_init() and
+hwloc_topology_destroy() as they did plpa_init() and plpa_finalize()
+in the past.
+
+
+\section switchfromplpa_hierarchy Hierarchy vs. Core at Socket
+
+PLPA was designed to understand only cores and sockets. hwloc offers
+many more different types of objects (e.g., cores, sockets, hardware
+threads, NUMA nodes, and others) and stores them within a tree of
+resources.
+
+To emulate the PLPA model, it is possible to find sockets using
+functions such as hwloc_get_obj_by_type(). Iterating over sockets is
+also possible using hwloc_get_next_obj_by_type(). Then, finding a
+core within a socket may be done using
+hwloc_get_obj_inside_cpuset_by_type() or
+hwloc_get_next_obj_inside_cpuset_by_type().
+
+It is also possible to directly find an object "below" another object
+using hwloc_get_obj_below_by_type() (or
+hwloc_get_obj_below_array_by_type()).
+
+
+\section switchfromplpa_indexes Logical vs. Physical/OS indexes
+
+hwloc manipulates logical indexes, meaning indexes specified with
+regard to the ordering of objects in the hwloc-provided hierarchical
+tree. Physical or OS indexes may be entirely hidden if not strictly
+required. The reason for this is that physical/OS indexes may change
+with the OS or with the BIOS version. They may be non-consecutive,
+multiple objects may have the same physical/OS indexes, making their
+manipulation tricky and highly non-portable.
+
+Note that hwloc tries very hard to always present a hierarchical tree
+with the same logical ordering, regardless of physical or OS index
+ordering.
+
+It is still possible to retrieve physical/OS indexes through the \p
+os_index field of objects, but such practice should be avoided as much
+as possible for the reasons described above (except perhaps for
+prettyprinting / debugging purposes).
+
+::HWLOC_OBJ_PU objects are supposed to have different physical/OS
+indexes since the OS uses them for binding. The \p os_index field of
+these objects provides the identifier that may be used for such
+binding, and hwloc_get_proc_obj_by_os_index() finds the object
+associated with a specific OS index.
+
+But as mentioned above, we discourage the use of these conversion
+methods for actual binding. Instead, hwloc offers its own binding
+model using the \p cpuset field of objects. These cpusets may be
+duplicated, modified, combined, etc. (see hwloc/cpuset.h for details)
+and then passed to hwloc_set_cpubind() for binding.
+
+
+\section switchfromplpa_counting Counting specification
+
+PLPA offers a countspec parameter to specify whether counting all
+CPUs, only the online ones or only the offline ones. However, some
+operating systems do not expose the topology of offline CPUs (i.e.,
+offline CPUs are not reported at all by the OS). Also, some
+processors may not be visible to the current application due to
+administrative restrictions. Finally, some processors let you
+shutdown a single hardware thread in a core, making some of the PLPA
+features irrelevant.
+
+hwloc stores in the hierarchical tree of objects all CPUs that have
+known topology information. It then provides the applications with
+several cpusets that contain the list of CPUs that are actually known,
+that have topology information, that are online, or that are available
+to the application. These cpusets may be retrieved with
+hwloc_topology_get_online_cpuset() and other similar functions to
+filter the object that are relevant or not.
+
*/
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/diagram.fig
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/diagram.fig 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/diagram.fig 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,4 +1,4 @@
-#FIG 3.2 Produced by xfig version 3.2.5a
+#FIG 3.2 Produced by xfig version 3.2.5b
Landscape
Center
Metric
@@ -7,18 +7,6 @@
Single
-2
1200 2
-6 9765 7740 11340 9180
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 9765 8010 11205 8010
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 11205 9180 11205 7740 9765 7740 9765 9180 11205 9180
-4 0 0 50 -1 0 12 0.0000 4 165 1095 9855 8640 .os_index = 3\001
-4 0 0 50 -1 0 14 0.0000 4 165 435 9855 7965 Proc\001
-4 0 0 50 -1 0 12 0.0000 4 180 1290 9855 8865 .sibling_rank=0\001
-4 0 0 50 -1 0 12 0.0000 4 180 630 9855 9090 .arity=0\001
-4 0 0 50 -1 0 12 0.0000 4 180 810 9855 8190 .depth = 3\001
-4 0 0 50 -1 0 12 0.0000 4 180 1485 9855 8415 .logical_index = 3\001
--6
6 3060 3060 4590 4500
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3060 3330 4500 3330
@@ -31,28 +19,62 @@
4 0 0 50 -1 0 12 0.0000 4 180 1290 3150 4185 .sibling_rank=0\001
4 0 0 50 -1 0 12 0.0000 4 180 630 3150 4410 .arity=2\001
-6
+6 4500 3375 8505 3915
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 4500 3600 8415 3600
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 8415 3690 4500 3690
+4 0 0 50 -1 0 12 0.0000 4 180 1035 4545 3510 next_sibling\001
+4 0 0 50 -1 0 12 0.0000 4 180 1035 7470 3870 prev_sibling\001
+-6
+6 7290 2250 8640 2610
+4 2 0 50 -1 0 12 0.0000 4 165 810 8640 2565 last_child\001
+4 2 0 50 -1 0 12 0.0000 4 165 900 8190 2385 children[1]\001
+-6
+6 2205 4590 3285 4950
+4 0 0 50 -1 0 12 0.0000 4 165 900 2385 4725 children[0]\001
+4 0 0 50 -1 0 12 0.0000 4 165 840 2205 4905 first_child\001
+-6
+6 4185 4590 5265 4950
+4 0 0 50 -1 0 12 0.0000 4 165 900 4185 4725 children[1]\001
+4 0 0 50 -1 0 12 0.0000 4 165 810 4455 4905 last_child\001
+-6
+6 7605 4590 8685 4950
+4 0 0 50 -1 0 12 0.0000 4 165 900 7785 4725 children[0]\001
+4 0 0 50 -1 0 12 0.0000 4 165 840 7605 4905 first_child\001
+-6
+6 9585 4590 10665 4950
+4 0 0 50 -1 0 12 0.0000 4 165 900 9585 4725 children[1]\001
+4 0 0 50 -1 0 12 0.0000 4 165 810 9855 4905 last_child\001
+-6
+6 4275 2250 5625 2610
+4 0 0 50 -1 0 12 0.0000 4 165 840 4275 2565 first_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 900 4725 2385 children[0]\001
+-6
+6 4770 810 5445 1440
+4 0 4 50 -1 0 12 0.0000 4 135 720 4770 945 Machine\001
+4 0 4 50 -1 0 12 0.0000 4 135 405 4770 1170 level\001
+4 0 4 50 -1 0 12 0.0000 4 180 675 4770 1395 depth=0\001
+-6
+6 2115 3150 2790 3780
+4 0 4 50 -1 0 12 0.0000 4 135 555 2115 3285 Socket\001
+4 0 4 50 -1 0 12 0.0000 4 135 405 2115 3510 level\001
+4 0 4 50 -1 0 12 0.0000 4 180 675 2115 3735 depth=1\001
+-6
6 9765 5400 11340 6840
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9765 5670 11205 5670
2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
11205 6840 11205 5400 9765 5400 9765 6840 11205 6840
-4 0 0 50 -1 0 14 0.0000 4 165 465 9855 5625 Core\001
+4 0 0 50 -1 0 14 0.0000 4 165 600 9855 5625 Cache\001
4 0 0 50 -1 0 12 0.0000 4 180 630 9855 6750 .arity=1\001
4 0 0 50 -1 0 12 0.0000 4 180 810 9855 5850 .depth = 2\001
4 0 0 50 -1 0 12 0.0000 4 180 1485 9855 6075 .logical_index = 3\001
4 0 0 50 -1 0 12 0.0000 4 165 1095 9855 6300 .os_index = 1\001
4 0 0 50 -1 0 12 0.0000 4 180 1290 9855 6525 .sibling_rank=1\001
-6
-6 4500 3375 8505 3915
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 4500 3600 8415 3600
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 8415 3690 4500 3690
-4 0 0 50 -1 0 12 0.0000 4 180 1035 4545 3510 next_sibling\001
-4 0 0 50 -1 0 12 0.0000 4 180 1035 7470 3870 prev_sibling\001
--6
6 8505 5625 9855 6795
6 8505 5625 9855 6165
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
@@ -103,56 +125,11 @@
4 0 0 50 -1 0 12 0.0000 4 165 1005 5850 6390 next_cousin\001
4 0 0 50 -1 0 12 0.0000 4 180 1005 6075 6750 prev_cousin\001
-6
-6 3105 8595 4410 9135
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 3105 8820 4365 8820
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 4365 8910 3105 8910
-4 0 0 50 -1 0 12 0.0000 4 165 1005 3150 8730 next_cousin\001
-4 0 0 50 -1 0 12 0.0000 4 180 1005 3375 9090 prev_cousin\001
+6 765 5490 1440 6120
+4 0 4 50 -1 0 12 0.0000 4 135 510 765 5625 Cache\001
+4 0 4 50 -1 0 12 0.0000 4 135 405 765 5850 level\001
+4 0 4 50 -1 0 12 0.0000 4 180 675 765 6075 depth=2\001
-6
-6 5805 8595 7110 9135
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 5805 8820 7065 8820
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 7065 8910 5805 8910
-4 0 0 50 -1 0 12 0.0000 4 165 1005 5850 8730 next_cousin\001
-4 0 0 50 -1 0 12 0.0000 4 180 1005 6075 9090 prev_cousin\001
--6
-6 8505 8595 9810 9135
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 8505 8820 9765 8820
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 9765 8910 8505 8910
-4 0 0 50 -1 0 12 0.0000 4 165 1005 8550 8730 next_cousin\001
-4 0 0 50 -1 0 12 0.0000 4 180 1005 8775 9090 prev_cousin\001
--6
-6 7290 2250 8640 2610
-4 2 0 50 -1 0 12 0.0000 4 165 810 8640 2565 last_child\001
-4 2 0 50 -1 0 12 0.0000 4 165 900 8190 2385 children[1]\001
--6
-6 2205 4590 3285 4950
-4 0 0 50 -1 0 12 0.0000 4 165 900 2385 4725 children[0]\001
-4 0 0 50 -1 0 12 0.0000 4 165 840 2205 4905 first_child\001
--6
-6 4185 4590 5265 4950
-4 0 0 50 -1 0 12 0.0000 4 165 900 4185 4725 children[1]\001
-4 0 0 50 -1 0 12 0.0000 4 165 810 4455 4905 last_child\001
--6
-6 7605 4590 8685 4950
-4 0 0 50 -1 0 12 0.0000 4 165 900 7785 4725 children[0]\001
-4 0 0 50 -1 0 12 0.0000 4 165 840 7605 4905 first_child\001
--6
-6 9585 4590 10665 4950
-4 0 0 50 -1 0 12 0.0000 4 165 900 9585 4725 children[1]\001
-4 0 0 50 -1 0 12 0.0000 4 165 810 9855 4905 last_child\001
--6
6 4230 6930 5130 7560
4 0 0 50 -1 0 12 0.0000 4 165 840 4230 7290 first_child\001
4 0 0 50 -1 0 12 0.0000 4 165 810 4230 7515 last_child\001
@@ -168,57 +145,109 @@
4 0 0 50 -1 0 12 0.0000 4 165 810 1530 7515 last_child\001
4 0 0 50 -1 0 12 0.0000 4 165 900 1530 7065 children[0]\001
-6
-6 4275 2250 5625 2610
-4 0 0 50 -1 0 12 0.0000 4 165 840 4275 2565 first_child\001
-4 0 0 50 -1 0 12 0.0000 4 165 900 4725 2385 children[0]\001
+6 9630 6930 10530 7560
+4 0 0 50 -1 0 12 0.0000 4 165 840 9630 7290 first_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 810 9630 7515 last_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 900 9630 7065 children[0]\001
-6
-6 4770 810 5445 1440
-4 0 4 50 -1 0 12 0.0000 4 180 585 4770 945 System\001
-4 0 4 50 -1 0 12 0.0000 4 135 405 4770 1170 level\001
-4 0 4 50 -1 0 12 0.0000 4 180 675 4770 1395 depth=0\001
+6 9765 7740 11340 9180
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 9765 8010 11205 8010
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 11205 9180 11205 7740 9765 7740 9765 9180 11205 9180
+4 0 0 50 -1 0 14 0.0000 4 165 465 9855 7965 Core\001
+4 0 0 50 -1 0 12 0.0000 4 180 630 9855 9090 .arity=1\001
+4 0 0 50 -1 0 12 0.0000 4 180 810 9855 8190 .depth = 3\001
+4 0 0 50 -1 0 12 0.0000 4 180 1485 9855 8415 .logical_index = 3\001
+4 0 0 50 -1 0 12 0.0000 4 165 1095 9855 8640 .os_index = 1\001
+4 0 0 50 -1 0 12 0.0000 4 180 1290 9855 8865 .sibling_rank=0\001
-6
-6 2115 3150 2790 3780
-4 0 4 50 -1 0 12 0.0000 4 135 555 2115 3285 Socket\001
-4 0 4 50 -1 0 12 0.0000 4 135 405 2115 3510 level\001
-4 0 4 50 -1 0 12 0.0000 4 180 675 2115 3735 depth=1\001
+6 5805 8595 7110 9135
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 5805 8820 7065 8820
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 7065 8910 5805 8910
+4 0 0 50 -1 0 12 0.0000 4 165 1005 5850 8730 next_cousin\001
+4 0 0 50 -1 0 12 0.0000 4 180 1005 6075 9090 prev_cousin\001
-6
-6 765 5490 1440 6120
-4 0 4 50 -1 0 12 0.0000 4 135 390 765 5625 Core\001
-4 0 4 50 -1 0 12 0.0000 4 135 405 765 5850 level\001
-4 0 4 50 -1 0 12 0.0000 4 180 675 765 6075 depth=2\001
--6
6 765 7830 1440 8460
-4 0 4 50 -1 0 12 0.0000 4 135 360 765 7965 Proc\001
+4 0 4 50 -1 0 12 0.0000 4 135 390 765 7965 Core\001
4 0 4 50 -1 0 12 0.0000 4 135 405 765 8190 level\001
4 0 4 50 -1 0 12 0.0000 4 180 675 765 8415 depth=3\001
-6
-6 9630 6930 10530 7560
-4 0 0 50 -1 0 12 0.0000 4 165 840 9630 7290 first_child\001
-4 0 0 50 -1 0 12 0.0000 4 165 810 9630 7515 last_child\001
-4 0 0 50 -1 0 12 0.0000 4 165 900 9630 7065 children[0]\001
+6 4230 9270 5130 9900
+4 0 0 50 -1 0 12 0.0000 4 165 840 4230 9630 first_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 810 4230 9855 last_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 900 4230 9405 children[0]\001
-6
+6 6930 9270 7830 9900
+4 0 0 50 -1 0 12 0.0000 4 165 840 6930 9630 first_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 810 6930 9855 last_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 900 6930 9405 children[0]\001
+-6
+6 1530 9270 2430 9900
+4 0 0 50 -1 0 12 0.0000 4 165 840 1530 9630 first_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 810 1530 9855 last_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 900 1530 9405 children[0]\001
+-6
+6 9630 9270 10530 9900
+4 0 0 50 -1 0 12 0.0000 4 165 840 9630 9630 first_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 810 9630 9855 last_child\001
+4 0 0 50 -1 0 12 0.0000 4 165 900 9630 9405 children[0]\001
+-6
+6 9765 10080 11340 11520
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 5715 990 7155 990
+ 9765 10350 11205 10350
2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 7155 2160 7155 720 5715 720 5715 2160 7155 2160
+ 11205 11520 11205 10080 9765 10080 9765 11520 11205 11520
+4 0 0 50 -1 0 12 0.0000 4 165 1095 9855 10980 .os_index = 3\001
+4 0 0 50 -1 0 14 0.0000 4 165 435 9855 10305 PU\001
+4 0 0 50 -1 0 12 0.0000 4 180 1290 9855 11205 .sibling_rank=0\001
+4 0 0 50 -1 0 12 0.0000 4 180 630 9855 11430 .arity=0\001
+4 0 0 50 -1 0 12 0.0000 4 180 810 9855 10530 .depth = 4\001
+4 0 0 50 -1 0 12 0.0000 4 180 1485 9855 10755 .logical_index = 3\001
+-6
+6 3105 10935 4410 11475
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
- 2340 6840 2340 7740
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2
+ 3105 11160 4365 11160
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
- 2430 6840 2430 7740
+ 4365 11250 3105 11250
+4 0 0 50 -1 0 12 0.0000 4 165 1005 3150 11070 next_cousin\001
+4 0 0 50 -1 0 12 0.0000 4 180 1005 3375 11430 prev_cousin\001
+-6
+6 5805 10935 7110 11475
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 5805 11160 7065 11160
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 7065 11250 5805 11250
+4 0 0 50 -1 0 12 0.0000 4 165 1005 5850 11070 next_cousin\001
+4 0 0 50 -1 0 12 0.0000 4 180 1005 6075 11430 prev_cousin\001
+-6
+6 8505 10935 9810 11475
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 8505 11160 9765 11160
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 9765 11250 8505 11250
+4 0 0 50 -1 0 12 0.0000 4 165 1005 8550 11070 next_cousin\001
+4 0 0 50 -1 0 12 0.0000 4 180 1005 8775 11430 prev_cousin\001
+-6
+6 765 10170 1440 10800
+4 0 4 50 -1 0 12 0.0000 4 135 360 765 10305 PU\001
+4 0 4 50 -1 0 12 0.0000 4 135 405 765 10530 level\001
+4 0 4 50 -1 0 12 0.0000 4 180 675 765 10755 depth=4\001
+-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 4365 8010 5805 8010
+ 5715 990 7155 990
2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 5805 9180 5805 7740 4365 7740 4365 9180 5805 9180
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 7065 8010 8505 8010
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 8505 9180 8505 7740 7065 7740 7065 9180 8505 9180
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 1665 8010 3105 8010
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 3105 9180 3105 7740 1665 7740 1665 9180 3105 9180
+ 7155 2160 7155 720 5715 720 5715 2160 7155 2160
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
9231 4492 10581 5392
@@ -235,24 +264,12 @@
8415 3330 9855 3330
2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
9855 4500 9855 3060 8415 3060 8415 4500 9855 4500
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 4365 5670 5805 5670
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 5805 6840 5805 5400 4365 5400 4365 6840 5805 6840
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 7065 5670 8505 5670
-2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
- 1665 5670 3105 5670
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 3105 6840 3105 5400 1665 5400 1665 6840 3105 6840
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2
1 1 1.00 60.00 120.00
6435 2160 3735 3060
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
6210 2160 3510 3060
-2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
- 8505 6840 8505 5400 7065 5400 7065 6840 8505 6840
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
4500 4050 8415 4050
@@ -277,8 +294,32 @@
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2
1 1 1.00 60.00 120.00
6435 2160 9135 3060
+2 2 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 10080 3015 2835 3015 2835 4545 10080 4545 10080 3015
+2 2 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 7380 675 5490 675 5490 2205 7380 2205 7380 675
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 4365 5670 5805 5670
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 5805 6840 5805 5400 4365 5400 4365 6840 5805 6840
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 7065 5670 8505 5670
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 1665 5670 3105 5670
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3105 6840 3105 5400 1665 5400 1665 6840 3105 6840
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 8505 6840 8505 5400 7065 5400 7065 6840 8505 6840
+2 2 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
+ 11385 5355 1485 5355 1485 6885 11385 6885 11385 5355
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
+ 2340 6840 2340 7740
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2
+ 1 1 1.00 60.00 120.00
+ 2430 6840 2430 7740
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
5040 6840 5040 7740
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2
1 1 1.00 60.00 120.00
@@ -295,52 +336,94 @@
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2
1 1 1.00 60.00 120.00
10530 6840 10530 7740
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 4365 8010 5805 8010
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 5805 9180 5805 7740 4365 7740 4365 9180 5805 9180
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 7065 8010 8505 8010
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 1665 8010 3105 8010
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3105 9180 3105 7740 1665 7740 1665 9180 3105 9180
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 8505 9180 8505 7740 7065 7740 7065 9180 8505 9180
2 2 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
- 10080 3015 2835 3015 2835 4545 10080 4545 10080 3015
-2 2 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
- 7380 675 5490 675 5490 2205 7380 2205 7380 675
-2 2 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
11385 7695 1485 7695 1485 9225 11385 9225 11385 7695
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 2340 9180 2340 10080
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2
+ 1 1 1.00 60.00 120.00
+ 2430 9180 2430 10080
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 5040 9180 5040 10080
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2
+ 1 1 1.00 60.00 120.00
+ 5130 9180 5130 10080
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 7740 9180 7740 10080
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2
+ 1 1 1.00 60.00 120.00
+ 7830 9180 7830 10080
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 10440 9180 10440 10080
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 1 2
+ 1 1 1.00 60.00 120.00
+ 10530 9180 10530 10080
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 4365 10350 5805 10350
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 5805 11520 5805 10080 4365 10080 4365 11520 5805 11520
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 7065 10350 8505 10350
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 8505 11520 8505 10080 7065 10080 7065 11520 8505 11520
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
+ 1665 10350 3105 10350
+2 4 0 1 0 7 50 -1 -1 0.000 0 0 7 0 0 5
+ 3105 11520 3105 10080 1665 10080 1665 11520 3105 11520
2 2 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
- 11385 5355 1485 5355 1485 6885 11385 6885 11385 5355
-4 2 0 50 -1 0 12 0.0000 4 135 465 8415 2970 father\001
+ 11385 10035 1485 10035 1485 11565 11385 11565 11385 10035
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 3105 8820 4365 8820
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 4365 8910 3105 8910
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 8505 8820 9765 8820
+2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 9765 8910 8505 8910
+4 2 0 50 -1 0 12 0.0000 4 165 510 8415 2970 parent\001
4 0 0 50 -1 0 12 0.0000 4 180 810 5805 1170 .depth = 0\001
-4 0 0 50 -1 0 14 0.0000 4 210 705 5805 945 System\001
+4 0 0 50 -1 0 14 0.0000 4 165 825 5805 945 Machine\001
4 0 0 50 -1 0 12 0.0000 4 165 1155 5805 1620 .os_index = -1\001
4 0 0 50 -1 0 12 0.0000 4 180 1290 5805 1845 .sibling_rank=0\001
4 0 0 50 -1 0 12 0.0000 4 180 1485 5805 1395 .logical_index = 0\001
4 0 0 50 -1 0 12 0.0000 4 180 630 5805 2070 .arity=2\001
-4 0 0 50 -1 0 12 0.0000 4 135 465 2475 7650 father\001
-4 0 0 50 -1 0 12 0.0000 4 165 1095 1755 8640 .os_index = 0\001
-4 0 0 50 -1 0 12 0.0000 4 165 1095 4455 8640 .os_index = 2\001
-4 0 0 50 -1 0 12 0.0000 4 165 1095 7155 8640 .os_index = 1\001
-4 0 0 50 -1 0 12 0.0000 4 180 1290 1755 8865 .sibling_rank=0\001
-4 0 0 50 -1 0 14 0.0000 4 165 435 1755 7965 Proc\001
-4 0 0 50 -1 0 14 0.0000 4 165 435 4455 7965 Proc\001
-4 0 0 50 -1 0 14 0.0000 4 165 435 7155 7965 Proc\001
-4 0 0 50 -1 0 12 0.0000 4 180 1290 4455 8865 .sibling_rank=0\001
-4 0 0 50 -1 0 12 0.0000 4 180 1290 7155 8865 .sibling_rank=0\001
-4 0 0 50 -1 0 12 0.0000 4 180 630 1755 9090 .arity=0\001
-4 0 0 50 -1 0 12 0.0000 4 180 630 4455 9090 .arity=0\001
-4 0 0 50 -1 0 12 0.0000 4 180 630 7155 9090 .arity=0\001
-4 0 0 50 -1 0 12 0.0000 4 180 810 7155 8190 .depth = 3\001
-4 0 0 50 -1 0 12 0.0000 4 180 1485 7155 8415 .logical_index = 2\001
-4 0 0 50 -1 0 12 0.0000 4 180 810 4455 8190 .depth = 3\001
-4 0 0 50 -1 0 12 0.0000 4 180 1485 4455 8415 .logical_index = 1\001
-4 0 0 50 -1 0 12 0.0000 4 180 810 1755 8190 .depth = 3\001
-4 0 0 50 -1 0 12 0.0000 4 180 1485 1755 8415 .logical_index = 0\001
-4 0 0 50 -1 0 12 0.0000 4 135 465 8145 5310 father\001
-4 0 0 50 -1 0 12 0.0000 4 135 465 9675 5310 father\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 8145 5310 parent\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 9675 5310 parent\001
4 0 0 50 -1 0 12 0.0000 4 180 630 8505 4410 .arity=2\001
4 0 0 50 -1 0 12 0.0000 4 180 1485 8505 3735 .logical_index = 1\001
4 0 0 50 -1 0 12 0.0000 4 165 1095 8505 3960 .os_index = 1\001
4 0 0 50 -1 0 12 0.0000 4 180 810 8505 3510 .depth = 1\001
4 0 0 50 -1 0 14 0.0000 4 165 645 8505 3285 Socket\001
4 0 0 50 -1 0 12 0.0000 4 180 1290 8505 4185 .sibling_rank=1\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 4455 2970 parent\001
+4 0 0 50 -1 0 12 0.0000 4 165 1005 4545 3960 next_cousin\001
+4 0 0 50 -1 0 12 0.0000 4 180 1005 7470 4320 prev_cousin\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 2745 5310 parent\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 4275 5310 parent\001
4 0 0 50 -1 0 12 0.0000 4 180 630 7155 6750 .arity=1\001
-4 0 0 50 -1 0 14 0.0000 4 165 465 1755 5625 Core\001
-4 0 0 50 -1 0 14 0.0000 4 165 465 4455 5625 Core\001
-4 0 0 50 -1 0 14 0.0000 4 165 465 7155 5625 Core\001
+4 0 0 50 -1 0 14 0.0000 4 165 600 1755 5625 Cache\001
+4 0 0 50 -1 0 14 0.0000 4 165 600 4455 5625 Cache\001
+4 0 0 50 -1 0 14 0.0000 4 165 600 7155 5625 Cache\001
4 0 0 50 -1 0 12 0.0000 4 180 1485 1755 6075 .logical_index = 0\001
4 0 0 50 -1 0 12 0.0000 4 180 1485 4455 6075 .logical_index = 1\001
4 0 0 50 -1 0 12 0.0000 4 165 1095 1755 6300 .os_index = 0\001
@@ -355,11 +438,51 @@
4 0 0 50 -1 0 12 0.0000 4 180 1290 4455 6525 .sibling_rank=1\001
4 0 0 50 -1 0 12 0.0000 4 165 1095 7155 6300 .os_index = 0\001
4 0 0 50 -1 0 12 0.0000 4 180 1290 7155 6525 .sibling_rank=0\001
-4 0 0 50 -1 0 12 0.0000 4 135 465 4455 2970 father\001
-4 0 0 50 -1 0 12 0.0000 4 165 1005 4545 3960 next_cousin\001
-4 0 0 50 -1 0 12 0.0000 4 180 1005 7470 4320 prev_cousin\001
-4 0 0 50 -1 0 12 0.0000 4 135 465 2745 5310 father\001
-4 0 0 50 -1 0 12 0.0000 4 135 465 4275 5310 father\001
-4 0 0 50 -1 0 12 0.0000 4 135 465 5175 7650 father\001
-4 0 0 50 -1 0 12 0.0000 4 135 465 7875 7650 father\001
-4 0 0 50 -1 0 12 0.0000 4 135 465 10575 7650 father\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 2475 7650 parent\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 5175 7650 parent\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 7875 7650 parent\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 10575 7650 parent\001
+4 0 0 50 -1 0 12 0.0000 4 180 630 7155 9090 .arity=1\001
+4 0 0 50 -1 0 14 0.0000 4 165 465 1755 7965 Core\001
+4 0 0 50 -1 0 14 0.0000 4 165 465 4455 7965 Core\001
+4 0 0 50 -1 0 14 0.0000 4 165 465 7155 7965 Core\001
+4 0 0 50 -1 0 12 0.0000 4 180 1485 1755 8415 .logical_index = 0\001
+4 0 0 50 -1 0 12 0.0000 4 180 1485 4455 8415 .logical_index = 1\001
+4 0 0 50 -1 0 12 0.0000 4 165 1095 1755 8640 .os_index = 0\001
+4 0 0 50 -1 0 12 0.0000 4 180 1290 1755 8865 .sibling_rank=0\001
+4 0 0 50 -1 0 12 0.0000 4 180 630 1755 9090 .arity=1\001
+4 0 0 50 -1 0 12 0.0000 4 180 630 4455 9090 .arity=1\001
+4 0 0 50 -1 0 12 0.0000 4 180 810 1755 8190 .depth = 3\001
+4 0 0 50 -1 0 12 0.0000 4 180 810 4455 8190 .depth = 3\001
+4 0 0 50 -1 0 12 0.0000 4 180 810 7155 8190 .depth = 3\001
+4 0 0 50 -1 0 12 0.0000 4 180 1485 7155 8415 .logical_index = 2\001
+4 0 0 50 -1 0 12 0.0000 4 165 1095 4455 8640 .os_index = 1\001
+4 0 0 50 -1 0 12 0.0000 4 180 1290 4455 8865 .sibling_rank=0\001
+4 0 0 50 -1 0 12 0.0000 4 165 1095 7155 8640 .os_index = 0\001
+4 0 0 50 -1 0 12 0.0000 4 180 1290 7155 8865 .sibling_rank=0\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 2475 9990 parent\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 5175 9990 parent\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 7875 9990 parent\001
+4 0 0 50 -1 0 12 0.0000 4 165 510 10575 9990 parent\001
+4 0 0 50 -1 0 12 0.0000 4 165 1095 1755 10980 .os_index = 0\001
+4 0 0 50 -1 0 12 0.0000 4 165 1095 4455 10980 .os_index = 2\001
+4 0 0 50 -1 0 12 0.0000 4 165 1095 7155 10980 .os_index = 1\001
+4 0 0 50 -1 0 12 0.0000 4 180 1290 1755 11205 .sibling_rank=0\001
+4 0 0 50 -1 0 14 0.0000 4 165 435 1755 10305 PU\001
+4 0 0 50 -1 0 14 0.0000 4 165 435 4455 10305 PU\001
+4 0 0 50 -1 0 14 0.0000 4 165 435 7155 10305 PU\001
+4 0 0 50 -1 0 12 0.0000 4 180 1290 4455 11205 .sibling_rank=0\001
+4 0 0 50 -1 0 12 0.0000 4 180 1290 7155 11205 .sibling_rank=0\001
+4 0 0 50 -1 0 12 0.0000 4 180 630 1755 11430 .arity=0\001
+4 0 0 50 -1 0 12 0.0000 4 180 630 4455 11430 .arity=0\001
+4 0 0 50 -1 0 12 0.0000 4 180 630 7155 11430 .arity=0\001
+4 0 0 50 -1 0 12 0.0000 4 180 810 7155 10530 .depth = 4\001
+4 0 0 50 -1 0 12 0.0000 4 180 1485 7155 10755 .logical_index = 2\001
+4 0 0 50 -1 0 12 0.0000 4 180 810 4455 10530 .depth = 4\001
+4 0 0 50 -1 0 12 0.0000 4 180 1485 4455 10755 .logical_index = 1\001
+4 0 0 50 -1 0 12 0.0000 4 180 810 1755 10530 .depth = 4\001
+4 0 0 50 -1 0 12 0.0000 4 180 1485 1755 10755 .logical_index = 0\001
+4 0 0 50 -1 0 12 0.0000 4 165 1005 3150 8730 next_cousin\001
+4 0 0 50 -1 0 12 0.0000 4 180 1005 3375 9090 prev_cousin\001
+4 0 0 50 -1 0 12 0.0000 4 165 1005 8550 8730 next_cousin\001
+4 0 0 50 -1 0 12 0.0000 4 180 1005 8775 9090 prev_cousin\001
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/dudley.png
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/dudley.png 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/dudley.png 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,97 +1,149 @@
PNG
-IHDR Ê Qî¿ bKGD ÿ ÿ ÿ ½§ tIMEÙ.R
+ IDATxíÝ{teÇñ_@p`cÀD1C£BÔàG
-·eÎ
p×
uÝQX¹Íáâ :ÈnVØ º8ÜÆì
-$¸!µxè©@®ê®záû9ÇcS]ýÖÛïó<zº«_bb¢, nt
-OIIQff¦Ûs ÀuYYY
-s{ x 2 64Ê ØÐ( `C£
-2 64Ê ØÐ( `C£
-2 6×E£\^^®´´4W¦òòrW
- p^½å>ø@Ý»wW&MÔ¹sg^½: ú|¾W¼¼<Ý{ï½Æ¿òßÕÇê¾
-eeeéÎ;ïT&MÔ¥K½ùæ×<.,,LÑÑÑZµjÿ¾={*//ÏÑç pO½åáÃkòäÉ*++Óû￯÷ß?XóªÜÜ\¥¤¤øÿmY,˪rß+÷ÙïÏÊÊÒ¦M´qãF?^6lÐöíÛ¯y\yy¹V¬X¡±cÇú·§¤¤(77×Ù' pM½åýèG:yò¤öï߯víÚé·Þ$íÞ½[?ùÉOTQQ!馲cÇúãÿ¨^zIZµºæ\ûíÃëg?ûÿê]»vù÷ù×ýWEEE©uëÖÊËËÓôéÓ¥ýèGþOv÷îÝ«ØØØ:=æÍ+22Rýû÷WQQ$iñâÅZ²dºuë¦Æ«S§NZ±bEµc´jÕÊ;66Vûöí«Ç* ¼¬^ò
-ôßÿýß7nÚµkç¿ôúg?ûºvíªõë×K>úè#uíÚU;wVNNæÌ£/Vú$×~{Ä5jþò¿hîܹJOO÷³Y³f:uêVZ¥áÃëöÛoשS§§'JJJJYëü-ËRii©N8¡®]»jðàÁ¤S§N©S§Nj¾l»Q£FzôÑGõÚk¯ù·GFFª¤¤¤>Ë ð0ß´iÓ¬ÌÌÌz?ðÀêÛ·¯%IGÑСCµoß>5JÃWrr²Ö®]«yóæéË/¿Ô?þã?êW^Ïç«tésãÆ+ýB,ϧ
-ù|>]¾|YaaaþíWÿÛ²,µnÝZGQóæÍ+?¹«cwáÂ5oÞ\ßÿ½¢££µmÛ6³|õc¯Ü¶,K;wîTzzº;&I:{ö¬ºté¢Ó§O×{
- ÞUÿï(=zT.]ÒáÃuùòeÿ}±±±JLLÔºuëô§?ýIÉÉÉ~øÐ»víÒ-[4gÎIR&MtêÔ)ÿcãââ´bÅ
-?^eù/áäo«û·$%$$èÈ#u~¥¥¥ÊÌÌT\\$)==]£GÖ±cÇtùòe\°°0ÿtôèQ%&&ÖùØ o¯ÏÎ=ö ãÇ+&&FK.tÿÌ3ÕµkWÍ7Ï¿íÊ%Ì-[¶Ô/¾(I;v¬:vì¨.Ȳ,^½ZcÆÑèÑ£uñâEIªöàª:TJHH¨tLûm˲ü·6mªûî»ÏÿëéÓ§ëå_VJJ¾ùæÅÆÆVúÍÖöqÚ´i£ùóçû·ïرà 7 À|_z]
-
->\o¾ù¦ÂÃëÕ7Hyy¹
-¦µk×ìW¤¥¥é·Þ
-éó GVVVý>Q®ÏçÓßýÝßiݺu!oÃÃÃ]i%¹v\ @p8ÖÑÖçRi ¼ª^¿Ì ë2 64Ê ØÐ( `C£
-2 6uúóP
*((ö\ ÔSbb¢kÜú¼úÌEýæªKýJulwìØ¡¼¼<õêÕ«Áàýû÷ëìÙ³µ:õxõúÌU×úêØ(KR¯^½4eÊMs-ZTç}©_À[¨_À\Ô/`®úÔ/ßQ ÀF e lh °¡Q ÀF e lh °¡Q ÀF O7Ê111nO@¨_À\Ô/`.êpFPå=úè£U>}ô?ü!©¤º
©S§ê/¾Pyy¹èß~úôi=õÔSêܹ³zê)>}:èsL`BýÆÄÄøÿð7&Ôï|àãc=¦]»v} L¨ß7ªoß¾U¿~ý´sçÎ ÏpKPå &hÔ¨Q:xð -[¦íÛ·ã0ubY$éÀºûî»ýÛ333 Ï>ûL ÊÌÌtk§P¿'NÐ'ÜàY&Ôï
-4oÞ<<xP#FÐsÏ=çÖO1¡~wìØ¡+Wê³Ï>Ó¸qã4~üx·¦]På[o½Uß|ó:¤Ö[kîܹþû>ÿüsõë×O:uR¿~ýtèÐ!IÒ¡C4`À uêÔéw·víÚ¥þô§ÊËËÓ±cÇôäOúßmûäOüûÛ?azóÍ7£õë׫ÿþzê©§´jÕ*ÿý}ôF©9R}ôQ00 õ j&Ôï¿ýÛ¿)66VJJJÒ-·Ü¥<Ïú3gÚµk§°°0ù|>µmÛ6K¸"(òoû[:uJ³fÍRïÞ½+]:2yòd¥¥¥éÀJKKÓäÉýÛxâ :t¨Ò'Eï¾û®fΩåËëé§ÖÄ5xð`}þùç1c¦Nêßßþ)Ó#ô駪wïÞ:qâôñÇûï/--U-$IQQQ*++ÆR Æ1¡~Tͤú-..Ö1c4cÆ`/`Sê7&&F]ºtÑ/¾¨W_}5K¸Â7mÚ4«¶Ë³²²
TTT¤)S¦Ôû ÖðáÃõÉ'H:uꤪiÓ¦ºpáî¾ûn=zT:uÒg}¦nºÉÿØ
kÉ%JIIñ?þòåË{>?®k¸*³fÍÒ#Ô³gOåçç«eË:sæyäÿ,Z´Haaaµ~màz¬_û~4Ï0Ñ^¿Ð³Ï>« &Túþ#`½~%éâÅÚ¶mrrr´cÇz??À-õ©ß |¢¡¯¾úJßÿ½;¦
-ÿ}?þñõöÛoëâÅZ¿~½:uê$é^³f¾ÿþûJc-]ºT'OV~~¾$©k×®ÊÉÉñ¿svüøqIRãÆõÍ7ßøwâÄ ¥§§kõêÕzï½÷ôäOêÄþ"¿ï¾û´lÙ2]ºtIË-Ó}÷Ý¥ cBý¨ õ»fÍýêW¿Ò«¯¾JØP¿/¿ü²JJJdY***táÂ
® ঠ4Ê=ô~õ«_©[·n;wn¥}öìÙúÝï~§îÝ»kõêÕÊÎÎ$eggkݺuêÚµk¥w³µråJ½ôÒKZ¾|¹~óßèÝwßÕ=÷ÜSé;ÿ÷¯|°Òcÿë¿þKñññ*++ó_f}Å/¼ ½{÷ª{÷îÚ»w¯^|ñÅ`,`ê×þX~û5ð7&Ôï/¾¨ÿýßÿÕ/~ñÿ8.]
-æ² F0¡~»té¢~ýú)>>^¿ýío5oÞ¼`. ઠ_z
- 8Bqéà ~sQ¿¹\¿ô SÑ( `C£
-2 64Ê ØÐ( `C£
-2 6áN¶ÿ~íÙ³ÇÉ!R||¼zõêÒcR¿3¨_À\Ô/`.§ë×ÑFyÏ=Ú¹s§¸¡ª¬¬,ä?¨©_ á¨_À\Ô/`®`Ô¯£²$¥¤¤(33ÓéaFVV\96õ4õúÌúå;Ê ØÐ( `C£
-2 64Ê ØÐ( `C£
-2 64Ê ØÐ( `cT£\^^®´´4·§Q«´´4»=
-ÀS¨_À\Ô/`.ꫲÏç«rûÚµkÕ¥K5iÒD=zôP~~¾$)//O÷Þ{ï5ûÏ1£ÒX'OTRR"""¤'OJ6mÚ¤;*""B>ø þüç?K***4kÖ,µk×Naaaþ±ìc>|X;wÖÂ
ý÷ù|>
)::Z«VòïÛ³gOååå5di Ï£~sQ¿¹¨_ 4<ùò¦M¯ÒÒRM>]C$åææ*%%¥Ò¾{÷îÕòåË+m4iî¿ÿ~*))I'O$ýò¿ÔüùóUVV¦I&ù·gffjݺuÚ¼y³._¾,˲*÷áêñÇ×%K4fÌÿv˲T^^®+VhìØ±þí)))ÊÍÍul= P¿¹¨_À\Ô/à¬p·'P+WJ.]º$ϧèèhI?ull¬¿.(==]«W¯Vrr²ûÖ[õùç«iÓ¦ÊÈÈÐ]wÝ%éw¾¤¿½ÓµyófIÒÒ¥KµxñbuëÖʹ,X°@[¶lQªs«Vü·cccµoß¾@:`<ê0õúåÉFYú[1FEEé>$(22Ò¿Ï/¼ ôôt=ðÀ[RRâ/¼-[ê»ï¾$-Y²D£GVqq±yæÿö¯¿þZùùùzâ'tÛm·iþüùêß¿¿$éÙgÕ%Kª,ò+slܸ±Ö¯_ïß©'0õúÌEýÎñä¥×Òeüõ¯Õ¢Eü´hÑBçÎóï3oÞ<edd\ó¨¨(
KÎ9£¨¨(IÒ ATTT¤¿þõ¯êׯڵkçß¿O>*))Ñî?ƶmÛ4~üø*/±,KÚ²e&Làß~îÜ9µhÑÂÉå Býæ¢~sQ¿s<Ù(?ÿüó*..öÒùóç%I :rä¿
-YåÿNÄÿ÷íÛWsçÎÕÅõú믫O>þÇX¥ÃkÒ¤I5j$)55URÕ¿!!!AÛ¶mÓ)S´xñâ*çæa¤£G*11±!K úÌEýæ¢~g¹~éõÕÅeYî¾ûnõèÑC%%%êÞ½»Ö¬Y#I:t¨
+IHDR þ //Æ bKGD ÿ ÿ ÿ ½§ IDATxìÝ}TUuÞÿÿ×說Ó\êDda.ÅF&+éçØ%j^:Ö|qkïV$W¢fé ¥Ý7#©ó&Ml¤Ìè\Þ"SjÈùýA 6rÀ½ÙçµXöÞçóùì}Þ~x}ö9Çå P§¸¸Xbbbj÷X àAÒÒÒäg÷ à 0DP !" ` CE "( ÀA 0dkPt8-ZÞÕÕÕ¿ævZ#>>^ÕÕÕ¶ô
+ `EáÜÜÜË/_nJ°«Ïét^s¹¹¹ºûî»]¿;×O}555Z´húôé#???×ú¥¦¦êÇ?þ±:uê¤;î¸C¯¾új£öüüü¤
+6¸Ö
+<¸Ñq ð6->£¸bÅ
+WûæoôÚk¯>(3dgg+&&Æõ»Óé4 ©©©ÊÉÉÑÎ;uåÊ×6iiizçwôöÛoëßÿþ·¶mÛ¦÷u:ª®®VVV|òI×òegg[³c m¤ÅAqÐ Azë·$I7nÔØ±cmSw¶íG?úÞ~ûmIÒþýû5hÐ uèСÁY½ßÿþ÷êÚµ«ºwïî:cW·Þáp®ÿôÓOuÏ=÷¨S§NºýöÛõÁ4ÃîÝ»Öìþ¬Y³FË-S¿~ý+33SüãÕ¯_?uìØQaaaZ¿~}íôìÙÓu;,,L}ôQ³} x²Å§~Z/¼ðN§ÒÓÓõÄO4ÚÆétêÊ+Ú¸q£~úiIÒüÇèÑGÕ¿ÿýïgöõÿ÷Ú°aæÏߨ-£õ>ú¨fÍ¥.(==]Ó§Oot¿3gÎ( Ùý9qâòóóuÝu×)88XÛ¶m$ýë_ÿRhh¨¤¦_¶v8ò÷÷ר±cµ|ùr×ò >}ºÙ¾ <cáÂ
ÎÔÔT÷6v8ät:õàªwïÞ:uêrrr\Ë%é¥^ÒòåËuòäIÕÔÔÈáp¨¦¦F;vÔùóçuÝu×5hïÊ+òóókÐ~ýÖwìØ±ÁEêú¨¯gÏ:rän¼ñFÃ}¨Ó£G½òÊ+5jòóó5mÚ4}ùå
-Pã999JKKS³fÍ µk×V:V6môÌ3ÏhÚ´i¤9sæhÈ!4h¢££¯ùåݺuSAARSSuöìYM:õñæÏïßÇ<xp KúÌEýæ¢~àsµQ¾ú·ã]^éò+~úi
-6¬Ö±î¸ãíÞ½»ÎÇkÛ¶
+RAA+,~ÿ¾u·N§Þÿ}M>]}ö$éܹsêÛ·¯>ÿüs·+ §IKKkÝ»çͧÿùÿÑSO=ÕhÝÂ
õÇ?þQUUUzë·\Á*<<\k֬ѥKl_b´>""B¯¼òëìä÷C¢$
+2DGiv_âââ$5|¹[¦O®ÿüÏÿTYY®\¹â
+M©¨¨pÝ.++Sddd³} x²VÅ#FÈétê§?ýi£u)))8q¢zõê¥}ûö¹gee)++K?øÁ®ù]ÒúÓôÚk¯é¦n2|IX&O¬¢¢"×ïõ·«{Ù²eZºt©ôôÓOkݺu¤ÿ÷ÿþ®{ï½W]ºtÑ< ?ýéO
+ú¨{×sBB222\ËwíÚ¥kÚG »µè¥goòÍ7ßhÊ)ÊÉÉió¾ãããµqãFuèСÍû 0CZZ|6ÉtìØÑ(ɶ~ ÌÄWø ÀA 0DP !" ` Cn}bqqqo9 _¥èèè«nÃüÀ¹3ÿInÅ]»v)77WC½æ'Ø¿¿Î;×ìDÉüÀ׸;ÿInEI:t¨RRR®i` à)VZåö¶Ì |IKæ?®Q !" ` CE "( ÀA 0DP !" ytP ±{ `æ? À XTT¤1cÆ(,,L#GÔ[o½eE7
+\ˤº`Á}ú駪®®ÖÃ?ìZþùçkâĺýöÛ5qâD}þùçfóù/$$Äõ ý²$(Î7O3gÎÔ'|¢¬¬,ZÑiN§üüü´oß>
+0Àµ<55U:xð "##jã(x_ÿ;¦cÇÙ82 À صkWUTT¨´´T=zôPzzºkÝ¡C4vìX
jìØ±*--$êþûïWhhh£g°|ð¢ÜÜ\}öÙg0aëÙúÞ½{]Û7õì7$$DK,Qxx¸bccõñÇK²²²¢×_]cÆÑäÉõÊ+¯¸Úøë_ÿªÄÄDuîÜYúë_ÿjÅáàC|eþ É¢ ¸víZ8qBÏ?ÿ¼
+¦7Þxõ.99Yñññ:pàâããìZþÐC©´´´Á³Ø7ß|S¿ýíoµnÝ:M4IóçÏWBB:¤ç{N,pmµgÀ½{÷Ö={ôè£êg$%&&jÿþýºç{tìØ1ÝsÏ=Ú»w¯«óçÏ«[·n¤ÀÀ@UVV° ø_ÿ @:XÑèücýþ÷¿$9rD zè¡$I}öâããÕ¥KM8Qÿõ_ÿ%I
*++ÓäÉÕ©S§m-X°@«W¯Vxx¸¤ÚgÞÉÉÉ® Öáp¸5¦ &¨K.4i«ÏúÏën<X-ÒÔ©Suã7êÌ3êÞ½»Î=«n¸¡µ@;á+ó HQ;w®?®Ë/ëïÿ»jjj\ë~òhË-úú믵yóf
J´iÓ&]¾|¹A[kÖ¬Qrr²vîÜ)IºóÎ;µtéR×3ï£GJ:tè /¿ü²É1mÙ²E/^Ô-[tÛm·Iª}¨ììl½ýöÛ×±cÇ\äOúSeeeéÒ¥KÊÊÊÒOúSó ä+ó HÅØØXM>]áááJOOoð&Åëµ×^SÿþýµiÓ&-Y²Äµ|óæÍºã;<ÓÖúõëõ»ßýNëÖÓK/½¤7ß|S
+jpMÎ#<¢&¯¯9yò¤¬¬¬¬ãÙ·o
+¤óçÏ«k×®
+îóÌ3Ïh÷îݺ뮻´{÷n=û쳦# ¾ÉWæ¿úíóîg ýr,\¸ÐÙÜ»yÓÒÒT^^®6¹BBB¸î@«V_³fÀüÀ×´dþóèÜ }ÚEPäÙ4öùÀµhA -GP !" ` CE 2õ»÷ï߯38p Ú¦}2ÿðfϦŽÿþû6³Y p[qq±*++Û<(2ÿ°ó©AQbbbýJ °JÝWîÙù¬ÿ¸F 0DP !" ` CE "( ÀA 0äµA±ººZñññv£Yñññª®®¶{ |ó¶bkPt8ËsrrÔ·o_uêÔIÊÏÏo´Mnn®î¾ûîFË-ZÔ Ý'Ojøðáêܹ³®'OJ¶oß®ÐÐPuîÜY±±±úâ/$I555Z´húôé#???W[õÛ,--Uhh¨^~ùe×:Ã!???iÃ
+®m¬ÜÜÜ >ù7ðÈ3ï¾û®vîÜ©óçÏëÙgÕäÉmËöìÙ£Õ«W7X6þ|1BçÏ×#,I6mÒÓÓUYY©_ýêW®å©©©ÊÉÉÑÎ;uåÊ9ÎíjüøñZ»vüq×
r§Ó©êêjeeeéÉ't-Qvvö5 íó OÒÁîyõÕW%I.]¿¿¿úôéÓhÝ»w+,,ÌõûŨ7*66Öµ<??_R.]¤~ýúIª}æ,}÷LyǤ5kÖhåÊ®íê[¿~½222§ààà&Çß³gO×í°°0}ôÑGîî:vù'ñÈ (}7jûöíÖ9sF®ß.\¨iÓ¦éÞ{ïm´]=$IÝ»w×Ù³g%Izâ'TQQ¡Ç{̵üÄÊÏÏ×ÄuóÍ7ë¥^Ò< I3gV¯^m8IÖ·cÇÚ²eky@@N>ÝÚà bþà)<ò¥g©ö¥¯¾úJ«VÒ/ùËFë»u릪ª*×ï+V¬Ð¼yó]S¨
+IÒ©S§(Izè¡T^^®¯¾úJ£GÖ~ô#×ö£FÒÙ³gµråJÍ9ÓÕGAA_Jq:ª©©Q^^æÎëZ^UU¥nºéZvù§ðÈ äÜüüütáÂ
FÛ2DGqý^SS#§Ó麦¦îßQ£F)==]/^TzzºFéºÓéÔáìY³fIâââ$Éð"îÈÈH(%%EM¿nìTVV¦ÈÈÈ íó ObûKÏßçÓéTÿþý¡S§N©ÿþÚ´iS£ûM<YEEEÍNBK.U||¼n¸áEFF*''§A¿½zõÒ¬Y³"IZ¶lyä=øà
-jÜ?&&Fǯu,IúøãQíýÀõúÌEýæ¢~Ðpýåú÷¿»åe&Ì5ê0õúãÉï( àe lh °¡Q ÀF e lh °qüï(jöìÙNÜ0
+Òºuë´®¢¢"ÅÅÅéܹsZ°`A£ö222\ÛïÚµK -9$ Ú æ? ÎÖ øýwÔÕILLTbbâUï;iÒ$M2¥Ùvo¹å}øán÷Ý»woíÚµëªÛèèѣͶ%Õ¾±þK1 1ÿð¶Ql;º{2o# ïÂü xä5 °A 0DP !" ` C¦bqq±/^lv³ ࢢ"ÛÒ7ó ;Y1ÿ#""TYY©ãÇÙ, ¸-88XCmó~ÿ ØÍùÏÔ ¥¨¨(3 ¯ÀüÀq" ` CE "( ÀA 0dêç(îß¿_%%%f6 7pàÀf?ºBK¹SWf£NÑR̰Ùó©A±¤¤Dï¿ÿ¾¢££Íl>ª¸¸XÍ4u
p·®ÌF¢%ÿ`+æ?Ó¿ë9&&F©©©f7¦òòr·¶¥®à®ÔÙ¨S¸ùV°bþãE "( ÀA 0DP !" ` CE "( À×ÅêêjÅÇÇÛ=fÅÇÇ«ººÚîaÀMÔ¼u
++PW0bkPt8Ë7oÞ¬ððpuêÔIÊÏÏo´Mnn®î¾ûîmÕýÔwòäI
+>\;wÖðáÃuòäI·úX´hQ¶êß.--Uhh¨^~ùå}ûùù)((H6lpm;xð`åææº{H`ê
+Þ:
¨+Í#Ï(nÞ¼Y999ª¬¬ÔìÙ³ÐhììlÅÄĸ~w:r:¶?¾F¡óçÏkÄJNNn¶={öhõêÕc+,,ÔøñãµvíZ=þøã
+ú¯®®VVV|òI×òegg·øÀ|Ô¼u
++PWh-¹¹¹êׯºt颸¸8ýð?l´ÍîÝ»Öl[ùùùJJJR.]¤¼¼¼«öqñâE%&&jãÆÚZ¿~½RRR§èèè&ûìÙ³§ëvXX>úè£fÇ ëQWðÔ)¬@]¡µ:Ø=«ùüóÏõðÃkÅÖ9sFͶqæÌõèÑCÔ½{w={öª},\¸PÓ¦MÓ½÷ÞÛ¨9sæhõêÕ
+n´®îzǵeË×ò >}ºÙq¢íPWðÔ)¬@]¡¥<ò¢TûÌfذaJJJÒ/~ñFë»u릪ªªfÛ TEE
$éÔ©S
+¼j+V¬Ð¼yó\Zÿ%%%òv:ª©©Q^^æÎëZ^UU¥nºÉͽը+xêV ®Ð׬Y£ûï¿_2eá6CÑ#GmkÔ¨QJOO×Å®#G^µ×eÔ¿>#22RJIIQfff}Öý¤²²2EFF6;NXº7 Naê
+eûKÏß7ÓéÔc=&Iºï¾û\Ë/\¸ÐàøäÉUTTä*£wR9N-]ºTñññºá©Ir«#ááá***R\\Î;§4è³W¯^ÊÈÈpm¿k×.Ãa-ê
+Þ:
¨+ÉÖ hônª«-¯oÒ¤I
+±4u[n¹E~øa«ú¨¿MýÛ!!!:zô¨[míÙ³§Á)sXº7 Naê
+f³ýbkuìØÑõ,ÆyÃñê
+Þ:
¨+ñÈk `?" ` CE "( ÀA LÿÅââb-^¼Øìfá¿Þuwµ¤®ÌFÂ]̰ó©A1""B:~ü¸ÍÂGkèСÍnG]¡%Ü+³Q§h æ?XÁùÏÔ ¥¨¨(3¨+xêV ®`7®Q !" ` CE "( ÀA LýÅýû÷«¤¤ÄÌ&áãØìRWh)wêÊlÔ)ZùV0{þ35(èý÷ßWtt´ÍÂG«²²²Ù¦®ÐîÖÙ¨S´ó¬`Åügúw=ÇÄÄ(55ÕìfáÒÒÒT^^îÖ¶ÔÜÕº2u
+w1ÿÁ
+VÌ\£ CE "( ÀA 0DP !" ` CE òÚ X]]øøø6ï7>>^ÕÕÕmÞ/Úuo@Â
+ÔØGËë~«»ï¾»ÙûÔÔÔhÑ¢EêÓ§üüü\ëëoWZZªÐÐP½üòË
+ÚòóóSPP6lØàÚvðàÁÊÍÍmù΢ÍPWðÔ)¬@]ÁlyFÑétÊét^uììlÅÄÄ4{ÔÔTåäähçκråJ£m
+5~üx]»V?þxöª««¥'|Òµ<&&FÙÙÙÜ3غ7 Naê
+ÕÁî´ÖîÝ»ÖìvkÖ¬ÑÊ+Õ¯_¿FëÖ¯_¯ååå)88¸É6zöì麦>ú¨Uc磮à
+¨SXº<£è3gÎ( ÙíN8¡üü|]wÝu
+Ö¶mÛ\ëæÌ£ùóç³Ãá¿¿¿Æ«åË»èôéÓ¦ì<uo@Â
+ÔxmPìÖªªªÝ.00P£FÒÙ³gµråJÍ9Óµ® @III§¼N§jjj§¹sçºWUUé¦n2g'àq¨+xêV ®`Äkâ!CtäÈf·$Ãm###UPP eff6ÙFEE
ëvYY"##[;lx8ê
+Þ:
¨+±ýÅï¿Êét6XVwûûËN<YEEE®âjê>Ë-Ó#<¢|PAAAZ·n]vÂÃÃUTT¤¸¸8;wN,hÐF¯^½áÚ~×®]JHH¸¦}õ¨+xêV ®`&[bSïÀjîY4iÒ$M2¥ÙûôîÝ[»víºj!!!:zô¨[ýïÙ³§Á)sxê
+Þ:
¨+Íö3Õ±cGåää´y¿vô¶C]ÁP§°u#^{" ¬EP !" ` CE "( Àé£X\\¬ÅÝ,|PQQáÇ¡®à®ÔÙ¨S¸ùV°bþ35(FDD¨²²RÇ7³Yø¨àà`
+:´Ùí¨+´»ue6ê-Áü+X1ÿ£¢¢ef u¯@Â
+ÔìÆ5 0DP !" ` CE "( À©£¸ÿ~Ù$|ÜÀýpPê
+-åN]:EK1ÿÁ
+fϦŽóÎ;0`ÍÂG>|XÍ4u
p·®ÌF¢%ÿ`+æ?Ó¿ëyÀ9s¦ÙÍÂegg»½-uwµ¤®ÌFÂ]̰ó×( ÀA 0DP !" ` CE "( ÀA 0dkPt:Ú²e¦NªÑ£GkÊ)Ú±c-cYºt©=ªêêjÍ=ÛµüÔ©Szê©§4zôh=õÔS:uê-ãû¼¡®bcc]?h¼¡Nÿ¼7Ôów±5(nÞ¼Yyyyzî¹ç´}ûv-Y²D´e,N§SCVß¾}]ËWZ¥»îºKï¼óîºë.ZµÊñÁ}ÞPW
*,,´eLðÞP§ÌÞÇêùϻطnݪ
ªCêÝ»·RRR\ë9¢3f(..N3fÌPYY¤Úg#=z´$©¼¼\³gÏÖèÑ£5uêT:t¨Q_±±±Z³fÆ£©S§êÓO?$mÙ²E±±±Ú±cfÌ¡¤¤$½ñÆ®g:{÷îÕ Ô©S'M0A{÷îµú°àyC]ÞP§ÌÞÇê
+ÞÅÖ XQQ¡[o½µÉõK,ѸqãôöÛokܸqZ¼x±kÝí·ßî:¦ûï¿_ï¾û®fÏ¥K¶wóÍ7këÖzðÁµ|ùrIÒÃ?¬mÛ¶iÐ A*,,Ô A´uëV׳ÊÊJuíÚUtã7êÂ
¦ì;¬ã
+uxC2ÿyo¨+x[b=ôü£Éõååå;v¬ºté¢1cƨ¼¼ÜµnäÈòó«þg}¦Åë¾ûîÓÂ
uâÄ Ãö~ö³©sçÎ;v¬«ØØX=ðÀÚ·obccµoß>?^[·n$]ýõ:wî$éüùóºþúëMÙwXÇê
+ð:eþó>ÞPWð.¶ÅñãÇkÉ%*++Ó+Wô¯ýKK,q
+Òÿüg]ºtIï½÷^gIþþþ®Û·Ýv,X ÷Þ{O
*((0쯮;v¸Ú*,,Ô ôâ/*33SãÆSaa¡Æ/I<x°^ýu]¾|Y¯¿þº
+dÅ¡¼¡® o¨Sæ?ïã
+uïÒÁÎÎ'N(=ÿüóúâ/Ô³gOM2ŵ>99YK.Õ+të·6¸Î¢¾_ÿú×JOO×/¾¨Ë/Ká)îÏ?ÿ\ãÇW=ôÌ3ϸê±ÇÓÁ=c5kþyýüç?×í·ß®ßüæ7fì:,ä
+uUÿZºÛ¼,Ó¾xC2ÿyo¨+æ?ïâX¸p¡355õª¥¥¥©¼¼¼Éª³jÕ*ýóÿÔÌ3Í£)bcc)D-ê
+¦jI]ùùùùv`þ¬ÿøÀm j7Ag=°uo@Â
+ÔUûÐn" Z CE "( ÀA 0dË7³>|X°£k[|ùåºråzõêe÷PÚÌwÞ©´iÔï³£®ÌFú>æ?ëQWmÇ xàÀùdmGï6ÈÔSR¸Ýi#ÅRBUB4uåãlª+³8p@|ò¢£ÛG¡æçç«gÏ
+o
Z\\¬ªª*[æ?êÊwÙUWßõ#éêßã;>4PígÓ$´©ïµãL]yf¿:ËW|üñÇ8p`»Ùß´´4<hO¡RW¾ËκâE "( ÀA 0DP !" ` CE "( ÀA ¼#(:¾ýñ&iÛ÷ÖmßÓ%ô¤aõ4\Rçoÿ=ÙÊöÝe÷þ¾!é6Õ~øO¾ýÝÙ}ë,º¶[ÂîýuÔû©o³¤pI$EHÊoe¿>ÊápÈápÈßß_aaaÚ¶m[uFÛ·ÆôéÓuàÀ}óÍ76ì»®®ÿÖ¶ÛRvïïöíÛªÎ;+66V_|ñE«Ú÷tvçúuÕµåIû[_NNúöí«N:)""Bùù7zGP$§¤KIaQ5ª="4¤ÞòùFH:ÿí¿Éõ_û()CÒ¿%Pí~_eçq¤=V[Ô¯;÷×ùíÏ÷m#©RÒlILc¥E IDAT Ë9N]ºtIË-ÓÖ<p555òóóÓßþö7
+òÝçt:åt=pÖ±s§M¦ôôtUVVêW¿úÛb·ǹ®ÿ¶¬/Oüôî»ïjçÎ:þ¼}öYM<Ùq]ï uü¯á¾I%ýPµgTJ¾]þíºW$õÚTüó%%Iêòí¿y×0²cowI
+¾1x;óEÕò×ÐwkÙ±¿MÉÔOµÿ¿â¾müý[ÿÀ9-\¸P?üá¦Ú.==]C¯¼òú÷ï¯èèhX±¢ÍÎ ^û[SS㺿$íØ±ã÷ÂóÙUW7Þx£ôóÿ\ååå×¼îò¤ÿG¯¾úªn½õVùùùÉßß_}úôiõجâ=AÑ¡Ú~y
+íIª4GÒÌo%I:#i¤jÏxtJßý8#©Ç··»K:{
+ý»ËÎý]Ú³:%ýV]CÿÎÎã¼PÒ4I÷^C¿-eçþ6çsI«6\¢Ã¡Î;ëé§Vffë¸ UTThÎ99³öKJJÒ3g4räH9N9R§Njó³õÙ¹¿zâ'ÔµkWåååéìÙ¶ðíaçqv::þ¼;¦;ï¼S Ö¿à©ÿºté¢3g^Ó¸¬ÒÁcÝYR¤o¯Rí¦LôÕ¾:ïÛeõÝíîª}ùu¶¤@ÕþQì©Ú?|-{kع¿¿-)VµgS§Jú{Ëï5ì<Î+¾í¿þöVÿm¶s¯f·¤xI¿ôf¶múcÓ¹sgUUU) ö«ªªR.M?pÓ¦MÓ~ðM>]óæÕ>põÏxÔÝîÞ½»2224{vs5ìÜßzH=ô¤Úëë_Ëæk<¡®n¾ùfýîw¿Ó7ÞxÍûÓOØß¦Æõõ×_ëí·ßÖ/ùKµh¿¬æ=g2\ÒªýÃVõííWÙ~½¤¯UûòØß.sJ+i¤}ª½vË©ïþ¸RíËj¿ýw¤ão©¶ØßSßþëøÞïíI[ç5¼nϾ8m³¿MY#é~ÕáÒÁ·_Ã×/¼ ªª*UUUé
^ÐM?pëׯ××_W^yEwÜQûÀ9NÍ;W»víÒ¾}û4cÆ9NÛBâÕ´Õþ:N>|XÉÉÉ5kåûåiÚ²®Î;§^xAîÓÕØùÿ())I$???]¸pÁ¼3÷ŵöJºùÛ}ß.kÊqÕåHWí¨:ªög$uûÞ}J*t¤÷UûF »´ÅþfJzBÒuª}i±-ßlá)Úâ8{¶Øßúïx®û1I_Jº¯ÞòªÖíF{³víZíÝ»W7ß|³n¾ùfíÛ·Ok×6ýÀ?~\Ý»wWzzºÖ¬ùîûðÃ5lØ09sFݺ5|àê¿S³-
ßýl¤ö×ÏÏO£FÒ¤IbÙþxª¶¬«^½zéoû6n´ãbíZvþ?êß¿¿"""ÔµkW-^¼X6m²`¯w¼ô|µ3-Áv¶ ´o¾¯øÛGªñÃ[Tû°Ø½¿¿ýñuvgwÇb»÷·©þí<ê®vSpp°vîtÿKKKSZZ㮸¸ö9r¤FløÀÙñç¦øâþÚ¥½gOÝßÄÄD%&&ºÝ·¼ÿ" ,Ѿbûx¢øö¶¿vioǹ½í¯h/gÊê´·ýµK{;Îím¥ö à6" ` CE "( À}¸],i±m½·ÿtIígÔ6ßmºò]vÖɵxqûxàþ÷ÿW.]j7û[TT¤À@{
+ºò]vÖ-Añ;îPBUtÀÞÛÞ·|©êêjõ>ÐÛî¡´@iÀmÞ-uåãlª+³ÝqǪªªÒí£Po¹åUWW·ý
+´mþ£®|]u%Ù#""lýpø&ê
+Þ:
¨+X
k ` CE "( ÀA 0DP !Ó?GñÓO?Uvv¶ÙÍÂ8p@
+rk[ê
+îjI]:
»ÿ`+æ?SbDD*++Íl>lÐ A:th³ÛQWh wëÊlÔ)ZùV°bþ35(FEE)**ÊÌ&ê
+^:
¨+Øk ` CE "( ÀA 0DP !·?Gñã?ÖªU«¬ ´
+6Ìmÿ øÌnŨ¨(;wî $**JÑÑÑnmÇüÀ¸;ÿInÅÅÄÄ\Ë À+1ÿhϸF 0DP !" ` CE rësUTTdõX M¹ó¡³Ì |»ºíVPܵkrss5tèÐk xýû÷ëܹsÍNÌ |»óÔïz:t¨RRR®i` à)ZòÝÍÌ |IKæ?®Q !" ` CE "( ÀA 0DP !" ytP ±{ `æ? À XTT¤1cÆ(,,L#GÔ[o½eE7
+\ˤº`Á}ú駪®®ÖÃ?ìZ¾}ûvÝwß}
+Ó¸qãôÁ1T >ÌWæ¿wÞyG£FbþÚ9Kâ¼yó4sæL}òÉ'ÊÊÊRaa¡ÝÆétÊÏÏOûöíÓ\Ë·oß®}òÉ':uªzê)G ÀøÊü÷¿üEëׯ×ÁõÄO0ÿí%A±k×®ª¨¨Pii©zôè¡ôôt׺CiìØ±
+
+
+ÕØ±cUZZ*I*--Õý÷߯ÐÐÐFÏ?øà
+2D¹¹¹úì³Ï4aÂ׳õ½{÷º¶ 1|f¢%K(<<\±±±úøã%IYYY
+ Ñ믿®1cÆhòäÉzåW\mü÷ÿ·ÂÂÂÔ¹sg
+>\×]wñùoùòåêÓ§üüüäïï¯={Zr¼ x6KâÚµkuâÄ =ÿüó6lÞxã
+׺äädÅÇÇëÀWrr²kùC=¤ÒÒR;v̵ýo¾©ßþö·Z·n&M¤ùóç+!!AÒsÏ=§¸¶?vìXûÖ×»woíÙ³G>ú¨yæIRbb¢öï߯{î¹GÇÓ=÷Ü£½{÷6j£¢¢B?þ¸~ûÛßz ø_ÿBBBÔ·o_=óÌ3úÃþ`ú±àù.t¦¦¦^u£´´4+%%¥Å9rD Ú»w¯$)44T|òºt颯¾úJPYYBCCuðàAýà?pÝ7$$D:tÐêÕ«ãºÿ+W¾ÛCGUHHHdHH>¬.]ºè믿VÿþýUVVÖäu=-ÒÔ©S%IÐ9s4oÞ<?¾ÅûÀ3ZµJ~~~bþk¨þü'I/^TAA-[¦¿üå/-> <OKæ?KÎ(Î;WÇ×åËõ÷¿ÿ]555®u?ùÉO´eË}ýõ×Ú¼y³BCC%IaaaÚ´i._¾Ü 5kÖ(99Y;wî$ÝyçZºt©ë÷Ñ£G%I:tÐ_~Ùä¶lÙ¢/jË-ºí¶Û$Õ>OLLTvv¶Þ~ûmÅÇÇëØ±c®IrÓ¦M1cþð?¸ÅWæ¿ßÿþ÷:sæ$ÉÏÏOÿþ÷¿M:B ¼%A166VÓ§OWxx¸ÒÓÓ$ÖÅëµ×^SÿþýµiÓ&-Y²Äµ|óæÍºã;<ÓÖúõëõ»ßýNëÖÓK/½¤7ß|S
+jpMÎ#<¢&%<yRVVVVñìÛ·O
+ÒùóçÕµk×÷yöÙguúôi=ú裮¾¾úê+Ó ßã+ó_ß¾}5nÜ8
+0@«VÒ+L;F ¼å/={«½, }j=óï³ý¥g x¿vy6
+ ½bþp-ÚEP @Ë ` CE "( ÀA :ÙØþýûURRbf ÐbÔСCÛ´Oæ? ÀìùÏÔ XRR¢÷ß_ÑÑÑf6 n+..VeeeEæ? v³bþ35(JRLLL³_ V©ûÊ=;0ÿ°ó
×( ÀA 0DP !" ` CE "( ÀA ¼6(VWW+>>Þîa4+>>^ÕÕÕvaþÐVl
+ÃpyNNúöí«N:)""Bùùù¶ÉÍÍÕÝwßÝhù¢E´{òäI
+>\;wÖðáÃuòäIIÒöíÛªÎ;+66V_|ñ
$©¦¦F-R>}äçççj«~¥¥¥
+
+
+ÕË/¿ìZçp8äçç§ mذÁµíàÁÛÒCÀÇ1ÿðyFñÝwßÕÎ;uþüy=ûì³<yr£m²³³Ó`Ù={´zõêËæÏ¯#Fèüùó1b%IÓ¦MSzzº*++õ«_ýʵ<55U999Ú¹s§®\¹"§ÓÙ ½ÂÂB?^k×®Õã?îZît:U]]¬¬,=ùä®å111ÊÎξ¦ã ý`þàI:Ø= #¯¾úª$éÒ¥Kò÷÷W>}m³{÷n
¹~¿xñ¢µqãFÅÆÆºçççëСCêÒ¥Ô¯_?IµÏ¥ï)ïØ±C´fÍ\¹Òµ]}ëׯWFFòòòÜäø{öì麦>úÈÝ]ÐÎ1ÿð$¥ï&°ÀÀ@mß¾½Ñú3gÎ( ÀõûÂ
5mÚ4Ý{ï½¶ëÑ£$©{÷î:{ö¬$)33SO<ñ***ôØc¹8qBùùù8q¢n¾ùf½ôÒKzà$IsæÌÑêÕ«
+'ɺñvìØQ[¶lq-ÐéÓ§[{ ´CÌ <
G¾ô,Õ¾ñÕW_iÕªUúå/Ùh}·nÝTUUåú}Å7o^£kjUQQ!I:uê%I=ôÊËËõÕW_iôèÑúÑ~äÚ~Ô¨Q:{ö¬V®\©3gºú(((PRRáK)N§S555ÊËËÓܹs]Ë«ªªtÓM7]ëá Ð0ÿð\.\¸Ðh!CèÈ#®ßkjjät:]×ÔÔý;jÔ(¥§§ëâÅJOO×È#]÷q::|ø°5kÖ,IR\\$^Ä©¥¤¤(33³Éñ×]ÊÊÊÙ² ÝbþàIléùûïüs:êß¿¿"""têÔ)õïß_6mjt¿É'«¨¨¨ÙIhéÒ¥×
+7Ü ÈÈHåää4è·W¯^5kRRR$IË-Ó#<¢|PAAAZ·n]öÂÃÃUTT¤¸¸8;wN,hÔ^FFkû]»v)!!¡%@;ÁüÀÓÙ¿ÿº:JLL¼ê}'M¤)S¦4Ûî-·Ü¢?üÐí¾{÷î]»v]uû=z´Ù¶¤Úw"Ö) $æ? ÞÁö3Õ±cG׳cOæ
+cà]ÿ ´¼F ö#( ÀA 0DP !" `
ÈôÏQ,..ÖâÅÍn ÜRTT¤àà`[úfþ`'+æ?SbDD*++uüøq3 ·kèСmÞ/ó »Y1ÿ£¢¢ef àÿ ø"®Q !" ` CE "( ÀA LýÅýû÷«¤¤ÄÌ&áãØìRWh)wêÊlÔ)ZùV0{þ35(èý÷ßWtt´ÍÂG«²²²Ù¦®ÐîÖÙ¨S´ó¬`Åügúw=ÇÄÄ(55ÕìfáÒÒÒT^^îÖ¶ÔÜÕº2u
+w1ÿÁ
+VÌ\£ CE "( ÀA 0DP !" ` CE òÚ X]]øøx»Ñ¬øøxUWWÛ=¸º7 Naê
+Fl
+ÃpùæÍ®N:)""Bùùù¶ÉÍÍÕÝwßÝ ºúN<©áësçÎ>|¸N<éV-jÐVýÛ¥¥¥
+
+
+ÕË/¿Ü o???iÃ
+®m¬ÜÜ\w L@]ÁP§°u³yäÅÍ7+''G={¶m×ïN§SN§³ÑvóçÏ×#tþüy1BÉÉÉÍö±gÏ^½Úpl
?~¼Ö®]«Ç¼AÿÕÕÕÊÊÊÒO>éZ£ìììº7 Naê
+åA177WýúõS.]§þð¶Ù½{·ÂÂÂm+??_IIIêÒ¥wÕ>.^¼¨ÄÄDmܸ±Q[ëׯWJJòòòÝd={ötÝÓG}Ôì8a=ê
+Þ:
¨+´V»p5þ¹~øaX±¢Ñº3gÎ( Ù6Î9£=zHºw﮳gÏ^µ
jÚ´iº÷Þ{µ5gÎ^½ZÁÁÁÖÕBïØ±£¶lÙâZ Ó§O7;N´ê
+Þ:
¨+´GQjÙ6LIIIúÅ/~Ñh}·nÝTUUÕl;ª¨¨$:uJWícÅ7o«@ë_CQPP ¤¤$ÃSÞN§S555ÊËËÓܹs]Ë«ªªtÓM7¹¹×°uo@Â
+ÔZÃ#â5ktÿý÷+33SS¦L1ÜfÈ!:räH³m5Jéééºxñ¢ÒÓÓ5räÈ«öQSSÓàºú×gDFFª @)))ÊÌÌl²Ïºÿ@TVV¦ÈÈÈfÇ ëQWðÔ)¬@]¡µléùûï¦r:zì±Ç$I÷Ýwkù
<y²\ÅbôN*§Ó©¥K*>>^7Üp"###Inõa$<<\EEEÓ¹sç´`Á}öêÕK®íwíÚexÑ0¬E]ÁP§°u3ÙÞMuµåõM4©Á3¦îsË-·èÃ?lUõ·©;$$DGu«={ö48eëQWðÔ)¬@]Ál¶Ql;ºÅx2o#¾C]ÁP§°u#y" ìGP !" ` CE "( Àé£X\\¬ÅÝ,|PQQáÁ¡®à®ÔÙ¨S¸ùV°bþ35(FDD¨²²RÇ7³Yø¨àà`
+:´Ùí¨+´»ue6ê-Áü+X1ÿ£¢¢ef u¯@Â
+ÔìÆ5 0DP !" ` CE "( À©£¸ÿ~Ù$|ÜÀýpPê
+-åN]:EK1ÿÁ
+fϦŽÿþû6³Yø¨ââbUVV6[ÐÔZÂݺ2u`þ¬ÿLÿ®ç¥¦¦Ý,|PZZÊËËÝÚº»ZRWf£Ná.æ?XÁùk ` CE "( ÀA 0DP !" ` C^«««ßæýÆÇÇ«ºººÍûEÛ ®à
+¨SXº[¢ÃáhryÝOSrssu÷Ýw7{-Z´H}úôk}ýíJKKª_~¹A[~~~
-Ô¡CWMý
-Cýæ¢~s£~mãââTVV¦¯¾úÊÉaJÔ«W¯úúÌEýæ
-Fý:Ú('&&*11ÑÉ!õúÌEýÞÄw °¡Q ÀF e lh °¡Q ÀF GÿòþýûµgÏ'DÅÇÇ×úÇ·÷Ô%nN#¼ú5õú5õú5Óõëh£¼gÏíܹSÉÉÉN ª¬¬¬Ö!nÞR׸9<ðê×LÔ/$ê×TÔ/$ê×TÁ¨_GeIJIIQff¦ÓÃ" YYY***ªÓ¾ÄÍ;ê7§ÞAýú
Dýú
Dý*õËw °¡Q ÀF e lh °¡Q ÀF e lh °¡Q ÀƨF¹¼¼\iiinO£Viii*//w{AÜ ¦"nÈS7Hä©û\m}>_Ûß~ûmuïÞ]M4Q\\¶nÝ*IÊËËÓ½÷Þ[éñWþ³;yò¤¡¤¤$<y²Æq¯1cF¥±ì·>¬Î;káÂ
¦èèhZµÊ¿oÏ=ȸA"LEÜ ¦"nÈS7óxòå5kÖ(77Weee7n"IÊÍÍUJJ?˲dYÖ54iî¿ÿ~*))I'O®q\IÚ»w¯/_^å|>üðC=þøãZ²dÆSéøåååZ±b
ÆëߢÜÜÜ$òÀTÄ
-y`*â<0qó.O6ÊëÖÓ]wÝ¥¦M*55UÍ5ôCPccck}üÖ[5~üx5mÚTÚ²eKã^¸pAéééZ½zõ5c\¹RS¦LÑ-[\í1[µjå¿«}ûöÕë9_$òÀTÄ
-y`*â<0qó®p·'PÓ§Oëç?ÿ¹æÎ+I*))Qddd+))ñ°eËúî»ïj÷
^PzzºxàkÆzöÙgµdÉuèÐáû®\¢Ð¸qc_¿Þ¿=22R%%%u{×!â<0qD¸A"LEܼÇ(K?¼Ò»wo?^$µhÑBçΫõ±QQQ*..$9sFQQQ5;oÞ<eddøÀ~þ¶mÛ4~üø*/)°,KÚ²e&Làß~îÜ9µhÑ"gm>â<0qD¸A"LEܼÉ
òÒ¥K5`À -^¼XÃ÷oOHHÐ#Gj}|ß¾}5wî\]¼xQ¯¿þºúôéS㸮û·_ÿ mÛ¶iÊ)Z¼xqÇó'¨$=zTõ{Ò×â<0qD¸A"LEܼËõK¯¯þÍmeiÔ¨Q¤GyÄ¿ýÂ
:t¨
+Ò
+\Û<X¹¹¹-ßY´ê
+Þ:
¨+Í#Ï(:N9ΫnfïªíܹSW®\i´Maa¡Æ¯µk×êñÇoÐ^uuµ²²²ôäOºÇÄÄ(;;»{;QWðÔ)¬@]¡µ:Ø=ÖÚ½{·ÂÂÂÝnÍ5Z¹r¥úõë×hÝúõ롼¼<7ÙFÏ=]·ÃÂÂôÑGµjÌð|Ô¼u
++PW0âgÝqæÌ4»Ý'¯ë®»NÁÁÁÚ¶mkÝ9s4þ|Ãbv8ò÷÷ר±cµ|ùr×ò >}Ú}ç¡®à
+¨SXº¯
+ݺuSUUU³ÛjÔ¨Q:{ö¬V®\©3gºÖ())Éð·ÓéTMMòòò4wî\×òªª*ÝtÓMæì<uo@Â
+ÔxmP2d9Òìvqqqdx±mdd¤
-pÍc¯Ü¶,K999JKKS³fÍ µk×JRµã6mÚ´Æ9vëÖMJMMÕÙ³g5uêÔJÇlÓ¦æÏïßÇ<xp=VÁ<Ä
-y`*â<0qD¸ÅÕF¹ªßÜVÓö§~ZÃ
-«u¿;î¸C»wï®ó¸Õíc¿£ãÇ×i¬?þXµËTÄ
-y`*â<0qD¸ÇõOë#<<Üÿ.0ÇP"nÈS7Hä©$òÀTÄÍ}ü2 n¡Q ÀF e lh °¡Q ÀF Çÿraa¡fÏíô°@AA:tèP§}wÔ'nN#¼ú5õú5õú5U0ê×ÑF9..NeeeúꫯêСzõêUë~ÄÍ[ê7§ÞBýú
Dýú
Dý*õëh£¨ÄÄD'D7Hä©$òÀTÄ
-y`*âvýã;Ê ØÐ( `C£
-2 64Ê ØÐ( `C£ £GyÿþýÚ³gC¢âããkýãÛÄÍ{ê7§ÞCýú
Dýú
DýÊéúu´QÞ³gvîÜ©ääd'E
-UVVVkÂ7o©kÜFxõk&êõk*êõkª`Ô¯£²$¥¤¤(33Óéa¬¬,Õi_âæõÓÈï ~ÍDýB¢~MEýB¢~Múå;Ê ØÐ( `C£
-2 64Ê ØÐ( `C£
-2 64Ê ØÐ( `cT£\^^®´´´7--Mååå!?îõ¸A"LEÜ ¦"nÈS7÷¹Ú(û|¾j·_ùÏ.//O÷Þ{oûUTThÖ¬Yj×®ÂÂÂü÷Û÷;|ø°:wî¬
V+,,LÑÑÑZµjß={*//¯aOö:BÜ ¦"nÈS7Hä©y<ù²eY²,ëí¹¹¹JII©u¿ÌÌL[·N7oÖå˯ÙçÃ?Ôã?®%KhÌ1Æ+//×+4vìXÿöåææ:ðÌ®oÄ
-y`*â<0qD¸yW¸Û¨½{÷*66¶Öý.]ªÅ«[·n×Ü·råJ-X°@[¶lQª£U«VþÛ±±±Ú·o_ at sqÃÈ37Hä©$òÀTÄÍ}üD¹:%%%¬u¿¯¿þZùùùºùæuçwjãÆþû}öYM8±Êdñù|jÔ¨}ôQ½öÚkþí*))qä9Ü$òÀTÄ
-y`*â<0qsQr-tîܹZ÷R>}TRR¢(==Ýß¶mÛ4~üø*/)°,KÚ²e&Làß~îÜ9µhÑÂ'q"nÈS7Hä©$òÀTÄÍ}F5Ê :räHû¥¦¦JªúKó Ú¶m¦L¢ÅWùø°°0ûÿ}ôèQ%&&8k7Hä©$òÀTÄ
-y`*âæ>׿£|uP-˪´íÊm˲4tèP(!!áÇÚ÷3g¢A)::ZË/¯tnݺ© @©©©:{ö¬¦NZi6mÚhþüùþýwìØ¡Á;õ¯Ä
-y`*â<0qD¸ÅÕF¹ªßÜVÓö§~ZÃ
-«u¿¶mÛª ÆqcbbtüøñZǤ?þXÕÞ£!nÈS7Hä©$òÀTÄÍ<®¢\áááZ»vmÈëÆ1¯'Ä
-y`*â<0qD¸¹Ï¨ï(
l4Ê ØÐ( `C£
-2 64Ê ØÐ( `ãøßQ.,,ÔìÙ³(((Pê´/qóúÄÍiäwP¿f¢~!Q¿¦¢~!Q¿¦
-Fý:Ú(ÇÅÅ©¬¬L_}õÃ"@:tP¯^½jݸyK]ãæ4òÀ[¨_3Q¿¨_SQ¿¨_S£~mèäâ<0qD¸A"LEÜ®|G e lh °¡Q ÀF e lh °qôï(ïß¿_{öìqrH4P||||¸yO]âæ4òÀ{¨_3Q¿¨_SQ¿¨_S9]¿6Ê{öìÑÆÕ£G'E¾øâÕ0ÄÍ[ê7§ÞBýú
Dýú
Dý*õëh£,I=zôÐ3Ï<ãô°@nnn÷%nÞQ¸9<ðê×LÔ/$ê×TÔ/$ê×TÁ¨_¾£
-2 64Ê ØÐ( `C£
-2 64Ê ØÐ( `C£
-2 64Ê Ø¸Ú([¥wÞyG#FÐÃ?¬áÃë>pü8999:vìÊËË5fÌÿö3gÎè¹çÓÃ?¬ç{NgÎqüØ×#·ãöÐCùÿ{ÜÎê70nÇúõ·óú
-Ûq£~½Áí< ~ãvܨßúsµQ^·nòóó5}útmÚ´IÙÙÙ:xð ãDZ,Kôå_ªK.þí-R÷îݵqãFuïÞ]-rüØ×#·ã¶}ûvmß¾Ýñã¡~ÜÎê70nÇúõ·óú
-Ûq£~½Áí< ~ãvܨßúwóà¿ÿýïõ/ÿò/$µmÛV'OößäÈegg«¨¨HíÛ·×Ô©SÕ©S'=ôÐC4h6lØ Í7«¨¨H999:rän¿ývM2EwÝu~ÿûßkÞ¼yTé÷Þ{OÛ·o×'|¢eË©I&zòÉ'5räÈÐ.¡Ü¼Áí< ~ãvÜà
-nçõ·ãop;¨ßÀ¸7Ô«(«}ûöÕÞÇ{L6lÐc=¦Ù³gûïõ'AVVú÷ï¯÷ß_ãÆSNN$iàÀúÃþ øøxmß¾]={öÔ;ï¼ãO²²2Ýzë¤æÍë/ùK°êuÅí¸ÁÜÎê70nÇ7_Þ
-IDAT
-ÞàvP¿q;nð·óú
-ÛqCý¹úr«VTTTägåjEEEêׯ"""Ô¯_?½ñÆþ
ûúöí«°°úücÇ);;[ÙÙÙ$Ï'I®Á¿rû'ÐsÏ=§ê[nÑÙ³g¥ÒÒRÝrË-Ay×·ãop;¨ßÀ¸7xÛy@ýÆí¸ÁÜÎê70nÇ
-õçj£<pà@eggkâÄQqq±VZ¥I&I¢££µyóf=üðÃú÷ÿ÷JïÂ4jÔÈ»cÇ8p RRRáß¾}ûv-\¸P½{÷ÖM7ݤ÷Þ{OS¦Lñßß³gO_¿^¿øÅ/´~ýzÝsÏ=!xÖæs;nð·óú
-Ûq7¸Ôo`ܼÁí< ~ãvÜP®6ÊO=õ5j¤W^yE§OV«V4|øpÿý'OVNNæÍ§öíÛWìú§Òܹsõúë¯ëûï¿$ÿeRzzº<¨æÍWzÜ?üÃ?èå_VÿþýÕ¹sgýó?ÿséõÅí¸UõÛy@ýÆí¸Q¿ÞàvP¿q;nÔ¯7¸Ôo`Üõ[¾iÓ¦Y5¢¢ZßX´hþçþGÏ<ósDrssÕ¨Q#âfúÄ-,,LÔïõú5õú5õú5U0ê×Õ_æ ×Ð( `C£
-2 64Ê ØÐ( `C£
-2 6ánô/¾ÐÜ8t|ûí·º|ù²Ú´iãöTªÕµkWõèÑ#¤Ç$n
-çFÜF4õ{-âäAÃQ¿×"n¡A4õ{-âV=WåèàÁJNNvãðµÚºu«Z·nnݺ¹=*êܹs!OâÖ0nÅÍiäAÃP¿U#n¡A4õ[5âäAÃP¿U#nÕs¥Q¤effºuø}úé§÷ìü²²²ôÙg¹rlâ87ãæ4ò pÔoÕ[è£~«FÜB<õ[5âV=¾£
-2 64Ê ØÐ( `C£
-2 64Ê ØÐ( `C£
-2 64Ê ØÑ(û|>ù|>5jÔH;wÖ
-®Ù'==]~ú©þïÿþO?ýéOýÛO<©¤¤$EDD())I'OôÔüÞyçýøÇ?Vxx¸:vì¨wß}×ñù¹¥!ërÅ3äóù<7¿+½zno¿ý¶ºwï®&
M(..N[·n
-ÊÜMuöÊü6mÚ¤;*""B>ø þüç?m¡æTÜLªßµkתK.jÒ¤zôè¡üüü ÌÝ$
-YçP¼#BqÞl
-Y
-Í5KíÚµSXXXPj8?yÞ`¬s(^¡8o6'þ¶lÙÒ³ó«jL¯ÅÎFY,ËÒÅ#G^sEE
$iïÞ½JHHðo4iî¿ÿ~*))I'OöÔüÒÓÓµ`Á?^¿ùÍoª|¬É]+Û/_îÉùY%˲®ÙÍ5ÊÍÍUYYƧ!Coòqz½2¿_þò?¾ÊÊÊ4iÒ¤ ½¾¸¥!õ{%vÁÓyµiÓ&åçç«´´TÓ§O×СC6wºÎ¡z=t:BuÞl®Kff¦Ö[§Í7ëòåËA«á`ü\Åyi]çP½:¡:o¶®eYÚ½{·FíÉùU7¦×âgL£,ýðnCXXå)/X°@>O+V¬P||¼ôÆoøßغu«Æ¯¦M*##C[¶lñÔüÚ·oï¬ýß×@ÖåÂ
JOO×êÕ«=9¿ê¬[·NwÝu6mªÔÔT5kÖ,S7ëìù]ùApåß7oí¤C и5oÞ\êß¿¿<7¿ª¬\¹RíÛ·÷´y&uåë¡yÊó`d].]ª×^{Mݺuúk±qåyiYçP¾zýüÀ-
-]W_}UcÇõìü®ªóú0¦Qöù|Ð ´téRÿöqãÆé»ï¾ÓC=$˲ªo¿ýÖÿnDIIZµj%IjÙ²¥¾ûî;OÍoñâÅ2d"""4lØ0-^¼8(ósK ëòÂ/(==]<ð'çWÓ§Oëç?ÿ¹æÎ¬©%Xëìöü,Y¢Ñ£GëÖ[oÕæÍöúâ@×Ų,êÄêÚµ«ì©ùÕ6fÓ¦M5jÔ¨ëîõ8P
-]ç`¿:¡:o¶@×å믿V~~¾n¾ùfÝyçÚ¸q£§æWP7¦!ë×C¯¸¥¡ë²k×.µhÑBmÚ´ñäü®ªóú
-w{uUÝÛß¡¸rû¶ÛnÓüùó5nÜ8EEE©¸¸X[·Ö3gå©ù1B«VRjjªòóó5bÄýñÊÝèºÌ7Oe)##ÿO0^_MöîÝ«´´4½òÊ+0`s5X0ÖÙIÎoÐ A4h$)??_ï½÷^ð'B
-Ûm·Ý¦^zIÍ7÷äüªóÂ
Ú°aªcÇ97aC5dCñzètê¼!ØrÞÔ§OeffjëÖ9r¤¾ùæÏ̯:¡:o0MCÖ9¯^??pKC×eæÌÊÉÉñìüªìóú2¦Q®eY8q¢ ÈÈH½ñÆZ¶lÿþ¾}ûjîܹ9s¦^ýuõéÓÇSóûöÛoÕ¨Q#ÿâC:?·Ô¶.W.iÜùaWÛüª³téRM>]¿ûÝïôðÃ`¦ftC¥.ó³,K_~ù¥&M¤Q£F¹4ÓЪkÜJKKõë_ÿZqqqßÕþyM>]7ß|³***tþüùÌÖ\µ³Û¯æÛç
-ÁVÛº¤¦¦Jª|Âë¥ùUÇíóÓÔ¶În¿zýüÀ-uY;wª¼¼\ñññ_MÜ:o¨1^×d÷îÝJLLÔÙ³g¯ùín999*((P³fÍôÿñ3g§æ·páB3F7ÝtÆ«7Þx#äósKMëâ5ÍÏþ[ùì·G¥o¿ýV<òûÅC>w²Î^_XXúôé£'xBÓ¦MùüÜR¸Ý~ûíÚ½{·Þzë-OÎïêÛwß}·zôè¡-Zè׿þµÖ¬Yòy¦¦uöÂëa yà
ó`«i]æÌ£ììlEFFêùçwåcyýçÂõ¢¦uöÂëa yp#äGmçÏ3gÎÔøñã]Ù77ϪbÄ'ʵ½+øÿù~x¸oß¾î»ã;´{÷î ÍMjØüìëðÖu©Ï8jÈüjú}¨,ëì$¯ÏÏ-^_`Ì/==]éééÎLð:q#æA(Î!ëÒ¶m[mnRðóêz~m®¬s(^9«ZCÏ?üðà Ìë)n×Å'Ê 8
F e lh °¡Q ÀF e lh ° wëÀ
={¶[¯Ñþô']ºtɳó+((PTT+Ç&ns3nN#GýV¸
y8ê·jÄ-tÈ
ÀQ¿U#nÕs¥QþÉO~¢sçÎéÀn¾VwÜqÊËË=;¿¨¨(õèÑ#äÇ%n
-ãVÜF4õ[5âäAÃP¿U#n¡A4õ[5âV=W常8ÅÅŹqh4 qD¸A"LEÜ ¦"næâ;Ê ØÐ( `C£
-2 64Ê ØÐ( `C£ ãGùðáÃÊÍÍuzXàÀºç{ê´/qóúÄÍiäwP¿f¢~!Q¿¦¢~!Q¿¦
-Fý:Ú(ÇÅÅ©¬¬ÌÉ!Ñ ÷ÜszõêUë~ÄÍ[ê7§ÞBýú
Dýú
Dý*õëh£¨ÄÄD'D7Hä©$òÀTÄ
-y`*âvýã;Ê ØÐ( `C£
-2 64Ê ØÐ( `C£ Mÿò§~ªEs. êaÏ=êÝ»wö¥~o¡~sQ¿¹êS¿ujuöìÙM
-³\§ý¨_À[¨_À\Ô/`®ºÖ¯$ù¦MfeffyJ x_VVßQ ÀF e lh °¡Q ÀF e l|)))Ö£>êö< pÝ;ôÿÓL9Ò7]â IEND®B`
\ No newline at end of file
+
+¢ÌÌÌ&Û¨¨¨pÝ.++Sdddk
+G]ÁP§°u#¶_£øýwS9ÎËênÿbÙÉ'«¨¨ÈU\MÝgÙ²ezäGôà*((HëÖkÐNxx¸§sçÎiÁ
+ÚèÕ«222\ÛïÚµK ״ϰuo@Â
+ÔÌdkPlêXͽ3K&M¤)S¦4{Þ½{k×®]Wí#$$DGu«ÿ={ö48eÏC]ÁP§°u³Ù~F±µ:vì¨6ï×>Ñv¨+xêV ®`Äk¯Q µ 0DP !" ` CE 2ýsµxñb³
***2üâx#ÔÜÕº2u
+w1ÿÁ
+V̦ÅUVVêøñãf6¬¡C6»u
p·®ÌF¢%ÿ`+æ?SbTT¢¢¢Ìl ®à¨SXºÝ¸F 0DP !" ` CE 2õs÷ï߯38p`³J]¡¥Ü©+³Q§h)æ?XÁìùÏÔ XRR¢wÞyG0³Yø¨Ã«²²²Ù¦®ÐîÖÙ¨S´ó¬`Åügúw=0 at 3gÎ4»Yø ììl··¥®à®ÔÙ¨S¸ùV°bþãE "( ÀA 0DP !" ` CE "( ÀA l
+N§S[¶lÑÔ©S5zôhM2E;vì°e,K.ÕÑ£GU]]Ù³g»:uJO=õF§zJ§N²e|p7ÔUll¬ëí7Ô)ó÷ñºbþó.¶ÅÍ7+//OÏ=÷¶oß®%KèàÁ¶ÅétÊápèðáÃêÛ·¯kùªU«t×]wéwÞÑ]wÝ¥U«VÙ2>¸Ïꪰ°P
¶ ÁêùÏûxC]1ÿy[âÖ[¢ÐÐPuèÐA½{÷VJJký#G4cÆÅÅÅiÆ*++Tûl$##C£G$köìÙ=z´¦NªC5ê+66VkÖ¬Ñ1c4uêT}ú駤-[¶(66V;vìÐ3¤7ÞxÃõLgïÞ½0a:uê¤ &hïÞ½V\#o¨+ÀêùÏûxC]Á»Ø+**të·6¹~É%7nÞ~ûm7N/v»ýöÛ]§ÓÓÒÒtÿý÷ëÝwßÕìÙ³µtéRÃön¾ùfmݺU>ø /_.IzøáµmÛ6
+4H
4h¶nÝêz¶SYY©®]»Jn¼ñF]¸pÁ}u¼¡® o¨Sæ?ïã
+uïbkPìÑ£þñ4¹¾¼¼\cÇU.]4fÌ»Ö9R~~µÃÿì³Ï´xñbÝwß}Z¸p¡N8aØÞÏ~ö3uîÜYcÇuµ«x@ûöíSll¬öíÛ§ñãÇkë֤믿^çÎ$?^×_½)ûëxC]ÞP§ÌÞÇê
+ÞÅÖ 8~üx-Y²Deeeºråþõ¯iÉ%®õAAAúóÿ¬K.é½÷Þkð,Éßßßuû¶ÛnÓôÞ{ï©°°PýÕµµcÇW[
0a^|ñEeffjܸq*,,Ôøñã%IÖ믿®Ë/ëõ×_× A¬807Ôà
+uÊüç}¼¡®à]:ØÙùÄåïï¯ç^_|ñ
zöì©)S¦¸Ö'''kéÒ¥Z±b
n½õÖ×YÔ÷ë_ÿZééézñÅuùòeI2<ÅýùçküøñêÑ£yæ×òÒÒR=öØc:xð`£g̳fÍÒóÏ?¯ÿüçºýöÛõßüÆ]
¼¡®ê_«SweÚo¨Sæ?ïã
+uÅüç].t¦¦¦^u£´?8#÷ IDAT´47YPuVZ¥þó9s¦c4Ell,
èa²³³åïïO]ÁT-©+???1ÿÁ̰ó¸
+ Cí&(ò¬V ®à
+¨SXºjÚMP @Ë ` CE "( ÀA lùfÃëÀvtm/¿üRW®\Q¯^½ìJ¹óÎ;5`À6íºò}vÔÙ¨SßÇüg=êªíØ8 O>ùDÑÑÑvtßæòóóÕ³gO
Û=6Q\\¬ªªª6/hêÊ·ÙUWf£N}ó_Û ®ÚmßõÓìWÇø?þXl7û¦ÚÒ7uå»ì¬+³Q§¾ù¯mPWmk ` CE "( ÀA 0DP !" ` CE ò èp8äp8äïﯰ°0mÛ¶Á:£í[cúôé:pà¾ùæ
+6̵|óæÍ
+W§N¡üüüVµï.»÷·®ÿï·{òäI
+>\;wÖðáÃuòäÉVõë)ì>Î555Z´húôé#??¿V·ï.»÷·©ºª³hÑ"Ë7²ûqËÉÉQß¾}Ûýü×\ýzO:ÎCÝ»woUûîò¤ý5'×WEIr:ºté-[¦3fXÒGMMüüüô·¿ýMCq-ß¼y³rrrTYY©Ù³g+!!Áþë³sN§Ng£íçÿÿíÝMHTkÇñßè§lÄËU`Mn!Ñ¥½,ZÔ¢ZFPá76)ºl)dAô²
+FI®Z½@H1
+¬¹Ëíf±£·ù~V"Çó<¿çü{ú{æÌø÷ߪ¬¬Ôôô´*++uöìY[æå$7×ùòå˺{÷®z{{õíÛ7Ã5·ëJ={¦k×®Ù2Tàæu{ðàz{{5==sçÎéàÁ¶ÿ3/ÖéBõ¬¼°Îñx\CCC:~ü¸-ãÿÌyÍËËõ4â233ü³>OMMMÊÎÎÖ¦M422"IF£òù|êééQYYªªªÔÑÑñ£»¿wïJKKå÷ûU[[«ììlK²áFÞDúúúDä÷ûDôðáÃ%ÏÍkÜXç®®.µ··«´´Ôñß$½TW³³³ª¯¯×[·<§táÆu»yó¦6nܨeffjýúõd1ÃKuÊÜ^çK.éÄKÃb¹÷W¹¹¹ÊÉÉÑîÝ»õîÝ»%ÏÍ.IÓ(ú|>eee©±±QK>Ï
+4>>®S§N©¡¡AD499©p8¬x<®p8¬ßºû>hÿþýêèèXV3¼÷WZ³f$)??_>}Zò¼¼ÂÍu~ÿþ½úúú´råJÏ{)Ä.^¬«¦¦&ÕÕÕiÇKOªsûºù|>ùý~544,k|³ÜÎ.¼°Î?V^^
+Å/äýU<×ôô´^¿~Í7;òåbýåöÌJ´ØYYYÅbÊÉÉ$Åb1ùýþç©««Ó+täÈ9sFÒügþû:??_W®\ÑÉ'%IO>ÕtñâEíÝ»×Lq;¯@ ññq]»V
+Îå5n®s PMMZZZÔ××§ºº:í۷Ϫh¼XWÇãóÎÿi/ÄíëÇ533£û÷ïëðáÃzõê%¹q;oºðÂ:?^mmmËÎbò&RPP .(77×t§$ÍÅD¶oß®ææfÅb1Åb1577«²²2áñ7nÜÐÌÌzzzTRR"éßâ9}ú´úûû5::ª£G*ÿ¸¸]]]Ú³g:;;uèÐ!Gr%âDÞDjjjF5;;«h4ªp8li6/qbkkk%ý¿©¸ùÒuõýû÷yÏçÐ$çÄuD"$eddèË/öKÀÍ:M'Nóàà æææ´uëVÛ3-Äu555¥ææfAK2Y)éÅîîn=þ\*((Ðè診»»ÿöí[åçç+ª««ëÇ÷TQQ¡ÉÉIåååÍûcÇéãÇÚ¹sçw&Åb1Û2-ļ?¿ûêç¯ÛÚÚ400 U«VippPííí6$ô'Ö¹½½]mmmÊÉÉQcc£®_¿n[?q³®°tN\·²²2A^½ZºsçmyþÄÍ:M§úub¥ï&F"[2,ꪰ°PO<ñä³ÚIñÒóBwÕÛÛkú\---jiiùíûÃÃäp8üÛ2§ïpx5oQQLíun¯óºuëÔßßozår;¯GÜMüÛ×¾¾^õõõ¦ÇX.·ó.ôÎÔTâö:KÒ£GL±\nçMæºJú; °GZ5Éй[)Ýòº%ÝÖ9Ýò¦t»né×-é¶ÎéWJ³F æÑ( À" Ñ( À" Ñ( Àk¸=<<¬ÖÖV·wÔ7oôõë×´É;00àÚߦ®Rue5ê4u±ÿ9ºr+bIIb±ÆÆÆÜÞqEEEK¼@@[¶lq|\ê*µ¹UWV£NSû3¨+ç¸Ò(AOþák$7ê
+É:
¨+Ø
g `F h `F h `F h `ÈòÏQ|ùò¥nß¾mõiÆÆÆT^^nêXê
+f-¦®¬FÂ,ö?ØÁýÏÒF1êóçÏV)¬¼¼\Û¶mûãqÔÃl]Y:Åb°ÿÁvì6¡PH¡PÈÊSÔu
+;PWpÏ( À" Ñ( À" Ñ( À" Ñ( ÀéÏQ|ñâ
®^½jç\ À1###ª¨¨0u,ûT²ýÏT£
+
455µ¬IB!UUU:ý@*1»ÿI&ÅêêjUWW/gN Øÿ ¤3Q !E ¢Q !E ¢Q !E ¢Q !_uuu|×®]nÏ Òß߯ -:Ãà b
IEND®B`
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/emmett.png
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/emmett.png 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/emmett.png 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,62 +1,66 @@
PNG
-IHDR ^ ® عn bKGD ÿ ÿ ÿ ½§ IDATxíÝTõÂ?ð÷. æC)×ÌRÂ@SD0=làGËÒt¡¨ZW44ó>¦ÏåË
cjihe7õ¥^J¬PyäÞ¼! ×Ôùþá
-ÅýÌ¢ï×9ÙÏ|æÍøfvMçëë+ùûû¬¯¤¤wÄÅÅi="¢;B||<ôZOèNÃâ%"ÅKD$H0/`,^""ÁX¼DD±xcñ Æâ%"ì¶(ÞææfFMöm4ÑÜܬɾ¨gêVñ~úé§3fìíí1bÄ|ðÁ·´SNwKÏëLNN&L`6~ëÇï÷ÛѺÄÅÅ᡽½=yä¼÷Þ{í§×ë1tèPìØ±C^7~üxäää¨z<Dt{ëVñbåÊhllD~~>òóó5¯nÉÊÊÁ`?$ $u¸m뺶ëããã±oß>äååáßÿþ7öîݶ{^ss3233±dÉy¹Á`@VVºDD·µnïpþüy;v÷ÝwvîÜ 8|ø0F
7JêáÆ÷ß7ß|lw¥Ùöñwß}I&ÉWÒ_~ù¥¼Mll,0hÐ dggcíÚµèß¿? _yÁÝÝÝ¢cèÛ·/ñäO¢ºº wß}£GF¯^½àîîíÛ·w:Æ AäÇîîîøê«¯º#ÝáºU¼yyyøßÿý_DFFâ_O4 #GÄ={ _|ñF#G"11qqq¸|ù²ÙfÛÇ/¾ø"/^K.!99.÷Ù¯_?üë_ÿÂ{ï½çÎÎÎ8wî>øà¼öÚk ºº:8::v9IÐÐЪª*5
-!!! ýë_psspóÛvvv5k6nÜ(/wttÄÏ?ÿÜèN·jÕ*éV|ûí·³³³üù?ü M0A$I
-$I¤;wJ¾¾¾Rß¾}¥5kÖHÒ¶5ë®»î È:NÞîúõëòv}.Iô?üAª¯¯o7Çßï§Ë/K½zõ$I|ðA©²²²Óç¶>nii¥áÃËë.^¼(
-4¨Óýµ'uûï©S§põêU8qׯ_×¹»»ÃÛÛ¹¹¹8}ú4üq À³Ï>#G ¸¸III ^½záÿþïÿäçzzzbÛ¶mø÷¿ÿ
-Iä[ ×Oñ÷ÀÄQYYiñqÔ××ãÏþ3<== .ÄË/¿S§Náúõë8}úôM_SS#?>uê¼½½-Þ7Ñ]ÝÙø'ÀO>ªª*¸ºº"##Ãlýºuë0zôh³â/Ù±zõj ÀâÅ1|øpüòË/$ |ð^yå¼üò˸rå
- túñÃd2ÉØö6AëcIäǽ{÷Æc=&ߣþïÿþo¬_¿?þ8.\¸ ww÷v¿±ÑúÜÁ#55U^^\\,ß² "²nÕªUZÿëImÛ¶¡W¯^ªi_ý¡¡¡ÈÎζÏVF£;wîÄ]wuë{Ý¡âãã»wÅ{3:}úôÁ®]».pãÖ
¥@³ýQÏ¥ZñvçÖ Ñì¶øa"¢ÅKD$H0/`,^""ÁX¼DDYôëd%%%0LÖQæëëÿ.·³¨xÅ#"º?~õõõê/ øøø ::ZÑÄnWiiioË{¼DD±xcñ Æâ%"ÅKD$H0/`,^""ÁX¼DD±x³éâuuuÕz
-DDª³JñL&Ì9îîîÄ'|bÝ鬤cbbðÝwß¡¹¹sçÎ?óæÍÃ#0oÞ<?Þês$"¬T¼+V¬@xx8¾ýö[dff¢¨¨È»±$IÐëõ8vìÆ+/··7¾ùæx{{#..N³9ÑÅ*ÅÛ¯_?ÔÔÔ ¢¢Drr²¼îÄ5kÜÜÜ0kÖ,TTT ***0{öl¸¹¹µ»zýòË/1qâDäääàôéÓxægä«é£GÊÛ»ººÊ333áêêÝ»wcæÌƶmÛäõ_|ñÂÂÂààà°°0|ñÅÖ¨«ï-[ðã?býúõðóóÃ~(¯ÑhDyy9F#¢¢¢äåsæÌAEEªªªäí?úè#¬]»[·nÅüùó±råJàÄX³f
-bbbäí«ªªäÇaaa8~ü8&Mªª*L4 G×744 ÿþ '''466Z#
-"¢v,~?Þîxè¡ðÖ[o *++9sæ N>
-£ÑÞ½{cÞ¼y :u
-ÁÁÁ°··7+&&7oWÆQQQraëtºçÐöª¹õñøñã±nÝ:¼ðÂèÛ·/êêêàìì/âÞ{ïU1"¢ÎYåwùòå8{ö,®]»~ø---òºáÃcÏ=øå_777 »»;víÚ
k×®¨¨(8p 0jÔ($%%ÉWÆgÎ Üu×]øé§äçUUU!,,YYYÈËËÑhDUU^xá Àc=ÌÌL\½zxì±Ç¬Q;V)Þ ,\¸HNN6ûÁUBBÞÿ}3»víBbb¢¼<77<òÙÕª¿¿?¶oß7ß|[·nÅ_ÿúW|ôÑGðòò2»§ûì³ÏÂ`0=÷رcðòòBCCúõëg6Ç×_eeexôÑGQVVÕ«W[#
-"¢vt«Vºú~||<ª««ù¿þ!"êDZZôz}¿!oÛ@ADt;bñ Æâ%"ÅKD$H0/`,^""ÁX¼DD©ú^
-ÇGii©C ÆnÃó¬Åó¯;T-ÞÒÒR:tþþþjKw¸466vyâóü#k°ôüëÕßÌ`0ðMÅIU²n ¤¶îâ=^""ÁX¼DD±xcñ Æâ%"ÅKD$H0/`,^""ÁX¼DDõ¨âmnnÑhÔz]2hnnÖz¤2¤MW§Óu¸<77°··§§'
- 9990aB»í×[g6Ö¹sç0yòd888`òäÉ8wî `ÿþýpsspá @KKÖ[!C@¯×Ëcµ³¢¢nnnxçwäu:z½CÅ;ämÇ%Ñ <ÿH+6yÅììl466"""!!! ¬¬,³m¿þúklÞ¼ÙlÙÊ+1eÊ444`Ê) ,X° ÉÉÉhllÄk¯½&/Cvv68ëׯC$³ñ-[¶àW^KææfdffbÉ%òrÁ¬¬,Õò ±xþµ©þîdjhûÝzÚ´i ÁÝÝ]^wåÊ
açÎâÄèÝ»7"##1zôh 7®,ß®$>ýôS @FF6mÚ$o×ÖöíÛ¸¸¸t:çAÉÝÝÝñÕW_u÷°ÉFðü#k³É+ÞVçÏÇܹs ¨««£££¼~ÕªUX°`üq³çÕÕÕaàÀ ggg\¼x ?þñèׯ
+IHDR ® ¡¾ bKGD ÿ ÿ ÿ ½§ IDATxíÝ}TTuâ?ð÷
+XTb¨«j"éaÑÔµ0Öê¡[b¡+º[ºêÆX8~qQË1Íç@Ïæ)FíúM÷X
+ùÜßÄ]>2À{gàý:ã̽Ͻ÷Í÷ܹ3ÎÓÓSòööQaa!zDGGk½-DDdbbb ×z#ȼ°HÀb "",""°HÀb "",""°H i1ètºvMoºº:tz@]]&ë&"ê¬vN§Cff¦0mãÆü"oJ¤N±cÇÊ÷u:üÕT}}=Ö¬YAA¯×Ëóëëë'xÖÖÖ>|8>üðÃfãéõz<;vìç3¦YNDD¢Ýgò/î»wïâ£>R|£Á ß$©ÅÂFFF9{÷îÉËÄÄÄ`ÿþýØ·o~úé'ìÝ»G¾W$ÔÕÕ!--
+K,§¤§§fÇL¬ÝÅàîîO?ý ðñÇcúôéÍi|4ýØcaß¾} S§NÁÝÝ=zôµ¯[·½{÷ü¼q¾N§kqþ·ß~ &ÀÚÚCÅ_|ÑláââÒæþ¤¦¦bÃ
+1b°])))øÛßþ#F gÏpqqÁöíÛ[§ÿþòm|ùåm®È,EEEIÆ ;wN7nT__/5Júî»ï$ ͽwï/=ñÄ$IÒÈ#¥éÖ[ÂxIIIÒÍ7¥CI}ûö§ßo¾´mÛ6éÖ[ÒÁ¥¡C6[=¤ººº÷¡)+++),,LêÕ«4dÈiÏ=;üÕtƯ={J~ú©<ïîÝ»R=HȼDGGKí.I$éÍ7ßæÍ'L$IJHHüqI¯×K $N'IRÃ/Ú~ú©Ùx÷îÝk6~Ó[ߣGásã:êׯtýúõV÷¡´ÿ~éÖ[ÒþýûåòyüñÇ¥³g϶ú½·ëëë¥üü|éÉ'ç]»vMêß¿³u»èèh©C¯JZ¾|9þïÿþo½õVKg øÛßþÚÚZ|úé§òsö®®®HMMÅíÛ·
åõúûoBKóÝÜܰmÛ6üôÓO$ õõõÍ7nÎ=Ûæ¾øùù¾
â÷¿ÿ=ÊËËqïÞ=;wî¾ãTVVÊ·ËËËáááÑæºÌQaÒ¤I$ Ï>ûl³y;w.yzZZÒÒÒЫ
W¯N¿éïÿ;>úè#<úè£-¾Ò QPP ßoº\ÓÛ6l@||<ìììðöÛocëÖ ?ýéO8q"{î9ØÚÚâÅ_Äßÿþwa¯J
-äå?þø#
-ѧO¸¸¸`ïÞ½òXK.ÅÊ+;<éu:ììì0kÖ,lܸQ^îèèþYH3<ÿÈZl¶xËÊÊàççÈÈH<õÔS þýû£©©IÞ&%%+V¬hwOÌÉÉ 555 ÚÚZ899 æÌêêj\¾|Ó§OÇ< o?uêT\¼x6mBxx¸¼"22²Ãn$¡¥¥X¾|¹¼¼©© P3çYMoFFfÏôôtÊË'NÊÊJùóH$ßkýïÔ©S+W® 99òs$IÂÉ'
Ÿñr@?ÔðööÆÁôôôNçÜú
- N:ooï[>~ÒÏ?²6Íïñþþ'Ë$aÑ¢E 3fÈË/]ºàà`L¦.Oª¤¤$FÜ{ï½ðööFvv¶Ù¾Å#:: °aÃ<ûì³xúé§1tèPlݺÕl<L&L6
-õõõi7^jjª¼}qq±ü²m<ÿHïïzÛÕòùóç]tö|¶xÜûï¿ÅÅÅ7ÝÞÕÕgÎér,àÆOºÛ¾ô#ÛÄó´¢ùowôêÕK¾z°e=aÔ}<ÿH-6yèvÆâ%"ÅKD$H0/`,^""ÁX¼DD©þ{¼%%%HHHP{XºL¦¾3W[<ÿHmÝ9ÿ,¥jñzzz¢±±gÏUsXºÃ¹¸¸ÀÇǧËíxþ5XzþuªÅëëë___5$²Ï?ê)xH0/`,^""ÁX¼DD±xcñ Æâ%"LÕßã=~ü8JKKÕò¶1nܸ. ùuù)Ãü±$¿îPõ·´´N§ãGÒÒRL&æÇü_ü°4¿îPý½âââÔ¶GGuuµEÛ2¿ö2ÌOîäg)Þã%"ÅKD$H0/`,^""ÁX¼DD±xcñ Æâ%"ÅKD$X*ÞææfFáû5hnn¾_µ1?e2Ìï7¯N§ëtyëG[9990aüyvv6F {{{xzz¢°° vËÛWQQ777¼óÎ;fûÔëõ:t(vìØ!o;~üxäää¨sÐ*b~Ê0?eß³É+^I IR»åYYY0òçùùù8pà °zõj¸ñ
ËÎÎFcc#"""b6NQQ°e˼òÊ+fûmnnFff&,Y"/7ÈÊÊRù(ù)Ãüa~]SýÝɬ©¬¬îîîòçï½÷ àêÕ«°³³Ã!C Àì»Û´iÓ+¾}ûv¤¦¦¢ ...îkÐ Aòcwww|õÕWjf2ÌOæ÷U¼uuuptt4[ÖúòÃÉÉ û÷ï7[wþüyÌ;)))ò²¥KbóæÍ~ÑZÇêÕ«öìÙ#/wttÄÏ?ÿ¬Öahù)Ãüa~¿±É[
-éß¿?ÌIË/#--
-Ï?ÿ¼¼¼¬¬~~~ÄSO=%/?xð "##;|é!IZZZPPPåËËË0`À +XÌOæ§óûM*Þ'¢²²Rþ<22555 ½^K. 2220{öl¤§§#44Ôlooo<xÑÑÑHOOït_ãÀ©S§àííæ¡hù)Ãüa~¿ÑüVÃïò)IÙ²ÖÇ$!88&IqÌ1ðôôDmm-Æ]»v -Z 1c<Në <<<`20mÚ4Ô××#&&Æl_Fjjª¼}qqq»ü¶ù)Ãüa~·FÓâíè'7[>þ|³ïaaa»¥q]]]qæÌ. _ýµÙK[Áüa~Ê0¿[§ùowôêÕÙÙÙÂ÷«Å>ù)Ãüa~¿éQ÷xn,^""ÁX¼DD±xcñ Æâ%"ÅKD$ê¿Ç[RRµíÑL&ÓMßI©-æ×óSù)Óü,¥jñzzz¢±±gÏUsØÏÅÅ>>>]nÇü:Æüa~ÊX_w¨Z¼¾¾¾ðõõUsÈ;
-óSù)ÃüÄá=^""ÁX¼DD±xcñ Æâ%"ÅKD$H0U÷øñã(--UsH7nÜ8Õ~¹ù)Ãüa~â¨Z¼¥¥¥Ø·oÆ«æ°6ëäÉhllTíÇüa~Ê0?qT¯±cÇ"<<\íamRVVêc2?e2ÌOÞã%"ÅKD$H0/`,^""ÁX¼DD±xcñ Æâ%"ÅKD$H0MW$ìÙ³/¼ð¦OÐÐP|ú駪ï')) gÎAss3"""äåµµµX¶l¦OeË¡¶¶Võ}[ÖùÈ=ÖùL&,X° Ó§OGxx8=ªú¾Iëü>ÿüs¼øâ=2?M777X³f
-öïßÄÄD|óÍ7ªïG$èt:<y#G§¥¥áÑGž}ûðè£"--Mõ}[Öù¡¨¨Hõý¢u~ÅÅÅxã7°oß>!66Võ}[Öù 11yyyxî¹çðÖ[o©¾okQýÝɺãã?Fll,\]] ÷ß?¢££åõHLLDuu5
-¸¹¹! O?ý4òòòðÙg¡ººIII¨¬¬Ä}÷Ýèèh={öìÁ¦M Àì;ñ~¢¢"=z°··Ç3Ï<°°0±(¤u~=Öù]»V^6aÂìØ±CЫCëü^ýu À¯¿þ
-½^gggG¯¦W¼5556lX§ëñÄO //O<ñäu#F¿ñññ={6òóó¤¤$ Àܹs±wï^xyy¡¨¨^^^øøãåÒhllD¿~ý }ûöÅ¥K¬u¨V¡u~=äWWWµk×béÒ¥V8Jë±
ü0cÆlܸ+V¬°ÒªOÓ+Þâÿøzè¡×WWWcÖ¬YpppÀÌ3ñöÛoËë¡×ßø¾qúôi$$$È_XN f÷[aÙ²e
+BRR<=??AAAÚG""袢¢¤®ø§=ïÞ½ùóç###Cõuàã?F=T_7QgÄÄÄ ËþæêÙ³§&¥ @³õ)ADD XDD$`1Å@DD XDD$0ê}
»ÈòxzzÂÛÛ»Íå*üü|dffbüøñÞ0""Rß©S§pýúuå ÆNmi#99Ùèey,""°HÀb "",""°HÀb "",""u1899i½ DDÝI¡ Ó¦M|}}ñé§b5ÎHdd$¾ýö[ÔÕÕaöìÙòô+W®`îܹ:t(æÎ+W®(±©DDfÍ$Ű|ùrào¾AZZòòòL±ÅH½^5J
+|ýõ×ððð@tt´[ID¤CïÞ½QYY²²2ôíÛ ò¼Ó§OcúôépvvÆôéÓQVV (++ÃÌ3áììÜìÑÿ_|qãÆ!33çÎÃ9sä³'OÊË;99µxæàä丸8¸ººÂÇÇ_}õ --
+NNNصk¦MÀÀ@lÛ¶Mãÿøaccàà`üãÿ0E\DDfÅ$ŰeË\ºt k×®
vïÞ-ÏG@@ JKKððpyúK/½²²2\¸pA^þO>ÁêÕ«±uëVÌ7+V¬@PPN>wÞyòò.\¾·©âÄxíµ×°råJ @pp0N:
&àÂ
0aN<)Q]]>}ú ìííQSS£|XDDfÆ$ÅðÄO`ݺuسg²²²ð¿üEwîÜ9àÀܹsQ^^ (//G`` ¬
±"##ñ§?ý ®®® Î,ÂÃÃ1lØ0ãÿý¿ÿgÔ6Í3½zõ¼yópîÜ9
+g£GÆñãÇáääãÇcÌ1øðà <òªªª ×®]ÃÃ?ܹ`,IaÙ²e¸xñ"îܹÿûߨ¯¯ç=ùäÈÎÎÆÏ?ÿ¬¬,8;; \\\°sçNܹsG+55ááá8rä àé§F||¼|fqþüy @=ðÃ?´ºMÙÙÙ¸uë²³³ñÔSOh8ÃFzz:öíÛ \¸p¯¾ú* à
ÙgEZZnß¾´´4<ûì³Ê
DDd¦LR>>>X¸p!\]] \´ÅG}#GbçΧgeeaøðáÂuooolß¾þó±uëVüõ¯Å'|wwwáÂË/¿ÁÐê«._¾1cÆ --Mظ»»£ºº½{÷¾gåÊ(..Æ3Ï<ââb¬ZµJ±Ì.**JjëÕ6111¨¨¨°Ø?íéääÔêµ"¢î 99z½¾ÍWWÆÄÄ÷ÜH}Ý¢x¶@Dd¼nQDDd< XDD$`1Å@DD z(9Ø©S§PTT¤äD&1zôh?þ¾Ëðx&KaÌñÜCQQ;ooo%%RTaa!jjjÚüÄã,±Çs{(Z `0ømȬ5~Ä1x<¹kÏñl,^c "",""°HÀb "",""°HÀb ""[uuuÐz3Úºº:7Ìg2'N§kqzVV\]]amm
+777äææ6[&33cÇm6}Í5¸/_ÆÄacc'âòåË ÂÙÙ666ðññÁ÷ß ¨¯¯Ç5k0hÐ èõzy¬¦cÁÙÙ|ð<O§ÓA¯×cðàÁرc¼ì1cÙÞhÈñx¦®Â,ϲ²²"((¨Ù2ééé0´'N`óæÍ´+V`Ò¤I¨®®Æ¤I X°`PSS?üáòôèèhdddàÈ#¸wï$IÆËËË¿¿?¶lÙ7ÞxC.Iêêê%KÈÓ
+ÒÓÓ;Y6ÏdiÿtU%4}Dâççõë×7[¦¸¸...òý[·n!88ü1|||äé¹¹¹8}ú4lmm#F hx$üïÓáà ©©©Ø´i¼\SÛ·oGRRrrràèèØêö÷ïß_¾íââ/¿üÒݦ.Ç3Y³<chtåÊÌ=ÍæUUUÁÎÎN¾
à¹çk¶\ß¾} ¸ví %%o¾ù&z÷îyú¥Kx Ø»w¯<ÖÒ¥K±bÅÿét:XYYaúô騏q£<ÝÎÎ?þøcÇC .Ç3Y
+³-ââbxyy!,,/¼ðB³ù}úôAmm|?11Ë/oöª½½=*++ W¯^
½½= à¥^BEEnÞ¼)S¦à±Ç<y2®]»M6!$$D^ÇÑ£GÖâ©´$I¨¯¯GNN-[&O¯Å£>ÚÙ8ÈÂñx&KbÅ3g"%%óçÏoqqãÆáìÙ³òýúúzH$?ÚøïäÉ[·n!!!¾¾¾ò÷H3gÎ <</Ðpª Åt8zô("""Òêö7þÇòòrxxx´kÿ©káñLFók¿~%$IX´h `êÔ©òô7n§Ú(((hó G@@ ~øaxxx ##CXï°xñbDDD 6lØ_~³fÍÂàÁ±uëVa<WWWÀÏÏׯ_Gddd³ñäåóóó[¼ØH]gê
+4-_¿B¢éMÍ7¯ÕG_M¿ÿñÇÇñãÇ^ÇÀßåpþüy£¶÷Ä©8u]<©«Ðü¡£zöì)?Z2g°¤=ÏdNÌòiÅ@DD XDD$`1Å@DD Caa!bccH1÷ý4Ѧx<¹kÏñl,EÁÍÍ
+555¸xñ¢Ã)ÊÑÑãÇos9Ïd =ÛCÑbðôô§§§CiÇ3uW¼Æ@DD XDD$`1Å@DD XDD$Pô}§NBQQCv;£GnóÍ*̹ó³:³:ɹ=-¢¢";vÞÞÞJÛm¢¦¦¦Í0sîæ¬æ¬csnÅ?+É`0 ::Zéa»
TTTµ,sî8æ¬æ¬öäl,^c "",""°HÀb "",""°HÀb ""[uuuP}½¨««S}½ZaÎê`Îê`ÎÆÑ´t:]«Ó¿Z±cÇÊ÷3220lØ0X[[ÃÍÍ
+¹¹¹ ¬¬,¸ºº6Þtì²²28;;ã>Ö¯×ë1xð`ìØ±C^vÌ1ÈÌÌìøNk9«9«9Y1HIî»Lzz:|ÿÀ8r䪫«±jÕ*høgdd ¦¦¡¡¡
-Â=÷Üúúz899¡¡¡÷ÜsUÓZ´Î¯§³
ü¾ÿþ{¬_¿,À¤IÔ?H+²
üpõêU9rqqqxÿý÷Õ?P+дx+VÀÕÕ.\À;ä+CÅg}éÓ§ãoûÙwW;;;ùñÃ? 888ÈËðöÛoã±ÇC>}ðÉ'àµ×^×?»wïÆ/¾Ý»wÃËËKÀQ«Gëüz:óËÏÏÇ»ï¾Õ«Wc X]Zç·iÓ&<÷Üs¸ûÓépùòeGMwÞ¼y°³³ÃúõëqáÂ4¡¡¡òú¨¨($%%!%%Ã
-3»ÔÖþô'$''ã/ù®]» òË
-,Z´ß|óM»+ÚÅcýúõxòÉ'1bļñÆV:RëÐ:¿®HzÒmóÛ¸q# »ï¾[Õã´ósuuExx80|øp¬Y³ÆJGª>ݪU«¤¸¸¸nêêêNkþówÔÿ:ÄÎήË\,Åüa~Ê0?eÒÒÒ ×ëaIò(cñ Æâ%"ÅKD$H0/`,^""ÁX¼DDiòk'ODyy¹»¶Ø¨Q£0vìX§Ñ!æ§óSù)§IñãÛo¿
¿¿¿»ïRII löÇüa~Ê0?å4{¯ÁÐåÖi%>>Þ*oè¬&æ§óSù)Ã{¼DD±xcñ Æâ%"ÅKD$H0/`,^""ÁX¼DD±xcñ Ö#W§ÓA§ÓÁÎÎîîîØ»wo»m.\òòrüúë¯ðóó;w'O&OsçκMP_«uëÖA§Ó®ÍQ_nn.<<<`ooOOOºMP_KKÖ[!C@¯×ß6ç`(^ $ W¯^Å
-ðÒK/µ[ßÒÒ½^#G`âÄòò+WbÊ)hhhÀ)S%rÚ6ãVó¯¿þ7o5Ut«ùåææ";;@HHÈiÛ[Í/..ÙÙÙ8pà ®_¿IDNÛjzLñ¶²³³3û<99:Û¶mÃ1càïïù;caa!"##Ñ»woDFF¢ @iÛîæwåÊ
açÎZL׿t7¿=½{÷Æ´iÓðÿñZLÛft7¿lذ£G¾m®vT¼:xõÕW./D]]!IQ[[+g¬««ÃÀ ÎÎθxñ¢&ó×Úæ·jÕ*,X° ?þ¸VS· ·_«óçÏcîܹHII=up«ùýøã(,,D>}àââÒámH³÷ãí®Î^b´ý.ØúØÙÙ©©©jjj0hÐ ÔÖÖÂÉÉIÈ|mÍæI°bÅ
-yÛåå^wÜj~ PVV£Ñ·ÞzO=õõ'küû:u*âããQXXà¿þë¿ÌÙzÌog$IÂòåËQ\\cÇá¥^$IòI?uêT$''ãÊ+HNNF`` Æ3¶-]å×ÒÒIä8wbéÞLWùedd`öìÙHOOGhh¨Æ³µ=]å7mÚ4 ¿òír»¡Ç/ >|~~~¨««CÿþýÍÖ%%%Ád2áÞ{ïÅ¡C°aÃfi»nuífù-Z´?ýôfÌ!ÿt¿©©I£Ú¦å·aÃ$%%ÁÑѯ¾ú*¶nݪÑ,ÕÕ#n5tuURR lwEûàâðáÃV[O $¿îs»RßY[Jò»ÿþûQ\\l©i涸â%"êIX¼DD±xcñ Æâ%"ÅKD$H0/`ýEII ´ÚýML&Oæ§óSù)£Iñ>òÈ#hjjByy¹»ïÆ«õ4:Åüa~Ê0?å4)^OOOxzzj±ëÛóSù)Ãüã=^""ÁX¼DD±xcñ Æâ%"ÅKD$H0Õ÷»ï¾CVVÚÃÚ¤òòrxyy©:&óSù)ÃüÄPµx===ÑØØ¨æ6ÍËË>>>ªÇüa~Ê0?qT-^___øúúª9ä
ù)Ãüa~âð/`,^""ÁX¼DD±xcñ Æâ%"ÅKD$Å¿Çû÷¿ÿiiiÖQUZZ
-???¶µ¨x}}}Q__¯hRDD·3___øûû[´EÅk0`0Ìþ?Þã%"ÅKD$H0/`,^""ÁX¼DD±x³è÷xKJJ`2¬="¢ÍÒ?¢°¨x£ÙÿÈÖ?~õõõê/ øøø ::ZÑÄnWÝy/Þã%"ÅKD$H0/`,^""ÁX¼DD±xcñ Æâ%"ÅKD$M¯«««ÖS "RU×d2aæÌpwwG`` >ùäkìÆLg%ï¾ûÍÍÍ;w®ÙöDD"Y¥xW¬Xððp|ûí·ÈÌÌDQQ5vcI ×ëqìØ1;V^^UU
ªª*ÍæEDw.«o¿~ýPSS
-8ÉÉÉòº'N`Ö¬YpssìY³PQQ ¨¨¨ÀìÙ³áææÖî*ôË/¿ÄÄÓ§Oãg¯¦=*oßö
-633®®®Ø½{7fÎàà`lÛ¶W¸D¤9«ï-[ðã?býúõðóóÃ~(¯ÑhDyy9F#¢¢¢äåsæÌAEE
ÙèG}µk×bëÖ?>V®\8qkÖ¬ALL¼}۫ذ°0?~&MBUU&M£Gò*4gñûñvÇC=·Þz PYYÌ3 púôiFôîÝóæÍCll, àÔ©S½½½ÙX111ؼy3<<< ܸ2[§Óu8¶W¶ÇuëÖá
^PñhºÇ*W¼Ë/ÇÙ³gqíÚ5üðÃhii×
->{öìÁ/¿üÜÜ\¸¹¹ ÜÝݱk×.\»vÍl¬DEEáÀ Q£F!))I¾2>sæ à®»îÂO?ý$?¯ªª
-aaaÈÊÊB^^F#ªªªXºD¤9«o@@ .\$''#..N^÷ßcÆÁ®]»(/ÏÍÍÅ#<bvµêïïíÛ·ãÍ7ßÄÖ[ñ׿þ}ô¼¼¼Ìîé>ûì³0fÏ=vì¼¼¼ÐÐÐ~ýúͱ %äë IDATísùÛ
-D$nÕªURÛbìH||<ª««ù¿þ!"êDZZôz=,éSþ
-"¢ÛH0/`,^""ÁX¼DD±xcñ Æâ%"LÕ÷j8~ü8JKKÕ 0nÜ8øøøÜtd-Ý¡jñâСCð÷÷WsXºÃ ±±±ËçY¥ç_w¨þîd¡Ë?#êÖ?Y·Ï?R[wÎ?Kñ/`,^""ÁX¼DD±xcñ Æâ%"ÅKD$H0/`,^""ÁzTñ677Ãh4j=.F477k=
-RÏ?R¦Å«Óé:\ØÛÛÃÓÓ
L0¡ÝöëÖ3ëܹs<y20yòd;w °ÿ~¸¹¹ÁÁÁ¸pá ¥¥ëÖÃ!C ×ëå±ÚYQQ777¼óÎ;ò:N½^¡CbÇò¶ãÇGNNhH ¤¼âÍÍÍEvv6 @VVÙ¶_ý56oÞl¶låÊ2e
-0eÊDEE ,Xääd466âµ×^ÇÅÅ!;;Àõë×!IÙxEEE
+ÆÉËË¿¿?¶lÙ7ÞxCغº:¤¥¥aÉ%òtÁôôtöR{ÌYÌYÌY9ºªZáââ"ßÿðà ·oß
+ BKûùùaýúõòýíÛ·#)) 999pttlu]ýû÷o»¸¸àË/¿Tj7ÌsVsVs6ÅCUUìììi§yööö8xð 0ïÊ+={6åiK.ÅæÍ[üá6Õ³gOdggËÓíììðã?*µf9«9«9Ç,J2F>}P[[+L$ 7oÞDrr2^yåyzqq1¼¼¼^xA~ôèQ
µx'IêëëeËÉÓkkkñè£`ÌsVsVs6ÅøqãpöìYù~XX*++ z½7nÜ ¤¦¦bæÌHIIÁüùó
1<<<pôèQDDD %%¥Õu5 åååðððPrWÌsVsVs6æO%ýú$ Óoÿú¢R``
-Â-[ðÊ+¯ÈË%IBss3233±dÉy¹Á`@VVjyX<ÿÈÚTw25´ýn=mÚ4ÄÆÆ ÊÊÊàîî.¯»rå
-°sçNÈËqâÄ ôîÝ=z4WÀoW~ú) ##6m·kkûöíHMMEAA\\\:ó AäÇîîîøê«¯º{Ød#xþµÙäo«óçÏcîܹHII ÔÕÕÁÑÑQ^¿jÕ*,X° ?þ¸Ùóêêê0pà@ ³³3.^¼ HOOÇÿøGôë×òòü
èÓ§\\\°wï^y¬¥KbåÊô:vvv5k6nÜ(/wttÄÏ?ÿ¬N¤d-6[¼eeeðóóCdd$zê) @ÿþýÑÔÔ$o+V´»'æää @mm- sæÌAuu5._¾éÓ§ã·:u*.^¼M6!<<\ÞÇÁÙáK7IÐÒÒ,_¾\^ÞÔÔ¨ Æó¬É&7##³gÏFzz:BCCåå'NDee¥üyKK$IïµþwêÔ©HNNÆ+WÀÀ@ù9$áäÉÂâÅÜx9 Ãjx{{ãàÁFzzz§sný §N··÷-?içYæ÷xÿeI°hÑ" À3äå.]Bpp0L&S'URRF#î½÷^x{{#;;Ûl_ÆâÅ
- ذa}öY<ýôÓ:t(¶nÝj6L&¦MúúzÄÄÄ´/55UÞ¾¸¸XþÙ6¤M÷÷?½íjùüùóÍ®@:{Î>Ã[<îý÷ßââânïêê3gÎt9pã'Ým_úmâùGZÑü·;zõê%_=ز0Gê>¤¼ÇKDt;cñ Æâ%"ÅKD$H0/`,^""ÁTÿ=Þ$$$¨=,ÝÁL&ÓMß«-¤¶îRµx===ÑØØ³gϪ9,Ýá\\\àããÓåv<ÿÈ,=ÿºCÕâõõõ
¯¯¯CYçõ¼ÇKD$H0/`,^""ÁX¼DD±xcñ ¦êïñ?~¥¥¥jyÛ7n\¿Íü:Çüa~ÊX_w¨zÅ[ZZCA§Óñ£ÍGii)L&óc~̯~X_w¨þ^
-qqqjÛ£ÅÇÇ£ººÚ¢m_{ÌOæ§Lwò³ïñ Æâ%"ÅKD$H0/`,^""ÁX¼DD±xcñ Æ
â%"¬Goss3F£ðýF477߯Ú2ÌOæ÷MW§Óuº¼õ£L0Aþ<;;#G½½=<==QXX ÈÍÍ
G»åmÇ«¨¨Þyç³}êõz:;vì·?~<rrrÔ9h1?e2ÌïÖÙä¯$I$©Ýò¬¬,ùóüü|8p
-
-
-X½z5ÜøÂegg£±± 1§¨¨AAAزe^yå³ý677#33K,dee©|ÖÃüa~Ê0¿®©þîdÖTVVwwwùó÷Þ{ põêUØÙÙaÈ! `öÝmÚ´i?ß¾};RSSQPP N÷5hÐ ù±»»;¾úê+µC3ÌOæ§óûM*Þºº:8::-k}ùáääýû÷;þ<æÎyÙÒ¥K±yóæ¿hcõêÕ{öì;::âçVë04Ãüa~Ê0¿ßØäÎôïßMMMfË$IÂåËç^^^VV???DFFâ©§<x¾ô$ ---(((ÀòåËååMMM0`H,æ§óSùý¦GïÄQYY) ^¯Ç¥K ={6ÒÓÓj6··7<èèh¤§§wº¯ÖqàÔ©SðööVóP4Áüa~Ê0¿ßh~«á÷?ù$ÉlYëcIÉ$8fÌxzz¢¶¶cÆÁ®]» - Ì1C§õ
- 0L6mêëëc¶¯Á#55UÞ¾¸¸¸Ý
-~[Áüa~Ê0¿[£iñvôÏ-?¾ÙwÀ°°0
ÝÒ¸®®®8sæLϯ¿þÚì¥`~Ê0?eßÓü·;zõê
ììláûÕbÖÀüa~Ê0¿ßô¨{¼DD·/`,^""ÁX¼DD±xcñ Æâ%"Lõßã-))ABBÚÃöh&é¦ï¤Ôókù)ÃüéN~Rµx===ÑØØ³gϪ9lçââ.·c~c~Ê0?e,ͯ;T-^___øúúª9ä
ù)Ãüa~âð/`,^""ÁX¼DD±xcñ Æâ%"ÅKD$ª¿Ç{üøqª9¤Í7nj¿\Íüa~Ê0?qT-ÞÒÒRìÛ·cÇUsXuòäI466ªö
c~Ê0?e8ª¿WÃØ±c®ö°6)++Kõ12ÌOæ'ïñ Æâ%"ÅKD$H0/`,^""ÁX¼DD±xcñ Æâ%"ÅKD$¦Å+IöìÙ^xÓ§OGhh(>ýôSÕ÷3gÎ ¹¹òòÚÚZ,[¶Ó§ODzeËP[[«ú¾IëüäHëüL&,XéÓ§#<<GU}ßÖ¤u~þ9^|ñŦŬY³û÷ïGbb"¾ùæÕ÷#It:N<#GÊËÓÒÒðè£bß¾}xôÑG¦ú¾IëüPTT¤úþDÑ:¿ââb¼ñÆØ·o«ú¾IëüJJJ¼¼<<÷Üsxë·Tß·µ¨þîdÝññÇ#66®®® ûï¿ÑÑÑòúÊÊJ$&&¢ººÃ
-CLLÜÜܧ~yyyøì³ÏP]]¤¤$TVVâ¾ûîCtt4F={ö`Ó¦M `öøÃ?DQQ=ÌÌLØÛÛãgAXXØ Ò:¿NëüÖ®]+/0avìØ!èÈÕ¡u~¯¿þ: à×_
^¯³³³À£WFÓ+Þ6¬Óõxâ''x òº#FÈ_øøxÌ=ùùù@RR `îܹػw/¼¼¼PTT///|üñÇri466¢_¿~ ¾}ûâÒ¥KÖ:T«Ð:¿ÎVò«««ÃÚµk±téR+¥õØB~1c6n
Ü+VXéHÕ§éïÀñü=ôPë«««1kÖ,888`æÌxûí·åuÐëo|ß8}ú4ä/¬N§ ³{°lÙ2á{îA}}=ÐÐÐ{î¹Ç*Çi-Zç×ÓÙB~ßÿ=Ö¯_`Ò¤Iê¤ÙB~EEE¸zõ*9¸¸8¼ÿþûê¨hZ¼AAAHLLÄ+àêê.`ÇòË¡Câ³Ï>ÃôéÓñ·¿ýÍ컫üøáFPPäåEEExûí·ñØc¡O>øäOðÚk¯ÉëÇÝ»wãÅ_ÄîÝ»áåå%à¨Õ£u~=ÖùåççãÝwßÅêÕ«1aÂG¬.óÛ´i{î9Ü}÷ÝÐét¸|ù²£V¦Å;oÞ<ØÙÙaýúõ¸pá
-ÐÐPy}TTaÃÝ?jëOúñ¿ü×®] ùåHEE-Zo¾ù¦Ýíâű~ýz<ùä1bÞxã
-+©uh_GW$=é6Öùmܸ ÌÆÍÏÏÇÝwßêqZÖù¹ºº"<<
-
-
->|8Ö¬Yc¥#UnÕªUR\\ÜM7Guuu§ÁµJKKÃ?ÿùÏ;êbgg×e.b~Ê0?e2iiiÐëõ°¤OùDD±xcñ Æâ%"ÅKD$H0/`,^""Á4ù˵'O¢¼¼\][lÔ¨Q;v¬ÖÓèóSù)ÃüÓ¤xËËËñí·ßÂßß_Ýw©¤¤MMM6û
c~Ê0?er½WÁ`èòOë´o7tVóSù)Ãüá=^""ÁX¼DD±xcñ Æâ%"ÅKD$H0/`,^""ÁX¼DD±xëÅ«Óé Óé`ggwwwìÝ»·Ý6.Dyy9~ýõWøùùµ{®N§9e¢V~wjJòËÎÎÆÈ#aooOOOºMPóüsvv9u«éÅ $áêիذa^zé¥vë[ZZ ×ëqäÈL8Ñìy$ªMºÕüZ{§çx«ùåççãÀhhhÀêÕ«,rÚ6Cé¿_Ipøða¼üòË"§m5=¦x[ÙÙÙ}NmÛ¶aÌ1ð÷÷GJJÊ{uÖ[ɯoß¾pttÄO>êêjÑS¶)ÝÍï½÷Þðaà ×ëagg!C
h1m¡äßïÿüÏÿ`É%¢¦jU=¦xu:ðꫯ"==]^ºº:B$¢¶¶ö¾:ëÈæ'IPUU
Q£F!$$D«CÐóO§Ó¡wïÞ7{îDé¿ß/¿üýû÷ÇàÁEOÝ*4{?Þîê¬HÛ~gl}ìììÔÔTDDD[O 4¿?üáxóÍ7Ñ·o_ëNÔF)ÉO$üòË/ÈËËÃóÏ?S§NYÂ6Féù·víZ$%%Ywõ+ÞÎHåË£¸¸ÇÃK/½IXº²4¿úúzüùϧ§§F3µM]å ^¯Ç¥K´®Í±äü;tè1nÜ8
-gª®_¼ pøðaøùù¡®®ýû÷7[×ö§ñwòOæoÆü#G`çÎÍÒvÝ,¿1cÆÀÓÓýúõCBBvíÚ¥Ñ,m×Íòn\íFFFj03ëé·ºº_[RR D```·{'`~Ê(É/,,aaaV[O $? øüóÏ2/-ÝW¼DD= H0/`,^""ÁX¼DD±xcñ Æâ%"L³? ())ABBV»¿)É'''§qSÌOæ§óSFâ}äGÐÔÔòòr-vß%''';Vëitù)Ãüa~ÊiR¼|³2ÌOæ§ïñ Æâ%"ÅKD$H0/`,^""ÁX¼DD©þ{¼ß}÷²²²ÔÖ&ÃËËKÕ12ÌOæ'ªÅëé鯯F5´i^^^ðññQm<æ§óSù£jñúúúÂ××WÍ!ï(ÌOæ§ó÷xcñ Æâ%"ÅKD$H0/`,^""Á,þ=Þ¿ÿýïHKK³æ\z¬ÒÒRøùùY´EÅëëëúúzE""ºùúúÂßßߢm-*^Á Á dNDDôÿñ/`,^""ÁX¼DD±xcñ Æâ%"ÅKD$Î`0Hÿùÿ©õ<îÅÅÅøíÙ®-´ IEND®B`
\ No newline at end of file
+
+ä°G 777\½z#GÄÎ; - L:UþÞÆ> ¸ºº¢ ~~~¸~ý:"##
õ0 IIIòòùùùÍ.DYæ¬æ¬ælZCk¯ hë 0oÞ<¡ÉÜ¡u899áüùóFÿÄÂ)¢%`Îê`Îê`Φ§ùCGõìÙª¯Wuj9«9«9Çb¯1i°HÀb "",""°HÀb ""âïc(,,Dll¬ÒÃv÷ý´Æ¦sÇ1gu0gu´'gc)Znnn¨©©ÁŶÛpttÄøñãÛ\9wsVsV±9·¢Åàéé OOO%¤0gu0gu0góÃkDD$`1Å@DD XDD$`1Å@DDEßÇpêÔ))9d·3zôè6߬Â;9«9«ÃÛCÑb(**Âþýû1jÔ(%í6Î96À̹s³:³:͹=ÿ¬¤Q£F!$$Déa»
ôôt£eÎÇÕÁÕÑÅkDD$`1Å@DD XDD$`1Å@DD XDD$`1Å@DDMA$dggãÕW_Å)S0þ|>|XmÇùóçQWWÐÐPyúÕ«WñÖ[oaÊ)xë·põêUM¶¯3,!gùËRYBÎX°`¦L<yRíëKÈùóÏ?Çk¯½f±9kZYYYÈÉÉÁ;ï¼".._ýµ&Û"It:Î9aÃÉÓñÌ3Ï`ÿþýxæg¬Éöu%ä¼¼<M¶I)s~~>Þ}÷]ìß¿þþþX¿~½&Û×saa!âââ°oß>üîw¿Ãºuë4Ù¾RüÓUÛcÏ=X¿~= DDD<ÿìÙ³CEEÈÈH8;;ÃÇdzf;}ûðÙg¡¢¢ñññ8{ö,~óß ""#FÖåãã ìÞ½}ûöÅÊ+1|øpdggcÓ¦M <êØ½{7òòòpòäI¤¥¥ÁÚÚsæÌApp°
+É(Ërî
+,!çÕ«WËÓÆ;v2°W®\ ¸{÷.ôz=L¢4=c¨¬¬Ä!CZ3f`ß¾}1cbccåyC 1119s&8ÐÐPÄÇÇ·8^¿~ý°gÏÌ57n Ì={÷î
»»;òòòàîî={öÈ¿¬jjjлwo À#<7n(²ïj²»Kʹªª
+«W¯ÆÒ¥K;»Ûª³}||0uêTlܸË/Wb×U£i1ôíÛÿùÏZ_QQéÓ§ÃÖÖÓ¦MCEE
<Ï××z}Ãæ;w±±±:u*¢¢¢péÒ¥Ç{þùçaccéÓ§ËcùøøàÅ_DII |||PRRìÙ³ ðÐCáúõë êêj<ôÐCì»,!ç®ÀRrþ׿þ
ÐÐPÌ=&LPb×Ue)9çååáСCX¶l¢££ØuÕhZþþþCyy9îÝ»ÿþ÷¿ç<}önß¾C ¬¬¬äÛO=õ"##qèÐ!äååáèÑ£-®¯q¬ÃËcåååaÎ9xÿý÷3f //þþþ 1cÆ`×®]¸sçvíÚwwwSDaRsW` 98p «VÂòåËáççgLÎrÞ´iüR§ÓáæÍç`J^c;w.¬¬¬°víZ|ÿý÷èß¿?æÏ/ÏG||<1dÈáyĦþøÇ?"!!ï¿ÿ>îܹ ->EqåÊøûûËÏ6*++âEðõ×_7;#X¼x1Ö®]ßþö·:t(Þ}÷]%v]UsÓW#5Þ¶´§,!çÆ§B®ûÀèÕ«WÇw\e³BBBP]]'|ï¼ó»®]TTÔÖiNLL***Z
+¸Qrr2¾ûî;³ü}>>>fÿ&==VVVÌÙij:³:Ú³^¯oói¾ÁDݦ̽õ»
+æ¬æ¬îs·)""2,""°HÀb ""¼óùÌ3(--ÕbÕyúé§1jÔ(U×ÉÕÁÕÁÕ£I1âo¾···«W]aa!jkkUÿ3gu0gu0gõhöYIÁâ>q°£bbb4ûC"ÌYÌYÌY¼Æ@DD XDD$`1Å@DD XDD$`1Å@DD XDD$°bÐétÐét°²²öîÝ+ÌkiùX¸p!JKKq÷î]xyyÉÓ/_¾'ÂÆÆ'NÄåË;4¾¹Ó:çFkÖ¬éðØ@ë³²²àêê
+kkk¸¹¹!77·Cã;s®¯¯Ç5k0hÐ èõz:¦-¢ @$ܾ}6lÀ믿nuÔ××C¯×ãÿü'Æ'O_±b&MêêjL4 ááá&Y¿9Ð2g 8qâ6oÞlõ-sÎÊÊBFFjjj ¬ßhstt4222päÈÜ»w$dý¦`1ÅÐÈÊʪÃß«Óé
|...(** $$$@§ÓaÛ¶m9r$¼½½(7|nn.ÂÂÂ`kk°°0äää(²/æLoݺ
àà`|üñÇì%Ð"çÌÌL1¶¶¶ðóóÃ>¨È¾3-rNMMÅ
+0bÄ:[ ,¨t:lllðöÛo#%%¥Ãã<Xºt)BBB aaa¨ªª¯¯/$I¯¯/®^½*7|UUúöí pppÀµk×:¿CfJË£¢¢°`Á<÷Üsì9Ó2çFW®\Áìٳة}1gZæ|éÒ%äææâ£££ðT¹Óìï1´Wk§a666¨
¶¶¶¶¶³`ÁôêÕ.ÄòåËÏ-6Þvpp at RRBCCaooÊÊJôïßW¯^
½½½R»ev´Ì911$ Ë[Òéw{h3 # ëÖÃ/¼ È>#oL<111ÈÍÍÅðâ/*µk&e1g8q"Þ{ï=ÔÖÖ¢¶¶ï½÷&MÔêòÛ·oÇÏ?ÿmÛ¶aøðá eË!??%%%xýõ×!IühòäÉHHHÀ[· ___Uöͨs}}=$Iÿ3wÕR¸5rNMMÅÌ3ùó竲_æFýüü ü¯4,éé$/-[¶àäÉèׯúõëlÙ²¥Õå/^¼$$$ 55U~üøqxyy¡ªª
+}úô¾'>>xøáqìØ1lذÁdûc®ÔÈÔÉyÑ¢Eøá0uêTù;µµµ&Û's¤FÎ6l@||<ìììðöÛocëÖ&Û¥YÄSI÷{äèèè#G=VLLbbbM/,, øúú6;#xüñÇqüøq£×a©´ÎÙØm±tZçܳmJëüü|£×aN,þÕ¡»<RÒsVsVGw̹[µÅ@DD XDD$`1Å@DDÍÞàVXXØØXV¯ªÍ>_9«9«9«Cb>|8jkkQZZªÅêUgooQ£F©¾^æ¬æ¬æ¬MÁÍÍ
+nnnZ¬º[aÎê`Îê`Îêá5""°HÀb "",""°HÀb ""âïcøöÛo®ô°ÝBii)ÜÝÝZ9wsVsVG{r6¢Åàææ%ìVÜÝÝ1~üø6cÎÃÕÁÕalÎí¡h1xzzÂÓÓSÉ!©ÌYÌYÌÙüð XDD$`1Å@DD XDD$`1Àè÷1|õÕWHNN6å¶ÁËË˨e*OOO\¿~½SEDDÚñôô···QËU¡3ÛDDD×HÀb "",""°HÀb ""F½¡°°¦Þ""2!cßäfT1äçç#33Sñ¿+JDDê8uê®_¿®\1 ÀøñãÑ©
+#""m´ç³îx,""°HÀb "",""°HÀb "",""u1899i½ DDÝI¡ Ó¦M|}}ñé§b5ÎHdd$¾ýö[ÔÕÕaöìÙÂ_DDÝ
Iaùòå Á7ß|´´4äååb5$ z½%%%5j<ýÂ
¸pá[FD¤>CïÞ½QYY²²2ôíÛ ò¼Ó§OcúôépvvÆôéÓQVV (++ÃÌ3áììÜìú_|qãÆ!33çÎÃ9sä³'OÊË·öèÞÉÉ qqqpuu
¾úê+ @ZZ°k×.L6
+ضmϨ[3I1lÙ².]ÂÚµkáåå
Ý»wËóÂÃÃÒÒR <<\þÒK/¡¬¬
Lx¸7¼@ ¦IDATþÉ'`õêÕØºu+æÍ+V ((§OÆ;ï¼ÈÈHyùû=Â8p N8×^{
++W® ãÔ©S0a.\¸ &àäÉ<K ¢nÍè¿ÇÐO<ñÖ[ 8{ö,ðÒK/ Î; ØÚÚbîܹX¿~= ¼¼°¶¶ÆÄæÍáêê
+ áÌ"<<\.NgÔ6Í3¶¶¶7o¼Î¦g·Ç5kÖàÕW_íèîY41,[¶/^Ä;wðïÿõõõò¼'|ÙÙÙøùçggg vîÜ;wîc¥¦¦"<<G <ýôÓÏ,Î? èÑ£~øáV·);;·nÝBvv6zê)
+gÁÁÁHOOǾ}û.°¨[3I1øøø`áÂ
puuEBB¢££åy±±±øè£0räHìܹqqqòô¬¬,>\x$ïíííÛ·ãÏþ3¶nÝ¿þõ¯øäOàîî.\Sxùåa0Z½>pùòe3iiiÂöÀÝÝÕÕÕèÝ»·ð=MÇ竨»ÐEEEIMQ¶$&&û§=xݺµäädèõzóûÞ¬ßàFDDêëÅÀ³""ãub ""ã±HÀb "",""°H èg%:u
+EEEJId£GÆøñãï»g²ÆÏí¡h1áØ±cðööVrX"E¢¦¦¦ÍÿH<É{<·â®j0Ú|Ë5?âÅ<Éܵçx6¯1Å@DD XDD$`1Å@DD XDD$`1Å@DD-ºº:h½m
+@]]ÖAfÇ3MA§Óµ8=++®®®°¶¶rss-±cÇ6¾fÍaÜË/câݱ±ÁÄqùòe ÀÁáììøøøàûï¿ Ô××cÍ54hôz½<VÓ1ËÊÊàìì>ø@§Óé ×ë1xð`ìØ±C^vÌ1ÈÌÌlo4dx<SWagYYYÈÈÈ@MM
+BCCÔlôôtaÚ'°yófaÚ+0iÒ$TWWcÒ¤I ,X° ¨©©Áþðyztt4222päÈÜ»w$ ãåååÁßß[¶lÁo¼!O$ uuuHKKÃ%KäééééÊ,g²4ºª>"ñóóÃúõë-S\\ùþ[·?þ>>>òôÜÜ\>}¶¶¶Ã# 4<þ÷Èéðáà ÔÔTlÚ´I^®©íÛ·#)) 999pttluûû÷ï/ßvqqÁ_~iÌnSÅã,Y14ºrå
+fÏÄÄÄf󪪪`gg'ßÂðÜsÏ5[®oß¾ \»v
+ 7ß|½{÷FNN<ýÒ¥KÈÍÍÅ< GGGìÝ»WkéÒ¥X±bEÿt:¬¬¬0}útlܸQnggü±ã!PÁã,
ÙCqq1¼¼¼^x¡Ùü>}ú ¶¶V¾åË7{ÕÞÞ «W¯ÂÞÞ ðÒK/¡¢¢7oÞÄ)SðØcÉËO<×®]æM"¯ãèÑ£kñTZ$Ô××#''Ë-§×ÖÖâÑGíldáx<%1ËbHMMÅÌ3ùó緸̸qãpöìYù~}}=$ICmüwòäÉHHHÀ[· ___ù{$IÂ3gÅh8ÕÐâE:=zHIIiuûÿã@yy9<<<ÚµÿÔµðx&K£ù5_¿C$,Z´ 0uêTyú7SíÀÀ@´yÆÇÇ# ?ü0<<<!¬wÀX¼x1""" 6lÀË/¿Y³faðàÁغu«0««+
+
+
+àççëׯ#22²ÙxIIIòòùùù-^l¤®Ç3uï_!ÑÖô¦æÍ×꣯¦ßÿøããøñãF¯càÀÈÏÏ¿ïòNNN8þ¼QÛ{âÄ áTº.ÏÔUh~ÆÐQ={ö-3KØFÒg2'fy´Ãb "",""°HÀb ""¿¡°°±±±JK¤û~hS<Éܵçx6¢Åàææ\¼xQÉaåèèñãÇ·¹g²ÆÏí¡h1xzzÂÓÓSÉ!4Ããº+^c "",""°HÀb "",""(ú>S§N¡¨¨HÉ!»Ñ£G·ùfæÜyÌYÌYÆäÜCQQ;ooo%í6
+QSSÓæ9wsVsV±9·âd0ô°ÝBLL***Z9wsVsVG{r6¯1Å@DD XDD$`1Å@DD XDD$`1Å@DD-ºº:¨¾Þ ÔÕÕ©¾^0gu0gu0gãhZ:®Õé_ÉÌÌÄØ±cåû6l¬áææÜÜ\ @VV\]]Mo:vYYñÁë×ëõ<x0vìØ!/;fÌdffv|§5ÀÕÁÕÁMÏ,Ï$I$I÷]&==A¾àÀ9rÕÕÕXµj4ü322PSSÐÐP ãäååÁßß[¶lÁo¼!lC]]ÒÒÒ°dÉyºÁ`@zzº{©=æ¬æ¬æ¬Å?]U-ÅÅÅpqqïøá Û·oÃÊÊ
+
+ ¡¥ýüü°~ýzùþöíÛ8::¶º®þýûË·]\\ðå_*µf9«9«9Çb¡ªª
+vvv´ÆÓ<{{{<xPwåÊÌ=ò´¥KbóæÍ-þpÇêÙ³'²³³åévvvøñÇÚ
+³ÇÕÁÕÁcO%£O>¨¦I7o"99¯¼ò<½¸¸^^^Ã/¼ O?zô(ÂÂÂZ<Å$ õõõÈÉÉÁ²eËäéµµµxôÑGM°Gæ9«9«9Çbaܸq8{ö¬|?,, ½^7n RSS1sæL¤¤¤`þüùÂ8zô("""ÒêºÇòòrxxx(¹+f9«9«9Gó§~ý
+Ii·}Q)00rØ#G®^½#GbçÎ E ¦N*oã \]]QPP ???\¿~Âz¤¤$yùüüüf¢,sVsVs6-M¡µW´õÊ 7oÐäÁÁÁîÐ:pþüy£ÖâÄ áÑ0gu0gu0gÓÓü¡£zöìÕ׫Å:µÄÕÁÕÁc±×È4XDD$`1Å@DD XDD$`1@ñ÷1"66Véa»
û~ZcS̹ã³:³:Ú³±-777ÔÔÔàâÅJÛm8::büøñm.Ç;9«9«ÃØÛCÑbðôô§§§CR³:³:³ùá5""°HÀb "",""°HÀb ""¢ïc8uê²Û=ztoVaÎÇÕÁÕaLÎí¡h1aÿþý5jÃvgÎAMMM?`æÜ9ÌYÌYÆæÜVÒ¨Q£¢ô°ÝBzzºÑË2çcÎê`ÎêhOÎÆâ5""°HÀb "",""°HÀb "",""°HÀb ""¦Å I²³³ñꫯbÊ)?>>¬É¶ÄÇÇãüù󨫫Chh¨<ýêÕ«xë·0eʼõÖ[¸zõª&Û׳üe©,!ç,X° S¦LAHHN<©Éöu%äüùçãµ×^³Ø5-¬¬,äääàwÞÁÁ¯¿þZm$ :gÎÁ°aÃäéÉÉÉxæg°ÿ~<óÌ3HNNÖdû:ÃrÎËËC^^&Û¤KÈ9??ï¾û.öï߬_¿^íëKȹ°°qqqØ·o~÷»ßaݺul_G)þéªí±gϬ_¿NNN """BöìYÄÅÅ¡¢¢CAdd$áããY³faß¾}øì³ÏPQQøøx={¿ùÍo#FëòññAPPvïÞ¾}ûbåÊ>|8²³³±iÓ& uìÞ½yyy8yò$ÒÒÒ`mm9sæ 88X
de 9wóêÕ«åicÇÅ;LIXBÎ+W® ܽ{z½¦EQ1TVVbÈ!ÎÃ3°oß>Ì1±±±ò¼¡CÊ
?Ì9@hh(âãã[¯_¿~سgfÍ
7 fϽ{÷ÂÝÝyyypwwÇ={ä_V555èÝ»7 àGÁ7Ùw5YBÎ]%å\UU
Õ«WcéÒ¥ÝmÕYJÎ>>>:u*6nÜåË+±ëªÑ´úöíÿüç?ί¨¨ÀôéÓakkiÓ¦¡¢¢Bçëë½¾aóÏ;ØØXL:QQQ¸téRã=ÿüó°±±ÁôéÓå±|||ðâ/¢¤¤>>>())¿¿?öìÙ xè¡pýúu @uu5zè!Eö]MsW`)9ÿë_ÿBhh(fÏ &(±ëª²óòòpèÐ!,[¶ÑÑÑJìºj4-ÄÅÅ¡¼¼÷îÝÃÿû_ÄÅÅÉóÏ>û·o߯¡CG VVVòí§z
+8tèòòòpôèÑ××8ÖáÃå±òòò0gμÿþûHIIÁ3 À1c°k×.ܹs»ví»»»)¢0)Kȹ+°8U«Vaùòåðóó3E&g 9oÚ´I~@©ÓépóæMÅs0%M¯1Ì;VVVX»v-¾ÿþ{ôïßóçÏç#>>2dð<bSüã÷ßwîÜ¢¸rå
+üýýåç
+aÑ¢Eøúë¯,^¼k×®Åoû[:ï¾û®»®*Kȹé«o[ÚÓLsãS!M×}àÀôêÕ«ã;®2KÈÙÉÉ !!!¨®®ÆO>wÞyG]W.**Jjë4'&&Ü(99ß}÷Yþ>³ÿE+++ælbÌYÌYíÉY¯×·ù´VLLßàFDD¢nSæÞú]sVsVGw͹ÛÅ@DD XDD$`1Å@DDMÞù|æÌj±jÍ<ýôÓ5jªëdÎê`Îê`ÎêѤJKKúM*àÅÚ5PÕ©þfÎê(--Å7ß|oïîtaa!jkk³i3 åg% XÖv\ mþsVÁ`°¸OÐì¨Íþ0sV¯1Å@DD XDD$`1Å@DD XDD$`1Å@DD ,£t¿|Yp°÷WóZZ¾#(pWëïè¸ÂrîÂYët:èt:XYYÁÅÅ{÷îæµ´|G,\¸¥¥¥¸{÷.¼¼þtFF
+kkk¸¹¹!77·Cã;sn\ãCÆ×e H nØ àu£
+üÀ¸_[2Ñ:Í97®¿ä-Inß¾
+6àõ×Mt}}=ôz=þùÏbܸÿ}àÀ9rÕÕÕXµjM²~s eÎ$É_ÇÇïÿ{¬ß,§Yuâ{u ¢ <GÄE¿LOøeÞ6 #Ñð1ÕèÒZÛ¤UÎ °ð[ ØaeÕñ u:¢¢¢ðàÂÅÅEE
+A'$$@§ÓaÛ¶m9r$¼½½(?"þðÃ1dÈèõzXYYaÐ Aì9Ó"ç¦þò¿`É%ÞµYN1è Ø x@J'Æ ÀR !¿LPÀ
+T}\EÔÚ"-s T¸ ài AX¿Óét°±±ÁÛo¿=xð`TVVbéÒ¥ i:,,UUUðõõ
$IðõõÅÕ«W!Iÿ; u:lmmÒ©õ;s/¾ø}úôÁ:µ/jÒîï1´Wk¿¤m Ô¢áQ&~¹m{q è
ç¹ÿ2iÁ7Þv ´#kÁÌ!ç~ þ³.ê׿<ÙØØ ¶¶vv
+A×ÖÖÂÖ¶õ ,X
^½zaáÂ
X¾¼!è¦Xo;88 )) ¡¡¡òúþùgìÛ·¯¼ò
+ÊËËÙ/s£uÎ °zõjÄÇÇwz_Ôd9gà=4ü¢ªýåö¤û,¿ÀÏhx:cø/Ó$ Ë ä(AÃsëº_)Ü9_ÿe|7E¶Ü¢L8ï½÷jkkQ[[÷Þ{&µôöíÛñóÏ?cÛ¶m>¼!hI°lÙ2äç磤¤¯¿þ:$IY
¡²² ×ëqãÆ
+ÓïQ#g 8vìêêê0zôhï,¿¶ 8GýÐðgË}¿G© RL?WÈTèó«ïiú*.þV©ó 4\þXí¶0[¶lÁÉ'ѯ_?ôë×%%%ز¥õ /^¼$$$ 5õA?~^^^¨ªªB>bÐ#Gz÷îØØXìܹÓdûc®ÔÈh8[3É>e<t¿çúiÇX1¿|ýZá/ÿúþòeìú»æ¬ÖÞ GGG9b|Ð111itaaCо¾¾ðõFpp°Ñë°TZç þ¹Ñë0'Æ@DDê^ÅÐMj9«â~I9Ý1çîUDDÔ& XDD$`1Å@DD ´{[!XÍÖ®® ö9«¢°°±±Ý#èØÛk4sV&Å0|øpÕ5ü±îÀ5jê«eÎê>|8jkkQZÚ=¶··gÎ*Ð*g@£bpss[7ü41gu0gu0gõð XDD$`1Å@DD XDD$`1@ñ÷1|ûí·HOOWzØn¡´´îîîF-Ë;9«9«£=9KÑbpssCMMCv+îîî?~|Ë1çÎaÎê`Îê06çöP´<==áéé©äÔæ¬æ¬æl~x,""°HÀb "",""°H`ôû¾úê+$''r[ÈDàååeÔ²F§§'®_¿Þ©"""íxzzÂÛÛÛ¨e*Á ÁÐm"""ÁkDD$`1Å@DD XDD$`1Å@DDÁ`þy·Ì@~~>þ?Í
+e=û&o IEND®B`
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/hagrid.png
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/hagrid.png 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/doc/images/hagrid.png 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,76 +1,84 @@
PNG
-IHDR * " & bKGD ÿ ÿ ÿ ½§ IDATxíÝyxTõùÿÿ×µH Ê!=°] °¨ÄlbÄ%`Á
E£PMÜ +eð$¬ -KV,
-@PCæûçLÎLÎ{ÏÇuåº&gÎóûáÎÌd<111Þnݺ L°eËUbb¢Ók IRRRB^ ü
- ã0¨ 0
- ã0¨ 0
- ã0¨ 0
- ã0¨ 0
- ã¸bPÉÉÉQ\\#çSNN#ç ܪTʧ~ªVZ©bÅjÒ¤Þ}÷Ý+:©Çã¹¢Ûù²dÉÝ|óÍÖ÷/Vdd¤*V¬¨¨¨(Y³FtôèQuéÒE*UR.]tôèQIRnn®Õ°aCU¬XQM6Õò×ãñ($$DõêÕÓÛo¿m]×®];-Y²Ä¯÷ ¸ÚjP4hÆ«ììl\¹R+W®ÔºJeáÂ
µ¾_¹r¥VZ¥¬¬,M4I$;V]»vUVVºvíªqãÆI´bÅ
--_¾\çÎÓG}¤µk׿;×ëUNNRSS5bÄk{ll¬.\ø; \EJ5¨\{íµ:vìvîܩ믿^ï¼ó$ióæÍjÖ¬rss%]úO}£Fô¯ýKÏ<ój×®m=+qùÙ¼÷ï߯N:YÏÔlÚ´ÉÚç¹çShh¨Â´xñbM<Y5kÖÔµ×^k=³±uëVEDDXë\°`êׯ¯+WNuëÖ$Y³F ª\¹²´zõjIÒ9sôÆo¨EªP¡"""4þ|u³.GDDhÛ¶m¥)# bjPY¾|¹¾þúk%$$èw¿ûõò¨N:)22RË-$mܸQÔôéÓ¨üQ^¯W^¯Wò]~àôðÃëÌ3JIIÑСCsÖ¨QCß}÷,X ûï¿_µjÕÒÑ£Gõî»ïêñÇ$effªjÕªùÖêñxT¹re
-6LsæÌ±ö«]»¶$©VZ:uê$é»ï¾SãÆÛå¢ò¯\¹rêÝ»·^|ñEk{ÕªUuòäÉÒ @1<'Nô&&&ú{÷îU÷îÝuüøqIÒô§?ýIÛ¶mÓC=¤ª{÷îz÷Ýw5kÖ,íß¿_£FÒÔ©Såñx¬!E*T¨ï
-éG¹¹¹òx<ºxñ¢BBB¬í¿þÞëõ*,,LPõêÕóñüùóZ¾|¹|òI<xPµjÕÒ¾}û¦ï¿ÿ^-Z´ÐñãÇU¯^=]»ÖVò;ïe¯×«
-6hèС:tè$éôéÓÔ±cÇJ]C %%%þ=*ÔO?ý¤½{÷êâÅÖuÖÒ¥KuèÐ!uïÞ]tß}÷éóÏ?×úõë,éÒ`ò¿ÿýϺmTTÞzë-;wN^¯×z $k(ñõ½$µoß^°¾OHH°¨9sFÔ³gO¥¤¤èÂ
JIIQ=$ICÕ#<¢êâÅÖâËåcKÒÁ]äþ J§|ivîÓ§î¸ãedd(<<\óæÍËwý)SÔ¢E|/ºüªZµjiÒ¤I¤~X7ÝtÎ?/¯×«wß}WÃ×#<¢.HR¾g\3`À ¥¥¥YC«V¥'N¨U«VZ´h$)99YqqqªV¢££µxñbIÒ_þòM:UÝ»w×÷߯Ñìòý¨
S§fÍem_¿~½Xâµ (Þ¿ô«0[¶lQÿþý¡
-*øå%ñË/¿hÐ AÖàQâââôÎ;ï¨|ùRÍ| |HJJ*Ý3*Eñx<ªR¥-ZT¦Cté¥dN);/ àf~TJóR- (J©ÞL eA qT A qT A qJôç·lÙ¢´´´@¯0NLLºuëVä>äW+òøF> ßJ©Êúõëµð½7tsǦ¶=;éôéÓÅ|àjD> ßÈà[Ió!â£;5Õcâl-&oÌZ.ål_ò«
-ù |#o¥ÉïQ ` ÆaP ` ÆaP ` ÆaP `JIìÙqHÛ?ßïÏCѪ]£2ÿ-ò`A> ßÈà¿óá×AeÛæýÚôêÒ¡?øÕ¶]»t&ûÇ2ÿAC>Èàù |D>ü:¨HR<~¼¿øMÊk³õíyg~3E>`:òøF> ßÞ£ À8* à À8* à À8* à À8* à À8* ãA%´ax@sñ¢âG>cBüÈGsñ¢ÓËaÈÇ%ä
!|\B>ãè Ú0\ï¾÷^mòè Ú»¿~ÉÉQ¯»ûYÛÿwì~ß¿¿Â"è÷ýûëÇI>\±RQZZû-ÿt򮮻V£ÆjÓ-VË?]eùòW^«?[¯v±ÝÑDwÝ÷'ýpâDçm®V®Ìwç½ï¸ÏS3ü&µèÔYK>üк®uËúpEþÛ#x_ï@åãÃO>QÌ·éºÆêÚ»ÖoÚd|à2SòáëñJ>à$Sòñþjߣ'ùÀsüEï ÿ=Z&çÊÍõ*$$DÛvîT»Öíy!Q££õ/÷¨ct´JL$½÷ñÇêcí7rüxM2EG¿Ú§i'ëÑ $I§¾ÎЩ¯3
-oĸqJ|úiýgïùàzú
Ä"Ï'IsÞzK^¯WôKNðAãú:C'ÔËÉÓ5ö©§í]bbôÞÇÛ)cB>|=¾V~¢7_¥ÿîýRìeÝ| /òáëñJ>à4òñÏuiÙùúÏ{4fÄ5| T¢ÑOþE¹¹¹®ûâ˽êr{oÕnÔX]nï=ûöI¶ñ
nî~nhÖ\ÏLníàÐ!ÝÚï]×8BÑ·ôPúö¤×RSß.tþýíê7 at sÞzˤÓ6nÔðøxUªTIÃããµþÿÛ(IÚ¹{·5lhÿƺu%IGTïw¿+ò¾]¾O÷_Väù$©uóúÇ5¤¥~¨^Ýc<ÇuµjY5l¨]{ö¹? ùð%PùxóÕ4"B*UR÷.]T¥Jë6äy_Wò§Ù}Q7Ö+OHÊ
S°0Iä%çø Ò¤qcÝÒµ«^}#µÀu#ÆÓàq:²g·ÓÇ$=6ñ
-×áÛUçú0kÿáÕûê¿ûö*ñ駬|x|¼¾þbºuî¤S_g¨[çN:¼s5¥ÊÊR5%I×êtvö¥í§Oë<òÄ4tÔc
-h¢a úëóÏyßþöÂzü©§T¿Uk}¶q£Ngey>IzdÈýõWåõzõZêzðþû7´a¸®½©îý¿!zî/OZÛ¯¹æe:Uä\LÈ/ÊÇe??®ÁÃkÚÉÖ6ò¼LÊǯ¯äN3%¡
-Ãu}H=öÄJyáyIä%çø "IÃãhý¦Mú×ù¶8tHãâT¥J
-êß_ÿ>xÐÚþ§þ÷è7¿ùî¿÷^kÿ=ûöéÏcÇéú&ê?$^¾þZÒ¥^è6JÛ´Y¡
-öi³njÛNó,$Õ¨^]'23%I'ORjÕ.Ý®F
-ûñGëø£7f¾¤cÿþ楤høÇ¼_wþþ6}¹i£þ·ÿ+ÝÒµ«n¨S§ÈóIRÃúõt}XÆM¬Æááºáúë÷Ô×ÊÌ8¬Þþ»&=û¬µýܹsªZä|Î/Ê$íØ½[½îî§áññº½gOk;ùÀ¯Â¯ä&0!§¾ÎÐÿö¥¿>ÿ=æÒíÈJÈAÅãñèoÏ?§Çz*ßöÆ7ݤ
Ëéüùóz{éR5iÜXѨ.[¦.èÝ÷Yû·lÖL¯ÎHÖw_í³lÒ¥ÞÆkÅ¢
J[±\ãâtêë
-<XÛ¹³^KMÕO?ý¤×RSÕsgIRÛÖ0JËëÍû}Q¼^¯þ}ð JLÔûî+ò|xp¨ÞøûÛzøÿþ¯Øã8i]>üÍ7jÓªU±·Apq:¾*ó-ÒÀ¡êo/<¯{ûö-pò¼Î¯Ç+ù ÎÇSµ~1¢³çÎI"(9#éÒëÿÔÿ|ÛfM¦yþ®z-[iþÂEzyú¥×K¾¨W^CámÛéÛï¾³ö7ó%-þà5lÓ¶À_غc§¢Û¶Õ©ÓY
-Q#ßy¦NzBÒ·êÆ-µyëV=ûä$IR¿;ïÔ¦ôtk¿¿½ð¼êiÝдÆO¢^¤|çúõåá7éî×ûôÖ¨*ò|uÖ©¯3Ôáæv
ÖêòqzLÓbm߸eî¹ë®b*`äd>|=¾'&éøÉê7økÿ¼¿y#ø5'óáëñJ>`
-'óÑ<2R]{÷QýVõÒk³õƬøùóL8Ñç¯N&))I¾Û¬Ç&Ź߳Ës*TÇ÷çóKNNÔg9½ù¨æ¾¢òåÊ9½£¥¼6[ßß_¢Çóor||¸ùðòáNäÃ?È;"åý¹@·©P¾|ÐHRPÁ| ¾À7ò2æ¥_ p
- ã0¨ 0
- ã0¨ 0
- ã0¨ 0ß?Geû®/2{¶¿øÍÆôt5hUÍs| ¾À·@äïJ«vt&ûGý÷Ü~ð«ú-«éæMËü¼äÁ| ¾À·@äïJt§¦îTöù |#oäW+Þ£ À8* à À8* à À8* à À8~ý=;iûç|Ìת]£2ÿÐ.ò`A> ßÈà¿óá×AeÛæýÚðêС?øÕ®]»t&ûÇ2ÿAC>Èàù |D>ü:¨HR4~üxðÙ³gëäyg~3E>`:òøF> ßÞ£ À8* à À8* à À8* à À8* à À8* ãA%<<Üé% Æ"oäð|Ài*iiiºýöÛ¡=zèã?ø9}
n ڿ¿rrrÔ¯_?kû±cÇÔ¿5iÒDýû÷×±cǾF@
-|[_ at Y
-||òÉ'ºí¶Û¡>}úhÓ¦M_# G>V¬X¡={ÉÑAeÌ16l¾üòK¥¦¦jݺuÅëõ*$$D;wîTëÖíÖ={ÄÄDÇÖ«K0ä###CW¯`ÈÇ'|¢Y³féË/¿ÔàÁ5jÔ(ÇÖ«K0äã³Ï>ÓüùóµgÏýùÏ&(£J5tüøqíÛ·Oµk×VJJuÝÞ½{Õ»wo5nÜX½{÷Ö¾}û$IûöíÓwÞ©ÆÞ7mÚ¤öíÛkÉ%:tèî¹çë· ;vì°öÏûàÔÔT
ë½÷ÞÓí·ß®è·Þ²®ß¸q£âããU©R%ÅÇÇkãÆeQ (ò8%òñòË/+""B*UR.]T¥J²(
-ùxñÅU·n]
¨\¹r
-+Ò È8:¨¼þúëúöÛo5uêTuìØQï¿ÿ¾uݸqã§Ý»w+..NãÆ³¶ß}÷ÝÚ·o_¾ßä~ðÁ<y²Þ|óMÝ{ï½;v¬¨½{÷ê©§Ò ¬ýóþ8>>^»víR§N¡N:iÇÖõYYYªY³¦$)44TÙÙÙeR ò8%òqüøq
->\'OtY IÁððpEFFê'ÐóÏ?_¥A)ïäÉ6l¨g}VtàÀ
-8Pwß}·$éСCSåÊÕ¿=÷Üs¤jÀªX±b¾cM0AsçÎUóæÍ%]úÍÀ¸q㬠z<B×÷·/·k×NS¦LÑàÁU½zueffªVZ:uêªU«æÇ
- ¾C> §K>vïÞG}TcÆQÏ=ýu÷"K>222táÂ]»VcÆÑg}æ¯À%}FeôèÑúæoôóÏ?ëßÿþ·rssënºé&-[¶LçÏ×Ò¥KÕ¸qcIRDD-Z¤þ9ß±æÍ§qãÆiÕªU¤fÍ)99ÙúÍÀáÃ%IåË×?ü`Ý.##CñññZ¸p¡/_®¸¸8eddX!êܹ³RSSõÓO?)55U;whMË!S!-Ò>¨ç^}ûö
-h=¼!Ï>û¬233%I!!!:wî\à
- åè rË-·hèСjÞ¼¹RRRò½Q}Ú´iúûßÿ®VZiÑ¢E>}ºµ}éÒ¥jÚ´i¾i½[·n?¾yæ½ùæzé¥ôÁ¨mÛ¶ù^3yß}÷)666ßmwîÜ©¶mÛ*++K5jÔÈ·Æ'xB[·nUË-µuëVM4)%,Á¼·å¯¡,C>&M¤'Oê°óã?²,¤àÈGdd¤úôé£Ö[köìÙ9sf K å8q¢·¸¿d¤CßmÖcâÜïYËõSf¨ÆïÏ5~5{öl<¿¿Dçßä6,ö/½¸ ù |#oÈ+>ð »0¨ 0
- ã0¨ 0
- ã0¨ 0
- ã0¨ 0Ny'Nºk×.¥§§;qjãµiÓF:t(rêç[Iêg:úëù°|¸ù°|¸ù°Ç©|8òJzzº6lØ ÇÃW¯ôôt¥¥¥Q¿ ×Ïtô×^©½úþÚë/õ³W?ÓÑ_{ý¥~öê<£"I±±±JLLtêôFJJJÒ#GJ´/õ+¨4õ3ý-|ØC>Ü|ØC>Ü|Øãd>x
- ã0¨ 0
- ã0¨ 0
- ã0¨ 0
- ã0¨ 0
- ã0¨ 0+ÅÅÅ9½bÅÅÅ)''Çée@ýÜþÚCýÜþÚCýÜþÚCýJ/(ÇSèö¥KªyóæªX±¢¢¢¢´fÍIÒ%KtóÍ7ç»ý导=ª.]º¨R¥JêÒ¥=Zäq/2eJ¾cå½¼oß>5nÜX¯½öZ¾s¨^½zzûí·}Ûµk§%K\IIJ
ú¹ýµú¹ýµú¹ýµú^P*¾,]ºT/Vvv¶F©J.\¨ØØXk?¯×+¯×[àöcÇU×®]¥®]»jܸqEW¶oß®¹sçºuëÖ©oß¾zýõ×5|øð|çÏÉÉQjjªFamÕÂ
mÕÀêçnô×êçnô×êçnô×êç?A=¨,Y²D-Z´PåÊÕ«W/]sÍ5¤[·*""¢ØÛ¯Y³F ª\¹²´zõê"{áÂÅÇÇëwÞ)p¬ùóçküøñZ½zµºuëæóaaaÖåmÛ¶T÷Ù¨»Ñ_{¨»Ñ_{¨»Ñ_{¨ÿwzþpìØ1õë×O3gÎ$effªjÕªÅÞ.33Sµk×$ÕªUK§N*ò¸'NÔ!CÔ½{÷ÇzôÑG5wî\5hÐ Àuz«P¡-[fm¯ZµªN<Y²;@ÔÏÝè¯=ÔÏÝè¯=ÔÏÝè¯=ÔϾ ~FEº4vìØQ ºë®»$I5kÖÔÙ³g½mhh¨?.I:qâBCC<îÌ35fÌ«±y_û·víZ%$$úT×ëUnn®V¯^Ñ£G[ÛÏ=«k¯½ö
-îµÿP?w£¿öP?w£¿öP?w£¿öP?ÿêAeÞ¼yºóÎ;5gÎ
-4ÈÚÞ¾}{8p ØÛ÷ìÙS)))ºpáRRRÔ£G"ïõy_Wµk×jüøñ3gÏs^~àIÒÁ]ò;ìgÔÏÝè¯=ÔÏÝè¯=ÔÏÝè¯=ÔÏæ¥_¿þ^¯W=ô$é¶Ûn³¶9sFPZZUäÂþ×ëUrr²âââTZ5EGGkñâÅäó¸Å=]×¼ys¥¥¥©W¯^:}ú´&LïuêÔѬY³¬ýׯ_ïPDýÜþÚCýÜþÚCýÜþÚCý+(Âþ"BQÛï½÷Þ|¦¯ýn¼ñFmÞ¼¹ÄÇõµOÞËááá:|øpµ}ûö|Oµ
-õs7úkõs7úkõs7úkõ¼ TJ«B
-Öôi2S×HýÜþÚCýÜþÚCýÜþÚCýJ/¨ß£ ÀT A qT A qT A qû-[¶hÚ´iNÞHiiijÐ Aö¥~¦~¦£¿{È»{È»{Ì#JTT²³³õÍ7ß8qzc5hÐ@:t(v?êW¸ÖÏtô·päÃòánäÃòánäÃ'óáÈ £'Ní
-ÔÏÝè¯=ÔÏÝè¯=ÔÏÝè¯=ÔÏ<¼G qT A qT A qT A qù]»v)==ÝS¯M6Å~¨õó$õ3ýõ|ØC>Ü|ØC>Ü|ØãT>yF%==]6lÇãá+ÏWzzºÒÒÒ¨_ëg:úk¯¿ÔÏ^ýLGíõúÙ«é诽þR?{õGQ¤ØØX%&&:uz#%%%éÈ#%ÚúTúþD>ì!îF>ì!îF>ìq2¼G qT A qT A qT A qT A qT ÇJNNâââÊü¼qqqÊÉÉ)óóúõs7úkõs7úkõs7úkõ+½ T<Ïí¿òZ²dn¾ùfëûÜÜ\M2EuëÖUHHHý§Lo[ÞËûöíSãÆõÚk¯å;gHHêÕ«§·ß~ÛÚ·]»vZ²dÉßÑ ¡~îFí¡~îFí¡~îFí¡~/^¯W^¯·Àö
*66Öú>11Q/ÖªU«tñâÅ|·Ù¾}»æÎ[èñ×[§¾}ûêõ×_×ðáÃó7''G©©©1bµ=66V.ôÃ=+ÔÏÝè¯=ÔÏÝè¯=ÔÏÝè¯=ÔÏzPñeëÖ°¾7ofÌ¡-ZäF/\¸ øøx½óÎ;1þ|?^«W¯V·nÝ|+,,̺¡mÛ¶ùé^8ú¹ýµú¹ýµú¹ýµú+ÌÌLUZÕúþÛo¿Õ5kT¥J5hÐ@}ô$iâÄ2dºwï^à>ú¨Æ«
-¸Îãñ¨\¹rêÝ»·^|ñEk{ÕªUuòäIÿß¡2FýÜþÚCýÜþÚCýÜþÚCýJÏJÍ5uöìYëûÐÐPõìÙS§NÒ+¯¼¢aÃIfΩ1cÆXSlÞivíÚµJHH(ô©2¯×«ÜÜ\^½Z£G¶¶={V×^{m îV¡~îFí¡~îFí¡~îFí¡~¥çÊA¥}ûö:pàõ}¯^½$©@Ãsssó½0ïk£££µvíZ?^sæÌñy®ãÇ[<¨èèhÿÝP?w£¿öP?w£¿öP?w£¿öP¿Ò+ïôJê× Áëõú¼^¯ ´´4«)3f
ÌÐ}÷ݧ?þñªW¯Þ|óͳyóæJKKS¯^½túôiM0!ß¹êÔ©£Y³fYû¯_¿^¼ò;@ÔÏÝè¯=ÔÏÝè¯=ÔÏÝè¯=Ô/°bP)ì/'µýÞ{ïÕ A¬ïo¸á_¿¾ÄçÈ{9<<\O°¿ PIDAT.öÒ¥¿Ð÷©6SP?w£¿öP?w£¿öP?w£¿öP¿ÀA¥´*T¨ Åùy8g P?w£¿öP?w£¿öP?w£¿öP¿Òså{T 7 ÆaP ` ÆaP ` ÆaP `Ç>GeË-6mS§7RZZ4hP¢}©_A¥©éèoAäÃòánäÃòánäÃ'óáÈ ¥ììl}óÍ7NÞX
-4PÝú®¤õ3ý-ù°|¸ù°|¸ù°ÇÉ|82¨ÄÄÄ(&&ÆS»õs7úkõs7úkõs7úkõ3ïQ ` ÆaP ` ÆaP ` ÆaP `G>Ge×®]JOOwâÔiÓ¦ß>,ú¹ýµú¹ýµú¹ýµúÇA%==]+V¬PëÖ8}ûꫯí·õs7úkõs7úkõs7úkõ3#$µnÝZÃ
-sêôejáÂ
~?&õs7úkõs7úkõs7úkõ3ïQ ` ÆaP ` ÆaP ` ÆaP ` ÆaP ` ÆaP ` T¼^¯-[¦ÁëÖ[oÕ Aôé§úý<ÉÉÉ:|ø°rrr4räHkû'4jÔ(Ýzë5jN8á÷sÓõ»å[¬/øÓý%%C>átÉGÉg8Ý_òQ2Ws>bPYºt©V¯^§zJ|ò¦O®={öøý<^¯WG_}õ"##í³gÏVË-µbÅ
-µlÙR³gÏöû¹Ééú[·NëÖóûùpÓý%%C>átÉGÉg8Ý_òQ2Ws>Ê;½øðÃõÜsÏ)<<\tÃ
-7hüøñÖõÐôéÓuäÈÕ¯__&LPãÆuË-·èü£/_®þó:räuàÀ]ýõ?~¼Z´h¡eËéW^¤|ðû￯uëÖiÇJMMUÅuÏ=÷(>>¾l`ÓõC`9Ý_òA>LætÉù0Óý%ä£8AñÊñãÇU¿~}×O>]}úôÑòåËÕ§OM6ͺ®I&VstçwjåÊ9r¤%IýúõÓG}¤¶mÛjݺujÛ¶>üðCëA5jHªW¯®3gÎê®ÓõC`9Ý_òA>LætÉù0Óý%ä£8AñJíÚµõÿüG
-6,ôú#G¨wïÞªT©n¿ýv½úê«Öu=zôPHÈ¥yìСC6mõ@ñx<ïµ}/÷íÛW£FRß¾}õÛßþV§OVhh¨²²²ôÛßþ6 ÷3P®Ëéþòa2§ûK>ÈÉî/ù Å A¥oß¾>}ºÆ£ððp}ÿý÷zûí·§×êÕ«§þóºõÖ[õü#ßt[®\9ër£FÔ·o_ÅÆÆªR¥JÖöuëÖéÕW_UçÎU¥J}üñÇzüñÇëÛµk§÷Þ{O<ðÞ{ï=µmÛ¶îµÿ8]?Óý%39Ý_òq ù0Óý%ßbPéß¿¿Ê+§©S§êûï¿WXX
-d]?nÜ8%''kæÌª_¿~¾×æõäO*%%EûÛßôóÏ?KõôÙ¾}ûôÐCiÏ=&ú~XS§NÕwÜ¡&Mèé§Ð=
-§ëWØo®¦§-ÍéþKÈî/ù¸|ÉéþKÈoA1¨x<õë×Oýúõ+ôúÈÈH½ñƶÿºY¿ûÝï4cÆBqùÍJmÛ¶-0Ñ_wÝuzùå¯déFpº~niî/ù¸|ÉéþKÈî/ù¸|øo¦ puaP ` ÆaP ` ÆaP ` ÆaP `£?ðñ«¯¾ÒîÝ»^F5k¦Ö[;½BQ?w£¿öP?w£¿öP?w£¿öP¿²cô ²{÷n}ùåêÖÓK)Ô-[t
öìYcÔÏÝè¯=ÔÏÝè¯=ÔÏÝè¯=Ô¯ì=¨HRll¬^F¡´gϧQ$êçnô×êçnô×êçnô×êW6x
- ã0¨ 0
- ã0¨ 0
- ã0¨ 0
- ã0¨ 0
- ã0¨ 0
- ã¸jPñx<òx<*W®"""ôÑGØgèСڽ{·~ùåuìØÑÚ~ôèQuéÒE*UR.]tôèѲ\ºìÔïòm=OY.¥`§¿K.UóæÍU±bEEEEiÍ5e¹t#Ø©ßâÅyU×Ïtvú{Ù)S®Úýõóãjéìô777WS¦LQݺurUöØù¨U«VY.Ýq®T$Éëõê§~Ò3ôà¸>77W!!!úüóÏÕ¾}{kûرcÕµkWeee©k×®7n\Y.ÛWZ?¯×+¯×[KŸÒþ.]ºT/Vvv¶F©å²q¥õ[¹r¥VZ¥¬¬,M4I(Ëe£®´¿´}ûvÍ;·¬j$;õ»ü3#æºÒþ&&&jñâÅZµj.^¼xÕöØîÿ¯¼^¯6oÞ¬Gy¤,í8×
-*+W.ß÷)))òx<zë·ÔªU+uëÖM3gδ&û5kÖ(!!A+WVBBV¯^íIJQÚú!¸¶¿K,Q-T¹reõêÕK×\sË6Fië·`ÁÕ¯__!!!*W®êÖëIJQB¥íï
¯wÞyÇåçJ~~T¯^]U«VÕwÜ¡#GõQ
-¥íï¼yó4cƵhÑÿ3ÈÞÿ¯þy1¢¬j×
-*G*UÒc=¦9sæXÛ©=zÈëõªG:qâ5ÙgffªvíÚ¤ZµjéÔ©S¬ßiWZ?»ý=vìúõë§3gõÒ`§~G+WÖ°aÃòÝæ¸ÒþN8QCQ÷îÝZº®´~^¯WYYYÊÈÈP³fÍ®ÚglMw¥ýýöÛoµfÍU©RE
-4(ôeOW»?7mÚ¤5kªN:e½tGwzþæë?Îy'ÓËkÕª¥Y³fiäÈ
+IHDR z " ¯ Ë bKGD ÿ ÿ ÿ ½§ IDATxíÝy|wúÿñ÷µÓRSí()Ai"ÛW(UL§ZK¤c¨ -Ði«k±M¢ÆÚjé6D¥_ZÔRJýÆV:¥¾E{9¿?"·Ùää¾Ï¹óz>y8¹Ï}îÏ}®^ï¤×Ùâs¶k×N ß·qãFW||¼Õç ðùY} ÏbÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ ±tÐs87´ýFdff*""¢ÄÇ)effZ²6 ÜÐ çp8´dÉm'NôÈ`Óé,ñ1,Y¢æÍß/^¼X
+6TŤ5kÖHʾO9_¹eee)>>^uëÖUÅÕ¨Q#½ûî»Æõ9·ñóóSíÚµµ`Áãº<u ³Üð3zS¦L1±ß~ûMóçÏ÷øIyBJJÂÃÃï?þøc}þùç:sæÆ£>}úHÊ*ó,´jÕ*\¹RçÏ×~¨ÔÔT}N§233¬g}ÖØ®Ò¹c PôõÑGI.\¨®]»æÙ'çÙ®»îºK+W®$mß¾]ÁÁÁ*_¾¼Ë³g¯½öªVªêÕ«Ïå\ïp8ò½~Ï=jÕª*V¬¨
+hÃ
+yÎaóæÍ
+4¾÷Ýwu÷ÝwËÏÏOåÊÓwÞYèý9s¦æÌ£ûî»O*TP`` æÍWàþ5kÖ4.êo¾)ôø PZnxÐ{î¹çôæoÊét*11QÏ<óL}N§®\¹¢
ê¹ç$=ùäêß¿¿Î?ïò¿¿¿~þùg-X°@#GÌs¬ü®ïß¿¿~úi={V8p`Û¥§§«J*.Û*W®¬ÁkæÌ
ÞÏ£Gª~ýúÆíò{y§ÃáP¹råÔµkWM8ÑØ^¥J<y²Ðã @iqÄÅÅ9ãããÝÛÙáÓéÔc=¦ZµjéÄZ¼x±±]&O¬'êÈ#ÊÊÊÃáPVV*T¨ 3gÎèæov9Þ+WäçççrüÜÿæw}
+\>ì$gÜjÖ¬©½{÷êÖ[ouÙ~ñâE\¹R/¼ðöíÛç¾å¨]»¶RSSaïú}r.;N}ùå8p öïß/I:}ú´6l¨cǹUW ðâ}êæ#ô¯ýKÃÏs]\\æÌ£sçÎé£>2£Æ+))I/_vÙ?g+H~×éwÞ1¼~Ȥx@{÷î5¾ÖñãÇc={¶Ðu¨¿ýíoÚ·o®\¹bqÉ9¶$íÛ·O¡¡¡
î ¥¥X^Û¶måt:Õºuë<×ÅÆÆªW¯^ºã;´mÛ6c{rr²uÓM7øS:ß{ï=Í?_·Ýv[¾/©¤>}ú(--Íø¾iÓ¦
+
+
+RÕªU5nÜ8-Z´H\nûò?þñµiÓFíÛ·WåÊõè£ê½÷ÞsY#çS7###5uêTcûºuëY¢û ÅuC/Ýô%¿ýöúöí«Å¾vDD.\¨òå˾6 ²-!!A¶D*T¨`É'ɲu @*æK7 ÞA lA lA lA lA lA lÆ¿£·qãF¥¥¥ö¹ ¶¦víÚºy<¼æ!oyÜÉäæ ·nÝ:¥,£æ-øÄ²jçÖý:}útÁ$o@É7À<ä
+0»yÜô$)´U#=7&¢D'es¦®²ÜÛ¼%CÞ ó7À<77Þ£ 6à 6à 6à 6à 6à 6à 6ãößÑsÇÎûµåë=<$àÔ3ýÀ7Uä
+0yÌãé¼ytÐûæ«=Úðé^µiѼÚ7Û·ëlÆÓ7Eä
+0yÌSyóè 'ImÂZèåØXOðZoÏÐOy伡¬!oyÈ`ÒÈïÑ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐó ÿºV$)óÊE
+fõi¸-jè0e^¹bõiÀÇ·â!o(òV<ä
+ÅAÞ¼ÌÒAÏ¿nÞ[¶,϶ü.týìrý´¤Ùyn·fÝ:ù×
+Ðg©©7´¾¥]{öè·ÌLuz¼±ýçcÇôp¯^ªØ@÷ê¥ËsÛ«>VPÓ&Æ÷þu\¾î ɳ=·¬¬,%$NV£°ªpq}AÛÝ©Î:ÕîÑ}ZkÉÆuÍܧ«\oÒCÞò*(oe$·ëó¶ò³Ï®êõêëþváZùÙç
kõëÞ^5èÏOüE¿8}ÜO>QØCu{ý@µíÚMë6l0CÞ|yË« ¼Ôó¹7¼åUPÞÞ_µJ<ؼ?£·èýôß#G}ûï¼#§Ó)Iú-3S?ø Ï>Ióçë;köü_ßÓ²²òóóÓ7Û¶)¤Y3cû?ÞWËÐPýøÝNµ
+Õññyn»ì£Ô&,ÌøþÔ¯/_
¦yÂeûõ&ýëm½¿jÞwNØoìSÐvɽúúá Nìß§iÆkä/ÛÛ
iÙGÝhPäÍUAy+(#¹]·¡±±?v¬|¿[ã^~YÃF*ôXÏÆÄ(þ¥ôã®ï4tÐ ½ôfv¦?üøÍ6UÿÝõ÷ï§A÷!o¾
¼¹*(o
õ|ò¢7Wåíßk¿ÐòwçéÇïvjijÏh y³5˽ ¯Õó/üCYYYź}³Æ÷éÓ5k$IKW¬P§öá.×þïõÓ£J6MGþY~üÑíõ¿ýnÚtéªõê«M®Ú¹{·$i˷ߪyûªuoc½2n¼±ÿÞýûõPº½~ B;<¨M[¶æ9¦Ý ½2n¼jÝÛXÍÛwÐo¿$½l<"Ôúá.êÑG3ßyÇx4#mýz
+R¥J4$*Jëþw}coÛ±CõêÖÍ·NoM®ÁýkAe$Í[´H¯£Fr8En®ÿõn¯^ݸ\¯n]mß¹³ÐýáYäͽ¼¹ãú¼ýñÎ;%ÉÈHí»î*ôö95ÈÙ?5-M4wú45
+T¥JÔ¾MÝ|óÍÆmÈo!oîå°ÏAÞPòæ^Þfüs¢þxçrøù©_9ÝQ³fc7û°|ÐkP¿¾:´m«ÍI.Öíÿ6`þ9ý_r:z;y®]7Ì$/X¨áÃT¾\9Å>7\ɺ½þ³11ê×'BwîP¿>zfd$鹸ѥ[·è?\È¿Ô'"õßÝ»ÿÒÆ#×»«V-غEO=Ù_ÏÅξmT~øv»Úµn¥S?T»Öt`ÛVãSgΨzµj¤Ûüýu:##ÏqO>ßåórÓò¿µªjÞ~{u¤£ÇiÝ
+º£Ñ½jÚ¦>Y½ºÐíRÑõ²ÝvO=õ~r^ÿÇÆößýîwJ?uªÐsg7÷òæëóÿ¦N5hpt´þùÆë
Þ~Òoêï/¾¨»6Óë×ëô3.×ÿrü¸ú
+¢qc_6¶7ßBÞn,oùõ|ò¢7÷óæ_7@hÐPÏÄ7ßÈs\òfz4$jÖmØ ÿ·wËöJ+êü
Æ÷ç/\P¥J\ö©{wmý¡fMżü²ê¨Öþ`\wùòe-XºT*ÿºðìP-XºT/_vký½û÷«_Dn¾ùfõíÕKÿÙ·ÏØþ^=uÓM7鯽{ûïܽ[ÏÑ4T¯QÚÿÃùÞßÜ·Ý»¿¤ìæt¿Ò6|%ÿºJÛðî QÒ»ïJªÞz«N¤§KN:¥ª·Üç¸þU«ºÔ+G|â$=30*ßsÉê-·(¼ukÚñÞzõUãFAÛ¥ÂëãÔ~ð>X0_c^{ÍØ~þüyUó÷/ò¼àYäè¼¹ãú¼ýíù3e²ýçÿ))1QCFü½ÐÛ?òpg}·a½~Þó½:´m«ZwÜa\·uÇuz¼DE©KÇÆvòæ{È{y+¨çs7¸¼¹·S?ÔÏ{¾×?ßx]O??"ÏqÉ}xÅ çp84é×õ÷_tÙÚ\§O×ùtþÂM>]BCóÜþÙA5gþ=ýä.Û¯\©àfÍ\Þ«¤å+Wºµ~ý{îQÊòåºxñ¢,]ªõëKëÕSÊòåºtéÞ[¶Üؿɽ÷ê_oMÐÑïwÍÜ·
+¬WORvó>30J«¥(mÕJõЩjp¿~¤ðÖõvr²._¾¬·Õ®uë<Ç
+nÖ,ϯ6oVfæ5mÜ8ßsÉ
-¼m£¹ÿ-h{ê'ÓËÒýMyxy+:oî¸>o'¯>n<ºèt:õ}ûôb|¼<ýÚy)rà Mzó
+õîÞ=ÏmÈo!oEç¨ÈÜCÞÎÛèW_38ðóóÓ¹óçó¼ÙWzRöëÿÒ«§Ë¶) ÚñÝ.Õi®z!͵s×nMç¶-CCuêjÑ<Äeûìwçë©ëþÇí©~ý4'7Ñæ·þÔñãôî|ÕnÒTóRiÚøì×OON×ôÙs¢5öO2Y?ø@uï.ôû~üéCôvr²&'\ûPÍ[·)48X§NÕª.·yuÌhmØ´Y¼¯¾Ú¼Y¯½0&Ïq{<ò6lÚä²-~R¢D
+pÙûÜr_~}ÌM5KwÝÛXq¯¾¢é&º=GAõϽ^µ{4pøsÿÊXcûúÕóÏÎ÷6(]äð¼Ü®ÏÛ¤7ßÐß_|IµÝ«Ø±cøæ
+'öý«ëÖUÃ~J=z<©ýúûç~d¼ùòVxÞêy¼Á}äð¼5nØPm»vÓÝMiòÛ34gê<Ç%oöásÆçó ¹%$$hÿѯôÜB÷3u¥§üõrl¬'ÏÑVüëÜÐûnÄoz:úy%OZ*Ç÷´¨¡Ã4kr¢Ê+gõ©HâÛ3ôÓÅ=nå㦬º"oæ!o×·ü7Ï!o×·ü7Ï!o×·ü%$$¨¼'OÖªP¾¼ÏRO+p=ò¼æ!oöá5/Ý,+JëÑ y7À<ä
+0y;ô Àfô Àfô Àfô Àfô Àfô Àf<þwô¶lÿV3fxú°×Z¿iê4½ÅµÉÊò¼æ)¼ytÐkROg3.è¿ç÷xò°W»»É-jÞ²éë7Eä
+0yÌSyóè ÚªB[ÿ(È`ò¼Á{ô Àfô Àfô Àfô Àfô Àfô Àfô Àf<úwôvnݯ-_óÇ-Qö4
+©gú%o(«È`òÇÓyóè ÷ÍW{ôå§{Õ¢EOðjÛ·o×Ù¦ÿ"$o(È`ò§4òæÑAOZ´h¡ØØXOðZ3fÌÐÉÖ<òHÞPÖ7À<
ä
+0Oiä÷è Í0è Í0è Í0è Í0è Í0è Í0è Í0è Í0è Í0è ÍØbаú2¼æ!oyÈìÆÒA/--M]ºtQ`` |ðA}ôÑG¥¾fIB<jÔ(íÙ³GêÑ£±ýرcêÕ«4h ^½z騱c8UÀ£ì· ãðVvÉÛ'|¢Î;+00PݺuÓ
+<qªGÙ%o«VRÇÉ<ÆÒAoÄ<x°¾ûî;%''kíÚµVNN§üüü´mÛ65kÖÌØ¯ÐÐPíܹS¡¡¡·ð,üÙ%oÔÁ-<3 hvÉÛ'|¢©S§ê»ï¾S¿~ý4|øpÏÈ]òöÅ_hÞ¼yÚ¹s§yæò³tЫZµª?®Ý»w«FJLL4®Ûµkºvíªúõë«k×®Ú½{·$i÷îÝzäGT¿~ý<¦lذA<ð,Y¢ýû÷«gÏÆ£;[·n5ö/èÙ ?^7Vôí·ßJ eË©K.êÓ§ÞyçãëׯWTT*Uª¤¨¨(_¿¾Tê]òø»ämÚ´i
+T¥JÔ¦MÝ|óÍ¥R/ $ì·'êÎ;ïÊ+§5kJ½PvX:èÍ=[?ýô^}õUµlÙRï¿ÿ¾q]LL"""´cÇEDD(&&ÆØþøãk÷îÝ.êðÁzùå5wî\õîÝ[#GTdd¤víÚ¥_|Q£F2ö/ìZµjiË-êß¿¿F-IÒöíÛÕªU+<xPZµÒÖ[c9sFÕªU$ùûû+##ÃóÅJÈ.y|Ýòvüøq
+2D/¿ü²Gëxò
+jôèÑzã7<^+-å\¼nݺzíµ×$I{÷îUdd¤üqIÒþýû¡Ê+«W¯^zýõ×%IûöíS>}T±bEc5J³fÍRãÆ%e?RcÚáp¸uN={öTåÊÕ»wocÍÜÖä\ ÑØ±cÕ¯_?ÝzëJOOWõêÕuêÔ)ÝrË-Å- Pjì7ÀØ)o;vìаaÃ4bÄuìØ±Xõ JòvðàA]ºtI©©©1b¾øâbÕ,~FïùçסCô믿ê?ÿù²²²ëî¹ç-_¾\/^ÔÒ¥KU¿~}IR`` -Z¤_ýÕåXIIIÑç.Iº÷Þ{5aÂãHÊ/¯_~ù¥ÀsZ¾|¹.]º¤åË«^½z²C¥\¹R:xð ÊÖ[+99Y/_Vrr²Z·ní¹"b¼¾À.y[´h
+¤7ÞxCÝ»w÷\ ²KÞ^{í5¥§§KüüütþüyUe¥^4pà@5nÜX.b2nÜ8Í?_M6Õ¢E4~üxcûÒ¥KÕ¨Q#GFÚµk§yóæéW^Ñܹs5yòd}ðÁ
+vy
+õO<¡ðððßïsäÈ
(99Ùå|¶mÛ¦àà`9sFU«Vu¹ÍèÑ£µyóf5iÒD7oÖ1c<V#ÀSì·ÜÇçÓ7áì·1cÆèäÉêß¿¿±Ö
<V'Àì·
+ª[·njÖ¬fÌ¡)S¦x¬F(qqq΢>%2!!Aû~¥çÆDºß©+u9Ý_±±±<GÓð> ܰ3fèäÅ=nå㦬ºE~*+y
+FÞ¼¡8È[ñ7GiäÍ0 p
+^.<ú¼æ!oyȼ Ø Ø Ø Ø Ø ØLy+ݾ}»6mÚdÅÒ¶qÿý÷«E
îCKÎ:{;ú äÈ9È$òfò¼Åª¼Y2èmÚ´I_~ù¥ÚµkgÅò>oãÆÊÈÈ(²a¨sɸ[goGy3yDÞÌBÞ 7³X7K=I
+W||¼UËû´>|Ø}©sñÝH½}P|äÍä
+y3yDÞÌbeÞx Ø Ø Ø Ø Ø Ø Ø Ø Ø Øí½ÌÌLEDDX}EPff¦Õ§QlÔ}`ê>0uD
:{Oz#ßíK.UãÆU±bEiÍ5yöY²d7oîr¬¯Ü9¢6mÚ¨R¥JjÓ¦9âÖcÇu9VîË»wïVýúõõöÛo»¬íçç§ÚµkkÁƾ!!!Z²d»%)Ô}`ê>0uD
:{ô
+²téR-^¼X:t¨"##óì¢ððpã{§Ó)§Óg¿#GªmÛ¶:sæÚ¶m«"ר²efÍï¹]»VÝ»w×ìÙ³5dÈõ333¬g}ÖØ®®¨3$úÀ,Ô}`ê>0u6OzK,Ñ}÷ݧÊ+«S§NúÝï~gÍ7+00°ÈcY³FÑÑѪ\¹²¢££µzõêB׸t颢¢´páÂ<Ç7obccµzõjµk×®À5kÖ¬i\Ô7ß|SäyZ:C¢ÌB!Ñf¡Îè³Pgó·ú<áØ±cêÑ£¦LçºôôtU©R¥Èc¤§§«F¤êÕ«ëÔ©S
®§¨}ûöy5lØ0Í5KuêÔÉs]ÎSÄ*TÐòåËíUªTÑÉ'<O+QgHôY¨3$úÀ,Ô}`êl~FOÊü[¶l©èèhýùÏÎs}µjÕtîܹ"ãïï¯ãÇKN8!ÿB×2eFa4@î×ø¦¦¦*:::ß§tN§²²²´zõj=ÿüóÆösçÎé¶Ûnsó^:C¢ÌB!Ñf¡Îè³Pgsùô ¤GyD3gÎTß¾}óÝçÐÞ½{<VǨK.)11Q>ø`¡kdee¹¼n8÷ëCCCªØØXÍ9³À5sTöíÛ§ÐÐÐ"ÏÓ
+Ô}`ê>0uD
:Ïg^ºyý§í8N=õÔS¤Î;ÛÏ=ëòo>}füÇÈïvN§&L ÝrË-
-ÕñãǦ'N(44´LÖk+þnݺUqqqzöÙgu×]w~±²S?¯×«óçÏkùòåºÿþûuðàÁÀ/¥r¥ý9s¦¼^¯Æcís5þÇîÏë®»NÏ<óªW¯Ø
âØùÿUÏ=¤5kÖhÈ!úÃþP&k6Ý|L<YÉÉÉ]¤\÷/^¯W£GÖúõëµsçN=øàòz½Ö gÏJIIÑ
¢=z8¼b³W?·âú;oÞ<Ýyç3g
-äðjÍS\ýtüøqIRHHÎ9ãärQJÅõ7777ßû+®Æ!¥(%ýùqúôi½ðÂrh¥¸Åõ·W¯^þÿÿóò¯üJ
-6(''GmÚ´qp¥Î¸jIÚ¼y³:vì¨ÌÌLÕ¬Y3ßuÉÉÉJKKSµjÕ´aÃÍ1áU«¨úåýk-üåàTTzè!ýðúí¶Û¬þ={Ö¡©¨úµjÕJQQQªQ£¦M¦E9´J\©¢úâäçG:uôùçó^ TTgÌ¡äädUZU=öÞ|óMVi®âþ}<y²Xó\õÒ¯â~µeËIR=
-<crã7jóæÍ[[0°S?~h>úkúÅÇÇ+>>>`k}vú[ã¸ÿ¾¸þÞpÃ
-Z¿~} ìþûòÙgd]ÁàªzF @p`P ` ÆaP ` ÆaP ` ÆaP `ã?ðqË-6mÓË(TZZBCC^F¨»Ñ_{¨»Ñ_{¨»Ñ_{¨_Ù0zPiÚ´©Î=«Ý»w;½B
ªuëÖN/Ã'êçnô×êçnô×êçnô×êWvT¢¢¢åô2õs7úkõs7úkõs7úkõ+;¼G qT A qT A qT A qûýû÷káÂ
N¾LíÞ½[mÛ¶õë1©»Ñ_{¨»Ñ_{¨»Ñ_{¨YT¢¢¢íĩѶm[uèÐÁoÇ£~îFí¡~îFí¡~îFí¡~æqdPQLL§vêçnô×êçnô×êçnô×êgÞ£ À8* à À8* à À8* à À8~ÿ/¾øB³gÏö÷a¿IOOW£VÕ97ùéÈàù |D>ü:¨´j×Hg²Ô÷ûó°_ÝÔ²nîØ´ÌÏK>Èàù |D>ü:¨DwjªèNe` À7òøF>pµâ=* à À8* à À8* à À8* SâÏQÙ³ãR_^ȵ FÙþù~uíаDû\mÈàù |+M>J4¨ÄÄÄèôéÓRuA¥KûêÖ[±û\Èàù |+i>$É3qâDobbb %Ä{T A qT A qT A qT Çëýýïïô: @´~ýzý?¹.t? IEND®B`
\ No newline at end of file
+ÕâÅ%É5òÓ¸qc¥¥¥©S§N:}ú´F岿wÜ¡©S§û¯[·.ß7¥:C¢ÌB!Ñf¡Îè³Pgïà^~¶SØöÜz÷îí2Ñt?þñúꫯµFî}r_ÐÜ:Ö-[\¶uD
:C¢ÌB!Ñf¡ÎÞÃ'½¨P¡1å{3_8ÇÂPgHôY¨3$úÀ,Ô}`êìY>ý= @^z `3z `3z `3z `3z `3z `3ý½7jܸqV-ïÓÒÒÒT§N·ö¥ÎÅw#uövôAñ7s7HäÍ,ä
+y3y³dÐ
+
+RFF:dÅò>¯N:jÑ¢EûQçq·ÎÞ>(òfò¼
¼A"of±2ozaaa
+³bé2
:C¢ÌB!Ñf¡Îè³PgßÅ{ô Àfô Àfô Àfô Àfô Àfô Àfô Àf,ù;zÛ·oצM¬XÚ6î¿ÿþ"ÿø"u.9wêìíè#oæ oÈYÈ$òf«òfÉ ·iÓ&}ùåj×®Ëû¼7*##£È¡Î%ãn½}P2äÍä
+y3yDÞÌbeÞ,ô$)<<\ñññV-ïÓtøða·ö¥ÎÅw#uövôAñ7s7HäÍ,ä
+y3yã=z `3z `3z `3z `3z `3z `3z `3z `3z `3z `3¶ô233aúºÊÌÌ4}]«PgHôY¨3$úÀ,Ô}`êìY>1è9·ç|dÉ%jÞ¼¹ñ}VVÆ«;ï¼S~~~yn;vìXm¹/ïÞ½[õë××Ûo¿í²¾j×®ûhÉ%7vG-F!Ñf¡Îè³PgHôY¨³÷ðA¯ N§SN§³Ð}RRRn|¯ÅëóÏ?×+W\n¿eËÍ5+ßã¬]»VÝ»w×ìÙ³5dÈsÈÌÌTrr²}öYc{xx¸RRRyϼuD
:C¢ÌB!Ñf¡ÎæóéAÏ7oV`` ñ}RRÞzë-Ýwß}.Sÿ¥K¥
æ9Ƽyó«Õ«W«]»v®U¿òù ðIDAT³fMãr`` ¾ùæÝïG!Ñf¡Îè³PgHôY¨³gÙ~ÐKOOW*Uïúé'Y³F7ß|³êÔ©£?üP§¨}ûöy1lØ09RuêÔÉsÃáP¹råÔµkWM8ÑØ^¥J<yÒówÈKQgHôY¨3$úÀ,Ô}`êìY¶ôªU«¦sçÎßûûû«cÇ:uê¦O®ÁK¦L¢#Fä~Ô 55UÑÑÑù>¥ët:¥Õ«Wëùç7¶;wN·Ýv[iÝ-¯C!Ñf¡Îè³PgHôY¨³gÙ~Ð{à´wï^ãûN:IRÆÈÊÊryípî× *55U±±±9sfk?~ܸ¼oß>
zîx9ê>0uD
:C¢ÌB=«¼Õ'à®ë
?eÇétæû);׿ɳO>JKK3þã½õÖ[zâ'ôØc©víÚ;w®[ë7nÜXiiiêÔ©N>Q£F¹¬{ÇwhêÔ©ÆþëÖSddä
+ÞKëQgHôY¨3$úÀ,Ô}`êì|bÐ+èzúäIêÝ»·úöík|_«V-[·Îíõr_ÐÜZË-.O ûê>0uD
:C¢ÌB½Oz%Q¡B-^¼ØôuXÓJÔ}`ê>0uD
:{íߣ e
+ Ø Ø Ø Ø Ø ØeGoãÆ7nUËû´´´4Õ©SÇ}©sñÝH½}P|äÍä
+y3yDÞÌbeÞ,ô¡CY±¼Ï«S§Z´hQä~Ô¹dܳ·£J¼¼A"of!oÈY¬Ì%^XX¬XºL¡Îè³PgHôY¨3$úÀ,ÔÙwñ= °= °= °= °= °= °= °KþÞöíÛµiÓ&+¶ûï¿¿È?¾HKÎ:{;ú äÈ9È$òfò¼Åª¼Y2èmÚ´I«VR³fͬXÞç}ÿý÷ÊÈÈ(²a¨sɸ[goGy3yDÞÌBÞ 7³X7K=IjÖ¬lÕò>-%%Åí}©sñÝH½}P|äÍä
+y3yDÞÌbeÞx Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø ØOzN§SË/W¿~ýôÐC©oß¾úì³Ï,9 &èÀÊÌÌÔСCí'NÐðáÃõÐCiøðá:qâ%çW¾Pç:_(¾ÐäͳÈu|¡Èg7ëøB7Ï*ëyóAoéÒ¥Z½zµ^|ñE}òÉ'?~¼vîÜiɹ8N9}ÿý÷jذ¡±}ÆjÒ¤VZ¥&MhÆ_IøB×®]«µk×ZrNe
/ôyó,òf_èòæYäÍ:¾ÐäͳÊzÞ|bÐ[±b
bccU¿~}/_^µjÕRll¬qýÞ½{5hÐ uêÔI
+Ò¾}û$eOëS§NÕC
=$I:|ø°ªzHýúõÓ®]»ò¬Õ¡C%%%©K.êׯöìÙ#IZ¾|¹:tè Ï>ûL
+Rtt´Þÿ}ã[·ªgϪX±¢zöì©[·vY<ÎêÒç}@ÞÈ]øB7òf¾Ðä¼yOzÇ×Ýwß]àõãÇW·nÝ´råJuëÖMãÆ3®kÐ ñtqBByä}üñÇ:t¨&Lïñn¿ývX±B=ö&N(IêÑ£>üðCkíÚµ
+Ö+G222TµjUIÒ·Þª³gÏzä¾ÉêÒç}@ÞÈ]øB7òf¾Ðä¼yOz5jÔÐ?þXàõV×®]U¹reuéÒE6®{ðÁåç}7÷ï߯qãÆ©sçÎÓO?ýïñ~øaUªTI]»v5Õ¡C=úè£Ú¶m:tè mÛ¶©{÷îZ±b
$é÷¿ÿ½N>-I:sæ~ÿûß{ä¾ÉêÒç}@ÞÈ]øB7òf¾Ðä¼yOzÝ»w×øñãµoß>]¹rEGÕøñãëk×®ÿûߺ|ù²>ýôSGÊ+g\®W¯F¥O?ýTk×®Ujjj¾ëåë³Ï>3µvíZõìÙS&MÒÌ3Õ[7]»VÝ»w$
hÙ²eúõ×_µlÙ2F)J/Ô¥Ïú¼7»ð
> oäÍ.|¡Èyó¤òV;zõê¥råÊéÕW_Õÿýßÿ©fÍêÛ·¯q}LL&L )S¦èî»ïvypn/¼ð5iÒ$ýúë¯ïS¸ÇS÷îÝU£F
+=ÚØ¾{÷n=õÔSÚ¹sgGX~úi½úê«úÓþ¤
+è¥^òÄ]7/Ô9÷k«s.µ§áK/ôy»¼ù6_èòv
+yóm¾ÐäíòVr>1è9õèÑC=zôÈ÷ú
+jÎ9y¶_ÿì®»îÒ[o½UäzÖàÁól>}º$)888Ï#,·ß~»¦MVä±½/ÔÙ!ô6¾ÐäíòæÛ|¡ÈÛ5äÍ·ùB·kÈ[ÉùÄK7 îcлNYðF!Ñf¡Îè³PgHôY¨sáô Àfô Àfô Àfô Àfô Àfô Àf¼ú¦ÿý÷Ú±cÕ§aª{ï½WÍ53uMê>0uD
:C¢ÌB½Wz;vìPÒwIR;«ÏÄ$¥Ès¦7uD
:CÊîïÊRè\¤5y£Îرc¬>
+SEZ7êì]¼zÐ$
K·ú$L i§Ek:>0K¸¨3h:(x Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø Ø½=ÇÕ¯r%}xÝ
uùí_%íô¤¹¶ÔFR¥«ÿ)æñ½Õuväúu¬î¥Kª()HÒbßÛY]çÅÊþuörV·A±%8¶/°ºÎñ+Î8N9N]¹rE{÷îÕ£>êr]~ûÇ9sÔ¬Y3U¨PA_ýµ±ÝÏÏOcÇÕ#GUìã{;«ë³~Î×'u|of¯AO.KzKÒ RZ#KÙûZÒ¹¶ÔVÒ«ÿÆÒúÞÀÊ:;¯~ÁzVöÁRe!J,¥õ½uþXÒçÊþ¹6FRRZE²²
+$i¤Y¥´®7±ºÎNñkÎ8UªTI#GÔìÙ³Ke
+???eee©eËÚ¼y³±}ôèÑPçÎU®\99öû¬³Ãá0¾Zµj¥3fÊúV²ß £\ në'éwÊ~HoÓÕíW¯{GRSIí$MѵÝÖHTùê¿«Kp¾Â:ÃûXÑK$ݧì¼uºz{»³¢ÎïJº[Ù¿-ÊIº³ç °¢
+.I´°kû«~½Ý*©¤?I:\sg\¹r¥Ø·u:JHHÐùóçµwï^µhÑB-§Ó©'|R;wîTZZn<c5xð`9R»ví²í³y׳¢Î¹½ðÂ>}z±ÏÁ[ÙoÐs(û¥ÏIYãÔt\Ò0I¯n.éAe?Ôö ¤ºö°[º¤W/Wtªë{;+ëïá
+}pLReÿß]Y]g²êÁ%\%beÄI ©} ÖõVÖÙ©ì'ÏJºWö~¡·s:º|ù²&O¬§~ºØÇùñÇU£F
+M:UIII¤ÄÄDU«VM©©©r8JMMUõêÕgîîºë.uìØQ.\СC\^Òh7VÖ9GëÖ®þ¹D÷Å·ú<® a ¤sÊ~LW/W.ä8$ݤìÒ¸º-w_ä\®.iª²_:æ¯ìê5ýÛÿÏÝXYgx«û`³¤I¯Iú󸱺ÎNI%ôWIûnàÜá1V¶Á«ëçÞß®½Y7Iº]Ò+Ê~vÖ(èå/_V*UtîÜ9IR*UtéÒ¥3wî\]¼xQsæÌÑ?ÿùOI®ï5˹|âÄ
+6LÓ¦MÓ©S§´fÍÅÅÅ©cÇ;w®>üðÃ|ï묬sW^yE11ö|¿ýÑ+HIo*û'ó¹«Û²ÿ<eÿÍ;]Ýæô¼¤
u¶)ûÅûN]ûéÜQٯ˸tõß=xþ¾Â:ÃûÑIQöCî}=yò>Ä:G+û,)û7ÆYO<<Å6ÈëûÆì:äÆÌ_o§¯?È#gOZ¿~½Æ£*Uª¨J*3fþ÷ÿ·Àýû÷ï¯nºIO>ù¤öìÙ#){¸4iÂÃìٳgËápÃÇêÕÙïýÉNÊÊË7s3£Îô?ÿó?*_¾¼¶oß^ê÷É
+egÐ-i«²&»]Ù?a{Ïç!e?̨ìÿ¡Ìñ²?"+]Rµën3AR¤[$}©ìwr5fÔ9÷ÇñÑdÞÉ>xJÒ/:ëZ+ù©û3êÜTÙÿ·YUÒ8I<pÞð(3Ú æþz»CÙÔRÞé+
+¤ýòË/úå_¬A
+þØ:uêèÄÖàÁíZµÒ×_jÕª)==Ýå6#GTLLÎ;§É'kÀ¥v¼u²ÍKLL,ûà
+ìõÒÍÂð¨£ìOsWÂÕ¯ëm¼úïÊûÝýÜsÙ{`Ë;Ñæ°ºÎQW¿`)«ÛÀÝsñuV×Ùεõ%
}Êå¡CÔ¹sg·§¸¸¸<ÛÃÂÂ$I©©©JMMu¹îèÑ£
+w{
+_eu%©}{{¿ó¸ì<£ e^~xHÍÔ}`êÑf¡Î
+Æ
+CÆ 6à 6à 6à 6à 6à 6ãý0}£¤qVIÒ$ù[´6uD
:C´Y¨3²Ê«½F)ò\¤´Ãê31¿Ô¬Y3Ó¥Îè³PgHÙ}p.2²,µey£ÎhÔ¨"##>
+SYöû:{¯ôdõiØuD
:C¢ÌB!Ñf¡ÎÞ÷è Í0è Í0è Í0è Í0è Í0è Í0è ÍXöwôöìÙ£«÷i;vìPpp°[ûRçâ»:{;ú øÈ9È$òfò¼ÅʼY2è)##Ã¥m!88X-Z´(r?ê\2îÖÙÛÑ%CÞÌAÞ 7³7HäÍ,VæÍA/,,LaaaV,]¦PgHôY¨3$úÀ,Ô}`êì»x Ø Ø Ø Ø Ø Ø ØÇÿÞ·ß~«3fxú°×Ú´iê5½ÅµÉÊò¼æ)¼ytÐkROg3.èÄ
=<,àÕîir·ldúºä
+eyÌCÞ óFÞ<:è
¶j¤ÐVæÿ@ Ê"ò¼æ!ogð= °= °= °= °= °= °= °·ÿÞÎû<mei`k[¾Þ£¶-꺵/yJ¼æ!oyn$on
+zaaa:}ú´Y¢óÊ´6ÔQ»víܼ%GÞ ó7À<îæMqqqÎøøøR>% x Ø
+ Ø Ø Ø Ø Ø Ø#<<ÜùðÃ[} X·nþ?{¶¬sÔ!p IEND®B`
\ No newline at end of file
Deleted: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/hwloc.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/hwloc.am 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/hwloc.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,5 +0,0 @@
-# Copyright 2009 INRIA, Université Bordeaux 1
-
-AM_CFLAGS = $(GCC_CFLAGS)
-AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include
-AM_LDFLAGS = -L$(top_builddir)/src
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/Makefile.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/Makefile.am 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/Makefile.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,23 +1,33 @@
-# Copyright 2009 INRIA, Université Bordeaux 1
-# Copyright 2009 Cisco Systems, Inc. All rights reserved.
+# Copyright 2009 INRIA, Université Bordeaux 1
+# Copyright 2009-2010 Cisco Systems, Inc. All rights reserved.
-include $(top_srcdir)/hwloc.am
+# Only install the headers if we're in standalone mode (meaning:
+# *don't* install the headers if we're in embedded mode).
+if HWLOC_BUILD_STANDALONE
include_HEADERS = hwloc.h
include_hwlocdir = $(includedir)/hwloc
-include_hwloc_HEADERS = hwloc/cpuset.h hwloc/helper.h hwloc/openfabrics-verbs.h
+include_hwloc_HEADERS = \
+ hwloc/cpuset.h \
+ hwloc/helper.h \
+ hwloc/openfabrics-verbs.h \
+ hwloc/rename.h
nodist_include_hwloc_HEADERS = hwloc/config.h
-noinst_HEADERS = private/private.h private/debug.h private/cpuset.h
+noinst_HEADERS = \
+ private/private.h \
+ private/debug.h \
+ private/misc.h \
+ private/cpuid.h
-if HAVE_LINUX
-include_hwloc_HEADERS += hwloc/linux.h hwloc/linux-libnuma.h
-else !HAVE_LINUX
-noinst_HEADERS += hwloc/linux.h hwloc/linux-libnuma.h
-endif !HAVE_LINUX
+if HWLOC_HAVE_LINUX
+include_hwloc_HEADERS += \
+ hwloc/linux.h \
+ hwloc/linux-libnuma.h
+endif HWLOC_HAVE_LINUX
-if HAVE_SCHED_SETAFFINITY
+if HWLOC_HAVE_SCHED_SETAFFINITY
include_hwloc_HEADERS += hwloc/glibc-sched.h
-else !HAVE_SCHED_SETAFFINITY
-noinst_HEADERS += hwloc/glibc-sched.h
-endif !HAVE_SCHED_SETAFFINITY
+endif HWLOC_HAVE_SCHED_SETAFFINITY
+
+endif HWLOC_BUILD_STANDALONE
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/config.h.in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/config.h.in 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/config.h.in 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,5 +1,6 @@
-/*
+/* -*- c -*-
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
@@ -18,15 +19,79 @@
# endif
#endif
-/* Define to 1 on Linux */
-#undef HWLOC_LINUX_SYS
+#undef __hwloc_inline
-#undef HWLOC_HAVE_FFS
+/*
+ * 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.
+ */
-#undef HWLOC_HAVE_DECL_FFS
+/* Maybe before gcc 2.95 too */
+#if defined(HWLOC_HAVE_ATTRIBUTE_UNUSED) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
+# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) || HWLOC_HAVE_ATTRIBUTE_UNUSED
+# define __hwloc_attribute_unused __attribute__((__unused__))
+# else
+# define __hwloc_attribute_unused
+# endif
+#else
+# define __hwloc_attribute_unused
+#endif
-#undef HWLOC_HAVE_FFSL
+#if defined(HWLOC_HAVE_ATTRIBUTE_MALLOC) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
+# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) || HWLOC_HAVE_ATTRIBUTE_MALLOC
+# define __hwloc_attribute_malloc __attribute__((__malloc__))
+# else
+# define __hwloc_attribute_malloc
+# endif
+#else
+# define __hwloc_attribute_malloc
+#endif
+#if defined(HWLOC_HAVE_ATTRIBUTE_CONST) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
+# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) || HWLOC_HAVE_ATTRIBUTE_CONST
+# define __hwloc_attribute_const __attribute__((__const__))
+# else
+# define __hwloc_attribute_const
+# endif
+#else
+# define __hwloc_attribute_const
+#endif
+
+#if defined(HWLOC_HAVE_ATTRIBUTE_PURE) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
+# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) || HWLOC_HAVE_ATTRIBUTE_PURE
+# define __hwloc_attribute_pure __attribute__((__pure__))
+# else
+# define __hwloc_attribute_pure
+# endif
+#else
+# define __hwloc_attribute_pure
+#endif
+
+#if defined(HWLOC_HAVE_ATTRIBUTE_DEPRECATED) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
+# if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) || HWLOC_HAVE_ATTRIBUTE_DEPRECATED
+# define __hwloc_attribute_deprecated __attribute__((__deprecated__))
+# else
+# define __hwloc_attribute_deprecated
+# endif
+#else
+# define __hwloc_attribute_deprecated
+#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
+
+/* Define to 1 on Linux */
+#undef HWLOC_LINUX_SYS
+
/* Define to 1 if the CPU_SET macro works */
#undef HWLOC_HAVE_CPU_SET
@@ -61,4 +126,11 @@
# endif /* hwloc_thread_t */
#endif /* HWLOC_HAVE_WINDOWS_H */
+/* Do we need to transform all the hwloc public symbol names? */
+#undef HWLOC_SYM_TRANSFORM
+
+/* If we are transforming, what are the prefixes? */
+#undef HWLOC_SYM_PREFIX
+#undef HWLOC_SYM_PREFIX_CAPS
+
#endif /* HWLOC_CONFIG_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/cpuset.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/cpuset.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/cpuset.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,5 +1,6 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
@@ -34,17 +35,22 @@
* CPU set allocation, freeing and copying.
*/
-/** \brief Allocate a new empty CPU set */
-hwloc_cpuset_t hwloc_cpuset_alloc(void);
+/** \brief Allocate a new empty CPU set.
+
+ \returns A valid CPU set or NULL.
+ The CPU set should be freed by a corresponding call to
+ hwloc_cpuset_free(). */
+HWLOC_DECLSPEC hwloc_cpuset_t hwloc_cpuset_alloc(void) __hwloc_attribute_malloc;
+
/** \brief Free CPU set \p set */
-void hwloc_cpuset_free(hwloc_cpuset_t set);
+HWLOC_DECLSPEC void hwloc_cpuset_free(hwloc_cpuset_t set);
-/** \brief Duplicate CPU set \p set by allocating a new CPU set and copying its contents */
-hwloc_cpuset_t hwloc_cpuset_dup(hwloc_cpuset_t set);
+/** \brief Duplicate CPU set \p set by allocating a new CPU set and copying \p set's contents */
+HWLOC_DECLSPEC hwloc_cpuset_t hwloc_cpuset_dup(hwloc_const_cpuset_t set) __hwloc_attribute_malloc;
/** \brief Copy the contents of CPU set \p src into the already allocated CPU set \p dst */
-void hwloc_cpuset_copy(hwloc_cpuset_t dst, hwloc_cpuset_t src);
+HWLOC_DECLSPEC void hwloc_cpuset_copy(hwloc_cpuset_t dst, hwloc_const_cpuset_t src);
/*
@@ -58,133 +64,163 @@
* \return the number of character that were actually written if not truncating,
* or that would have been written (not including the ending \\0).
*/
-int hwloc_cpuset_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_cpuset_t set);
+HWLOC_DECLSPEC int hwloc_cpuset_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_cpuset_t set);
/** \brief Stringify a cpuset into a newly allocated string.
*
* \return the number of character that were actually written
* (not including the ending \\0).
*/
-int hwloc_cpuset_asprintf(char ** strp, hwloc_const_cpuset_t set);
+HWLOC_DECLSPEC int hwloc_cpuset_asprintf(char ** strp, hwloc_const_cpuset_t set);
-/** \brief Parse a cpuset string.
+/** \brief Parse a cpuset string and stores it in CPU set \p set.
*
* Must start and end with a digit.
*/
-hwloc_cpuset_t hwloc_cpuset_from_string(const char * __hwloc_restrict string);
+HWLOC_DECLSPEC int hwloc_cpuset_from_string(hwloc_cpuset_t set, const char * __hwloc_restrict string);
-/** \brief
+/*
* Primitives & macros for building, modifying and consulting "sets" of cpus.
*/
-/** \brief Empty CPU set \p set */
-void hwloc_cpuset_zero(hwloc_cpuset_t set);
+/** \brief Empty the CPU set \p set */
+HWLOC_DECLSPEC void hwloc_cpuset_zero(hwloc_cpuset_t set);
-/** \brief Fill CPU set \p set */
-void hwloc_cpuset_fill(hwloc_cpuset_t set);
+/** \brief Fill CPU set \p set with all possible CPUs (even if those CPUs don't exist or are otherwise unavailable) */
+HWLOC_DECLSPEC void hwloc_cpuset_fill(hwloc_cpuset_t set);
/** \brief Setup CPU set \p set from unsigned long \p mask */
-void hwloc_cpuset_from_ulong(hwloc_cpuset_t set, unsigned long mask);
+HWLOC_DECLSPEC void hwloc_cpuset_from_ulong(hwloc_cpuset_t set, unsigned long mask);
/** \brief Setup CPU set \p set from unsigned long \p mask used as \p i -th subset */
-void hwloc_cpuset_from_ith_ulong(hwloc_cpuset_t set, int i, unsigned long mask);
+HWLOC_DECLSPEC void hwloc_cpuset_from_ith_ulong(hwloc_cpuset_t set, unsigned i, unsigned long mask);
/** \brief Convert the beginning part of CPU set \p set into unsigned long \p mask */
-unsigned long hwloc_cpuset_to_ulong(hwloc_const_cpuset_t set);
+HWLOC_DECLSPEC unsigned long hwloc_cpuset_to_ulong(hwloc_const_cpuset_t set) __hwloc_attribute_pure;
/** \brief Convert the \p i -th subset of CPU set \p set into unsigned long mask */
-unsigned long hwloc_cpuset_to_ith_ulong(hwloc_const_cpuset_t set, int i);
+HWLOC_DECLSPEC unsigned long hwloc_cpuset_to_ith_ulong(hwloc_const_cpuset_t set, unsigned i) __hwloc_attribute_pure;
-/** \brief Clear CPU set \p set and set CPU \p cpu */
-void hwloc_cpuset_cpu(hwloc_cpuset_t set, unsigned cpu);
+/** \brief Empty the CPU set \p set and add CPU \p cpu */
+HWLOC_DECLSPEC void hwloc_cpuset_cpu(hwloc_cpuset_t set, unsigned cpu);
-/** \brief Clear CPU set \p set and set all but the CPU \p cpu */
-void hwloc_cpuset_all_but_cpu(hwloc_cpuset_t set, unsigned cpu);
+/** \brief Empty the CPU set \p set and add all but the CPU \p cpu */
+HWLOC_DECLSPEC void hwloc_cpuset_all_but_cpu(hwloc_cpuset_t set, unsigned cpu);
/** \brief Add CPU \p cpu in CPU set \p set */
-void hwloc_cpuset_set(hwloc_cpuset_t set, unsigned cpu);
+HWLOC_DECLSPEC void hwloc_cpuset_set(hwloc_cpuset_t set, unsigned cpu);
/** \brief Add CPUs from \p begincpu to \p endcpu in CPU set \p set */
-void hwloc_cpuset_set_range(hwloc_cpuset_t set, unsigned begincpu, unsigned endcpu);
+HWLOC_DECLSPEC void hwloc_cpuset_set_range(hwloc_cpuset_t set, unsigned begincpu, unsigned endcpu);
/** \brief Remove CPU \p cpu from CPU set \p set */
-void hwloc_cpuset_clr(hwloc_cpuset_t set, unsigned cpu);
+HWLOC_DECLSPEC void hwloc_cpuset_clr(hwloc_cpuset_t set, unsigned cpu);
+/** \brief Remove CPUs from \p begincpu to \p endcpu in CPU set \p set */
+HWLOC_DECLSPEC void hwloc_cpuset_clr_range(hwloc_cpuset_t set, unsigned begincpu, unsigned endcpu);
+
/** \brief Test whether CPU \p cpu is part of set \p set */
-int hwloc_cpuset_isset(hwloc_const_cpuset_t set, unsigned cpu);
+HWLOC_DECLSPEC int hwloc_cpuset_isset(hwloc_const_cpuset_t set, unsigned cpu) __hwloc_attribute_pure;
-/** \brief Test whether set \p set is zero */
-int hwloc_cpuset_iszero(hwloc_const_cpuset_t set);
+/** \brief Test whether set \p set is empty */
+HWLOC_DECLSPEC int hwloc_cpuset_iszero(hwloc_const_cpuset_t set) __hwloc_attribute_pure;
-/** \brief Test whether set \p set is full */
-int hwloc_cpuset_isfull(hwloc_const_cpuset_t set);
+/** \brief Test whether set \p set is completely full */
+HWLOC_DECLSPEC int hwloc_cpuset_isfull(hwloc_const_cpuset_t set) __hwloc_attribute_pure;
/** \brief Test whether set \p set1 is equal to set \p set2 */
-int hwloc_cpuset_isequal (hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2);
+HWLOC_DECLSPEC int hwloc_cpuset_isequal (hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2) __hwloc_attribute_pure;
/** \brief Test whether sets \p set1 and \p set2 intersects */
-int hwloc_cpuset_intersects (hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2);
+HWLOC_DECLSPEC int hwloc_cpuset_intersects (hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2) __hwloc_attribute_pure;
/** \brief Test whether set \p sub_set is part of set \p super_set */
-int hwloc_cpuset_isincluded (hwloc_const_cpuset_t sub_set, hwloc_const_cpuset_t super_set);
+HWLOC_DECLSPEC int hwloc_cpuset_isincluded (hwloc_const_cpuset_t sub_set, hwloc_const_cpuset_t super_set) __hwloc_attribute_pure;
-/** \brief Or set \p modifier_set into set \p set */
-void hwloc_cpuset_orset (hwloc_cpuset_t set, hwloc_const_cpuset_t modifier_set);
+/** \brief Or sets \p set1 and \p set2 and store the result in set \p res */
+HWLOC_DECLSPEC void hwloc_cpuset_or (hwloc_cpuset_t res, hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2);
-/** \brief And set \p modifier_set into set \p set */
-void hwloc_cpuset_andset (hwloc_cpuset_t set, hwloc_const_cpuset_t modifier_set);
+/** \brief And sets \p set1 and \p set2 and store the result in set \p res */
+HWLOC_DECLSPEC void hwloc_cpuset_and (hwloc_cpuset_t res, hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2);
-/** \brief Clear set \p modifier_set out of set \p set */
-void hwloc_cpuset_clearset (hwloc_cpuset_t set, hwloc_const_cpuset_t modifier_set);
+/** \brief And set \p set1 and the negation of \p set2 and store the result in set \p res */
+HWLOC_DECLSPEC void hwloc_cpuset_andnot (hwloc_cpuset_t res, hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2);
-/** \brief Xor set \p set with set \p modifier_set */
-void hwloc_cpuset_xorset (hwloc_cpuset_t set, hwloc_const_cpuset_t modifier_set);
+/** \brief Xor sets \p set1 and \p set2 and store the result in set \p res */
+HWLOC_DECLSPEC void hwloc_cpuset_xor (hwloc_cpuset_t res, hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2);
-/** \brief Compute the first CPU (least significant bit) in CPU set \p set */
-int hwloc_cpuset_first(hwloc_const_cpuset_t set);
+/** \brief Negate set \p set and store the result in set \p res */
+HWLOC_DECLSPEC void hwloc_cpuset_not (hwloc_cpuset_t res, hwloc_const_cpuset_t set);
-/** \brief Compute the last CPU (most significant bit) in CPU set \p set */
-int hwloc_cpuset_last(hwloc_const_cpuset_t set);
+/** \brief Compute the first CPU (least significant bit) in CPU set \p set
+ *
+ * \return -1 if no CPU is set.
+ */
+HWLOC_DECLSPEC int hwloc_cpuset_first(hwloc_const_cpuset_t set) __hwloc_attribute_pure;
+/** \brief Compute the last CPU (most significant bit) in CPU set \p set
+ *
+ * \return -1 if no CPU is set.
+ */
+HWLOC_DECLSPEC int hwloc_cpuset_last(hwloc_const_cpuset_t set) __hwloc_attribute_pure;
+
+/** \brief Compute the next CPU in CPU set \p set which is after CPU \p prev_cpu
+ *
+ * \return -1 if no CPU with higher index is set.
+ */
+HWLOC_DECLSPEC int hwloc_cpuset_next(hwloc_const_cpuset_t set, unsigned prev_cpu) __hwloc_attribute_pure;
+
/** \brief Keep a single CPU among those set in CPU set \p set
*
- * Might be used before binding so that the process does not
+ * May be useful before binding so that the process does not
* have a chance of migrating between multiple logical CPUs
* in the original mask.
*/
-void hwloc_cpuset_singlify(hwloc_cpuset_t set);
+HWLOC_DECLSPEC void hwloc_cpuset_singlify(hwloc_cpuset_t set);
-/** \brief Compar CPU sets \p set1 and \p set2 using their first set bit.
+/** \brief Compare CPU sets \p set1 and \p set2 using their lowest index CPU.
*
* Smaller least significant bit is smaller.
* The empty CPU set is considered higher than anything.
*/
-int hwloc_cpuset_compar_first(hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2);
+HWLOC_DECLSPEC int hwloc_cpuset_compare_first(hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2) __hwloc_attribute_pure;
-/** \brief Compar CPU sets \p set1 and \p set2 using their last bits.
+/** \brief Compare CPU sets \p set1 and \p set2 using their highest index CPU.
*
* Higher most significant bit is higher.
* The empty CPU set is considered lower than anything.
*/
-int hwloc_cpuset_compar(hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2);
+HWLOC_DECLSPEC int hwloc_cpuset_compare(hwloc_const_cpuset_t set1, hwloc_const_cpuset_t set2) __hwloc_attribute_pure;
-/** \brief Compute the weight of CPU set \p set */
-int hwloc_cpuset_weight(hwloc_const_cpuset_t set);
+/** \brief Compute the "weight" of CPU set \p set (i.e., number of
+ * CPUs that are in the set).
+ *
+ * \return the number of CPUs that are in the set.
+ */
+HWLOC_DECLSPEC int hwloc_cpuset_weight(hwloc_const_cpuset_t set) __hwloc_attribute_pure;
/** \brief Loop macro iterating on CPU set \p set
+ * \hideinitializer
*
- * It yields on each cpu that is member of the set. It uses variables \p set
- * (the cpu set) and \p cpu (the loop variable)
+ * \p cpu is the loop variable; it should be an unsigned int. The
+ * first iteration will set \p cpu to the lowest index CPU in the set.
+ * Successive iterations will iterate through, in order, all remaining
+ * CPUs that in the set. To be specific: each iteration will return a
+ * value for \p cpu such that hwloc_cpuset_isset(set, cpu) is true.
*/
#define hwloc_cpuset_foreach_begin(cpu, set) \
- for (cpu = 0; cpu < HWLOC_NBMAXCPUS; cpu++) \
- if (hwloc_cpuset_isset(set, cpu)) {
-/** \brief End of loop
+do { \
+ for (cpu = hwloc_cpuset_first(set); \
+ (unsigned) cpu != (unsigned) -1; \
+ cpu = hwloc_cpuset_next(set, cpu)) { \
+/** \brief End of loop. Needs a terminating ';'.
+ * \hideinitializer
*
* \sa hwloc_cpuset_foreach_begin */
#define hwloc_cpuset_foreach_end() \
- }
+ } \
+} while (0)
/** @} */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/glibc-sched.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/glibc-sched.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/glibc-sched.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -16,6 +16,7 @@
#include <hwloc.h>
#include <hwloc/helper.h>
+#include <assert.h>
#if !defined _GNU_SOURCE || !defined _SCHED_H
#error sched.h must be included with _GNU_SOURCE defined
@@ -36,8 +37,8 @@
*
* \p schedsetsize should be sizeof(cpu_set_t) unless \p schedset was dynamically allocated with CPU_ALLOC
*/
-static __inline void
-hwloc_cpuset_to_glibc_sched_affinity(hwloc_topology_t topology, hwloc_cpuset_t hwlocset,
+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
@@ -54,6 +55,7 @@
CPU_SET(cpu, schedset);
hwloc_cpuset_foreach_end();
#endif /* !CPU_ZERO_S */
+ return 0;
}
/** \brief Convert glibc sched affinity CPU set \p schedset into hwloc CPU set
@@ -63,11 +65,11 @@
*
* \p schedsetsize should be sizeof(cpu_set_t) unless \p schedset was dynamically allocated with CPU_ALLOC
*/
-static __inline hwloc_cpuset_t
-hwloc_cpuset_from_glibc_sched_affinity(hwloc_topology_t topology,
- const cpu_set_t *schedset, size_t schedsetsize)
+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)
{
- hwloc_cpuset_t hwlocset = hwloc_cpuset_alloc();
+ hwloc_cpuset_zero(hwlocset);
#ifdef CPU_ZERO_S
int cpu, count;
count = CPU_COUNT_S(schedsetsize, schedset);
@@ -91,7 +93,7 @@
if (CPU_ISSET(cpu, schedset))
hwloc_cpuset_set(hwlocset, cpu);
#endif /* !CPU_ZERO_S */
- return hwlocset;
+ return 0;
}
/** @} */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/helper.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/helper.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/helper.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,6 +1,6 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
- * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+ * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
@@ -29,7 +29,7 @@
* function returns the depth of the first "present" object typically found
* inside \p type.
*/
-static __inline unsigned
+static __hwloc_inline int __hwloc_attribute_pure
hwloc_get_type_or_below_depth (hwloc_topology_t topology, hwloc_obj_type_t type)
{
int depth = hwloc_get_type_depth(topology, type);
@@ -38,12 +38,12 @@
return depth;
/* find the highest existing level with type order >= */
- for(depth = hwloc_get_type_depth(topology, HWLOC_OBJ_PROC); ; depth--)
+ 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 SYSTEM level with lower order and known depth. */
- abort();
+ /* abort(); */
}
/** \brief Returns the depth of objects of type \p type or above
@@ -52,7 +52,7 @@
* function returns the depth of the first "present" object typically
* containing \p type.
*/
-static __inline unsigned
+static __hwloc_inline int __hwloc_attribute_pure
hwloc_get_type_or_above_depth (hwloc_topology_t topology, hwloc_obj_type_t type)
{
int depth = hwloc_get_type_depth(topology, type);
@@ -65,8 +65,8 @@
if (hwloc_compare_types(hwloc_get_depth_type(topology, depth), type) > 0)
return depth-1;
- /* Shouldn't ever happen, as there is always a PROC level with higher order and known depth. */
- abort();
+ /* Shouldn't ever happen, as there is always a PU level with higher order and known depth. */
+ /* abort(); */
}
/** @} */
@@ -77,18 +77,45 @@
* @{
*/
-/** \brief Returns the top-object of the topology-tree. Its type is ::HWLOC_OBJ_SYSTEM. */
-static __inline hwloc_obj_t
-hwloc_get_system_obj (hwloc_topology_t topology)
+/** \brief Returns the top-object of the topology-tree.
+ *
+ * Its type is typically ::HWLOC_OBJ_MACHINE but it could be different
+ * for complex topologies. This function replaces the old deprecated
+ * hwloc_get_system_obj().
+ */
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+hwloc_get_root_obj (hwloc_topology_t topology)
{
return hwloc_get_obj_by_depth (topology, 0, 0);
}
+/** \brief Returns the ancestor object of \p obj at depth \p depth. */
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+hwloc_get_ancestor_obj_by_depth (hwloc_topology_t topology __hwloc_attribute_unused, unsigned 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. */
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+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 next object at depth \p depth.
*
* If \p prev is \c NULL, return the first object at depth \p depth.
*/
-static __inline hwloc_obj_t
+static __hwloc_inline hwloc_obj_t
hwloc_get_next_obj_by_depth (hwloc_topology_t topology, unsigned depth, hwloc_obj_t prev)
{
if (!prev)
@@ -100,11 +127,11 @@
/** \brief Returns the next object of type \p type.
*
- * If \p prev is \c NULL, return the first object at type \p type.
- * If there are multiple or no depth for given type, return \c NULL and let the caller
- * fallback to hwloc_get_next_obj_by_depth().
+ * If \p prev is \c NULL, return the first object at type \p type. If
+ * there are multiple or no depth for given type, return \c NULL and
+ * let the caller fallback to hwloc_get_next_obj_by_depth().
*/
-static __inline hwloc_obj_t
+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)
{
@@ -114,39 +141,57 @@
return hwloc_get_next_obj_by_depth (topology, depth, prev);
}
+/** \brief Returns the object of type ::HWLOC_OBJ_PU with \p os_index.
+ *
+ * \note The \p os_index field of object should most of the times only be
+ * used for pretty-printing purpose. Type ::HWLOC_OBJ_PU is the only case
+ * where \p os_index could actually be useful, when manually binding to
+ * processors.
+ * However, using CPU sets to hide this complexity should often be preferred.
+ */
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+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 Return the next child.
*
* If \p prev is \c NULL, return the first child.
*/
-static __inline hwloc_obj_t
-hwloc_get_next_child (hwloc_topology_t topology, hwloc_obj_t father, hwloc_obj_t prev)
+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)
{
if (!prev)
- return father->first_child;
- if (prev->father != father)
+ return parent->first_child;
+ if (prev->parent != parent)
return NULL;
return prev->next_sibling;
}
-/** \brief Returns the common father object to objects lvl1 and lvl2 */
-static __inline hwloc_obj_t
-hwloc_get_common_ancestor_obj (hwloc_topology_t topology, hwloc_obj_t obj1, hwloc_obj_t obj2)
+/** \brief Returns the common parent object to objects lvl1 and lvl2 */
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+hwloc_get_common_ancestor_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj1, hwloc_obj_t obj2)
{
while (obj1->depth > obj2->depth)
- obj1 = obj1->father;
+ obj1 = obj1->parent;
while (obj2->depth > obj1->depth)
- obj2 = obj2->father;
+ obj2 = obj2->parent;
while (obj1 != obj2) {
- obj1 = obj1->father;
- obj2 = obj2->father;
+ obj1 = obj1->parent;
+ obj2 = obj2->parent;
}
return obj1;
}
/** \brief Returns true if _obj_ is inside the subtree beginning
with \p subtree_root. */
-static __inline int
-hwloc_obj_is_in_subtree (hwloc_topology_t topology, hwloc_obj_t obj, hwloc_obj_t subtree_root)
+static __hwloc_inline int __hwloc_attribute_pure
+hwloc_obj_is_in_subtree (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj, hwloc_obj_t subtree_root)
{
return hwloc_cpuset_isincluded(obj->cpuset, subtree_root->cpuset);
}
@@ -159,21 +204,52 @@
* @{
*/
+/** \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.
+ *
+ * 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_cpuset_intersects(obj->cpuset, set))
+ return NULL;
+ while (!hwloc_cpuset_isincluded(obj->cpuset, set)) {
+ /* while the object intersects without being included, look at its children */
+ hwloc_obj_t child = NULL;
+ while ((child = hwloc_get_next_child(topology, obj, child)) != NULL) {
+ if (hwloc_cpuset_intersects(child->cpuset, set))
+ break;
+ }
+ 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.
*/
-extern int hwloc_get_largest_objs_inside_cpuset (hwloc_topology_t topology, hwloc_cpuset_t set,
+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.
*
- * If \p prev is \c NULL, return the first object at depth \p depth included in \p set.
- * The next invokation should pass the previous return value in \p prev so as
- * to obtain the next object in \p set.
+ * If \p prev is \c NULL, return the first object at depth \p depth
+ * included in \p set. The next invokation should pass the previous
+ * return value in \p prev so as to obtain the next object in \p set.
*/
-static __inline hwloc_obj_t
-hwloc_get_next_obj_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_cpuset_t set,
+static __hwloc_inline hwloc_obj_t
+hwloc_get_next_obj_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set,
unsigned depth, hwloc_obj_t prev)
{
hwloc_obj_t next = hwloc_get_next_obj_by_depth(topology, depth, prev);
@@ -184,11 +260,12 @@
/** \brief Return the next object of type \p type included in CPU set \p set.
*
- * If there are multiple or no depth for given type, return \c NULL and let the caller
- * fallback to hwloc_get_next_obj_inside_cpuset_by_depth().
+ * If there are multiple or no depth for given type, return \c NULL
+ * and let the caller fallback to
+ * hwloc_get_next_obj_inside_cpuset_by_depth().
*/
-static __inline hwloc_obj_t
-hwloc_get_next_obj_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_cpuset_t set,
+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);
@@ -199,11 +276,11 @@
/** \brief Return the \p index -th object at depth \p depth included in CPU set \p set.
*/
-static __inline hwloc_obj_t
-hwloc_get_obj_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_cpuset_t set,
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+hwloc_get_obj_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set,
unsigned depth, unsigned idx)
{
- int count = 0;
+ unsigned count = 0;
hwloc_obj_t obj = hwloc_get_obj_by_depth (topology, depth, 0);
while (obj) {
if (hwloc_cpuset_isincluded(obj->cpuset, set)) {
@@ -218,11 +295,12 @@
/** \brief Return the \p idx -th object of type \p type included in CPU set \p set.
*
- * If there are multiple or no depth for given type, return \c NULL and let the caller
- * fallback to hwloc_get_obj_inside_cpuset_by_depth().
+ * If there are multiple or no depth for given type, return \c NULL
+ * and let the caller fallback to
+ * hwloc_get_obj_inside_cpuset_by_depth().
*/
-static __inline hwloc_obj_t
-hwloc_get_obj_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_cpuset_t set,
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+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);
@@ -232,8 +310,8 @@
}
/** \brief Return the number of objects at depth \p depth included in CPU set \p set. */
-static __inline unsigned
-hwloc_get_nbobjs_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_cpuset_t set,
+static __hwloc_inline unsigned __hwloc_attribute_pure
+hwloc_get_nbobjs_inside_cpuset_by_depth (hwloc_topology_t topology, hwloc_const_cpuset_t set,
unsigned depth)
{
hwloc_obj_t obj = hwloc_get_obj_by_depth (topology, depth, 0);
@@ -248,11 +326,12 @@
/** \brief Return the number of objects of type \p type included in CPU set \p set.
*
- * If no object for that type exists inside CPU set \p set, 0 is returned.
- * If there are several levels with objects of that type inside CPU set \p set, -1 is returned.
+ * If no object for that type exists inside CPU set \p set, 0 is
+ * returned. If there are several levels with objects of that type
+ * inside CPU set \p set, -1 is returned.
*/
-static __inline int
-hwloc_get_nbobjs_inside_cpuset_by_type (hwloc_topology_t topology, hwloc_cpuset_t set,
+static __hwloc_inline int __hwloc_attribute_pure
+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);
@@ -273,13 +352,18 @@
/** \brief Get the child covering at least CPU set \p set.
*
- * \return \c NULL if no child matches.
+ * \return \c NULL if no child matches or if \p set is empty.
*/
-static __inline hwloc_obj_t
-hwloc_get_child_covering_cpuset (hwloc_topology_t topology, hwloc_cpuset_t set,
- hwloc_obj_t father)
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+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 = father->first_child;
+ hwloc_obj_t child;
+
+ if (hwloc_cpuset_iszero(set))
+ return NULL;
+
+ child = parent->first_child;
while (child) {
if (hwloc_cpuset_isincluded(set, child->cpuset))
return child;
@@ -290,13 +374,16 @@
/** \brief Get the lowest object covering at least CPU set \p set
*
- * \return \c NULL if no object matches.
+ * \return \c NULL if no object matches or if \p set is empty.
*/
-static __inline hwloc_obj_t
-hwloc_get_obj_covering_cpuset (hwloc_topology_t topology, hwloc_cpuset_t set)
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+hwloc_get_obj_covering_cpuset (hwloc_topology_t topology, hwloc_const_cpuset_t set)
{
- struct hwloc_obj *current = hwloc_get_system_obj(topology);
+ struct hwloc_obj *current = hwloc_get_root_obj(topology);
+ if (hwloc_cpuset_iszero(set))
+ return NULL;
+
if (!hwloc_cpuset_isincluded(set, current->cpuset))
return NULL;
@@ -319,13 +406,13 @@
/** \brief Iterate through same-depth objects covering at least CPU set \p set
*
- * If object \p prev is \c NULL, return the first object at depth \p depth
- * covering at least part of CPU set \p set.
- * The next invokation should pass the previous return value in \p prev so as
+ * If object \p prev is \c NULL, return the first object at depth \p
+ * depth covering at least part of 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.
*/
-static __inline hwloc_obj_t
-hwloc_get_next_obj_covering_cpuset_by_depth(hwloc_topology_t topology, hwloc_cpuset_t set,
+static __hwloc_inline hwloc_obj_t
+hwloc_get_next_obj_covering_cpuset_by_depth(hwloc_topology_t topology, hwloc_const_cpuset_t set,
unsigned depth, hwloc_obj_t prev)
{
hwloc_obj_t next = hwloc_get_next_obj_by_depth(topology, depth, prev);
@@ -336,17 +423,18 @@
/** \brief Iterate through same-type objects covering at least CPU set \p set
*
- * If object \p prev is \c NULL, return the first object of type \p type
- * covering at least part of 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.
+ * If object \p prev is \c NULL, return the first object of type \p
+ * type covering at least part of 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.
*
* If there are no or multiple depths for type \p type, \c NULL is returned.
* The caller may fallback to hwloc_get_next_obj_covering_cpuset_by_depth()
* for each depth.
*/
-static __inline hwloc_obj_t
-hwloc_get_next_obj_covering_cpuset_by_type(hwloc_topology_t topology, hwloc_cpuset_t set,
+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);
@@ -367,14 +455,14 @@
*
* \return \c NULL if no cache matches
*/
-static __inline hwloc_obj_t
-hwloc_get_cache_covering_cpuset (hwloc_topology_t topology, hwloc_cpuset_t set)
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+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 (current->type == HWLOC_OBJ_CACHE)
return current;
- current = current->father;
+ current = current->parent;
}
return NULL;
}
@@ -383,15 +471,15 @@
*
* \return \c NULL if no cache matches
*/
-static __inline hwloc_obj_t
-hwloc_get_shared_cache_covering_obj (hwloc_topology_t topology, hwloc_obj_t obj)
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+hwloc_get_shared_cache_covering_obj (hwloc_topology_t topology __hwloc_attribute_unused, hwloc_obj_t obj)
{
- hwloc_obj_t current = obj->father;
+ hwloc_obj_t current = obj->parent;
while (current) {
if (!hwloc_cpuset_isequal(current->cpuset, obj->cpuset)
&& current->type == HWLOC_OBJ_CACHE)
return current;
- current = current->father;
+ current = current->parent;
}
return NULL;
}
@@ -412,8 +500,62 @@
* \return the number of objects returned in \p objs.
*/
/* TODO: rather provide an iterator? Provide a way to know how much should be allocated? By returning the total number of objects instead? */
-extern int hwloc_get_closest_objs (hwloc_topology_t topology, hwloc_obj_t src, hwloc_obj_t * __hwloc_restrict objs, int max);
+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 index \p idx1. Then look below this object and find another
+ * object of type \p type2 and index \p idx2. Indexes are specified
+ * within the parent, not withing the entire system.
+ *
+ * For instance, if type1 is SOCKET, idx1 is 2, type2 is CORE and idx2
+ * is 3, return the fourth core object below the third socket.
+ */
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+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 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, SOCKET and CORE,
+ * and idxv contains 0, 1 and 2, return the third core object below
+ * the second socket below the first NUMA node.
+ */
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
+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; i<nr; i++) {
+ obj = hwloc_get_obj_inside_cpuset_by_type(topology, obj->cpuset, typev[i], idxv[i]);
+ if (!obj)
+ return NULL;
+ }
+
+ return obj;
+}
+
/** @} */
@@ -431,14 +573,15 @@
* threads over a machine, giving each of them as much private cache as
* possible and keeping them locally in number order.
*
- * The caller may typicall want to additionally call hwloc_cpuset_singlify()
- * before binding a thread, so that it doesn't move at all.
+ * The caller may typically want to also call hwloc_cpuset_singlify()
+ * before binding a thread so that it does not move at all.
*/
-static __inline void
-hwloc_distribute(hwloc_topology_t topology, hwloc_obj_t root, hwloc_cpuset_t *cpuset, int n)
+static __hwloc_inline void
+hwloc_distribute(hwloc_topology_t topology, hwloc_obj_t root, hwloc_cpuset_t *cpuset, unsigned n)
{
- int i;
- int chunk_size, complete_chunks;
+ unsigned i;
+ unsigned u;
+ unsigned chunk_size, complete_chunks;
hwloc_cpuset_t *cpusetp;
if (!root->arity || n == 1) {
@@ -461,12 +604,79 @@
hwloc_distribute(topology, root->children[i], cpusetp, chunk_size);
/* Now allocate not-so-complete chunks. */
- for ( ;
- i < root->arity;
- i++, cpusetp += chunk_size-1)
- hwloc_distribute(topology, root->children[i], cpusetp, chunk_size-1);
+ for (u = i;
+ u < root->arity;
+ u++, cpusetp += chunk_size-1)
+ hwloc_distribute(topology, root->children[u], cpusetp, chunk_size-1);
}
/** @} */
+/** \defgroup hwlocality_helper_cpuset Cpuset Helpers
+ * @{
+ */
+/* \brief Get complete CPU set
+ *
+ * \return the complete CPU set of logical processors of the system. If the
+ * topology is the result of a combination of several systems, NULL is
+ * returned.
+ *
+ * \note The returned cpuset is not newly allocated and should thus not be
+ * changed or freed; hwloc_cpuset_dup must be used to obtain a local copy.
+ */
+static __hwloc_inline hwloc_const_cpuset_t __hwloc_attribute_pure
+hwloc_topology_get_complete_cpuset(hwloc_topology_t topology)
+{
+ return hwloc_get_root_obj(topology)->complete_cpuset;
+}
+
+/* \brief Get topology CPU set
+ *
+ * \return the CPU set of logical processors of the system for which hwloc
+ * provides topology information. This is equivalent to the cpuset of the
+ * system object. If the topology is the result of a combination of several
+ * systems, NULL is returned.
+ *
+ * \note The returned cpuset is not newly allocated and should thus not be
+ * changed or freed; hwloc_cpuset_dup must be used to obtain a local copy.
+ */
+static __hwloc_inline hwloc_const_cpuset_t __hwloc_attribute_pure
+hwloc_topology_get_topology_cpuset(hwloc_topology_t topology)
+{
+ return hwloc_get_root_obj(topology)->cpuset;
+}
+
+/** \brief Get online CPU set
+ *
+ * \return the CPU set of online logical processors of the system. If the
+ * topology is the result of a combination of several systems, NULL is
+ * returned.
+ *
+ * \note The returned cpuset is not newly allocated and should thus not be
+ * changed or freed; hwloc_cpuset_dup must be used to obtain a local copy.
+ */
+static __hwloc_inline hwloc_const_cpuset_t __hwloc_attribute_pure
+hwloc_topology_get_online_cpuset(hwloc_topology_t topology)
+{
+ return hwloc_get_root_obj(topology)->online_cpuset;
+}
+
+/** \brief Get allowed CPU set
+ *
+ * \return the CPU set of allowed logical processors of the system. If the
+ * topology is the result of a combination of several systems, NULL is
+ * returned.
+ *
+ * \note The returned cpuset is not newly allocated and should thus not be
+ * changed or freed, hwloc_cpuset_dup must be used to obtain a local copy.
+ */
+static __hwloc_inline hwloc_const_cpuset_t __hwloc_attribute_pure
+hwloc_topology_get_allowed_cpuset(hwloc_topology_t topology)
+{
+ return hwloc_get_root_obj(topology)->allowed_cpuset;
+}
+
+
+/** @} */
+
#endif /* HWLOC_HELPER_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/linux-libnuma.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/linux-libnuma.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/linux-libnuma.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -15,7 +15,6 @@
#include <hwloc.h>
#include <numa.h>
-#include <assert.h>
/** \defgroup hwlocality_linux_libnuma_ulongs Helpers for manipulating Linux libnuma unsigned long masks
@@ -33,14 +32,14 @@
* or any other function that takes an array of unsigned long and a maximal
* node number as input parameter.
*/
-static __inline void
-hwloc_cpuset_to_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
+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)
{
unsigned long outmaxnode = -1;
hwloc_obj_t node = NULL;
unsigned nbnodes = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_NODE);
- int i;
+ unsigned i;
for(i=0; i<*maxnode/HWLOC_BITS_PER_LONG; i++)
mask[i] = 0;
@@ -62,6 +61,7 @@
}
*maxnode = outmaxnode+1;
+ return 0;
}
/** \brief Convert the array of unsigned long \p mask into hwloc CPU set
@@ -73,36 +73,35 @@
* that takes an array of unsigned long as output parameter (and possibly
* a maximal node number as input parameter).
*/
-static __inline hwloc_cpuset_t
-hwloc_cpuset_from_linux_libnuma_ulongs(hwloc_topology_t topology,
+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)
{
- hwloc_cpuset_t cpuset;
hwloc_obj_t node;
int depth;
- int i;
+ unsigned i;
depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
- assert(depth != HWLOC_TYPE_DEPTH_MULTIPLE);
+ /* cannot be HWLOC_TYPE_DEPTH_MULTIPLE */
if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) {
/* if no numa, libnuma assumes we have a single node */
if (mask[0] & 1)
- cpuset = hwloc_cpuset_dup(hwloc_get_system_obj(topology)->cpuset);
+ hwloc_cpuset_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
else
- cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_zero(cpuset);
} else {
- cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_zero(cpuset);
for(i=0; i<maxnode; i++)
if (mask[i/HWLOC_BITS_PER_LONG] & (1 << (i% HWLOC_BITS_PER_LONG))) {
node = hwloc_get_obj_by_depth(topology, depth, i);
if (node)
- hwloc_cpuset_orset(cpuset, node->cpuset);
+ hwloc_cpuset_or(cpuset, cpuset, node->cpuset);
}
}
- return cpuset;
+ return 0;
}
/** @} */
@@ -120,9 +119,11 @@
*
* This function may be used before calling many numa_ functions
* that use a struct bitmask as an input parameter.
+ *
+ * \return newly allocated struct bitmask.
*/
-static __inline struct bitmask *
-hwloc_cpuset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_cpuset_t cpuset)
+static __hwloc_inline struct bitmask * __hwloc_attribute_malloc
+hwloc_cpuset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset)
{
struct bitmask *bitmask;
hwloc_obj_t node = NULL;
@@ -152,36 +153,35 @@
* This function may be used after calling many numa_ functions
* that use a struct bitmask as an output parameter.
*/
-static __inline hwloc_cpuset_t
-hwloc_cpuset_from_linux_libnuma_bitmask(hwloc_topology_t topology,
+static __hwloc_inline int
+hwloc_cpuset_from_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
const struct bitmask *bitmask)
{
- hwloc_cpuset_t cpuset;
hwloc_obj_t node;
int depth;
int i;
depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
- assert(depth != HWLOC_TYPE_DEPTH_MULTIPLE);
+ /* cannot be HWLOC_TYPE_DEPTH_MULTIPLE */
if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) {
/* if no numa, libnuma assumes we have a single node */
if (numa_bitmask_isbitset(bitmask, 0))
- cpuset = hwloc_cpuset_dup(hwloc_get_system_obj(topology)->cpuset);
+ hwloc_cpuset_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
else
- cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_zero(cpuset);
} else {
- cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_zero(cpuset);
for(i=0; i<NUMA_NUM_NODES; i++)
if (numa_bitmask_isbitset(bitmask, i)) {
node = hwloc_get_obj_by_depth(topology, depth, i);
if (node)
- hwloc_cpuset_orset(cpuset, node->cpuset);
+ hwloc_cpuset_or(cpuset, cpuset, node->cpuset);
}
}
- return cpuset;
+ return 0;
}
/** @} */
@@ -199,8 +199,8 @@
* This function may be used before calling some old libnuma functions
* that use a nodemask_t as an input parameter.
*/
-static __inline void
-hwloc_cpuset_to_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
+static __hwloc_inline int
+hwloc_cpuset_to_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset,
nodemask_t *nodemask)
{
hwloc_obj_t node = NULL;
@@ -216,6 +216,8 @@
if (!hwloc_cpuset_iszero(cpuset))
nodemask_set(nodemask, 0);
}
+
+ return 0;
}
/** \brief Convert libnuma nodemask \p nodemask into hwloc CPU set \p cpuset
@@ -223,36 +225,35 @@
* This function may be used before calling some old libnuma functions
* that use a nodemask_t as an output parameter.
*/
-static __inline hwloc_cpuset_t
-hwloc_cpuset_from_linux_libnuma_nodemask(hwloc_topology_t topology,
+static __hwloc_inline int
+hwloc_cpuset_from_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
const nodemask_t *nodemask)
{
- hwloc_cpuset_t cpuset;
hwloc_obj_t node;
int depth;
int i;
depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
- assert(depth != HWLOC_TYPE_DEPTH_MULTIPLE);
+ /* cannot be HWLOC_TYPE_DEPTH_MULTIPLE */
if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) {
/* if no numa, libnuma assumes we have a single node */
if (nodemask_isset(nodemask, 0))
- cpuset = hwloc_cpuset_dup(hwloc_get_system_obj(topology)->cpuset);
+ hwloc_cpuset_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
else
- cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_zero(cpuset);
} else {
- cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_zero(cpuset);
for(i=0; i<NUMA_NUM_NODES; i++)
if (nodemask_isset(nodemask, i)) {
node = hwloc_get_obj_by_depth(topology, depth, i);
if (node)
- hwloc_cpuset_orset(cpuset, node->cpuset);
+ hwloc_cpuset_or(cpuset, cpuset, node->cpuset);
}
}
- return cpuset;
+ return 0;
}
/** @} */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/linux.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/linux.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/linux.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -16,7 +16,11 @@
#include <hwloc.h>
#include <stdio.h>
-/** \defgroup hwlocality_linux_cpumap Helpers for manipulating linux kernel cpumap files
+/** \defgroup hwlocality_linux Linux-only helpers
+ *
+ * This includes helpers for manipulating linux kernel cpumap files, and hwloc
+ * equivalents of the Linux sched_setaffinity and sched_getaffinity system calls.
+ *
* @{
*/
@@ -25,8 +29,22 @@
* Might be used when reading CPU set from sysfs attributes such as topology
* and caches for processors, or local_cpus for devices.
*/
-extern hwloc_cpuset_t hwloc_linux_parse_cpumap_file(FILE *file);
+HWLOC_DECLSPEC int hwloc_linux_parse_cpumap_file(FILE *file, hwloc_cpuset_t set);
+/** \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.
+ */
+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 behavior is exactly the same as the Linux sched_setaffinity system call,
+ * but uses a hwloc cpuset.
+ */
+HWLOC_DECLSPEC int hwloc_linux_get_tid_cpubind(hwloc_topology_t topology, pid_t tid, hwloc_cpuset_t set);
+
/** @} */
#endif /* HWLOC_GLIBC_SCHED_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/openfabrics-verbs.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/openfabrics-verbs.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/openfabrics-verbs.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -35,31 +35,31 @@
* This function is currently only implemented in a meaningful way for
* Linux; other systems will simply get a full cpuset.
*/
-static __inline hwloc_cpuset_t
-hwloc_ibv_get_device_cpuset(struct ibv_device *ibdev)
+static __hwloc_inline int
+hwloc_ibv_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
+ struct ibv_device *ibdev, hwloc_cpuset_t set)
{
-#if defined(HWLOC_LINUX_SYS)
+#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];
FILE *sysfile = NULL;
- hwloc_cpuset_t set;
sprintf(path, "/sys/class/infiniband/%s/device/local_cpus",
ibv_get_device_name(ibdev));
sysfile = fopen(path, "r");
if (!sysfile)
- return NULL;
+ return -1;
- set = hwloc_linux_parse_cpumap_file(sysfile);
+ hwloc_linux_parse_cpumap_file(sysfile, set);
fclose(sysfile);
- return set;
#else
/* Non-Linux systems simply get a full cpuset */
- return hwloc_cpuset_dup(hwloc_get_system_obj(topology)->cpuset);
+ hwloc_cpuset_copy(set, hwloc_topology_get_complete_cpuset(topology));
#endif
+ return 0;
}
/** @} */
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/rename.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/rename.h (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc/rename.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,317 @@
+/*
+ * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
+ * See COPYING in top-level directory.
+ */
+
+#ifndef HWLOC_RENAME_H
+#define HWLOC_RENAME_H
+
+#include <hwloc/config.h>
+
+/* 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)
+#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_<foo>"); the preprocessor will adjust to have the prefixed
+ name under the covers. */
+
+/* Names from hwloc.h */
+
+#define hwloc_topology HWLOC_NAME(topology)
+#define hwloc_topology_t HWLOC_NAME(topology_t)
+
+#define HWLOC_OBJ_SYSTEM HWLOC_NAME_CAPS(OBJ_SYSTEM)
+#define HWLOC_OBJ_MACHINE HWLOC_NAME_CAPS(OBJ_MACHINE)
+#define HWLOC_OBJ_NODE HWLOC_NAME_CAPS(OBJ_NODE)
+#define HWLOC_OBJ_SOCKET HWLOC_NAME_CAPS(OBJ_SOCKET)
+#define HWLOC_OBJ_CACHE HWLOC_NAME_CAPS(OBJ_CACHE)
+#define HWLOC_OBJ_CORE HWLOC_NAME_CAPS(OBJ_CORE)
+#define HWLOC_OBJ_PU HWLOC_NAME_CAPS(OBJ_PU)
+#define HWLOC_OBJ_MISC HWLOC_NAME_CAPS(OBJ_MISC)
+#define HWLOC_OBJ_GROUP HWLOC_NAME_CAPS(OBJ_GROUP)
+
+#define hwloc_obj_type_t HWLOC_NAME(obj_type_t)
+
+#define hwloc_compare_types HWLOC_NAME(compare_types)
+
+#define HWLOC_TYPE_UNORDERED HWLOC_NAME_CAPS(TYPE_UNORDERED)
+
+#define hwloc_obj_memory_s HWLOC_NAME(obj_memory_s)
+
+#define hwloc_obj HWLOC_NAME(obj)
+#define hwloc_obj_t HWLOC_NAME(obj_t)
+
+#define hwloc_obj_attr_u HWLOC_NAME(obj_attr_u)
+#define hwloc_cache_attr_s HWLOC_NAME(cache_attr_s)
+#define hwloc_memory_attr_s HWLOC_NAME(cache_memory_s)
+#define hwloc_machine_attr_s HWLOC_NAME(cache_machine_s)
+#define hwloc_misc_attr_s HWLOC_NAME(cache_misc_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_check HWLOC_NAME(topology_check)
+#define hwloc_topology_ignore_type HWLOC_NAME(topology_ignore_type)
+#define hwloc_topology_ignore_type_keep_structure HWLOC_NAME(topology_ignore_type_keep_structure)
+#define hwloc_topology_ignore_all_keep_structure HWLOC_NAME(topology_ignore_all_keep_structure)
+
+#define hwloc_topology_flags_e HWLOC_NAME(topology_flags_e)
+
+#define HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM HWLOC_NAME_CAPS(TOPOLOGY_FLAG_WHOLE_SYSTEM)
+#define HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM HWLOC_NAME_CAPS(TOPOLOGY_FLAG_IS_THISSYSTEM)
+
+#define hwloc_topology_set_flags HWLOC_NAME(topology_set_flags)
+#define hwloc_topology_set_fsroot HWLOC_NAME(topology_set_fsroot)
+#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_support HWLOC_NAME(topology_support)
+#define hwloc_topology_get_support HWLOC_NAME(topology_get_support)
+#define hwloc_topology_export_xml HWLOC_NAME(topology_export_xml)
+
+#define hwloc_topology_insert_misc_object_by_cpuset HWLOC_NAME(topology_insert_misc_object_by_cpuset)
+#define hwloc_topology_insert_misc_object_by_parent HWLOC_NAME(topology_insert_misc_object_by_parent)
+
+#define hwloc_topology_get_depth HWLOC_NAME(topology_get_depth)
+#define hwloc_get_type_depth HWLOC_NAME(get_type_depth)
+
+#define HWLOC_TYPE_DEPTH_UNKNOWN HWLOC_NAME_CAPS(TYPE_DEPTH_UNKNOWN)
+#define HWLOC_TYPE_DEPTH_MULTIPLE HWLOC_NAME_CAPS(TYPE_DEPTH_MULTIPLE)
+
+#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_topology_is_thissystem HWLOC_NAME(topology_is_thissystem)
+
+#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_of_string HWLOC_NAME(obj_type_of_string )
+#define hwloc_obj_type_snprintf HWLOC_NAME(obj_type_snprintf )
+#define hwloc_obj_attr_snprintf HWLOC_NAME(obj_attr_snprintf )
+#define hwloc_obj_snprintf HWLOC_NAME(obj_snprintf)
+#define hwloc_obj_cpuset_snprintf HWLOC_NAME(obj_cpuset_snprintf)
+
+#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_policy_t HWLOC_NAME(hwloc_cpubind_policy_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)
+
+/* hwloc/cpuset.h */
+
+#define hwloc_cpuset HWLOC_NAME(cpuset)
+#define hwloc_cpuset_s HWLOC_NAME(cpuset_s)
+#define hwloc_cpuset_t HWLOC_NAME(cpuset_t)
+#define hwloc_const_cpuset_t HWLOC_NAME(const_cpuset_t)
+
+#define hwloc_cpuset_alloc HWLOC_NAME(cpuset_alloc)
+#define hwloc_cpuset_free HWLOC_NAME(cpuset_free)
+#define hwloc_cpuset_dup HWLOC_NAME(cpuset_dup)
+#define hwloc_cpuset_copy HWLOC_NAME(cpuset_copy)
+#define hwloc_cpuset_snprintf HWLOC_NAME(cpuset_snprintf)
+#define hwloc_cpuset_asprintf HWLOC_NAME(cpuset_asprintf)
+#define hwloc_cpuset_from_string HWLOC_NAME(cpuset_from_string)
+#define hwloc_cpuset_zero HWLOC_NAME(cpuset_zero)
+#define hwloc_cpuset_fill HWLOC_NAME(cpuset_fill)
+#define hwloc_cpuset_from_ulong HWLOC_NAME(cpuset_from_ulong)
+
+#define hwloc_cpuset_from_ith_ulong HWLOC_NAME(cpuset_from_ith_ulong)
+#define hwloc_cpuset_to_ulong HWLOC_NAME(cpuset_to_ulong)
+#define hwloc_cpuset_to_ith_ulong HWLOC_NAME(cpuset_to_ith_ulong)
+#define hwloc_cpuset_cpu HWLOC_NAME(cpuset_cpu)
+#define hwloc_cpuset_all_but_cpu HWLOC_NAME(cpuset_all_but_cpu)
+#define hwloc_cpuset_set HWLOC_NAME(cpuset_set)
+#define hwloc_cpuset_set_range HWLOC_NAME(cpuset_set_range)
+#define hwloc_cpuset_clr HWLOC_NAME(cpuset_clr)
+#define hwloc_cpuset_clr_range HWLOC_NAME(cpuset_clr_range)
+#define hwloc_cpuset_isset HWLOC_NAME(cpuset_isset)
+#define hwloc_cpuset_iszero HWLOC_NAME(cpuset_iszero)
+#define hwloc_cpuset_isfull HWLOC_NAME(cpuset_isfull)
+#define hwloc_cpuset_isequal HWLOC_NAME(cpuset_isequal)
+#define hwloc_cpuset_intersects HWLOC_NAME(cpuset_intersects)
+#define hwloc_cpuset_isincluded HWLOC_NAME(cpuset_isincluded)
+#define hwloc_cpuset_or HWLOC_NAME(cpuset_or)
+#define hwloc_cpuset_and HWLOC_NAME(cpuset_and)
+#define hwloc_cpuset_andnot HWLOC_NAME(cpuset_andnot)
+#define hwloc_cpuset_xor HWLOC_NAME(cpuset_xor)
+#define hwloc_cpuset_not HWLOC_NAME(cpuset_not)
+#define hwloc_cpuset_first HWLOC_NAME(cpuset_first)
+#define hwloc_cpuset_last HWLOC_NAME(cpuset_last)
+#define hwloc_cpuset_next HWLOC_NAME(cpuset_next)
+#define hwloc_cpuset_singlify HWLOC_NAME(cpuset_singlify)
+#define hwloc_cpuset_compare_first HWLOC_NAME(cpuset_compare_first)
+#define hwloc_cpuset_compare HWLOC_NAME(cpuset_compare)
+#define hwloc_cpuset_weight HWLOC_NAME(cpuset_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_system_obj HWLOC_NAME(get_system_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_get_pu_obj_by_os_index HWLOC_NAME(get_pu_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_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_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_distribute HWLOC_NAME(distribute)
+#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_online_cpuset HWLOC_NAME(topology_get_online_cpuset)
+#define hwloc_topology_get_allowed_cpuset HWLOC_NAME(topology_get_allowed_cpuset)
+
+/* 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_cpuset_from_linux_libnuma_ulongs HWLOC_NAME(cpuset_from_linux_libnuma_ulongs)
+#define hwloc_cpuset_to_linux_libnuma_bitmask HWLOC_NAME(cpuset_to_linux_libnuma_bitmask)
+#define hwloc_cpuset_from_linux_libnuma_bitmask HWLOC_NAME(cpuset_from_linux_libnuma_bitmask)
+#define hwloc_cpuset_to_linux_libnuma_nodemask HWLOC_NAME(cpuset_to_linux_libnuma_nodemask)
+#define hwloc_cpuset_from_linux_libnuma_nodemask HWLOC_NAME(cpuset_from_linux_libnuma_nodemask)
+
+/* linux.h */
+
+#define hwloc_linux_parse_cpumap_file HWLOC_NAME(linux_parse_cpumap_file)
+#define hwloc_linux_set_tid_cpubind HWLOC_NAME(linux_set_tid_cpubind)
+#define hwloc_linux_get_tid_cpubind HWLOC_NAME(linux_get_tid_cpubind)
+
+/* openfabrics-verbs.h */
+
+#define hwloc_ibv_get_device_cpuset HWLOC_NAME(ibv_get_device_cpuset)
+
+/* private/misc.h */
+
+#define hwloc_snprintf HWLOC_NAME(snprintf)
+#define hwloc_namecoloncmp HWLOC_NAME(namecoloncmp)
+#define hwloc_weight_long HWLOC_NAME(weight_long)
+
+/* private/cpuid.h */
+
+#define hwloc_have_cpuid HWLOC_NAME(have_cpuid)
+#define hwloc_cpuid HWLOC_NAME(cpuid)
+
+/* private/private.h */
+
+#define hwloc_ignore_type_e HWLOC_NAME(ignore_type_e)
+
+#define HWLOC_IGNORE_TYPE_NEVER HWLOC_NAME_CAPS(IGNORE_TYPE_NEVER)
+#define HWLOC_IGNORE_TYPE_KEEP_STRUCTURE HWLOC_NAME_CAPS(IGNORE_TYPE_KEEP_STRUCTURE)
+#define HWLOC_IGNORE_TYPE_ALWAYS HWLOC_NAME_CAPS(IGNORE_TYPE_ALWAYS)
+
+#define hwloc_backend_e HWLOC_NAME(backend_e)
+
+#define HWLOC_BACKEND_NONE HWLOC_NAME_CAPS(BACKEND_NONE)
+#define HWLOC_BACKEND_SYNTHETIC HWLOC_NAME_CAPS(BACKEND_SYNTHETIC)
+#define HWLOC_BACKEND_SYSFS HWLOC_NAME_CAPS(BACKEND_SYSFS)
+#define HWLOC_BACKEND_XML HWLOC_NAME_CAPS(BACKEND_XML)
+
+#define hwloc_backend_t HWLOC_NAME(backend_t)
+
+#define hwloc_backend_params_u HWLOC_NAME(backend_params_u)
+#define hwloc_backend_params_sysfs_s HWLOC_NAME(backend_params_sysfs_s)
+#define hwloc_backend_params_osf HWLOC_NAME(backend_params_osf)
+#define hwloc_backend_params_xml_s HWLOC_NAME(backend_params_xml_s)
+#define hwloc_backend_params_synthetic_s HWLOC_NAME(backend_params_synthetic_s)
+
+#define hwloc_setup_pu_level HWLOC_NAME(setup_pu_level)
+#define hwloc_setup_misc_level_from_distances HWLOC_NAME(setup_misc_level_from_distances)
+#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_look_linux HWLOC_NAME(look_linux)
+#define hwloc_set_linux_hooks HWLOC_NAME(set_linux_hooks)
+#define hwloc_backend_sysfs_init HWLOC_NAME(backend_sysfs_init)
+#define hwloc_backend_sysfs_exit HWLOC_NAME(backend_sysfs_exit)
+
+#define hwloc_backend_xml_init HWLOC_NAME(backend_xml_init)
+#define hwloc_look_xml HWLOC_NAME(look_xml)
+#define hwloc_backend_xml_exit HWLOC_NAME(backend_xml_exit)
+
+#define hwloc_look_solaris HWLOC_NAME(look_solaris)
+#define hwloc_set_solaris_hooks HWLOC_NAME(set_solaris_hooks)
+
+#define hwloc_look_aix HWLOC_NAME(look_aix)
+#define hwloc_set_aix_hooks HWLOC_NAME(set_aix_hooks)
+
+#define hwloc_look_osf HWLOC_NAME(look_osf)
+#define hwloc_set_osf_hooks HWLOC_NAME(set_osf_hooks)
+
+#define hwloc_look_windows HWLOC_NAME(look_windows)
+#define hwloc_set_windows_hooks HWLOC_NAME(set_windows_hooks)
+
+#define hwloc_look_darwin HWLOC_NAME(look_darwin)
+#define hwloc_set_darwin_hooks HWLOC_NAME(set_darwin_hooks)
+
+#define hwloc_look_freebsd HWLOC_NAME(look_freebsd)
+#define hwloc_set_freebsd_hooks HWLOC_NAME(set_freebsd_hooks)
+
+#define hwloc_look_hpux HWLOC_NAME(look_hpux)
+#define hwloc_set_hpux_hooks HWLOC_NAME(set_hpux_hooks)
+
+#define hwloc_look_x86 HWLOC_NAME(look_x86)
+
+#define hwloc_backend_synthetic_init HWLOC_NAME(backend_synthetic_init)
+#define hwloc_backend_synthetic_exit HWLOC_NAME(backend_synthetic_exit)
+#define hwloc_look_synthetic HWLOC_NAME(look_synthetic )
+
+#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_cpuset_printf_value HWLOC_NAME(cpuset_printf_value)
+#define hwloc_alloc_setup_object HWLOC_NAME(alloc_setup_object)
+#define hwloc_setup_level HWLOC_NAME(setup_level)
+
+#endif /* HWLOC_SYM_TRANSFORM */
+
+#endif /* HWLOC_RENAME_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/hwloc.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,6 +1,6 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
- * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+ * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
@@ -17,8 +17,14 @@
#include <sys/types.h>
#include <stdio.h>
#include <limits.h>
+#include <stdint.h>
/*
+ * Symbol transforms
+ */
+#include <hwloc/rename.h>
+
+/*
* Cpuset bitmask definitions
*/
@@ -26,6 +32,17 @@
+/** \defgroup hwlocality_api_version API version
+ * @{
+ */
+
+/** \brief Indicate at build time which hwloc API version is being used. */
+#define HWLOC_API_VERSION 0x00010000
+
+/** @} */
+
+
+
/** \defgroup hwlocality_topology Topology context
* @{
*/
@@ -58,6 +75,7 @@
* like Kerrighed.
*/
HWLOC_OBJ_MACHINE, /**< \brief Machine.
+ * The typical root object type.
* A set of processors and memory with cache
* coherency.
*/
@@ -76,7 +94,7 @@
* A computation unit (may be shared by several
* logical processors).
*/
- HWLOC_OBJ_PROC, /**< \brief (Logical) Processor.
+ 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).
@@ -85,31 +103,46 @@
* thus be used as fallback when others are not.
*/
- HWLOC_OBJ_MISC, /**< \brief Miscellaneous objects.
+ 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 OSes
* expose their arbitrary processors aggregation this
- * way.
+ * way. And hwloc may insert such objects to group
+ * NUMA nodes according to their distances.
+ *
+ * These objects are ignored when they do not bring
+ * any structure.
*/
+
+ HWLOC_OBJ_MISC /**< \brief Miscellaneous objects.
+ * Objects without particular meaning, that can e.g. be
+ * added by the application for its own use.
+ */
} hwloc_obj_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. This function returns less than, equal to, or greater than zero
- * if \p type1 is considered to be respectively higher than, equal to, or deeper
- * than \p type2 in the hierarchy. If the types can not be compared (because
- * it does not make sense), HWLOC_TYPE_UNORDERED is returned. Object types
- * containing CPUs can always be compared.
+ * respectively if \p type1 objects usually include \p type2 objects, are the
+ * same as \p type2 objects, or are included in \p type2 objects. If the types
+ * can not be compared (because neither is usually contained in the other),
+ * HWLOC_TYPE_UNORDERED is returned. Object types containing CPUs can always
+ * be compared (usually, a system contains machines which contain nodes which
+ * contain sockets which contain caches, which contain cores, which contain
+ * processors).
*
- * \note HWLOC_OBJ_SYSTEM will always be the highest, and
- * HWLOC_OBJ_PROC will always be the deepest.
+ * \note HWLOC_OBJ_PU will always be the deepest.
+ * \note This does not mean that the actual topology will respect that order:
+ * e.g. as of today cores may also contain caches, and sockets may also contain
+ * nodes. This is thus just to be seen as a fallback comparison method.
*/
-int hwloc_compare_types (hwloc_obj_type_t type1, hwloc_obj_type_t type2);
+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. */
-#define HWLOC_TYPE_UNORDERED INT_MAX
+enum hwloc_compare_types_e {
+ HWLOC_TYPE_UNORDERED = INT_MAX /**< \brief Value returned by hwloc_compare_types when types can not be compared. \hideinitializer */
+};
/** @} */
@@ -121,6 +154,23 @@
union hwloc_obj_attr_u;
+/** \brief Object memory */
+struct hwloc_obj_memory_s {
+ uint64_t total_memory; /**< \brief Total memory (in bytes) in this object and its children */
+ 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_obj_memory_page_type_s {
+ uint64_t size; /**< \brief Size of pages */
+ uint64_t count; /**< \brief Number of pages of this size */
+ } * page_types;
+};
+
/** \brief Structure of a topology object
*
* Applications mustn't modify any field except ::userdata .
@@ -128,9 +178,12 @@
struct hwloc_obj {
/* physical information */
hwloc_obj_type_t type; /**< \brief Type of object */
- signed os_index; /**< \brief OS-provided physical index number */
+ unsigned os_index; /**< \brief OS-provided physical index number */
char *name; /**< \brief Object description if any */
+ /** \brief Memory attributes */
+ struct hwloc_obj_memory_s memory;
+
/** \brief Object type-specific Attributes */
union hwloc_obj_attr_u *attr;
@@ -138,14 +191,16 @@
unsigned depth; /**< \brief Vertical index in the hierarchy */
unsigned logical_index; /**< \brief Horizontal index in the whole list of similar objects,
* could be a "cousin_rank" since it's the rank within the "cousin" list below */
+ signed os_level; /**< \brief OS-provided physical level, -1 if unknown or meaningless */
+
struct hwloc_obj *next_cousin; /**< \brief Next object of same type */
struct hwloc_obj *prev_cousin; /**< \brief Previous object of same type */
- /* father */
- struct hwloc_obj *father; /**< \brief Father, \c NULL if root (system object) */
- unsigned sibling_rank; /**< \brief Index in father's \c children[] array */
- struct hwloc_obj *next_sibling; /**< \brief Next object below the same father*/
- struct hwloc_obj *prev_sibling; /**< \brief Previous object below the same father */
+ /* parent */
+ struct hwloc_obj *parent; /**< \brief Parent, \c NULL if root (system object) */
+ unsigned sibling_rank; /**< \brief Index in parent's \c children[] array */
+ struct hwloc_obj *next_sibling; /**< \brief Next object below the same parent */
+ struct hwloc_obj *prev_sibling; /**< \brief Previous object below the same parent */
/* children */
unsigned arity; /**< \brief Number of children */
@@ -157,38 +212,103 @@
void *userdata; /**< \brief Application-given private data pointer, initialized to \c NULL, use it as you wish */
/* cpuset */
- hwloc_cpuset_t cpuset; /**< \brief CPUs covered by this object */
+ 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_WHOLE_SYSTEM configuration flag is set, some of
+ * these CPUs may be offline, or not allowed for binding, see online_cpuset
+ * and allowed_cpuset.
+ *
+ * \note Its value must not be changed, hwloc_cpuset_dup must be used instead.
+ */
+ hwloc_cpuset_t complete_cpuset; /**< \brief The complete CPU set of logical processors of this object,
+ *
+ * This includes not only the same as the cpuset field, but also the CPUs for
+ * which topology information is unknown or incomplete, and the CPUs that are
+ * ignored when the HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM 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_cpuset_dup must be used instead.
+ */
+ hwloc_cpuset_t online_cpuset; /**< \brief The CPU set of online logical processors
+ *
+ * This includes the CPUs contained in this object that are online, i.e. draw
+ * power and can execute threads. It may however not be allowed to bind to
+ * them due to administration rules, see allowed_cpuset.
+ *
+ * \note Its value must not be changed, hwloc_cpuset_dup must be used instead.
+ */
+ hwloc_cpuset_t allowed_cpuset; /**< \brief The CPU set of allowed logical processors
+ *
+ * This includes the CPUs contained in this object which are allowed for
+ * binding, i.e. passing them to the hwloc binding functions should not return
+ * permission errors. This is usually restricted by administration rules.
+ * Some of them may however be offline so binding to them may still not be
+ * possible, see online_cpuset.
+ *
+ * \note Its value must not be changed, hwloc_cpuset_dup must be used instead.
+ */
- signed os_level; /**< \brief OS-provided physical level */
+ hwloc_cpuset_t nodeset; /**< \brief NUMA nodes covered by this object or containing this object
+ *
+ * This is the set of NUMA nodes for which there are 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 NODE objects).
+ *
+ * If the HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM configuration flag is set, some of
+ * these nodes may not be allowed for allocation, see allowed_nodeset.
+ *
+ * \note Its value must not be changed, hwloc_cpuset_dup must be used instead.
+ */
+ hwloc_cpuset_t complete_nodeset; /**< \brief The complete NUMA node set of this object,
+ *
+ * This includes not only the same as the nodeset field, but also the NUMA
+ * nodes for which topology information is unknown or incomplete, and the nodes
+ * that are ignored when the HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM flag is not set.
+ * Thus no corresponding 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.
+ *
+ * \note Its value must not be changed, hwloc_cpuset_dup must be used instead.
+ */
+ hwloc_cpuset_t allowed_nodeset; /**< \brief The set of allowed NUMA memory nodes
+ *
+ * This includes the NUMA memory nodes contained in this object which are
+ * allowed for memory allocation, i.e. passing them to NUMA node-directed
+ * memory allocation should not return permission errors. This is usually
+ * restricted by administration rules.
+ *
+ * \note Its value must not be changed, hwloc_cpuset_dup must be used instead.
+ */
};
+/**
+ * \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 Cache-specific Object Attributes */
struct hwloc_cache_attr_s {
- unsigned long memory_kB; /**< \brief Size of cache */
+ uint64_t size; /**< \brief Size of cache in bytes */
unsigned depth; /**< \brief Depth of cache */
} cache;
- /** \brief Node-specific Object Attributes */
- struct hwloc_memory_attr_s {
- unsigned long memory_kB; /**< \brief Size of memory node */
- unsigned long huge_page_free; /**< \brief Number of available huge pages */
- } node;
/** \brief Machine-specific Object Attributes */
struct hwloc_machine_attr_s {
char *dmi_board_vendor; /**< \brief DMI board vendor name */
char *dmi_board_name; /**< \brief DMI board model name */
- unsigned long memory_kB; /**< \brief Size of memory node */
- unsigned long huge_page_free; /**< \brief Number of available huge pages */
- unsigned long huge_page_size_kB; /**< \brief Size of huge pages */
} machine;
- /** \brief System-specific Object Attributes */
- struct hwloc_machine_attr_s system;
- /** \brief Misc-specific Object Attributes */
- struct hwloc_misc_attr_s {
- unsigned depth; /**< \brief Depth of misc object */
- } misc;
+ /** \brief Group-specific Object Attributes */
+ struct hwloc_group_attr_s {
+ unsigned depth; /**< \brief Depth of group object */
+ } group;
};
/** @} */
@@ -205,7 +325,7 @@
*
* \return 0 on success, -1 on error.
*/
-extern int hwloc_topology_init (hwloc_topology_t *topologyp);
+HWLOC_DECLSPEC int hwloc_topology_init (hwloc_topology_t *topologyp);
/** \brief Build the actual topology
*
@@ -219,19 +339,19 @@
*
* \sa hwlocality_configuration
*/
-extern int hwloc_topology_load(hwloc_topology_t topology);
+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
*/
-extern void hwloc_topology_destroy (hwloc_topology_t topology);
+HWLOC_DECLSPEC void hwloc_topology_destroy (hwloc_topology_t topology);
/** \brief Run internal checks on a topology structure
*
* \param topology is the topology to be checked
*/
-extern void hwloc_topology_check(hwloc_topology_t topology);
+HWLOC_DECLSPEC void hwloc_topology_check(hwloc_topology_t topology);
/** @} */
@@ -252,7 +372,8 @@
* file as if hwloc_topology_set_xml() had been called.
* HWLOC_FSROOT switches to reading the topology from the specified Linux
* filesystem root as if hwloc_topology_set_fsroot() had been called.
- * Finally, HWLOC_THISSYSTEM enforces the value of the is_thissystem field.
+ * Finally, HWLOC_THISSYSTEM enforces the return value of
+ * hwloc_topology_is_thissystem().
*
* @{
*/
@@ -260,45 +381,49 @@
/** \brief Ignore an object type.
*
* Ignore all objects from the given type.
- * The top-level type HWLOC_OBJ_SYSTEM and bottom-level type HWLOC_OBJ_PROC may
- * not be ignored.
+ * The bottom-level type HWLOC_OBJ_PU may not be ignored.
+ * The top-level object of the hierarchy will never be ignored, even if this function
+ * succeeds.
*/
-extern int hwloc_topology_ignore_type(hwloc_topology_t topology, hwloc_obj_type_t type);
+HWLOC_DECLSPEC int hwloc_topology_ignore_type(hwloc_topology_t topology, hwloc_obj_type_t type);
/** \brief Ignore an object type if it does not bring any structure.
*
* Ignore all objects from the given type as long as they do not bring any structure:
- * Each ignored object should have a single children or be the only child of its father.
- * The top-level type HWLOC_OBJ_SYSTEM and bottom-level type HWLOC_OBJ_PROC may
- * not be ignored.
+ * Each ignored object should have a single children or be the only child of its parent.
+ * The bottom-level type HWLOC_OBJ_PU may not be ignored.
*/
-extern int hwloc_topology_ignore_type_keep_structure(hwloc_topology_t topology, hwloc_obj_type_t type);
+HWLOC_DECLSPEC int hwloc_topology_ignore_type_keep_structure(hwloc_topology_t topology, hwloc_obj_type_t type);
/** \brief Ignore all objects that do not bring any structure.
*
* Ignore all objects that do not bring any structure:
- * Each ignored object should have a single children or be the only child of its father.
+ * Each ignored object should have a single children or be the only child of its parent.
*/
-extern int hwloc_topology_ignore_all_keep_structure(hwloc_topology_t topology);
+HWLOC_DECLSPEC int hwloc_topology_ignore_all_keep_structure(hwloc_topology_t topology);
/** \brief Flags to be set onto a topology context before load.
*
* Flags should be given to hwloc_topology_set_flags().
*/
enum hwloc_topology_flags_e {
- /* \brief Detect the whole system, ignore reservations that may have been setup by the administrator.
+ HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM = (1<<0),
+ /**< \brief Detect the whole system, ignore reservations and offline settings.
+ * \hideinitializer
*
* Gather all resources, even if some were disabled by the administrator.
- * For instance, ignore Linux Cpusets and gather all processors and memory nodes.
+ * For instance, ignore Linux Cpusets and gather all processors and memory nodes,
+ * and ignore the fact that some resources may be offline.
*/
- HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM = (1<<0),
- /* \brief Assume that the selected backend provides the topology for the
+ HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM = (1<<1)
+ /**< \brief Assume that the selected backend provides the topology for the
* system on which we are running.
+ * \hideinitializer
*
- * This forces is_thissystem to 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 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.
@@ -310,21 +435,20 @@
* save it to an XML file, and quickly reload it later through the XML
* backend, but still having binding functions actually do bind.
*/
- HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM = (1<<1),
};
/** \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.
*/
-extern int hwloc_topology_set_flags (hwloc_topology_t topology, unsigned long flags);
+HWLOC_DECLSPEC int hwloc_topology_set_flags (hwloc_topology_t topology, unsigned long flags);
/** \brief Change the file-system root path when building the topology from sysfs/procfs.
*
* On Linux system, use sysfs and procfs files as if they were mounted on the given
* \p fsroot_path instead of the main file-system root. Setting the environment
* variable HWLOC_FSROOT may also result in this behavior.
- * Not using the main file-system root causes hwloc_topology_is_thissystem field
+ * Not using the main file-system root causes hwloc_topology_is_thissystem()
* to return 0.
*
* \note For conveniency, this backend provides empty binding hooks which just
@@ -332,20 +456,37 @@
* HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM has to be set to assert that the loaded
* file is really the underlying system.
*/
-extern int hwloc_topology_set_fsroot(hwloc_topology_t __hwloc_restrict topology, const char * __hwloc_restrict fsroot_path);
+HWLOC_DECLSPEC int hwloc_topology_set_fsroot(hwloc_topology_t __hwloc_restrict topology, const char * __hwloc_restrict fsroot_path);
+/** \brief Change which pid 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 hwloc_pid_t is pid_t on unix platforms, and HANDLE on native Windows
+ * platforms
+ * \note The ENOSYS error is returned on platforms that does not support this
+ * feature.
+ */
+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
* which should be a comma separated string of numbers describing
* the arity of each level.
* Each number may be prefixed with a type and a colon to enforce the type
- * of a level.
+ * of a level. If only some level types are enforced, hwloc will try to
+ * choose the other types according to usual topologies, but it may fail
+ * and you may have to specify more level types manually.
*
* \note For conveniency, this backend provides empty binding hooks which just
* return success.
*/
-extern int hwloc_topology_set_synthetic(hwloc_topology_t __hwloc_restrict topology, const char * __hwloc_restrict description);
+HWLOC_DECLSPEC int hwloc_topology_set_synthetic(hwloc_topology_t __hwloc_restrict topology, const char * __hwloc_restrict description);
/** \brief Enable XML-file based topology.
*
@@ -358,21 +499,97 @@
* HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM has to be set to assert that the loaded
* file is really the underlying system.
*/
-extern int hwloc_topology_set_xml(hwloc_topology_t __hwloc_restrict topology, const char * __hwloc_restrict xmlpath);
+HWLOC_DECLSPEC int hwloc_topology_set_xml(hwloc_topology_t __hwloc_restrict topology, const char * __hwloc_restrict xmlpath);
+/** \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 Flags describing actual binding support for this topology. */
+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;
+};
+
+/** \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;
+};
+
+/** \brief Retrieve the topology support. */
+HWLOC_DECLSPEC const struct hwloc_topology_support *hwloc_topology_get_support(hwloc_topology_t __hwloc_restrict topology);
+
/** @} */
+/** \defgroup hwlocality_tinker Tinker with topologies.
+ * @{
+ */
+
+/** \brief Export the topology into an XML file.
+ *
+ * This file may be loaded later through hwloc_topology_set_xml().
+ */
+HWLOC_DECLSPEC void hwloc_topology_export_xml(hwloc_topology_t topology, const char *xmlpath);
+
+/** \brief Add a MISC object to the topology
+ *
+ * A new MISC object will be created and inserted into the topology at the
+ * position given by cpuset.
+ *
+ * cpuset and name will be copied.
+ *
+ * \return the newly-created object
+ */
+HWLOC_DECLSPEC hwloc_obj_t hwloc_topology_insert_misc_object_by_cpuset(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset, const char *name);
+
+/** \brief Add a MISC object to the topology
+ *
+ * A new MISC object will be created and inserted into the topology at the
+ * position given by parent.
+ *
+ * name will be copied.
+ *
+ * \return the newly-created object
+ */
+HWLOC_DECLSPEC hwloc_obj_t hwloc_topology_insert_misc_object_by_parent(hwloc_topology_t topology, hwloc_obj_t parent, const char *name);
+
+/** @} */
+
+
+
/** \defgroup hwlocality_information Get some Topology Information
* @{
*/
/** \brief Get the depth of the hierachical tree of objects.
*
- * This is the depth of HWLOC_OBJ_PROC objects plus one.
+ * This is the depth of HWLOC_OBJ_PU objects plus one.
*/
-extern unsigned hwloc_topology_get_depth(hwloc_topology_t __hwloc_restrict topology);
+HWLOC_DECLSPEC unsigned hwloc_topology_get_depth(hwloc_topology_t __hwloc_restrict topology) __hwloc_attribute_pure;
/** \brief Returns the depth of objects of type \p type.
*
@@ -383,22 +600,28 @@
* If type is absent but a similar type is acceptable, see also
* hwloc_get_type_or_below_depth() and hwloc_get_type_or_above_depth().
*/
-extern int hwloc_get_type_depth (hwloc_topology_t topology, hwloc_obj_type_t type);
-#define HWLOC_TYPE_DEPTH_UNKNOWN -1 /**< \brief No object of given type exists in the topology. */
-#define HWLOC_TYPE_DEPTH_MULTIPLE -2 /**< \brief Objects of given type exist at different depth in the topology. */
+HWLOC_DECLSPEC int hwloc_get_type_depth (hwloc_topology_t topology, hwloc_obj_type_t type);
-/** \brief Returns the type of objects at depth \p depth. */
-extern hwloc_obj_type_t hwloc_get_depth_type (hwloc_topology_t topology, unsigned depth);
+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. \hideinitializer */
+};
+/** \brief Returns the type of objects at depth \p depth.
+ *
+ * \return -1 if depth \p depth does not exist.
+ */
+HWLOC_DECLSPEC hwloc_obj_type_t hwloc_get_depth_type (hwloc_topology_t topology, unsigned depth) __hwloc_attribute_pure;
+
/** \brief Returns the width of level at depth \p depth */
-extern unsigned hwloc_get_nbobjs_by_depth (hwloc_topology_t topology, unsigned depth);
+HWLOC_DECLSPEC unsigned hwloc_get_nbobjs_by_depth (hwloc_topology_t topology, unsigned depth) __hwloc_attribute_pure;
/** \brief Returns the width of level type \p type
*
* If no object for that type exists, 0 is returned.
* If there are several levels with objects of that type, -1 is returned.
*/
-static __inline int
+static __hwloc_inline int __hwloc_attribute_pure
hwloc_get_nbobjs_by_type (hwloc_topology_t topology, hwloc_obj_type_t type)
{
int depth = hwloc_get_type_depth(topology, type);
@@ -416,7 +639,7 @@
* \return 0 instead (for instance if using another file-system root,
* a XML topology file, or a synthetic topology).
*/
-extern int hwloc_topology_is_thissystem(hwloc_topology_t __hwloc_restrict topology);
+HWLOC_DECLSPEC int hwloc_topology_is_thissystem(hwloc_topology_t __hwloc_restrict topology) __hwloc_attribute_pure;
/** @} */
@@ -427,7 +650,7 @@
*/
/** \brief Returns the topology object at index \p index from depth \p depth */
-extern hwloc_obj_t hwloc_get_obj_by_depth (hwloc_topology_t topology, unsigned depth, unsigned idx);
+HWLOC_DECLSPEC hwloc_obj_t hwloc_get_obj_by_depth (hwloc_topology_t topology, unsigned depth, unsigned idx) __hwloc_attribute_pure;
/** \brief Returns the topology object at index \p index with type \p type
*
@@ -435,7 +658,7 @@
* If there are several levels with objects of that type, \c NULL is returned
* and ther caller may fallback to hwloc_get_obj_by_depth().
*/
-static __inline hwloc_obj_t
+static __hwloc_inline hwloc_obj_t __hwloc_attribute_pure
hwloc_get_obj_by_type (hwloc_topology_t topology, hwloc_obj_type_t type, unsigned idx)
{
int depth = hwloc_get_type_depth(topology, type);
@@ -455,13 +678,41 @@
*/
/** \brief Return a stringified topology object type */
-extern const char * hwloc_obj_type_string (hwloc_obj_type_t type);
+HWLOC_DECLSPEC const char * hwloc_obj_type_string (hwloc_obj_type_t type) __hwloc_attribute_const;
-/** \brief Return an object type from the string */
-extern hwloc_obj_type_t hwloc_obj_type_of_string (const char * string);
+/** \brief Return an object type from the string
+ *
+ * \return -1 if unrecognized.
+ */
+HWLOC_DECLSPEC hwloc_obj_type_t hwloc_obj_type_of_string (const char * string) __hwloc_attribute_pure;
+/** \brief Stringify the type of a given topology object into a human-readable form.
+ *
+ * It differs from hwloc_obj_type_string() because it prints type attributes such
+ * as cache depth.
+ *
+ * \return how many characters were actually written (not including the ending \\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.
+ *
+ * \return how many characters were actually written (not including the ending \\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 Stringify a given topology object into a human-readable form.
*
+ * \note This function is deprecated in favor of hwloc_obj_type_snprintf()
+ * and hwloc_obj_attr_snprintf() since it is not very flexible and
+ * only prints physical/OS indexes.
+ *
* Fill string \p string up to \p size characters with the description
* of topology object \p obj in topology \p topology.
*
@@ -473,14 +724,14 @@
*
* \return how many characters were actually written (not including the ending \\0).
*/
-extern int hwloc_obj_snprintf(char * __hwloc_restrict string, size_t size,
+HWLOC_DECLSPEC int hwloc_obj_snprintf(char * __hwloc_restrict string, size_t size,
hwloc_topology_t topology, hwloc_obj_t obj,
const char * __hwloc_restrict indexprefix, int verbose);
/** \brief Stringify the cpuset containing a set of objects.
*
* \return how many characters were actually written (not including the ending \\0). */
-extern int hwloc_obj_cpuset_snprintf(char * __hwloc_restrict str, size_t size, size_t nobj, const hwloc_obj_t * __hwloc_restrict objs);
+HWLOC_DECLSPEC int hwloc_obj_cpuset_snprintf(char * __hwloc_restrict str, size_t size, size_t nobj, const hwloc_obj_t * __hwloc_restrict objs);
/** @} */
@@ -529,9 +780,12 @@
*/
typedef enum {
HWLOC_CPUBIND_PROCESS = (1<<0), /**< \brief Bind all threads of the current multithreaded process.
- * This may not be supported by some OSes (e.g. Linux). */
- HWLOC_CPUBIND_THREAD = (1<<1), /**< \brief Bind current thread of current process */
- HWLOC_CPUBIND_STRICT = (1<<2), /**< \brief Request for strict binding from the OS
+ * This may not be supported by some OSes (e.g. Linux).
+ * \hideinitializer */
+ HWLOC_CPUBIND_THREAD = (1<<1), /**< \brief Bind current thread of current process.
+ * \hideinitializer */
+ HWLOC_CPUBIND_STRICT = (1<<2) /**< \brief Request for strict binding from the OS.
+ * \hideinitializer
*
* By default, when the designated CPUs are
* all busy while other CPUs are idle, OSes
@@ -548,14 +802,30 @@
* possible (implementation reason) or not
* allowed (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.
*/
} hwloc_cpubind_policy_t;
/** \brief Bind current process or thread on cpus given in cpuset \p set
+ *
+ * \return ENOSYS if the action is not supported
+ * \return EXDEV if the binding cannot be enforced
*/
-extern int hwloc_set_cpubind(hwloc_topology_t topology, const hwloc_cpuset_t set,
+HWLOC_DECLSPEC int hwloc_set_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t set,
int policy);
+/** \brief Get current process or thread binding
+ */
+HWLOC_DECLSPEC int hwloc_get_cpubind(hwloc_topology_t topology, hwloc_cpuset_t set, int policy);
+
/** \brief Bind a process \p pid on cpus given in cpuset \p set
*
* \note hwloc_pid_t is pid_t on unix platforms, and HANDLE on native Windows
@@ -563,8 +833,17 @@
*
* \note HWLOC_CPUBIND_THREAD can not be used in \p policy.
*/
-extern int hwloc_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, const hwloc_cpuset_t set, int policy);
+HWLOC_DECLSPEC int hwloc_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t set, int policy);
+/** \brief Get the current binding of process \p pid
+ *
+ * \note hwloc_pid_t is pid_t on unix platforms, and HANDLE on native Windows
+ * platforms
+ *
+ * \note HWLOC_CPUBIND_THREAD can not be used in \p policy.
+ */
+HWLOC_DECLSPEC int hwloc_get_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int policy);
+
/** \brief Bind a thread \p tid on cpus given in cpuset \p set
*
* \note hwloc_thread_t is pthread_t on unix platforms, and HANDLE on native
@@ -573,9 +852,20 @@
* \note HWLOC_CPUBIND_PROCESS can not be used in \p policy.
*/
#ifdef hwloc_thread_t
-extern int hwloc_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, const hwloc_cpuset_t set, int policy);
+HWLOC_DECLSPEC int hwloc_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_const_cpuset_t set, int policy);
#endif
+/** \brief Get the current binding of thread \p tid
+ *
+ * \note hwloc_thread_t is pthread_t on unix platforms, and HANDLE on native
+ * Windows platforms
+ *
+ * \note HWLOC_CPUBIND_PROCESS can not be used in \p policy.
+ */
+#ifdef hwloc_thread_t
+HWLOC_DECLSPEC int hwloc_get_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_cpuset_t set, int policy);
+#endif
+
/** @} */
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/cpuid.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/cpuid.h (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/cpuid.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,72 @@
+/*
+ * Copyright © 2010 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2010 Cisco Systems, Inc. All rights reserved.
+ *
+ * See COPYING in top-level directory.
+ */
+
+/* Internals for x86's cpuid. */
+
+#ifndef HWLOC_PRIVATE_CPUID_H
+#define HWLOC_PRIVATE_CPUID_H
+
+#ifdef HWLOC_X86_32_ARCH
+static inline int hwloc_have_cpuid(void)
+{
+ int ret;
+ unsigned tmp, tmp2;
+ asm(
+ "mov $0,%0\n\t" /* Not supported a priori */
+
+ "pushfl \n\t" /* Save flags */
+
+ "pushfl \n\t" \
+ "pop %1 \n\t" /* Get flags */ \
+
+#define TRY_TOGGLE \
+ "xor $0x00200000,%1\n\t" /* Try to toggle ID */ \
+ "mov %1,%2\n\t" /* Save expected value */ \
+ "push %1 \n\t" \
+ "popfl \n\t" /* Try to toggle */ \
+ "pushfl \n\t" \
+ "pop %1 \n\t" \
+ "cmp %1,%2\n\t" /* Compare with expected value */ \
+ "jnz Lhwloc1\n\t" /* Unexpected, failure */ \
+
+ TRY_TOGGLE /* Try to set/clear */
+ TRY_TOGGLE /* Try to clear/set */
+
+ "mov $1,%0\n\t" /* Passed the test! */
+
+ "Lhwloc1: \n\t"
+ "popfl \n\t" /* Restore flags */
+
+ : "=r" (ret), "=&r" (tmp), "=&r" (tmp2));
+ return ret;
+}
+#endif /* HWLOC_X86_32_ARCH */
+#ifdef HWLOC_X86_64_ARCH
+static inline int hwloc_have_cpuid(void) { return 1; }
+#endif /* HWLOC_X86_64_ARCH */
+
+static inline void hwloc_cpuid(unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx)
+{
+ asm(
+#ifdef HWLOC_X86_32_ARCH
+ "push %%ebx\n\t"
+#endif
+ "cpuid\n\t"
+#ifdef HWLOC_X86_32_ARCH
+ "mov %%ebx,%1\n\t"
+ "pop %%ebx\n\t"
+#endif
+ : "+a" (*eax),
+#ifdef HWLOC_X86_32_ARCH
+ "=r" (*ebx),
+#else
+ "=b" (*ebx),
+#endif
+ "+c" (*ecx), "=d" (*edx));
+}
+
+#endif /* HWLOC_PRIVATE_CPUID_H */
Deleted: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/cpuset.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/cpuset.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/cpuset.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,336 +0,0 @@
-/*
- * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
- * See COPYING in top-level directory.
- */
-
-/* Internals for cpuset API. */
-
-#ifndef HWLOC_PRIVATE_CPUSET_H
-#define HWLOC_PRIVATE_CPUSET_H
-
-#include <hwloc/config.h>
-#include <private/config.h>
-
-#include <sys/types.h>
-#include <inttypes.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-
-
-/**
- * Cpuset internals.
- */
-
-/* size and count of subsets within a set */
-#define HWLOC_CPUSUBSET_SIZE HWLOC_BITS_PER_LONG
-#define HWLOC_CPUSUBSET_COUNT ((HWLOC_NBMAXCPUS+HWLOC_CPUSUBSET_SIZE-1)/HWLOC_CPUSUBSET_SIZE)
-
-/* magic number */
-#define HWLOC_CPUSET_MAGIC 0x20091007
-
-/* actual opaque type internals */
-struct hwloc_cpuset_s {
- unsigned long s[HWLOC_CPUSUBSET_COUNT];
-#ifdef HWLOC_DEBUG
- int magic;
-#endif
-};
-
-/* extract a subset from a set using an index or a cpu */
-#define HWLOC_CPUSUBSET_SUBSET(set,x) ((set).s[x])
-#define HWLOC_CPUSUBSET_INDEX(cpu) ((cpu)/(HWLOC_CPUSUBSET_SIZE))
-#define HWLOC_CPUSUBSET_CPUSUBSET(set,cpu) HWLOC_CPUSUBSET_SUBSET(set,HWLOC_CPUSUBSET_INDEX(cpu))
-
-/* predefined subset values */
-#define HWLOC_CPUSUBSET_VAL(cpu) (1UL<<((cpu)%(HWLOC_CPUSUBSET_SIZE)))
-#define HWLOC_CPUSUBSET_ZERO 0UL
-#define HWLOC_CPUSUBSET_FULL ~0UL
-
-/* Strings always use 32bit groups */
-#define HWLOC_PRIxCPUSUBSET "%08lx"
-#define HWLOC_CPUSET_SUBSTRING_SIZE 32
-#define HWLOC_CPUSET_SUBSTRING_COUNT ((HWLOC_NBMAXCPUS+HWLOC_CPUSET_SUBSTRING_SIZE-1)/HWLOC_CPUSET_SUBSTRING_SIZE)
-#define HWLOC_CPUSET_SUBSTRING_LENGTH (HWLOC_CPUSET_SUBSTRING_SIZE/4)
-
-
-/**
- * ffsl helpers.
- */
-
-#ifdef __GNUC__
-
-# if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))
- /* Starting from 3.4, gcc has a long variant. */
-# define hwloc_ffsl(x) __builtin_ffsl(x)
-# else
-# define hwloc_ffs(x) __builtin_ffs(x)
-# define HWLOC_NEED_FFSL
-# endif
-
-#elif defined(HWLOC_HAVE_FFSL)
-
-# ifndef HWLOC_HAVE_DECL_FFSL
-extern int ffsl(long);
-# endif
-
-# define hwloc_ffsl(x) ffsl(x)
-
-#elif defined(HWLOC_HAVE_FFS)
-
-# ifndef HWLOC_HAVE_DECL_FFS
-extern int ffs(int);
-# endif
-
-# define hwloc_ffs(x) ffs(x)
-# define HWLOC_NEED_FFSL
-
-#else /* no ffs implementation */
-
-static __inline int hwloc_ffsl(unsigned long x)
-{
- int i;
-
- if (!x)
- return 0;
-
- i = 1;
-#if HWLOC_BITS_PER_LONG >= 64
- if (!(x & 0xfffffffful)) {
- x >>= 32;
- i += 32;
- }
-#endif
- if (!(x & 0xffffu)) {
- x >>= 16;
- i += 16;
- }
- if (!(x & 0xff)) {
- x >>= 8;
- i += 8;
- }
- if (!(x & 0xf)) {
- x >>= 4;
- i += 4;
- }
- if (!(x & 0x3)) {
- x >>= 2;
- i += 2;
- }
- if (!(x & 0x1)) {
- x >>= 1;
- i += 1;
- }
-
- return i;
-}
-
-#endif
-
-#ifdef HWLOC_NEED_FFSL
-
-/* We only have an int ffs(int) implementation, build a long one. */
-
-/* First make it 32 bits if it was only 16. */
-static __inline int hwloc_ffs32(unsigned long x)
-{
-#if HWLOC_BITS_PER_INT == 16
- int low_ffs, hi_ffs;
-
- low_ffs = hwloc_ffs(x & 0xfffful);
- if (low_ffs)
- return low_ffs;
-
- hi_ffs = hwloc_ffs(x >> 16);
- if (hi_ffs)
- return hi_ffs + 16;
-
- return 0;
-#else
- return hwloc_ffs(x);
-#endif
-}
-
-/* Then make it 64 bit if longs are. */
-static __inline int hwloc_ffsl(unsigned long x)
-{
-#if HWLOC_BITS_PER_LONG == 64
- int low_ffs, hi_ffs;
-
- low_ffs = hwloc_ffs32(x & 0xfffffffful);
- if (low_ffs)
- return low_ffs;
-
- hi_ffs = hwloc_ffs32(x >> 32);
- if (hi_ffs)
- return hi_ffs + 32;
-
- return 0;
-#else
- return hwloc_ffs32(x);
-#endif
-}
-#endif
-
-/**
- * flsl helpers.
- */
-#ifdef __GNUC_____
-
-# if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))
-# define hwloc_flsl(x) (x ? 8*sizeof(long) - __builtin_clzl(x) : 0)
-# else
-# define hwloc_fls(x) (x ? 8*sizeof(int) - __builtin_clz(x) : 0)
-# define HWLOC_NEED_FLSL
-# endif
-
-#elif defined(HWLOC_HAVE_FLSL)
-
-# ifndef HWLOC_HAVE_DECL_FLSL
-extern int flsl(long);
-# endif
-
-# define hwloc_flsl(x) flsl(x)
-
-#elif defined(HWLOC_HAVE_CLZL)
-
-# ifndef HWLOC_HAVE_DECL_CLZL
-extern int clzl(long);
-# endif
-
-# define hwloc_flsl(x) (x ? 8*sizeof(long) - clzl(x) : 0)
-
-#elif defined(HWLOC_HAVE_FLS)
-
-# ifndef HWLOC_HAVE_DECL_FLS
-extern int fls(int);
-# endif
-
-# define hwloc_fls(x) fls(x)
-# define HWLOC_NEED_FLSL
-
-#elif defined(HWLOC_HAVE_CLZ)
-
-# ifndef HWLOC_HAVE_DECL_CLZ
-extern int clz(int);
-# endif
-
-# define hwloc_fls(x) (x ? 8*sizeof(int) - clz(x) : 0)
-# define HWLOC_NEED_FLSL
-
-#else /* no fls implementation */
-
-static __inline int hwloc_flsl(unsigned long x)
-{
- int i = 0;
-
- if (!x)
- return 0;
-
- i = 1;
-#if HWLOC_BITS_PER_LONG >= 64
- if ((x & 0xffffffff00000000ul)) {
- x >>= 32;
- i += 32;
- }
-#endif
- if ((x & 0xffff0000u)) {
- x >>= 16;
- i += 16;
- }
- if ((x & 0xff00)) {
- x >>= 8;
- i += 8;
- }
- if ((x & 0xf0)) {
- x >>= 4;
- i += 4;
- }
- if ((x & 0xc)) {
- x >>= 2;
- i += 2;
- }
- if ((x & 0x2)) {
- x >>= 1;
- i += 1;
- }
-
- return i;
-}
-
-#endif
-
-#ifdef HWLOC_NEED_FLSL
-
-/* We only have an int fls(int) implementation, build a long one. */
-
-/* First make it 32 bits if it was only 16. */
-static __inline int hwloc_fls32(unsigned long x)
-{
-#if HWLOC_BITS_PER_INT == 16
- int low_fls, hi_fls;
-
- hi_fls = hwloc_fls(x >> 16);
- if (hi_fls)
- return hi_fls + 16;
-
- low_fls = hwloc_fls(x & 0xfffful);
- if (low_fls)
- return low_fls;
-
- return 0;
-#else
- return hwloc_fls(x);
-#endif
-}
-
-/* Then make it 64 bit if longs are. */
-static __inline int hwloc_flsl(unsigned long x)
-{
-#if HWLOC_BITS_PER_LONG == 64
- int low_fls, hi_fls;
-
- hi_fls = hwloc_fls32(x >> 32);
- if (hi_fls)
- return hi_fls + 32;
-
- low_fls = hwloc_fls32(x & 0xfffffffful);
- if (low_fls)
- return low_fls;
-
- return 0;
-#else
- return hwloc_fls32(x);
-#endif
-}
-#endif
-
-static __inline int hwloc_weight_long(unsigned long w)
-{
-#if HWLOC_BITS_PER_LONG == 32
-#if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__) >= 4)
- return __builtin_popcount(w);
-#else
- unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555);
- res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
- res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F);
- res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF);
- return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF);
-#endif
-#else /* HWLOC_BITS_PER_LONG == 32 */
-#if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__) >= 4)
- return __builtin_popcountll(w);
-#else
- unsigned long res;
- res = (w & 0x5555555555555555ul) + ((w >> 1) & 0x5555555555555555ul);
- res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul);
- res = (res & 0x0F0F0F0F0F0F0F0Ful) + ((res >> 4) & 0x0F0F0F0F0F0F0F0Ful);
- res = (res & 0x00FF00FF00FF00FFul) + ((res >> 8) & 0x00FF00FF00FF00FFul);
- res = (res & 0x0000FFFF0000FFFFul) + ((res >> 16) & 0x0000FFFF0000FFFFul);
- return (res & 0x00000000FFFFFFFFul) + ((res >> 32) & 0x00000000FFFFFFFFul);
-#endif
-#endif /* HWLOC_BITS_PER_LONG == 64 */
-}
-
-
-#endif /* HWLOC_PRIVATE_CPUSET_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/debug.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/debug.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/debug.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -14,17 +14,17 @@
#define hwloc_debug(s, ...) fprintf(stderr, s, ##__VA_ARGS__)
#define hwloc_debug_cpuset(fmt, cpuset) do { \
char *s= hwloc_cpuset_printf_value(cpuset); \
- fprintf(stderr, s, cpuset); \
+ fprintf(stderr, fmt, s); \
free(s); \
} while (0)
#define hwloc_debug_1arg_cpuset(fmt, arg1, cpuset) do { \
char *s= hwloc_cpuset_printf_value(cpuset); \
- fprintf(stderr, s, arg1, cpuset); \
+ fprintf(stderr, fmt, arg1, s); \
free(s); \
} while (0)
#define hwloc_debug_2args_cpuset(fmt, arg1, arg2, cpuset) do { \
char *s= hwloc_cpuset_printf_value(cpuset); \
- fprintf(stderr, s, arg1, arg2, cpuset); \
+ fprintf(stderr, fmt, arg1, arg2, s); \
free(s); \
} while (0)
#else
Copied: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/misc.h (from rev 6631, mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/cpuset.h)
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/misc.h (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/misc.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,315 @@
+/*
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * See COPYING in top-level directory.
+ */
+
+/* Misc internals routines. */
+
+#ifndef HWLOC_PRIVATE_MISC_H
+#define HWLOC_PRIVATE_MISC_H
+
+#include <hwloc/config.h>
+#include <private/config.h>
+#include <private/private.h>
+
+
+/* On some systems, snprintf returns the size of written data, not the actually
+ * required size. hwloc_snprintf always report the actually required size. */
+int hwloc_snprintf(char *str, size_t size, const char *format, ...) __hwloc_attribute_format(printf, 3, 4);
+
+/* Check whether needle matches the beginning of haystack, at least n, and up
+ * to a colon or \0 */
+HWLOC_DECLSPEC
+int hwloc_namecoloncmp(const char *haystack, const char *needle, size_t n);
+
+/* Compile-time assertion */
+#define HWLOC_BUILD_ASSERT(condition) ((void)sizeof(char[1 - 2*!(condition)]))
+
+
+/**
+ * ffsl helpers.
+ */
+
+#ifdef __GNUC__
+
+# if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))
+ /* Starting from 3.4, gcc has a long variant. */
+# define hwloc_ffsl(x) __builtin_ffsl(x)
+# else
+# define hwloc_ffs(x) __builtin_ffs(x)
+# define HWLOC_NEED_FFSL
+# endif
+
+#elif defined(HWLOC_HAVE_FFSL)
+
+# ifndef HWLOC_HAVE_DECL_FFSL
+extern int ffsl(long) __hwloc_attribute_const;
+# endif
+
+# define hwloc_ffsl(x) ffsl(x)
+
+#elif defined(HWLOC_HAVE_FFS)
+
+# ifndef HWLOC_HAVE_DECL_FFS
+extern int ffs(int) __hwloc_attribute_const;
+# endif
+
+# define hwloc_ffs(x) ffs(x)
+# define HWLOC_NEED_FFSL
+
+#else /* no ffs implementation */
+
+static inline int __hwloc_attribute_const
+hwloc_ffsl(unsigned long x)
+{
+ int i;
+
+ if (!x)
+ return 0;
+
+ i = 1;
+#if HWLOC_BITS_PER_LONG >= 64
+ if (!(x & 0xfffffffful)) {
+ x >>= 32;
+ i += 32;
+ }
+#endif
+ if (!(x & 0xffffu)) {
+ x >>= 16;
+ i += 16;
+ }
+ if (!(x & 0xff)) {
+ x >>= 8;
+ i += 8;
+ }
+ if (!(x & 0xf)) {
+ x >>= 4;
+ i += 4;
+ }
+ if (!(x & 0x3)) {
+ x >>= 2;
+ i += 2;
+ }
+ if (!(x & 0x1)) {
+ x >>= 1;
+ i += 1;
+ }
+
+ return i;
+}
+
+#endif
+
+#ifdef HWLOC_NEED_FFSL
+
+/* We only have an int ffs(int) implementation, build a long one. */
+
+/* First make it 32 bits if it was only 16. */
+static inline int __hwloc_attribute_const
+hwloc_ffs32(unsigned long x)
+{
+#if HWLOC_BITS_PER_INT == 16
+ int low_ffs, hi_ffs;
+
+ low_ffs = hwloc_ffs(x & 0xfffful);
+ if (low_ffs)
+ return low_ffs;
+
+ hi_ffs = hwloc_ffs(x >> 16);
+ if (hi_ffs)
+ return hi_ffs + 16;
+
+ return 0;
+#else
+ return hwloc_ffs(x);
+#endif
+}
+
+/* Then make it 64 bit if longs are. */
+static inline int __hwloc_attribute_const
+hwloc_ffsl(unsigned long x)
+{
+#if HWLOC_BITS_PER_LONG == 64
+ int low_ffs, hi_ffs;
+
+ low_ffs = hwloc_ffs32(x & 0xfffffffful);
+ if (low_ffs)
+ return low_ffs;
+
+ hi_ffs = hwloc_ffs32(x >> 32);
+ if (hi_ffs)
+ return hi_ffs + 32;
+
+ return 0;
+#else
+ return hwloc_ffs32(x);
+#endif
+}
+#endif
+
+/**
+ * flsl helpers.
+ */
+#ifdef __GNUC_____
+
+# if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))
+# define hwloc_flsl(x) (x ? 8*sizeof(long) - __builtin_clzl(x) : 0)
+# else
+# define hwloc_fls(x) (x ? 8*sizeof(int) - __builtin_clz(x) : 0)
+# define HWLOC_NEED_FLSL
+# endif
+
+#elif defined(HWLOC_HAVE_FLSL)
+
+# ifndef HWLOC_HAVE_DECL_FLSL
+extern int flsl(long) __hwloc_attribute_const;
+# endif
+
+# define hwloc_flsl(x) flsl(x)
+
+#elif defined(HWLOC_HAVE_CLZL)
+
+# ifndef HWLOC_HAVE_DECL_CLZL
+extern int clzl(long) __hwloc_attribute_const;
+# endif
+
+# define hwloc_flsl(x) (x ? 8*sizeof(long) - clzl(x) : 0)
+
+#elif defined(HWLOC_HAVE_FLS)
+
+# ifndef HWLOC_HAVE_DECL_FLS
+extern int fls(int) __hwloc_attribute_const;
+# endif
+
+# define hwloc_fls(x) fls(x)
+# define HWLOC_NEED_FLSL
+
+#elif defined(HWLOC_HAVE_CLZ)
+
+# ifndef HWLOC_HAVE_DECL_CLZ
+extern int clz(int) __hwloc_attribute_const;
+# endif
+
+# define hwloc_fls(x) (x ? 8*sizeof(int) - clz(x) : 0)
+# define HWLOC_NEED_FLSL
+
+#else /* no fls implementation */
+
+static inline int __hwloc_attribute_const
+hwloc_flsl(unsigned long x)
+{
+ int i = 0;
+
+ if (!x)
+ return 0;
+
+ i = 1;
+#if HWLOC_BITS_PER_LONG >= 64
+ if ((x & 0xffffffff00000000ul)) {
+ x >>= 32;
+ i += 32;
+ }
+#endif
+ if ((x & 0xffff0000u)) {
+ x >>= 16;
+ i += 16;
+ }
+ if ((x & 0xff00)) {
+ x >>= 8;
+ i += 8;
+ }
+ if ((x & 0xf0)) {
+ x >>= 4;
+ i += 4;
+ }
+ if ((x & 0xc)) {
+ x >>= 2;
+ i += 2;
+ }
+ if ((x & 0x2)) {
+ x >>= 1;
+ i += 1;
+ }
+
+ return i;
+}
+
+#endif
+
+#ifdef HWLOC_NEED_FLSL
+
+/* We only have an int fls(int) implementation, build a long one. */
+
+/* First make it 32 bits if it was only 16. */
+static inline int __hwloc_attribute_const
+hwloc_fls32(unsigned long x)
+{
+#if HWLOC_BITS_PER_INT == 16
+ int low_fls, hi_fls;
+
+ hi_fls = hwloc_fls(x >> 16);
+ if (hi_fls)
+ return hi_fls + 16;
+
+ low_fls = hwloc_fls(x & 0xfffful);
+ if (low_fls)
+ return low_fls;
+
+ return 0;
+#else
+ return hwloc_fls(x);
+#endif
+}
+
+/* Then make it 64 bit if longs are. */
+static inline int __hwloc_attribute_const
+hwloc_flsl(unsigned long x)
+{
+#if HWLOC_BITS_PER_LONG == 64
+ int low_fls, hi_fls;
+
+ hi_fls = hwloc_fls32(x >> 32);
+ if (hi_fls)
+ return hi_fls + 32;
+
+ low_fls = hwloc_fls32(x & 0xfffffffful);
+ if (low_fls)
+ return low_fls;
+
+ return 0;
+#else
+ return hwloc_fls32(x);
+#endif
+}
+#endif
+
+static inline int __hwloc_attribute_const
+hwloc_weight_long(unsigned long w)
+{
+#if HWLOC_BITS_PER_LONG == 32
+#if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__) >= 4)
+ return __builtin_popcount(w);
+#else
+ unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555);
+ res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
+ res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F);
+ res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF);
+ return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF);
+#endif
+#else /* HWLOC_BITS_PER_LONG == 32 */
+#if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__) >= 4)
+ return __builtin_popcountll(w);
+#else
+ unsigned long res;
+ res = (w & 0x5555555555555555ul) + ((w >> 1) & 0x5555555555555555ul);
+ res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul);
+ res = (res & 0x0F0F0F0F0F0F0F0Ful) + ((res >> 4) & 0x0F0F0F0F0F0F0F0Ful);
+ res = (res & 0x00FF00FF00FF00FFul) + ((res >> 8) & 0x00FF00FF00FF00FFul);
+ res = (res & 0x0000FFFF0000FFFFul) + ((res >> 16) & 0x0000FFFF0000FFFFul);
+ return (res & 0x00000000FFFFFFFFul) + ((res >> 32) & 0x00000000FFFFFFFFul);
+#endif
+#endif /* HWLOC_BITS_PER_LONG == 64 */
+}
+
+
+#endif /* HWLOC_PRIVATE_MISC_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/private.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/private.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/include/private/private.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,6 +1,7 @@
/*
- * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
- * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
+ *
* See COPYING in top-level directory.
*/
@@ -14,13 +15,22 @@
#include <hwloc/cpuset.h>
#include <private/debug.h>
-#include <assert.h>
#include <string.h>
+#ifdef HWLOC_HAVE_ATTRIBUTE_FORMAT
+# if HWLOC_HAVE_ATTRIBUTE_FORMAT
+# define __hwloc_attribute_format(type, str, arg) __attribute__((__format__(type, str, arg)))
+# else
+# define __hwloc_attribute_format(type, str, arg)
+# endif
+#else
+# define __hwloc_attribute_format(type, str, arg)
+#endif
+
enum hwloc_ignore_type_e {
HWLOC_IGNORE_TYPE_NEVER = 0,
HWLOC_IGNORE_TYPE_KEEP_STRUCTURE,
- HWLOC_IGNORE_TYPE_ALWAYS,
+ HWLOC_IGNORE_TYPE_ALWAYS
};
/* Maximal value of an object type */
@@ -30,12 +40,15 @@
typedef enum hwloc_backend_e {
HWLOC_BACKEND_NONE,
HWLOC_BACKEND_SYNTHETIC,
-#ifdef LINUX_SYS
+#ifdef HWLOC_LINUX_SYS
HWLOC_BACKEND_SYSFS,
#endif
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
HWLOC_BACKEND_XML,
#endif
+ /* This value is only here so that we can end the enum list without
+ a comma (thereby preventing compiler warnings) */
+ HWLOC_BACKEND_MAX
} hwloc_backend_t;
struct hwloc_topology {
@@ -47,34 +60,40 @@
enum hwloc_ignore_type_e ignored_types[HWLOC_OBJ_TYPE_MAX];
int is_thissystem;
int is_loaded;
+ hwloc_pid_t pid; /* Process ID the topology is view from, 0 for self */
- int (*set_cpubind)(hwloc_topology_t topology, hwloc_cpuset_t set, int strict);
- int (*set_thisproc_cpubind)(hwloc_topology_t topology, hwloc_cpuset_t set, int strict);
- int (*set_thisthread_cpubind)(hwloc_topology_t topology, hwloc_cpuset_t set, int strict);
- int (*set_proc_cpubind)(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int strict);
+ int (*set_thisproc_cpubind)(hwloc_topology_t topology, hwloc_const_cpuset_t set, int policy);
+ int (*get_thisproc_cpubind)(hwloc_topology_t topology, hwloc_cpuset_t set, int policy);
+ int (*set_thisthread_cpubind)(hwloc_topology_t topology, hwloc_const_cpuset_t set, int policy);
+ int (*get_thisthread_cpubind)(hwloc_topology_t topology, hwloc_cpuset_t set, int policy);
+ int (*set_proc_cpubind)(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t set, int policy);
+ int (*get_proc_cpubind)(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int policy);
#ifdef hwloc_thread_t
- int (*set_thread_cpubind)(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_cpuset_t set, int strict);
+ int (*set_thread_cpubind)(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_const_cpuset_t set, int policy);
+ int (*get_thread_cpubind)(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_cpuset_t set, int policy);
#endif
+ struct hwloc_topology_support support;
+
hwloc_backend_t backend_type;
union hwloc_backend_params_u {
-#ifdef LINUX_SYS
+#ifdef HWLOC_LINUX_SYS
struct hwloc_backend_params_sysfs_s {
/* sysfs backend parameters */
int root_fd; /* The file descriptor for the file system root, used when browsing, e.g., Linux' sysfs and procfs. */
} sysfs;
-#endif /* LINUX_SYS */
-#if defined(OSF_SYS) || defined(HWLOC_COMPILE_PORTS)
+#endif /* HWLOC_LINUX_SYS */
+#if defined(HWLOC_OSF_SYS) || defined(HWLOC_COMPILE_PORTS)
struct hwloc_backend_params_osf {
int nbnodes;
} osf;
-#endif /* OSF_SYS */
-#ifdef HAVE_XML
+#endif /* HWLOC_OSF_SYS */
+#ifdef HWLOC_HAVE_XML
struct hwloc_backend_params_xml_s {
/* xml backend parameters */
void *doc;
} xml;
-#endif /* HAVE_XML */
+#endif /* HWLOC_HAVE_XML */
struct hwloc_backend_params_synthetic_s {
/* synthetic backend parameters */
#define HWLOC_SYNTHETIC_MAX_DEPTH 128
@@ -87,83 +106,120 @@
};
-extern void hwloc_setup_proc_level(struct hwloc_topology *topology, unsigned nb_processors, hwloc_cpuset_t online_cpuset);
+extern void hwloc_setup_pu_level(struct hwloc_topology *topology, unsigned nb_pus);
extern void hwloc_setup_misc_level_from_distances(struct hwloc_topology *topology, unsigned nbobjs, struct hwloc_obj **objs, unsigned *_distances/*[nbnobjs][nbobjs]*/);
-extern unsigned hwloc_fallback_nbprocessors(void);
+extern int hwloc_get_sysctlbyname(const char *name, int *n);
+extern int hwloc_get_sysctl(int name[], unsigned namelen, int *n);
+extern unsigned hwloc_fallback_nbprocessors(struct hwloc_topology *topology);
-#if defined(LINUX_SYS)
+#if defined(HWLOC_LINUX_SYS)
extern void hwloc_look_linux(struct hwloc_topology *topology);
extern void hwloc_set_linux_hooks(struct hwloc_topology *topology);
extern int hwloc_backend_sysfs_init(struct hwloc_topology *topology, const char *fsroot_path);
extern void hwloc_backend_sysfs_exit(struct hwloc_topology *topology);
-#endif /* LINUX_SYS */
+#endif /* HWLOC_LINUX_SYS */
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
extern int hwloc_backend_xml_init(struct hwloc_topology *topology, const char *xmlpath);
extern void hwloc_look_xml(struct hwloc_topology *topology);
extern void hwloc_backend_xml_exit(struct hwloc_topology *topology);
-#endif /* HAVE_XML */
+#endif /* HWLOC_HAVE_XML */
-#ifdef SOLARIS_SYS
+#ifdef HWLOC_SOLARIS_SYS
extern void hwloc_look_solaris(struct hwloc_topology *topology);
extern void hwloc_set_solaris_hooks(struct hwloc_topology *topology);
-#endif /* SOLARIS_SYS */
+#endif /* HWLOC_SOLARIS_SYS */
-#ifdef AIX_SYS
+#ifdef HWLOC_AIX_SYS
extern void hwloc_look_aix(struct hwloc_topology *topology);
extern void hwloc_set_aix_hooks(struct hwloc_topology *topology);
-#endif /* AIX_SYS */
+#endif /* HWLOC_AIX_SYS */
-#ifdef OSF_SYS
+#ifdef HWLOC_OSF_SYS
extern void hwloc_look_osf(struct hwloc_topology *topology);
extern void hwloc_set_osf_hooks(struct hwloc_topology *topology);
-#endif /* OSF_SYS */
+#endif /* HWLOC_OSF_SYS */
-#ifdef WIN_SYS
+#ifdef HWLOC_WIN_SYS
extern void hwloc_look_windows(struct hwloc_topology *topology);
extern void hwloc_set_windows_hooks(struct hwloc_topology *topology);
-#endif /* WIN_SYS */
+#endif /* HWLOC_WIN_SYS */
-#ifdef DARWIN_SYS
+#ifdef HWLOC_DARWIN_SYS
extern void hwloc_look_darwin(struct hwloc_topology *topology);
extern void hwloc_set_darwin_hooks(struct hwloc_topology *topology);
-#endif /* DARWIN_SYS */
+#endif /* HWLOC_DARWIN_SYS */
-#ifdef HPUX_SYS
+#ifdef HWLOC_FREEBSD_SYS
+extern void hwloc_look_freebsd(struct hwloc_topology *topology);
+extern void hwloc_set_freebsd_hooks(struct hwloc_topology *topology);
+#endif /* HWLOC_FREEBSD_SYS */
+
+#ifdef HWLOC_HPUX_SYS
extern void hwloc_look_hpux(struct hwloc_topology *topology);
extern void hwloc_set_hpux_hooks(struct hwloc_topology *topology);
-#endif /* HPUX_SYS */
+#endif /* HWLOC_HPUX_SYS */
+extern void hwloc_look_x86(struct hwloc_topology *topology, unsigned nbprocs);
+
extern int hwloc_backend_synthetic_init(struct hwloc_topology *topology, const char *description);
extern void hwloc_backend_synthetic_exit(struct hwloc_topology *topology);
extern void hwloc_look_synthetic (struct hwloc_topology *topology);
-extern void hwloc_add_object(struct hwloc_topology *topology, hwloc_obj_t obj);
+/*
+ * Add an object to the topology.
+ * 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.
+ */
+extern void hwloc_insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t obj);
+/*
+ * 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.
+ *
+ * The given object may have children.
+ *
+ * Remember to call topology_connect() afterwards to fix handy pointers.
+ */
+extern void hwloc_insert_object_by_parent(struct hwloc_topology *topology, hwloc_obj_t parent, hwloc_obj_t obj);
/** \brief Return a locally-allocated stringified cpuset for printf-like calls. */
-static __inline char *
-hwloc_cpuset_printf_value(hwloc_cpuset_t cpuset)
+static inline char *
+hwloc_cpuset_printf_value(hwloc_const_cpuset_t cpuset)
{
char *buf;
hwloc_cpuset_asprintf(&buf, cpuset);
return buf;
}
-static __inline struct hwloc_obj *
+static inline struct hwloc_obj *
hwloc_alloc_setup_object(hwloc_obj_type_t type, signed idx)
{
struct hwloc_obj *obj = malloc(sizeof(*obj));
- assert(obj);
memset(obj, 0, sizeof(*obj));
obj->type = type;
obj->os_index = idx;
obj->os_level = -1;
obj->attr = malloc(sizeof(*obj->attr));
+ memset(obj->attr, 0, sizeof(*obj->attr));
/* do not allocate the cpuset here, let the caller do it */
return obj;
}
+extern void free_object(hwloc_obj_t obj);
+
#define hwloc_object_cpuset_from_array(l, _value, _array, _max) do { \
struct hwloc_obj *__l = (l); \
unsigned int *__a = (_array); \
@@ -177,11 +233,11 @@
/* Configures an array of NUM objects of type TYPE with physical IDs OSPHYSIDS
* and for which processors have ID PROC_PHYSIDS, and add them to the topology.
* */
-static __inline void
+static inline void
hwloc_setup_level(int procid_max, unsigned num, unsigned *osphysids, unsigned *proc_physids, struct hwloc_topology *topology, hwloc_obj_type_t type)
{
struct hwloc_obj *obj;
- int j;
+ unsigned j;
hwloc_debug("%d %s\n", num, hwloc_obj_type_string(type));
@@ -192,13 +248,9 @@
hwloc_debug_2args_cpuset("%s %d has cpuset %s\n",
hwloc_obj_type_string(type),
j, obj->cpuset);
- hwloc_add_object(topology, obj);
+ hwloc_insert_object_by_cpuset(topology, obj);
}
- hwloc_debug("\n");
+ hwloc_debug("%s", "\n");
}
-/* On some systems, snprintf returns the size of written data, not the actually
- * required size. hwloc_snprintf always report the actually required size. */
-int hwloc_snprintf(char *str, size_t size, const char *format, ...);
-
#endif /* HWLOC_PRIVATE_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/Makefile.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/Makefile.am 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/Makefile.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,88 +1,113 @@
-# Copyright 2009 INRIA, Université Bordeaux 1
+# Copyright © 2009 INRIA, Université Bordeaux 1
+# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
-include $(top_srcdir)/hwloc.am
+AM_CFLAGS = $(HWLOC_CFLAGS)
+AM_CPPFLAGS = $(HWLOC_CPPFLAGS)
+AM_LDFLAGS = $(HWLOC_LDFLAGS)
-AM_CFLAGS += $(XML_CFLAGS)
+EXTRA_DIST = dolib.c
+# If we're in standalone mode, build the installable library.
+# Otherwise, build the embedded library.
+
+if HWLOC_BUILD_STANDALONE
lib_LTLIBRARIES = libhwloc.la
+else
+noinst_LTLIBRARIES = libhwloc_embedded.la
+endif
-EXTRA_DIST = dolib.c
+# Sources and ldflags
-libhwloc_la_SOURCES = topology.c traversal.c topology-synthetic.c bind.c cpuset.c
-libhwloc_la_LDFLAGS = -version-number $(libhwloc_so_version) $(XML_LIBS)
+sources = \
+ topology.c \
+ traversal.c \
+ topology-synthetic.c \
+ bind.c \
+ cpuset.c \
+ misc.c
+ldflags =
-if HAVE_GCC
-libhwloc_la_LDFLAGS += -no-undefined
-endif
+# Conditionally add to the sources and ldflags
-if HAVE_WINDOWS
-libhwloc_la_LDFLAGS += -Xlinker --output-def -Xlinker .libs/libhwloc.def
+if HWLOC_HAVE_XML
+sources += topology-xml.c
+endif HWLOC_HAVE_XML
-if HAVE_MS_LIB
+if HWLOC_HAVE_SOLARIS
+sources += topology-solaris.c
+endif HWLOC_HAVE_SOLARIS
+
+if HWLOC_HAVE_LINUX
+sources += topology-linux.c
+endif HWLOC_HAVE_LINUX
+
+if HWLOC_HAVE_AIX
+sources += topology-aix.c
+ldflags += -lpthread
+endif HWLOC_HAVE_AIX
+
+if HWLOC_HAVE_OSF
+sources += topology-osf.c
+ldflags += -lnuma -lpthread
+endif HWLOC_HAVE_OSF
+
+if HWLOC_HAVE_HPUX
+sources += topology-hpux.c
+ldflags += -lpthread
+endif HWLOC_HAVE_HPUX
+
+if HWLOC_HAVE_WINDOWS
+sources += topology-windows.c
+endif HWLOC_HAVE_WINDOWS
+
+if HWLOC_HAVE_DARWIN
+sources += topology-darwin.c
+endif HWLOC_HAVE_DARWIN
+
+if HWLOC_HAVE_FREEBSD
+sources += topology-freebsd.c
+endif HWLOC_HAVE_FREEBSD
+
+if HWLOC_HAVE_GCC
+ldflags += -no-undefined
+endif HWLOC_HAVE_GCC
+
+if HWLOC_HAVE_WINDOWS
+ldflags += -Xlinker --output-def -Xlinker .libs/libhwloc.def
+
+if HWLOC_HAVE_MS_LIB
.libs/libhwloc.lib: libhwloc.la dolib
./dolib "$(HWLOC_MS_LIB)" X86 .libs/libhwloc.def libhwloc-$(HWLOC_SOVERSION) .libs/libhwloc.lib
all-local: .libs/libhwloc.lib
-endif
+endif HWLOC_HAVE_MS_LIB
install-exec-hook:
$(INSTALL) .libs/libhwloc.def $(DESTDIR)$(libdir)
-if HAVE_MS_LIB
+if HWLOC_HAVE_MS_LIB
$(INSTALL) .libs/libhwloc.lib $(DESTDIR)$(libdir)
$(INSTALL) .libs/libhwloc.exp $(DESTDIR)$(libdir)
-endif
-endif
+endif HWLOC_HAVE_MS_LIB
+endif HWLOC_HAVE_WINDOWS
-if HAVE_XML
-libhwloc_la_SOURCES += topology-xml.c
-else !HAVE_XML
-EXTRA_DIST += topology-xml.c
-endif !HAVE_XML
+if HWLOC_HAVE_CPUID
+sources += topology-x86.c
+endif HWLOC_HAVE_CPUID
-if HAVE_SOLARIS
-libhwloc_la_SOURCES += topology-solaris.c
-else !HAVE_SOLARIS
-EXTRA_DIST += topology-solaris.c
-endif !HAVE_SOLARIS
+# Installable library
-if HAVE_LINUX
-libhwloc_la_SOURCES += topology-linux.c
-else !HAVE_LINUX
-EXTRA_DIST += topology-linux.c
-endif !HAVE_LINUX
+libhwloc_la_SOURCES = $(sources)
+libhwloc_la_LDFLAGS = $(ldflags) -version-number $(libhwloc_so_version) $(HWLOC_XML_LIBS)
-if HAVE_AIX
-libhwloc_la_SOURCES += topology-aix.c
-libhwloc_la_LDFLAGS += -lpthread
-else !HAVE_AIX
-EXTRA_DIST += topology-aix.c
-endif !HAVE_AIX
+# Embedded library (note the lack of a .so version number -- that
+# intentionally only appears in the installable library)
-if HAVE_OSF
-libhwloc_la_SOURCES += topology-osf.c
-libhwloc_la_LDFLAGS += -lnuma -lpthread
-else !HAVE_OSF
-EXTRA_DIST += topology-osf.c
-endif !HAVE_OSF
+libhwloc_embedded_la_SOURCES = $(sources)
+libhwloc_embedded_la_LDFLAGS = $(ldflags) $(HWLOC_XML_LIBS)
-if HAVE_HPUX
-libhwloc_la_SOURCES += topology-hpux.c
-libhwloc_la_LDFLAGS += -lpthread
-else !HAVE_HPUX
-EXTRA_DIST += topology-hpux.c
-endif !HAVE_HPUX
+# XML data (only install if we're building in standalone mode)
-if HAVE_WINDOWS
-libhwloc_la_SOURCES += topology-windows.c
-else !HAVE_WINDOWS
-EXTRA_DIST += topology-windows.c
-endif !HAVE_WINDOWS
-
-if HAVE_DARWIN
-libhwloc_la_SOURCES += topology-darwin.c
-else !HAVE_DARWIN
-EXTRA_DIST += topology-darwin.c
-endif !HAVE_DARWIN
-
+if HWLOC_BUILD_STANDALONE
xml_DATA = $(srcdir)/hwloc.dtd
xmldir = $(pkgdatadir)
EXTRA_DIST += hwloc.dtd
+endif
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/bind.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/bind.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/bind.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -10,32 +10,55 @@
#include <errno.h>
-/* TODO: GNU_SYS, FREEBSD_SYS, DARWIN_SYS, IRIX_SYS, HPUX_SYS
- * IRIX: see _DSM_MUSTRUN */
+/* TODO: HWLOC_GNU_SYS, HWLOC_IRIX_SYS,
+ * IRIX: see _DSM_MUSTRUN
+ *
+ * We could use glibc's sched_setaffinity generically when it is available
+ *
+ * Darwin and OpenBSD don't seem to have binding facilities.
+ */
-int
-hwloc_set_cpubind(hwloc_topology_t topology, hwloc_cpuset_t set, int policy)
+static hwloc_const_cpuset_t
+hwloc_fix_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t set)
{
- int strict = !!(policy & HWLOC_CPUBIND_STRICT);
- hwloc_cpuset_t system_set = hwloc_get_system_obj(topology)->cpuset;
+ hwloc_const_cpuset_t topology_set = hwloc_topology_get_topology_cpuset(topology);
+ hwloc_const_cpuset_t complete_set = hwloc_topology_get_complete_cpuset(topology);
- if (hwloc_cpuset_isfull(set))
- set = system_set;
+ if (!topology_set) {
+ /* The topology is composed of several systems, the cpuset is ambiguous. */
+ errno = EXDEV;
+ return NULL;
+ }
- if (!hwloc_cpuset_isincluded(set, system_set)) {
+ if (!hwloc_cpuset_isincluded(set, complete_set)) {
errno = EINVAL;
- return -1;
+ return NULL;
}
+ if (hwloc_cpuset_isincluded(topology_set, set))
+ set = complete_set;
+
+ return set;
+}
+
+int
+hwloc_set_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t set, int policy)
+{
+ set = hwloc_fix_cpubind(topology, set);
+ if (!set)
+ return -1;
+
if (policy & HWLOC_CPUBIND_PROCESS) {
if (topology->set_thisproc_cpubind)
- return topology->set_thisproc_cpubind(topology, set, strict);
+ return topology->set_thisproc_cpubind(topology, set, policy);
} else if (policy & HWLOC_CPUBIND_THREAD) {
if (topology->set_thisthread_cpubind)
- return topology->set_thisthread_cpubind(topology, set, strict);
+ return topology->set_thisthread_cpubind(topology, set, policy);
} else {
- if (topology->set_cpubind)
- return topology->set_cpubind(topology, set, strict);
+ if (topology->set_thisproc_cpubind)
+ return topology->set_thisproc_cpubind(topology, set, policy);
+ else if (topology->set_thisthread_cpubind)
+ return topology->set_thisthread_cpubind(topology, set, policy);
}
errno = ENOSYS;
@@ -43,47 +66,73 @@
}
int
-hwloc_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int policy)
+hwloc_get_cpubind(hwloc_topology_t topology, hwloc_cpuset_t set, int policy)
{
- int strict = !!(policy & HWLOC_CPUBIND_STRICT);
- hwloc_cpuset_t system_set = hwloc_get_system_obj(topology)->cpuset;
+ if (policy & HWLOC_CPUBIND_PROCESS) {
+ if (topology->get_thisproc_cpubind)
+ return topology->get_thisproc_cpubind(topology, set, policy);
+ } else if (policy & HWLOC_CPUBIND_THREAD) {
+ if (topology->get_thisthread_cpubind)
+ return topology->get_thisthread_cpubind(topology, set, policy);
+ } else {
+ if (topology->get_thisproc_cpubind)
+ return topology->get_thisproc_cpubind(topology, set, policy);
+ else if (topology->get_thisthread_cpubind)
+ return topology->get_thisthread_cpubind(topology, set, policy);
+ }
- if (hwloc_cpuset_isfull(set))
- set = hwloc_get_system_obj(topology)->cpuset;
+ errno = ENOSYS;
+ return -1;
+}
- if (!hwloc_cpuset_isincluded(set, system_set)) {
- errno = EINVAL;
+int
+hwloc_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t set, int policy)
+{
+ set = hwloc_fix_cpubind(topology, set);
+ if (!set)
return -1;
- }
if (topology->set_proc_cpubind)
- return topology->set_proc_cpubind(topology, pid, set, strict);
+ return topology->set_proc_cpubind(topology, pid, set, policy);
errno = ENOSYS;
return -1;
}
-#ifdef hwloc_thread_t
int
-hwloc_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_cpuset_t set, int policy)
+hwloc_get_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int policy)
{
- int strict = !!(policy & HWLOC_CPUBIND_STRICT);
- hwloc_cpuset_t system_set = hwloc_get_system_obj(topology)->cpuset;
+ if (topology->get_proc_cpubind)
+ return topology->get_proc_cpubind(topology, pid, set, policy);
- if (hwloc_cpuset_isfull(set))
- set = hwloc_get_system_obj(topology)->cpuset;
+ errno = ENOSYS;
+ return -1;
+}
- if (!hwloc_cpuset_isincluded(set, system_set)) {
- errno = EINVAL;
+#ifdef hwloc_thread_t
+int
+hwloc_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_const_cpuset_t set, int policy)
+{
+ set = hwloc_fix_cpubind(topology, set);
+ if (!set)
return -1;
- }
if (topology->set_thread_cpubind)
- return topology->set_thread_cpubind(topology, tid, set, strict);
+ return topology->set_thread_cpubind(topology, tid, set, policy);
errno = ENOSYS;
return -1;
}
+
+int
+hwloc_get_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_cpuset_t set, int policy)
+{
+ if (topology->get_thread_cpubind)
+ return topology->get_thread_cpubind(topology, tid, set, policy);
+
+ errno = ENOSYS;
+ return -1;
+}
#endif
/* TODO: memory bind */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/cpuset.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/cpuset.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/cpuset.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -5,7 +5,7 @@
*/
#include <private/config.h>
-#include <private/cpuset.h>
+#include <private/misc.h>
#include <private/private.h>
#include <hwloc/cpuset.h>
@@ -13,8 +13,23 @@
#include <stdio.h>
#include <assert.h>
#include <errno.h>
+#include <ctype.h>
+/* size and count of subsets within a set */
+#define HWLOC_CPUSUBSET_SIZE HWLOC_BITS_PER_LONG
+#define HWLOC_CPUSUBSET_COUNT ((HWLOC_NBMAXCPUS+HWLOC_CPUSUBSET_SIZE-1)/HWLOC_CPUSUBSET_SIZE)
+/* magic number */
+#define HWLOC_CPUSET_MAGIC 0x20091007
+
+/* actual opaque type internals */
+struct hwloc_cpuset_s {
+ unsigned long s[HWLOC_CPUSUBSET_COUNT];
+#ifdef HWLOC_DEBUG
+ int magic;
+#endif
+};
+
/* overzealous check in debug-mode, not as powerful as valgrind but still useful */
#ifdef HWLOC_DEBUG
#define HWLOC__CPUSET_CHECK(set) assert((set)->magic == HWLOC_CPUSET_MAGIC)
@@ -22,55 +37,40 @@
#define HWLOC__CPUSET_CHECK(set)
#endif
-int hwloc_snprintf(char *str, size_t size, const char *format, ...)
-{
- int ret;
- va_list ap;
- static char bin;
+/* extract a subset from a set using an index or a cpu */
+#define HWLOC_CPUSUBSET_SUBSET(set,x) ((set).s[x])
+#define HWLOC_CPUSUBSET_INDEX(cpu) ((cpu)/(HWLOC_CPUSUBSET_SIZE))
+#define HWLOC_CPUSUBSET_CPUSUBSET(set,cpu) HWLOC_CPUSUBSET_SUBSET(set,HWLOC_CPUSUBSET_INDEX(cpu))
- /* Some systems crash on str == NULL */
- if (!size) {
- str = &bin;
- size = 1;
- }
+/* predefined subset values */
+#define HWLOC_CPUSUBSET_VAL(cpu) (1UL<<((cpu)%(HWLOC_CPUSUBSET_SIZE)))
+#define HWLOC_CPUSUBSET_ZERO 0UL
+#define HWLOC_CPUSUBSET_FULL ~0UL
- va_start(ap, format);
- ret = vsnprintf(str, size, format, ap);
- va_end(ap);
+/* Strings always use 32bit groups */
+#define HWLOC_PRIxCPUSUBSET "%08lx"
+#define HWLOC_CPUSET_SUBSTRING_SIZE 32
+#define HWLOC_CPUSET_SUBSTRING_COUNT ((HWLOC_NBMAXCPUS+HWLOC_CPUSET_SUBSTRING_SIZE-1)/HWLOC_CPUSET_SUBSTRING_SIZE)
+#define HWLOC_CPUSET_SUBSTRING_LENGTH (HWLOC_CPUSET_SUBSTRING_SIZE/4)
- if (ret >= 0 && ret != size-1)
- return ret;
-
- /* vsnprintf returned size-1 or -1. That could be a system which reports the
- * written data and not the actually required room. Try increasing buffer
- * size to get the latter. */
-
- do {
- size *= 2;
- str = malloc(size);
- va_start(ap, format);
- errno = 0;
- ret = vsnprintf(str, size, format, ap);
- va_end(ap);
- free(str);
- } while (ret == size-1 || (ret < 0 && !errno));
-
- return ret;
-}
-
struct hwloc_cpuset_s * hwloc_cpuset_alloc(void)
{
struct hwloc_cpuset_s * set;
set = calloc(sizeof(*set), 1);
+ if (!set)
+ return NULL;
+
#ifdef HWLOC_DEBUG
- if (set)
- set->magic = HWLOC_CPUSET_MAGIC;
+ set->magic = HWLOC_CPUSET_MAGIC;
#endif
return set;
}
void hwloc_cpuset_free(struct hwloc_cpuset_s * set)
{
+ if (!set)
+ return;
+
HWLOC__CPUSET_CHECK(set);
#ifdef HWLOC_DEBUG
set->magic = 0;
@@ -79,23 +79,21 @@
free(set);
}
-struct hwloc_cpuset_s * hwloc_cpuset_dup(struct hwloc_cpuset_s * old)
+struct hwloc_cpuset_s * hwloc_cpuset_dup(const struct hwloc_cpuset_s * old)
{
struct hwloc_cpuset_s * new;
HWLOC__CPUSET_CHECK(old);
new = malloc(sizeof(*new));
- if (new) {
-#ifdef HWLOC_DEBUG
- new->magic = HWLOC_CPUSET_MAGIC;
-#endif
- memcpy(new, old, sizeof(*new));
- }
+ if (!new)
+ return NULL;
+
+ memcpy(new, old, sizeof(*new));
return new;
}
-void hwloc_cpuset_copy(struct hwloc_cpuset_s * dst, struct hwloc_cpuset_s * src)
+void hwloc_cpuset_copy(struct hwloc_cpuset_s * dst, const struct hwloc_cpuset_s * src)
{
HWLOC__CPUSET_CHECK(dst);
HWLOC__CPUSET_CHECK(src);
@@ -134,12 +132,12 @@
if (accum & accum_mask) {
/* print the whole subset if not empty */
- res = hwloc_snprintf(tmp, size, needcomma ? "," HWLOC_PRIxCPUSUBSET : HWLOC_PRIxCPUSUBSET,
+ res = hwloc_snprintf(tmp, size, needcomma ? ",0x" HWLOC_PRIxCPUSUBSET : "0x" HWLOC_PRIxCPUSUBSET,
(accum & accum_mask) >> (HWLOC_BITS_PER_LONG - HWLOC_CPUSET_SUBSTRING_SIZE));
needcomma = 1;
} else if (i == -1 && accumed == HWLOC_CPUSET_SUBSTRING_SIZE) {
/* print a single 0 to mark the last subset */
- res = hwloc_snprintf(tmp, size, needcomma ? ",0" : "0");
+ res = hwloc_snprintf(tmp, size, needcomma ? ",0x0" : "0x0");
} else if (needcomma) {
res = hwloc_snprintf(tmp, size, ",");
} else {
@@ -180,17 +178,14 @@
return hwloc_cpuset_snprintf(buf, len+1, set);
}
-struct hwloc_cpuset_s * hwloc_cpuset_from_string(const char * __hwloc_restrict string)
+int hwloc_cpuset_from_string(struct hwloc_cpuset_s *set, const char * __hwloc_restrict string)
{
- struct hwloc_cpuset_s * set;
- char * current = (char *) string;
+ const char * current = string;
int count=0, i;
unsigned long accum = 0;
int accumed = 0;
- set = hwloc_cpuset_alloc();
- if (!set)
- return NULL;
+ hwloc_cpuset_zero(set);
while (*current != '\0') {
unsigned long val;
@@ -211,7 +206,7 @@
}
if (*next != ',')
break;
- current = next+1;
+ current = (const char*) next+1;
if (count == HWLOC_CPUSUBSET_COUNT)
break;
}
@@ -229,7 +224,7 @@
for( ; i<HWLOC_CPUSUBSET_COUNT; i++)
set->s[i] = 0;
- return set;
+ return 0;
}
void hwloc_cpuset_zero(struct hwloc_cpuset_s * set)
@@ -263,9 +258,9 @@
HWLOC_CPUSUBSET_SUBSET(*set,i) = HWLOC_CPUSUBSET_ZERO;
}
-void hwloc_cpuset_from_ith_ulong(struct hwloc_cpuset_s *set, int i, unsigned long mask)
+void hwloc_cpuset_from_ith_ulong(struct hwloc_cpuset_s *set, unsigned i, unsigned long mask)
{
- int j;
+ unsigned j;
HWLOC__CPUSET_CHECK(set);
@@ -282,7 +277,7 @@
return HWLOC_CPUSUBSET_SUBSET(*set,0);
}
-unsigned long hwloc_cpuset_to_ith_ulong(const struct hwloc_cpuset_s *set, int i)
+unsigned long hwloc_cpuset_to_ith_ulong(const struct hwloc_cpuset_s *set, unsigned i)
{
HWLOC__CPUSET_CHECK(set);
@@ -314,7 +309,7 @@
void hwloc_cpuset_set_range(struct hwloc_cpuset_s * set, unsigned begincpu, unsigned endcpu)
{
- int i;
+ unsigned i;
HWLOC__CPUSET_CHECK(set);
@@ -329,6 +324,16 @@
HWLOC_CPUSUBSET_CPUSUBSET(*set,cpu) &= ~HWLOC_CPUSUBSET_VAL(cpu);
}
+void hwloc_cpuset_clr_range(struct hwloc_cpuset_s * set, unsigned begincpu, unsigned endcpu)
+{
+ unsigned i;
+
+ HWLOC__CPUSET_CHECK(set);
+
+ for (i=begincpu; i<=endcpu; i++)
+ HWLOC_CPUSUBSET_CPUSUBSET(*set,i) &= ~HWLOC_CPUSUBSET_VAL(i);
+}
+
int hwloc_cpuset_isset(const struct hwloc_cpuset_s * set, unsigned cpu)
{
HWLOC__CPUSET_CHECK(set);
@@ -399,48 +404,63 @@
return 1;
}
-void hwloc_cpuset_orset (struct hwloc_cpuset_s *set, const struct hwloc_cpuset_s *modifier_set)
+void hwloc_cpuset_or (struct hwloc_cpuset_s *res, const struct hwloc_cpuset_s *set1, const struct hwloc_cpuset_s *set2)
{
int i;
- HWLOC__CPUSET_CHECK(set);
- HWLOC__CPUSET_CHECK(modifier_set);
+ HWLOC__CPUSET_CHECK(res);
+ HWLOC__CPUSET_CHECK(set1);
+ HWLOC__CPUSET_CHECK(set2);
for(i=0; i<HWLOC_CPUSUBSET_COUNT; i++)
- HWLOC_CPUSUBSET_SUBSET(*set,i) |= HWLOC_CPUSUBSET_SUBSET(*modifier_set,i);
+ HWLOC_CPUSUBSET_SUBSET(*res,i) = HWLOC_CPUSUBSET_SUBSET(*set1,i) | HWLOC_CPUSUBSET_SUBSET(*set2,i);
}
-void hwloc_cpuset_andset (struct hwloc_cpuset_s *set, const struct hwloc_cpuset_s *modifier_set)
+void hwloc_cpuset_and (struct hwloc_cpuset_s *res, const struct hwloc_cpuset_s *set1, const struct hwloc_cpuset_s *set2)
{
int i;
- HWLOC__CPUSET_CHECK(set);
- HWLOC__CPUSET_CHECK(modifier_set);
+ HWLOC__CPUSET_CHECK(res);
+ HWLOC__CPUSET_CHECK(set1);
+ HWLOC__CPUSET_CHECK(set2);
for(i=0; i<HWLOC_CPUSUBSET_COUNT; i++)
- HWLOC_CPUSUBSET_SUBSET(*set,i) &= HWLOC_CPUSUBSET_SUBSET(*modifier_set,i);
+ HWLOC_CPUSUBSET_SUBSET(*res,i) = HWLOC_CPUSUBSET_SUBSET(*set1,i) & HWLOC_CPUSUBSET_SUBSET(*set2,i);
}
-void hwloc_cpuset_clearset (struct hwloc_cpuset_s *set, const struct hwloc_cpuset_s *modifier_set)
+void hwloc_cpuset_andnot (struct hwloc_cpuset_s *res, const struct hwloc_cpuset_s *set1, const struct hwloc_cpuset_s *set2)
{
int i;
- HWLOC__CPUSET_CHECK(set);
- HWLOC__CPUSET_CHECK(modifier_set);
+ HWLOC__CPUSET_CHECK(res);
+ HWLOC__CPUSET_CHECK(set1);
+ HWLOC__CPUSET_CHECK(set2);
for(i=0; i<HWLOC_CPUSUBSET_COUNT; i++)
- HWLOC_CPUSUBSET_SUBSET(*set,i) &= ~HWLOC_CPUSUBSET_SUBSET(*modifier_set,i);
+ HWLOC_CPUSUBSET_SUBSET(*res,i) = HWLOC_CPUSUBSET_SUBSET(*set1,i) & ~HWLOC_CPUSUBSET_SUBSET(*set2,i);
}
-void hwloc_cpuset_xorset (struct hwloc_cpuset_s *set, const struct hwloc_cpuset_s *modifier_set)
+void hwloc_cpuset_xor (struct hwloc_cpuset_s *res, const struct hwloc_cpuset_s *set1, const struct hwloc_cpuset_s *set2)
{
int i;
+ HWLOC__CPUSET_CHECK(res);
+ HWLOC__CPUSET_CHECK(set1);
+ HWLOC__CPUSET_CHECK(set2);
+
+ for(i=0; i<HWLOC_CPUSUBSET_COUNT; i++)
+ HWLOC_CPUSUBSET_SUBSET(*res,i) = HWLOC_CPUSUBSET_SUBSET(*set1,i) ^ HWLOC_CPUSUBSET_SUBSET(*set2,i);
+}
+
+void hwloc_cpuset_not (struct hwloc_cpuset_s *res, const struct hwloc_cpuset_s *set)
+{
+ int i;
+
+ HWLOC__CPUSET_CHECK(res);
HWLOC__CPUSET_CHECK(set);
- HWLOC__CPUSET_CHECK(modifier_set);
for(i=0; i<HWLOC_CPUSUBSET_COUNT; i++)
- HWLOC_CPUSUBSET_SUBSET(*set,i) ^= HWLOC_CPUSUBSET_SUBSET(*modifier_set,i);
+ HWLOC_CPUSUBSET_SUBSET(*res,i) = ~HWLOC_CPUSUBSET_SUBSET(*set,i);
}
int hwloc_cpuset_first(const struct hwloc_cpuset_s * set)
@@ -451,9 +471,9 @@
for(i=0; i<HWLOC_CPUSUBSET_COUNT; i++) {
/* subsets are unsigned longs, use ffsl */
- int _ffs = hwloc_ffsl(HWLOC_CPUSUBSET_SUBSET(*set,i));
- if (_ffs>0)
- return _ffs - 1 + HWLOC_CPUSUBSET_SIZE*i;
+ unsigned long w = HWLOC_CPUSUBSET_SUBSET(*set,i);
+ if (w)
+ return hwloc_ffsl(w) - 1 + HWLOC_CPUSUBSET_SIZE*i;
}
return -1;
@@ -467,14 +487,36 @@
for(i=HWLOC_CPUSUBSET_COUNT-1; i>=0; i--) {
/* subsets are unsigned longs, use flsl */
- int _fls = hwloc_flsl(HWLOC_CPUSUBSET_SUBSET(*set,i));
- if (_fls>0)
- return _fls - 1 + HWLOC_CPUSUBSET_SIZE*i;
+ unsigned long w = HWLOC_CPUSUBSET_SUBSET(*set,i);
+ if (w)
+ return hwloc_flsl(w) - 1 + HWLOC_CPUSUBSET_SIZE*i;
}
return -1;
}
+int hwloc_cpuset_next(const struct hwloc_cpuset_s * set, unsigned prev_cpu)
+{
+ unsigned i = HWLOC_CPUSUBSET_INDEX(prev_cpu + 1);
+
+ HWLOC__CPUSET_CHECK(set);
+
+ for(; i<HWLOC_CPUSUBSET_COUNT; i++) {
+ /* subsets are unsigned longs, use ffsl */
+ unsigned long w = HWLOC_CPUSUBSET_SUBSET(*set,i);
+
+ /* if the prev cpu is in the same word as the possible next one,
+ we need to mask out previous cpus */
+ if (HWLOC_CPUSUBSET_INDEX(prev_cpu) == i)
+ w &= ~((HWLOC_CPUSUBSET_VAL(prev_cpu) << 1) - 1);
+
+ if (w)
+ return hwloc_ffsl(w) - 1 + HWLOC_CPUSUBSET_SIZE*i;
+ }
+
+ return -1;
+}
+
void hwloc_cpuset_singlify(struct hwloc_cpuset_s * set)
{
int i,found = 0;
@@ -487,8 +529,9 @@
continue;
} else {
/* subsets are unsigned longs, use ffsl */
- int _ffs = hwloc_ffsl(HWLOC_CPUSUBSET_SUBSET(*set,i));
- if (_ffs>0) {
+ unsigned long w = HWLOC_CPUSUBSET_SUBSET(*set,i);
+ if (w) {
+ int _ffs = hwloc_ffsl(w);
HWLOC_CPUSUBSET_SUBSET(*set,i) = HWLOC_CPUSUBSET_VAL(_ffs-1);
found = 1;
}
@@ -496,7 +539,7 @@
}
}
-int hwloc_cpuset_compar_first(const struct hwloc_cpuset_s * set1, const struct hwloc_cpuset_s * set2)
+int hwloc_cpuset_compare_first(const struct hwloc_cpuset_s * set1, const struct hwloc_cpuset_s * set2)
{
int i;
@@ -504,20 +547,22 @@
HWLOC__CPUSET_CHECK(set2);
for(i=0; i<HWLOC_CPUSUBSET_COUNT; i++) {
- int _ffs1 = hwloc_ffsl(HWLOC_CPUSUBSET_SUBSET(*set1,i));
- int _ffs2 = hwloc_ffsl(HWLOC_CPUSUBSET_SUBSET(*set2,i));
- if (!_ffs1 && !_ffs2)
- continue;
- /* if both have a bit set, compar for real */
- if (_ffs1 && _ffs2)
- return _ffs1-_ffs2;
- /* one is empty, and it is considered higher, so reverse-compar them */
- return _ffs2-_ffs1;
+ unsigned long w1 = HWLOC_CPUSUBSET_SUBSET(*set1,i);
+ unsigned long w2 = HWLOC_CPUSUBSET_SUBSET(*set2,i);
+ if (w1 || w2) {
+ int _ffs1 = hwloc_ffsl(HWLOC_CPUSUBSET_SUBSET(*set1,i));
+ int _ffs2 = hwloc_ffsl(HWLOC_CPUSUBSET_SUBSET(*set2,i));
+ /* if both have a bit set, compare for real */
+ if (_ffs1 && _ffs2)
+ return _ffs1-_ffs2;
+ /* one is empty, and it is considered higher, so reverse-compare them */
+ return _ffs2-_ffs1;
+ }
}
return 0;
}
-int hwloc_cpuset_compar(const struct hwloc_cpuset_s * set1, const struct hwloc_cpuset_s * set2)
+int hwloc_cpuset_compare(const struct hwloc_cpuset_s * set1, const struct hwloc_cpuset_s * set2)
{
int i;
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/hwloc.dtd
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/hwloc.dtd 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/hwloc.dtd 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,12 +1,26 @@
+<!ELEMENT topology (object)+>
<!ELEMENT root (object)+>
-<!ELEMENT object (object)*>
-<!ATTLIST object type (System | Machine | Misc | NUMANode | Socket| Cache | Core | Proc) #REQUIRED>
+<!ELEMENT object (page_type*,object*)>
+<!ATTLIST object type (System | Machine | Misc | Group | NUMANode | Socket| Cache | Core | PU) #REQUIRED>
+<!ATTLIST object os_level CDATA "-1" >
<!ATTLIST object os_index CDATA "-1" >
-<!ATTLIST object cpuset CDATA "0" >
+<!ATTLIST object name CDATA "" >
<!ATTLIST object dmi_board_vendor CDATA "" >
<!ATTLIST object dmi_board_name CDATA "" >
-<!ATTLIST object memory_kB CDATA "0" >
+<!ATTLIST object local_memory CDATA "0" >
+<!ATTLIST object cache_size CDATA "0" >
<!ATTLIST object huge_page_size_kB CDATA "0" >
<!ATTLIST object huge_page_free CDATA "0" >
<!ATTLIST object depth CDATA "-1" >
+<!ATTLIST object cpuset CDATA "0" >
+<!ATTLIST object complete_cpuset CDATA "" >
+<!ATTLIST object online_cpuset CDATA "" >
+<!ATTLIST object allowed_cpuset CDATA "" >
+<!ATTLIST object nodeset CDATA "" >
+<!ATTLIST object complete_nodeset CDATA "" >
+<!ATTLIST object allowed_nodeset CDATA "" >
+
+<!ELEMENT page_type EMPTY>
+<!ATTLIST page_type size CDATA #REQUIRED>
+<!ATTLIST page_type count CDATA #REQUIRED>
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/misc.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/misc.c (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/misc.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,65 @@
+/*
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+ * See COPYING in top-level directory.
+ */
+
+#include <private/config.h>
+#include <private/misc.h>
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <ctype.h>
+
+int hwloc_snprintf(char *str, size_t size, const char *format, ...)
+{
+ int ret;
+ va_list ap;
+ static char bin;
+
+ /* Some systems crash on str == NULL */
+ if (!size) {
+ str = &bin;
+ size = 1;
+ }
+
+ va_start(ap, format);
+ ret = vsnprintf(str, size, format, ap);
+ va_end(ap);
+
+ if (ret >= 0 && (size_t) ret != size-1)
+ return ret;
+
+ /* vsnprintf returned size-1 or -1. That could be a system which reports the
+ * written data and not the actually required room. Try increasing buffer
+ * size to get the latter. */
+
+ do {
+ size *= 2;
+ str = malloc(size);
+ va_start(ap, format);
+ errno = 0;
+ ret = vsnprintf(str, size, format, ap);
+ va_end(ap);
+ free(str);
+ } while ((size_t) ret == size-1 || (ret < 0 && !errno));
+
+ return ret;
+}
+
+int hwloc_namecoloncmp(const char *haystack, const char *needle, size_t n)
+{
+ size_t i = 0;
+ while (*haystack && *haystack != ':') {
+ int ha = *haystack++;
+ int low_h = tolower(ha);
+ int ne = *needle++;
+ int low_n = tolower(ne);
+ if (low_h != low_n)
+ return 1;
+ i++;
+ }
+ return i < n;
+}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-aix.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-aix.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-aix.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -7,7 +7,6 @@
#include <private/config.h>
-#include <assert.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
@@ -26,39 +25,42 @@
#include <sys/thread.h>
static int
-hwloc_aix_set_sth_cpubind(hwloc_topology_t topology, rstype_t what, rsid_t who, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_aix_set_sth_cpubind(hwloc_topology_t topology, rstype_t what, rsid_t who, hwloc_const_cpuset_t hwloc_set, int policy __hwloc_attribute_unused)
{
rsethandle_t rset, rad;
- hwloc_obj_t objs[2];
- int n;
+ hwloc_obj_t obj;
int res = -1;
- if (hwloc_cpuset_isequal(hwloc_set, hwloc_get_system_obj(topology)->cpuset)) {
+ /* The resulting binding is always strict */
+
+ if (hwloc_cpuset_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology))) {
if (ra_detachrset(what, who, 0))
return -1;
return 0;
}
- n = hwloc_get_largest_objs_inside_cpuset(topology, hwloc_set, objs, 2);
- if (n > 1 || objs[0]->os_level == -1) {
+ obj = hwloc_get_first_largest_obj_inside_cpuset(topology, hwloc_set);
+ if (!hwloc_cpuset_isequal(obj->cpuset, hwloc_set) || obj->os_level == -1) {
/* Does not correspond to exactly one radset, not possible */
errno = EXDEV;
return -1;
}
- rset = rs_alloc(RS_PARTITION);
+ if ((topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM))
+ rset = rs_alloc(RS_ALL);
+ else
+ rset = rs_alloc(RS_PARTITION);
rad = rs_alloc(RS_EMPTY);
- if (rs_getrad(rset, rad, objs[0]->os_level, objs[0]->os_index, 0)) {
- fprintf(stderr,"rs_getrad(%d,%d) failed: %s\n", objs[0]->os_level, objs[0]->os_index, strerror(errno));
+ if (rs_getrad(rset, rad, obj->os_level, obj->os_index, 0)) {
+ fprintf(stderr,"rs_getrad(%d,%u) failed: %s\n", obj->os_level, obj->os_index, strerror(errno));
goto out;
}
- /* TODO: ra_getrset to get binding information */
/* TODO: memory binding and policy (P_DEFAULT / P_FIRST_TOUCH / P_BALANCED)
* ra_mmap to allocation on an rset
*/
- if (ra_attachrset(what, who, rset, 0)) {
+ if (ra_attachrset(what, who, rad, 0)) {
res = -1;
goto out;
}
@@ -72,41 +74,96 @@
}
static int
-hwloc_aix_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_aix_get_sth_cpubind(hwloc_topology_t topology, rstype_t what, rsid_t who, hwloc_cpuset_t hwloc_set, int policy __hwloc_attribute_unused)
{
+ rsethandle_t rset;
+ unsigned cpu, maxcpus;
+ int res = -1;
+
+ rset = rs_alloc(RS_EMPTY);
+
+ if (ra_getrset(what, who, 0, rset) == -1)
+ goto out;
+
+ hwloc_cpuset_zero(hwloc_set);
+ maxcpus = rs_getinfo(rset, R_MAXPROCS, 0);
+ for (cpu = 0; cpu < maxcpus; cpu++)
+ if (rs_op(RS_TESTRESOURCE, rset, NULL, R_PROCS, cpu) == 1)
+ hwloc_cpuset_set(hwloc_set, cpu);
+ hwloc_cpuset_and(hwloc_set, hwloc_set, hwloc_topology_get_complete_cpuset(topology));
+ res = 0;
+
+out:
+ rs_free(rset);
+ return res;
+}
+
+static int
+hwloc_aix_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
+{
rsid_t who = { .at_pid = getpid() };
- return hwloc_aix_set_sth_cpubind(topology, R_PROCESS, who, hwloc_set, strict);
+ return hwloc_aix_set_sth_cpubind(topology, R_PROCESS, who, hwloc_set, policy);
}
static int
-hwloc_aix_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_aix_get_thisproc_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int policy)
{
+ rsid_t who = { .at_pid = getpid() };
+ return hwloc_aix_get_sth_cpubind(topology, R_PROCESS, who, hwloc_set, policy);
+}
+
+static int
+hwloc_aix_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
+{
rsid_t who = { .at_tid = thread_self() };
- return hwloc_aix_set_sth_cpubind(topology, R_THREAD, who, hwloc_set, strict);
+ return hwloc_aix_set_sth_cpubind(topology, R_THREAD, who, hwloc_set, policy);
}
static int
-hwloc_aix_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_aix_get_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int policy)
{
+ rsid_t who = { .at_tid = thread_self() };
+ return hwloc_aix_get_sth_cpubind(topology, R_THREAD, who, hwloc_set, policy);
+}
+
+static int
+hwloc_aix_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t hwloc_set, int policy)
+{
rsid_t who = { .at_pid = pid };
- return hwloc_aix_set_sth_cpubind(topology, R_PROCESS, who, hwloc_set, strict);
+ return hwloc_aix_set_sth_cpubind(topology, R_PROCESS, who, hwloc_set, policy);
}
static int
-hwloc_aix_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t pthread, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_aix_get_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t hwloc_set, int policy)
{
+ rsid_t who = { .at_pid = pid };
+ return hwloc_aix_get_sth_cpubind(topology, R_PROCESS, who, hwloc_set, policy);
+}
+
+static int
+hwloc_aix_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t pthread, hwloc_const_cpuset_t hwloc_set, int policy)
+{
struct __pthrdsinfo info;
int size;
if (pthread_getthrds_np(&pthread, PTHRDSINFO_QUERY_TID, &info, sizeof(info), NULL, &size))
return -1;
- rsid_t who = { .at_tid = info.__pi_tid };
- return hwloc_aix_set_sth_cpubind(topology, R_THREAD, who, hwloc_set, strict);
+ {
+ rsid_t who = { .at_tid = info.__pi_tid };
+ return hwloc_aix_set_sth_cpubind(topology, R_THREAD, who, hwloc_set, policy);
+ }
}
static int
-hwloc_aix_set_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_aix_get_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t pthread, hwloc_cpuset_t hwloc_set, int policy)
{
- return hwloc_aix_set_thisproc_cpubind(topology, hwloc_set, strict);
+ struct __pthrdsinfo info;
+ int size;
+ if (pthread_getthrds_np(&pthread, PTHRDSINFO_QUERY_TID, &info, sizeof(info), NULL, &size))
+ return -1;
+ {
+ rsid_t who = { .at_tid = info.__pi_tid };
+ return hwloc_aix_get_sth_cpubind(topology, R_THREAD, who, hwloc_set, policy);
+ }
}
static void
@@ -114,7 +171,7 @@
{
rsethandle_t rset, rad;
int i,maxcpus,j;
- unsigned nbnodes;
+ int nbnodes;
struct hwloc_obj *obj;
if ((topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM))
@@ -138,20 +195,29 @@
/* It seems logical processors are numbered from 1 here, while the
* bindprocessor functions numbers them from 0... */
- obj = hwloc_alloc_setup_object(type, i - (type == HWLOC_OBJ_PROC));
+ obj = hwloc_alloc_setup_object(type, i - (type == HWLOC_OBJ_PU));
obj->cpuset = hwloc_cpuset_alloc();
obj->os_level = sdl;
switch(type) {
case HWLOC_OBJ_NODE:
- obj->attr->node.memory_kB = 0; /* TODO: odd, rs_getinfo(rad, R_MEMSIZE, 0) << 10 returns the total memory ... */
- obj->attr->node.huge_page_free = 0; /* TODO: rs_getinfo(rset, R_LGPGFREE, 0) / hugepagesize */
+ obj->nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_set(obj->nodeset, i);
+ obj->memory.local_memory = 0; /* TODO: odd, rs_getinfo(rad, R_MEMSIZE, 0) << 10 returns the total memory ... */
+ obj->memory.page_types_len = 2;
+ obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
+ memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
+ obj->memory.page_types[0].size = getpagesize();
+#ifdef HAVE__SC_LARGE_PAGESIZE
+ obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
+#endif
+ /* TODO: obj->memory.page_types[1].count = rs_getinfo(rset, R_LGPGFREE, 0) / hugepagesize */
break;
case HWLOC_OBJ_CACHE:
- obj->attr->cache.memory_kB = 0; /* TODO: ? */
+ obj->attr->cache.size = 0; /* TODO: ? */
obj->attr->cache.depth = 2;
break;
- case HWLOC_OBJ_MISC:
- obj->attr->misc.depth = level;
+ case HWLOC_OBJ_GROUP:
+ obj->attr->group.depth = level;
default:
break;
}
@@ -163,7 +229,7 @@
hwloc_debug_2args_cpuset("%s %d has cpuset %s\n",
hwloc_obj_type_string(type),
i, obj->cpuset);
- hwloc_add_object(topology, obj);
+ hwloc_insert_object_by_cpuset(topology, obj);
}
rs_free(rset);
@@ -173,7 +239,7 @@
void
hwloc_look_aix(struct hwloc_topology *topology)
{
- unsigned i;
+ int i;
/* TODO: R_LGPGDEF/R_LGPGFREE for large pages */
for (i=0; i<=rs_getinfo(NULL, R_MAXSDL, 0); i++)
@@ -216,15 +282,16 @@
if (i == rs_getinfo(NULL, R_MAXSDL, 0))
{
hwloc_debug("looking AIX max sdl %d\n", i);
- look_rset(i, HWLOC_OBJ_PROC, topology, i);
+ look_rset(i, HWLOC_OBJ_PU, topology, i);
known = 1;
+ topology->support.discovery->pu = 1;
}
/* Don't know how it should be rendered, make a misc object for it. */
if (!known)
{
hwloc_debug("looking AIX unknown sdl %d\n", i);
- look_rset(i, HWLOC_OBJ_MISC, topology, i);
+ look_rset(i, HWLOC_OBJ_GROUP, topology, i);
}
}
}
@@ -232,9 +299,12 @@
void
hwloc_set_aix_hooks(struct hwloc_topology *topology)
{
- topology->set_cpubind = hwloc_aix_set_cpubind;
topology->set_proc_cpubind = hwloc_aix_set_proc_cpubind;
+ topology->get_proc_cpubind = hwloc_aix_get_proc_cpubind;
topology->set_thread_cpubind = hwloc_aix_set_thread_cpubind;
+ topology->get_thread_cpubind = hwloc_aix_get_thread_cpubind;
topology->set_thisproc_cpubind = hwloc_aix_set_thisproc_cpubind;
+ topology->get_thisproc_cpubind = hwloc_aix_get_thisproc_cpubind;
topology->set_thisthread_cpubind = hwloc_aix_set_thisthread_cpubind;
+ topology->get_thisthread_cpubind = hwloc_aix_get_thisthread_cpubind;
}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-darwin.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-darwin.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-darwin.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,16 +1,18 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
/* Detect topology change: registering for power management changes and check
* if for example hw.activecpu changed */
+/* Apparently, Darwin people do not _want_ to provide binding functions. */
+
#include <private/config.h>
#include <sys/types.h>
#include <sys/sysctl.h>
-#include <sys/types.h>
#include <stdlib.h>
#include <inttypes.h>
@@ -18,127 +20,132 @@
#include <private/private.h>
#include <private/debug.h>
-static int get_sysctl(const char *name, int *res)
-{
- int n;
- size_t size = sizeof(n);
- if (sysctlbyname(name, &n, &size, NULL, 0))
- return -1;
- if (size != sizeof(n))
- return -1;
- *res = n;
- return 0;
-}
-
void
hwloc_look_darwin(struct hwloc_topology *topology)
{
- int nprocs;
- int npackages;
- int i, j, cpu;
+ int _nprocs;
+ unsigned nprocs;
+ int _npackages;
+ unsigned i, j, cpu;
struct hwloc_obj *obj;
size_t size;
- if (get_sysctl("hw.ncpu", &nprocs))
+ if (hwloc_get_sysctlbyname("hw.ncpu", &_nprocs) || _nprocs <= 0)
return;
+ nprocs = _nprocs;
+ topology->support.discovery->pu = 1;
- hwloc_debug("%d procs\n", nprocs);
+ hwloc_debug("%u procs\n", nprocs);
- if (!get_sysctl("hw.packages", &npackages)) {
- int cores_per_package;
- int logical_per_package;
+ if (!hwloc_get_sysctlbyname("hw.packages", &_npackages) && _npackages > 0) {
+ unsigned npackages = _npackages;
+ int _cores_per_package;
+ int _logical_per_package;
+ unsigned logical_per_package;
- hwloc_debug("%d packages\n", npackages);
+ hwloc_debug("%u packages\n", npackages);
- if (get_sysctl("machdep.cpu.logical_per_package", &logical_per_package))
+ if (!hwloc_get_sysctlbyname("machdep.cpu.logical_per_package", &_logical_per_package) && _logical_per_package > 0)
+ logical_per_package = _logical_per_package;
+ else
/* Assume the trivia. */
logical_per_package = nprocs / npackages;
- hwloc_debug("%d threads per package\n", logical_per_package);
+ hwloc_debug("%u threads per package\n", logical_per_package);
- assert(nprocs == npackages * logical_per_package);
- for (i = 0; i < npackages; i++) {
- obj = hwloc_alloc_setup_object(HWLOC_OBJ_SOCKET, i);
- obj->cpuset = hwloc_cpuset_alloc();
- for (cpu = i*logical_per_package; cpu < (i+1)*logical_per_package; cpu++)
- hwloc_cpuset_set(obj->cpuset, cpu);
+ if (nprocs == npackages * logical_per_package)
+ for (i = 0; i < npackages; i++) {
+ obj = hwloc_alloc_setup_object(HWLOC_OBJ_SOCKET, i);
+ obj->cpuset = hwloc_cpuset_alloc();
+ for (cpu = i*logical_per_package; cpu < (i+1)*logical_per_package; cpu++)
+ hwloc_cpuset_set(obj->cpuset, cpu);
- hwloc_debug_1arg_cpuset("package %d has cpuset %s\n",
- i, obj->cpuset);
- hwloc_add_object(topology, obj);
- }
+ hwloc_debug_1arg_cpuset("package %u has cpuset %s\n",
+ i, obj->cpuset);
+ hwloc_insert_object_by_cpuset(topology, obj);
+ }
- if (!get_sysctl("machdep.cpu.cores_per_package", &cores_per_package)) {
- hwloc_debug("%d cores per package\n", cores_per_package);
+ if (!hwloc_get_sysctlbyname("machdep.cpu.cores_per_package", &_cores_per_package) && _cores_per_package > 0) {
+ unsigned cores_per_package = _cores_per_package;
+ hwloc_debug("%u cores per package\n", cores_per_package);
- assert(!(logical_per_package % cores_per_package));
+ if (!(logical_per_package % cores_per_package))
+ for (i = 0; i < npackages * cores_per_package; i++) {
+ obj = hwloc_alloc_setup_object(HWLOC_OBJ_CORE, i);
+ obj->cpuset = hwloc_cpuset_alloc();
+ for (cpu = i*(logical_per_package/cores_per_package);
+ cpu < (i+1)*(logical_per_package/cores_per_package);
+ cpu++)
+ hwloc_cpuset_set(obj->cpuset, cpu);
- for (i = 0; i < npackages * cores_per_package; i++) {
- obj = hwloc_alloc_setup_object(HWLOC_OBJ_CORE, i);
- obj->cpuset = hwloc_cpuset_alloc();
- for (cpu = i*(logical_per_package/cores_per_package);
- cpu < (i+1)*(logical_per_package/cores_per_package);
- cpu++)
- hwloc_cpuset_set(obj->cpuset, cpu);
-
- hwloc_debug_1arg_cpuset("core %d has cpuset %s\n",
- i, obj->cpuset);
- hwloc_add_object(topology, obj);
- }
+ hwloc_debug_1arg_cpuset("core %u has cpuset %s\n",
+ i, obj->cpuset);
+ hwloc_insert_object_by_cpuset(topology, obj);
+ }
}
}
if (!sysctlbyname("hw.cacheconfig", NULL, &size, NULL, 0)) {
- int n = size / sizeof(uint64_t);
+ unsigned n = size / sizeof(uint64_t);
uint64_t cacheconfig[n];
uint64_t cachesize[n];
- assert(!sysctlbyname("hw.cacheconfig", cacheconfig, &size, NULL, 0));
+ if ((!sysctlbyname("hw.cacheconfig", cacheconfig, &size, NULL, 0))) {
+ memset(cachesize, 0, sizeof(cachesize));
+ size = sizeof(cachesize);
+ sysctlbyname("hw.cachesize", cachesize, &size, NULL, 0);
- memset(cachesize, 0, sizeof(cachesize));
- size = sizeof(cachesize);
- sysctlbyname("hw.cachesize", cachesize, &size, NULL, 0);
+ hwloc_debug("%s", "caches");
+ for (i = 0; i < n && cacheconfig[i]; i++)
+ hwloc_debug(" %"PRIu64"(%"PRIu64"kB)", cacheconfig[i], cachesize[i] / 1024);
- hwloc_debug("caches");
- for (i = 0; i < n && cacheconfig[i]; i++)
- hwloc_debug(" %"PRId64"(%"PRId64"kB)", cacheconfig[i], cachesize[i] / 1024);
+ /* Now we know how many caches there are */
+ n = i;
+ hwloc_debug("\n%u cache levels\n", n - 1);
- /* Now we know how many caches there are */
- n = i;
- hwloc_debug("\n%d cache levels\n", n - 1);
+ for (i = 0; i < n; i++) {
+ for (j = 0; j < (nprocs / cacheconfig[i]); j++) {
+ obj = hwloc_alloc_setup_object(i?HWLOC_OBJ_CACHE:HWLOC_OBJ_NODE, j);
+ if (!i) {
+ obj->nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_set(obj->nodeset, j);
+ }
+ obj->cpuset = hwloc_cpuset_alloc();
+ for (cpu = j*cacheconfig[i];
+ cpu < ((j+1)*cacheconfig[i]);
+ cpu++)
+ hwloc_cpuset_set(obj->cpuset, cpu);
- for (i = 0; i < n; i++) {
- for (j = 0; j < nprocs / cacheconfig[i]; j++) {
- obj = hwloc_alloc_setup_object(i?HWLOC_OBJ_CACHE:HWLOC_OBJ_NODE, j);
- obj->cpuset = hwloc_cpuset_alloc();
- for (cpu = j*cacheconfig[i];
- cpu < (j+1)*cacheconfig[i];
- cpu++)
- hwloc_cpuset_set(obj->cpuset, cpu);
+ if (i) {
+ hwloc_debug_2args_cpuset("L%ucache %u has cpuset %s\n",
+ i, j, obj->cpuset);
+ obj->attr->cache.depth = i;
+ obj->attr->cache.size = cachesize[i];
+ } else {
+ hwloc_debug_1arg_cpuset("node %u has cpuset %s\n",
+ j, obj->cpuset);
+ obj->memory.local_memory = cachesize[i];
+ obj->memory.page_types_len = 2;
+ obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
+ memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
+ obj->memory.page_types[0].size = getpagesize();
+#ifdef HAVE__SC_LARGE_PAGESIZE
+ obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
+#endif
+ }
- if (i) {
- hwloc_debug_2args_cpuset("L%dcache %d has cpuset %s\n",
- i, j, obj->cpuset);
- obj->attr->cache.depth = i;
- obj->attr->cache.memory_kB = cachesize[i] / 1024;
- } else {
- hwloc_debug_1arg_cpuset("node %d has cpuset %s\n",
- j, obj->cpuset);
- obj->attr->node.memory_kB = cachesize[i] / 1024;
- obj->attr->node.huge_page_free = 0; /* TODO */
- }
-
- hwloc_add_object(topology, obj);
+ hwloc_insert_object_by_cpuset(topology, obj);
+ }
}
}
}
- /* add PROC objects */
- hwloc_setup_proc_level(topology, nprocs, NULL);
+ /* add PU objects */
+ hwloc_setup_pu_level(topology, nprocs);
}
void
-hwloc_set_darwin_hooks(struct hwloc_topology *topology)
+hwloc_set_darwin_hooks(struct hwloc_topology *topology __hwloc_attribute_unused)
{
}
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-freebsd.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-freebsd.c (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-freebsd.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,195 @@
+/*
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * See COPYING in top-level directory.
+ */
+
+#include <private/config.h>
+
+#include <sys/types.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <sys/param.h>
+#include <pthread.h>
+#ifdef HAVE_PTHREAD_NP_H
+#include <pthread_np.h>
+#endif
+#ifdef HAVE_SYS_CPUSET_H
+#include <sys/cpuset.h>
+#endif
+
+#include <hwloc.h>
+#include <private/private.h>
+#include <private/debug.h>
+
+#ifdef HAVE_SYS_CPUSET_H
+static void
+hwloc_freebsd_bsd2hwloc(hwloc_cpuset_t hwloc_cpuset, const cpuset_t *cpuset)
+{
+ unsigned cpu;
+ hwloc_cpuset_zero(hwloc_cpuset);
+ for (cpu = 0; cpu < HWLOC_NBMAXCPUS && cpu < CPU_SETSIZE; cpu++)
+ if (CPU_ISSET(cpu, cpuset))
+ hwloc_cpuset_set(hwloc_cpuset, cpu);
+}
+
+static void
+hwloc_freebsd_hwloc2bsd(hwloc_const_cpuset_t hwloc_cpuset, cpuset_t *cpuset)
+{
+ unsigned cpu;
+ CPU_ZERO(cpuset);
+ for (cpu = 0; cpu < HWLOC_NBMAXCPUS && cpu < CPU_SETSIZE; cpu++)
+ if (hwloc_cpuset_isset(hwloc_cpuset, cpu))
+ CPU_SET(cpu, cpuset);
+}
+
+static int
+hwloc_freebsd_set_sth_affinity(hwloc_topology_t topology __hwloc_attribute_unused, cpulevel_t level, cpuwhich_t which, id_t id, hwloc_const_cpuset_t hwloc_cpuset, int policy __hwloc_attribute_unused)
+{
+ cpuset_t cpuset;
+
+ hwloc_freebsd_hwloc2bsd(hwloc_cpuset, &cpuset);
+
+ if (cpuset_setaffinity(level, which, id, sizeof(cpuset), &cpuset))
+ return -1;
+
+ return 0;
+}
+
+static int
+hwloc_freebsd_get_sth_affinity(hwloc_topology_t topology __hwloc_attribute_unused, cpulevel_t level, cpuwhich_t which, id_t id, hwloc_cpuset_t hwloc_cpuset, int policy __hwloc_attribute_unused)
+{
+ cpuset_t cpuset;
+
+ if (cpuset_getaffinity(level, which, id, sizeof(cpuset), &cpuset))
+ return -1;
+
+ hwloc_freebsd_bsd2hwloc(hwloc_cpuset, &cpuset);
+ return 0;
+}
+
+static int
+hwloc_freebsd_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_cpuset, int policy)
+{
+ return hwloc_freebsd_set_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, hwloc_cpuset, policy);
+}
+
+static int
+hwloc_freebsd_get_thisproc_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_cpuset, int policy)
+{
+ return hwloc_freebsd_get_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, hwloc_cpuset, policy);
+}
+
+static int
+hwloc_freebsd_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_cpuset, int policy)
+{
+ return hwloc_freebsd_set_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, hwloc_cpuset, policy);
+}
+
+static int
+hwloc_freebsd_get_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_cpuset, int policy)
+{
+ return hwloc_freebsd_get_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, hwloc_cpuset, policy);
+}
+
+static int
+hwloc_freebsd_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t hwloc_cpuset, int policy)
+{
+ return hwloc_freebsd_set_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_PID, pid, hwloc_cpuset, policy);
+}
+
+static int
+hwloc_freebsd_get_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t hwloc_cpuset, int policy)
+{
+ return hwloc_freebsd_get_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_PID, pid, hwloc_cpuset, policy);
+}
+
+#ifdef hwloc_thread_t
+
+#if HAVE_DECL_PTHREAD_SETAFFINITY_NP
+#pragma weak pthread_setaffinity_np
+static int
+hwloc_freebsd_set_thread_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_thread_t tid, hwloc_const_cpuset_t hwloc_cpuset, int policy __hwloc_attribute_unused)
+{
+ int err;
+ cpuset_t cpuset;
+
+ if (!pthread_setaffinity_np) {
+ errno = ENOSYS;
+ return -1;
+ }
+
+ hwloc_freebsd_hwloc2bsd(hwloc_cpuset, &cpuset);
+
+ err = pthread_setaffinity_np(tid, sizeof(cpuset), &cpuset);
+
+ if (err) {
+ errno = err;
+ return -1;
+ }
+
+ return 0;
+}
+#endif
+
+#if HAVE_DECL_PTHREAD_GETAFFINITY_NP
+#pragma weak pthread_getaffinity_np
+static int
+hwloc_freebsd_get_thread_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_thread_t tid, hwloc_cpuset_t hwloc_cpuset, int policy __hwloc_attribute_unused)
+{
+ int err;
+ cpuset_t cpuset;
+
+ if (!pthread_getaffinity_np) {
+ errno = ENOSYS;
+ return -1;
+ }
+
+ err = pthread_getaffinity_np(tid, sizeof(cpuset), &cpuset);
+
+ if (err) {
+ errno = err;
+ return -1;
+ }
+
+ hwloc_freebsd_bsd2hwloc(hwloc_cpuset, &cpuset);
+ return 0;
+}
+#endif
+#endif
+#endif
+
+void
+hwloc_look_freebsd(struct hwloc_topology *topology)
+{
+ unsigned nbprocs = hwloc_fallback_nbprocessors(topology);
+
+#ifdef HAVE__SC_LARGE_PAGESIZE
+ topology->levels[0][0]->attr->machine.huge_page_size_kB = sysconf(_SC_LARGE_PAGESIZE);
+#endif
+
+ hwloc_set_freebsd_hooks(topology);
+ hwloc_look_x86(topology, nbprocs);
+
+ hwloc_setup_pu_level(topology, nbprocs);
+}
+
+void
+hwloc_set_freebsd_hooks(struct hwloc_topology *topology)
+{
+#ifdef HAVE_SYS_CPUSET_H
+ topology->set_thisproc_cpubind = hwloc_freebsd_set_thisproc_cpubind;
+ topology->get_thisproc_cpubind = hwloc_freebsd_get_thisproc_cpubind;
+ topology->set_thisthread_cpubind = hwloc_freebsd_set_thisthread_cpubind;
+ topology->get_thisthread_cpubind = hwloc_freebsd_get_thisthread_cpubind;
+ topology->set_proc_cpubind = hwloc_freebsd_set_proc_cpubind;
+ topology->get_proc_cpubind = hwloc_freebsd_get_proc_cpubind;
+#ifdef hwloc_thread_t
+#if HAVE_DECL_PTHREAD_SETAFFINITY_NP
+ topology->set_thread_cpubind = hwloc_freebsd_set_thread_cpubind;
+#endif
+#if HAVE_DECL_PTHREAD_GETAFFINITY_NP
+ topology->get_thread_cpubind = hwloc_freebsd_get_thread_cpubind;
+#endif
+#endif
+#endif
+}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-hpux.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-hpux.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-hpux.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -18,7 +18,6 @@
#include <private/config.h>
-#include <assert.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
@@ -33,26 +32,25 @@
#include <pthread.h>
static ldom_t
-hwloc_hpux_find_ldom(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set)
+hwloc_hpux_find_ldom(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set)
{
int has_numa = sysconf(_SC_CCNUMA_SUPPORT) == 1;
- int n;
- hwloc_obj_t objs[2];
+ hwloc_obj_t obj;
if (!has_numa)
return -1;
- n = hwloc_get_largest_objs_inside_cpuset(topology, hwloc_set, objs, 2);
- if (n > 1 || objs[0]->type != HWLOC_OBJ_NODE) {
+ obj = hwloc_get_first_largest_obj_inside_cpuset(topology, hwloc_set);
+ if (!hwloc_cpuset_isequal(obj->cpuset, hwloc_set) || obj->type != HWLOC_OBJ_NODE) {
/* Does not correspond to exactly one node */
return -1;
}
- return objs[0]->os_index;
+ return obj->os_index;
}
static spu_t
-hwloc_hpux_find_spu(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set)
+hwloc_hpux_find_spu(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t hwloc_set)
{
spu_t cpu;
@@ -62,8 +60,9 @@
return -1;
}
+/* Note: get_cpubind not available on HP-UX */
static int
-hwloc_hpux_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_hpux_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t hwloc_set, int policy)
{
ldom_t ldom;
spu_t cpu;
@@ -72,7 +71,7 @@
mpctl(MPC_SETLDOM, MPC_LDOMFLOAT, pid);
mpctl(MPC_SETPROCESS, MPC_SPUFLOAT, pid);
- if (hwloc_cpuset_isequal(hwloc_set, hwloc_get_system_obj(topology)->cpuset))
+ if (hwloc_cpuset_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology)))
return 0;
ldom = hwloc_hpux_find_ldom(topology, hwloc_set);
@@ -81,27 +80,21 @@
cpu = hwloc_hpux_find_spu(topology, hwloc_set);
if (cpu != -1)
- return mpctl(strict ? MPC_SETPROCESS_FORCE : MPC_SETPROCESS, cpu, pid);
+ return mpctl(policy & HWLOC_CPUBIND_STRICT ? MPC_SETPROCESS_FORCE : MPC_SETPROCESS, cpu, pid);
errno = EXDEV;
return -1;
}
static int
-hwloc_hpux_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_hpux_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
{
- return hwloc_hpux_set_proc_cpubind(topology, MPC_SELFPID, hwloc_set, strict);
+ return hwloc_hpux_set_proc_cpubind(topology, MPC_SELFPID, hwloc_set, policy);
}
-static int
-hwloc_hpux_set_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
-{
- return hwloc_hpux_set_thisproc_cpubind(topology, hwloc_set, strict);
-}
-
#ifdef hwloc_thread_t
static int
-hwloc_hpux_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t pthread, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_hpux_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t pthread, hwloc_const_cpuset_t hwloc_set, int policy)
{
ldom_t ldom, ldom2;
spu_t cpu, cpu2;
@@ -110,7 +103,7 @@
pthread_ldom_bind_np(&ldom2, PTHREAD_LDOMFLOAT_NP, pthread);
pthread_processor_bind_np(PTHREAD_BIND_ADVISORY_NP, &cpu2, PTHREAD_SPUFLOAT_NP, pthread);
- if (hwloc_cpuset_isequal(hwloc_set, hwloc_get_system_obj(topology)->cpuset))
+ if (hwloc_cpuset_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology)))
return 0;
ldom = hwloc_hpux_find_ldom(topology, hwloc_set);
@@ -119,16 +112,16 @@
cpu = hwloc_hpux_find_spu(topology, hwloc_set);
if (cpu != -1)
- return pthread_processor_bind_np(strict ? PTHREAD_BIND_FORCED_NP : PTHREAD_BIND_ADVISORY_NP, &cpu2, cpu, pthread);
+ return pthread_processor_bind_np(policy & HWLOC_CPUBIND_STRICT ? PTHREAD_BIND_FORCED_NP : PTHREAD_BIND_ADVISORY_NP, &cpu2, cpu, pthread);
errno = EXDEV;
return -1;
}
static int
-hwloc_hpux_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_hpux_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
{
- return hwloc_hpux_set_thread_cpubind(topology, PTHREAD_SELFTID_NP, hwloc_set, strict);
+ return hwloc_hpux_set_thread_cpubind(topology, PTHREAD_SELFTID_NP, hwloc_set, policy);
}
#endif
@@ -141,6 +134,10 @@
ldom_t currentnode;
int i, nbnodes = 0;
+#ifdef HAVE__SC_LARGE_PAGESIZE
+ topology->levels[0][0]->attr->machine.huge_page_size_kB = sysconf(_SC_LARGE_PAGESIZE);
+#endif
+
if (has_numa) {
nbnodes = mpctl(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM ?
MPC_GETNUMLDOMS_SYS : MPC_GETNUMLDOMS, 0, 0);
@@ -156,6 +153,8 @@
hwloc_debug("node %d is %d\n", i, currentnode);
nodes[i] = obj = hwloc_alloc_setup_object(HWLOC_OBJ_NODE, currentnode);
obj->cpuset = hwloc_cpuset_alloc();
+ obj->nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_set(obj->nodeset, currentnode);
/* TODO: obj->attr->node.memory_kB */
/* TODO: obj->attr->node.huge_page_free */
@@ -169,7 +168,7 @@
currentcpu = mpctl(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM ?
MPC_GETFIRSTSPU_SYS : MPC_GETFIRSTSPU, 0,0);
while (currentcpu != -1) {
- obj = hwloc_alloc_setup_object(HWLOC_OBJ_PROC, currentcpu);
+ obj = hwloc_alloc_setup_object(HWLOC_OBJ_PU, currentcpu);
obj->cpuset = hwloc_cpuset_alloc();
hwloc_cpuset_set(obj->cpuset, currentcpu);
@@ -178,17 +177,20 @@
if (nodes) {
/* Add this cpu to its node */
currentnode = mpctl(MPC_SPUTOLDOM, currentcpu, 0);
- if (nodes[i]->os_index != currentnode)
+ if ((ldom_t) nodes[i]->os_index != currentnode)
for (i = 0; i < nbnodes; i++)
- if (nodes[i]->os_index == currentnode)
+ if ((ldom_t) nodes[i]->os_index == currentnode)
break;
- assert(i < nbnodes);
- hwloc_cpuset_set(nodes[i]->cpuset, currentcpu);
- hwloc_debug("is in node %d\n", i);
+ if (i < nbnodes) {
+ hwloc_cpuset_set(nodes[i]->cpuset, currentcpu);
+ hwloc_debug("is in node %d\n", i);
+ } else {
+ hwloc_debug("%s", "is in no node?!\n");
+ }
}
/* Add cpu */
- hwloc_add_object(topology, obj);
+ hwloc_insert_object_by_cpuset(topology, obj);
currentcpu = mpctl(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM ?
MPC_GETNEXTSPU_SYS : MPC_GETNEXTSPU, currentcpu, 0);
@@ -197,15 +199,16 @@
if (nodes) {
/* Add nodes */
for (i = 0 ; i < nbnodes ; i++)
- hwloc_add_object(topology, nodes[i]);
+ hwloc_insert_object_by_cpuset(topology, nodes[i]);
free(nodes);
}
+
+ topology->support.discovery->pu = 1;
}
void
hwloc_set_hpux_hooks(struct hwloc_topology *topology)
{
- topology->set_cpubind = hwloc_hpux_set_cpubind;
topology->set_proc_cpubind = hwloc_hpux_set_proc_cpubind;
topology->set_thisproc_cpubind = hwloc_hpux_set_thisproc_cpubind;
#ifdef hwloc_thread_t
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-linux.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-linux.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-linux.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -18,6 +18,7 @@
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
+#include <sys/stat.h>
#include <sched.h>
#include <pthread.h>
@@ -54,26 +55,62 @@
# warning "don't know the syscall number for sched_setaffinity on this architecture, will not support binding"
# define sched_setaffinity(pid, lg, mask) (errno = ENOSYS, -1)
# endif
-# ifndef sched_setaffinity
- _syscall3(int, sched_setaffinity, pid_t, pid, unsigned int, lg, unsigned long *, mask);
+# endif
+# ifndef sched_setaffinity
+ _syscall3(int, sched_setaffinity, pid_t, pid, unsigned int, lg, const void *, mask);
+# endif
+# ifndef __NR_sched_getaffinity
+# ifdef __i386__
+# define __NR_sched_getaffinity 242
+# elif defined(__x86_64__)
+# define __NR_sched_getaffinity 204
+# elif defined(__ia64__)
+# define __NR_sched_getaffinity 1232
+# elif defined(__hppa__)
+# define __NR_sched_getaffinity 212
+# elif defined(__alpha__)
+# define __NR_sched_getaffinity 396
+# elif defined(__s390__)
+# define __NR_sched_getaffinity 240
+# elif defined(__sparc__)
+# define __NR_sched_getaffinity 260
+# elif defined(__m68k__)
+# define __NR_sched_getaffinity 312
+# elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) || defined(__powerpc64__) || defined(__ppc64__)
+# define __NR_sched_getaffinity 223
+# elif defined(__arm__)
+# define __NR_sched_getaffinity 242
+# elif defined(__cris__)
+# define __NR_sched_getaffinity 242
+/*# elif defined(__mips__)
+ # define __NR_sched_getaffinity TODO (32/64/nabi) */
+# else
+# warning "don't know the syscall number for sched_getaffinity on this architecture, will not support getting binding"
+# define sched_getaffinity(pid, lg, mask) (errno = ENOSYS, -1)
# endif
# endif
+# ifndef sched_getaffinity
+ _syscall3(int, sched_getaffinity, pid_t, pid, unsigned int, lg, void *, mask);
+# endif
#endif
#ifdef HAVE_OPENAT
+/* Use our own filesystem functions if we have openat */
-/* Use our own filesystem functions. */
-#define hwloc_fopen(p, m, d) hwloc_fopenat(p, m, d)
-#define hwloc_access(p, m, d) hwloc_accessat(p, m, d)
-#define hwloc_opendir(p, d) hwloc_opendirat(p, d)
-
static FILE *
hwloc_fopenat(const char *path, const char *mode, int fsroot_fd)
{
int fd;
const char *relative_path;
- assert(!(fsroot_fd < 0));
+ if (fsroot_fd < 0) {
+ errno = EBADF;
+ return NULL;
+ }
+ if (strcmp(mode, "r")) {
+ errno = ENOTSUP;
+ return NULL;
+ }
/* Skip leading slashes. */
for (relative_path = path; *relative_path == '/'; relative_path++);
@@ -90,12 +127,15 @@
{
const char *relative_path;
- assert(!(fsroot_fd < 0));
+ if (fsroot_fd < 0) {
+ errno = EBADF;
+ return -1;
+ }
/* Skip leading slashes. */
for (relative_path = path; *relative_path == '/'; relative_path++);
- return faccessat(fsroot_fd, relative_path, O_RDONLY, 0);
+ return faccessat(fsroot_fd, relative_path, mode, 0);
}
static DIR*
@@ -114,26 +154,73 @@
return fdopendir(dir_fd);
}
-#else /* !HAVE_OPENAT */
+#endif /* HAVE_OPENAT */
-#define hwloc_fopen(p, m, d) fopen(p, m)
-#define hwloc_access(p, m, d) access(p, m)
-#define hwloc_opendir(p, d) opendir(p)
+/* Static inline version of fopen so that we can use openat if we have
+ it, but still preserve compiler parameter checking */
+static inline FILE *
+hwloc_fopen(const char *p, const char *m, int d __hwloc_attribute_unused)
+{
+#ifdef HAVE_OPENAT
+ return hwloc_fopenat(p, m, d);
+#else
+ return fopen(p, m);
+#endif
+}
-#endif /* !HAVE_OPENAT */
+/* Static inline version of access so that we can use openat if we have
+ it, but still preserve compiler parameter checking */
+static inline int
+hwloc_access(const char *p, int m, int d __hwloc_attribute_unused)
+{
+#ifdef HAVE_OPENAT
+ return hwloc_accessat(p, m, d);
+#else
+ return access(p, m);
+#endif
+}
-static int
-hwloc_linux_set_tid_cpubind(hwloc_topology_t topology, pid_t tid, hwloc_cpuset_t hwloc_set, int strict)
+/* Static inline version of opendir so that we can use openat if we have
+ it, but still preserve compiler parameter checking */
+static inline DIR *
+hwloc_opendir(const char *p, int d __hwloc_attribute_unused)
+{
+#ifdef HAVE_OPENAT
+ return hwloc_opendirat(p, d);
+#else
+ return opendir(p);
+#endif
+}
+
+int
+hwloc_linux_set_tid_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, pid_t tid, hwloc_const_cpuset_t hwloc_set)
{
-
/* TODO Kerrighed: Use
* int migrate (pid_t pid, int destination_node);
* int migrate_self (int destination_node);
* int thread_migrate (int thread_id, int destination_node);
*/
-/* TODO: use dynamic size cpusets */
-#ifdef HWLOC_HAVE_CPU_SET
+ /* The resulting binding is always strict */
+
+#if defined(HWLOC_HAVE_CPU_SET_S) && !defined(HWLOC_HAVE_OLD_SCHED_SETAFFINITY) && CPU_SETSIZE < HWLOC_NBMAXCPUS
+ cpu_set_t *plinux_set;
+ unsigned cpu;
+ size_t setsize = CPU_ALLOC_SIZE(HWLOC_NBMAXCPUS);
+ int err;
+
+ plinux_set = CPU_ALLOC(HWLOC_NBMAXCPUS);
+
+ CPU_ZERO_S(setsize, plinux_set);
+ hwloc_cpuset_foreach_begin(cpu, hwloc_set)
+ CPU_SET_S(cpu, setsize, plinux_set);
+ hwloc_cpuset_foreach_end();
+
+ err = sched_setaffinity(tid, setsize, plinux_set);
+
+ CPU_FREE(plinux_set);
+ return err;
+#elif defined(HWLOC_HAVE_CPU_SET)
cpu_set_t linux_set;
unsigned cpu;
@@ -142,40 +229,315 @@
CPU_SET(cpu, &linux_set);
hwloc_cpuset_foreach_end();
-#ifdef HAVE_OLD_SCHED_SETAFFINITY
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
return sched_setaffinity(tid, &linux_set);
-#else /* HAVE_OLD_SCHED_SETAFFINITY */
+#else /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
return sched_setaffinity(tid, sizeof(linux_set), &linux_set);
-#endif /* HAVE_OLD_SCHED_SETAFFINITY */
-#else /* CPU_SET */
+#endif /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+#else /* !CPU_SET */
unsigned long mask = hwloc_cpuset_to_ulong(hwloc_set);
-#ifdef HAVE_OLD_SCHED_SETAFFINITY
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
return sched_setaffinity(tid, (void*) &mask);
-#else /* HAVE_OLD_SCHED_SETAFFINITY */
+#else /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
return sched_setaffinity(tid, sizeof(mask), (void*) &mask);
-#endif /* HAVE_OLD_SCHED_SETAFFINITY */
-#endif /* CPU_SET */
+#endif /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+#endif /* !CPU_SET */
}
+int
+hwloc_linux_get_tid_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, pid_t tid, hwloc_cpuset_t hwloc_set)
+{
+ int err;
+ /* TODO Kerrighed */
+
+#if defined(HWLOC_HAVE_CPU_SET_S) && !defined(HWLOC_HAVE_OLD_SCHED_SETAFFINITY) && CPU_SETSIZE < HWLOC_NBMAXCPUS
+ cpu_set_t *plinux_set;
+ unsigned cpu;
+ size_t setsize = CPU_ALLOC_SIZE(HWLOC_NBMAXCPUS);
+
+ plinux_set = CPU_ALLOC(HWLOC_NBMAXCPUS);
+
+ err = sched_getaffinity(tid, setsize, plinux_set);
+
+ if (err < 0) {
+ CPU_FREE(plinux_set);
+ return -1;
+ }
+
+ hwloc_cpuset_zero(hwloc_set);
+ for(cpu=0; cpu<HWLOC_NBMAXCPUS; cpu++)
+ if (CPU_ISSET_S(cpu, setsize, plinux_set))
+ hwloc_cpuset_set(hwloc_set, cpu);
+
+ CPU_FREE(plinux_set);
+#elif defined(HWLOC_HAVE_CPU_SET)
+ cpu_set_t linux_set;
+ unsigned cpu;
+
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
+ err = sched_getaffinity(tid, &linux_set);
+#else /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ err = sched_getaffinity(tid, sizeof(linux_set), &linux_set);
+#endif /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ if (err < 0)
+ return -1;
+
+ hwloc_cpuset_zero(hwloc_set);
+ for(cpu=0; cpu<CPU_SETSIZE; cpu++)
+ if (CPU_ISSET(cpu, &linux_set))
+ hwloc_cpuset_set(hwloc_set, cpu);
+#else /* !CPU_SET */
+ unsigned long mask;
+
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
+ err = sched_getaffinity(tid, (void*) &mask);
+#else /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ err = sched_getaffinity(tid, sizeof(mask), (void*) &mask);
+#endif /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ if (err < 0)
+ return -1;
+
+ hwloc_cpuset_from_ulong(hwloc_set, mask);
+#endif /* !CPU_SET */
+
+ return 0;
+}
+
+/* Get the array of tids of a process from the task directory in /proc */
static int
-hwloc_linux_set_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_linux_get_proc_tids(DIR *taskdir, unsigned *nr_tidsp, pid_t ** tidsp)
{
- return hwloc_linux_set_tid_cpubind(topology, 0, hwloc_set, strict);
+ struct dirent *dirent;
+ unsigned nr_tids = 0;
+ unsigned max_tids = 32;
+ pid_t *tids;
+ struct stat sb;
+
+ /* take the number of links as a good estimate for the number of tids */
+ if (fstat(dirfd(taskdir), &sb) == 0)
+ max_tids = sb.st_nlink;
+
+ tids = malloc(max_tids*sizeof(pid_t));
+ if (!tids) {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ rewinddir(taskdir);
+
+ while ((dirent = readdir(taskdir)) != NULL) {
+ if (nr_tids == max_tids) {
+ pid_t *newtids;
+ max_tids += 8;
+ newtids = realloc(tids, max_tids*sizeof(pid_t));
+ if (!newtids) {
+ free(tids);
+ errno = ENOMEM;
+ return -1;
+ }
+ tids = newtids;
+ }
+ if (!strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, ".."))
+ continue;
+ tids[nr_tids++] = atoi(dirent->d_name);
+ }
+
+ *nr_tidsp = nr_tids;
+ *tidsp = tids;
+ return 0;
}
+/* Callbacks for binding each process sub-tid */
+typedef int (*hwloc_linux_foreach_proc_tid_cb_t)(hwloc_topology_t topology, pid_t tid, void *data, int idx, int policy);
+
static int
-hwloc_linux_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_linux_foreach_proc_tid_set_cpubind_cb(hwloc_topology_t topology, pid_t tid, void *data, int idx __hwloc_attribute_unused, int policy __hwloc_attribute_unused)
{
- return hwloc_linux_set_tid_cpubind(topology, 0, hwloc_set, strict);
+ hwloc_cpuset_t cpuset = data;
+ return hwloc_linux_set_tid_cpubind(topology, tid, cpuset);
}
+static int
+hwloc_linux_foreach_proc_tid_get_cpubind_cb(hwloc_topology_t topology, pid_t tid, void *data, int idx, int policy)
+{
+ hwloc_cpuset_t *cpusets = data;
+ hwloc_cpuset_t cpuset = cpusets[0];
+ hwloc_cpuset_t tidset = cpusets[1];
+
+ if (hwloc_linux_get_tid_cpubind(topology, tid, tidset))
+ return -1;
+
+ /* reset the cpuset on first iteration */
+ if (!idx)
+ hwloc_cpuset_zero(cpuset);
+
+ if (policy & HWLOC_CPUBIND_STRICT) {
+ /* if STRICT, we want all threads to have the same binding */
+ if (!idx) {
+ /* this is the first thread, copy its binding */
+ hwloc_cpuset_copy(cpuset, tidset);
+ } else if (!hwloc_cpuset_isequal(cpuset, tidset)) {
+ /* this is not the first thread, and it's binding is different */
+ errno = EXDEV;
+ return -1;
+ }
+ } else {
+ /* if not STRICT, just OR all thread bindings */
+ hwloc_cpuset_or(cpuset, cpuset, tidset);
+ }
+ return 0;
+}
+
+/* Call the callback for each process tid. */
+static int
+hwloc_linux_foreach_proc_tid(hwloc_topology_t topology,
+ pid_t pid, hwloc_linux_foreach_proc_tid_cb_t cb,
+ void *data, int policy)
+{
+ char taskdir_path[128];
+ DIR *taskdir;
+ pid_t *tids, *newtids;
+ unsigned i, nr, newnr;
+ int err;
+
+ if (pid)
+ snprintf(taskdir_path, sizeof(taskdir_path), "/proc/%u/task", (unsigned) pid);
+ else
+ snprintf(taskdir_path, sizeof(taskdir_path), "/proc/self/task");
+
+ taskdir = opendir(taskdir_path);
+ if (!taskdir) {
+ errno = ENOSYS;
+ err = -1;
+ goto out;
+ }
+
+ /* read the current list of threads */
+ err = hwloc_linux_get_proc_tids(taskdir, &nr, &tids);
+ if (err < 0)
+ goto out_with_dir;
+
+ retry:
+ /* apply the callback to all threads */
+ for(i=0; i<nr; i++) {
+ err = cb(topology, tids[i], data, i, policy);
+ if (err < 0)
+ goto out_with_tids;
+ }
+
+ /* re-read the list of thread and retry if it changed in the meantime */
+ err = hwloc_linux_get_proc_tids(taskdir, &newnr, &newtids);
+ if (err < 0)
+ goto out_with_tids;
+ if (newnr != nr || memcmp(newtids, tids, nr*sizeof(pid_t))) {
+ free(tids);
+ tids = newtids;
+ nr = newnr;
+ goto retry;
+ }
+
+ err = 0;
+ free(newtids);
+ out_with_tids:
+ free(tids);
+ out_with_dir:
+ closedir(taskdir);
+ out:
+ return err;
+}
+
+static int
+hwloc_linux_set_pid_cpubind(hwloc_topology_t topology, pid_t pid, hwloc_const_cpuset_t hwloc_set, int policy)
+{
+ return hwloc_linux_foreach_proc_tid(topology, pid,
+ hwloc_linux_foreach_proc_tid_set_cpubind_cb,
+ (void*) hwloc_set, policy);
+}
+
+static int
+hwloc_linux_get_pid_cpubind(hwloc_topology_t topology, pid_t pid, hwloc_cpuset_t hwloc_set, int policy)
+{
+ hwloc_cpuset_t tidset = hwloc_cpuset_alloc();
+ hwloc_cpuset_t cpusets[2] = { hwloc_set, tidset };
+ int ret;
+ ret = hwloc_linux_foreach_proc_tid(topology, pid,
+ hwloc_linux_foreach_proc_tid_get_cpubind_cb,
+ (void*) cpusets, policy);
+ hwloc_cpuset_free(tidset);
+ return ret;
+}
+
+static int
+hwloc_linux_set_proc_cpubind(hwloc_topology_t topology, pid_t pid, hwloc_const_cpuset_t hwloc_set, int policy)
+{
+ if (pid == 0)
+ pid = topology->pid;
+ if (policy & HWLOC_CPUBIND_THREAD)
+ return hwloc_linux_set_tid_cpubind(topology, pid, hwloc_set);
+ else
+ return hwloc_linux_set_pid_cpubind(topology, pid, hwloc_set, policy);
+}
+
+static int
+hwloc_linux_get_proc_cpubind(hwloc_topology_t topology, pid_t pid, hwloc_cpuset_t hwloc_set, int policy)
+{
+ if (pid == 0)
+ pid = topology->pid;
+ if (policy & HWLOC_CPUBIND_THREAD)
+ return hwloc_linux_get_tid_cpubind(topology, pid, hwloc_set);
+ else
+ return hwloc_linux_get_pid_cpubind(topology, pid, hwloc_set, policy);
+}
+
+static int
+hwloc_linux_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
+{
+ return hwloc_linux_set_pid_cpubind(topology, topology->pid, hwloc_set, policy);
+}
+
+static int
+hwloc_linux_get_thisproc_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int policy)
+{
+ return hwloc_linux_get_pid_cpubind(topology, topology->pid, hwloc_set, policy);
+}
+
+static int
+hwloc_linux_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy __hwloc_attribute_unused)
+{
+ if (topology->pid) {
+ errno = ENOSYS;
+ return -1;
+ }
+ return hwloc_linux_set_tid_cpubind(topology, 0, hwloc_set);
+}
+
+static int
+hwloc_linux_get_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int policy __hwloc_attribute_unused)
+{
+ if (topology->pid) {
+ errno = ENOSYS;
+ return -1;
+ }
+ return hwloc_linux_get_tid_cpubind(topology, 0, hwloc_set);
+}
+
#if HAVE_DECL_PTHREAD_SETAFFINITY_NP
#pragma weak pthread_setaffinity_np
static int
-hwloc_linux_set_thread_cpubind(hwloc_topology_t topology, pthread_t tid, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_linux_set_thread_cpubind(hwloc_topology_t topology, pthread_t tid, hwloc_const_cpuset_t hwloc_set, int policy __hwloc_attribute_unused)
{
+ int err;
+
+ if (topology->pid) {
+ errno = ENOSYS;
+ return -1;
+ }
+
+ if (tid == pthread_self())
+ return hwloc_linux_set_tid_cpubind(topology, 0, hwloc_set);
+
if (!pthread_setaffinity_np) {
/* ?! Application uses set_thread_cpubind, but doesn't link against libpthread ?! */
errno = ENOSYS;
@@ -188,33 +550,116 @@
*/
#ifdef HWLOC_HAVE_CPU_SET
- cpu_set_t linux_set;
- unsigned cpu;
+ /* Use a separate block so that we can define specific variable
+ types here */
+ {
+ cpu_set_t linux_set;
+ unsigned cpu;
- CPU_ZERO(&linux_set);
- hwloc_cpuset_foreach_begin(cpu, hwloc_set)
- CPU_SET(cpu, &linux_set);
- hwloc_cpuset_foreach_end();
+ CPU_ZERO(&linux_set);
+ hwloc_cpuset_foreach_begin(cpu, hwloc_set)
+ CPU_SET(cpu, &linux_set);
+ hwloc_cpuset_foreach_end();
-#ifdef HAVE_OLD_SCHED_SETAFFINITY
- return pthread_setaffinity_np(tid, &linux_set);
-#else /* HAVE_OLD_SCHED_SETAFFINITY */
- return pthread_setaffinity_np(tid, sizeof(linux_set), &linux_set);
-#endif /* HAVE_OLD_SCHED_SETAFFINITY */
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
+ err = pthread_setaffinity_np(tid, &linux_set);
+#else /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ err = pthread_setaffinity_np(tid, sizeof(linux_set), &linux_set);
+#endif /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ }
#else /* CPU_SET */
- unsigned long mask = hwloc_cpuset_to_ulong(hwloc_set);
+ /* Use a separate block so that we can define specific variable
+ types here */
+ {
+ unsigned long mask = hwloc_cpuset_to_ulong(hwloc_set);
-#ifdef HAVE_OLD_SCHED_SETAFFINITY
- return pthread_setaffinity_np(tid, (void*) &mask);
-#else /* HAVE_OLD_SCHED_SETAFFINITY */
- return pthread_setaffinity_np(tid, sizeof(mask), (void*) &mask);
-#endif /* HAVE_OLD_SCHED_SETAFFINITY */
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
+ err = pthread_setaffinity_np(tid, (void*) &mask);
+#else /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ err = pthread_setaffinity_np(tid, sizeof(mask), (void*) &mask);
+#endif /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ }
#endif /* CPU_SET */
+
+ if (err) {
+ errno = err;
+ return -1;
+ }
+ return 0;
}
#endif /* HAVE_DECL_PTHREAD_SETAFFINITY_NP */
+#if HAVE_DECL_PTHREAD_GETAFFINITY_NP
+#pragma weak pthread_getaffinity_np
+
+static int
+hwloc_linux_get_thread_cpubind(hwloc_topology_t topology, pthread_t tid, hwloc_cpuset_t hwloc_set, int policy __hwloc_attribute_unused)
+{
+ int err;
+
+ if (topology->pid) {
+ errno = ENOSYS;
+ return -1;
+ }
+
+ if (tid == pthread_self())
+ return hwloc_linux_get_tid_cpubind(topology, 0, hwloc_set);
+
+ if (!pthread_getaffinity_np) {
+ /* ?! Application uses get_thread_cpubind, but doesn't link against libpthread ?! */
+ errno = ENOSYS;
+ return -1;
+ }
+ /* TODO Kerrighed */
+
+#ifdef HWLOC_HAVE_CPU_SET
+ /* Use a separate block so that we can define specific variable
+ types here */
+ {
+ cpu_set_t linux_set;
+ unsigned cpu;
+
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
+ err = pthread_getaffinity_np(tid, &linux_set);
+#else /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ err = pthread_getaffinity_np(tid, sizeof(linux_set), &linux_set);
+#endif /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ if (err) {
+ errno = err;
+ return -1;
+ }
+
+ hwloc_cpuset_zero(hwloc_set);
+ for(cpu=0; cpu<CPU_SETSIZE; cpu++)
+ if (CPU_ISSET(cpu, &linux_set))
+ hwloc_cpuset_set(hwloc_set, cpu);
+ }
+#else /* CPU_SET */
+ /* Use a separate block so that we can define specific variable
+ types here */
+ {
+ unsigned long mask;
+
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
+ err = pthread_getaffinity_np(tid, (void*) &mask);
+#else /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ err = pthread_getaffinity_np(tid, sizeof(mask), (void*) &mask);
+#endif /* HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
+ if (err) {
+ errno = err;
+ return -1;
+ }
+
+ hwloc_cpuset_from_ulong(hwloc_set, mask);
+ }
+#endif /* CPU_SET */
+
+ return 0;
+}
+#endif /* HAVE_DECL_PTHREAD_GETAFFINITY_NP */
+
int
-hwloc_backend_sysfs_init(struct hwloc_topology *topology, const char *fsroot_path)
+hwloc_backend_sysfs_init(struct hwloc_topology *topology, const char *fsroot_path __hwloc_attribute_unused)
{
#ifdef HAVE_OPENAT
int root;
@@ -278,26 +723,25 @@
#define KERNEL_CPU_MAP_LEN (KERNEL_CPU_MASK_BITS/4+2)
#define MAX_KERNEL_CPU_MASK ((HWLOC_NBMAXCPUS+KERNEL_CPU_MASK_BITS-1)/KERNEL_CPU_MASK_BITS)
-hwloc_cpuset_t
-hwloc_linux_parse_cpumap_file(FILE *file)
+int
+hwloc_linux_parse_cpumap_file(FILE *file, hwloc_cpuset_t set)
{
- char string[KERNEL_CPU_MAP_LEN]; /* enough for a shared map mask (32bits hexa) */
unsigned long maps[MAX_KERNEL_CPU_MASK];
- hwloc_cpuset_t set;
+ unsigned long map;
int nr_maps = 0;
+ int n;
int i;
- /* allocate and reset to zero first */
- set = hwloc_cpuset_alloc();
+ /* reset to zero first */
+ hwloc_cpuset_zero(set);
/* parse the whole mask */
- while (fgets(string, KERNEL_CPU_MAP_LEN, file) && *string != '\0') /* read one kernel cpu mask and the ending comma */
+ while (fscanf(file, "%lx,", &map) == 1) /* read one kernel cpu mask and the ending comma */
{
- unsigned long map;
- assert(!(nr_maps == MAX_KERNEL_CPU_MASK)); /* too many cpumasks in this cpumap */
+ if (nr_maps == MAX_KERNEL_CPU_MASK)
+ break; /* too many cpumasks in this cpumap */
- map = strtoul(string, NULL, 16);
if (!map && !nr_maps)
/* ignore the first map if it's empty */
continue;
@@ -308,14 +752,16 @@
}
/* check that the map can be stored in our cpuset */
- assert(!(nr_maps*KERNEL_CPU_MASK_BITS > HWLOC_NBMAXCPUS));
+ n = nr_maps*KERNEL_CPU_MASK_BITS;
+ if (n > HWLOC_NBMAXCPUS)
+ n = HWLOC_NBMAXCPUS;
/* convert into a set */
- for(i=0; i<nr_maps*KERNEL_CPU_MASK_BITS; i++)
+ for(i=0; i<n; i++)
if (maps[i/KERNEL_CPU_MASK_BITS] & 1<<(i%KERNEL_CPU_MASK_BITS))
hwloc_cpuset_set(set, i);
- return set;
+ return 0;
}
static hwloc_cpuset_t
@@ -328,78 +774,245 @@
if (!file)
return NULL;
- set = hwloc_linux_parse_cpumap_file(file);
+ set = hwloc_cpuset_alloc();
+ hwloc_linux_parse_cpumap_file(file, set);
fclose(file);
return set;
}
-static int
-hwloc_read_cpuset_mask(const char *filename, const char *type, char *info, int infomax, int fsroot_fd)
+static char *
+hwloc_strdup_mntpath(const char *escapedpath, size_t length)
{
-#define CPUSET_NAME_LEN 64
+ char *path = malloc(length+1);
+ const char *src = escapedpath, *tmp = src;
+ char *dst = path;
+
+ while ((tmp = strchr(src, '\\')) != NULL) {
+ strncpy(dst, src, tmp-src);
+ dst += tmp-src;
+ if (!strncmp(tmp+1, "040", 3))
+ *dst = ' ';
+ else if (!strncmp(tmp+1, "011", 3))
+ *dst = ' ';
+ else if (!strncmp(tmp+1, "012", 3))
+ *dst = '\n';
+ else
+ *dst = '\\';
+ dst++;
+ src = tmp+4;
+ }
+
+ strcpy(dst, src);
+
+ return path;
+}
+
+static void
+hwloc_find_linux_cpuset_mntpnt(char **cgroup_mntpnt, char **cpuset_mntpnt, int fsroot_fd)
+{
+#define PROC_MOUNT_LINE_LEN 128
+ char line[PROC_MOUNT_LINE_LEN];
+ FILE *fd;
+
+ *cgroup_mntpnt = NULL;
+ *cpuset_mntpnt = NULL;
+
+ /* ideally we should use setmntent, getmntent, hasmntopt and endmntent,
+ * but they do not support fsroot_fd.
+ */
+
+ fd = hwloc_fopen("/proc/mounts", "r", fsroot_fd);
+ if (!fd)
+ return;
+
+ while (fgets(line, sizeof(line), fd)) {
+ char *path;
+ char *type;
+ char *tmp;
+
+ /* path is after first field and a space */
+ tmp = strchr(line, ' ');
+ if (!tmp)
+ continue;
+ path = tmp+1;
+
+ /* type is after path, which may not contain spaces since the kernel escaped them to \040
+ * (see the manpage of getmntent) */
+ tmp = strchr(path, ' ');
+ if (!tmp)
+ continue;
+ type = tmp+1;
+ /* mark the end of path to ease upcoming strdup */
+ *tmp = '\0';
+
+ if (!strncmp(type, "cpuset ", 7)) {
+ /* found a cpuset mntpnt */
+ hwloc_debug("Found cpuset mount point on %s\n", path);
+ *cpuset_mntpnt = hwloc_strdup_mntpath(path, type-path);
+ break;
+ } else if (!strncmp(type, "cgroup ", 7)) {
+ /* found a cgroup mntpnt */
+ char *opt, *opts;
+
+ /* find options */
+ tmp = strchr(type, ' ');
+ if (!tmp)
+ continue;
+ opts = tmp+1;
+
+ /* find "cpuset" option */
+ while ((opt = strsep(&opts, ",")) && strcmp(opt, "cpuset"))
+ ; /* continue */
+ if (!opt)
+ continue;
+
+ hwloc_debug("Found cgroup/cpuset mount point on %s\n", path);
+ *cgroup_mntpnt = hwloc_strdup_mntpath(path, type-path);
+ break;
+ }
+ }
+
+ fclose(fd);
+}
+
+/*
+ * Linux cpusets may be managed directly or through cgroup.
+ * If cgroup is used, tasks get a /proc/pid/cgroup which may contain a
+ * single line %d:cpuset:<name>. If cpuset are used they get /proc/pid/cpuset
+ * containing <name>.
+ */
+static char *
+hwloc_read_linux_cpuset_name(int fsroot_fd, hwloc_pid_t pid)
+{
+#define CPUSET_NAME_LEN 128
char cpuset_name[CPUSET_NAME_LEN];
-#define CPUSET_FILENAME_LEN 64
- char cpuset_filename[CPUSET_FILENAME_LEN];
+ FILE *fd;
char *tmp;
- FILE *fd;
+ /* check whether a cgroup-cpuset is enabled */
+ if (!pid)
+ fd = hwloc_fopen("/proc/self/cgroup", "r", fsroot_fd);
+ else {
+ char path[] = "/proc/XXXXXXXXXX/cgroup";
+ snprintf(path, sizeof(path), "/proc/%d/cgroup", pid);
+ fd = hwloc_fopen(path, "r", fsroot_fd);
+ }
+ if (fd) {
+ /* find a cpuset line */
+#define CGROUP_LINE_LEN 256
+ char line[CGROUP_LINE_LEN];
+ while (fgets(line, sizeof(line), fd)) {
+ char *end, *colon = strchr(line, ':');
+ if (!colon)
+ continue;
+ if (strncmp(colon, ":cpuset:", 8))
+ continue;
+
+ /* found a cgroup-cpuset line, return the name */
+ fclose(fd);
+ end = strchr(colon, '\n');
+ if (end)
+ *end = '\0';
+ hwloc_debug("Found cgroup-cpuset %s\n", colon+8);
+ return strdup(colon+8);
+ }
+ fclose(fd);
+ }
+
/* check whether a cpuset is enabled */
- fd = hwloc_fopen(filename, "r", fsroot_fd);
- if (!fd)
- return 0;
+ if (!pid)
+ fd = hwloc_fopen("/proc/self/cpuset", "r", fsroot_fd);
+ else {
+ char path[] = "/proc/XXXXXXXXXX/cpuset";
+ snprintf(path, sizeof(path), "/proc/%d/cpuset", pid);
+ fd = hwloc_fopen(path, "r", fsroot_fd);
+ }
+ if (!fd) {
+ /* found nothing */
+ hwloc_debug("%s", "No cgroup or cpuset found\n");
+ return NULL;
+ }
+ /* found a cpuset, return the name */
tmp = fgets(cpuset_name, sizeof(cpuset_name), fd);
fclose(fd);
if (!tmp)
- return 0;
-
+ return NULL;
tmp = strchr(cpuset_name, '\n');
if (tmp)
*tmp = '\0';
+ hwloc_debug("Found cpuset %s\n", cpuset_name);
+ return strdup(cpuset_name);
+}
- /* read the cpuset */
- snprintf(cpuset_filename, CPUSET_FILENAME_LEN, "/dev/cpuset%s/%s", cpuset_name, type);
- hwloc_debug("Trying to read cpuset file <%s>\n", cpuset_filename);
- fd = hwloc_fopen(cpuset_filename, "r", fsroot_fd);
- if (!fd) {
- snprintf(cpuset_filename, CPUSET_FILENAME_LEN, "/cpusets%s/%s", cpuset_name, type);
+/*
+ * Then, the cpuset description is available from either the cgroup or
+ * the cpuset filesystem (usually mounted in / or /dev) where there
+ * are cgroup<name>/cpuset.{cpus,mems} or cpuset<name>/{cpus,mems} files.
+ */
+static char *
+hwloc_read_linux_cpuset_mask(const char *cgroup_mntpnt, const char *cpuset_mntpnt, const char *cpuset_name, const char *attr_name, int fsroot_fd)
+{
+#define CPUSET_FILENAME_LEN 256
+ char cpuset_filename[CPUSET_FILENAME_LEN];
+ FILE *fd;
+ char *info = NULL, *tmp;
+ ssize_t ssize;
+ size_t size;
+
+ if (cgroup_mntpnt) {
+ /* try to read the cpuset from cgroup */
+ snprintf(cpuset_filename, CPUSET_FILENAME_LEN, "%s%s/cpuset.%s", cgroup_mntpnt, cpuset_name, attr_name);
+ hwloc_debug("Trying to read cgroup file <%s>\n", cpuset_filename);
+ fd = hwloc_fopen(cpuset_filename, "r", fsroot_fd);
+ if (fd)
+ goto gotfile;
+ } else if (cpuset_mntpnt) {
+ /* try to read the cpuset directly */
+ snprintf(cpuset_filename, CPUSET_FILENAME_LEN, "%s%s/%s", cpuset_mntpnt, cpuset_name, attr_name);
hwloc_debug("Trying to read cpuset file <%s>\n", cpuset_filename);
fd = hwloc_fopen(cpuset_filename, "r", fsroot_fd);
+ if (fd)
+ goto gotfile;
}
- if (!fd)
- return 0;
+ /* found no cpuset description, ignore it */
+ hwloc_debug("Couldn't find cpuset <%s> description, ignoring\n", cpuset_name);
+ goto out;
- tmp = fgets(info, infomax, fd);
+gotfile:
+ ssize = getline(&info, &size, fd);
fclose(fd);
- if (!tmp)
- return 0;
+ if (ssize < 0)
+ goto out;
+ if (!info)
+ goto out;
tmp = strchr(info, '\n');
if (tmp)
*tmp = '\0';
- return 1;
+out:
+ return info;
}
static void
hwloc_admin_disable_set_from_cpuset(struct hwloc_topology *topology,
- const char *path,
- const char *name,
- hwloc_cpuset_t admin_disabled_set)
+ const char *cgroup_mntpnt, const char *cpuset_mntpnt, const char *cpuset_name,
+ const char *attr_name,
+ hwloc_cpuset_t admin_enabled_cpus_set)
{
-#define CPUSET_MASK_LEN 64
- char cpuset_mask[CPUSET_MASK_LEN];
+ char *cpuset_mask;
char *current, *comma, *tmp;
int prevlast, nextfirst, nextlast; /* beginning/end of enabled-segments */
- int ret;
- ret = hwloc_read_cpuset_mask(path, name, cpuset_mask, CPUSET_MASK_LEN, topology->backend_params.sysfs.root_fd);
- if (!ret)
+ cpuset_mask = hwloc_read_linux_cpuset_mask(cgroup_mntpnt, cpuset_mntpnt, cpuset_name,
+ attr_name, topology->backend_params.sysfs.root_fd);
+ if (!cpuset_mask)
return;
- hwloc_debug("found cpuset %s: %s\n", name, cpuset_mask);
+ hwloc_debug("found cpuset %s: %s\n", attr_name, cpuset_mask);
current = cpuset_mask;
prevlast = -1;
@@ -417,8 +1030,8 @@
else
nextlast = nextfirst;
if (prevlast+1 <= nextfirst-1) {
- hwloc_debug("%s [%d:%d] excluded by cpuset\n", name, prevlast+1, nextfirst-1);
- hwloc_cpuset_set_range(admin_disabled_set, prevlast+1, nextfirst-1);
+ hwloc_debug("%s [%d:%d] excluded by cpuset\n", attr_name, prevlast+1, nextfirst-1);
+ hwloc_cpuset_clr_range(admin_enabled_cpus_set, prevlast+1, nextfirst-1);
}
/* switch to next enabled-segment */
@@ -431,36 +1044,50 @@
/* disable after last enabled-segment */
nextfirst = HWLOC_NBMAXCPUS;
if (prevlast+1 <= nextfirst-1) {
- hwloc_debug("%s [%d:%d] excluded by cpuset\n", name, prevlast+1, nextfirst-1);
- hwloc_cpuset_set_range(admin_disabled_set, prevlast+1, nextfirst-1);
+ hwloc_debug("%s [%d:%d] excluded by cpuset\n", attr_name, prevlast+1, nextfirst-1);
+ hwloc_cpuset_clr_range(admin_enabled_cpus_set, prevlast+1, nextfirst-1);
}
+
+ free(cpuset_mask);
}
static void
hwloc_get_procfs_meminfo_info(struct hwloc_topology *topology,
- const char *path,
- unsigned long *mem_size_kB,
- unsigned long *huge_page_size_kB,
- unsigned long *huge_page_free)
+ const char *path, struct hwloc_obj_memory_s *memory)
{
char string[64];
FILE *fd;
+ if (topology->is_thissystem) {
+ memory->page_types_len = 2;
+ memory->page_types = malloc(2*sizeof(*memory->page_types));
+ memset(memory->page_types, 0, 2*sizeof(*memory->page_types));
+
+ /* Try to get the hugepage size from sysconf in case we fail to get it from /proc/meminfo later */
+#ifdef HAVE__SC_LARGE_PAGESIZE
+ memory->page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
+#endif
+ memory->page_types[0].size = getpagesize();
+ }
+
fd = hwloc_fopen(path, "r", topology->backend_params.sysfs.root_fd);
if (!fd)
return;
while (fgets(string, sizeof(string), fd) && *string != '\0')
{
- unsigned long number;
- if (sscanf(string, "MemTotal: %lu kB", &number) == 1)
- *mem_size_kB = number;
- else if (sscanf(string, "Hugepagesize: %lu", &number) == 1)
- *huge_page_size_kB = number;
- else if (sscanf(string, "HugePages_Free: %lu", &number) == 1)
- *huge_page_free = number;
+ unsigned long long number;
+ if (sscanf(string, "MemTotal: %llu kB", &number) == 1)
+ memory->local_memory = number << 10;
+ else if (memory->page_types && sscanf(string, "Hugepagesize: %llu", &number) == 1)
+ memory->page_types[1].size = number << 10;
+ else if (memory->page_types && sscanf(string, "HugePages_Free: %llu", &number) == 1)
+ memory->page_types[1].count = number;
}
+ if (memory->page_types)
+ memory->page_types[0].count = (memory->local_memory - memory->page_types[1].count*memory->page_types[1].size) / memory->page_types[0].size;
+
fclose(fd);
}
@@ -468,10 +1095,8 @@
static void
hwloc_sysfs_node_meminfo_info(struct hwloc_topology *topology,
- const char *syspath,
- int node,
- unsigned long *mem_size_kB,
- unsigned long *huge_page_free)
+ const char *syspath, int node,
+ struct hwloc_obj_memory_s *memory)
{
char path[SYSFS_NUMA_NODE_PATH_LEN];
char string[64];
@@ -482,15 +1107,28 @@
if (!fd)
return;
+ if (topology->is_thissystem) {
+ memory->page_types_len = 2;
+ memory->page_types = malloc(2*sizeof(*memory->page_types));
+ memset(memory->page_types, 0, 2*sizeof(*memory->page_types));
+ }
+
while (fgets(string, sizeof(string), fd) && *string != '\0')
{
- unsigned long number;
- if (sscanf(string, "Node %d MemTotal: %lu kB", &node, &number) == 2)
- *mem_size_kB = number;
- else if (sscanf(string, "Node %d HugePages_Free: %lu kB", &node, &number) == 2)
- *huge_page_free = number;
+ unsigned long long number;
+ if (sscanf(string, "Node %d MemTotal: %llu kB", &node, &number) == 2)
+ memory->local_memory = number << 10;
+ else if (memory->page_types && sscanf(string, "Node %d HugePages_Free: %llu kB", &node, &number) == 2)
+ memory->page_types[1].count = number;
}
+ if (memory->page_types) {
+ /* hwloc_get_procfs_meminfo_info must have been called earlier */
+ memory->page_types[1].size = topology->levels[0][0]->memory.page_types[1].size;
+ memory->page_types[0].size = getpagesize();
+ memory->page_types[0].count = (memory->local_memory - memory->page_types[1].count*memory->page_types[1].size) / memory->page_types[0].size;
+ }
+
fclose(fd);
}
@@ -525,10 +1163,7 @@
}
static void
-look_sysfsnode(struct hwloc_topology *topology,
- const char *path,
- hwloc_cpuset_t admin_disabled_cpus_set,
- hwloc_cpuset_t admin_disabled_mems_set)
+look_sysfsnode(struct hwloc_topology *topology, const char *path, unsigned *found)
{
unsigned osnode;
unsigned nbnodes = 1;
@@ -536,6 +1171,8 @@
struct dirent *dirent;
hwloc_obj_t node;
+ *found = 0;
+
dir = hwloc_opendir(path, topology->backend_params.sysfs.root_fd);
if (dir)
{
@@ -562,47 +1199,39 @@
for (osnode=0; osnode < nbnodes; osnode++) {
char nodepath[SYSFS_NUMA_NODE_PATH_LEN];
hwloc_cpuset_t cpuset;
- unsigned long size = -1;
- unsigned long hpfree = -1;
-
+
sprintf(nodepath, "%s/node%u/cpumap", path, osnode);
cpuset = hwloc_parse_cpumap(nodepath, topology->backend_params.sysfs.root_fd);
if (!cpuset)
continue;
-
- /* clear disabled cpus */
- hwloc_cpuset_clearset(cpuset, admin_disabled_cpus_set);
-
- if (hwloc_cpuset_isset(admin_disabled_mems_set, osnode)) {
- size = 0; hpfree = 0;
- } else
- hwloc_sysfs_node_meminfo_info(topology, path, osnode, &size, &hpfree);
-
+
node = hwloc_alloc_setup_object(HWLOC_OBJ_NODE, osnode);
node->cpuset = cpuset;
- node->attr->node.memory_kB = size;
- node->attr->node.huge_page_free = hpfree;
- node->cpuset = cpuset;
-
+ node->nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_set(node->nodeset, osnode);
+
+ hwloc_sysfs_node_meminfo_info(topology, path, osnode, &node->memory);
+
hwloc_debug_1arg_cpuset("os node %u has cpuset %s\n",
osnode, node->cpuset);
- hwloc_add_object(topology, node);
+ hwloc_insert_object_by_cpuset(topology, node);
nodes[osnode] = node;
-
+
sprintf(nodepath, "%s/node%u/distance", path, osnode);
hwloc_parse_node_distance(nodepath, nbnodes, distances[osnode], topology->backend_params.sysfs.root_fd);
}
-
+
hwloc_setup_misc_level_from_distances(topology, nbnodes, nodes, (unsigned*) distances);
}
+
+ *found = nbnodes;
}
/* Look at Linux' /sys/devices/system/cpu/cpu%d/topology/ */
static void
-look_sysfscpu(struct hwloc_topology *topology, const char *path,
- hwloc_cpuset_t admin_disabled_cpus_set)
+look_sysfscpu(struct hwloc_topology *topology, const char *path)
{
- hwloc_cpuset_t cpuset;
+ hwloc_cpuset_t cpuset; /* Set of cpus for which we have topology information */
#define CPU_TOPOLOGY_STR_LEN 128
char str[CPU_TOPOLOGY_STR_LEN];
DIR *dir;
@@ -623,23 +1252,13 @@
continue;
cpu = strtoul(dirent->d_name+3, NULL, 0);
- assert(cpu < HWLOC_NBMAXCPUS);
+ if (cpu >= HWLOC_NBMAXCPUS)
+ continue;
- /* check whether cpusets exclude this cpu */
- if (hwloc_cpuset_isset(admin_disabled_cpus_set, cpu)) {
- hwloc_debug("os proc %lu is disabled by the administrator\n", cpu);
- continue;
- }
+ /* Maybe we don't have topology information but at least it exists */
+ hwloc_cpuset_set(topology->levels[0][0]->complete_cpuset, cpu);
- /* check whether the kernel exports topology information for this cpu */
- sprintf(str, "%s/cpu%lu/topology", path, cpu);
- if (hwloc_access(str, X_OK, topology->backend_params.sysfs.root_fd) < 0 && errno == ENOENT) {
- hwloc_debug("os proc %lu has no accessible %s/cpu%lu/topology\n",
- cpu, path, cpu);
- continue;
- }
-
- /* check whether this processor is offline */
+ /* check whether this processor is online */
sprintf(str, "%s/cpu%lu/online", path, cpu);
fd = hwloc_fopen(str, "r", topology->backend_params.sysfs.root_fd);
if (fd) {
@@ -649,19 +1268,28 @@
hwloc_debug("os proc %lu is online\n", cpu);
} else {
hwloc_debug("os proc %lu is offline\n", cpu);
- continue;
+ hwloc_cpuset_clr(topology->levels[0][0]->online_cpuset, cpu);
}
} else {
fclose(fd);
}
}
+ /* check whether the kernel exports topology information for this cpu */
+ sprintf(str, "%s/cpu%lu/topology", path, cpu);
+ if (hwloc_access(str, X_OK, topology->backend_params.sysfs.root_fd) < 0 && errno == ENOENT) {
+ hwloc_debug("os proc %lu has no accessible %s/cpu%lu/topology\n",
+ cpu, path, cpu);
+ continue;
+ }
+
hwloc_cpuset_set(cpuset, cpu);
}
closedir(dir);
}
- hwloc_debug_1arg_cpuset("found %d cpus, cpuset %s\n",
+ topology->support.discovery->pu = 1;
+ hwloc_debug_1arg_cpuset("found %d cpu topologies, cpuset %s\n",
hwloc_cpuset_weight(cpuset), cpuset);
hwloc_cpuset_foreach_begin(i, cpuset)
@@ -677,20 +1305,18 @@
sprintf(str, "%s/cpu%d/topology/core_siblings", path, i);
socketset = hwloc_parse_cpumap(str, topology->backend_params.sysfs.root_fd);
- assert(socketset);
- hwloc_cpuset_clearset(socketset, admin_disabled_cpus_set);
- assert(hwloc_cpuset_weight(socketset) >= 1);
+ if (socketset && hwloc_cpuset_weight(socketset) >= 1) {
+ if (hwloc_cpuset_first(socketset) == i) {
+ /* first cpu in this socket, add the socket */
+ socket = hwloc_alloc_setup_object(HWLOC_OBJ_SOCKET, mysocketid);
+ socket->cpuset = socketset;
+ hwloc_debug_1arg_cpuset("os socket %u has cpuset %s\n",
+ mysocketid, socketset);
+ hwloc_insert_object_by_cpuset(topology, socket);
+ } else
+ hwloc_cpuset_free(socketset);
+ }
- if (hwloc_cpuset_first(socketset) == i) {
- /* first cpu in this socket, add the socket */
- socket = hwloc_alloc_setup_object(HWLOC_OBJ_SOCKET, mysocketid);
- socket->cpuset = socketset;
- hwloc_debug_1arg_cpuset("os socket %u has cpuset %s\n",
- mysocketid, socketset);
- hwloc_add_object(topology, socket);
- } else
- free(socketset);
-
/* look at the core */
mycoreid = 0; /* shut-up the compiler */
sprintf(str, "%s/cpu%d/topology/core_id", path, i);
@@ -698,31 +1324,27 @@
sprintf(str, "%s/cpu%d/topology/thread_siblings", path, i);
coreset = hwloc_parse_cpumap(str, topology->backend_params.sysfs.root_fd);
- assert(coreset);
- hwloc_cpuset_clearset(coreset, admin_disabled_cpus_set);
- assert(hwloc_cpuset_weight(coreset) >= 1);
+ if (coreset && hwloc_cpuset_weight(coreset) >= 1) {
+ if (hwloc_cpuset_first(coreset) == i) {
+ core = hwloc_alloc_setup_object(HWLOC_OBJ_CORE, mycoreid);
+ core->cpuset = coreset;
+ hwloc_debug_1arg_cpuset("os core %u has cpuset %s\n",
+ mycoreid, coreset);
+ hwloc_insert_object_by_cpuset(topology, core);
+ } else
+ hwloc_cpuset_free(coreset);
+ }
- if (hwloc_cpuset_first(coreset) == i) {
- core = hwloc_alloc_setup_object(HWLOC_OBJ_CORE, mycoreid);
- core->cpuset = coreset;
- hwloc_debug_1arg_cpuset("os core %u has cpuset %s\n",
- mycoreid, coreset);
- hwloc_add_object(topology, core);
- } else
- free(coreset);
-
/* look at the thread */
threadset = hwloc_cpuset_alloc();
hwloc_cpuset_cpu(threadset, i);
- hwloc_cpuset_clearset(threadset, admin_disabled_cpus_set);
- assert(hwloc_cpuset_weight(threadset) == 1);
/* add the thread */
- thread = hwloc_alloc_setup_object(HWLOC_OBJ_PROC, i);
+ thread = hwloc_alloc_setup_object(HWLOC_OBJ_PU, i);
thread->cpuset = threadset;
hwloc_debug_1arg_cpuset("thread %d has cpuset %s\n",
i, threadset);
- hwloc_add_object(topology, thread);
+ hwloc_insert_object_by_cpuset(topology, thread);
/* look at the caches */
for(j=0; j<10; j++) {
@@ -772,23 +1394,23 @@
sprintf(mappath, "%s/cpu%d/cache/index%d/shared_cpu_map", path, i, j);
cacheset = hwloc_parse_cpumap(mappath, topology->backend_params.sysfs.root_fd);
- assert(cacheset);
- hwloc_cpuset_clearset(cacheset, admin_disabled_cpus_set);
- if (hwloc_cpuset_weight(cacheset) < 1)
- /* mask is wrong (happens on ia64), assumes it's not shared */
- hwloc_cpuset_cpu(cacheset, i);
+ if (cacheset) {
+ if (hwloc_cpuset_weight(cacheset) < 1)
+ /* mask is wrong (happens on ia64), assumes it's not shared */
+ hwloc_cpuset_cpu(cacheset, i);
- if (hwloc_cpuset_first(cacheset) == i) {
- /* first cpu in this cache, add the cache */
- cache = hwloc_alloc_setup_object(HWLOC_OBJ_CACHE, -1);
- cache->attr->cache.memory_kB = kB;
- cache->attr->cache.depth = depth+1;
- cache->cpuset = cacheset;
- hwloc_debug_1arg_cpuset("cache depth %d has cpuset %s\n",
- depth, cacheset);
- hwloc_add_object(topology, cache);
- } else
- free(cacheset);
+ if (hwloc_cpuset_first(cacheset) == i) {
+ /* first cpu in this cache, add the cache */
+ cache = hwloc_alloc_setup_object(HWLOC_OBJ_CACHE, -1);
+ cache->attr->cache.size = kB << 10;
+ cache->attr->cache.depth = depth+1;
+ cache->cpuset = cacheset;
+ hwloc_debug_1arg_cpuset("cache depth %d has cpuset %s\n",
+ depth, cacheset);
+ hwloc_insert_object_by_cpuset(topology, cache);
+ } else
+ hwloc_cpuset_free(cacheset);
+ }
}
}
hwloc_cpuset_foreach_end();
@@ -803,8 +1425,7 @@
# define COREID "core id"
static int
look_cpuinfo(struct hwloc_topology *topology, const char *path,
- hwloc_cpuset_t online_cpuset,
- hwloc_cpuset_t admin_disabled_cpus_set)
+ hwloc_cpuset_t online_cpuset)
{
FILE *fd;
char str[strlen(PHYSID)+1+9+1+1];
@@ -819,10 +1440,12 @@
unsigned numprocs=0;
unsigned numsockets=0;
unsigned numcores=0;
- long physid;
- long coreid;
- long processor = -1;
- int i;
+ unsigned long physid;
+ unsigned long coreid;
+ unsigned long processor = (unsigned long) -1;
+ unsigned i;
+ hwloc_cpuset_t cpuset;
+ hwloc_obj_t obj;
for (i = 0; i < HWLOC_NBMAXCPUS; i++) {
proc_physids[i] = -1;
@@ -833,17 +1456,16 @@
core_osphysids[i] = -1;
}
- hwloc_cpuset_zero(online_cpuset);
-
if (!(fd=hwloc_fopen(path,"r", topology->backend_params.sysfs.root_fd)))
{
- hwloc_debug("could not open /proc/cpuinfo\n");
+ hwloc_debug("%s", "could not open /proc/cpuinfo\n");
return -1;
}
+ cpuset = hwloc_cpuset_alloc();
/* Just record information and count number of sockets and cores */
- hwloc_debug("\n\n * Topology extraction from /proc/cpuinfo *\n\n");
+ hwloc_debug("%s", "\n\n * Topology extraction from /proc/cpuinfo *\n\n");
while (fgets(str,sizeof(str),fd)!=NULL)
{
# define getprocnb_begin(field, var) \
@@ -853,24 +1475,31 @@
var = strtoul(c,&endptr,0); \
if (endptr==c) \
{ \
- fprintf(stderr,"no number in "field" field of /proc/cpuinfo\n"); \
- break; \
+ hwloc_debug("%s", "no number in "field" field of /proc/cpuinfo\n"); \
+ hwloc_cpuset_free(cpuset); \
+ return -1; \
} \
- else if (var==LONG_MIN) \
+ else if (var==ULONG_MAX) \
{ \
- fprintf(stderr,"too small "field" number in /proc/cpuinfo\n"); \
- break; \
+ hwloc_debug("%s", "too big "field" number in /proc/cpuinfo\n"); \
+ hwloc_cpuset_free(cpuset); \
+ return -1; \
} \
- else if (var==LONG_MAX) \
- { \
- fprintf(stderr,"too big "field" number in /proc/cpuinfo\n"); \
- break; \
- } \
- hwloc_debug(field " %ld\n", var)
+ hwloc_debug(field " %lu\n", var)
# define getprocnb_end() \
}
getprocnb_begin(PROCESSOR,processor);
- hwloc_cpuset_set(online_cpuset, processor);
+ hwloc_cpuset_set(cpuset, processor);
+
+ obj = hwloc_alloc_setup_object(HWLOC_OBJ_PU, processor);
+ obj->cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_cpu(obj->cpuset, processor);
+
+ hwloc_debug_2args_cpuset("cpu %u (os %lu) has cpuset %s\n",
+ numprocs, processor, obj->cpuset);
+ numprocs++;
+ hwloc_insert_object_by_cpuset(topology, obj);
+
getprocnb_end() else
getprocnb_begin(PHYSID,physid);
proc_osphysids[processor]=physid;
@@ -878,7 +1507,7 @@
if (physid == osphysids[i])
break;
proc_physids[processor]=i;
- hwloc_debug("%ld on socket %d (%lx)\n", processor, i, physid);
+ hwloc_debug("%lu on socket %u (%lx)\n", processor, i, physid);
if (i==numsockets)
osphysids[(numsockets)++] = physid;
getprocnb_end() else
@@ -887,7 +1516,6 @@
if (coreid == oscoreids[i] && proc_osphysids[processor] == core_osphysids[i])
break;
proc_coreids[processor]=i;
- hwloc_debug("%ld on core %d (%lx:%x)\n", processor, i, coreid, proc_osphysids[processor]);
if (i==numcores)
{
core_osphysids[numcores] = proc_osphysids[processor];
@@ -905,38 +1533,31 @@
}
fclose(fd);
+ if (processor == (unsigned long) -1) {
+ hwloc_cpuset_free(cpuset);
+ return -1;
+ }
+
+ topology->support.discovery->pu = 1;
/* setup the final number of procs */
procid_max = processor + 1;
- numprocs = hwloc_cpuset_weight(online_cpuset);
+ hwloc_cpuset_copy(online_cpuset, cpuset);
+ hwloc_cpuset_free(cpuset);
- /* clear admin-disabled cpus */
- hwloc_cpuset_foreach_begin(i, online_cpuset) {
- if (hwloc_cpuset_isset(admin_disabled_cpus_set, i)) {
- hwloc_cpuset_clr(online_cpuset, i);
- proc_osphysids[i] = -1;
- proc_physids[i] = -1;
- proc_coreids[i] = -1;
- }
- } hwloc_cpuset_foreach_end();
-
hwloc_debug("%u online processors found, with id max %u\n", numprocs, procid_max);
- hwloc_debug_cpuset("online processor cpuset: %s\n",
- online_cpuset);
+ hwloc_debug_cpuset("online processor cpuset: %s\n", online_cpuset);
- hwloc_debug("\n * Topology summary *\n");
- hwloc_debug("%d processors (%d max id)\n", numprocs, procid_max);
+ hwloc_debug("%s", "\n * Topology summary *\n");
+ hwloc_debug("%u processors (%u max id)\n", numprocs, procid_max);
- hwloc_debug("%d sockets\n", numsockets);
+ hwloc_debug("%u sockets\n", numsockets);
if (numsockets>0)
hwloc_setup_level(procid_max, numsockets, osphysids, proc_physids, topology, HWLOC_OBJ_SOCKET);
- hwloc_debug("%d cores\n", numcores);
+ hwloc_debug("%u cores\n", numcores);
if (numcores>0)
hwloc_setup_level(procid_max, numcores, oscoreids, proc_coreids, topology, HWLOC_OBJ_CORE);
- /* setup the cpu level, removing nonfirst threads */
- hwloc_setup_proc_level(topology, numprocs, online_cpuset);
-
return 0;
}
@@ -981,13 +1602,23 @@
void
hwloc_look_linux(struct hwloc_topology *topology)
{
- hwloc_cpuset_t admin_disabled_cpus_set, admin_disabled_mems_set, online_set;
DIR *nodes_dir;
+ unsigned nbnodes;
+ char *cpuset_mntpnt, *cgroup_mntpnt, *cpuset_name;
int err;
- admin_disabled_cpus_set = hwloc_cpuset_alloc();
- admin_disabled_mems_set = hwloc_cpuset_alloc();
- online_set = hwloc_cpuset_alloc();
+ /* Gather the list of admin-disabled cpus and mems */
+ hwloc_find_linux_cpuset_mntpnt(&cgroup_mntpnt, &cpuset_mntpnt, topology->backend_params.sysfs.root_fd);
+ if (cgroup_mntpnt || cpuset_mntpnt) {
+ cpuset_name = hwloc_read_linux_cpuset_name(topology->backend_params.sysfs.root_fd, topology->pid);
+ if (cpuset_name) {
+ hwloc_admin_disable_set_from_cpuset(topology, cgroup_mntpnt, cpuset_mntpnt, cpuset_name, "cpus", topology->levels[0][0]->allowed_cpuset);
+ hwloc_admin_disable_set_from_cpuset(topology, cgroup_mntpnt, cpuset_mntpnt, cpuset_name, "mems", topology->levels[0][0]->allowed_nodeset);
+ free(cpuset_name);
+ }
+ free(cgroup_mntpnt);
+ free(cpuset_mntpnt);
+ }
nodes_dir = hwloc_opendir("/proc/nodes", topology->backend_params.sysfs.root_fd);
if (nodes_dir) {
@@ -995,40 +1626,37 @@
struct dirent *dirent;
char path[128];
hwloc_obj_t machine;
+ hwloc_cpuset_t machine_online_set;
- topology->levels[0][0]->attr->system.memory_kB = 0;
- topology->levels[0][0]->attr->system.huge_page_free = 0;
+ /* replace top-level object type with SYSTEM and add some MACHINE underneath */
+
+ topology->levels[0][0]->type = HWLOC_OBJ_SYSTEM;
+ topology->levels[0][0]->name = strdup("Kerrighed");
+
/* No cpuset support for now. */
/* No sys support for now. */
while ((dirent = readdir(nodes_dir)) != NULL) {
unsigned long node;
if (strncmp(dirent->d_name, "node", 4))
continue;
+ machine_online_set = hwloc_cpuset_alloc();
node = strtoul(dirent->d_name+4, NULL, 0);
snprintf(path, sizeof(path), "/proc/nodes/node%lu/cpuinfo", node);
- err = look_cpuinfo(topology, path, online_set, admin_disabled_cpus_set);
- if (err < 0) {
- fprintf(stderr, "/proc/cpuinfo missing, required for kerrighed support\n");
- abort();
- }
+ err = look_cpuinfo(topology, path, machine_online_set);
+ if (err < 0)
+ continue;
+ hwloc_cpuset_or(topology->levels[0][0]->online_cpuset, topology->levels[0][0]->online_cpuset, machine_online_set);
machine = hwloc_alloc_setup_object(HWLOC_OBJ_MACHINE, node);
- machine->cpuset = hwloc_cpuset_dup(online_set);
+ machine->cpuset = machine_online_set;
machine->attr->machine.dmi_board_name = NULL;
machine->attr->machine.dmi_board_vendor = NULL;
hwloc_debug_1arg_cpuset("machine number %lu has cpuset %s\n",
- node, online_set);
- hwloc_add_object(topology, machine);
+ node, machine_online_set);
+ hwloc_insert_object_by_cpuset(topology, machine);
snprintf(path, sizeof(path), "/proc/nodes/node%lu/meminfo", node);
- /* Compute the machine memory and huge page */
- hwloc_get_procfs_meminfo_info(topology,
- path,
- &machine->attr->machine.memory_kB,
- &machine->attr->machine.huge_page_size_kB,
- &machine->attr->machine.huge_page_free);
- /* FIXME: gather page_size_kB as well? MaMI needs it */
- topology->levels[0][0]->attr->system.memory_kB += machine->attr->machine.memory_kB;
- topology->levels[0][0]->attr->system.huge_page_free += machine->attr->machine.huge_page_free;
+ /* Get the machine memory attributes */
+ hwloc_get_procfs_meminfo_info(topology, path, &machine->memory);
/* Gather DMI info */
/* FIXME: get the right DMI info of each machine */
@@ -1038,58 +1666,60 @@
}
closedir(nodes_dir);
} else {
- /* Gather the list of admin-disabled cpus and mems */
- if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM)) {
- hwloc_admin_disable_set_from_cpuset(topology, "/proc/self/cpuset", "cpus", admin_disabled_cpus_set);
- hwloc_admin_disable_set_from_cpuset(topology, "/proc/self/cpuset", "mems", admin_disabled_mems_set);
+ /* Get the machine memory attributes */
+ hwloc_get_procfs_meminfo_info(topology, "/proc/meminfo", &topology->levels[0][0]->memory);
+
+ /* Gather NUMA information. Must be after hwloc_get_procfs_meminfo_info so that the hugepage size is known */
+ look_sysfsnode(topology, "/sys/devices/system/node", &nbnodes);
+
+ /* if we found some numa nodes, the machine object has no local memory */
+ if (nbnodes) {
+ topology->levels[0][0]->memory.local_memory = 0;
+ if (topology->levels[0][0]->memory.page_types) {
+ topology->levels[0][0]->memory.page_types[0].count = 0;
+ topology->levels[0][0]->memory.page_types[1].count = 0;
+ }
}
- /* Gather NUMA information */
- look_sysfsnode(topology, "/sys/devices/system/node", admin_disabled_cpus_set, admin_disabled_mems_set);
-
/* Gather the list of cpus now */
if (getenv("HWLOC_LINUX_USE_CPUINFO")
- || hwloc_access("/sys/devices/system/cpu/cpu0/topology/core_id", R_OK, topology->backend_params.sysfs.root_fd) < 0
- || hwloc_access("/sys/devices/system/cpu/cpu0/topology/core_siblings", R_OK, topology->backend_params.sysfs.root_fd) < 0
- || hwloc_access("/sys/devices/system/cpu/cpu0/topology/physical_package_id", R_OK, topology->backend_params.sysfs.root_fd) < 0
- || hwloc_access("/sys/devices/system/cpu/cpu0/topology/thread_siblings", R_OK, topology->backend_params.sysfs.root_fd) < 0) {
+ || hwloc_access("/sys/devices/system/cpu/cpu0/topology", R_OK, topology->backend_params.sysfs.root_fd) < 0) {
/* revert to reading cpuinfo only if /sys/.../topology unavailable (before 2.6.16) */
- err = look_cpuinfo(topology, "/proc/cpuinfo", online_set, admin_disabled_cpus_set);
+ err = look_cpuinfo(topology, "/proc/cpuinfo", topology->levels[0][0]->online_cpuset);
if (err < 0) {
- fprintf(stderr, "sysfs topology not found, and /proc/cpuinfo missing\n");
- abort();
+ if (topology->is_thissystem)
+ hwloc_setup_pu_level(topology, hwloc_fallback_nbprocessors(topology));
+ else
+ /* fsys-root but not this system, no way, assume there's just 1
+ * processor :/ */
+ hwloc_setup_pu_level(topology, 1);
}
} else {
- look_sysfscpu(topology, "/sys/devices/system/cpu", admin_disabled_cpus_set);
+ look_sysfscpu(topology, "/sys/devices/system/cpu");
}
- /* Compute the whole system memory and huge page */
- hwloc_get_procfs_meminfo_info(topology,
- "/proc/meminfo",
- &topology->levels[0][0]->attr->system.memory_kB,
- &topology->levels[0][0]->attr->system.huge_page_size_kB,
- &topology->levels[0][0]->attr->system.huge_page_free);
- /* FIXME: gather page_size_kB as well? MaMI needs it */
-
/* Gather DMI info */
hwloc__get_dmi_info(topology,
- &topology->levels[0][0]->attr->system.dmi_board_vendor,
- &topology->levels[0][0]->attr->system.dmi_board_name);
+ &topology->levels[0][0]->attr->machine.dmi_board_vendor,
+ &topology->levels[0][0]->attr->machine.dmi_board_name);
}
-
- hwloc_cpuset_free(admin_disabled_cpus_set);
- hwloc_cpuset_free(admin_disabled_mems_set);
- hwloc_cpuset_free(online_set);
}
void
hwloc_set_linux_hooks(struct hwloc_topology *topology)
{
- topology->set_cpubind = hwloc_linux_set_cpubind;
+ topology->set_thisthread_cpubind = hwloc_linux_set_thisthread_cpubind;
+ topology->get_thisthread_cpubind = hwloc_linux_get_thisthread_cpubind;
+ topology->set_thisproc_cpubind = hwloc_linux_set_thisproc_cpubind;
+ topology->get_thisproc_cpubind = hwloc_linux_get_thisproc_cpubind;
+ topology->set_proc_cpubind = hwloc_linux_set_proc_cpubind;
+ topology->get_proc_cpubind = hwloc_linux_get_proc_cpubind;
#if HAVE_DECL_PTHREAD_SETAFFINITY_NP
topology->set_thread_cpubind = hwloc_linux_set_thread_cpubind;
#endif /* HAVE_DECL_PTHREAD_SETAFFINITY_NP */
- topology->set_thisthread_cpubind = hwloc_linux_set_thisthread_cpubind;
+#if HAVE_DECL_PTHREAD_GETAFFINITY_NP
+ topology->get_thread_cpubind = hwloc_linux_get_thread_cpubind;
+#endif /* HAVE_DECL_PTHREAD_GETAFFINITY_NP */
}
/* TODO mbind, setpolicy */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-osf.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-osf.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-osf.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -5,7 +5,6 @@
#include <private/config.h>
-#include <assert.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
@@ -25,7 +24,7 @@
#include <cpuset.h>
static int
-prepare_radset(hwloc_topology_t topology, radset_t *radset, hwloc_cpuset_t hwloc_set)
+prepare_radset(hwloc_topology_t topology, radset_t *radset, hwloc_const_cpuset_t hwloc_set)
{
unsigned cpu;
cpuset_t target_cpuset;
@@ -38,7 +37,7 @@
cpuemptyset(target_cpuset);
hwloc_cpuset_foreach_begin(cpu, hwloc_set)
cpuaddset(target_cpuset, cpu);
- hwloc_cpuset_foreach_end()
+ hwloc_cpuset_foreach_end();
cpusetcreate(&cpuset);
cpusetcreate(&xor_cpuset);
@@ -69,12 +68,14 @@
return ret;
}
+/* Note: get_cpubind not available on OSF */
+
static int
-hwloc_osf_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t thread, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_osf_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t thread, hwloc_const_cpuset_t hwloc_set, int policy)
{
radset_t radset;
- if (hwloc_cpuset_isequal(hwloc_set, hwloc_get_system_obj(topology)->cpuset)) {
+ if (hwloc_cpuset_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology))) {
if ((errno = pthread_rad_detach(thread)))
return -1;
return 0;
@@ -83,7 +84,7 @@
if (!prepare_radset(topology, &radset, hwloc_set))
return -1;
- if (strict) {
+ if (policy & HWLOC_CPUBIND_STRICT) {
if ((errno = pthread_rad_bind(thread, radset, RAD_INSIST | RAD_WAIT)))
return -1;
} else {
@@ -96,11 +97,11 @@
}
static int
-hwloc_osf_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_osf_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t hwloc_set, int policy)
{
radset_t radset;
- if (hwloc_cpuset_isequal(hwloc_set, hwloc_get_system_obj(topology)->cpuset)) {
+ if (hwloc_cpuset_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology))) {
if (rad_detach_pid(pid))
return -1;
return 0;
@@ -109,7 +110,7 @@
if (!prepare_radset(topology, &radset, hwloc_set))
return -1;
- if (strict) {
+ if (policy & HWLOC_CPUBIND_STRICT) {
if (rad_bind_pid(pid, radset, RAD_INSIST | RAD_WAIT))
return -1;
} else {
@@ -122,23 +123,17 @@
}
static int
-hwloc_osf_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_osf_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
{
- return hwloc_osf_set_thread_cpubind(topology, pthread_self(), hwloc_set, strict);
+ return hwloc_osf_set_thread_cpubind(topology, pthread_self(), hwloc_set, policy);
}
static int
-hwloc_osf_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_osf_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
{
- return hwloc_osf_set_proc_cpubind(topology, getpid(), hwloc_set, strict);
+ return hwloc_osf_set_proc_cpubind(topology, getpid(), hwloc_set, policy);
}
-static int
-hwloc_osf_set_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
-{
- return hwloc_osf_set_thisproc_cpubind(topology, hwloc_set, strict);
-}
-
/* TODO: memory
*
* nmadvise(addr,len), nmmap()
@@ -175,7 +170,7 @@
.nattr_flags = 0,
};
- for (radid = 0; radid < nbnodes; radid++) {
+ for (radid = 0; radid < (radid_t) nbnodes; radid++) {
rademptyset(radset);
radaddset(radset, radid);
cpuemptyset(cpuset);
@@ -186,8 +181,14 @@
nodes[radid] = obj = hwloc_alloc_setup_object(HWLOC_OBJ_NODE, radid);
obj->cpuset = hwloc_cpuset_alloc();
- obj->attr->node.memory_kB = rad_get_physmem(radid) * getpagesize() / 1024;
- obj->attr->node.huge_page_free = 0;
+ obj->memory.local_memory = rad_get_physmem(radid) * getpagesize();
+ obj->memory.page_types_len = 2;
+ obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
+ memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
+ obj->memory.page_types[0].size = getpagesize();
+#ifdef HAVE__SC_LARGE_PAGESIZE
+ obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
+#endif
cursor = SET_CURSOR_INIT;
while((cpuid = cpu_foreach(cpuset, 0, &cursor)) != CPU_NONE)
@@ -196,10 +197,10 @@
hwloc_debug_1arg_cpuset("node %d has cpuset %s\n",
radid, obj->cpuset);
- hwloc_add_object(topology, obj);
+ hwloc_insert_object_by_cpuset(topology, obj);
nfound = 0;
- for (radid2 = 0; radid2 < nbnodes; radid2++)
+ for (radid2 = 0; radid2 < (radid_t) nbnodes; radid2++)
distances[radid][radid2] = RAD_DIST_REMOTE;
for (distance = RAD_DIST_LOCAL; distance < RAD_DIST_REMOTE; distance++) {
attr.nattr_distance = distance;
@@ -226,14 +227,13 @@
radsetdestroy(&radset);
cpusetdestroy(&cpuset);
- /* add PROC objects */
- hwloc_setup_proc_level(topology, hwloc_fallback_nbprocessors(), NULL);
+ /* add PU objects */
+ hwloc_setup_pu_level(topology, hwloc_fallback_nbprocessors(topology));
}
void
hwloc_set_osf_hooks(struct hwloc_topology *topology)
{
- topology->set_cpubind = hwloc_osf_set_cpubind;
topology->set_thread_cpubind = hwloc_osf_set_thread_cpubind;
topology->set_thisthread_cpubind = hwloc_osf_set_thisthread_cpubind;
topology->set_proc_cpubind = hwloc_osf_set_proc_cpubind;
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-solaris.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-solaris.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-solaris.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -10,19 +10,22 @@
#include <stdio.h>
#include <errno.h>
-#include <assert.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/processor.h>
#include <sys/procset.h>
+/* Note: get_cpubind not available on Solaris */
+/* TODO: try to use pset (restricted to super-user) to support cpusets with weigth > 1? */
static int
-hwloc_solaris_set_sth_cpubind(hwloc_topology_t topology, idtype_t idtype, id_t id, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_solaris_set_sth_cpubind(hwloc_topology_t topology, idtype_t idtype, id_t id, hwloc_const_cpuset_t hwloc_set, int policy __hwloc_attribute_unused)
{
unsigned target;
- if (hwloc_cpuset_isequal(hwloc_set, hwloc_get_system_obj(topology)->cpuset)) {
+ /* The resulting binding is always strict */
+
+ if (hwloc_cpuset_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology))) {
if (processor_bind(idtype, id, PBIND_NONE, NULL) != 0)
return -1;
return 0;
@@ -43,29 +46,23 @@
}
static int
-hwloc_solaris_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_solaris_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t hwloc_set, int policy)
{
- return hwloc_solaris_set_sth_cpubind(topology, P_PID, pid, hwloc_set, strict);
+ return hwloc_solaris_set_sth_cpubind(topology, P_PID, pid, hwloc_set, policy);
}
static int
-hwloc_solaris_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_solaris_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
{
- return hwloc_solaris_set_sth_cpubind(topology, P_PID, P_MYID, hwloc_set, strict);
+ return hwloc_solaris_set_sth_cpubind(topology, P_PID, P_MYID, hwloc_set, policy);
}
static int
-hwloc_solaris_set_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_solaris_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
{
- return hwloc_solaris_set_thisproc_cpubind(topology, hwloc_set, strict);
+ return hwloc_solaris_set_sth_cpubind(topology, P_LWPID, P_MYID, hwloc_set, policy);
}
-static int
-hwloc_solaris_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
-{
- return hwloc_solaris_set_sth_cpubind(topology, P_LWPID, P_MYID, hwloc_set, strict);
-}
-
/* TODO: thread, maybe not easy because of the historical n:m implementation */
#ifdef HAVE_LIBLGRP
@@ -87,6 +84,8 @@
processorid_t cpuids[n];
obj = hwloc_alloc_setup_object(HWLOC_OBJ_NODE, lgrp);
+ obj->nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_set(obj->nodeset, lgrp);
obj->cpuset = hwloc_cpuset_alloc();
glob_lgrps[(*curlgrp)++] = obj;
@@ -99,10 +98,16 @@
lgrp, obj->cpuset);
/* or LGRP_MEM_SZ_FREE */
- obj->attr->node.huge_page_free = 0; /* TODO */
hwloc_debug("node %ld has %lldkB\n", lgrp, mem_size/1024);
- obj->attr->node.memory_kB = mem_size / 1024;
- hwloc_add_object(topology, obj);
+ obj->memory.local_memory = mem_size;
+ obj->memory.page_types_len = 2;
+ obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
+ memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
+ obj->memory.page_types[0].size = getpagesize();
+#ifdef HAVE__SC_LARGE_PAGESIZE
+ obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
+#endif
+ hwloc_insert_object_by_cpuset(topology, obj);
}
n = lgrp_children(cookie, lgrp, NULL, 0);
@@ -126,12 +131,12 @@
lgrp_cookie_t cookie;
unsigned curlgrp = 0;
int nlgrps;
+ lgrp_id_t root;
if ((topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM))
cookie = lgrp_init(LGRP_VIEW_OS);
else
cookie = lgrp_init(LGRP_VIEW_CALLER);
- lgrp_id_t root;
if (cookie == LGRP_COOKIE_NONE)
{
hwloc_debug("lgrp_init failed: %s\n", strerror(errno));
@@ -158,7 +163,7 @@
#ifdef HAVE_LIBKSTAT
#include <kstat.h>
static void
-hwloc_look_kstat(struct hwloc_topology *topology, unsigned *nbprocs, hwloc_cpuset_t online_cpuset)
+hwloc_look_kstat(struct hwloc_topology *topology, unsigned *nbprocs)
{
kstat_ctl_t *kc = kstat_open();
kstat_t *ksp;
@@ -170,7 +175,6 @@
unsigned osphysids[HWLOC_NBMAXCPUS];
unsigned proc_coreids[HWLOC_NBMAXCPUS];
- unsigned proc_oscoreids[HWLOC_NBMAXCPUS];
unsigned oscoreids[HWLOC_NBMAXCPUS];
unsigned core_osphysids[HWLOC_NBMAXCPUS];
@@ -187,7 +191,6 @@
return;
}
- hwloc_cpuset_zero(online_cpuset);
for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next)
{
if (strncmp("cpu_info", ksp->ks_module, 8))
@@ -203,7 +206,6 @@
proc_physids[cpuid] = -1;
proc_osphysids[cpuid] = -1;
proc_coreids[cpuid] = -1;
- proc_oscoreids[cpuid] = -1;
if (kstat_read(kc, ksp, NULL) == -1)
{
@@ -224,13 +226,14 @@
}
procid_max++;
- hwloc_debug("cpu%d's state is %s\n", cpuid, stat->value.c);
+ hwloc_debug("cpu%u's state is %s\n", cpuid, stat->value.c);
if (strcmp(stat->value.c, "on-line"))
- /* not online, ignore for chip and core ids */
- continue;
+ /* not online */
+ hwloc_cpuset_clr(topology->levels[0][0]->online_cpuset, cpuid);
- hwloc_cpuset_set(online_cpuset, cpuid);
+ (*nbprocs)++;
+
if (look_chips) do {
/* Get Chip ID */
stat = (kstat_named_t *) kstat_data_lookup(ksp, "chip_id");
@@ -305,7 +308,6 @@
look_cores = 0;
continue;
}
- proc_oscoreids[cpuid] = coreid;
for (i = 0; i < numcores; i++)
if (coreid == oscoreids[i] && proc_osphysids[cpuid] == core_osphysids[i])
break;
@@ -323,8 +325,6 @@
* however. */
}
- *nbprocs = hwloc_cpuset_weight(online_cpuset);
-
if (look_chips)
hwloc_setup_level(procid_max, numsockets, osphysids, proc_physids, topology, HWLOC_OBJ_SOCKET);
@@ -339,23 +339,20 @@
void
hwloc_look_solaris(struct hwloc_topology *topology)
{
- hwloc_cpuset_t online_cpuset = hwloc_cpuset_alloc();
- unsigned nbprocs = hwloc_fallback_nbprocessors ();
+ unsigned nbprocs = hwloc_fallback_nbprocessors (topology);
#ifdef HAVE_LIBLGRP
hwloc_look_lgrp(topology);
#endif /* HAVE_LIBLGRP */
- hwloc_cpuset_fill(online_cpuset);
#ifdef HAVE_LIBKSTAT
- hwloc_look_kstat(topology, &nbprocs, online_cpuset);
+ nbprocs = 0;
+ hwloc_look_kstat(topology, &nbprocs);
#endif /* HAVE_LIBKSTAT */
- hwloc_setup_proc_level(topology, nbprocs, online_cpuset);
- free(online_cpuset);
+ hwloc_setup_pu_level(topology, nbprocs);
}
void
hwloc_set_solaris_hooks(struct hwloc_topology *topology)
{
- topology->set_cpubind = hwloc_solaris_set_cpubind;
topology->set_proc_cpubind = hwloc_solaris_set_proc_cpubind;
topology->set_thisproc_cpubind = hwloc_solaris_set_thisproc_cpubind;
topology->set_thisthread_cpubind = hwloc_solaris_set_thisthread_cpubind;
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-synthetic.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-synthetic.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-synthetic.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -7,6 +7,7 @@
#include <private/config.h>
#include <hwloc.h>
#include <private/private.h>
+#include <private/misc.h>
#include <private/debug.h>
#include <limits.h>
@@ -21,17 +22,16 @@
{
const char *pos, *next_pos;
unsigned long item, count;
- int i;
- int cache_depth = 0, misc_depth = 0;
+ unsigned i;
+ int cache_depth = 0, group_depth = 0;
int nb_machine_levels = 0, nb_node_levels = 0;
+ int nb_pu_levels = 0;
+ int nb_pu = 1;
assert(topology->backend_type == HWLOC_BACKEND_NONE);
- topology->backend_params.synthetic.type[0] = HWLOC_OBJ_SYSTEM;
- topology->backend_params.synthetic.id[0] = 0;
-
for (pos = description, count = 1; *pos; pos = next_pos) {
-#define HWLOC_OBJ_TYPE_UNKNOWN -1
+#define HWLOC_OBJ_TYPE_UNKNOWN ((unsigned) -1)
hwloc_obj_type_t type = HWLOC_OBJ_TYPE_UNKNOWN;
while (*pos == ' ')
@@ -41,20 +41,24 @@
break;
if (*pos < '0' || *pos > '9') {
- if (!hwloc_strncasecmp(pos, "machines", 2))
+ if (!hwloc_namecoloncmp(pos, "machines", 2)) {
type = HWLOC_OBJ_MACHINE;
- else if (!hwloc_strncasecmp(pos, "nodes", 1))
+ } else if (!hwloc_namecoloncmp(pos, "nodes", 1))
type = HWLOC_OBJ_NODE;
- else if (!hwloc_strncasecmp(pos, "sockets", 1))
+ else if (!hwloc_namecoloncmp(pos, "sockets", 1))
type = HWLOC_OBJ_SOCKET;
- else if (!hwloc_strncasecmp(pos, "cores", 2))
+ else if (!hwloc_namecoloncmp(pos, "cores", 2))
type = HWLOC_OBJ_CORE;
- else if (!hwloc_strncasecmp(pos, "caches", 2))
+ else if (!hwloc_namecoloncmp(pos, "caches", 2))
type = HWLOC_OBJ_CACHE;
- else if (!hwloc_strncasecmp(pos, "procs", 1))
- type = HWLOC_OBJ_PROC;
- else if (!hwloc_strncasecmp(pos, "misc", 2))
+ else if (!hwloc_namecoloncmp(pos, "pus", 1) || !hwloc_namecoloncmp(pos, "procs", 1) /* backward compatiblity with 0.9 */)
+ type = HWLOC_OBJ_PU;
+ else if (!hwloc_namecoloncmp(pos, "misc", 2))
type = HWLOC_OBJ_MISC;
+ else if (!hwloc_namecoloncmp(pos, "group", 2))
+ type = HWLOC_OBJ_GROUP;
+ else
+ fprintf(stderr, "Unknown object type `%s'\n", pos);
next_pos = strchr(pos, ':');
if (!next_pos) {
@@ -69,9 +73,21 @@
return -1;
}
- assert(count + 1 < HWLOC_SYNTHETIC_MAX_DEPTH);
- assert(item <= UINT_MAX);
+ if (count + 1 >= HWLOC_SYNTHETIC_MAX_DEPTH) {
+ fprintf(stderr,"Too many synthetic levels, max %d\n", HWLOC_SYNTHETIC_MAX_DEPTH);
+ return -1;
+ }
+ if (item > UINT_MAX) {
+ fprintf(stderr,"Too big arity, max %u\n", UINT_MAX);
+ return -1;
+ }
+ nb_pu *= item;
+ if (nb_pu > HWLOC_NBMAXCPUS) {
+ fprintf(stderr, "To many PUs, max %u\n", HWLOC_NBMAXCPUS);
+ return -1;
+ }
+
topology->backend_params.synthetic.arity[count-1] = (unsigned)item;
topology->backend_params.synthetic.type[count] = type;
topology->backend_params.synthetic.id[count] = 0;
@@ -83,42 +99,48 @@
return -1;
}
- for(i=0; i<count; i++) {
+ for(i=count-1; i>0; i--) {
hwloc_obj_type_t type;
type = topology->backend_params.synthetic.type[i];
if (type == HWLOC_OBJ_TYPE_UNKNOWN) {
- switch (count-1-i) {
- case 0: type = HWLOC_OBJ_PROC; break;
- case 1: type = HWLOC_OBJ_CORE; break;
- case 2: type = HWLOC_OBJ_CACHE; break;
- case 3: type = HWLOC_OBJ_SOCKET; break;
- case 4: type = HWLOC_OBJ_NODE; break;
- case 5: type = HWLOC_OBJ_MACHINE; break;
- default: type = HWLOC_OBJ_MISC; break;
+ if (i == count-1)
+ type = HWLOC_OBJ_PU;
+ else {
+ switch (topology->backend_params.synthetic.type[i+1]) {
+ case HWLOC_OBJ_PU: type = HWLOC_OBJ_CORE; break;
+ case HWLOC_OBJ_CORE: type = HWLOC_OBJ_CACHE; break;
+ case HWLOC_OBJ_CACHE: type = HWLOC_OBJ_SOCKET; break;
+ case HWLOC_OBJ_SOCKET: type = HWLOC_OBJ_NODE; break;
+ case HWLOC_OBJ_NODE:
+ case HWLOC_OBJ_GROUP: type = HWLOC_OBJ_GROUP; break;
+ case HWLOC_OBJ_MACHINE:
+ case HWLOC_OBJ_MISC: type = HWLOC_OBJ_MISC; break;
+ default:
+ assert(0);
+ }
}
topology->backend_params.synthetic.type[i] = type;
}
switch (type) {
+ case HWLOC_OBJ_PU:
+ if (nb_pu_levels) {
+ fprintf(stderr,"synthetic string can not have several PU levels\n");
+ return -1;
+ }
+ nb_pu_levels++;
+ break;
case HWLOC_OBJ_CACHE:
cache_depth++;
break;
- case HWLOC_OBJ_MISC:
- misc_depth++;
+ case HWLOC_OBJ_GROUP:
+ group_depth++;
break;
case HWLOC_OBJ_NODE:
- if (nb_node_levels) {
- fprintf(stderr,"synthetic string can not have several NUMA node levels\n");
- return -1;
- }
nb_node_levels++;
break;
case HWLOC_OBJ_MACHINE:
- if (nb_machine_levels) {
- fprintf(stderr,"synthetic string can not have several machine levels\n");
- return -1;
- }
nb_machine_levels++;
break;
default:
@@ -126,6 +148,27 @@
}
}
+ if (nb_pu_levels > 1) {
+ fprintf(stderr,"synthetic string can not have several PU levels\n");
+ return -1;
+ }
+ if (nb_node_levels > 1) {
+ fprintf(stderr,"synthetic string can not have several NUMA node levels\n");
+ return -1;
+ }
+ if (nb_machine_levels > 1) {
+ fprintf(stderr,"synthetic string can not have several machine levels\n");
+ return -1;
+ }
+
+ if (nb_machine_levels)
+ topology->backend_params.synthetic.type[0] = HWLOC_OBJ_SYSTEM;
+ else {
+ topology->backend_params.synthetic.type[0] = HWLOC_OBJ_MACHINE;
+ nb_machine_levels++;
+ }
+ topology->backend_params.synthetic.id[0] = 0;
+
if (cache_depth == 1)
/* if there is a single cache level, make it L2 */
cache_depth = 2;
@@ -133,18 +176,12 @@
for (i=0; i<count; i++) {
hwloc_obj_type_t type = topology->backend_params.synthetic.type[i];
- if (type == HWLOC_OBJ_MISC)
- topology->backend_params.synthetic.depth[i] = misc_depth--;
+ if (type == HWLOC_OBJ_GROUP)
+ topology->backend_params.synthetic.depth[i] = group_depth--;
else if (type == HWLOC_OBJ_CACHE)
topology->backend_params.synthetic.depth[i] = cache_depth--;
}
- /* last level must be PROC */
- if (topology->backend_params.synthetic.type[count-1] != HWLOC_OBJ_PROC) {
- fprintf(stderr,"synthetic string needs to have a number of processors\n");
- return -1;
- }
-
topology->backend_type = HWLOC_BACKEND_SYNTHETIC;
topology->backend_params.synthetic.arity[count-1] = 0;
topology->is_thissystem = 0;
@@ -170,10 +207,8 @@
static unsigned
hwloc__look_synthetic(struct hwloc_topology *topology,
int level, unsigned first_cpu,
- unsigned long *parent_memory_kB,
hwloc_cpuset_t parent_cpuset)
{
- unsigned long my_memory = 0, *pmemory = parent_memory_kB;
hwloc_obj_t obj;
unsigned i;
hwloc_obj_type_t type = topology->backend_params.synthetic.type[level];
@@ -182,13 +217,13 @@
switch (type) {
case HWLOC_OBJ_MISC:
break;
+ case HWLOC_OBJ_GROUP:
+ break;
case HWLOC_OBJ_SYSTEM:
/* Shouldn't happen. */
abort();
break;
case HWLOC_OBJ_MACHINE:
- /* Gather memory size from memory nodes for this machine */
- pmemory = &my_memory;
break;
case HWLOC_OBJ_NODE:
break;
@@ -198,47 +233,49 @@
break;
case HWLOC_OBJ_CORE:
break;
- case HWLOC_OBJ_PROC:
+ case HWLOC_OBJ_PU:
break;
}
obj = hwloc_alloc_setup_object(type, topology->backend_params.synthetic.id[level]++);
obj->cpuset = hwloc_cpuset_alloc();
- if (type == HWLOC_OBJ_PROC) {
- assert(topology->backend_params.synthetic.arity[level] == 0);
+ if (!topology->backend_params.synthetic.arity[level]) {
hwloc_cpuset_set(obj->cpuset, first_cpu++);
} else {
- assert(topology->backend_params.synthetic.arity[level] != 0);
for (i = 0; i < topology->backend_params.synthetic.arity[level]; i++)
- first_cpu = hwloc__look_synthetic(topology, level + 1, first_cpu, pmemory, obj->cpuset);
+ first_cpu = hwloc__look_synthetic(topology, level + 1, first_cpu, obj->cpuset);
}
- hwloc_add_object(topology, obj);
+ if (type == HWLOC_OBJ_NODE) {
+ obj->nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_set(obj->nodeset, obj->os_index);
+ }
- hwloc_cpuset_orset(parent_cpuset, obj->cpuset);
+ hwloc_insert_object_by_cpuset(topology, obj);
+ hwloc_cpuset_or(parent_cpuset, parent_cpuset, obj->cpuset);
+
/* post-hooks */
switch (type) {
case HWLOC_OBJ_MISC:
- obj->attr->misc.depth = topology->backend_params.synthetic.depth[level];
break;
+ case HWLOC_OBJ_GROUP:
+ obj->attr->group.depth = topology->backend_params.synthetic.depth[level];
+ break;
case HWLOC_OBJ_SYSTEM:
abort();
break;
case HWLOC_OBJ_MACHINE:
- obj->attr->machine.memory_kB = my_memory;
- obj->attr->machine.dmi_board_vendor = NULL;
- obj->attr->machine.dmi_board_name = NULL;
- obj->attr->machine.huge_page_size_kB = 0;
- obj->attr->machine.huge_page_free = 0;
- *parent_memory_kB += obj->attr->machine.memory_kB;
break;
case HWLOC_OBJ_NODE:
- /* 1GB in memory nodes. */
- obj->attr->node.memory_kB = 1024*1024;
- *parent_memory_kB += obj->attr->node.memory_kB;
- obj->attr->node.huge_page_free = 0;
+ /* 1GB in memory nodes, 256k 4k-pages. */
+ obj->memory.local_memory = 1024*1024*1024;
+ obj->memory.page_types_len = 1;
+ obj->memory.page_types = malloc(sizeof(*obj->memory.page_types));
+ memset(obj->memory.page_types, 0, sizeof(*obj->memory.page_types));
+ obj->memory.page_types[0].size = 4096;
+ obj->memory.page_types[0].count = 256*1024;
break;
case HWLOC_OBJ_SOCKET:
break;
@@ -246,14 +283,14 @@
obj->attr->cache.depth = topology->backend_params.synthetic.depth[level];
if (obj->attr->cache.depth == 1)
/* 32Kb in L1 */
- obj->attr->cache.memory_kB = 32*1024;
+ obj->attr->cache.size = 32*1024;
else
/* *4 at each level, starting from 1MB for L2 */
- obj->attr->cache.memory_kB = 256*1024 << (2*obj->attr->cache.depth);
+ obj->attr->cache.size = 256*1024 << (2*obj->attr->cache.depth);
break;
case HWLOC_OBJ_CORE:
break;
- case HWLOC_OBJ_PROC:
+ case HWLOC_OBJ_PU:
break;
}
@@ -266,8 +303,14 @@
hwloc_cpuset_t cpuset = hwloc_cpuset_alloc();
unsigned first_cpu = 0, i;
+ topology->support.discovery->pu = 1;
+
+ /* update first level type according to the synthetic type array */
+ topology->levels[0][0]->type = topology->backend_params.synthetic.type[0];
+
for (i = 0; i < topology->backend_params.synthetic.arity[0]; i++)
- first_cpu = hwloc__look_synthetic(topology, 1, first_cpu, &topology->levels[0][0]->attr->system.memory_kB, cpuset);
+ first_cpu = hwloc__look_synthetic(topology, 1, first_cpu, cpuset);
- free(cpuset);
+ hwloc_cpuset_free(cpuset);
}
+
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-windows.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-windows.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-windows.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -82,15 +82,16 @@
#ifndef HAVE_PROCESSOR_RELATIONSHIP
typedef struct _PROCESSOR_RELATIONSHIP {
BYTE Flags;
- ULONGLONG Reserved[2];
- GROUP_AFFINITY GroupMask;
+ BYTE Reserved[21];
+ WORD GroupCount;
+ GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY];
} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP;
#endif
#ifndef HAVE_NUMA_NODE_RELATIONSHIP
typedef struct _NUMA_NODE_RELATIONSHIP {
DWORD NodeNumber;
- ULONGLONG Reserved[2];
+ BYTE Reserved[20];
GROUP_AFFINITY GroupMask;
} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP;
#endif
@@ -102,7 +103,7 @@
WORD LineSize;
DWORD CacheSize;
PROCESSOR_CACHE_TYPE Type;
- ULONGLONG Reserved[2];
+ BYTE Reserved[20];
GROUP_AFFINITY GroupMask;
} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP;
#endif
@@ -111,8 +112,8 @@
typedef struct _PROCESSOR_GROUP_INFO {
BYTE MaximumProcessorCount;
BYTE ActiveProcessorCount;
+ BYTE Reserved[38];
KAFFINITY ActiveProcessorMask;
- ULONGLONG Reserved[4];
} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO;
#endif
@@ -140,10 +141,13 @@
} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;
#endif
+/* TODO: SetThreadIdealProcessor */
+
static int
-hwloc_win_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t thread, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_win_set_thread_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_thread_t thread, hwloc_const_cpuset_t hwloc_set, int policy __hwloc_attribute_unused)
{
- /* TODO: groups */
+ /* TODO: groups SetThreadGroupAffinity */
+ /* The resulting binding is always strict */
DWORD mask = hwloc_cpuset_to_ulong(hwloc_set);
if (!SetThreadAffinityMask(thread, mask))
return -1;
@@ -151,15 +155,16 @@
}
static int
-hwloc_win_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_win_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
{
- return hwloc_win_set_thread_cpubind(topology, GetCurrentThread(), hwloc_set, strict);
+ return hwloc_win_set_thread_cpubind(topology, GetCurrentThread(), hwloc_set, policy);
}
static int
-hwloc_win_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t proc, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_win_set_proc_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_pid_t proc, hwloc_const_cpuset_t hwloc_set, int policy __hwloc_attribute_unused)
{
/* TODO: groups */
+ /* The resulting binding is always strict */
DWORD mask = hwloc_cpuset_to_ulong(hwloc_set);
if (!SetProcessAffinityMask(proc, mask))
return -1;
@@ -167,23 +172,36 @@
}
static int
-hwloc_win_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_win_get_proc_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_pid_t proc, hwloc_cpuset_t hwloc_set, int policy __hwloc_attribute_unused)
{
- return hwloc_win_set_proc_cpubind(topology, GetCurrentProcess(), hwloc_set, strict);
+ DWORD proc_mask, sys_mask;
+ /* TODO: groups */
+ if (!GetProcessAffinityMask(proc, &proc_mask, &sys_mask))
+ return -1;
+ hwloc_cpuset_from_ulong(hwloc_set, proc_mask);
+ return 0;
}
static int
-hwloc_win_set_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_set, int strict)
+hwloc_win_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_cpuset_t hwloc_set, int policy)
{
- return hwloc_win_set_thisproc_cpubind(topology, hwloc_set, strict);
+ return hwloc_win_set_proc_cpubind(topology, GetCurrentProcess(), hwloc_set, policy);
}
+static int
+hwloc_win_get_thisproc_cpubind(hwloc_topology_t topology, hwloc_cpuset_t hwloc_cpuset, int policy)
+{
+ return hwloc_win_get_proc_cpubind(topology, GetCurrentProcess(), hwloc_cpuset, policy);
+}
+
void
hwloc_look_windows(struct hwloc_topology *topology)
{
BOOL WINAPI (*GetLogicalProcessorInformationProc)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer, PDWORD ReturnLength);
BOOL WINAPI (*GetLogicalProcessorInformationExProc)(LOGICAL_PROCESSOR_RELATIONSHIP relationship, PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer, PDWORD ReturnLength);
BOOL WINAPI (*GetNumaAvailableMemoryNodeProc)(UCHAR Node, PULONGLONG AvailableBytes);
+ BOOL WINAPI (*GetNumaAvailableMemoryNodeExProc)(USHORT Node, PULONGLONG AvailableBytes);
+
DWORD length;
HMODULE kernel32;
@@ -192,9 +210,16 @@
if (kernel32) {
GetLogicalProcessorInformationProc = GetProcAddress(kernel32, "GetLogicalProcessorInformation");
GetNumaAvailableMemoryNodeProc = GetProcAddress(kernel32, "GetNumaAvailableMemoryNode");
+ GetNumaAvailableMemoryNodeExProc = GetProcAddress(kernel32, "GetNumaAvailableMemoryNodeEx");
+ GetLogicalProcessorInformationExProc = GetProcAddress(kernel32, "GetLogicalProcessorInformationEx");
- if (GetLogicalProcessorInformationProc) {
+ if (!GetLogicalProcessorInformationExProc && GetLogicalProcessorInformationProc) {
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION procInfo;
+ unsigned id;
+ unsigned i;
+ struct hwloc_obj *obj;
+ hwloc_obj_type_t type;
+
length = 0;
procInfo = NULL;
@@ -203,15 +228,9 @@
break;
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
return;
- free(procInfo);
- procInfo = malloc(length);
+ procInfo = realloc(procInfo, length);
}
- unsigned id;
- int i;
- struct hwloc_obj *obj;
- hwloc_obj_type_t type;
-
for (i = 0; i < length / sizeof(*procInfo); i++) {
/* Ignore non-data caches */
@@ -237,49 +256,54 @@
break;
case RelationGroup:
default:
- type = HWLOC_OBJ_MISC;
+ type = HWLOC_OBJ_GROUP;
break;
}
obj = hwloc_alloc_setup_object(type, id);
obj->cpuset = hwloc_cpuset_alloc();
- hwloc_debug("%s#%d mask %lx\n", hwloc_obj_type_string(type), id, procInfo[i].ProcessorMask);
+ hwloc_debug("%s#%u mask %lx\n", hwloc_obj_type_string(type), id, procInfo[i].ProcessorMask);
hwloc_cpuset_from_ulong(obj->cpuset, procInfo[i].ProcessorMask);
switch (type) {
case HWLOC_OBJ_NODE:
{
ULONGLONG avail;
- if (GetNumaAvailableMemoryNodeProc && GetNumaAvailableMemoryNodeProc(id, &avail))
- obj->attr->node.memory_kB = avail >> 10;
- else
- obj->attr->node.memory_kB = 0;
- obj->attr->node.huge_page_free = 0; /* TODO */
+ obj->nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_set(obj->nodeset, id);
+ if ((GetNumaAvailableMemoryNodeExProc && GetNumaAvailableMemoryNodeExProc(id, &avail))
+ || (GetNumaAvailableMemoryNodeProc && GetNumaAvailableMemoryNodeProc(id, &avail)))
+ obj->memory.local_memory = avail;
+ obj->memory.page_types_len = 1;
+ obj->memory.page_types = malloc(sizeof(*obj->memory.page_types));
+ memset(obj->memory.page_types, 0, sizeof(*obj->memory.page_types));
+#ifdef HAVE__SC_LARGE_PAGESIZE
+ obj->memory.page_types[0].size = sysconf(_SC_LARGE_PAGESIZE);
+#endif
break;
}
case HWLOC_OBJ_CACHE:
- obj->attr->cache.memory_kB = procInfo[i].Cache.Size >> 10;
+ obj->attr->cache.size = procInfo[i].Cache.Size;
obj->attr->cache.depth = procInfo[i].Cache.Level;
break;
- case HWLOC_OBJ_MISC:
- obj->attr->misc.depth = procInfo[i].Relationship == RelationGroup;
+ case HWLOC_OBJ_GROUP:
+ obj->attr->group.depth = procInfo[i].Relationship == RelationGroup;
break;
default:
break;
}
- hwloc_add_object(topology, obj);
+ hwloc_insert_object_by_cpuset(topology, obj);
}
free(procInfo);
}
- GetLogicalProcessorInformationExProc = GetProcAddress(kernel32, "GetLogicalProcessorInformationEx");
-
- /* Disabled for now as it wasn't tested at all. */
- if (0 && GetLogicalProcessorInformationExProc) {
+ if (GetLogicalProcessorInformationExProc) {
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX procInfoTotal, procInfo;
- fprintf(stderr,"Note: GetLogicalProcessorInformationEx was never tested yet!\n");
+ unsigned id;
+ struct hwloc_obj *obj;
+ hwloc_obj_type_t type;
length = 0;
procInfoTotal = NULL;
@@ -289,19 +313,14 @@
break;
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
return;
- free(procInfoTotal);
- procInfo = malloc(length);
+ procInfoTotal = realloc(procInfoTotal, length);
}
- signed id;
- struct hwloc_obj *obj;
- hwloc_obj_type_t type;
- KAFFINITY mask;
- WORD group;
-
for (procInfo = procInfoTotal;
(void*) procInfo < (void*) ((unsigned long) procInfoTotal + length);
procInfo = (void*) ((unsigned long) procInfo + procInfo->Size)) {
+ unsigned num, i;
+ GROUP_AFFINITY *GroupMask;
/* Ignore non-data caches */
if (procInfo->Relationship == RelationCache &&
@@ -313,34 +332,36 @@
switch (procInfo->Relationship) {
case RelationNumaNode:
type = HWLOC_OBJ_NODE;
- mask = procInfo->NumaNode.GroupMask.Mask;
- group = procInfo->NumaNode.GroupMask.Group;
+ num = 1;
+ GroupMask = &procInfo->NumaNode.GroupMask;
id = procInfo->NumaNode.NodeNumber;
break;
case RelationProcessorPackage:
type = HWLOC_OBJ_SOCKET;
- mask = procInfo->Processor.GroupMask.Mask;
- group = procInfo->Processor.GroupMask.Group;
+ num = procInfo->Processor.GroupCount;
+ GroupMask = procInfo->Processor.GroupMask;
break;
case RelationCache:
type = HWLOC_OBJ_CACHE;
- mask = procInfo->Cache.GroupMask.Mask;
- group = procInfo->Cache.GroupMask.Group;
+ num = 1;
+ GroupMask = &procInfo->Cache.GroupMask;
break;
case RelationProcessorCore:
type = HWLOC_OBJ_CORE;
- mask = procInfo->Processor.GroupMask.Mask;
- group = procInfo->Processor.GroupMask.Group;
+ num = procInfo->Processor.GroupCount;
+ GroupMask = procInfo->Processor.GroupMask;
break;
case RelationGroup:
/* So strange an interface... */
for (id = 0; id < procInfo->Group.ActiveGroupCount; id++) {
- obj = hwloc_alloc_setup_object(HWLOC_OBJ_MISC, id);
+ KAFFINITY mask;
+ obj = hwloc_alloc_setup_object(HWLOC_OBJ_GROUP, id);
obj->cpuset = hwloc_cpuset_alloc();
mask = procInfo->Group.GroupInfo[id].ActiveProcessorMask;
- hwloc_debug("group %d mask %lx\n", id, mask);
+ hwloc_debug("group %u %d cpus mask %lx\n", id,
+ procInfo->Group.GroupInfo[id].ActiveProcessorCount, mask);
hwloc_cpuset_from_ith_ulong(obj->cpuset, id, mask);
- hwloc_add_object(topology, obj);
+ hwloc_insert_object_by_cpuset(topology, obj);
}
continue;
default:
@@ -350,38 +371,53 @@
obj = hwloc_alloc_setup_object(type, id);
obj->cpuset = hwloc_cpuset_alloc();
- hwloc_debug("%s#%d mask %d:%lx\n", hwloc_obj_type_string(type), id, group, mask);
- hwloc_cpuset_from_ith_ulong(obj->cpuset, group, mask);
+ for (i = 0; i < num; i++) {
+ hwloc_debug("%s#%u %d: mask %d:%lx\n", hwloc_obj_type_string(type), id, i, GroupMask[i].Group, GroupMask[i].Mask);
+ hwloc_cpuset_from_ith_ulong(obj->cpuset, GroupMask[i].Group, GroupMask[i].Mask);
+ }
switch (type) {
case HWLOC_OBJ_NODE:
- obj->attr->node.memory_kB = 0; /* TODO GetNumaAvailableMemoryNodeEx */
- obj->attr->node.huge_page_free = 0; /* TODO */
- break;
+ {
+ ULONGLONG avail;
+ obj->nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_set(obj->nodeset, id);
+ if ((GetNumaAvailableMemoryNodeExProc && GetNumaAvailableMemoryNodeExProc(id, &avail))
+ || (GetNumaAvailableMemoryNodeProc && GetNumaAvailableMemoryNodeProc(id, &avail)))
+ obj->memory.local_memory = avail;
+ obj->memory.page_types_len = 1;
+ obj->memory.page_types = malloc(sizeof(*obj->memory.page_types));
+ memset(obj->memory.page_types, 0, sizeof(*obj->memory.page_types));
+#ifdef HAVE__SC_LARGE_PAGESIZE
+ obj->memory.page_types[0].size = sysconf(_SC_LARGE_PAGESIZE);
+#endif
+ break;
+ }
case HWLOC_OBJ_CACHE:
- obj->attr->cache.memory_kB = procInfo->Cache.CacheSize >> 10;
+ obj->attr->cache.size = procInfo->Cache.CacheSize;
obj->attr->cache.depth = procInfo->Cache.Level;
break;
default:
break;
}
- hwloc_add_object(topology, obj);
+ hwloc_insert_object_by_cpuset(topology, obj);
}
free(procInfoTotal);
}
}
- /* add PROC objects */
- hwloc_setup_proc_level(topology, hwloc_fallback_nbprocessors(), NULL);
+ /* add PU objects */
+ hwloc_setup_pu_level(topology, hwloc_fallback_nbprocessors(topology));
}
void
hwloc_set_windows_hooks(struct hwloc_topology *topology)
{
- topology->set_cpubind = hwloc_win_set_cpubind;
topology->set_proc_cpubind = hwloc_win_set_proc_cpubind;
+ topology->get_proc_cpubind = hwloc_win_get_proc_cpubind;
topology->set_thread_cpubind = hwloc_win_set_thread_cpubind;
topology->set_thisproc_cpubind = hwloc_win_set_thisproc_cpubind;
+ topology->get_thisproc_cpubind = hwloc_win_get_thisproc_cpubind;
topology->set_thisthread_cpubind = hwloc_win_set_thisthread_cpubind;
}
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-x86.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-x86.c (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-x86.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,427 @@
+/*
+ * Copyright © 2010 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2010 Cisco Systems, Inc. All rights reserved.
+ *
+ * See COPYING in top-level directory.
+ */
+
+#include <private/config.h>
+#include <hwloc.h>
+#include <private/private.h>
+#include <private/debug.h>
+#include <private/cpuid.h>
+#include <private/misc.h>
+
+struct cacheinfo {
+ unsigned type;
+ unsigned level;
+ unsigned nbthreads_sharing;
+
+ unsigned linesize;
+ unsigned linepart;
+ unsigned ways;
+ unsigned sets;
+ unsigned size;
+};
+
+struct procinfo {
+ unsigned present;
+ unsigned apicid;
+ unsigned max_log_proc;
+ unsigned max_nbcores;
+ unsigned max_nbthreads;
+ unsigned socketid;
+ unsigned logprocid;
+ unsigned threadid;
+ unsigned coreid;
+ unsigned numcaches;
+ struct cacheinfo *cache;
+};
+
+enum cpuid_type {
+ intel,
+ amd,
+ unknown
+};
+
+static void fill_amd_cache(struct procinfo *infos, unsigned level, unsigned cpuid)
+{
+ struct cacheinfo *cache;
+ unsigned cachenum;
+ unsigned size = 0;
+
+ cachenum = infos->numcaches++;
+ infos->cache = realloc(infos->cache, infos->numcaches*sizeof(*infos->cache));
+ cache = &infos->cache[cachenum];
+
+ if (level == 1)
+ size = ((cpuid >> 24)) << 10;
+ else if (level == 2)
+ size = ((cpuid >> 16)) << 10;
+ else if (level == 3)
+ size = ((cpuid >> 18)) << 19;
+ if (!size)
+ return;
+
+ cache->type = 1;
+ cache->level = level;
+ if (level <= 2)
+ cache->nbthreads_sharing = 1;
+ else
+ cache->nbthreads_sharing = infos->max_log_proc;
+ cache->linesize = cpuid & 0xff;
+ cache->linepart = 0;
+ if (level == 1)
+ cache->ways = (cpuid >> 16) & 0xff;
+ else {
+ static const unsigned ways_tab[] = { 0, 1, 2, 0, 4, 0, 8, 0, 16, 0, 32, 48, 64, 96, 128, -1 };
+ unsigned ways = (cpuid >> 12) & 0xf;
+ cache->ways = ways_tab[ways];
+ }
+ cache->size = size;
+ cache->sets = 0;
+
+ hwloc_debug("cache L%u t%u linesize %u ways %u size %uKB\n", cache->level, cache->nbthreads_sharing, cache->linesize, cache->ways, cache->size >> 10);
+}
+
+/* Fetch information from the processor itself thanks to cpuid and store it in
+ * infos for summarize to analyze them globally */
+static void look_proc(struct procinfo *infos, unsigned highest_cpuid, unsigned highest_ext_cpuid, enum cpuid_type cpuid_type)
+{
+ unsigned eax, ebx, ecx = 0, edx;
+ unsigned cachenum;
+ struct cacheinfo *cache;
+
+ infos->present = 1;
+
+ eax = 0x01;
+ hwloc_cpuid(&eax, &ebx, &ecx, &edx);
+ infos->apicid = ebx >> 24;
+ if (edx & (1 << 28))
+ infos->max_log_proc = 1 << hwloc_flsl(((ebx >> 16) & 0xff) - 1);
+ else
+ infos->max_log_proc = 1;
+ hwloc_debug("APIC ID 0x%02x max_log_proc %u\n", infos->apicid, infos->max_log_proc);
+ infos->socketid = infos->apicid / infos->max_log_proc;
+ infos->logprocid = infos->apicid % infos->max_log_proc;
+ infos->coreid = (unsigned) -1;
+ infos->threadid = (unsigned) -1;
+ hwloc_debug("phys %u thread %u\n", infos->socketid, infos->logprocid);
+
+ /* Intel doesn't actually provide 0x80000008 information */
+ if (cpuid_type != intel && highest_ext_cpuid >= 0x80000008) {
+ unsigned coreidsize;
+ eax = 0x80000008;
+ hwloc_cpuid(&eax, &ebx, &ecx, &edx);
+ coreidsize = (ecx >> 12) & 0xf;
+ hwloc_debug("core ID size: %u\n", coreidsize);
+ if (!coreidsize) {
+ infos->max_nbcores = (ecx & 0xff) + 1;
+ } else
+ infos->max_nbcores = 1 << coreidsize;
+ hwloc_debug("Thus max # of cores: %u\n", infos->max_nbcores);
+ /* Still no multithreaded AMD */
+ infos->max_nbthreads = 1 ;
+ hwloc_debug("and max # of threads: %u\n", infos->max_nbthreads);
+ infos->threadid = infos->logprocid % infos->max_nbthreads;
+ infos->coreid = infos->logprocid / infos->max_nbthreads;
+ hwloc_debug("this is thread %u of core %u\n", infos->threadid, infos->coreid);
+ }
+
+ infos->numcaches = 0;
+ infos->cache = NULL;
+
+ /* Intel doesn't actually provide 0x80000005 information */
+ if (cpuid_type != intel && highest_ext_cpuid >= 0x80000005) {
+ eax = 0x80000005;
+ hwloc_cpuid(&eax, &ebx, &ecx, &edx);
+ fill_amd_cache(infos, 1, ecx);
+ }
+
+ /* Intel doesn't actually provide 0x80000006 information */
+ if (cpuid_type != intel && highest_ext_cpuid >= 0x80000006) {
+ eax = 0x80000006;
+ hwloc_cpuid(&eax, &ebx, &ecx, &edx);
+ fill_amd_cache(infos, 2, ecx);
+ fill_amd_cache(infos, 3, edx);
+ }
+
+ /* AMD doesn't actually provide 0x80000008 information */
+ if (cpuid_type != amd && highest_cpuid >= 0x04) {
+ cachenum = 0;
+ for (cachenum = 0; ; cachenum++) {
+ unsigned type;
+ eax = 0x04;
+ ecx = cachenum;
+ hwloc_cpuid(&eax, &ebx, &ecx, &edx);
+
+ type = eax & 0x1f;
+
+ hwloc_debug("cache %u type %u\n", cachenum, type);
+
+ if (type == 0)
+ break;
+ if (type == 2)
+ /* Instruction cache */
+ continue;
+ infos->numcaches++;
+ }
+
+ cache = infos->cache = malloc(infos->numcaches * sizeof(*infos->cache));
+
+ for (cachenum = 0; ; cachenum++) {
+ unsigned linesize, linepart, ways, sets;
+ unsigned type;
+ eax = 0x04;
+ ecx = cachenum;
+ hwloc_cpuid(&eax, &ebx, &ecx, &edx);
+
+ type = eax & 0x1f;
+
+ if (type == 0)
+ break;
+ if (type == 2)
+ /* Instruction cache */
+ continue;
+
+ cache->type = type;
+
+ cache->level = (eax >> 5) & 0x7;
+ cache->nbthreads_sharing = ((eax >> 14) & 0xfff) + 1;
+ infos->max_nbcores = ((eax >> 26) & 0x3f) + 1;
+
+ cache->linesize = linesize = (ebx & 0xfff) + 1;
+ cache->linepart = linepart = ((ebx >> 12) & 0x3ff) + 1;
+ cache->ways = ways = ((ebx >> 22) & 0x3ff) + 1;
+ cache->sets = sets = ecx + 1;
+ cache->size = linesize * linepart * ways * sets;
+
+ hwloc_debug("cache %u type %u L%u t%u c%u linesize %u linepart %u ways %u sets %u, size %uKB\n", cachenum, cache->type, cache->level, cache->nbthreads_sharing, infos->max_nbcores, linesize, linepart, ways, sets, cache->size >> 10);
+ infos->max_nbthreads = infos->max_log_proc / infos->max_nbcores;
+ hwloc_debug("thus %u threads\n", infos->max_nbthreads);
+ infos->threadid = infos->logprocid % infos->max_nbthreads;
+ infos->coreid = infos->logprocid / infos->max_nbthreads;
+ hwloc_debug("this is thread %u of core %u\n", infos->threadid, infos->coreid);
+
+ cache++;
+ }
+ }
+}
+
+/* Analyse information stored in infos, and build topology levels accordingly */
+static void summarize(hwloc_topology_t topology, struct procinfo *infos, unsigned nbprocs)
+{
+ hwloc_cpuset_t complete_cpuset = hwloc_cpuset_alloc();
+ unsigned i, j;
+
+ for (i = 0; i < nbprocs; i++)
+ if (infos[i].present)
+ hwloc_cpuset_set(complete_cpuset, i);
+
+ /* Look for sockets */
+ {
+ hwloc_cpuset_t sockets_cpuset = hwloc_cpuset_dup(complete_cpuset);
+ hwloc_cpuset_t socket_cpuset;
+ hwloc_obj_t socket;
+
+ while ((i = hwloc_cpuset_first(sockets_cpuset)) != (unsigned) -1) {
+ unsigned socketid = infos[i].socketid;
+
+ socket_cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_zero(socket_cpuset);
+ for (j = i; j < nbprocs; j++) {
+ if (infos[j].socketid == socketid) {
+ hwloc_cpuset_set(socket_cpuset, j);
+ hwloc_cpuset_clr(sockets_cpuset, j);
+ }
+ }
+ socket = hwloc_alloc_setup_object(HWLOC_OBJ_SOCKET, socketid);
+ socket->cpuset = socket_cpuset;
+ hwloc_debug_1arg_cpuset("os socket %u has cpuset %s\n",
+ socketid, socket_cpuset);
+ hwloc_insert_object_by_cpuset(topology, socket);
+ }
+ hwloc_cpuset_free(sockets_cpuset);
+ }
+
+ /* Look for cores */
+ {
+ hwloc_cpuset_t cores_cpuset = hwloc_cpuset_dup(complete_cpuset);
+ hwloc_cpuset_t core_cpuset;
+ hwloc_obj_t core;
+
+ while ((i = hwloc_cpuset_first(cores_cpuset)) != (unsigned) -1) {
+ unsigned socketid = infos[i].socketid;
+ unsigned coreid = infos[i].coreid;
+
+ if (coreid == (unsigned) -1) {
+ hwloc_cpuset_clr(cores_cpuset, i);
+ continue;
+ }
+
+ core_cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_zero(core_cpuset);
+ for (j = i; j < nbprocs; j++) {
+ if (infos[j].coreid == (unsigned) -1) {
+ hwloc_cpuset_clr(cores_cpuset, j);
+ continue;
+ }
+
+ if (infos[j].socketid == socketid && infos[j].coreid == coreid) {
+ hwloc_cpuset_set(core_cpuset, j);
+ hwloc_cpuset_clr(cores_cpuset, j);
+ }
+ }
+ core = hwloc_alloc_setup_object(HWLOC_OBJ_CORE, coreid);
+ core->cpuset = core_cpuset;
+ hwloc_debug_1arg_cpuset("os core %u has cpuset %s\n",
+ coreid, core_cpuset);
+ hwloc_insert_object_by_cpuset(topology, core);
+ }
+ hwloc_cpuset_free(cores_cpuset);
+ }
+
+ /* Look for caches */
+ /* First find max level */
+ unsigned level = 0, l;
+ for (i = 0; i < nbprocs; i++)
+ for (j = 0; j < infos[i].numcaches; j++)
+ if (infos[i].cache[j].level > level)
+ level = infos[i].cache[j].level;
+
+ while (level > 0) {
+ /* Look for caches at level level */
+ {
+ hwloc_cpuset_t caches_cpuset = hwloc_cpuset_dup(complete_cpuset);
+ hwloc_cpuset_t cache_cpuset;
+ hwloc_obj_t cache;
+
+ while ((i = hwloc_cpuset_first(caches_cpuset)) != (unsigned) -1) {
+ unsigned socketid = infos[i].socketid;
+
+ for (l = 0; l < infos[i].numcaches; l++) {
+ if (infos[i].cache[l].level == level)
+ break;
+ }
+ if (l == infos[i].numcaches) {
+ /* no cache Llevel in i, odd */
+ hwloc_cpuset_clr(caches_cpuset, i);
+ continue;
+ }
+
+ {
+ unsigned cacheid = infos[i].apicid / infos[i].cache[l].nbthreads_sharing;
+
+ cache_cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_zero(cache_cpuset);
+ for (j = i; j < nbprocs; j++) {
+ unsigned l2;
+ for (l2 = 0; l2 < infos[j].numcaches; l2++) {
+ if (infos[j].cache[l2].level == level)
+ break;
+ }
+ if (l2 == infos[j].numcaches) {
+ /* no cache Llevel in j, odd */
+ hwloc_cpuset_clr(caches_cpuset, j);
+ continue;
+ }
+ if (infos[j].socketid == socketid && infos[j].apicid / infos[j].cache[l2].nbthreads_sharing == cacheid) {
+ hwloc_cpuset_set(cache_cpuset, j);
+ hwloc_cpuset_clr(caches_cpuset, j);
+ }
+ }
+ cache = hwloc_alloc_setup_object(HWLOC_OBJ_CACHE, cacheid);
+ cache->attr->cache.depth = level;
+ cache->attr->cache.size = infos[i].cache[l].size;
+ cache->cpuset = cache_cpuset;
+ hwloc_debug_2args_cpuset("os L%u cache %u has cpuset %s\n",
+ level, cacheid, cache_cpuset);
+ hwloc_insert_object_by_cpuset(topology, cache);
+ }
+ }
+ hwloc_cpuset_free(caches_cpuset);
+ }
+ level--;
+ }
+
+ for (i = 0; i < nbprocs; i++)
+ free(infos[i].cache);
+}
+
+#define INTEL_EBX ('G' | ('e'<<8) | ('n'<<16) | ('u'<<24))
+#define INTEL_EDX ('i' | ('n'<<8) | ('e'<<16) | ('I'<<24))
+#define INTEL_ECX ('n' | ('t'<<8) | ('e'<<16) | ('l'<<24))
+
+#define AMD_EBX ('A' | ('u'<<8) | ('t'<<16) | ('h'<<24))
+#define AMD_EDX ('e' | ('n'<<8) | ('t'<<16) | ('i'<<24))
+#define AMD_ECX ('c' | ('A'<<8) | ('M'<<16) | ('D'<<24))
+
+void hwloc_look_x86(struct hwloc_topology *topology, unsigned nbprocs)
+{
+ /* This function must always be here, but it's ok if it's empty. */
+#if defined(HWLOC_HAVE_CPUID)
+ unsigned eax, ebx, ecx = 0, edx;
+ hwloc_cpuset_t orig_cpuset;
+ unsigned i;
+ unsigned highest_cpuid;
+ unsigned highest_ext_cpuid;
+ struct procinfo infos[nbprocs];
+ enum cpuid_type cpuid_type = unknown;
+
+ if (!hwloc_have_cpuid())
+ return;
+
+ eax = 0x00;
+ hwloc_cpuid(&eax, &ebx, &ecx, &edx);
+ highest_cpuid = eax;
+ if (ebx == INTEL_EBX && ecx == INTEL_ECX && edx == INTEL_EDX)
+ cpuid_type = intel;
+ if (ebx == AMD_EBX && ecx == AMD_ECX && edx == AMD_EDX)
+ cpuid_type = amd;
+
+ hwloc_debug("highest cpuid %x, cpuid type %u\n", highest_cpuid, cpuid_type);
+ if (highest_cpuid < 0x01)
+ return;
+
+ eax = 0x80000000;
+ hwloc_cpuid(&eax, &ebx, &ecx, &edx);
+ highest_ext_cpuid = eax;
+
+ hwloc_debug("highest extended cpuid %x\n", highest_ext_cpuid);
+
+ orig_cpuset = hwloc_cpuset_alloc();
+
+ if (topology->get_thisthread_cpubind && topology->set_thisthread_cpubind) {
+ if (!topology->get_thisthread_cpubind(topology, orig_cpuset, HWLOC_CPUBIND_STRICT)) {
+ hwloc_cpuset_t cpuset = hwloc_cpuset_alloc();
+ for (i = 0; i < nbprocs; i++) {
+ hwloc_cpuset_cpu(cpuset, i);
+ if (topology->set_thisthread_cpubind(topology, cpuset, HWLOC_CPUBIND_STRICT))
+ continue;
+ look_proc(&infos[i], highest_cpuid, highest_ext_cpuid, cpuid_type);
+ }
+ hwloc_cpuset_free(cpuset);
+ topology->set_thisthread_cpubind(topology, orig_cpuset, 0);
+ hwloc_cpuset_free(orig_cpuset);
+ summarize(topology, infos, nbprocs);
+ return;
+ }
+ }
+ if (topology->get_thisproc_cpubind && topology->set_thisproc_cpubind) {
+ if (!topology->get_thisproc_cpubind(topology, orig_cpuset, HWLOC_CPUBIND_STRICT)) {
+ hwloc_cpuset_t cpuset = hwloc_cpuset_alloc();
+ for (i = 0; i < nbprocs; i++) {
+ hwloc_cpuset_cpu(cpuset, i);
+ if (topology->set_thisproc_cpubind(topology, cpuset, HWLOC_CPUBIND_STRICT))
+ continue;
+ look_proc(&infos[i], highest_cpuid, highest_ext_cpuid, cpuid_type);
+ }
+ hwloc_cpuset_free(cpuset);
+ topology->set_thisproc_cpubind(topology, orig_cpuset, 0);
+ hwloc_cpuset_free(orig_cpuset);
+ summarize(topology, infos, nbprocs);
+ return;
+ }
+ }
+#endif
+}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-xml.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-xml.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology-xml.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,5 +1,6 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
@@ -8,12 +9,13 @@
#include <private/private.h>
#include <private/debug.h>
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <assert.h>
+#include <strings.h>
int
hwloc_backend_xml_init(struct hwloc_topology *topology, const char *xmlpath)
@@ -28,8 +30,6 @@
if (!doc)
return -1;
- /* TODO: warn if dtd is not hwloc.dtd? */
-
topology->backend_params.xml.doc = doc;
topology->is_thissystem = 0;
topology->backend_type = HWLOC_BACKEND_XML;
@@ -45,271 +45,498 @@
topology->backend_type = HWLOC_BACKEND_NONE;
}
+/******************************
+ ********* XML import *********
+ ******************************/
+
static void
-hwloc__process_root_attr(struct hwloc_topology *topology,
- const xmlChar *_name, const xmlChar *_value)
+hwloc__xml_import_topology_attr(struct hwloc_topology *topology __hwloc_attribute_unused,
+ const xmlChar *_name, const xmlChar *_value __hwloc_attribute_unused)
{
const char *name = (const char *) _name;
-/* unused for now const char *value = (const char *) _value; */
fprintf(stderr, "ignoring unknown root attribute %s\n", name);
}
static void
-hwloc__process_object_attr(struct hwloc_topology *topology, struct hwloc_obj *obj,
- const xmlChar *_name, const xmlChar *_value)
+hwloc__xml_import_pagetype_attr(struct hwloc_topology *topology __hwloc_attribute_unused, struct hwloc_obj_memory_page_type_s *page_type,
+ const xmlChar *_name, const xmlChar *_value)
{
const char *name = (const char *) _name;
const char *value = (const char *) _value;
+ if (!strcmp(name, "size"))
+ page_type->size = strtoul(value, NULL, 10);
+ else if (!strcmp(name, "count"))
+ page_type->count = strtoul(value, NULL, 10);
+
+ else
+ fprintf(stderr, "ignoring unknown pagetype attribute %s\n", name);
+}
+
+static void
+hwloc__xml_import_object_attr(struct hwloc_topology *topology __hwloc_attribute_unused, struct hwloc_obj *obj,
+ const xmlChar *_name, const xmlChar *_value)
+{
+ const char *name = (const char *) _name;
+ const char *value = (const char *) _value;
+
if (!strcmp(name, "type")) {
/* already handled */
return;
}
+ else if (!strcmp(name, "os_level"))
+ obj->os_level = strtoul(value, NULL, 10);
else if (!strcmp(name, "os_index"))
obj->os_index = strtoul(value, NULL, 10);
- else if (!strcmp(name, "cpuset"))
- obj->cpuset = hwloc_cpuset_from_string(value);
+ else if (!strcmp(name, "cpuset")) {
+ obj->cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(obj->cpuset, value);
+ } else if (!strcmp(name, "complete_cpuset")) {
+ obj->complete_cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(obj->complete_cpuset,value);
+ } else if (!strcmp(name, "online_cpuset")) {
+ obj->online_cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(obj->online_cpuset, value);
+ } else if (!strcmp(name, "allowed_cpuset")) {
+ obj->allowed_cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(obj->allowed_cpuset, value);
+ } else if (!strcmp(name, "nodeset")) {
+ obj->nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(obj->nodeset, value);
+ } else if (!strcmp(name, "complete_nodeset")) {
+ obj->complete_nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(obj->complete_nodeset, value);
+ } else if (!strcmp(name, "allowed_nodeset")) {
+ obj->allowed_nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(obj->allowed_nodeset, value);
+ } else if (!strcmp(name, "name"))
+ obj->name = strdup(value);
- else if (!strcmp(name, "memory_kB")) {
+ else if (!strcmp(name, "cache_size")) {
+ unsigned long long lvalue = strtoull(value, NULL, 10);
+ if (obj->type == HWLOC_OBJ_CACHE)
+ obj->attr->cache.size = lvalue;
+ else
+ fprintf(stderr, "ignoring cache_size attribute for non-cache object type\n");
+ }
+
+ else if (!strcmp(name, "local_memory"))
+ obj->memory.local_memory = strtoull(value, NULL, 10);
+
+ else if (!strcmp(name, "depth")) {
unsigned long lvalue = strtoul(value, NULL, 10);
switch (obj->type) {
case HWLOC_OBJ_CACHE:
- obj->attr->cache.memory_kB = lvalue;
+ obj->attr->cache.depth = lvalue;
break;
- case HWLOC_OBJ_NODE:
- obj->attr->node.memory_kB = lvalue;
+ case HWLOC_OBJ_GROUP:
+ obj->attr->group.depth = lvalue;
break;
- case HWLOC_OBJ_MACHINE:
- obj->attr->machine.memory_kB = lvalue;
- break;
- case HWLOC_OBJ_SYSTEM:
- obj->attr->system.memory_kB = lvalue;
- break;
default:
- fprintf(stderr, "ignoring memory_kB attribute for object type without memory\n");
+ fprintf(stderr, "ignoring depth attribute for object type without depth\n");
break;
}
}
- else if (!strcmp(name, "depth")) {
- unsigned long lvalue = strtoul(value, NULL, 10);
+ else if (!strcmp(name, "dmi_board_vendor")) {
switch (obj->type) {
- case HWLOC_OBJ_CACHE:
- obj->attr->cache.depth = lvalue;
+ case HWLOC_OBJ_MACHINE:
+ obj->attr->machine.dmi_board_vendor = strdup(value);
break;
- case HWLOC_OBJ_MISC:
- obj->attr->misc.depth = lvalue;
- break;
default:
- fprintf(stderr, "ignoring depth attribute for object type without depth\n");
+ fprintf(stderr, "ignoring dmi_board_vendor attribute for object type without DMI board\n");
break;
}
}
- else if (!strcmp(name, "huge_page_free")) {
- unsigned long lvalue = strtoul(value, NULL, 10);
+ else if (!strcmp(name, "dmi_board_name")) {
switch (obj->type) {
- case HWLOC_OBJ_NODE:
- obj->attr->node.huge_page_free = lvalue;
- break;
case HWLOC_OBJ_MACHINE:
- obj->attr->machine.huge_page_free = lvalue;
+ obj->attr->machine.dmi_board_name = strdup(value);
break;
- case HWLOC_OBJ_SYSTEM:
- obj->attr->system.huge_page_free = lvalue;
- break;
default:
- fprintf(stderr, "ignoring huge_page_free attribute for object type without huge pages\n");
+ fprintf(stderr, "ignoring dmi_board_name attribute for object type without DMI board\n");
break;
}
}
- else if (!strcmp(name, "huge_page_size_kB")) {
- unsigned long lvalue = strtoul(value, NULL, 10);
+
+
+ /*************************
+ * deprecated (from 0.9)
+ */
+ else if (!strcmp(name, "memory_kB")) {
+ unsigned long long lvalue = strtoull(value, NULL, 10);
switch (obj->type) {
+ case HWLOC_OBJ_CACHE:
+ obj->attr->cache.size = lvalue << 10;
+ break;
+ case HWLOC_OBJ_NODE:
case HWLOC_OBJ_MACHINE:
- obj->attr->machine.huge_page_size_kB = lvalue;
- break;
case HWLOC_OBJ_SYSTEM:
- obj->attr->system.huge_page_size_kB = strtoul(value, NULL, 10);
+ obj->memory.local_memory = lvalue << 10;
break;
default:
- fprintf(stderr, "ignoring huge_page_size_kB attribute for object type without huge pages\n");
+ fprintf(stderr, "ignoring memory_kB attribute for object type without memory\n");
break;
}
}
-
- else if (!strcmp(name, "dmi_board_vendor")) {
+ else if (!strcmp(name, "huge_page_size_kB")) {
+ unsigned long lvalue = strtoul(value, NULL, 10);
switch (obj->type) {
+ case HWLOC_OBJ_NODE:
case HWLOC_OBJ_MACHINE:
- obj->attr->machine.dmi_board_vendor = strdup(value);
- break;
case HWLOC_OBJ_SYSTEM:
- obj->attr->system.dmi_board_vendor = strdup(value);
+ if (!obj->memory.page_types) {
+ obj->memory.page_types = malloc(sizeof(*obj->memory.page_types));
+ obj->memory.page_types_len = 1;
+ }
+ obj->memory.page_types[0].size = lvalue << 10;
break;
default:
- fprintf(stderr, "ignoring dmi_board_vendor attribute for object type without DMI board\n");
+ fprintf(stderr, "ignoring huge_page_size_kB attribute for object type without huge pages\n");
break;
}
}
-
- else if (!strcmp(name, "dmi_board_name")) {
+ else if (!strcmp(name, "huge_page_free")) {
+ unsigned long lvalue = strtoul(value, NULL, 10);
switch (obj->type) {
+ case HWLOC_OBJ_NODE:
case HWLOC_OBJ_MACHINE:
- obj->attr->machine.dmi_board_name = strdup(value);
- break;
case HWLOC_OBJ_SYSTEM:
- obj->attr->system.dmi_board_name = strdup(value);
+ if (!obj->memory.page_types) {
+ obj->memory.page_types = malloc(sizeof(*obj->memory.page_types));
+ obj->memory.page_types_len = 1;
+ }
+ obj->memory.page_types[0].count = lvalue;
break;
default:
- fprintf(stderr, "ignoring dmi_board_name attribute for object type without DMI board\n");
+ fprintf(stderr, "ignoring huge_page_free attribute for object type without huge pages\n");
break;
}
}
+ /*
+ * end of deprecated (from 0.9)
+ *******************************/
+
+
else
fprintf(stderr, "ignoring unknown object attribute %s\n", name);
}
-static void
-hwloc__look_xml_attr(struct hwloc_topology *topology, struct hwloc_obj *obj,
- const xmlChar *attrname, xmlNode *node)
+static const xmlChar *
+hwloc__xml_import_attr_value(xmlAttr *attr)
{
+ xmlNode *subnode;
/* use the first valid attribute content */
- for (; node; node = node->next) {
- if (node->type == XML_TEXT_NODE) {
- if (node->content && node->content[0] != '\0' && node->content[0] != '\n') {
- if (obj)
- hwloc__process_object_attr(topology, obj, attrname, node->content);
- else
- hwloc__process_root_attr(topology, attrname, node->content);
- break;
- }
+ for (subnode = attr->children; subnode; subnode = subnode->next) {
+ if (subnode->type == XML_TEXT_NODE) {
+ if (subnode->content && subnode->content[0] != '\0' && subnode->content[0] != '\n')
+ return subnode->content;
} else {
- fprintf(stderr, "ignoring unexpected xml attr node type %u name %s\n", node->type, (const char*) node->name);
+ fprintf(stderr, "ignoring unexpected xml attr node type %u\n", subnode->type);
}
}
+ return NULL;
}
static void
-hwloc__look_xml_node(struct hwloc_topology *topology, xmlNode *node, int depth)
+hwloc__xml_import_pagetype_node(struct hwloc_topology *topology, struct hwloc_obj_memory_page_type_s *pagetype, xmlNode *node)
{
- for (; node; node = node->next) {
- if (node->type == XML_ELEMENT_NODE) {
- xmlAttr *attr = NULL;
- struct hwloc_obj *obj = NULL;
+ xmlAttr *attr = NULL;
- if (depth == 0) {
- /* root node should be in root class */
- if (strcmp((const char *) node->name, "root"))
- fprintf(stderr, "root node of class `%s' instead of `root'\n", (const char*) node->name);
+ for (attr = node->properties; attr; attr = attr->next) {
+ if (attr->type == XML_ATTRIBUTE_NODE) {
+ const xmlChar *value = hwloc__xml_import_attr_value(attr);
+ if (value)
+ hwloc__xml_import_pagetype_attr(topology, pagetype, attr->name, value);
+ else
+ fprintf(stderr, "ignoring unexpected xml pagetype attr name `%s' with no value\n", (const char*) attr->name);
+ } else {
+ fprintf(stderr, "ignoring unexpected xml pagetype attr type %u\n", attr->type);
+ }
+ }
+}
- /* no object yet */
+static void hwloc__xml_import_node(struct hwloc_topology *topology, struct hwloc_obj *parent, xmlNode *node, int depth);
- } else {
- /* object node should be in object class */
- if (strcmp((const char*) node->name, "object"))
- fprintf(stderr, "object node of class `%s' instead of `object'\n", (const char*) node->name);
+static void
+hwloc__xml_import_object_node(struct hwloc_topology *topology, struct hwloc_obj *parent, struct hwloc_obj *obj, xmlNode *node, int depth)
+{
+ xmlAttr *attr = NULL;
- if (depth > 1)
- obj = hwloc_alloc_setup_object(HWLOC_OBJ_TYPE_MAX, -1);
- else
- obj = topology->levels[0][0];
+ /* first determine the object type */
+ for (attr = node->properties; attr; attr = attr->next) {
+ if (attr->type == XML_ATTRIBUTE_NODE && !strcmp((const char*) attr->name, "type")) {
+ const xmlChar *value = hwloc__xml_import_attr_value(attr);
+ if (!value) {
+ fprintf(stderr, "ignoring xml object without type attr %s\n", (const char*) value);
+ return;
}
-
- /* first determine the object type */
- for (attr = node->properties; attr; attr = attr->next) {
- if (attr->type == XML_ATTRIBUTE_NODE) {
- xmlNode *node;
- for (node = attr->children; node; node = node->next) {
- if (node->type == XML_TEXT_NODE) {
- if (node->content && node->content[0] != '\0' && node->content[0] != '\n') {
- if (!strcmp((const char*) attr->name, "type")) {
- obj->type = hwloc_obj_type_of_string((const char*) node->content);
- if (obj->type == HWLOC_OBJ_TYPE_MAX)
- fprintf(stderr, "ignoring unknown object type %s\n", (const char*) node->content);
- else
- break;
- }
- }
- } else {
- fprintf(stderr, "ignoring unexpected xml attr node type %u name %s\n", node->type, (const char*) node->name);
- }
- }
- if (obj->type == HWLOC_OBJ_TYPE_MAX) {
- fprintf(stderr, "ignoring attributes of object without type\n");
- return;
- }
- } else {
- fprintf(stderr, "ignoring unexpected xml attr type %u\n", attr->type);
- }
+ obj->type = hwloc_obj_type_of_string((const char*) value);
+ if (obj->type == (hwloc_obj_type_t)-1) {
+ fprintf(stderr, "ignoring unknown object type %s\n", (const char*) value);
+ return;
}
+ break;
+ } else {
+ fprintf(stderr, "ignoring unexpected xml attr type %u\n", attr->type);
+ }
+ }
+ if (obj->type == HWLOC_OBJ_TYPE_MAX) {
+ fprintf(stderr, "ignoring object without type\n");
+ return;
+ }
- /* process attributes */
- for (attr = node->properties; attr; attr = attr->next) {
- if (attr->type == XML_ATTRIBUTE_NODE) {
- if (attr->children)
- hwloc__look_xml_attr(topology, obj, attr->name, attr->children);
- } else {
- fprintf(stderr, "ignoring unexpected xml attr type %u\n", attr->type);
- }
- }
+ /* process attributes now that the type is known */
+ for (attr = node->properties; attr; attr = attr->next) {
+ if (attr->type == XML_ATTRIBUTE_NODE) {
+ const xmlChar *value = hwloc__xml_import_attr_value(attr);
+ if (value)
+ hwloc__xml_import_object_attr(topology, obj, attr->name, value);
+ else
+ fprintf(stderr, "ignoring unexpected xml object attr name `%s' with no value\n", (const char*) attr->name);
+ } else {
+ fprintf(stderr, "ignoring unexpected xml object attr type %u\n", attr->type);
+ }
+ }
- if (depth == 0) {
- /* no object in xml doc root */
- assert (!obj);
+ if (depth > 0) { /* root object is already in place */
+ /* add object */
+ hwloc_insert_object_by_parent(topology, parent, obj);
+ }
- } else if (depth == 1) {
- /* system object is already there */
- if (obj->type != HWLOC_OBJ_SYSTEM) {
- fprintf(stderr, "enforcing System type in top level instead of %s\n",
- hwloc_obj_type_string(obj->type));
- obj->type = HWLOC_OBJ_SYSTEM;
- }
+ /* process children */
+ if (node->children)
+ hwloc__xml_import_node(topology, obj, node->children, depth+1);
+}
+
+static void
+hwloc__xml_import_node(struct hwloc_topology *topology, struct hwloc_obj *parent, xmlNode *node, int depth)
+{
+ for (; node; node = node->next) {
+ if (node->type == XML_ELEMENT_NODE) {
+ if (!strcmp((const char*) node->name, "object")) {
+ /* object attributes */
+ struct hwloc_obj *obj;
+ if (depth)
+ obj = hwloc_alloc_setup_object(HWLOC_OBJ_TYPE_MAX, -1);
+ else
+ obj = topology->levels[0][0];
+ hwloc__xml_import_object_node(topology, parent, obj, node, depth);
+
+ } else if (!strcmp((const char*) node->name, "page_type")) {
+ int idx = parent->memory.page_types_len;
+ parent->memory.page_types = realloc(parent->memory.page_types, (idx+1)*sizeof(*parent->memory.page_types));
+ hwloc__xml_import_pagetype_node(topology, &parent->memory.page_types[idx], node);
+ parent->memory.page_types_len = idx+1;
+
} else {
- /* add object */
- if (obj->type >= HWLOC_OBJ_TYPE_MAX) {
- fprintf(stderr, "ignoring object with invalid type %u\n", obj->type);
- free(obj);
- } else if (obj->type == HWLOC_OBJ_SYSTEM) {
- fprintf(stderr, "ignoring system object at invalid depth %d\n", depth);
- free(obj);
- } else {
- if (!hwloc_cpuset_isincluded(obj->cpuset, topology->levels[0][0]->cpuset)) {
- char *s1 = hwloc_cpuset_printf_value(obj->cpuset), *s2 = hwloc_cpuset_printf_value(topology->levels[0][0]->cpuset);
- fprintf(stderr, "ignoring object (cpuset %s) not covered by system (cpuset %s)\n", s1, s2);
- free(s1);
- free(s2);
- }
- else
- hwloc_add_object(topology, obj);
- }
+ /* unknown class */
+ fprintf(stderr, "ignoring unexpected node class `%s'\n", (const char*) node->name);
+ continue;
}
- /* process children */
- if (node->children)
- hwloc__look_xml_node(topology, node->children, depth+1);
-
} else if (node->type == XML_TEXT_NODE) {
if (node->content && node->content[0] != '\0' && node->content[0] != '\n')
- fprintf(stderr, "ignoring object text content %s\n", (const char*) node->content);
+ fprintf(stderr, "ignoring object text content %s\n", (const char*) node->content);
} else {
fprintf(stderr, "ignoring unexpected xml node type %u\n", node->type);
}
}
}
+static void
+hwloc__xml_import_topology_node(struct hwloc_topology *topology, xmlNode *node)
+{
+ xmlAttr *attr = NULL;
+
+ if (strcmp((const char *) node->name, "topology") && strcmp((const char *) node->name, "root")) {
+ /* root node should be in "topology" class (or "root" if importing from < 1.0) */
+ fprintf(stderr, "ignoring object of class `%s' not at the top the xml hierarchy\n", (const char *) node->name);
+ return;
+ }
+
+ /* process attributes */
+ for (attr = node->properties; attr; attr = attr->next) {
+ if (attr->type == XML_ATTRIBUTE_NODE) {
+ const xmlChar *value = hwloc__xml_import_attr_value(attr);
+ if (value)
+ hwloc__xml_import_topology_attr(topology, attr->name, value);
+ else
+ fprintf(stderr, "ignoring unexpected xml root attr name `%s' with no value\n", (const char*) attr->name);
+ } else {
+ fprintf(stderr, "ignoring unexpected xml root attr type %u\n", attr->type);
+ }
+ }
+
+ /* process children */
+ if (node->children)
+ hwloc__xml_import_node(topology, NULL, node->children, 0);
+}
+
void
hwloc_look_xml(struct hwloc_topology *topology)
{
xmlNode* root_node;
+ xmlDtd *dtd;
+ topology->support.discovery->pu = 1;
+
+ dtd = xmlGetIntSubset((xmlDoc*) topology->backend_params.xml.doc);
+ if (!dtd)
+ fprintf(stderr, "Loading XML topology without DTD\n");
+ else if (strcmp((char *) dtd->SystemID, "hwloc.dtd"))
+ fprintf(stderr, "Loading XML topology with wrong DTD SystemID (%s instead of %s)\n",
+ (char *) dtd->SystemID, "hwloc.dtd");
+
root_node = xmlDocGetRootElement((xmlDoc*) topology->backend_params.xml.doc);
- hwloc__look_xml_node(topology, root_node, 0);
+ hwloc__xml_import_topology_node(topology, root_node);
+ if (root_node->next)
+ fprintf(stderr, "ignoring non-first root nodes\n");
+
+ /* TODO: abort if we got an invalid topology or so */
}
-#endif /* HAVE_XML */
+/******************************
+ ********* XML export *********
+ ******************************/
+
+static void
+hwloc__xml_export_object (hwloc_topology_t topology, hwloc_obj_t obj, xmlNodePtr root_node)
+{
+ xmlNodePtr node = NULL, ptnode = NULL;
+ char *cpuset = NULL;
+ char tmp[255];
+ unsigned i;
+
+ /* xmlNewChild() creates a new node, which is "attached" as child node
+ * of root_node node. */
+ node = xmlNewChild(root_node, NULL, BAD_CAST "object", NULL);
+ xmlNewProp(node, BAD_CAST "type", BAD_CAST hwloc_obj_type_string(obj->type));
+ sprintf(tmp, "%d", obj->os_level);
+ xmlNewProp(node, BAD_CAST "os_level", BAD_CAST tmp);
+ if (obj->os_index != (unsigned) -1) {
+ sprintf(tmp, "%u", obj->os_index);
+ xmlNewProp(node, BAD_CAST "os_index", BAD_CAST tmp);
+ }
+ if (obj->cpuset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->cpuset);
+ xmlNewProp(node, BAD_CAST "cpuset", BAD_CAST cpuset);
+ free(cpuset);
+ }
+ if (obj->complete_cpuset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->complete_cpuset);
+ xmlNewProp(node, BAD_CAST "complete_cpuset", BAD_CAST cpuset);
+ free(cpuset);
+ }
+ if (obj->online_cpuset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->online_cpuset);
+ xmlNewProp(node, BAD_CAST "online_cpuset", BAD_CAST cpuset);
+ free(cpuset);
+ }
+ if (obj->allowed_cpuset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->allowed_cpuset);
+ xmlNewProp(node, BAD_CAST "allowed_cpuset", BAD_CAST cpuset);
+ free(cpuset);
+ }
+ if (obj->nodeset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->nodeset);
+ xmlNewProp(node, BAD_CAST "nodeset", BAD_CAST cpuset);
+ free(cpuset);
+ }
+ if (obj->complete_nodeset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->complete_nodeset);
+ xmlNewProp(node, BAD_CAST "complete_nodeset", BAD_CAST cpuset);
+ free(cpuset);
+ }
+ if (obj->allowed_nodeset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->allowed_nodeset);
+ xmlNewProp(node, BAD_CAST "allowed_nodeset", BAD_CAST cpuset);
+ free(cpuset);
+ }
+
+ if (obj->name)
+ xmlNewProp(node, BAD_CAST "name", BAD_CAST obj->name);
+
+ switch (obj->type) {
+ case HWLOC_OBJ_CACHE:
+ sprintf(tmp, "%llu", (unsigned long long) obj->attr->cache.size);
+ xmlNewProp(node, BAD_CAST "cache_size", BAD_CAST tmp);
+ sprintf(tmp, "%u", obj->attr->cache.depth);
+ xmlNewProp(node, BAD_CAST "depth", BAD_CAST tmp);
+ break;
+ case HWLOC_OBJ_MACHINE:
+ if (obj->attr->machine.dmi_board_vendor)
+ xmlNewProp(node, BAD_CAST "dmi_board_vendor", BAD_CAST obj->attr->machine.dmi_board_vendor);
+ if (obj->attr->machine.dmi_board_name)
+ xmlNewProp(node, BAD_CAST "dmi_board_name", BAD_CAST obj->attr->machine.dmi_board_name);
+ break;
+ case HWLOC_OBJ_GROUP:
+ sprintf(tmp, "%u", obj->attr->group.depth);
+ xmlNewProp(node, BAD_CAST "depth", BAD_CAST tmp);
+ break;
+ default:
+ break;
+ }
+
+ if (obj->memory.local_memory) {
+ sprintf(tmp, "%llu", (unsigned long long) obj->memory.local_memory);
+ xmlNewProp(node, BAD_CAST "local_memory", BAD_CAST tmp);
+ }
+ for(i=0; i<obj->memory.page_types_len; i++) {
+ ptnode = xmlNewChild(node, NULL, BAD_CAST "page_type", NULL);
+ sprintf(tmp, "%llu", (unsigned long long) obj->memory.page_types[i].size);
+ xmlNewProp(ptnode, BAD_CAST "size", BAD_CAST tmp);
+ sprintf(tmp, "%llu", (unsigned long long) obj->memory.page_types[i].count);
+ xmlNewProp(ptnode, BAD_CAST "count", BAD_CAST tmp);
+ }
+
+ if (obj->arity) {
+ unsigned x;
+ for (x=0; x<obj->arity; x++)
+ hwloc__xml_export_object (topology, obj->children[x], node);
+ }
+}
+
+static void
+hwloc__xml_export_topology_info (hwloc_topology_t topology __hwloc_attribute_unused, xmlNodePtr root_node __hwloc_attribute_unused)
+{
+}
+
+void hwloc_topology_export_xml(hwloc_topology_t topology, const char *filename)
+{
+ xmlDocPtr doc = NULL; /* document pointer */
+ xmlNodePtr root_node = NULL; /* root pointer */
+ xmlDtdPtr dtd = NULL; /* DTD pointer */
+
+ LIBXML_TEST_VERSION;
+
+ /* Creates a new document, a node and set it as a root node. */
+ doc = xmlNewDoc(BAD_CAST "1.0");
+ root_node = xmlNewNode(NULL, BAD_CAST "topology");
+ xmlDocSetRootElement(doc, root_node);
+
+ /* Creates a DTD declaration. Isn't mandatory. */
+ dtd = xmlCreateIntSubset(doc, BAD_CAST "topology", NULL, BAD_CAST "hwloc.dtd");
+
+ hwloc__xml_export_object (topology, hwloc_get_root_obj(topology), root_node);
+
+ hwloc__xml_export_topology_info (topology, root_node);
+
+ /* Dumping document to stdio or file. */
+ xmlSaveFormatFileEnc(filename, doc, "UTF-8", 1);
+
+ /* Free the document. */
+ xmlFreeDoc(doc);
+
+ /* Free the global variables that may have been allocated by the parser. */
+ xmlCleanupParser();
+}
+
+#endif /* HWLOC_HAVE_XML */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/topology.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,6 +1,6 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
- * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+ * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
@@ -29,40 +29,93 @@
#include <mach/mach_host.h>
#endif
-#ifdef WIN_SYS
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_SYSCTL_H
+#include <sys/sysctl.h>
+#endif
+
+#ifdef HWLOC_WIN_SYS
#include <windows.h>
#endif
+static void
+hwloc_topology_clear (struct hwloc_topology *topology);
+
+#if defined(HAVE_SYSCTLBYNAME)
+int hwloc_get_sysctlbyname(const char *name, int *ret)
+{
+ int n;
+ size_t size = sizeof(n);
+ if (sysctlbyname(name, &n, &size, NULL, 0))
+ return -1;
+ if (size != sizeof(n))
+ return -1;
+ *ret = n;
+ return 0;
+}
+#endif
+
+#if defined(HAVE_SYSCTL)
+int hwloc_get_sysctl(int name[], unsigned namelen, int *ret)
+{
+ int n;
+ size_t size = sizeof(n);
+ if (sysctl(name, namelen, &n, &size, NULL, 0))
+ return -1;
+ if (size != sizeof(n))
+ return -1;
+ *ret = n;
+ return 0;
+}
+#endif
+
/* Return the OS-provided number of processors. Unlike other methods such as
reading sysfs on Linux, this method is not virtualizable; thus it's only
used as a fall-back method, allowing `hwloc_set_fsroot ()' to
have the desired effect. */
unsigned
-hwloc_fallback_nbprocessors(void) {
+hwloc_fallback_nbprocessors(struct hwloc_topology *topology) {
+ int n;
#if HAVE_DECL__SC_NPROCESSORS_ONLN
- return sysconf(_SC_NPROCESSORS_ONLN);
+ n = sysconf(_SC_NPROCESSORS_ONLN);
#elif HAVE_DECL__SC_NPROC_ONLN
- return sysconf(_SC_NPROC_ONLN);
+ n = sysconf(_SC_NPROC_ONLN);
#elif HAVE_DECL__SC_NPROCESSORS_CONF
- return sysconf(_SC_NPROCESSORS_CONF);
+ n = sysconf(_SC_NPROCESSORS_CONF);
#elif HAVE_DECL__SC_NPROC_CONF
- return sysconf(_SC_NPROC_CONF);
+ n = sysconf(_SC_NPROC_CONF);
#elif defined(HAVE_HOST_INFO) && HAVE_HOST_INFO
struct host_basic_info info;
mach_msg_type_number_t count = HOST_BASIC_INFO_COUNT;
host_info(mach_host_self(), HOST_BASIC_INFO, (integer_t*) &info, &count);
- return info.avail_cpus;
-#elif defined(WIN_SYS)
+ n = info.avail_cpus;
+#elif defined(HAVE_SYSCTLBYNAME)
+ int n;
+ if (hwloc_get_sysctlbyname("hw.ncpu", &n))
+ n = -1;
+#elif defined(HAVE_SYSCTL) && HAVE_DECL_CTL_HW && HAVE_DECL_HW_NCPU
+ static int name[2] = {CTL_HW, HW_NPCU};
+ if (hwloc_get_sysctl(name, sizeof(name)/sizeof(*name)), &n)
+ n = -1;
+#elif defined(HWLOC_WIN_SYS)
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
- return sysinfo.dwNumberOfProcessors;
+ n = sysinfo.dwNumberOfProcessors;
#else
#ifdef __GNUC__
#warning No known way to discover number of available processors on this system
#warning hwloc_fallback_nbprocessors will default to 1
#endif
- return 1;
+ n = -1;
#endif
+ if (n >= 1)
+ topology->support.discovery->pu = 1;
+ else
+ n = 1;
+ return n;
}
/*
@@ -71,7 +124,6 @@
*/
static unsigned
hwloc_setup_group_from_min_distance_clique(unsigned nbobjs,
- struct hwloc_obj **objs,
unsigned *_distances,
unsigned *groupids)
{
@@ -111,7 +163,7 @@
hwloc_cpuset_isset(closest_objs_set, k) &&
(*distances)[j][k] != min_distance) {
/* the minimal-distance graph is not complete. abort */
- hwloc_debug("found incomplete minimal-distance graph, aborting\n");
+ hwloc_debug("%s", "found incomplete minimal-distance graph, aborting\n");
return 0;
}
@@ -123,7 +175,7 @@
groupids[j] = groupid;
hwloc_debug("found complete graph with %u objects with minimal distance %u\n",
size, min_distance);
- free(closest_objs_set);
+ hwloc_cpuset_free(closest_objs_set);
}
/* return the last id, since it's also the number of used group ids */
@@ -136,7 +188,6 @@
*/
static unsigned
hwloc_setup_group_from_min_distance_transitivity(unsigned nbobjs,
- struct hwloc_obj **objs,
unsigned *_distances,
unsigned *groupids)
{
@@ -195,7 +246,7 @@
groupids[j] = groupid;
hwloc_debug("found transitive graph with %u objects with minimal distance %u\n",
size, min_distance);
- free(closest_objs_set);
+ hwloc_cpuset_free(closest_objs_set);
}
/* return the last id, since it's also the number of used group ids */
@@ -215,7 +266,7 @@
{
unsigned (*distances)[nbobjs][nbobjs] = (unsigned (*)[nbobjs][nbobjs])_distances;
unsigned groupids[nbobjs];
- int nbgroups;
+ unsigned nbgroups;
unsigned i,j;
hwloc_debug("trying to group %s objects into misc objects according to physical distances\n",
@@ -224,15 +275,15 @@
if (nbobjs <= 2)
return;
- nbgroups = hwloc_setup_group_from_min_distance_clique(nbobjs, objs, _distances, groupids);
+ nbgroups = hwloc_setup_group_from_min_distance_clique(nbobjs, _distances, groupids);
if (!nbgroups) {
- nbgroups = hwloc_setup_group_from_min_distance_transitivity(nbobjs, objs, _distances, groupids);
+ nbgroups = hwloc_setup_group_from_min_distance_transitivity(nbobjs, _distances, groupids);
if (!nbgroups)
return;
}
if (nbgroups == 1) {
- hwloc_debug("ignoring misc object with all objects\n");
+ hwloc_debug("%s", "ignoring misc object with all objects\n");
return;
}
@@ -247,18 +298,18 @@
for(i=0; i<nbgroups; i++) {
/* create the misc object */
hwloc_obj_t misc_obj;
- misc_obj = hwloc_alloc_setup_object(HWLOC_OBJ_MISC, -1);
+ misc_obj = hwloc_alloc_setup_object(HWLOC_OBJ_GROUP, -1);
misc_obj->cpuset = hwloc_cpuset_alloc();
hwloc_cpuset_zero(misc_obj->cpuset);
- misc_obj->attr->misc.depth = depth;
+ misc_obj->attr->group.depth = depth;
for (j=0; j<nbobjs; j++)
if (groupids[j] == i+1) {
- hwloc_cpuset_orset(misc_obj->cpuset, objs[j]->cpuset);
+ hwloc_cpuset_or(misc_obj->cpuset, misc_obj->cpuset, objs[j]->cpuset);
groupsizes[i]++;
}
hwloc_debug_1arg_cpuset("adding misc object with %u objects and cpuset %s\n",
groupsizes[i], misc_obj->cpuset);
- hwloc_add_object(topology, misc_obj);
+ hwloc_insert_object_by_cpuset(topology, misc_obj);
groupobjs[i] = misc_obj;
}
@@ -271,11 +322,11 @@
for(j=0; j<nbgroups; j++)
groupdistances[i][j] /= groupsizes[i]*groupsizes[j];
#ifdef HWLOC_DEBUG
- hwloc_debug("group distances:\n");
+ hwloc_debug("%s", "group distances:\n");
for(i=0; i<nbgroups; i++) {
for(j=0; j<nbgroups; j++)
hwloc_debug("%u ", groupdistances[i][j]);
- hwloc_debug("\n");
+ hwloc_debug("%s", "\n");
}
#endif
@@ -299,17 +350,17 @@
return;
#ifdef HWLOC_DEBUG
- hwloc_debug("node distance matrix:\n");
- hwloc_debug(" ");
+ hwloc_debug("%s", "node distance matrix:\n");
+ hwloc_debug("%s", " ");
for(j=0; j<nbobjs; j++)
- hwloc_debug(" %3d", j);
- hwloc_debug("\n");
+ hwloc_debug(" %3u", j);
+ hwloc_debug("%s", "\n");
for(i=0; i<nbobjs; i++) {
- hwloc_debug("%3d", i);
+ hwloc_debug("%3u", i);
for(j=0; j<nbobjs; j++)
- hwloc_debug(" %3d", (*distances)[i][j]);
- hwloc_debug("\n");
+ hwloc_debug(" %3u", (*distances)[i][j]);
+ hwloc_debug("%s", "\n");
}
#endif
@@ -336,61 +387,93 @@
/*
* Use the given number of processors and the optional online cpuset if given
- * to set a Proc level.
+ * to set a PU level.
*/
void
-hwloc_setup_proc_level(struct hwloc_topology *topology,
- unsigned nb_processors,
- hwloc_cpuset_t online_cpuset)
+hwloc_setup_pu_level(struct hwloc_topology *topology,
+ unsigned nb_pus)
{
struct hwloc_obj *obj;
unsigned oscpu,cpu;
- hwloc_debug("\n\n * CPU cpusets *\n\n");
- for (cpu=0,oscpu=0; cpu<nb_processors; oscpu++)
+ hwloc_debug("%s", "\n\n * CPU cpusets *\n\n");
+ for (cpu=0,oscpu=0; cpu<nb_pus; oscpu++)
{
- if (online_cpuset && !hwloc_cpuset_isset(online_cpuset, oscpu))
- continue;
-
- obj = hwloc_alloc_setup_object(HWLOC_OBJ_PROC, oscpu);
+ obj = hwloc_alloc_setup_object(HWLOC_OBJ_PU, oscpu);
obj->cpuset = hwloc_cpuset_alloc();
hwloc_cpuset_cpu(obj->cpuset, oscpu);
- hwloc_debug_2args_cpuset("cpu %d (os %d) has cpuset %s\n",
+ hwloc_debug_2args_cpuset("cpu %u (os %u) has cpuset %s\n",
cpu, oscpu, obj->cpuset);
- hwloc_add_object(topology, obj);
+ hwloc_insert_object_by_cpuset(topology, obj);
cpu++;
}
}
-/* Just for debugging. */
static void
-print_objects(struct hwloc_topology *topology, int indent, hwloc_obj_t obj)
+print_object(struct hwloc_topology *topology, int indent __hwloc_attribute_unused, hwloc_obj_t obj)
{
char line[256], *cpuset = NULL;
hwloc_debug("%*s", 2*indent, "");
hwloc_obj_snprintf(line, sizeof(line), topology, obj, "#", 1);
hwloc_debug("%s", line);
- hwloc_cpuset_asprintf(&cpuset, obj->cpuset);
- hwloc_debug(" %s", cpuset);
- free(cpuset);
+ if (obj->cpuset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->cpuset);
+ hwloc_debug(" cpuset %s", cpuset);
+ free(cpuset);
+ }
+ if (obj->complete_cpuset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->complete_cpuset);
+ hwloc_debug(" complete %s", cpuset);
+ free(cpuset);
+ }
+ if (obj->online_cpuset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->online_cpuset);
+ hwloc_debug(" online %s", cpuset);
+ free(cpuset);
+ }
+ if (obj->allowed_cpuset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->allowed_cpuset);
+ hwloc_debug(" allowed %s", cpuset);
+ free(cpuset);
+ }
+ if (obj->nodeset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->nodeset);
+ hwloc_debug(" nodeset %s", cpuset);
+ free(cpuset);
+ }
+ if (obj->complete_nodeset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->complete_nodeset);
+ hwloc_debug(" completeN %s", cpuset);
+ free(cpuset);
+ }
+ if (obj->allowed_nodeset) {
+ hwloc_cpuset_asprintf(&cpuset, obj->allowed_nodeset);
+ hwloc_debug(" allowedN %s", cpuset);
+ free(cpuset);
+ }
if (obj->arity)
- hwloc_debug(" arity %d", obj->arity);
- hwloc_debug("\n");
+ hwloc_debug(" arity %u", obj->arity);
+ hwloc_debug("%s", "\n");
+}
+
+/* Just for debugging. */
+static void
+print_objects(struct hwloc_topology *topology __hwloc_attribute_unused, int indent __hwloc_attribute_unused, hwloc_obj_t obj __hwloc_attribute_unused)
+{
+#ifdef HWLOC_DEBUG
+ print_object(topology, indent, obj);
for (obj = obj->first_child; obj; obj = obj->next_sibling)
print_objects(topology, indent + 1, obj);
+#endif
}
/* Free an object and all its content. */
-static void
+void
free_object(hwloc_obj_t obj)
{
switch (obj->type) {
- case HWLOC_OBJ_SYSTEM:
- free(obj->attr->system.dmi_board_vendor);
- free(obj->attr->system.dmi_board_name);
- break;
case HWLOC_OBJ_MACHINE:
free(obj->attr->machine.dmi_board_vendor);
free(obj->attr->machine.dmi_board_name);
@@ -398,10 +481,17 @@
default:
break;
}
+ free(obj->memory.page_types);
free(obj->attr);
free(obj->children);
free(obj->name);
- free(obj->cpuset);
+ hwloc_cpuset_free(obj->cpuset);
+ hwloc_cpuset_free(obj->complete_cpuset);
+ hwloc_cpuset_free(obj->online_cpuset);
+ hwloc_cpuset_free(obj->allowed_cpuset);
+ hwloc_cpuset_free(obj->nodeset);
+ hwloc_cpuset_free(obj->complete_nodeset);
+ hwloc_cpuset_free(obj->allowed_nodeset);
free(obj);
}
@@ -416,32 +506,35 @@
enum hwloc_type_cmp_e {
HWLOC_TYPE_HIGHER,
HWLOC_TYPE_DEEPER,
- HWLOC_TYPE_EQUAL,
+ HWLOC_TYPE_EQUAL
};
-static const int obj_type_order[] = {
+static const unsigned obj_type_order[] = {
[HWLOC_OBJ_SYSTEM] = 0,
[HWLOC_OBJ_MACHINE] = 1,
- [HWLOC_OBJ_MISC] = 2,
+ [HWLOC_OBJ_GROUP] = 2,
[HWLOC_OBJ_NODE] = 3,
[HWLOC_OBJ_SOCKET] = 4,
[HWLOC_OBJ_CACHE] = 5,
[HWLOC_OBJ_CORE] = 6,
- [HWLOC_OBJ_PROC] = 7,
+ [HWLOC_OBJ_PU] = 7,
+ [HWLOC_OBJ_MISC] = 8,
};
static const hwloc_obj_type_t obj_order_type[] = {
[0] = HWLOC_OBJ_SYSTEM,
[1] = HWLOC_OBJ_MACHINE,
- [2] = HWLOC_OBJ_MISC,
+ [2] = HWLOC_OBJ_GROUP,
[3] = HWLOC_OBJ_NODE,
[4] = HWLOC_OBJ_SOCKET,
[5] = HWLOC_OBJ_CACHE,
[6] = HWLOC_OBJ_CORE,
- [7] = HWLOC_OBJ_PROC,
+ [7] = HWLOC_OBJ_PU,
+ [8] = HWLOC_OBJ_MISC
};
-static int hwloc_get_type_order(hwloc_obj_type_t type)
+static unsigned __hwloc_attribute_const
+hwloc_get_type_order(hwloc_obj_type_t type)
{
return obj_type_order[type];
}
@@ -453,7 +546,9 @@
int hwloc_compare_types (hwloc_obj_type_t type1, hwloc_obj_type_t type2)
{
- return hwloc_get_type_order(type1) - hwloc_get_type_order(type2);
+ unsigned order1 = hwloc_get_type_order(type1);
+ unsigned order2 = hwloc_get_type_order(type2);
+ return order1 - order2;
}
static enum hwloc_type_cmp_e
@@ -472,11 +567,11 @@
return HWLOC_TYPE_HIGHER;
}
- /* Misc objects have the same types but can have different depths. */
- if (obj1->type == HWLOC_OBJ_MISC) {
- if (obj1->attr->misc.depth < obj2->attr->misc.depth)
+ /* Group objects have the same types but can have different depths. */
+ if (obj1->type == HWLOC_OBJ_GROUP) {
+ if (obj1->attr->group.depth < obj2->attr->group.depth)
return HWLOC_TYPE_DEEPER;
- else if (obj1->attr->misc.depth > obj2->attr->misc.depth)
+ else if (obj1->attr->group.depth > obj2->attr->group.depth)
return HWLOC_TYPE_HIGHER;
}
@@ -492,13 +587,14 @@
HWLOC_OBJ_INCLUDED, /**< \brief Strictly included into */
HWLOC_OBJ_CONTAINS, /**< \brief Strictly contains */
HWLOC_OBJ_INTERSECTS, /**< \brief Intersects, but no inclusion! */
- HWLOC_OBJ_DIFFERENT, /**< \brief No intersection */
+ HWLOC_OBJ_DIFFERENT /**< \brief No intersection */
};
static int
hwloc_obj_cmp(hwloc_obj_t obj1, hwloc_obj_t obj2)
{
- if (hwloc_cpuset_iszero(obj1->cpuset) || hwloc_cpuset_iszero(obj2->cpuset))
+ if (!obj1->cpuset || hwloc_cpuset_iszero(obj1->cpuset)
+ || !obj2->cpuset || hwloc_cpuset_iszero(obj2->cpuset))
return HWLOC_OBJ_DIFFERENT;
if (hwloc_cpuset_isequal(obj1->cpuset, obj2->cpuset)) {
@@ -510,7 +606,19 @@
return HWLOC_OBJ_INCLUDED;
case HWLOC_TYPE_HIGHER:
return HWLOC_OBJ_CONTAINS;
+
case HWLOC_TYPE_EQUAL:
+ if (obj1->type == HWLOC_OBJ_MISC) {
+ /* Misc objects may vary by name */
+ int res = strcmp(obj1->name, obj2->name);
+ if (res < 0)
+ return HWLOC_OBJ_INCLUDED;
+ if (res > 0)
+ return HWLOC_OBJ_CONTAINS;
+ if (res == 0)
+ return HWLOC_OBJ_EQUAL;
+ }
+
/* Same level cpuset and type! Let's hope it's coherent. */
return HWLOC_OBJ_EQUAL;
}
@@ -543,39 +651,69 @@
* complete.
*/
+#define merge_index(new, old, field, type) \
+ if ((old)->field == (type) -1) \
+ (old)->field = (new)->field;
#define merge_sizes(new, old, field) \
if (!(old)->field) \
(old)->field = (new)->field;
+#ifdef HWLOC_DEBUG
#define check_sizes(new, old, field) \
- merge_sizes(new, old, field) \
if ((new)->field) \
assert((old)->field == (new)->field)
+#else
+#define check_sizes(new, old, field)
+#endif
/* Try to insert OBJ in CUR, recurse if needed */
static void
-add_object(struct hwloc_topology *topology, hwloc_obj_t cur, hwloc_obj_t obj)
+hwloc__insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t cur, hwloc_obj_t obj)
{
- hwloc_obj_t child, container, *cur_children, *obj_children, next_child;
+ hwloc_obj_t child, container, *cur_children, *obj_children, next_child = NULL;
int put;
/* Make sure we haven't gone too deep. */
- assert(hwloc_cpuset_isincluded(obj->cpuset, cur->cpuset));
+ if (!hwloc_cpuset_isincluded(obj->cpuset, cur->cpuset)) {
+ fprintf(stderr,"recursion has gone too deep?!\n");
+ return;
+ }
/* Check whether OBJ is included in some child. */
container = NULL;
for (child = cur->first_child; child; child = child->next_sibling) {
switch (hwloc_obj_cmp(obj, child)) {
case HWLOC_OBJ_EQUAL:
- assert(hwloc_cpuset_isequal(obj->cpuset, child->cpuset));
- assert(obj->os_index == child->os_index);
+ merge_index(obj, child, os_level, signed);
+ if (obj->os_level != child->os_level) {
+ fprintf(stderr, "Different OS level\n");
+ return;
+ }
+ merge_index(obj, child, os_index, unsigned);
+ if (obj->os_index != child->os_index) {
+ fprintf(stderr, "Different OS indexes\n");
+ return;
+ }
switch(obj->type) {
case HWLOC_OBJ_NODE:
/* Do not check these, it may change between calls */
- merge_sizes(obj, child, attr->node.memory_kB);
- merge_sizes(obj, child, attr->node.huge_page_free);
+ merge_sizes(obj, child, memory.local_memory);
+ merge_sizes(obj, child, memory.total_memory);
+ /* if both objects have a page_types array, just keep the biggest one for now */
+ if (obj->memory.page_types_len && child->memory.page_types_len)
+ hwloc_debug("%s", "merging page_types by keeping the biggest one only\n");
+ if (obj->memory.page_types_len < child->memory.page_types_len) {
+ free(obj->memory.page_types);
+ } else {
+ free(child->memory.page_types);
+ child->memory.page_types_len = obj->memory.page_types_len;
+ child->memory.page_types = obj->memory.page_types;
+ obj->memory.page_types = NULL;
+ obj->memory.page_types_len = 0;
+ }
break;
case HWLOC_OBJ_CACHE:
- check_sizes(obj, child, attr->cache.memory_kB);
+ merge_sizes(obj, child, attr->cache.size);
+ check_sizes(obj, child, attr->cache.size);
break;
default:
break;
@@ -608,7 +746,7 @@
if (container) {
/* OBJ is strictly contained is some child of CUR, go deeper. */
- add_object(topology, container, obj);
+ hwloc__insert_object_by_cpuset(topology, container, obj);
return;
}
@@ -636,7 +774,7 @@
case HWLOC_OBJ_DIFFERENT:
/* Leave CHILD in CUR. */
- if (!put && hwloc_cpuset_compar_first(obj->cpuset, child->cpuset) < 0) {
+ if (!put && hwloc_cpuset_compare_first(obj->cpuset, child->cpuset) < 0) {
/* Sort children by cpuset: put OBJ before CHILD in CUR's children. */
*cur_children = obj;
cur_children = &obj->next_sibling;
@@ -673,109 +811,453 @@
}
void
-hwloc_add_object(struct hwloc_topology *topology, hwloc_obj_t obj)
+hwloc_insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t obj)
{
- if (topology->ignored_types[obj->type] == HWLOC_IGNORE_TYPE_ALWAYS) {
- free_object(obj);
- return;
+ /* Start at the top. */
+ /* Add the cpuset to the top */
+ hwloc_cpuset_or(topology->levels[0][0]->complete_cpuset, topology->levels[0][0]->complete_cpuset, obj->cpuset);
+ if (obj->nodeset)
+ hwloc_cpuset_or(topology->levels[0][0]->complete_nodeset, topology->levels[0][0]->complete_nodeset, obj->nodeset);
+ hwloc__insert_object_by_cpuset(topology, topology->levels[0][0], obj);
+}
+
+void
+hwloc_insert_object_by_parent(struct hwloc_topology *topology, hwloc_obj_t parent, hwloc_obj_t obj)
+{
+ hwloc_obj_t child, next_child = obj->first_child;
+ hwloc_obj_t *current;
+
+ /* Append to the end of the list */
+ for (current = &parent->first_child; *current; current = &(*current)->next_sibling)
+ ;
+ *current = obj;
+ obj->next_sibling = NULL;
+ obj->first_child = NULL;
+
+ /* Use the new object to insert children */
+ parent = obj;
+
+ /* Recursively insert children below */
+ while (next_child) {
+ child = next_child;
+ next_child = child->next_sibling;
+ hwloc_insert_object_by_parent(topology, parent, child);
}
+}
- /* Start at the top. */
- add_object(topology, topology->levels[0][0], obj);
+static void
+hwloc_connect(hwloc_obj_t parent);
+/* Adds a misc object _after_ detection, and thus has to reconnect all the pointers */
+hwloc_obj_t
+hwloc_topology_insert_misc_object_by_cpuset(struct hwloc_topology *topology, hwloc_const_cpuset_t cpuset, const char *name)
+{
+ hwloc_obj_t obj = hwloc_alloc_setup_object(HWLOC_OBJ_MISC, -1);
+ obj->cpuset = hwloc_cpuset_dup(cpuset);
+ if (name)
+ obj->name = strdup(name);
+
+ hwloc_insert_object_by_cpuset(topology, obj);
+
+ hwloc_connect(topology->levels[0][0]);
+
+ return obj;
}
-/*
- * traverse the whole tree in a deletion-safe way, calling node_before at
- * nodes, leaf at leaves, and node_after when back at nodes, passing data along
- * the way through nodes. data returned by leaf() is ignored.
- *
- * Hooks can modify the pointer they're given to remove or replace themselves.
- */
+hwloc_obj_t
+hwloc_topology_insert_misc_object_by_parent(struct hwloc_topology *topology, hwloc_obj_t parent, const char *name)
+{
+ hwloc_obj_t obj = hwloc_alloc_setup_object(HWLOC_OBJ_MISC, -1);
+ if (parent->cpuset)
+ obj->cpuset = hwloc_cpuset_dup(parent->cpuset);
+ if (name)
+ obj->name = strdup(name);
+
+ hwloc_insert_object_by_parent(topology, parent, obj);
+
+ hwloc_connect(topology->levels[0][0]);
+
+ return obj;
+}
+
+/* Traverse children of a parent in a safe way: reread the next pointer as
+ * appropriate to prevent crash on child deletion: */
+#define for_each_child_safe(child, parent, pchild) \
+ for (pchild = &(parent)->first_child, child = *pchild; \
+ child; \
+ /* Check whether the current child was not dropped. */ \
+ (*pchild == child ? pchild = &(child->next_sibling) : NULL), \
+ /* Get pointer to next childect. */ \
+ child = *pchild)
+
+static int hwloc_memory_page_type_compare(const void *_a, const void *_b)
+{
+ const struct hwloc_obj_memory_page_type_s *a = _a;
+ const struct hwloc_obj_memory_page_type_s *b = _b;
+ /* consider 0 as larger so that 0-size page_type go to the end */
+ return b->size ? (int)(a->size - b->size) : -1;
+}
+
+/* Propagate memory counts */
static void
-traverse(hwloc_topology_t topology,
- hwloc_obj_t *father,
- void (*node_before)(hwloc_topology_t topology, hwloc_obj_t *obj, void *),
- void (*leaf)(hwloc_topology_t topology, hwloc_obj_t *obj, void *),
- void (*node_after)(hwloc_topology_t topology, hwloc_obj_t *obj, void *),
- void *data)
+propagate_total_memory(hwloc_obj_t obj)
{
- hwloc_obj_t *pobj, obj;
+ hwloc_obj_t *temp, child;
+ unsigned i;
- if (!(*father)->first_child) {
- if (leaf)
- leaf(topology, father, data);
- return;
+ /* Propagate memory up */
+ for_each_child_safe(child, obj, temp) {
+ propagate_total_memory(child);
+ obj->memory.total_memory += child->memory.total_memory;
}
- if (node_before)
- node_before(topology, father, data);
- if (!(*father))
- return;
- for (pobj = &(*father)->first_child, obj = *pobj;
- obj;
- /* Check whether the current obj was dropped. */
- (*pobj == obj ? pobj = &(*pobj)->next_sibling : NULL),
- /* Get pointer to next object. */
- obj = *pobj)
- traverse(topology, pobj, node_before, leaf, node_after, data);
- if (node_after)
- node_after(topology, father, data);
+ obj->memory.total_memory += obj->memory.local_memory;
+
+ /* By the way, sort the page_type array.
+ * Cannot do it on insert since some backends (e.g. XML) add page_types after inserting the object.
+ */
+ qsort(obj->memory.page_types, obj->memory.page_types_len, sizeof(*obj->memory.page_types), hwloc_memory_page_type_compare);
+ /* Ignore 0-size page_types, they are at the end */
+ for(i=obj->memory.page_types_len; i>=1; i--)
+ if (obj->memory.page_types[i-1].size)
+ break;
+ obj->memory.page_types_len = i;
}
+/* Collect the cpuset of all the PU objects. */
static void
-get_proc_cpuset(hwloc_topology_t topology, hwloc_obj_t *obj, void *data)
+collect_proc_cpuset(hwloc_obj_t obj, hwloc_obj_t sys)
{
- hwloc_cpuset_t cpuset = data;
- if ((*obj)->type != HWLOC_OBJ_PROC)
- return;
- hwloc_cpuset_orset(cpuset, (*obj)->cpuset);
+ hwloc_obj_t child, *temp;
+
+ if (sys) {
+ /* We are already given a pointer to a system object */
+ if (obj->type == HWLOC_OBJ_PU)
+ hwloc_cpuset_or(sys->cpuset, sys->cpuset, obj->cpuset);
+ } else {
+ if (obj->cpuset) {
+ /* This object is the root of a machine */
+ sys = obj;
+ /* Assume no PU for now */
+ hwloc_cpuset_zero(obj->cpuset);
+ }
+ }
+
+ for_each_child_safe(child, obj, temp)
+ collect_proc_cpuset(child, sys);
}
+/* While traversing down and up, propagate the offline/disallowed cpus by
+ * and'ing them to and from the first object that has a cpuset */
static void
-apply_cpuset(hwloc_topology_t topology, hwloc_obj_t *obj, void *data)
+propagate_unused_cpuset(hwloc_obj_t obj, hwloc_obj_t sys)
{
- hwloc_cpuset_t cpuset = data;
- hwloc_cpuset_andset((*obj)->cpuset, cpuset);
+ hwloc_obj_t child, *temp;
+
+ if (obj->cpuset) {
+ if (sys) {
+ /* We are already given a pointer to an system object, update it and update ourselves */
+ hwloc_cpuset_t mask = hwloc_cpuset_alloc();
+
+ /* Apply the topology cpuset */
+ hwloc_cpuset_and(obj->cpuset, obj->cpuset, sys->cpuset);
+
+ /* Update complete cpuset down */
+ if (obj->complete_cpuset) {
+ hwloc_cpuset_and(obj->complete_cpuset, obj->complete_cpuset, sys->complete_cpuset);
+ } else {
+ obj->complete_cpuset = hwloc_cpuset_dup(sys->complete_cpuset);
+ hwloc_cpuset_and(obj->complete_cpuset, obj->complete_cpuset, obj->cpuset);
+ }
+
+ /* Update online cpusets */
+ if (obj->online_cpuset) {
+ /* Update ours */
+ hwloc_cpuset_and(obj->online_cpuset, obj->online_cpuset, sys->online_cpuset);
+
+ /* Update the given cpuset, but only what we know */
+ hwloc_cpuset_copy(mask, obj->cpuset);
+ hwloc_cpuset_not(mask, mask);
+ hwloc_cpuset_or(mask, mask, obj->online_cpuset);
+ hwloc_cpuset_and(sys->online_cpuset, sys->online_cpuset, mask);
+ } else {
+ /* Just take it as such */
+ obj->online_cpuset = hwloc_cpuset_dup(sys->online_cpuset);
+ hwloc_cpuset_and(obj->online_cpuset, obj->online_cpuset, obj->cpuset);
+ }
+
+ /* Update allowed cpusets */
+ if (obj->allowed_cpuset) {
+ /* Update ours */
+ hwloc_cpuset_and(obj->allowed_cpuset, obj->allowed_cpuset, sys->allowed_cpuset);
+
+ /* Update the given cpuset, but only what we know */
+ hwloc_cpuset_copy(mask, obj->cpuset);
+ hwloc_cpuset_not(mask, mask);
+ hwloc_cpuset_or(mask, mask, obj->allowed_cpuset);
+ hwloc_cpuset_and(sys->allowed_cpuset, sys->allowed_cpuset, mask);
+ } else {
+ /* Just take it as such */
+ obj->allowed_cpuset = hwloc_cpuset_dup(sys->allowed_cpuset);
+ hwloc_cpuset_and(obj->allowed_cpuset, obj->allowed_cpuset, obj->cpuset);
+ }
+
+ hwloc_cpuset_free(mask);
+ } else {
+ /* This object is the root of a machine */
+ sys = obj;
+ /* Apply complete cpuset to cpuset, online_cpuset and allowed_cpuset, it
+ * will automatically be applied below */
+ if (obj->complete_cpuset)
+ hwloc_cpuset_and(obj->cpuset, obj->cpuset, obj->complete_cpuset);
+ else
+ obj->complete_cpuset = hwloc_cpuset_dup(obj->cpuset);
+ if (obj->online_cpuset)
+ hwloc_cpuset_and(obj->online_cpuset, obj->online_cpuset, obj->complete_cpuset);
+ else
+ obj->online_cpuset = hwloc_cpuset_dup(obj->complete_cpuset);
+ if (obj->allowed_cpuset)
+ hwloc_cpuset_and(obj->allowed_cpuset, obj->allowed_cpuset, obj->complete_cpuset);
+ else
+ obj->allowed_cpuset = hwloc_cpuset_dup(obj->complete_cpuset);
+ }
+ }
+
+ for_each_child_safe(child, obj, temp)
+ propagate_unused_cpuset(child, sys);
}
+/* Propagate nodesets up and down */
static void
-do_free_object(hwloc_topology_t topology, hwloc_obj_t *obj, void *data)
+propagate_nodeset(hwloc_obj_t obj, hwloc_obj_t sys)
{
- free_object(*obj);
+ hwloc_obj_t child, *temp;
+ hwloc_cpuset_t parent_nodeset = NULL;
+ int parent_weight = 0;
+
+ if (!sys && obj->nodeset) {
+ sys = obj;
+ if (!obj->complete_nodeset)
+ obj->complete_nodeset = hwloc_cpuset_dup(obj->nodeset);
+ if (!obj->allowed_nodeset)
+ obj->allowed_nodeset = hwloc_cpuset_dup(obj->complete_nodeset);
+ }
+
+ if (sys) {
+ if (obj->nodeset) {
+ /* Some existing nodeset coming from above, to possibly propagate down */
+ parent_nodeset = obj->nodeset;
+ parent_weight = hwloc_cpuset_weight(parent_nodeset);
+ } else
+ obj->nodeset = hwloc_cpuset_alloc();
+ }
+
+ for_each_child_safe(child, obj, temp) {
+ /* Propagate singleton nodesets down */
+ if (parent_weight == 1) {
+ if (!child->nodeset)
+ child->nodeset = hwloc_cpuset_dup(obj->nodeset);
+ else if (!hwloc_cpuset_isequal(child->nodeset, parent_nodeset)) {
+ hwloc_debug_cpuset("Oops, parent nodeset %s", parent_nodeset);
+ hwloc_debug_cpuset(" is different from child nodeset %s, ignoring the child one\n", child->nodeset);
+ hwloc_cpuset_copy(child->nodeset, parent_nodeset);
+ }
+ }
+
+ /* Recurse */
+ propagate_nodeset(child, sys);
+
+ /* Propagate children nodesets up */
+ if (sys && child->nodeset)
+ hwloc_cpuset_or(obj->nodeset, obj->nodeset, child->nodeset);
+ }
}
+/* Propagate allowed and complete nodesets */
+static void
+propagate_nodesets(hwloc_obj_t obj)
+{
+ hwloc_cpuset_t mask = hwloc_cpuset_alloc();
+ hwloc_obj_t child, *temp;
+
+ for_each_child_safe(child, obj, temp) {
+ if (obj->nodeset) {
+ /* Update complete nodesets down */
+ if (child->complete_nodeset) {
+ hwloc_cpuset_and(child->complete_nodeset, child->complete_nodeset, obj->complete_nodeset);
+ } else if (child->nodeset) {
+ child->complete_nodeset = hwloc_cpuset_dup(obj->complete_nodeset);
+ hwloc_cpuset_and(child->complete_nodeset, child->complete_nodeset, child->nodeset);
+ } /* else the child doesn't have nodeset information, we can not provide a complete nodeset */
+
+ /* Update allowed nodesets down */
+ if (child->allowed_nodeset) {
+ hwloc_cpuset_and(child->allowed_nodeset, child->allowed_nodeset, obj->allowed_nodeset);
+ } else if (child->nodeset) {
+ child->allowed_nodeset = hwloc_cpuset_dup(obj->allowed_nodeset);
+ hwloc_cpuset_and(child->allowed_nodeset, child->allowed_nodeset, child->nodeset);
+ }
+ }
+
+ propagate_nodesets(child);
+
+ if (obj->nodeset) {
+ /* Update allowed nodesets up */
+ if (child->nodeset && child->allowed_nodeset) {
+ hwloc_cpuset_copy(mask, child->nodeset);
+ hwloc_cpuset_not(mask, mask);
+ hwloc_cpuset_or(mask, mask, child->allowed_nodeset);
+ hwloc_cpuset_and(obj->allowed_nodeset, obj->allowed_nodeset, mask);
+ }
+ }
+ }
+ hwloc_cpuset_free(mask);
+
+ if (obj->nodeset) {
+ /* Apply complete nodeset to nodeset and allowed_nodeset */
+ if (obj->complete_nodeset)
+ hwloc_cpuset_and(obj->nodeset, obj->nodeset, obj->complete_nodeset);
+ else
+ obj->complete_nodeset = hwloc_cpuset_dup(obj->nodeset);
+ if (obj->allowed_nodeset)
+ hwloc_cpuset_and(obj->allowed_nodeset, obj->allowed_nodeset, obj->complete_nodeset);
+ else
+ obj->allowed_nodeset = hwloc_cpuset_dup(obj->complete_nodeset);
+ }
+}
+
+static void
+apply_nodeset(hwloc_obj_t obj, hwloc_obj_t sys)
+{
+ unsigned i;
+ hwloc_obj_t child, *temp;
+
+ if (sys) {
+ if (obj->type == HWLOC_OBJ_NODE && obj->os_index != (unsigned) -1 &&
+ !hwloc_cpuset_isset(sys->allowed_nodeset, obj->os_index)) {
+ hwloc_debug("Dropping memory from disallowed node %u\n", obj->os_index);
+ obj->memory.local_memory = 0;
+ obj->memory.total_memory = 0;
+ for(i=0; i<obj->memory.page_types_len; i++)
+ obj->memory.page_types[i].count = 0;
+ }
+ } else {
+ if (obj->allowed_nodeset) {
+ sys = obj;
+ }
+ }
+
+ for_each_child_safe(child, obj, temp)
+ apply_nodeset(child, sys);
+}
+
+static void
+remove_unused_cpusets(hwloc_obj_t obj)
+{
+ hwloc_obj_t child, *temp;
+
+ if (obj->cpuset) {
+ hwloc_cpuset_and(obj->cpuset, obj->cpuset, obj->online_cpuset);
+ hwloc_cpuset_and(obj->cpuset, obj->cpuset, obj->allowed_cpuset);
+ }
+
+ for_each_child_safe(child, obj, temp)
+ remove_unused_cpusets(child);
+}
+
+static void
+drop_object(hwloc_obj_t *pparent)
+{
+ hwloc_obj_t parent = *pparent;
+ hwloc_obj_t child = parent->first_child;
+ /* Replace object with its list of children */
+ if (child) {
+ *pparent = child;
+ while (child->next_sibling)
+ child = child->next_sibling;
+ child->next_sibling = parent->next_sibling;
+ } else
+ *pparent = parent->next_sibling;
+ /* Remove ignored object */
+ free_object(parent);
+}
+
+/* Remove all ignored objects. */
+static void
+remove_ignored(hwloc_topology_t topology, hwloc_obj_t *pparent)
+{
+ hwloc_obj_t parent = *pparent, child, *pchild;
+
+ for_each_child_safe(child, parent, pchild)
+ remove_ignored(topology, pchild);
+
+ if (topology->ignored_types[parent->type] == HWLOC_IGNORE_TYPE_ALWAYS) {
+ hwloc_debug("%s", "\nDropping ignored object ");
+ print_object(topology, 0, parent);
+ drop_object(pparent);
+ }
+}
+
+static void
+do_free_object(hwloc_obj_t *pobj)
+{
+ hwloc_obj_t obj = *pobj, child, *pchild;
+
+ for_each_child_safe(child, obj, pchild)
+ do_free_object(pchild);
+
+ *pobj = obj->next_sibling;
+ free_object(obj);
+}
+
/* Remove all children whose cpuset is empty, except NUMA nodes
* since we want to keep memory information. */
static void
-remove_empty(hwloc_topology_t topology, hwloc_obj_t *obj, void *data)
+remove_empty(hwloc_topology_t topology, hwloc_obj_t *pobj)
{
- if ((*obj)->type != HWLOC_OBJ_NODE && hwloc_cpuset_iszero((*obj)->cpuset)) {
+ hwloc_obj_t obj = *pobj, child, *pchild;
+
+ for_each_child_safe(child, obj, pchild)
+ remove_empty(topology, pchild);
+
+ if (obj->type != HWLOC_OBJ_NODE
+ && obj->cpuset
+ && hwloc_cpuset_iszero(obj->cpuset)) {
/* Remove empty children */
- traverse(topology, obj, NULL, NULL, do_free_object, NULL);
- *obj = (*obj)->next_sibling;
+ hwloc_debug("%s", "\nRemoving empty object ");
+ print_object(topology, 0, obj);
+ do_free_object(pobj);
}
}
/*
- * Merge with the only child if either the father or the child has a type to be
+ * Merge with the only child if either the parent or the child has a type to be
* ignored while keeping structure
*/
static void
-merge_useless_child(hwloc_topology_t topology, hwloc_obj_t *pfather, void *data)
+merge_useless_child(hwloc_topology_t topology, hwloc_obj_t *pparent)
{
- hwloc_obj_t father = *pfather, child = father->first_child;
- if (child->next_sibling)
- /* There are several children, it's useful to keep them. */
+ hwloc_obj_t parent = *pparent, child, *pchild;
+
+ for_each_child_safe(child, parent, pchild)
+ merge_useless_child(topology, pchild);
+
+ child = parent->first_child;
+ if (!child || child->next_sibling)
+ /* There are no or several children, it's useful to keep them. */
return;
/* TODO: have a preference order? */
- if (topology->ignored_types[father->type] == HWLOC_IGNORE_TYPE_KEEP_STRUCTURE) {
- /* Father can be ignored in favor of the child. */
- *pfather = child;
- child->next_sibling = father->next_sibling;
- free_object(father);
+ if (topology->ignored_types[parent->type] == HWLOC_IGNORE_TYPE_KEEP_STRUCTURE) {
+ /* Parent can be ignored in favor of the child. */
+ hwloc_debug("%s", "\nIgnoring parent ");
+ print_object(topology, 0, parent);
+ *pparent = child;
+ child->next_sibling = parent->next_sibling;
+ free_object(parent);
} else if (topology->ignored_types[child->type] == HWLOC_IGNORE_TYPE_KEEP_STRUCTURE) {
- /* Child can be ignored in favor of the father. */
- father->first_child = child->first_child;
+ /* Child can be ignored in favor of the parent. */
+ hwloc_debug("%s", "\nIgnoring child ");
+ print_object(topology, 0, child);
+ parent->first_child = child->first_child;
free_object(child);
}
}
@@ -784,32 +1266,32 @@
* Initialize handy pointers in the whole topology
*/
static void
-hwloc_connect(hwloc_obj_t father)
+hwloc_connect(hwloc_obj_t parent)
{
unsigned n;
hwloc_obj_t child, prev_child = NULL;
- for (n = 0, child = father->first_child;
+ for (n = 0, child = parent->first_child;
child;
n++, prev_child = child, child = child->next_sibling) {
- child->father = father;
+ child->parent = parent;
child->sibling_rank = n;
child->prev_sibling = prev_child;
}
- father->last_child = prev_child;
+ parent->last_child = prev_child;
- father->arity = n;
+ parent->arity = n;
+ free(parent->children);
if (!n) {
- father->children = NULL;
+ parent->children = NULL;
return;
}
- father->children = malloc(n * sizeof(*father->children));
- assert(father->children);
- for (n = 0, child = father->first_child;
+ parent->children = malloc(n * sizeof(*parent->children));
+ for (n = 0, child = parent->first_child;
child;
n++, child = child->next_sibling) {
- father->children[n] = child;
+ parent->children[n] = child;
hwloc_connect(child);
}
}
@@ -836,43 +1318,79 @@
* Empty binding hooks always returning success
*/
-static int dontset_cpubind(hwloc_topology_t topology, hwloc_cpuset_t set, int strict)
+static int dontset_thisthread_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set __hwloc_attribute_unused, int policy __hwloc_attribute_unused)
{
return 0;
}
-static int dontset_thisproc_cpubind(hwloc_topology_t topology, hwloc_cpuset_t set, int strict)
+static int dontget_thisthread_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_cpuset_t set, int policy __hwloc_attribute_unused)
{
+ hwloc_cpuset_copy(set, hwloc_topology_get_complete_cpuset(topology));
return 0;
}
-static int dontset_thisthread_cpubind(hwloc_topology_t topology, hwloc_cpuset_t set, int strict)
+static int dontset_thisproc_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t set __hwloc_attribute_unused, int policy __hwloc_attribute_unused)
{
return 0;
}
-static int dontset_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int strict)
+static int dontget_thisproc_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_cpuset_t set, int policy __hwloc_attribute_unused)
{
+ hwloc_const_cpuset_t cpuset = hwloc_topology_get_complete_cpuset(topology);
+ if (cpuset) {
+ hwloc_cpuset_copy(set,cpuset);
+ return 0;
+ } else
+ return -1;
+}
+static int dontset_proc_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_pid_t pid __hwloc_attribute_unused, hwloc_const_cpuset_t set __hwloc_attribute_unused, int policy __hwloc_attribute_unused)
+{
return 0;
}
+static int dontget_proc_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_pid_t pid __hwloc_attribute_unused, hwloc_cpuset_t cpuset, int policy __hwloc_attribute_unused)
+{
+ hwloc_cpuset_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
+ return 0;
+}
#ifdef hwloc_thread_t
-static int dontset_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_cpuset_t set, int strict)
+static int dontset_thread_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_thread_t tid __hwloc_attribute_unused, hwloc_const_cpuset_t set __hwloc_attribute_unused, int policy __hwloc_attribute_unused)
{
return 0;
}
+static int dontget_thread_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_thread_t tid __hwloc_attribute_unused, hwloc_cpuset_t cpuset, int policy __hwloc_attribute_unused)
+{
+ hwloc_cpuset_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
+ return 0;
+}
#endif
+static void alloc_cpusets(hwloc_obj_t obj)
+{
+ obj->cpuset = hwloc_cpuset_alloc();
+ obj->complete_cpuset = hwloc_cpuset_alloc();
+ obj->online_cpuset = hwloc_cpuset_alloc();
+ obj->allowed_cpuset = hwloc_cpuset_alloc();
+ obj->nodeset = hwloc_cpuset_alloc();
+ obj->complete_nodeset = hwloc_cpuset_alloc();
+ obj->allowed_nodeset = hwloc_cpuset_alloc();
+ hwloc_cpuset_fill(obj->cpuset);
+ hwloc_cpuset_zero(obj->complete_cpuset);
+ hwloc_cpuset_fill(obj->online_cpuset);
+ hwloc_cpuset_fill(obj->allowed_cpuset);
+ hwloc_cpuset_zero(obj->nodeset);
+ hwloc_cpuset_zero(obj->complete_nodeset);
+ hwloc_cpuset_fill(obj->allowed_nodeset);
+}
/* Main discovery loop */
-static void
+static int
hwloc_discover(struct hwloc_topology *topology)
{
unsigned l, i=0, taken_i, new_i, j;
hwloc_obj_t *objs, *taken_objs, *new_objs, top_obj;
unsigned n_objs, n_taken_objs, n_new_objs;
- assert(topology!=NULL);
-
if (topology->backend_type == HWLOC_BACKEND_SYNTHETIC) {
+ alloc_cpusets(topology->levels[0][0]);
hwloc_look_synthetic(topology);
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
} else if (topology->backend_type == HWLOC_BACKEND_XML) {
hwloc_look_xml(topology);
#endif
@@ -881,85 +1399,152 @@
/* Raw detection, from coarser levels to finer levels for more efficiency. */
/* hwloc_look_* functions should use hwloc_obj_add to add objects initialized
- * through hwloc_alloc_setup_object. For node levels, memory_Kb and huge_page_free
- * must be initialized. For cache levels, memory_kB and attr->cache.depth must be
- * initialized, for misc levels, attr->misc.depth must be initialized
+ * through hwloc_alloc_setup_object. For node levels, nodeset, memory_Kb and
+ * huge_page_free must be initialized. For cache levels, memory_kB and
+ * attr->cache.depth must be initialized. For misc levels, attr->misc.depth
+ * must be initialized.
*/
- /* There must be at least a PROC object for each logical processor, at worse
- * produced by hwloc_setup_proc_level()
+ /* There must be at least a PU object for each logical processor, at worse
+ * produced by hwloc_setup_pu_level()
*/
+ /* To be able to just use hwloc_insert_object_by_cpuset to insert the object
+ * in the topology according to the cpuset, the cpuset field must be
+ * initialized.
+ */
+
/* If the OS can provide NUMA distances, it should call
* hwloc_setup_misc_level_from_distances() to automatically group NUMA nodes
* into misc objects.
*/
+ /* A priori, All processors are visible in the topology, online, and allowed
+ * for the application.
+ *
+ * - If some processors exist but topology information is unknown for them
+ * (and thus the backend couldn't create objects for them), they should be
+ * added to the complete_cpuset field of the lowest object where the object
+ * could reside.
+ *
+ * - If some processors are not online, they should be dropped from the
+ * online_cpuset field.
+ *
+ * - If some processors are not allowed for the application (e.g. for
+ * administration reasons), they should be dropped from the allowed_cpuset
+ * field.
+ *
+ * The same applies to the node sets complete_nodeset and allowed_cpuset.
+ *
+ * If such field doesn't exist yet, it can be allocated, and initialized to
+ * zero (for complete), or to full (for online and allowed). The values are
+ * automatically propagated to the whole tree after detection.
+ *
+ * Here, we only allocate cpusets for the root object.
+ */
+
+ alloc_cpusets(topology->levels[0][0]);
+
/* Each OS type should also fill the bind functions pointers, at least the
* set_cpubind one
*/
-# ifdef LINUX_SYS
+# ifdef HWLOC_LINUX_SYS
# define HAVE_OS_SUPPORT
hwloc_look_linux(topology);
-# endif /* LINUX_SYS */
+# endif /* HWLOC_LINUX_SYS */
-# ifdef AIX_SYS
+# ifdef HWLOC_AIX_SYS
# define HAVE_OS_SUPPORT
hwloc_look_aix(topology);
-# endif /* AIX_SYS */
+# endif /* HWLOC_AIX_SYS */
-# ifdef OSF_SYS
+# ifdef HWLOC_OSF_SYS
# define HAVE_OS_SUPPORT
hwloc_look_osf(topology);
-# endif /* OSF_SYS */
+# endif /* HWLOC_OSF_SYS */
-# ifdef SOLARIS_SYS
+# ifdef HWLOC_SOLARIS_SYS
# define HAVE_OS_SUPPORT
hwloc_look_solaris(topology);
-# endif /* SOLARIS_SYS */
+# endif /* HWLOC_SOLARIS_SYS */
-# ifdef WIN_SYS
+# ifdef HWLOC_WIN_SYS
# define HAVE_OS_SUPPORT
hwloc_look_windows(topology);
-# endif /* WIN_SYS */
+# endif /* HWLOC_WIN_SYS */
-# ifdef DARWIN_SYS
+# ifdef HWLOC_DARWIN_SYS
# define HAVE_OS_SUPPORT
hwloc_look_darwin(topology);
-# endif /* DARWIN_SYS */
+# endif /* HWLOC_DARWIN_SYS */
-# ifdef HPUX_SYS
+# ifdef HWLOC_FREEBSD_SYS
# define HAVE_OS_SUPPORT
+ hwloc_look_freebsd(topology);
+# endif /* HWLOC_FREEBSD_SYS */
+
+# ifdef HWLOC_HPUX_SYS
+# define HAVE_OS_SUPPORT
hwloc_look_hpux(topology);
-# endif /* HPUX_SYS */
+# endif /* HWLOC_HPUX_SYS */
# ifndef HAVE_OS_SUPPORT
- hwloc_setup_proc_level(topology, hwloc_fallback_nbprocessors (), NULL);
+ hwloc_setup_pu_level(topology, hwloc_fallback_nbprocessors(topology));
# endif /* Unsupported OS */
}
print_objects(topology, 0, topology->levels[0][0]);
/* First tweak a bit to clean the topology. */
+ hwloc_debug("%s", "\nRestrict topology cpusets to existing PU and NODE objects\n");
+ collect_proc_cpuset(topology->levels[0][0], NULL);
- hwloc_debug("\nComputing the system cpuset by ORing all Proc objects\n");
- hwloc_cpuset_zero(topology->levels[0][0]->cpuset);
- traverse(topology, &topology->levels[0][0], NULL, get_proc_cpuset, NULL, topology->levels[0][0]->cpuset);
+ hwloc_debug("%s", "\nPropagate offline and disallowed cpus down and up\n");
+ propagate_unused_cpuset(topology->levels[0][0], NULL);
- hwloc_debug("\nApplying the system cpuset to all nodes\n");
- traverse(topology, &topology->levels[0][0], apply_cpuset, apply_cpuset, NULL, topology->levels[0][0]->cpuset);
+ if (topology->levels[0][0]->complete_nodeset && hwloc_cpuset_iszero(topology->levels[0][0]->complete_nodeset)) {
+ /* No nodeset, drop all of them */
+ hwloc_cpuset_free(topology->levels[0][0]->nodeset);
+ topology->levels[0][0]->nodeset = NULL;
+ hwloc_cpuset_free(topology->levels[0][0]->complete_nodeset);
+ topology->levels[0][0]->complete_nodeset = NULL;
+ hwloc_cpuset_free(topology->levels[0][0]->allowed_nodeset);
+ topology->levels[0][0]->allowed_nodeset = NULL;
+ }
+ hwloc_debug("%s", "\nPropagate nodesets\n");
+ propagate_nodeset(topology->levels[0][0], NULL);
+ propagate_nodesets(topology->levels[0][0]);
- hwloc_debug("\nRemoving empty objects except numa nodes\n");
- traverse(topology, &topology->levels[0][0], remove_empty, remove_empty, NULL, NULL);
+ print_objects(topology, 0, topology->levels[0][0]);
+ if (!(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM)) {
+ hwloc_debug("%s", "\nRemoving unauthorized and offline cpusets from all cpusets\n");
+ remove_unused_cpusets(topology->levels[0][0]);
+
+ hwloc_debug("%s", "\nRemoving disallowed memory according to nodesets\n");
+ apply_nodeset(topology->levels[0][0], NULL);
+
+ print_objects(topology, 0, topology->levels[0][0]);
+ }
+
+ hwloc_debug("%s", "\nRemoving ignored objects\n");
+ remove_ignored(topology, &topology->levels[0][0]);
+
print_objects(topology, 0, topology->levels[0][0]);
- hwloc_debug("\nRemoving objects whose type has HWLOC_IGNORE_TYPE_KEEP_STRUCTURE and have only one child or are the only child\n");
- traverse(topology, &topology->levels[0][0], NULL, NULL, merge_useless_child, NULL);
+ hwloc_debug("%s", "\nRemoving empty objects except numa nodes and PCI devices\n");
+ remove_empty(topology, &topology->levels[0][0]);
- hwloc_debug("\nOk, finished tweaking, now connect\n");
+ print_objects(topology, 0, topology->levels[0][0]);
+ hwloc_debug("%s", "\nRemoving objects whose type has HWLOC_IGNORE_TYPE_KEEP_STRUCTURE and have only one child or are the only child\n");
+ merge_useless_child(topology, &topology->levels[0][0]);
+
+ print_objects(topology, 0, topology->levels[0][0]);
+
+ hwloc_debug("%s", "\nOk, finished tweaking, now connect\n");
+
/* Now connect handy pointers. */
hwloc_connect(topology->levels[0][0]);
@@ -971,21 +1556,30 @@
/* initialize all depth to unknown */
for (l=1; l < HWLOC_OBJ_TYPE_MAX; l++)
topology->type_depth[l] = HWLOC_TYPE_DEPTH_UNKNOWN;
- topology->type_depth[HWLOC_OBJ_SYSTEM] = 0;
+ topology->type_depth[topology->levels[0][0]->type] = 0;
/* Start with children of the whole system. */
l = 0;
n_objs = topology->levels[0][0]->arity;
objs = malloc(n_objs * sizeof(objs[0]));
- assert(objs);
+ if (!objs) {
+ errno = ENOMEM;
+ hwloc_topology_clear(topology);
+ return -1;
+ }
memcpy(objs, topology->levels[0][0]->children, n_objs * sizeof(objs[0]));
/* Keep building levels while there are objects left in OBJS. */
while (n_objs) {
- /* First find which type of object is the topmost. */
- top_obj = objs[0];
- for (i = 1; i < n_objs; i++) {
+ /* First find which type of object is the topmost.
+ * Don't use PU if there are other types since we want to keep PU at the bottom.
+ */
+ for (i = 0; i < n_objs; i++)
+ if (objs[i]->type != HWLOC_OBJ_PU)
+ break;
+ top_obj = i == n_objs ? objs[0] : objs[i];
+ for (i = 0; i < n_objs; i++) {
if (hwloc_type_cmp(top_obj, objs[i]) != HWLOC_TYPE_EQUAL) {
if (find_same_type(objs[i], top_obj)) {
/* OBJS[i] is strictly above an object of the same type as TOP_OBJ, so it
@@ -1025,9 +1619,11 @@
new_objs[new_i++] = objs[i];
+#ifdef HWLOC_DEBUG
/* Make sure we didn't mess up. */
assert(taken_i == n_taken_objs);
assert(new_i == n_objs - n_taken_objs + n_new_objs);
+#endif
/* Ok, put numbers in the level. */
for (i = 0; i < n_taken_objs; i++) {
@@ -1041,10 +1637,10 @@
/* One more level! */
if (top_obj->type == HWLOC_OBJ_CACHE)
- hwloc_debug("--- Cache level depth %d", top_obj->attr->cache.depth);
+ hwloc_debug("--- Cache level depth %u", top_obj->attr->cache.depth);
else
hwloc_debug("--- %s level", hwloc_obj_type_string(top_obj->type));
- hwloc_debug(" has number %d\n\n", topology->nb_levels);
+ hwloc_debug(" has number %u\n\n", topology->nb_levels);
if (topology->type_depth[top_obj->type] == HWLOC_TYPE_DEPTH_UNKNOWN)
topology->type_depth[top_obj->type] = topology->nb_levels;
@@ -1066,54 +1662,101 @@
/* It's empty now. */
free(objs);
+ /* accumulate children memory in total_memory fields (only once parent is set) */
+ hwloc_debug("%s", "\nPropagate total memory up\n");
+ propagate_total_memory(topology->levels[0][0]);
+
if (topology->flags & HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM)
topology->is_thissystem = 1;
if (topology->is_thissystem) {
-# ifdef LINUX_SYS
+# ifdef HWLOC_LINUX_SYS
hwloc_set_linux_hooks(topology);
-# endif /* LINUX_SYS */
+# endif /* HWLOC_LINUX_SYS */
-# ifdef AIX_SYS
+# ifdef HWLOC_AIX_SYS
hwloc_set_aix_hooks(topology);
-# endif /* AIX_SYS */
+# endif /* HWLOC_AIX_SYS */
-# ifdef OSF_SYS
+# ifdef HWLOC_OSF_SYS
hwloc_set_osf_hooks(topology);
-# endif /* OSF_SYS */
+# endif /* HWLOC_OSF_SYS */
-# ifdef SOLARIS_SYS
+# ifdef HWLOC_SOLARIS_SYS
hwloc_set_solaris_hooks(topology);
-# endif /* SOLARIS_SYS */
+# endif /* HWLOC_SOLARIS_SYS */
-# ifdef WIN_SYS
+# ifdef HWLOC_WIN_SYS
hwloc_set_windows_hooks(topology);
-# endif /* WIN_SYS */
+# endif /* HWLOC_WIN_SYS */
-# ifdef DARWIN_SYS
+# ifdef HWLOC_DARWIN_SYS
hwloc_set_darwin_hooks(topology);
-# endif /* DARWIN_SYS */
+# endif /* HWLOC_DARWIN_SYS */
-# ifdef HPUX_SYS
+# ifdef HWLOC_FREEBSD_SYS
+ hwloc_set_freebsd_hooks(topology);
+# endif /* HWLOC_FREEBSD_SYS */
+
+# ifdef HWLOC_HPUX_SYS
hwloc_set_hpux_hooks(topology);
-# endif /* HPUX_SYS */
+# endif /* HWLOC_HPUX_SYS */
} else {
- topology->set_cpubind = dontset_cpubind;
+ topology->set_thisproc_cpubind = dontset_thisproc_cpubind;
+ topology->get_thisproc_cpubind = dontget_thisproc_cpubind;
+ topology->set_thisthread_cpubind = dontset_thisthread_cpubind;
+ topology->get_thisthread_cpubind = dontget_thisthread_cpubind;
topology->set_proc_cpubind = dontset_proc_cpubind;
+ topology->get_proc_cpubind = dontget_proc_cpubind;
#ifdef hwloc_thread_t
topology->set_thread_cpubind = dontset_thread_cpubind;
+ topology->get_thread_cpubind = dontget_thread_cpubind;
#endif
- topology->set_thisproc_cpubind = dontset_thisproc_cpubind;
- topology->set_thisthread_cpubind = dontset_thisthread_cpubind;
}
+
+ /* if not is_thissystem, set_cpubind is fake
+ * and get_cpubind returns the whole system cpuset,
+ * so don't report that set/get_cpubind as supported
+ */
+ if (topology->is_thissystem) {
+#define DO(kind) \
+ if (topology->kind) \
+ topology->support.cpubind->kind = 1;
+ DO(set_thisproc_cpubind);
+ DO(get_thisproc_cpubind);
+ DO(set_proc_cpubind);
+ DO(get_proc_cpubind);
+ DO(set_thisthread_cpubind);
+ DO(get_thisthread_cpubind);
+ DO(set_thread_cpubind);
+ DO(get_thread_cpubind);
+ }
+
+ return 0;
}
+/* To be before discovery is actually launched,
+ * Resets everything in case a previous load initialized some stuff.
+ */
static void
hwloc_topology_setup_defaults(struct hwloc_topology *topology)
{
- struct hwloc_obj *system_obj;
+ struct hwloc_obj *root_obj;
int i;
+ /* reset support */
+ topology->set_thisproc_cpubind = NULL;
+ topology->get_thisproc_cpubind = NULL;
+ topology->set_thisthread_cpubind = NULL;
+ topology->get_thisthread_cpubind = NULL;
+ topology->set_proc_cpubind = NULL;
+ topology->get_proc_cpubind = NULL;
+#ifdef hwloc_thread_t
+ topology->set_thread_cpubind = NULL;
+ topology->get_thread_cpubind = NULL;
+#endif
+ memset(topology->support.discovery, 0, sizeof(*topology->support.discovery));
+ memset(topology->support.cpubind, 0, sizeof(*topology->support.cpubind));
/* No objects by default but System on top by default */
memset(topology->level_nbobjects, 0, sizeof(topology->level_nbobjects));
@@ -1122,25 +1765,16 @@
topology->nb_levels = 1; /* there's at least SYSTEM */
topology->levels[0] = malloc (sizeof (struct hwloc_obj));
topology->level_nbobjects[0] = 1;
- topology->type_depth[HWLOC_OBJ_SYSTEM] = 0;
- /* Create the actual System object */
- system_obj = hwloc_alloc_setup_object(HWLOC_OBJ_SYSTEM, 0);
- system_obj->cpuset = hwloc_cpuset_alloc();
- system_obj->depth = 0;
- system_obj->logical_index = 0;
- system_obj->sibling_rank = 0;
- system_obj->attr->system.memory_kB = 0;
- system_obj->attr->system.huge_page_free = 0;
-#ifdef HAVE__SC_LARGE_PAGESIZE
- system_obj->attr->system.huge_page_size_kB = sysconf(_SC_LARGE_PAGESIZE);
-#else /* HAVE__SC_LARGE_PAGESIZE */
- system_obj->attr->system.huge_page_size_kB = 0;
-#endif /* HAVE__SC_LARGE_PAGESIZE */
- system_obj->attr->system.dmi_board_vendor = NULL;
- system_obj->attr->system.dmi_board_name = NULL;
- hwloc_cpuset_fill(system_obj->cpuset);
- topology->levels[0][0] = system_obj;
+ /* Create the actual machine object, but don't touch its attributes yet
+ * since the OS backend may still change the object into something else
+ * (for instance System)
+ */
+ root_obj = hwloc_alloc_setup_object(HWLOC_OBJ_MACHINE, 0);
+ root_obj->depth = 0;
+ root_obj->logical_index = 0;
+ root_obj->sibling_rank = 0;
+ topology->levels[0][0] = root_obj;
}
int
@@ -1158,17 +1792,15 @@
topology->flags = 0;
topology->is_thissystem = 1;
topology->backend_type = HWLOC_BACKEND_NONE; /* backend not specified by default */
- topology->set_cpubind = NULL;
- topology->set_proc_cpubind = NULL;
-#ifdef hwloc_thread_t
- topology->set_thread_cpubind = NULL;
-#endif
- topology->set_thisproc_cpubind = NULL;
- topology->set_thisthread_cpubind = NULL;
+ topology->pid = 0;
+
+ topology->support.discovery = malloc(sizeof(*topology->support.discovery));
+ topology->support.cpubind = malloc(sizeof(*topology->support.cpubind));
+
/* Only ignore useless cruft by default */
for(i=0; i< HWLOC_OBJ_TYPE_MAX; i++)
topology->ignored_types[i] = HWLOC_IGNORE_TYPE_NEVER;
- topology->ignored_types[HWLOC_OBJ_MISC] = HWLOC_IGNORE_TYPE_KEEP_STRUCTURE;
+ topology->ignored_types[HWLOC_OBJ_GROUP] = HWLOC_IGNORE_TYPE_KEEP_STRUCTURE;
/* Make the topology look like something coherent but empty */
hwloc_topology_setup_defaults(topology);
@@ -1181,12 +1813,12 @@
hwloc_backend_exit(struct hwloc_topology *topology)
{
switch (topology->backend_type) {
-#ifdef LINUX_SYS
+#ifdef HWLOC_LINUX_SYS
case HWLOC_BACKEND_SYSFS:
hwloc_backend_sysfs_exit(topology);
break;
#endif
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
case HWLOC_BACKEND_XML:
hwloc_backend_xml_exit(topology);
break;
@@ -1202,20 +1834,33 @@
}
int
-hwloc_topology_set_fsroot(struct hwloc_topology *topology, const char *fsroot_path)
+hwloc_topology_set_fsroot(struct hwloc_topology *topology, const char *fsroot_path __hwloc_attribute_unused)
{
/* cleanup existing backend */
hwloc_backend_exit(topology);
-#ifdef LINUX_SYS
+#ifdef HWLOC_LINUX_SYS
if (hwloc_backend_sysfs_init(topology, fsroot_path) < 0)
return -1;
-#endif /* LINUX_SYS */
+#endif /* HWLOC_LINUX_SYS */
return 0;
}
int
+hwloc_topology_set_pid(struct hwloc_topology *topology __hwloc_attribute_unused,
+ hwloc_pid_t pid __hwloc_attribute_unused)
+{
+#ifdef HWLOC_LINUX_SYS
+ topology->pid = pid;
+ return 0;
+#else /* HWLOC_LINUX_SYS */
+ errno = ENOSYS;
+ return -1;
+#endif /* HWLOC_LINUX_SYS */
+}
+
+int
hwloc_topology_set_synthetic(struct hwloc_topology *topology, const char *description)
{
/* cleanup existing backend */
@@ -1225,16 +1870,18 @@
}
int
-hwloc_topology_set_xml(struct hwloc_topology *topology, const char *xmlpath)
+hwloc_topology_set_xml(struct hwloc_topology *topology __hwloc_attribute_unused,
+ const char *xmlpath __hwloc_attribute_unused)
{
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
/* cleanup existing backend */
hwloc_backend_exit(topology);
return hwloc_backend_xml_init(topology, xmlpath);
-#else /* HAVE_XML */
+#else /* HWLOC_HAVE_XML */
+ errno = ENOSYS;
return -1;
-#endif /* !HAVE_XML */
+#endif /* !HWLOC_HAVE_XML */
}
int
@@ -1247,17 +1894,17 @@
int
hwloc_topology_ignore_type(struct hwloc_topology *topology, hwloc_obj_type_t type)
{
- if (type >= HWLOC_OBJ_TYPE_MAX)
+ if (type >= HWLOC_OBJ_TYPE_MAX) {
+ errno = EINVAL;
return -1;
+ }
- if (type == HWLOC_OBJ_SYSTEM)
- /* we don't want 2 heads */
+ if (type == HWLOC_OBJ_PU) {
+ /* we need the PU level */
+ errno = EINVAL;
return -1;
+ }
- if (type == HWLOC_OBJ_PROC)
- /* we need the proc level */
- return -1;
-
topology->ignored_types[type] = HWLOC_IGNORE_TYPE_ALWAYS;
return 0;
}
@@ -1265,17 +1912,17 @@
int
hwloc_topology_ignore_type_keep_structure(struct hwloc_topology *topology, hwloc_obj_type_t type)
{
- if (type >= HWLOC_OBJ_TYPE_MAX)
+ if (type >= HWLOC_OBJ_TYPE_MAX) {
+ errno = EINVAL;
return -1;
+ }
- if (type == HWLOC_OBJ_SYSTEM)
- /* we don't want 2 heads */
+ if (type == HWLOC_OBJ_PU) {
+ /* we need the PU level */
+ errno = EINVAL;
return -1;
+ }
- if (type == HWLOC_OBJ_PROC)
- /* we need the proc level */
- return -1;
-
topology->ignored_types[type] = HWLOC_IGNORE_TYPE_KEEP_STRUCTURE;
return 0;
}
@@ -1285,20 +1932,27 @@
{
unsigned type;
for(type=0; type<HWLOC_OBJ_TYPE_MAX; type++)
- if (type != HWLOC_OBJ_SYSTEM && type != HWLOC_OBJ_PROC)
+ if (type != HWLOC_OBJ_PU)
topology->ignored_types[type] = HWLOC_IGNORE_TYPE_KEEP_STRUCTURE;
return 0;
}
static void
+hwloc_topology_clear_tree (struct hwloc_topology *topology, struct hwloc_obj *root)
+{
+ unsigned i;
+ for(i=0; i<root->arity; i++)
+ hwloc_topology_clear_tree (topology, root->children[i]);
+ free_object (root);
+}
+
+static void
hwloc_topology_clear (struct hwloc_topology *topology)
{
- unsigned l,i;
- for (l=0; l<topology->nb_levels; l++) {
- for (i=0; i<topology->level_nbobjects[l]; i++)
- free_object(topology->levels[l][i]);
+ unsigned l;
+ hwloc_topology_clear_tree (topology, topology->levels[0][0]);
+ for (l=0; l<topology->nb_levels; l++)
free(topology->levels[l]);
- }
}
void
@@ -1306,6 +1960,8 @@
{
hwloc_topology_clear(topology);
hwloc_backend_exit(topology);
+ free(topology->support.discovery);
+ free(topology->support.cpubind);
free(topology);
}
@@ -1313,6 +1969,7 @@
hwloc_topology_load (struct hwloc_topology *topology)
{
char *local_env;
+ int err;
if (topology->is_loaded) {
hwloc_topology_clear(topology);
@@ -1321,7 +1978,7 @@
}
/* enforce backend anyway if a FORCE variable was given */
-#ifdef LINUX_SYS
+#ifdef HWLOC_LINUX_SYS
{
char *fsroot_path_env = getenv("HWLOC_FORCE_FSROOT");
if (fsroot_path_env) {
@@ -1330,7 +1987,7 @@
}
}
#endif
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
{
char *xmlpath_env = getenv("HWLOC_FORCE_XMLFILE");
if (xmlpath_env) {
@@ -1341,36 +1998,38 @@
#endif
/* only apply non-FORCE variables if we have not changed the backend yet */
-#ifdef LINUX_SYS
+#ifdef HWLOC_LINUX_SYS
if (topology->backend_type == HWLOC_BACKEND_NONE) {
char *fsroot_path_env = getenv("HWLOC_FSROOT");
if (fsroot_path_env)
hwloc_backend_sysfs_init(topology, fsroot_path_env);
}
#endif
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
if (topology->backend_type == HWLOC_BACKEND_NONE) {
- char *xmlpath_env = getenv("HWLOC_FORCE_XMLFILE");
+ char *xmlpath_env = getenv("HWLOC_XMLFILE");
if (xmlpath_env)
hwloc_backend_xml_init(topology, xmlpath_env);
}
#endif
- if (topology->backend_type == HWLOC_BACKEND_NONE) {
- local_env = getenv("HWLOC_THISSYSTEM");
- if (local_env)
- topology->is_thissystem = atoi(local_env);
- }
+ /* always apply non-FORCE THISSYSTEM since it was explicitly designed to override setups from other backends */
+ local_env = getenv("HWLOC_THISSYSTEM");
+ if (local_env)
+ topology->is_thissystem = atoi(local_env);
+
/* if we haven't chosen the backend, set the OS-specific one if needed */
if (topology->backend_type == HWLOC_BACKEND_NONE) {
-#ifdef LINUX_SYS
+#ifdef HWLOC_LINUX_SYS
if (hwloc_backend_sysfs_init(topology, "/") < 0)
return -1;
#endif
}
/* actual topology discovery */
- hwloc_discover(topology);
+ err = hwloc_discover(topology);
+ if (err < 0)
+ return err;
/* enforce THISSYSTEM if given in a FORCE variable */
local_env = getenv("HWLOC_FORCE_THISSYSTEM");
@@ -1398,56 +2057,62 @@
return topology->nb_levels;
}
-
-/* check children between a father object */
+/* check children between a parent object */
static void
-hwloc__check_children(struct hwloc_topology *topology, struct hwloc_obj *father)
+hwloc__check_children(struct hwloc_obj *parent)
{
- hwloc_cpuset_t remaining_father_set;
- int j;
+ hwloc_cpuset_t remaining_parent_set;
+ unsigned j;
- if (!father->arity) {
- /* check whether that father has no children for real */
- assert(!father->children);
- assert(!father->first_child);
- assert(!father->last_child);
+ if (!parent->arity) {
+ /* check whether that parent has no children for real */
+ assert(!parent->children);
+ assert(!parent->first_child);
+ assert(!parent->last_child);
return;
}
- /* check whether that father has children for real */
- assert(father->children);
- assert(father->first_child);
- assert(father->last_child);
+ /* check whether that parent has children for real */
+ assert(parent->children);
+ assert(parent->first_child);
+ assert(parent->last_child);
/* first child specific checks */
- assert(father->first_child->sibling_rank == 0);
- assert(father->first_child == father->children[0]);
- assert(father->first_child->prev_sibling == NULL);
+ assert(parent->first_child->sibling_rank == 0);
+ assert(parent->first_child == parent->children[0]);
+ assert(parent->first_child->prev_sibling == NULL);
/* last child specific checks */
- assert(father->last_child->sibling_rank == father->arity-1);
- assert(father->last_child == father->children[father->arity-1]);
- assert(father->last_child->next_sibling == NULL);
+ assert(parent->last_child->sibling_rank == parent->arity-1);
+ assert(parent->last_child == parent->children[parent->arity-1]);
+ assert(parent->last_child->next_sibling == NULL);
- remaining_father_set = hwloc_cpuset_dup(father->cpuset);
- for(j=0; j<father->arity; j++) {
- /* check that child cpuset is included in the father */
- assert(hwloc_cpuset_isincluded(father->children[j]->cpuset, remaining_father_set));
- /* check that children are correctly ordered (see below), empty ones may be anywhere */
- if (!hwloc_cpuset_iszero(father->children[j]->cpuset))
- assert(hwloc_cpuset_first(father->children[j]->cpuset) == hwloc_cpuset_first(remaining_father_set));
- /* clear previously used father cpuset bits so that we actually checked above
- * that children cpusets do not intersect and are ordered properly
- */
- hwloc_cpuset_clearset(remaining_father_set, father->children[j]->cpuset);
+ if (parent->cpuset) {
+ remaining_parent_set = hwloc_cpuset_dup(parent->cpuset);
+ for(j=0; j<parent->arity; j++) {
+ if (!parent->children[j]->cpuset)
+ continue;
+ /* check that child cpuset is included in the parent */
+ assert(hwloc_cpuset_isincluded(parent->children[j]->cpuset, remaining_parent_set));
+ /* check that children are correctly ordered (see below), empty ones may be anywhere */
+ if (!hwloc_cpuset_iszero(parent->children[j]->cpuset)) {
+ int firstchild = hwloc_cpuset_first(parent->children[j]->cpuset);
+ int firstparent = hwloc_cpuset_first(remaining_parent_set);
+ assert(firstchild == firstparent);
+ }
+ /* clear previously used parent cpuset bits so that we actually checked above
+ * that children cpusets do not intersect and are ordered properly
+ */
+ hwloc_cpuset_andnot(remaining_parent_set, remaining_parent_set, parent->children[j]->cpuset);
+ }
+ assert(hwloc_cpuset_iszero(remaining_parent_set));
+ hwloc_cpuset_free(remaining_parent_set);
}
- assert(hwloc_cpuset_iszero(remaining_father_set));
- free(remaining_father_set);
/* checks for all children */
- for(j=1; j<father->arity; j++) {
- assert(father->children[j]->sibling_rank == j);
- assert(father->children[j-1]->next_sibling == father->children[j]);
- assert(father->children[j]->prev_sibling == father->children[j-1]);
+ for(j=1; j<parent->arity; j++) {
+ assert(parent->children[j]->sibling_rank == j);
+ assert(parent->children[j-1]->next_sibling == parent->children[j]);
+ assert(parent->children[j]->prev_sibling == parent->children[j-1]);
}
}
@@ -1456,32 +2121,28 @@
hwloc_topology_check(struct hwloc_topology *topology)
{
struct hwloc_obj *obj;
- int i,j;
hwloc_obj_type_t type;
- unsigned depth;
+ unsigned i, j, depth;
/* check type orders */
- for (type = HWLOC_OBJ_SYSTEM; type < HWLOC_OBJ_TYPE_MAX; type++)
+ for (type = HWLOC_OBJ_SYSTEM; type < HWLOC_OBJ_TYPE_MAX; type++) {
assert(hwloc_get_order_type(hwloc_get_type_order(type)) == type);
- for (i = hwloc_get_order_type(HWLOC_OBJ_SYSTEM); i <= hwloc_get_order_type(HWLOC_OBJ_CORE); i++)
- assert(hwloc_get_type_order(hwloc_get_order_type(i)) == i);
-
- /* check that first level is SYSTEM */
- assert(hwloc_get_depth_type(topology, 0) == HWLOC_OBJ_SYSTEM);
- /* check that last level is PROC */
- assert(hwloc_get_depth_type(topology, hwloc_topology_get_depth(topology)-1) == HWLOC_OBJ_PROC);
- /* check that other levels are neither PROC nor SYSTEM */
- for(i=1; i<hwloc_topology_get_depth(topology)-1; i++) {
- assert(hwloc_get_depth_type(topology, i) != HWLOC_OBJ_SYSTEM);
- assert(hwloc_get_depth_type(topology, i) != HWLOC_OBJ_PROC);
}
+ for (i = hwloc_get_type_order(HWLOC_OBJ_SYSTEM);
+ i <= hwloc_get_type_order(HWLOC_OBJ_CORE); i++) {
+ assert(i == hwloc_get_type_order(hwloc_get_order_type(i)));
+ }
+ /* check that last level is PU */
+ assert(hwloc_get_depth_type(topology, hwloc_topology_get_depth(topology)-1) == HWLOC_OBJ_PU);
+ /* check that other levels are not PU */
+ for(i=1; i<hwloc_topology_get_depth(topology)-1; i++)
+ assert(hwloc_get_depth_type(topology, i) != HWLOC_OBJ_PU);
+
/* top-level specific checks */
assert(hwloc_get_nbobjs_by_depth(topology, 0) == 1);
- obj = hwloc_get_system_obj(topology);
+ obj = hwloc_get_root_obj(topology);
assert(obj);
- /* top-level object must be SYSTEM */
- assert(obj->type == HWLOC_OBJ_SYSTEM);
depth = hwloc_topology_get_depth(topology);
@@ -1503,8 +2164,22 @@
assert(prev->next_cousin == obj);
assert(obj->prev_cousin == prev);
}
+ if (obj->complete_cpuset) {
+ if (obj->cpuset)
+ assert(hwloc_cpuset_isincluded(obj->cpuset, obj->complete_cpuset));
+ if (obj->online_cpuset)
+ assert(hwloc_cpuset_isincluded(obj->online_cpuset, obj->complete_cpuset));
+ if (obj->allowed_cpuset)
+ assert(hwloc_cpuset_isincluded(obj->allowed_cpuset, obj->complete_cpuset));
+ }
+ if (obj->complete_nodeset) {
+ if (obj->nodeset)
+ assert(hwloc_cpuset_isincluded(obj->nodeset, obj->complete_nodeset));
+ if (obj->allowed_nodeset)
+ assert(hwloc_cpuset_isincluded(obj->allowed_nodeset, obj->complete_nodeset));
+ }
/* check children */
- hwloc__check_children(topology, obj);
+ hwloc__check_children(obj);
prev = obj;
}
@@ -1515,8 +2190,8 @@
/* check type */
assert(hwloc_get_depth_type(topology, i) == obj->type);
- assert(hwloc_get_type_depth(topology, obj->type) == i
- || hwloc_get_type_depth(topology, obj->type) == HWLOC_TYPE_DEPTH_MULTIPLE);
+ assert(i == (unsigned) hwloc_get_type_depth(topology, obj->type) ||
+ HWLOC_TYPE_DEPTH_MULTIPLE == hwloc_get_type_depth(topology, obj->type));
/* check last object of the level */
obj = hwloc_get_obj_by_depth(topology, i, width-1);
@@ -1533,9 +2208,13 @@
for(j=0; j<hwloc_get_nbobjs_by_depth(topology, depth-1); j++) {
obj = hwloc_get_obj_by_depth(topology, depth-1, j);
assert(obj);
- assert(obj->arity == 0);
- assert(obj->children == NULL);
- /* bottom-level object must always be PROC */
- assert(obj->type == HWLOC_OBJ_PROC);
+ /* bottom-level object must always be PU */
+ assert(obj->type == HWLOC_OBJ_PU);
}
}
+
+const struct hwloc_topology_support *
+hwloc_topology_get_support(struct hwloc_topology * topology)
+{
+ return &topology->support;
+}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/traversal.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/traversal.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/src/traversal.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -7,10 +7,9 @@
#include <private/config.h>
#include <hwloc.h>
#include <private/private.h>
+#include <private/misc.h>
#include <private/debug.h>
-#include <assert.h>
-
int
hwloc_get_type_depth (struct hwloc_topology *topology, hwloc_obj_type_t type)
{
@@ -21,7 +20,7 @@
hwloc_get_depth_type (hwloc_topology_t topology, unsigned depth)
{
if (depth >= topology->nb_levels)
- return HWLOC_OBJ_TYPE_MAX; /* FIXME: add an invalid value ? */
+ return (hwloc_obj_type_t) -1;
return topology->levels[depth][0]->type;
}
@@ -43,11 +42,11 @@
return topology->levels[depth][idx];
}
-int hwloc_get_closest_objs (struct hwloc_topology *topology, struct hwloc_obj *src, struct hwloc_obj **objs, int max)
+unsigned hwloc_get_closest_objs (struct hwloc_topology *topology, struct hwloc_obj *src, struct hwloc_obj **objs, unsigned max)
{
struct hwloc_obj *parent, *nextparent, **src_objs;
int i,src_nbobjects;
- int stored = 0;
+ unsigned stored = 0;
src_nbobjects = topology->level_nbobjects[src->depth];
src_objs = topology->levels[src->depth];
@@ -55,7 +54,7 @@
parent = src;
while (stored < max) {
while (1) {
- nextparent = parent->father;
+ nextparent = parent->parent;
if (!nextparent)
goto out;
if (!hwloc_cpuset_isequal(parent->cpuset, nextparent->cpuset))
@@ -80,14 +79,15 @@
}
static int
-hwloc__get_largest_objs_inside_cpuset (struct hwloc_obj *current, hwloc_cpuset_t set,
+hwloc__get_largest_objs_inside_cpuset (struct hwloc_obj *current, hwloc_const_cpuset_t set,
struct hwloc_obj ***res, int *max)
{
int gotten = 0;
- int i;
+ unsigned i;
/* the caller must ensure this */
- assert(*max > 0);
+ if (*max <= 0)
+ return 0;
if (hwloc_cpuset_isequal(current->cpuset, set)) {
**res = current;
@@ -101,15 +101,15 @@
int ret;
/* split out the cpuset part corresponding to this child and see if there's anything to do */
- hwloc_cpuset_andset(subset, current->children[i]->cpuset);
+ hwloc_cpuset_and(subset, subset, current->children[i]->cpuset);
if (hwloc_cpuset_iszero(subset)) {
- free(subset);
+ hwloc_cpuset_free(subset);
continue;
}
ret = hwloc__get_largest_objs_inside_cpuset (current->children[i], subset, res, max);
gotten += ret;
- free(subset);
+ hwloc_cpuset_free(subset);
/* if no more room to store remaining objects, return what we got so far */
if (!*max)
@@ -120,7 +120,7 @@
}
int
-hwloc_get_largest_objs_inside_cpuset (struct hwloc_topology *topology, hwloc_cpuset_t set,
+hwloc_get_largest_objs_inside_cpuset (struct hwloc_topology *topology, hwloc_const_cpuset_t set,
struct hwloc_obj **objs, int max)
{
struct hwloc_obj *current = topology->levels[0][0];
@@ -142,11 +142,12 @@
case HWLOC_OBJ_SYSTEM: return "System";
case HWLOC_OBJ_MACHINE: return "Machine";
case HWLOC_OBJ_MISC: return "Misc";
+ case HWLOC_OBJ_GROUP: return "Group";
case HWLOC_OBJ_NODE: return "NUMANode";
case HWLOC_OBJ_SOCKET: return "Socket";
case HWLOC_OBJ_CACHE: return "Cache";
case HWLOC_OBJ_CORE: return "Core";
- case HWLOC_OBJ_PROC: return "Proc";
+ case HWLOC_OBJ_PU: return "PU";
default: return "Unknown";
}
}
@@ -154,93 +155,133 @@
hwloc_obj_type_t
hwloc_obj_type_of_string (const char * string)
{
- if (!strcmp(string, "System")) return HWLOC_OBJ_SYSTEM;
- if (!strcmp(string, "Machine")) return HWLOC_OBJ_MACHINE;
- if (!strcmp(string, "Misc")) return HWLOC_OBJ_MISC;
- if (!strcmp(string, "NUMANode")) return HWLOC_OBJ_NODE;
- if (!strcmp(string, "Socket")) return HWLOC_OBJ_SOCKET;
- if (!strcmp(string, "Cache")) return HWLOC_OBJ_CACHE;
- if (!strcmp(string, "Core")) return HWLOC_OBJ_CORE;
- if (!strcmp(string, "Proc")) return HWLOC_OBJ_PROC;
- return HWLOC_OBJ_TYPE_MAX;
+ if (!strcasecmp(string, "System")) return HWLOC_OBJ_SYSTEM;
+ if (!strcasecmp(string, "Machine")) return HWLOC_OBJ_MACHINE;
+ if (!strcasecmp(string, "Misc")) return HWLOC_OBJ_MISC;
+ if (!strcasecmp(string, "Group")) return HWLOC_OBJ_GROUP;
+ if (!strcasecmp(string, "NUMANode") || !strcasecmp(string, "Node")) return HWLOC_OBJ_NODE;
+ if (!strcasecmp(string, "Socket")) return HWLOC_OBJ_SOCKET;
+ if (!strcasecmp(string, "Cache")) return HWLOC_OBJ_CACHE;
+ if (!strcasecmp(string, "Core")) return HWLOC_OBJ_CORE;
+ if (!strcasecmp(string, "PU") || !strcasecmp(string, "proc") /* backward compatiliby with 0.9 */) return HWLOC_OBJ_PU;
+ return (hwloc_obj_type_t) -1;
}
-#define hwloc_memory_size_printf_value(_size) \
- (_size) < (10*1024) ? (_size) : (_size) < (10*1024*1024) ? (_size)>>10 : (_size)>>20
-#define hwloc_memory_size_printf_unit(_size) \
- (_size) < (10*1024) ? "KB" : (_size) < (10*1024*1024) ? "MB" : "GB"
+#define hwloc_memory_size_printf_value(_size, _verbose) \
+ ((_size) < (10ULL<<20) || _verbose ? (((_size)>>9)+1)>>1 : (_size) < (10ULL<<30) ? (((_size)>>19)+1)>>1 : (((_size)>>29)+1)>>1)
+#define hwloc_memory_size_printf_unit(_size, _verbose) \
+ ((_size) < (10ULL<<20) || _verbose ? "KB" : (_size) < (10ULL<<30) ? "MB" : "GB")
int
-hwloc_obj_snprintf(char *string, size_t size,
- struct hwloc_topology *topology, struct hwloc_obj *l, const char *_indexprefix, int verbose)
+hwloc_obj_type_snprintf(char * __hwloc_restrict string, size_t size, hwloc_obj_t obj, int verbose)
{
- hwloc_obj_type_t type = l->type;
- const char *indexprefix = _indexprefix ? _indexprefix : "#";
- char os_index[12] = "";
-
- if (l->os_index != -1)
- snprintf(os_index, 12, "%s%d", indexprefix, l->os_index);
-
+ hwloc_obj_type_t type = obj->type;
switch (type) {
- case HWLOC_OBJ_SOCKET:
- case HWLOC_OBJ_CORE:
- return hwloc_snprintf(string, size, "%s%s", hwloc_obj_type_string(type), os_index);
case HWLOC_OBJ_MISC:
- /* TODO: more pretty presentation? */
- return hwloc_snprintf(string, size, "%s%u%s", hwloc_obj_type_string(type), l->attr->misc.depth, os_index);
- case HWLOC_OBJ_PROC:
- return hwloc_snprintf(string, size, "P%s", os_index);
case HWLOC_OBJ_SYSTEM:
- if (verbose)
- return hwloc_snprintf(string, size, "%s(%lu%s HP=%lu*%lukB %s %s)", hwloc_obj_type_string(type),
- hwloc_memory_size_printf_value(l->attr->system.memory_kB),
- hwloc_memory_size_printf_unit(l->attr->system.memory_kB),
- l->attr->system.huge_page_free, l->attr->system.huge_page_size_kB,
- l->attr->system.dmi_board_vendor?l->attr->system.dmi_board_vendor:"",
- l->attr->system.dmi_board_name?l->attr->system.dmi_board_name:"");
- else
- return hwloc_snprintf(string, size, "%s(%lu%s)", hwloc_obj_type_string(type),
- hwloc_memory_size_printf_value(l->attr->system.memory_kB),
- hwloc_memory_size_printf_unit(l->attr->system.memory_kB));
case HWLOC_OBJ_MACHINE:
- if (verbose)
- return hwloc_snprintf(string, size, "%s(%lu%s HP=%lu*%lukB %s %s)", hwloc_obj_type_string(type),
- hwloc_memory_size_printf_value(l->attr->machine.memory_kB),
- hwloc_memory_size_printf_unit(l->attr->machine.memory_kB),
- l->attr->machine.huge_page_free, l->attr->machine.huge_page_size_kB,
- l->attr->machine.dmi_board_vendor?l->attr->machine.dmi_board_vendor:"",
- l->attr->machine.dmi_board_name?l->attr->machine.dmi_board_name:"");
- else
- return hwloc_snprintf(string, size, "%s%s(%lu%s)", hwloc_obj_type_string(type), os_index,
- hwloc_memory_size_printf_value(l->attr->machine.memory_kB),
- hwloc_memory_size_printf_unit(l->attr->machine.memory_kB));
case HWLOC_OBJ_NODE:
- return hwloc_snprintf(string, size, "%s%s(%lu%s)",
- verbose ? hwloc_obj_type_string(type) : "Node", os_index,
- hwloc_memory_size_printf_value(l->attr->node.memory_kB),
- hwloc_memory_size_printf_unit(l->attr->node.memory_kB));
+ case HWLOC_OBJ_SOCKET:
+ case HWLOC_OBJ_CORE:
+ case HWLOC_OBJ_PU:
+ return hwloc_snprintf(string, size, "%s", hwloc_obj_type_string(type));
case HWLOC_OBJ_CACHE:
- return hwloc_snprintf(string, size, "L%u%s%s(%lu%s)", l->attr->cache.depth,
- verbose ? hwloc_obj_type_string(type) : "", os_index,
- hwloc_memory_size_printf_value(l->attr->node.memory_kB),
- hwloc_memory_size_printf_unit(l->attr->node.memory_kB));
+ return hwloc_snprintf(string, size, "L%u%s", obj->attr->cache.depth, verbose ? hwloc_obj_type_string(type): "");
+ case HWLOC_OBJ_GROUP:
+ /* TODO: more pretty presentation? */
+ return hwloc_snprintf(string, size, "%s%u", hwloc_obj_type_string(type), obj->attr->group.depth);
default:
*string = '\0';
return 0;
}
}
+int
+hwloc_obj_attr_snprintf(char * __hwloc_restrict string, size_t size, hwloc_obj_t obj, const char * separator, int verbose)
+{
+ char memory[64] = "";
+ char specific[64] = "";
+ const char *specificseparator;
+
+ if (verbose) {
+ if (obj->memory.local_memory)
+ hwloc_snprintf(memory, sizeof(memory), "local=%lu%s%stotal=%lu%s",
+ (unsigned long) hwloc_memory_size_printf_value(obj->memory.total_memory, verbose),
+ hwloc_memory_size_printf_unit(obj->memory.total_memory, verbose),
+ separator,
+ (unsigned long) hwloc_memory_size_printf_value(obj->memory.local_memory, verbose),
+ hwloc_memory_size_printf_unit(obj->memory.local_memory, verbose));
+ else if (obj->memory.total_memory)
+ hwloc_snprintf(memory, sizeof(memory), "total=%lu%s",
+ (unsigned long) hwloc_memory_size_printf_value(obj->memory.total_memory, verbose),
+ hwloc_memory_size_printf_unit(obj->memory.total_memory, verbose));
+ } else {
+ if (obj->memory.total_memory)
+ hwloc_snprintf(memory, sizeof(memory), "%lu%s",
+ (unsigned long) hwloc_memory_size_printf_value(obj->memory.total_memory, verbose),
+ hwloc_memory_size_printf_unit(obj->memory.total_memory, verbose));
+ }
+
+ switch (obj->type) {
+ case HWLOC_OBJ_MACHINE:
+ if (verbose)
+ hwloc_snprintf(specific, sizeof(specific), "%s%s%s",
+ obj->attr->machine.dmi_board_vendor ? obj->attr->machine.dmi_board_vendor : "",
+ obj->attr->machine.dmi_board_vendor && obj->attr->machine.dmi_board_name ? separator : "",
+ obj->attr->machine.dmi_board_name ? obj->attr->machine.dmi_board_name : "");
+ break;
+ case HWLOC_OBJ_CACHE:
+ hwloc_snprintf(specific, sizeof(specific), "%lu%s",
+ (unsigned long) hwloc_memory_size_printf_value(obj->attr->cache.size, verbose),
+ hwloc_memory_size_printf_unit(obj->attr->cache.size, verbose));
+ break;
+ default:
+ break;
+ }
+
+ /* does the type-specific attribute string need separator prefix ? */
+ specificseparator = *memory && *specific ? separator : "";
+
+ return hwloc_snprintf(string, size, "%s%s%s",
+ memory,
+ specificseparator, specific);
+}
+
+
+int
+hwloc_obj_snprintf(char *string, size_t size,
+ struct hwloc_topology *topology __hwloc_attribute_unused, struct hwloc_obj *l, const char *_indexprefix, int verbose)
+{
+ const char *indexprefix = _indexprefix ? _indexprefix : "#";
+ char os_index[12] = "";
+ char type[64];
+ char attr[128];
+ int attrlen;
+
+ if (l->os_index != (unsigned) -1) {
+ hwloc_snprintf(os_index, 12, "%s%u", indexprefix, l->os_index);
+ }
+
+ hwloc_obj_type_snprintf(type, sizeof(type), l, verbose);
+ attrlen = hwloc_obj_attr_snprintf(attr, sizeof(attr), l, " ", verbose);
+
+ if (attrlen)
+ return hwloc_snprintf(string, size, "%s%s(%s)", type, os_index, attr);
+ else
+ return hwloc_snprintf(string, size, "%s%s", type, os_index);
+}
+
int hwloc_obj_cpuset_snprintf(char *str, size_t size, size_t nobj, struct hwloc_obj * const *objs)
{
hwloc_cpuset_t set = hwloc_cpuset_alloc();
int res;
- int i;
+ unsigned i;
hwloc_cpuset_zero(set);
for(i=0; i<nobj; i++)
- hwloc_cpuset_orset(set, objs[i]->cpuset);
+ hwloc_cpuset_or(set, set, objs[i]->cpuset);
res = hwloc_cpuset_snprintf(str, size, set);
- free(set);
+ hwloc_cpuset_free(set);
return res;
}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/Makefile.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/Makefile.am 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/Makefile.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,10 +1,15 @@
# Copyright 2009 INRIA, Université Bordeaux 1
-# Copyright 2009 Cisco Systems, Inc. All rights reserved.
+# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
-include $(top_srcdir)/hwloc.am
+AM_CFLAGS = $(HWLOC_CFLAGS)
+AM_CPPFLAGS = $(HWLOC_CPPFLAGS)
+AM_LDFLAGS = $(HWLOC_LDFLAGS)
-SUBDIRS = linux ports
+SUBDIRS = linux ports xml
+LIBS =
+
+if HWLOC_BUILD_TESTS
check_PROGRAMS = hwloc_cpuset_string \
hwloc_get_closest_objs \
hwloc_get_obj_covering_cpuset \
@@ -13,45 +18,44 @@
hwloc_get_next_obj_covering_cpuset \
hwloc_get_obj_inside_cpuset \
hwloc_get_shared_cache_covering_obj \
+ hwloc_get_obj_below_array_by_type \
hwloc_cpuset_first_last_weight \
hwloc_cpuset_singlify \
hwloc_type_depth \
hwloc_bind \
hwloc_object_userdata \
hwloc_synthetic \
- hwloc_is_thissystem
+ hwloc_is_thissystem \
+ hwloc_insert_misc
-EXTRA_DIST =
-
-if HAVE_LINUX_LIBNUMA
+if HWLOC_HAVE_LINUX_LIBNUMA
check_PROGRAMS += linux-libnuma
-else !HAVE_LINUX_LIBNUMA
-EXTRA_DIST += linux-libnuma.c
-endif !HAVE_LINUX_LIBNUMA
+endif HWLOC_HAVE_LINUX_LIBNUMA
-if HAVE_SCHED_SETAFFINITY
+if HWLOC_HAVE_SCHED_SETAFFINITY
check_PROGRAMS += glibc-sched
-else !HAVE_SCHED_SETAFFINITY
-EXTRA_DIST += glibc-sched.c
-endif !HAVE_SCHED_SETAFFINITY
+endif HWLOC_HAVE_SCHED_SETAFFINITY
-if HAVE_LIBIBVERBS
+if HWLOC_HAVE_LIBIBVERBS
check_PROGRAMS += openfabrics-verbs
-else !HAVE_LIBIBVERBS
-EXTRA_DIST += openfabrics-verbs.c
-endif !HAVE_LIBIBVERBS
+endif HWLOC_HAVE_LIBIBVERBS
TESTS = $(check_PROGRAMS)
-if HAVE_XML
-TESTS += lstopo_xml.sh
+# The library has a different name depending on whether we are
+# building in standalone or embedded mode.
+if HWLOC_BUILD_STANDALONE
+hwloc_lib = libhwloc.la
+else
+hwloc_lib = libhwloc_embedded.la
endif
-LIBS = $(top_builddir)/src/libhwloc.la
+LIBS += $(HWLOC_top_builddir)/src/$(hwloc_lib)
linux_libnuma_LDFLAGS = -lnuma
openfabrics_verbs_LDFLAGS = -libverbs
-if HAVE_WINDOWS
-else
+if !HWLOC_HAVE_WINDOWS
hwloc_bind_LDFLAGS = -lpthread
-endif
+endif !HWLOC_HAVE_WINDOWS
+
+endif HWLOC_BUILD_TESTS
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/Makefile.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/Makefile.am (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/Makefile.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,20 @@
+# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
+
+ACLOCAL_AMFLAGS = -I./config -I./hwloc-tree/config
+
+SUBDIRS = hwloc-tree
+
+AM_CPPFLAGS = $(HWLOC_EMBEDDED_CPPFLAGS)
+
+TESTS = main
+
+noinst_PROGRAMS = main
+noinst_LTLIBRARIES = libdo_test.la
+
+libdo_test_la_SOURCES = do_test.c
+
+main_SOURCES = main.c
+main_LDADD = $(HWLOC_EMBEDDED_LDADD) libdo_test.la
+main_DEPENDENCIES = libdo_test.la
+
+EXTRA_DIST = run-embedded-tests.sh
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/README.txt
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/README.txt (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/README.txt 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,24 @@
+This test is meant to be run manually; it is not part of "make check".
+
+Someday I may figure out how to make this part of "make check", but
+today is not that day. :-)
+
+You need to expand a distribution hwloc tarball in this directory and
+rename the top-level directory from hwloc-<version>/ to hwloc-tree/.
+Then run ./autogen.sh, ./configure, and make.
+
+The test is that:
+
+ - autogen.sh runs properly and to completion
+ - configure runs properly and to completion
+ - make runs properly and to completion
+ - you can run the resulting "./main" executable and it properly shows
+ the hwloc depth of the current machine
+
+If you look at configure.ac, you see that it uses the HWLOC m4 macros
+to build the hwloc located at hwloc-tree/, and renames all the symbols
+from "hwloc_<foo>" to "mytest_<foo>". The main.c source calls several
+hwloc functions via the "mytest_<foo>" symbols.
+
+Bottom line: if the "main" executable runs and prints the current
+depth, the embedding should be working properly.
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/autogen.sh
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/autogen.sh (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/autogen.sh 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,2 @@
+:
+autoreconf -ivf
Property changes on: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/autogen.sh
___________________________________________________________________
Added: svn:executable
+ *
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/configure.ac
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/configure.ac (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/configure.ac 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,34 @@
+# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
+
+AC_INIT([hwloc-embedded-test], [1.0], [http://www.open-mpi.org/community/help], [hwloc-embedded-test])
+AC_PREREQ([2.63])
+AC_CONFIG_AUX_DIR([./config])
+AC_CONFIG_MACRO_DIR([./config])
+AC_CANONICAL_TARGET
+AM_INIT_AUTOMAKE([1.10 dist-bzip2 foreign subdir-objects tar-ustar -Wall -Werror])
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
+AC_PROG_CC
+
+cat <<EOF
+
+=== Configuring hwloc (embedded mode)
+EOF
+
+HWLOC_SET_SYMBOL_PREFIX([mytest_])
+HWLOC_SETUP_CORE([hwloc-tree], [hwloc_setup=happy], [hwloc_setup=unhappy])
+AS_IF([test "$hwloc_setup" = "unhappy"],
+ [AC_MSG_ERROR([Cannot continue])])
+HWLOC_DO_AM_CONDITIONALS
+
+cat <<EOF
+=== Done configuring hwloc (embedded mode)
+
+EOF
+
+AM_ENABLE_SHARED
+AM_DISABLE_STATIC
+AM_PROG_LIBTOOL
+
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/do_test.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/do_test.c (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/do_test.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,33 @@
+#include <hwloc.h>
+#include <stdio.h>
+
+/* The body of the test is in a separate .c file and a separate
+ library, just to ensure that hwloc didn't force compilation with
+ visibility flags enabled. */
+
+int do_test(void)
+{
+ mytest_hwloc_topology_t topology;
+ unsigned depth;
+ hwloc_cpuset_t cpu_set;
+
+ /* Just call a bunch of functions to see if we can link and run */
+
+ printf("*** Test 1: cpuset alloc\n");
+ cpu_set = mytest_hwloc_cpuset_alloc();
+ if (NULL == cpu_set) return 1;
+ printf("*** Test 2: topology init\n");
+ if (0 != mytest_hwloc_topology_init(&topology)) return 1;
+ printf("*** Test 3: topology load\n");
+ if (0 != mytest_hwloc_topology_load(topology)) return 1;
+ printf("*** Test 4: topology get depth\n");
+ depth = mytest_hwloc_topology_get_depth(topology);
+ if (depth < 0) return 1;
+ printf(" Max depth: %u\n", depth);
+ printf("*** Test 5: topology destroy\n");
+ mytest_hwloc_topology_destroy(topology);
+ printf("*** Test 6: cpuset free\n");
+ mytest_hwloc_cpuset_free(cpu_set);
+
+ return 0;
+}
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/main.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/main.c (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/main.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,19 @@
+/*
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+ * See COPYING in top-level directory.
+ */
+
+#include <hwloc.h>
+#include <stdio.h>
+
+extern int do_test(void);
+
+
+int main(int argc, char *argv[])
+{
+ /* Make the test be in a separate library that will fail to link
+ properly if hwloc forces compilation with visibility
+ enabled. */
+ return do_test();
+}
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/run-embedded-tests.sh
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/run-embedded-tests.sh (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/run-embedded-tests.sh 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,128 @@
+#!/bin/bash -o pipefail
+#
+# Copyright © 2010 Cisco Systems, Inc. All rights reserved.
+#
+# Simple script to help test embedding:
+#
+# ./run-embedded-tests.sh <tarball_name>
+#
+
+tarball=$1
+if test "$tarball" = ""; then
+ echo "Usage: $0 <tarball_name>"
+ exit 1
+elif test ! -r $tarball; then
+ echo cannot read tarball: $tarball
+ exit 1
+fi
+
+#---------------------------------------------------------------------
+
+i=1
+last_print=
+print() {
+ last_print="=== $i: $*"
+ echo $last_print
+ i=`expr $i + 1`
+}
+
+#---------------------------------------------------------------------
+
+try() {
+ cmd=$*
+ eval $cmd
+ status=$?
+ if test "$status" != "0"; then
+ echo "Command failed (status $status): $cmd"
+ echo "Last print was: $last_print"
+ exit 1
+ fi
+}
+
+#---------------------------------------------------------------------
+
+do_build() {
+ print Running $1 configure...
+ try $2/configure 2>&1 | tee config.out
+ if test "$?" != 0; then exit $?; fi
+
+ print Running make
+ try make 2>&1 | tee make.out
+ if test "$?" != 0; then exit $?; fi
+
+ print Running make check
+ try make check 2>&1 | tee check.out
+ if test "$?" != 0; then exit $?; fi
+
+ print Running make clean
+ try make clean 2>&1 | tee clean.out
+ if test "$?" != 0; then exit $?; fi
+
+ print Running make distclean
+ try make distclean 2>&1 | tee distclean.out
+ if test "$?" != 0; then exit $?; fi
+}
+
+#---------------------------------------------------------------------
+
+# Get tarball name
+print Got tarball: $tarball
+
+# Get the version
+ver=`echo $tarball | sed -e 's/^.*hwloc-//' -e 's/.tar.*$//'`
+print Got version: $ver
+
+# Extract
+print Extracting tarball...
+rm -rf hwloc-$ver
+if test "`echo $tarball | grep .tar.bz2`" != ""; then
+ try tar jxf $tarball
+else
+ try tar zxf $tarball
+fi
+
+print Removing old tree...
+rm -rf hwloc-tree
+mv hwloc-$ver hwloc-tree
+
+# Autogen
+print Running autogen...
+try ./autogen.sh
+
+# Do it normally (non-VPATH)
+do_build non-VPATH .
+
+# Do a VPATH in the same tree that we just setup
+mkdir build
+cd build
+do_build VPATH ..
+
+cd ..
+rm -rf build
+
+# Now whack the tree and do a clean VPATH
+print Re-extracting tarball...
+rm -rf hwloc-$ver
+if test "`echo $tarball | grep .tar.bz2`" != ""; then
+ try tar jxf $tarball
+else
+ try tar zxf $tarball
+fi
+
+print Removing old tree...
+rm -rf hwloc-tree
+mv hwloc-$ver hwloc-tree
+
+# Autogen
+print Running autogen...
+try ./autogen.sh
+
+# Run it again on a clean VPATH
+mkdir build
+cd build
+do_build VPATH-clean ..
+
+cd ..
+rm -rf build
+
+print All tests passed!
Property changes on: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/embedded/run-embedded-tests.sh
___________________________________________________________________
Added: svn:executable
+ *
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/glibc-sched.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/glibc-sched.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/glibc-sched.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,11 +1,13 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
#define _GNU_SOURCE
#include <sched.h>
#include <assert.h>
+#include <private/config.h>
#include <hwloc.h>
#include <hwloc/glibc-sched.h>
@@ -24,9 +26,9 @@
hwloc_topology_load(topology);
depth = hwloc_topology_get_depth(topology);
- hwlocset = hwloc_cpuset_dup(hwloc_get_system_obj(topology)->cpuset);
+ hwlocset = hwloc_cpuset_dup(hwloc_topology_get_complete_cpuset(topology));
hwloc_cpuset_to_glibc_sched_affinity(topology, hwlocset, &schedset, sizeof(schedset));
-#ifdef HAVE_OLD_SCHED_SETAFFINITY
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
err = sched_setaffinity(0, sizeof(schedset));
#else
err = sched_setaffinity(0, sizeof(schedset), &schedset);
@@ -34,23 +36,27 @@
assert(!err);
hwloc_cpuset_free(hwlocset);
-#ifdef HAVE_OLD_SCHED_SETAFFINITY
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
err = sched_getaffinity(0, sizeof(schedset));
#else
err = sched_getaffinity(0, sizeof(schedset), &schedset);
#endif
assert(!err);
- hwlocset = hwloc_cpuset_from_glibc_sched_affinity(topology, &schedset, sizeof(schedset));
- assert(hwloc_cpuset_isequal(hwlocset, hwloc_get_system_obj(topology)->cpuset));
+ hwlocset = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_glibc_sched_affinity(topology, hwlocset, &schedset, sizeof(schedset));
+ assert(hwloc_cpuset_isincluded(hwlocset, hwloc_topology_get_complete_cpuset(topology)));
+ hwloc_cpuset_andnot(hwlocset, hwlocset, hwloc_topology_get_online_cpuset(topology));
+ hwloc_cpuset_andnot(hwlocset, hwlocset, hwloc_topology_get_allowed_cpuset(topology));
+ assert(hwloc_cpuset_iszero(hwlocset));
hwloc_cpuset_free(hwlocset);
obj = hwloc_get_obj_by_depth(topology, depth-1, hwloc_get_nbobjs_by_depth(topology, depth-1) - 1);
assert(obj);
- assert(obj->type == HWLOC_OBJ_PROC);
+ assert(obj->type == HWLOC_OBJ_PU);
hwlocset = hwloc_cpuset_dup(obj->cpuset);
hwloc_cpuset_to_glibc_sched_affinity(topology, hwlocset, &schedset, sizeof(schedset));
-#ifdef HAVE_OLD_SCHED_SETAFFINITY
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
err = sched_setaffinity(0, sizeof(schedset));
#else
err = sched_setaffinity(0, sizeof(schedset), &schedset);
@@ -58,13 +64,14 @@
assert(!err);
hwloc_cpuset_free(hwlocset);
-#ifdef HAVE_OLD_SCHED_SETAFFINITY
+#ifdef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
err = sched_getaffinity(0, sizeof(schedset));
#else
err = sched_getaffinity(0, sizeof(schedset), &schedset);
#endif
assert(!err);
- hwlocset = hwloc_cpuset_from_glibc_sched_affinity(topology, &schedset, sizeof(schedset));
+ hwlocset = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_glibc_sched_affinity(topology, hwlocset, &schedset, sizeof(schedset));
assert(hwloc_cpuset_isequal(hwlocset, obj->cpuset));
hwloc_cpuset_free(hwlocset);
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_bind.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_bind.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_bind.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -7,36 +7,65 @@
#include <string.h>
#include <errno.h>
+#include <private/config.h>
#include <hwloc.h>
#include <private/config.h>
/* check the binding functions */
hwloc_topology_t topology;
+const struct hwloc_topology_support *support;
-static void result(const char *msg, int err)
+static void result_set(const char *msg, int err, int supported)
{
+ const char *errmsg = strerror(errno);
if (err)
- printf("%-30s: FAILED (%d, %s)\n", msg, errno, strerror(errno));
+ printf("%-40s: FAILED (%d, %s)%s\n", msg, errno, errmsg, supported ? "" : " (expected)");
else
- printf("%-30s: OK\n", msg);
+ printf("%-40s: OK%s\n", msg, supported ? "" : " (unexpected)");
}
-static void test(hwloc_cpuset_t cpuset, int flags)
+static void result_get(const char *msg, hwloc_const_cpuset_t expected, hwloc_const_cpuset_t result, int err, int supported)
{
- result("Bind singlethreaded process", hwloc_set_cpubind(topology, cpuset, flags));
- result("Bind this thread", hwloc_set_cpubind(topology, cpuset, flags | HWLOC_CPUBIND_THREAD));
- result("Bind this whole process", hwloc_set_cpubind(topology, cpuset, flags | HWLOC_CPUBIND_PROCESS));
+ const char *errmsg = strerror(errno);
+ if (err)
+ printf("%-40s: FAILED (%d, %s)%s\n", msg, errno, errmsg, supported ? "" : " (expected)");
+ else if (hwloc_cpuset_isequal(expected, result))
+ printf("%-40s: OK%s\n", msg, supported ? "" : " (unexpected)");
+ else {
+ char *expected_s, *result_s;
+ hwloc_cpuset_asprintf(&expected_s, expected);
+ hwloc_cpuset_asprintf(&result_s, result);
+ printf("%-40s: expected %s, got %s\n", msg, expected_s, result_s);
+ }
+}
-#ifdef WIN_SYS
- result("Bind process", hwloc_set_proc_cpubind(topology, GetCurrentProcess(), cpuset, flags | HWLOC_CPUBIND_PROCESS));
- result("Bind thread", hwloc_set_thread_cpubind(topology, GetCurrentThread(), cpuset, flags | HWLOC_CPUBIND_THREAD));
-#else /* !WIN_SYS */
- result("Bind process", hwloc_set_proc_cpubind(topology, getpid(), cpuset, flags | HWLOC_CPUBIND_PROCESS));
+static void test(hwloc_const_cpuset_t cpuset, int flags)
+{
+ hwloc_cpuset_t new_cpuset = hwloc_cpuset_alloc();
+ result_set("Bind this singlethreaded process", hwloc_set_cpubind(topology, cpuset, flags), support->cpubind->set_thisproc_cpubind || support->cpubind->set_thisthread_cpubind);
+ result_get("Get this singlethreaded process", cpuset, new_cpuset, hwloc_get_cpubind(topology, new_cpuset, flags), support->cpubind->get_thisproc_cpubind || support->cpubind->get_thisthread_cpubind);
+ result_set("Bind this thread", hwloc_set_cpubind(topology, cpuset, flags | HWLOC_CPUBIND_THREAD), support->cpubind->set_thisthread_cpubind);
+ result_get("Get this thread", cpuset, new_cpuset, hwloc_get_cpubind(topology, new_cpuset, flags | HWLOC_CPUBIND_THREAD), support->cpubind->get_thisthread_cpubind);
+ result_set("Bind this whole process", hwloc_set_cpubind(topology, cpuset, flags | HWLOC_CPUBIND_PROCESS), support->cpubind->set_thisproc_cpubind);
+ result_get("Get this whole process", cpuset, new_cpuset, hwloc_get_cpubind(topology, new_cpuset, flags | HWLOC_CPUBIND_PROCESS), support->cpubind->get_thisproc_cpubind);
+
+#ifdef HWLOC_WIN_SYS
+ result_set("Bind process", hwloc_set_proc_cpubind(topology, GetCurrentProcess(), cpuset, flags | HWLOC_CPUBIND_PROCESS), support->cpubind->set_proc_cpubind);
+ result_get("Get process", cpuset, new_cpuset, hwloc_get_proc_cpubind(topology, GetCurrentProcess(), new_cpuset, flags | HWLOC_CPUBIND_PROCESS), support->cpubind->get_proc_cpubind);
+ result_set("Bind thread", hwloc_set_thread_cpubind(topology, GetCurrentThread(), cpuset, flags | HWLOC_CPUBIND_THREAD), support->cpubind->set_thread_cpubind);
+ result_get("Get thread", cpuset, new_cpuset, hwloc_get_thread_cpubind(topology, GetCurrentThread(), new_cpuset, flags | HWLOC_CPUBIND_THREAD), support->cpubind->get_thread_cpubind);
+#else /* !HWLOC_WIN_SYS */
+ result_set("Bind whole process", hwloc_set_proc_cpubind(topology, getpid(), cpuset, flags | HWLOC_CPUBIND_PROCESS), support->cpubind->set_proc_cpubind);
+ result_get("Get whole process", cpuset, new_cpuset, hwloc_get_proc_cpubind(topology, getpid(), new_cpuset, flags | HWLOC_CPUBIND_PROCESS), support->cpubind->get_proc_cpubind);
+ result_set("Bind process", hwloc_set_proc_cpubind(topology, getpid(), cpuset, flags), support->cpubind->set_proc_cpubind);
+ result_get("Get process", cpuset, new_cpuset, hwloc_get_proc_cpubind(topology, getpid(), new_cpuset, flags), support->cpubind->get_proc_cpubind);
#ifdef hwloc_thread_t
- result("Bind thread", hwloc_set_thread_cpubind(topology, pthread_self(), cpuset, flags | HWLOC_CPUBIND_THREAD));
+ result_set("Bind thread", hwloc_set_thread_cpubind(topology, pthread_self(), cpuset, flags), support->cpubind->set_thread_cpubind);
+ result_get("Get thread", cpuset, new_cpuset, hwloc_get_thread_cpubind(topology, pthread_self(), new_cpuset, flags), support->cpubind->get_thread_cpubind);
#endif
-#endif /* !WIN_SYS */
+#endif /* !HWLOC_WIN_SYS */
printf("\n");
+ hwloc_cpuset_free(new_cpuset);
}
int main(void)
@@ -48,7 +77,9 @@
hwloc_topology_init(&topology);
hwloc_topology_load(topology);
- obj = hwloc_get_system_obj(topology);
+ support = hwloc_topology_get_support(topology);
+
+ obj = hwloc_get_root_obj(topology);
set = hwloc_cpuset_dup(obj->cpuset);
while (hwloc_cpuset_isequal(obj->cpuset, set)) {
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_first_last_weight.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_first_last_weight.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_first_last_weight.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,26 +3,41 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <assert.h>
-/* check hwloc_cpuset_first(), _last() and _weight() */
+/* check hwloc_cpuset_first(), _last(), _next() and _weight() */
-int main()
+int main(void)
{
hwloc_cpuset_t set;
+ int i, cpu, expected_cpu;
/* empty set */
set = hwloc_cpuset_alloc();
assert(hwloc_cpuset_first(set) == -1);
assert(hwloc_cpuset_last(set) == -1);
+ assert(hwloc_cpuset_next(set, 0) == -1);
assert(hwloc_cpuset_weight(set) == 0);
/* full set */
hwloc_cpuset_fill(set);
assert(hwloc_cpuset_first(set) == 0);
assert(hwloc_cpuset_last(set) == HWLOC_NBMAXCPUS-1);
+ assert(hwloc_cpuset_next(set, 0) == 1);
+ assert(hwloc_cpuset_next(set, 1) == 2);
+ assert(hwloc_cpuset_next(set, 2) == 3);
+ assert(hwloc_cpuset_next(set, 30) == 31);
+ assert(hwloc_cpuset_next(set, 31) == 32);
+ assert(hwloc_cpuset_next(set, 32) == 33);
+ assert(hwloc_cpuset_next(set, 62) == 63);
+ assert(hwloc_cpuset_next(set, 63) == 64);
+ assert(hwloc_cpuset_next(set, 64) == 65);
+ assert(hwloc_cpuset_next(set, HWLOC_NBMAXCPUS-3) == HWLOC_NBMAXCPUS-2);
+ assert(hwloc_cpuset_next(set, HWLOC_NBMAXCPUS-2) == HWLOC_NBMAXCPUS-1);
+ assert(hwloc_cpuset_next(set, HWLOC_NBMAXCPUS-1) == -1);
assert(hwloc_cpuset_weight(set) == HWLOC_NBMAXCPUS);
/* custom sets */
@@ -30,16 +45,37 @@
hwloc_cpuset_set_range(set, 36, 59);
assert(hwloc_cpuset_first(set) == 36);
assert(hwloc_cpuset_last(set) == 59);
+ assert(hwloc_cpuset_next(set, 0) == 36);
+ assert(hwloc_cpuset_next(set, 36) == 37);
+ assert(hwloc_cpuset_next(set, 59) == -1);
assert(hwloc_cpuset_weight(set) == 24);
hwloc_cpuset_set_range(set, 136, 259);
assert(hwloc_cpuset_first(set) == 36);
assert(hwloc_cpuset_last(set) == 259);
+ assert(hwloc_cpuset_next(set, 59) == 136);
+ assert(hwloc_cpuset_next(set, 259) == -1);
assert(hwloc_cpuset_weight(set) == 148);
hwloc_cpuset_clr(set, 199);
assert(hwloc_cpuset_first(set) == 36);
assert(hwloc_cpuset_last(set) == 259);
+ assert(hwloc_cpuset_next(set, 198) == 200);
+ assert(hwloc_cpuset_next(set, 199) == 200);
assert(hwloc_cpuset_weight(set) == 147);
+ i = 0;
+ hwloc_cpuset_foreach_begin(cpu, set) {
+ if (0 <= i && i < 24)
+ expected_cpu = i + 36;
+ else if (24 <= i && i < 87)
+ expected_cpu = i + 112;
+ else if (87 <= i && i < 147)
+ expected_cpu = i + 113;
+
+ assert(expected_cpu == cpu);
+
+ i++;
+ } hwloc_cpuset_foreach_end();
+
hwloc_cpuset_free(set);
return 0;
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_singlify.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_singlify.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_singlify.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,8 +1,10 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -12,7 +14,7 @@
/* check hwloc_cpuset_singlify() */
-int main()
+int main(void)
{
hwloc_cpuset_t orig, expected;
@@ -28,7 +30,7 @@
hwloc_cpuset_singlify(orig);
hwloc_cpuset_zero(expected);
hwloc_cpuset_set(expected, 0);
- assert(!hwloc_cpuset_compar(orig, expected));
+ assert(!hwloc_cpuset_compare(orig, expected));
/* actual non-trivial set */
hwloc_cpuset_zero(orig);
@@ -38,7 +40,7 @@
hwloc_cpuset_singlify(orig);
hwloc_cpuset_zero(expected);
hwloc_cpuset_set(expected, 45);
- assert(!hwloc_cpuset_compar(orig, expected));
+ assert(!hwloc_cpuset_compare(orig, expected));
hwloc_cpuset_free(orig);
hwloc_cpuset_free(expected);
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_string.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_string.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_cpuset_string.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -12,7 +13,7 @@
/* check hwloc_cpuset_asprintf(), hwloc_obj_cpuset_snprintf() and hwloc_cpuset_from_string() */
-int main()
+int main(void)
{
hwloc_topology_t topology;
unsigned depth;
@@ -26,12 +27,13 @@
hwloc_topology_load(topology);
depth = hwloc_topology_get_depth(topology);
- obj = hwloc_get_system_obj(topology);
+ obj = hwloc_get_root_obj(topology);
stringlen = hwloc_cpuset_asprintf(&string, obj->cpuset);
printf("system cpuset is %s\n", string);
- set = hwloc_cpuset_from_string(string);
+ set = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(set, string);
assert(hwloc_cpuset_isequal(set, obj->cpuset));
- free(set);
+ hwloc_cpuset_free(set);
printf("system cpuset converted back and forth, ok\n");
printf("truncating system cpuset to NULL buffer\n");
@@ -54,64 +56,66 @@
assert(string[0] == 0);
assert(string[1] == 'X');
- printf("truncating system cpuset to 8 chars (single 32bit subset except last char)\n");
- memset(string, 'X', 9);
- string[9] = 0;
- len = hwloc_obj_cpuset_snprintf(string, 8, 1, &obj);
+ printf("truncating system cpuset to 10 chars (single 32bit subset except last char)\n");
+ memset(string, 'X', 11);
+ string[11] = 0;
+ len = hwloc_obj_cpuset_snprintf(string, 10, 1, &obj);
printf("got %s\n", string);
assert(len == stringlen);
- assert(string[6] == 'f');
- assert(string[7] == 0);
- assert(string[8] == 'X');
+ assert(string[8] == 'f');
+ assert(string[9] == 0);
+ assert(string[10] == 'X');
- printf("truncating system cpuset to 9 chars (single 32bit subset)\n");
- memset(string, 'X', 10);
- string[10] = 0;
- len = hwloc_obj_cpuset_snprintf(string, 9, 1, &obj);
+ printf("truncating system cpuset to 11 chars (single 32bit subset)\n");
+ memset(string, 'X', 12);
+ string[12] = 0;
+ len = hwloc_obj_cpuset_snprintf(string, 11, 1, &obj);
printf("got %s\n", string);
assert(len == stringlen);
- assert(string[7] == 'f');
- assert(string[8] == 0);
- assert(string[9] == 'X');
+ assert(string[9] == 'f');
+ assert(string[10] == 0);
+ assert(string[11] == 'X');
- printf("truncating system cpuset to 19 chars (two 32bit subsets with ending comma)\n");
- memset(string, 'X', 20);
- string[20] = 0;
- len = hwloc_obj_cpuset_snprintf(string, 19, 1, &obj);
+ printf("truncating system cpuset to 23 chars (two 32bit subsets with ending comma)\n");
+ memset(string, 'X', 24);
+ string[24] = 0;
+ len = hwloc_obj_cpuset_snprintf(string, 23, 1, &obj);
printf("got %s\n", string);
assert(len == stringlen);
- assert(string[16] == 'f');
- assert(string[17] == ',');
- assert(string[18] == 0);
- assert(string[19] == 'X');
+ assert(string[20] == 'f');
+ assert(string[21] == ',');
+ assert(string[22] == 0);
+ assert(string[23] == 'X');
- printf("truncating system cpuset to 41 chars (truncate to four and a half 32bit subsets)\n");
- memset(string, 'X', 42);
- string[42] = 0;
- len = hwloc_obj_cpuset_snprintf(string, 41, 1, &obj);
+ printf("truncating system cpuset to 51 chars (truncate to four and a half 32bit subsets)\n");
+ memset(string, 'X', 52);
+ string[52] = 0;
+ len = hwloc_obj_cpuset_snprintf(string, 51, 1, &obj);
printf("got %s\n", string);
assert(len == stringlen);
- assert(string[39] == 'f');
- assert(string[40] == 0);
- assert(string[41] == 'X');
+ assert(string[49] == 'f');
+ assert(string[50] == 0);
+ assert(string[51] == 'X');
obj = hwloc_get_obj_by_depth(topology, depth-1, 0);
hwloc_obj_cpuset_snprintf(string, stringlen+1, 1, &obj);
printf("first cpu cpuset is %s\n", string);
- set = hwloc_cpuset_from_string(string);
+ set = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(set, string);
assert(hwloc_cpuset_isequal(set, obj->cpuset));
- free(set);
+ hwloc_cpuset_free(set);
printf("first cpu cpuset converted back and forth, ok\n");
obj = hwloc_get_obj_by_depth(topology, depth-1, hwloc_get_nbobjs_by_depth(topology, depth-1) - 1);
hwloc_obj_cpuset_snprintf(string, stringlen+1, 1, &obj);
printf("last cpu cpuset is %s\n", string);
- set = hwloc_cpuset_from_string(string);
+ set = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(set, string);
assert(hwloc_cpuset_isequal(set, obj->cpuset));
- free(set);
+ hwloc_cpuset_free(set);
printf("last cpu cpuset converted back and forth, ok\n");
-// hwloc_cpuset_from_string("1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4,8,10,20\n", &set);
+// hwloc_cpuset_from_string(set, "1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,4,8,10,20\n");
// char *s = hwloc_cpuset_printf_value(&set);
// printf("%s\n", s);
// free(s);
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_cache_covering_cpuset.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_cache_covering_cpuset.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_cache_covering_cpuset.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -14,7 +15,7 @@
#define SYNTHETIC_TOPOLOGY_DESCRIPTION "6 5 4 3 2" /* 736bits wide topology */
-int main()
+int main(void)
{
hwloc_topology_t topology;
hwloc_obj_t obj, cache;
@@ -29,13 +30,13 @@
set = hwloc_cpuset_alloc();
obj = hwloc_get_obj_by_depth(topology, 5, CPUINDEX);
assert(obj);
- hwloc_cpuset_orset(set, obj->cpuset);
+ hwloc_cpuset_or(set, set, obj->cpuset);
cache = hwloc_get_cache_covering_cpuset(topology, set);
assert(cache);
assert(cache->type == HWLOC_OBJ_CACHE);
assert(cache->logical_index == CPUINDEX/2/3);
assert(hwloc_obj_is_in_subtree(topology, obj, cache));
- free(set);
+ hwloc_cpuset_free(set);
/* check the cache above two nearby cpus */
#define CPUINDEX1 180
@@ -43,17 +44,17 @@
set = hwloc_cpuset_alloc();
obj = hwloc_get_obj_by_depth(topology, 5, CPUINDEX1);
assert(obj);
- hwloc_cpuset_orset(set, obj->cpuset);
+ hwloc_cpuset_or(set, set, obj->cpuset);
obj = hwloc_get_obj_by_depth(topology, 5, CPUINDEX2);
assert(obj);
- hwloc_cpuset_orset(set, obj->cpuset);
+ hwloc_cpuset_or(set, set, obj->cpuset);
cache = hwloc_get_cache_covering_cpuset(topology, set);
assert(cache);
assert(cache->type == HWLOC_OBJ_CACHE);
assert(cache->logical_index == CPUINDEX1/2/3);
assert(cache->logical_index == CPUINDEX2/2/3);
assert(hwloc_obj_is_in_subtree(topology, obj, cache));
- free(set);
+ hwloc_cpuset_free(set);
/* check no cache above two distant cpus */
#undef CPUINDEX1
@@ -61,22 +62,22 @@
set = hwloc_cpuset_alloc();
obj = hwloc_get_obj_by_depth(topology, 5, CPUINDEX1);
assert(obj);
- hwloc_cpuset_orset(set, obj->cpuset);
+ hwloc_cpuset_or(set, set, obj->cpuset);
obj = hwloc_get_obj_by_depth(topology, 5, CPUINDEX2);
assert(obj);
- hwloc_cpuset_orset(set, obj->cpuset);
+ hwloc_cpuset_or(set, set, obj->cpuset);
cache = hwloc_get_cache_covering_cpuset(topology, set);
assert(!cache);
- free(set);
+ hwloc_cpuset_free(set);
/* check no cache above higher level */
set = hwloc_cpuset_alloc();
obj = hwloc_get_obj_by_depth(topology, 2, 0);
assert(obj);
- hwloc_cpuset_orset(set, obj->cpuset);
+ hwloc_cpuset_or(set, set, obj->cpuset);
cache = hwloc_get_cache_covering_cpuset(topology, set);
assert(!cache);
- free(set);
+ hwloc_cpuset_free(set);
hwloc_topology_destroy(topology);
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_closest_objs.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_closest_objs.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_closest_objs.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -20,15 +21,16 @@
*/
int
-main (int argc, char *argv[])
+main (void)
{
hwloc_topology_t topology;
unsigned depth;
hwloc_obj_t last;
hwloc_obj_t *closest;
- int found;
+ unsigned found;
int err;
unsigned numprocs;
+ hwloc_obj_t ancestor;
err = hwloc_topology_init (&topology);
if (err)
@@ -52,7 +54,7 @@
/* get closest levels */
found = hwloc_get_closest_objs (topology, last, closest, numprocs);
- printf("looked for %u closest entries, found %d\n", numprocs, found);
+ printf("looked for %u closest entries, found %u\n", numprocs, found);
assert(found == numprocs-1);
/* check first found is closest */
@@ -63,10 +65,10 @@
assert(closest[found/2/3-1] == hwloc_get_obj_by_depth(topology, depth-1, 1*3*4*5+2*4*5+3*5-1 /* last of third quarter of third third of second half */));
/* get ancestor of last and less close object */
- hwloc_obj_t ancestor = hwloc_get_common_ancestor_obj(topology, last, closest[found-1]);
+ ancestor = hwloc_get_common_ancestor_obj(topology, last, closest[found-1]);
assert(hwloc_obj_is_in_subtree(topology, last, ancestor));
assert(hwloc_obj_is_in_subtree(topology, closest[found-1], ancestor));
- assert(ancestor == hwloc_get_system_obj(topology));
+ assert(ancestor == hwloc_get_root_obj(topology));
printf("ancestor type %u depth %u number %u is system level\n",
ancestor->type, ancestor->depth, ancestor->logical_index);
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_largest_objs_inside_cpuset.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_largest_objs_inside_cpuset.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_largest_objs_inside_cpuset.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -10,7 +11,9 @@
#include <string.h>
#include <assert.h>
-/* check hwloc_get_largest_objs_inside_cpuset() */
+/* check hwloc_get_largest_objs_inside_cpuset()
+ * and hwloc_get_first_largest_obj_inside_cpuset()
+ */
#define SYNTHETIC_TOPOLOGY_DESCRIPTION "6 5 4 3 2" /* 736bits wide topology */
@@ -20,7 +23,7 @@
#define OBJ_MAX 16
-int main()
+int main(void)
{
hwloc_topology_t topology;
unsigned depth;
@@ -35,10 +38,12 @@
depth = hwloc_topology_get_depth(topology);
/* just get the system object */
- obj = hwloc_get_system_obj(topology);
+ obj = hwloc_get_root_obj(topology);
ret = hwloc_get_largest_objs_inside_cpuset(topology, obj->cpuset, objs, 1);
assert(ret == 1);
assert(objs[0] == obj);
+ objs[0] = hwloc_get_first_largest_obj_inside_cpuset(topology, obj->cpuset);
+ assert(objs[0] == obj);
/* just get the very last object */
obj = hwloc_get_obj_by_depth(topology, depth-1, hwloc_get_nbobjs_by_depth(topology, depth-1)-1);
@@ -50,28 +55,46 @@
set = hwloc_cpuset_alloc();
ret = hwloc_get_largest_objs_inside_cpuset(topology, set, objs, 1);
assert(ret == 0);
- free(set);
+ objs[0] = hwloc_get_first_largest_obj_inside_cpuset(topology, set);
+ assert(objs[0] == NULL);
+ hwloc_cpuset_free(set);
/* try an impossible one */
- set = hwloc_cpuset_from_string(GIVEN_TOOLARGE_CPUSET_STRING);
+ set = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(set, GIVEN_TOOLARGE_CPUSET_STRING);
ret = hwloc_get_largest_objs_inside_cpuset(topology, set, objs, 1);
assert(ret == -1);
- free(set);
+ objs[0] = hwloc_get_first_largest_obj_inside_cpuset(topology, set);
+ assert(objs[0] == NULL);
+ hwloc_cpuset_free(set);
/* try a harder one with 1 obj instead of 2 needed */
- set = hwloc_cpuset_from_string(GIVEN_LARGESPLIT_CPUSET_STRING);
+ set = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(set, GIVEN_LARGESPLIT_CPUSET_STRING);
ret = hwloc_get_largest_objs_inside_cpuset(topology, set, objs, 1);
assert(ret == 1);
assert(objs[0] == hwloc_get_obj_by_depth(topology, depth-1, 0));
+ objs[0] = hwloc_get_first_largest_obj_inside_cpuset(topology, set);
+ assert(objs[0] == hwloc_get_obj_by_depth(topology, depth-1, 0));
/* try a harder one with lots of objs instead of 2 needed */
ret = hwloc_get_largest_objs_inside_cpuset(topology, set, objs, 2);
assert(ret == 2);
assert(objs[0] == hwloc_get_obj_by_depth(topology, depth-1, 0));
assert(objs[1] == hwloc_get_obj_by_depth(topology, depth-1, hwloc_get_nbobjs_by_depth(topology, depth-1)-1));
- free(set);
+ objs[0] = hwloc_get_first_largest_obj_inside_cpuset(topology, set);
+ hwloc_cpuset_andnot(set, set, objs[0]->cpuset);
+ objs[1] = hwloc_get_first_largest_obj_inside_cpuset(topology, set);
+ hwloc_cpuset_andnot(set, set, objs[1]->cpuset);
+ objs[2] = hwloc_get_first_largest_obj_inside_cpuset(topology, set);
+ assert(objs[0] == hwloc_get_obj_by_depth(topology, depth-1, 0));
+ assert(objs[1] == hwloc_get_obj_by_depth(topology, depth-1, hwloc_get_nbobjs_by_depth(topology, depth-1)-1));
+ assert(objs[2] == NULL);
+ assert(hwloc_cpuset_iszero(set));
+ hwloc_cpuset_free(set);
/* try a very hard one */
- set = hwloc_cpuset_from_string(GIVEN_HARD_CPUSET_STRING);
+ set = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(set, GIVEN_HARD_CPUSET_STRING);
ret = hwloc_get_largest_objs_inside_cpuset(topology, set, objs, OBJ_MAX);
assert(objs[0] == hwloc_get_obj_by_depth(topology, 5, 29));
assert(objs[1] == hwloc_get_obj_by_depth(topology, 3, 5));
@@ -80,7 +103,7 @@
assert(objs[4] == hwloc_get_obj_by_depth(topology, 2, 2));
assert(objs[5] == hwloc_get_obj_by_depth(topology, 4, 36));
assert(objs[6] == hwloc_get_obj_by_depth(topology, 5, 74));
- free(set);
+ hwloc_cpuset_free(set);
hwloc_topology_destroy(topology);
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_next_obj_covering_cpuset.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_next_obj_covering_cpuset.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_next_obj_covering_cpuset.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -15,7 +16,7 @@
*/
int
-main (int argc, char *argv[])
+main (void)
{
hwloc_topology_t topology;
hwloc_cpuset_t set;
@@ -27,14 +28,16 @@
if (err)
return EXIT_FAILURE;
+ set = hwloc_cpuset_alloc();
+
hwloc_topology_set_synthetic (topology, "nodes:8 cores:2 1");
err = hwloc_topology_load (topology);
if (err)
return EXIT_FAILURE;
- set = hwloc_cpuset_from_string("00008f18");
+ hwloc_cpuset_from_string(set, "00008f18");
obj = hwloc_get_next_obj_covering_cpuset_by_type(topology, set, HWLOC_OBJ_NODE, NULL);
assert(obj == hwloc_get_obj_by_depth(topology, 1, 1));
@@ -49,16 +52,14 @@
obj = hwloc_get_next_obj_covering_cpuset_by_type(topology, set, HWLOC_OBJ_NODE, obj);
assert(!obj);
- free(set);
-
- hwloc_topology_set_synthetic (topology, "ndoes:2 socket:5 cores:3 4");
+ hwloc_topology_set_synthetic (topology, "nodes:2 socket:5 cores:3 4");
err = hwloc_topology_load (topology);
if (err)
return EXIT_FAILURE;
- set = hwloc_cpuset_from_string("0ff08000");
+ hwloc_cpuset_from_string(set, "0ff08000");
depth = hwloc_get_type_depth(topology, HWLOC_OBJ_SOCKET);
assert(depth == 2);
@@ -69,9 +70,9 @@
obj = hwloc_get_next_obj_covering_cpuset_by_depth(topology, set, depth, obj);
assert(!obj);
- free(set);
+ hwloc_cpuset_free(set);
hwloc_topology_destroy (topology);
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_below_array_by_type.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_below_array_by_type.c (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_below_array_by_type.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,79 @@
+/*
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * See COPYING in top-level directory.
+ */
+
+#include <private/config.h>
+#include <hwloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+/*
+ * check hwloc_get_obj_below_array_by_type()
+ */
+
+int
+main (void)
+{
+ hwloc_topology_t topology;
+ hwloc_obj_t obj;
+ hwloc_obj_type_t typev[4];
+ unsigned idxv[4];
+ int err;
+
+ err = hwloc_topology_init (&topology);
+ if (err)
+ return EXIT_FAILURE;
+
+ hwloc_topology_set_synthetic (topology, "node:3 socket:3 core:3 proc:3");
+
+ err = hwloc_topology_load (topology);
+ if (err)
+ return EXIT_FAILURE;
+
+
+ /* find the first thread */
+ typev[0] = HWLOC_OBJ_NODE; idxv[0] = 0;
+ typev[1] = HWLOC_OBJ_SOCKET; idxv[1] = 0;
+ typev[2] = HWLOC_OBJ_CORE; idxv[2] = 0;
+ typev[3] = HWLOC_OBJ_PU; idxv[3] = 0;
+ obj = hwloc_get_obj_below_array_by_type(topology, 4, typev, idxv);
+ assert(obj == hwloc_get_obj_by_depth(topology, 4, 0));
+
+ /* find the last core */
+ typev[0] = HWLOC_OBJ_NODE; idxv[0] = 2;
+ typev[1] = HWLOC_OBJ_SOCKET; idxv[1] = 2;
+ typev[2] = HWLOC_OBJ_CORE; idxv[2] = 2;
+ obj = hwloc_get_obj_below_array_by_type(topology, 3, typev, idxv);
+ assert(obj == hwloc_get_obj_by_depth(topology, 3, 26));
+
+ /* misc tests */
+
+ typev[0] = HWLOC_OBJ_SOCKET; idxv[0] = 2;
+ obj = hwloc_get_obj_below_array_by_type(topology, 1, typev, idxv);
+ assert(obj == hwloc_get_obj_by_depth(topology, 2, 2));
+
+ typev[0] = HWLOC_OBJ_NODE; idxv[0] = 2;
+ typev[1] = HWLOC_OBJ_CORE; idxv[1] = 2;
+ obj = hwloc_get_obj_below_array_by_type(topology, 2, typev, idxv);
+ assert(obj == hwloc_get_obj_by_depth(topology, 3, 20));
+ /* check that hwloc_get_obj_below_by_type works as well */
+ obj = hwloc_get_obj_below_by_type(topology, typev[0], idxv[0], typev[1], idxv[1]);
+ assert(obj == hwloc_get_obj_by_depth(topology, 3, 20));
+
+ typev[0] = HWLOC_OBJ_SOCKET; idxv[0] = 1;
+ typev[1] = HWLOC_OBJ_PU; idxv[1] = 1;
+ obj = hwloc_get_obj_below_array_by_type(topology, 2, typev, idxv);
+ assert(obj == hwloc_get_obj_by_depth(topology, 4, 10));
+ /* check that hwloc_get_obj_below_by_type works as well */
+ obj = hwloc_get_obj_below_by_type(topology, typev[0], idxv[0], typev[1], idxv[1]);
+ assert(obj == hwloc_get_obj_by_depth(topology, 4, 10));
+
+
+ hwloc_topology_destroy (topology);
+
+ return EXIT_SUCCESS;
+}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_covering_cpuset.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_covering_cpuset.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_covering_cpuset.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -14,12 +15,12 @@
#define SYNTHETIC_TOPOLOGY_DESCRIPTION "6 5 4 3 2" /* 736bits wide topology */
-#define GIVEN_CPUSET_STRING "0,0fff,f0000000"
-#define EXPECTED_CPUSET_STRING "0000ffff,ff000000"
-#define GIVEN_LARGESPLIT_CPUSET_STRING "8000,,,,,,,,,,,,,,,,,,,,,,1" /* first and last(735th) bit set */
-#define GIVEN_TOOLARGE_CPUSET_STRING "10000,,,,,,,,,,,,,,,,,,,,,,0" /* 736th bit is too large for the 720-wide topology */
+#define GIVEN_CPUSET_STRING "0x0,0x0fff,0xf0000000"
+#define EXPECTED_CPUSET_STRING "0x0000ffff,0xff000000"
+#define GIVEN_LARGESPLIT_CPUSET_STRING "0x8000,,,,,,,,,,,,,,,,,,,,,,0x1" /* first and last(735th) bit set */
+#define GIVEN_TOOLARGE_CPUSET_STRING "0x10000,,,,,,,,,,,,,,,,,,,,,,0x0" /* 736th bit is too large for the 720-wide topology */
-int main()
+int main(void)
{
hwloc_topology_t topology;
char *string = NULL;
@@ -29,8 +30,9 @@
hwloc_topology_init(&topology);
hwloc_topology_set_synthetic(topology, SYNTHETIC_TOPOLOGY_DESCRIPTION);
hwloc_topology_load(topology);
+ set = hwloc_cpuset_alloc();
- set = hwloc_cpuset_from_string(GIVEN_CPUSET_STRING);
+ hwloc_cpuset_from_string(set, GIVEN_CPUSET_STRING);
obj = hwloc_get_obj_covering_cpuset(topology, set);
assert(obj);
@@ -43,22 +45,20 @@
GIVEN_CPUSET_STRING, string, EXPECTED_CPUSET_STRING);
assert(!strcmp(EXPECTED_CPUSET_STRING, string));
free(string);
- free(set);
- set = hwloc_cpuset_from_string(GIVEN_LARGESPLIT_CPUSET_STRING);
+ hwloc_cpuset_from_string(set, GIVEN_LARGESPLIT_CPUSET_STRING);
obj = hwloc_get_obj_covering_cpuset(topology, set);
- assert(obj == hwloc_get_system_obj(topology));
+ assert(obj == hwloc_get_root_obj(topology));
fprintf(stderr, "found system as covering object of first+last cpus cpuset %s\n",
GIVEN_LARGESPLIT_CPUSET_STRING);
- free(set);
- set = hwloc_cpuset_from_string(GIVEN_TOOLARGE_CPUSET_STRING);
+ hwloc_cpuset_from_string(set, GIVEN_TOOLARGE_CPUSET_STRING);
obj = hwloc_get_obj_covering_cpuset(topology, set);
assert(!obj);
fprintf(stderr, "found no covering object for too-large cpuset %s\n",
GIVEN_TOOLARGE_CPUSET_STRING);
- free(set);
+ hwloc_cpuset_free(set);
hwloc_topology_destroy(topology);
return EXIT_SUCCESS;
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_inside_cpuset.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_inside_cpuset.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_obj_inside_cpuset.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -15,7 +16,7 @@
*/
int
-main (int argc, char *argv[])
+main (void)
{
hwloc_topology_t topology;
hwloc_obj_t obj, root;
@@ -32,26 +33,26 @@
return EXIT_FAILURE;
/* there is no second system object */
- root = hwloc_get_system_obj (topology);
+ root = hwloc_get_root_obj (topology);
obj = hwloc_get_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_SYSTEM, 1);
assert(!obj);
/* first system object is the top-level object of the topology */
- obj = hwloc_get_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_SYSTEM, 0);
- assert(obj == hwloc_get_system_obj(topology));
+ obj = hwloc_get_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_MACHINE, 0);
+ assert(obj == hwloc_get_root_obj(topology));
/* first next-object object is the top-level object of the topology */
- obj = hwloc_get_next_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_SYSTEM, NULL);
- assert(obj == hwloc_get_system_obj(topology));
+ obj = hwloc_get_next_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_MACHINE, NULL);
+ assert(obj == hwloc_get_root_obj(topology));
/* there is no next object after the system object */
obj = hwloc_get_next_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_SYSTEM, obj);
assert(!obj);
- /* check last proc */
- obj = hwloc_get_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_PROC, 2*3*4*5*6-1);
+ /* check last PU */
+ obj = hwloc_get_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_PU, 2*3*4*5*6-1);
assert(obj == hwloc_get_obj_by_depth(topology, 5, 2*3*4*5*6-1));
- /* there is no next proc after the last one */
- obj = hwloc_get_next_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_PROC, obj);
+ /* there is no next PU after the last one */
+ obj = hwloc_get_next_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_PU, obj);
assert(!obj);
@@ -64,9 +65,9 @@
assert(hwloc_get_nbobjs_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_CACHE) == 12);
- /* check first proc of second socket */
+ /* check first PU of second socket */
root = hwloc_get_obj_by_depth(topology, 2, 1);
- obj = hwloc_get_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_PROC, 0);
+ obj = hwloc_get_obj_inside_cpuset_by_type(topology, root->cpuset, HWLOC_OBJ_PU, 0);
assert(obj == hwloc_get_obj_by_depth(topology, 5, 4*5*6));
/* check third core of third socket */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_shared_cache_covering_obj.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_shared_cache_covering_obj.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_get_shared_cache_covering_obj.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -15,7 +16,7 @@
#define SYNTHETIC_TOPOLOGY_DESCRIPTION_SHARED "6 5 4 3 2" /* 736bits wide topology */
#define SYNTHETIC_TOPOLOGY_DESCRIPTION_NONSHARED "6 5 4 1 2" /* 736bits wide topology */
-int main()
+int main(void)
{
hwloc_topology_t topology;
hwloc_obj_t obj, cache;
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_insert_misc.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_insert_misc.c (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_insert_misc.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,31 @@
+/*
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * See COPYING in top-level directory.
+ */
+
+#include <private/config.h>
+#include <hwloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+int main(void)
+{
+ hwloc_topology_t topology;
+ hwloc_cpuset_t cpuset;
+ hwloc_obj_t obj;
+
+ hwloc_topology_init(&topology);
+ hwloc_topology_load(topology);
+ hwloc_topology_check(topology);
+ cpuset = hwloc_cpuset_alloc();
+ hwloc_cpuset_set(cpuset, 0);
+ obj = hwloc_topology_insert_misc_object_by_cpuset(topology, cpuset, "test");
+ hwloc_topology_insert_misc_object_by_parent(topology, obj, "test2");
+ hwloc_topology_check(topology);
+ hwloc_topology_destroy(topology);
+
+ return 0;
+}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_is_thissystem.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_is_thissystem.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_is_thissystem.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -15,8 +16,9 @@
static void result(const char *msg, int err)
{
+ const char *errmsg = strerror(errno);
if (err)
- printf("%-30s: FAILED (%d, %s)\n", msg, errno, strerror(errno));
+ printf("%-30s: FAILED (%d, %s)\n", msg, errno, errmsg);
else
printf("%-30s: OK\n", msg);
}
@@ -32,7 +34,7 @@
hwloc_topology_load(topology);
assert(hwloc_topology_is_thissystem(topology));
- cpuset = hwloc_cpuset_dup(hwloc_get_system_obj(topology)->cpuset);
+ cpuset = hwloc_cpuset_dup(hwloc_topology_get_complete_cpuset(topology));
result("Binding with OS backend", hwloc_set_cpubind(topology, cpuset, 0));
hwloc_topology_destroy(topology);
@@ -64,7 +66,7 @@
hwloc_topology_destroy(topology);
- free(cpuset);
+ hwloc_cpuset_free(cpuset);
return 0;
}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_object_userdata.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_object_userdata.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_object_userdata.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_synthetic.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_synthetic.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_synthetic.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -16,7 +17,7 @@
{
hwloc_topology_t topology;
unsigned depth;
- int i,j, width;
+ unsigned i,j, width;
/* check a synthetic topology */
hwloc_topology_init(&topology);
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_type_depth.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_type_depth.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/hwloc_type_depth.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdio.h>
@@ -12,9 +13,9 @@
* and hwloc_get_depth_type()
*/
-#define SYNTHETIC_TOPOLOGY_DESCRIPTION "machine:3 misc:2 core:3 cache:2 cache:2 2"
+#define SYNTHETIC_TOPOLOGY_DESCRIPTION "machine:3 group:2 group:2 core:3 cache:2 cache:2 2"
-int main()
+int main(void)
{
hwloc_topology_t topology;
@@ -22,27 +23,27 @@
hwloc_topology_set_synthetic(topology, SYNTHETIC_TOPOLOGY_DESCRIPTION);
hwloc_topology_load(topology);
- assert(hwloc_topology_get_depth(topology) == 7);
+ assert(hwloc_topology_get_depth(topology) == 8);
assert(hwloc_get_depth_type(topology, 0) == HWLOC_OBJ_SYSTEM);
assert(hwloc_get_depth_type(topology, 1) == HWLOC_OBJ_MACHINE);
- assert(hwloc_get_depth_type(topology, 2) == HWLOC_OBJ_MISC);
- assert(hwloc_get_depth_type(topology, 3) == HWLOC_OBJ_CORE);
- assert(hwloc_get_depth_type(topology, 4) == HWLOC_OBJ_CACHE);
+ assert(hwloc_get_depth_type(topology, 2) == HWLOC_OBJ_GROUP);
+ assert(hwloc_get_depth_type(topology, 3) == HWLOC_OBJ_GROUP);
+ assert(hwloc_get_depth_type(topology, 4) == HWLOC_OBJ_CORE);
assert(hwloc_get_depth_type(topology, 5) == HWLOC_OBJ_CACHE);
- assert(hwloc_get_depth_type(topology, 6) == HWLOC_OBJ_PROC);
+ assert(hwloc_get_depth_type(topology, 6) == HWLOC_OBJ_CACHE);
+ assert(hwloc_get_depth_type(topology, 7) == HWLOC_OBJ_PU);
assert(hwloc_get_type_depth(topology, HWLOC_OBJ_MACHINE) == 1);
- assert(hwloc_get_type_depth(topology, HWLOC_OBJ_MISC) == 2);
- assert(hwloc_get_type_depth(topology, HWLOC_OBJ_CORE) == 3);
- assert(hwloc_get_type_depth(topology, HWLOC_OBJ_PROC) == 6);
+ assert(hwloc_get_type_depth(topology, HWLOC_OBJ_CORE) == 4);
+ assert(hwloc_get_type_depth(topology, HWLOC_OBJ_PU) == 7);
assert(hwloc_get_type_depth(topology, HWLOC_OBJ_NODE) == HWLOC_TYPE_DEPTH_UNKNOWN);
- assert(hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_NODE) == 2);
- assert(hwloc_get_type_or_below_depth(topology, HWLOC_OBJ_NODE) == 3);
+ assert(hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_NODE) == 3);
+ assert(hwloc_get_type_or_below_depth(topology, HWLOC_OBJ_NODE) == 4);
assert(hwloc_get_type_depth(topology, HWLOC_OBJ_SOCKET) == HWLOC_TYPE_DEPTH_UNKNOWN);
- assert(hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_SOCKET) == 2);
- assert(hwloc_get_type_or_below_depth(topology, HWLOC_OBJ_SOCKET) == 3);
+ assert(hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_SOCKET) == 3);
+ assert(hwloc_get_type_or_below_depth(topology, HWLOC_OBJ_SOCKET) == 4);
assert(hwloc_get_type_depth(topology, HWLOC_OBJ_CACHE) == HWLOC_TYPE_DEPTH_MULTIPLE);
assert(hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_CACHE) == HWLOC_TYPE_DEPTH_MULTIPLE);
assert(hwloc_get_type_or_below_depth(topology, HWLOC_OBJ_CACHE) == HWLOC_TYPE_DEPTH_MULTIPLE);
Deleted: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ibverbs.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ibverbs.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ibverbs.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,44 +0,0 @@
-/*
- * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
- * See COPYING in top-level directory.
- */
-
-#include <stdio.h>
-#include <assert.h>
-#include <infiniband/verbs.h>
-#include <hwloc.h>
-#include <hwloc/ibverbs.h>
-
-/* check the ibverbs helpers */
-
-int main() {
- struct ibv_device **dev_list, *dev;
- int count, i;
-
- dev_list = ibv_get_device_list(&count);
- if (!dev_list) {
- fprintf(stderr, "ibv_get_device_list failed\n");
- return 0;
- }
- printf("ibv_get_device_list found %d devices\n", count);
-
- for(i=0; i<count; i++) {
- hwloc_cpuset_t set;
- dev = dev_list[i];
-
- if (hwloc_ibverbs_get_device_cpuset(dev, &set) < 0) {
- printf("failed to get cpuset for device %d (%s)\n",
- i, ibv_get_device_name(dev));
- } else {
- char *cpuset_string = NULL;
- hwloc_cpuset_asprintf(&cpuset_string, set);
- printf("got cpuset %s for device %d (%s)\n",
- cpuset_string, i, ibv_get_device_name(dev));
- free(cpuset_string);
- }
- }
-
- ibv_free_device_list(dev_list);
-
- return 0;
-}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,100 +1,81 @@
- TGJ í_s;åïëøSðq7bÔÿEö[÷8&Æ1Û³ÛíØØ'F¤%%ARîëùô[ )]E
J Ûºy~;m[eBª¬ ê§ipwÃÅÔLî&«çÍl»ù_²¢*ïãÿêʫݵs»ÿ=ðÖF9ã±ææªR¿|Þoã2Ïm½~ùr¿¼/Þ¸n¶Þp|C¼èñ_|ABüu¨bü}ó{Ä7âßüa¾øº¤·öñ¾ãuMüµuÖkeCÿàn` èMßFxüc¤gÍrýO¨ßgér=O?ýéyû0[lç?ýåãæY|æ?¯hÿái9=þSó{k÷¿,ê§YóçÏõãà_ëÙ ùgÿ½ÚÎÖËÅÿØ>ýÏÁ½´4ÿa³VóÅý®Ùøéù÷ÿ§jøkÂI=y
-6óÿªqÿøóÕÃÍ|Ò´°ûÕÍüK³ûMóóa[m¾ðúñ/ö_ªWóÉþ+:|/æÛyó¿W]=Ç/þmâodz_'³Õv¾\þ.*a:x}o~ææ#>ü}õzõcÝ´Þü¡ùgïO³Át6Xmfíf2xÚ¬«z6xÌ_»öÙjð´]7_¹_©§å÷æ²müg6&_7§§__m>aÓ|Zó<læoîõ¯ñë³_·»KÆËÕvðø4°ÓÅòïñ/w¿¬g«ñýr9¬óÁcýðuÜ\3yZg÷õäÇ/ËûåÓ|o
-:ü¡ Êßþ×Oî¸ûæ;»7àð]¾Ü><ãúq~¿xjý_ÖÓisÇ7»Ëâç:5ø2ßn/aûçîÿæû|½m«æ;^êEÓLü?6wnðµ¹Ùßÿ¶ÛÕǨþÝ< úúZµP´y@ú§@Í;{@utØ~@
-ÐæF?ýj7è=è¨ýZ< Vÿ¡yÀ~öÔ½³ÔôèAj? èûâýïæ½ÞÝ~@=Ð÷ñwöÚ>=¨i? èûV¿ôÔ¶Ð
-èûx@ïìu}zP×~@x@ßÇ:úÝ< oô ¾ýð¾T¿·TïÓ
^H%iävhõó?¢ï-tý}£½LB6é½<¢ï-úô¢ÒIù¤Ý#:üùÑ÷Pºþ¾Ñ^H(idÞË#úÞRJU^Ô^H)iäÞË#úÞJ×Ñ뽨½TÒÈ*ýÄoôünTÀÍþïÍìñkM )þÿªù½Ò¾
-þnÅÿ7´6ÞöÿïßâolÿÊhÿ?ÿ2}~zú®^*oé[
àþk:ûÓý?¾rôÏAvTF`õ°k§¬à©Âp80ÎÑ ª®TªýKj¦óMܺrfà|ê!T*^ß|D¯7Õèåz=ÊÍt×A0ÎÇËGCkªÁH7éÍÀjþè¶¹¨ÒJv¨Ákóv´6ßdl¤ydâÎx;tëâ?¶/W63io® £vFNÇgÍ_ë|ó]
æs2ñ³ÉrseÕ|Xó&¶«_Í·è}ü~Bó-ÄlÚaóýUs7]soïQCüÐ ªâO>®iIéÑ®QÂîg»²ûÀà_®kâcì°¹±*þë&F»ïÐ7#å@[sÜvóÙÍM¬âG¦QZs¡Öü»oR7aÑÆæfªQ0£ª ÿ°*£îO.5Í7®uü;oß}#U57l÷m6¹°r»Û3TjÍïÆÆkìoߥßy¡xÝ0×ü0ntÒp5Ò»F¬«Üî9Ó¾ùÌ®ÝsѼYn×±]«ªæiqÕàõçlýú{ÝîI¯³û[×<G´#üÉø
_ø
_ø
_ø
_øõ~}lݱfhÜèÃíüiÖÌ6V)S½dbf
-½Ùýy3^?/óÅý@þüåq9ù66÷~eËÊå÷ÿÍ5ºÿêæÌZ§ãú«tÀú/×ã?}7ºÈðt¿
-VWFYë¿Xø³p;þÍï·³'Êcÿ¸þWäxèÿæK}ýÿoë¿F9úo,$Å?.~öxÒâ_5ñ×Ö ÿg!=þÛåjù¸¼ÿÑýAH¿5
-õÿX Äû°ÕÓñìz1Àîü¿ÖgñÆ;äÿ8ØÀýÎÞjAWú±Wõä[}?ϧ۸©ÿ¦³?Õ¥|þ9°¾hú&ï«?&]ÿÎkøXÀÀ/ªþoÏþûÌÿ}e=ôÏÁ> tBÉ÷þ?~o.û
{ÌÿÂøÏBðEkü¿®þ.úwçëU
ó?Xwz Á¤ë¹hd2Ki#*üíýçã¿ñó4Ô/týïÊ$¹ ºåU0^i÷ÿcFþ¾ñ/¦³_M·Ç GþßäÿY Æ?¹ÙÆíù8_ÿw^cüç ùÌÄBÔÿ« ¾Wõz;ÅNÛH^ÿ³ÊaýÌÿeCÔÿöÇ*Ãø¯ÏçÍøú?,|^Ì¿ÎgSôB!êWñVéù?ÖÿY0P¾hú,fëÙbòcÿpy9à¶þíyþßkøÿYd¨ëõz67_xà >þÇB`Ð?ðÿȨÿ¿×?6ãå×q½Ù,'óz;ÿ>ßþ8o#yü·JkìÿaA£M¾ñÿ©^]iãöú_kÿ¯sðÿ°° öÿJ
¨ÿÅóÓÙ:Î â¿»ÒÆíñßë¿ù
-ôÏAÌÿCûr!é_ô¡þÄøgòïÿpÿ1àþ
-Qÿåü_Ð?ðɨÿ<þ¯Öû_3üCÿ,|¬·5º ¹õ_Îÿ
õ0þ˨ÿrþ/ø?YÿK6Ôõ¿bþ/ìÿdöÙõÉÿÕZÿÓ8ÿìÿM¾ñ?³ÿúgá
ÿK(Dýgòµê?zäÿxð3 Éô¯ú¿PÿbüËù¿°ÿø¿dCÔ9ÿôÏò¿²!ê?Sý¯öøóÿxø´Øl×ÏØi£'Qÿåü_Èÿ²ñ_6Dýó!ÿÃü_²¡®ÿóÁÿÉü_²!ê¿ÿõ?Y@öW6ùÆÿÌþ/è
Cþþ/¡õ_Îÿ
õàÿMªþ;ùxBTxwÿWhô¯ÿ
ôø¿ÿÞ¹ôøÛæ:ÄBü·ëY=oæ_ûvÿƽIÿÇøãpþ/0LdBÐÿ«÷oUO¾Õ÷³ñ|z¹´õ¿¨ÿJáü_ÿ
-AÿåúºæI׿Cý&°ð'ªþoÏþûÌÿ}eQÿ
C&èdïýÿº¨Çüßâü_°ú/\ãÿö¿Äüßný¯
-¨ÿÀ¹³è®ÿå"ZýSÚ
-Iã¿ñó°þ'týïý?)mtËÿª`¼ÒÊØ¨ëÿe¡oüç?vj£Gþß#þ<ã©þO8_ÿÿxþ'* É
¨ÿõ¾þÖÿXÀü_6Dýgªÿs>ÿCý?.>/æ_ç³)z¡õ_ þÏÞÿSaýäÿdCÔú?»ü¿Wðÿ³ú?²¡®ÿå¯ÿ³Ëÿù?ÿeCÔ¦ú?ö|ý¯ù#ôÏF0ÑäÿsÕÿ ûú?ðÿ°p ÞBÔ¦ú?þ\ÿ^¡þ/1ÿíË
¤UÐÿeáÿâÿç¿ò¿ÿ±óßdCÔ9ÿôÏü_²!ê?ÿ«õþçþYøXoktr!ê¿ÿë?,`ü
-Qÿåü_ð² ÿl¨ëÅü_ØÿÉü_²!ê¿Àùo{ÿÎáúM¾ñ?¯ÿþo^°èdBÔóßþ/¬ÿ³óßdCÒ¿.èÿrðq@9ÿöÿ° ÿlú/çÿþY@þW6DýgªÿÕÿqþíúy;mô!ê¿ÿù_0þ˨ÿrþ/äXÿK6Ôõ¿bþ/ø?Y@öG6Dýó¡þ'пlòÿý_Ð?/ Xt2!ê¿ÿëÿ,Àÿ%Týû¤?÷D
w÷Uþµ58ÿ
ôø¿ÿÞ¹ôø[ûÄ¿<øoÖ³z:ÞÌ¿4÷íþ{6ÿñÆ£þõ
ILúõþêÉ·ú~6O/·¶þõ_)õ0û
-AÿåúºæI׿óùàÿ
-Uÿ·gÿ}æÿ¾Býö°ÿ%ßûÿuPù¿
ÿá&×øÿý/1ÿ·[ÿ«*äÿXpwè$®ÿå"ZýSÚ
-Iã¿ñóðþ/týïý?)mtËÿª`¼ÒÊØ¨ò¿ôÿáüÇNmôÈÿûü?ÄøgªÿÎ×ÿqþñüOT QÿêÿTûú?XÿcóÙõ©þÏùü¯ÿ
-ôÏÁçÅüë|6E/ ¢þÔÿÙé?`ÿðÿɨÿõvù¯áÿgõdC]ÿË_ÿgÿóý
-QÿêÿØóõ?±ÿÐH&ßø«þÏnüCÿæ_ðÿ
¨ÿLõü¹þ=êÿñóÿо\HúWåü_¾ÿbüÿ¶ÏÿbþÇÎ
-Qÿåü_Ð?ðɨÿ<þ¯Öûsúgác½ÑÈ
¨ÿRþ/_aýÿ²!ê¿ÿþOàÿ
-uý¯ÿû?YÿK6Dý8ÿíàÿÿìÿM¾ñ?³ÿúgáÐÿÂÿ%¢þÿvðaýÿ&þuÁú_¨ÿÆ1þåü_ØÿÃü_²!ê¿ÿúgù_Ùõ©þW{üÇù<|Zl¶ëçIì´Ñ¨ÿrõ¿ÿeã¿lú/çÿBþø¿dC]ÿ+æÿÿø¿dCÔ9ÿê²ì¯lòÿý_Ð?þþ/¡õ_Îÿ
õàÿMþÓþÝq[ÿÇõB£pþêNc @0©ã¿M:ùwOTxwÿçNÿÖø?9Hÿv¹Z>.ïtÒâ¿óÿê
-õY Äû°ÕÓñfþ¥¹o÷oÜïÿÆcý
CÈ ÿWïïª|«ïgãùôréù¿Jy¬ÿ± ÿlú,××5LºþרÿÉô/ªþoÏþûÌÿ}eáÿcá ºä{ÿ¿n ì1ÿ·¨ÿÀ
ðEküÃþÛ'ÿ_ÔfÁÜ¡LºþÓM Qá¡óøóƬÿ³÷Ù¤ëïÿKi£[þWãVÆFý[ÿå oüç¿vj£Gþç?2A¦ú_¡]ÿ+`üç ÿ
-`r!êç?¾s0ÿ
-Qÿêû«±þÇÂçÅüë|6E/ ¢þÔÿ
-ûó1ÿg»ÿdCÔ?Î|ç þl¨ë8ÿñ}ì¿lúÏTÿË¢þ×?ÐH&ßøóß#`ÿ¯PúÏTÿË£þ×?ÿöåBÒ¿*áÿ
-{ÿÿbüÿxÈÿbýÿ(¢þø¿ÂÞÿý³ ÿlúÏãÿjÕuõßxøXoktr!ê¿ÿþo0þ˨ÿþ¯°ó)ø?YÿK6Ôõ¿üþ¯°óYäXÿK6Dý8ÿq·þ§ö±ý²É7þçòíÆg¡ÿK(Dý8ÿ1ìý_Xÿgç?ʤ]Ðÿåáÿâÿrþ/øÿYÿK6DýóAÿ, ÿ+¢þ3ÕÿjÿúgáÓb³]?Ob§@ Dýó!ÿËÆÙõ_Îÿ
üðɺþWÌÿÿ'ðɨÿbþ/ú, û+|ã^ÿêòp ü_B!ê¿ÿëÿ,Àÿ%TýϧiþÒÇÿeTÿ½â?y^¯gíxºo¶q{þw¾þãëÑÿsPOVóq*Fô¿lä¿X®Çëå[mÜÿ×ÿ ZCÿ,<ÍϾ\ô¿ZÏ6îSÛH׿ÁøÏºÓúKêø¯]êÛ_âûk¾n´*¼ÿqÐ#þÛåjù¸¼ÿÑùAH¿5Þ"þPâ¿}XÏêéx3ÿÒܸûë7')ÿ³h ÿìbÓü9L(úÝüµª'ßêûÙx>½ØÆíù¿9Ó¥
-ü,T¾h(ú,×W5Lºþ¯àÿ`¿lÈú¿9ûï5ÿW¨ÿËC¼ýÌÿÅñýÿêÛã¿=ÿÛú_,hìÿM¶ñ´ÿ+ë_9¬ÿ± é¡ÿå"îõNhc§ð¤÷ã+ÌÿY@ýÙôÐÿ~HBÝò¿*¯´26ê·ÿùßòôÿnéôôÈÿü?Ôøw) >ÿwÞ`ÿM
-°¡ê¿KØäüU. ÿÇæÿ²¡ê¿KØÛù¿óù_3þÃÿÏÂçÅüë|6E/ ªþ»MÿÑÿ
-ýÕdCÕ°=òÿ> ÿÇê¿Ê¼þס lºþC¥¡àÿ
-Uÿ]
-À&ëß*°ÿ Édÿ¯½½þ×òÿ{
-ÿ»Ø(øÿ¥BÕ°·ÇßÒ?üÿ<Äü?´/þU9ÿÿjüóø¿\+ÿù8ÿ[6Týòyèø¿dCÕÿWëýÏyý³ð±ÞÖèäBÕ1ÿÖXÀø/ªþù¿àÿdþ/Ù×ÿJù¿ àÿ
-Uÿyü_õ?°ÿìÿMÆñ?¯ÿúgaÿT¨úÏãÿ:Ïÿü8ÿ[64ýërþ/ÿÔøóaÿðɪÿbþ/èäeCÕú_íñçÿñði±Ù®'±ÏFO ªþù¿Pÿÿ²¡ê¿ÿùàÿ
-yý¯ÿúgþ/ÙPõ_Ìÿ
ú, û+ã^ÿôÏÂ.6
-þ/©Põ_Ìÿ
õàÿMþWËM<î;åìßÈmýÕ°!ÿiÞÿYP8þ[4ÉãÊÁ¿¢Â;û?wú×Öàü_Òã¿]®ËûÝôø[]9ÄBü·ëY=ÇÁ|qÿƽIzÿßÅ?ý,¼,Àb þ_¿«zò¾çÓËm$ÿïô_)óYÀÂlú,××5LºþרÿÆü²¡êÿöì¿ÏüßWðÿópE7 |ïÿÿ_kþoÆ0þË&×ø]ýùÿýú_ÿ?ê=dÒõ¿\Ä>)mD
¤ñß þP¿lÒõ¿·ÿ¥´Ñ-ÿ«ñJ+c£þGþ
¾ñ?ÿÚ©ùøó@ò_æÿá|ýß9Ôg!ÿ
-`r!ê¿Kù¯ôõ?«ÖÿxÀü_6Dýw)ÿÕ!ÿw>ÿk®Æþ?>/æ_ç³)z¡õߥüW/ÿO
õ`ü
-Qÿ]Ê¥ÕÿÙçÿ½ÿÔÿ
-uý¯Cù¯ãóðþ/¢þ»ÿJÿÒûXÐdòÿWËõÙÿë,ü?,¼LÀÐȨÿ.å¿zÔÿ ^¡þ?1ÿíË
¤UÐÿ
óY Æ?ÿë|ÿÃü ÿ(¢þKù¿lý³õ_ÙõÇÿÕzÿk®þYøXoktr!ê¿ÿë?,`ü
-Qÿåü_ð² ÿl¨ëÅü_ØÿÉÆÙõÉÿÕZÿÓ
-þO`üM¾ñ?³ÿúgá¥F7 ¢þ3ù¿Zõò<àüGÙôßñ0¸¨ðdÿ
ÿbüù¿öÿ° ÿlú/Wÿúg뿲!ê?Sý¯öøóÿxø´Øl×ÏØi£'Qÿåü_Èÿ²ñ_6Dýó!ÿÃü_²¡®ÿóÁÿÉÆÙõ_Îÿ
ú, û+|ãfÿôÏÂKn@&DýòyäÿxÿK6©úwI'î
-ïîÿªýkkpþ#éñ=ÿ½séñ·&öÿyñß>¬gõt¼iîÛý÷&mþãGýPÈ ÿWïߪ|«ïgãùôriëQÿòXÿg³Ùô?Y®¯kþtý;¯ÿg¿l¨ú¿=ûï3ÿ÷ê¿ð°E7 |ïÿ×
-@=æÿþ?`ÿM®ñÿ
-û_bþo·þWUÈÿ±àî<z Á¤ë¹Vÿ6¢ÂCÒøo¼Áüøe®ÿ½ÿ'¥nù_WZ5Âoôo}
ü/}ã8ÿ±S=òÿ> ÿÏ1þêÿóõÿÂD<ÿäBÔú?Õ¾þÖÿXÀü_6Dýgªÿs>ÿsÎkèÏù×ùl^@(Dý¨ÿ³ÓÀþàÿ
-Qÿêÿìòÿ^ÃÿÏêÿȺþ¿þÏ.ÿæÿ,@þ²!ê?Sý{¾þ§5öÿ° : ÉäÿsÕÿÙÿÎÁÿÃÂË,zõ©þ?׿Gý?bþÚIÿªÿËø¿8 Æ¿Àùoÿæ,àü7Ùõ_Îÿý³ ÿlúÏãÿj½ÿ9ç¡>ÖÛ]\ú/åÿòÖXÀø/¢þËù¿àÿdþ/ÙP×ÿJù¿,ö² ù˨ÿç¿ü_ð²ý²É7þgöAÿ, ÿPú/pþÛÁÿ
õpþlHú×ý_¨ÿÆ1þåü_ØÿÃü_²!ê¿ÿúgù_Ùõ©þW{üÇù<|Zl¶ëçIì´Ñ¨ÿrþ/äYÀø/¢þËù¿ÿaþ/ÙP×ÿÕÿÿÈ_6Dýó¡þ'ÈþÊ&ßøÙÿý³p ü_B!ê¿ÿëÿ,Àÿ%Týëg>ÞÙÿÕ¼ø+£måáÿâ Gü_ïÚFzüç?!þå¡Äû°ÕÓñfþ¥¹q÷×oNÒüÿ`qþ7ûÙ¿Âü_(ý¿ÿVõä[}?ϧÛHZÿÛé¿Òç²òÿ²¡è²\_Õü1éúw> þøeCÖÿÍÙ¯ù¿Âúñö[ÌÿÅñýÿªèöøoÏçÿÖÃÿËÿemü'ùÿ¹þÎàA;mÑ¥þèõOhc§ð¤÷ã+ÌÿYÀþÙôÐÿÞ ÐF·ü¯
-Æ+úwç±Ð;þ »´Ñ#ÿ,òÿ,Pãߥ Púüßyý?,Äó?QH.Týw) ÿ³ÊyäÿXÀü_6Týw) t;ÿw>ÿkÆìÿaáóbþu>¢
-Uÿ]
- %ÿÆú, ý'ªþ» êÿ÷ù?PÿG6äõ¿Òõ*
-ý³ ÿl¨úïR (YÿVéý?,hl MÆñÿj Ûë-ÿ¿×ðÿ°°_~
ÿ_*Týw) t{ü÷-ýÃÿÏCÌÿCûr¡é_óÿÆ5þyü_®ÿÅüÿ&ªþù¿ àÿ
-UÿYü_÷?ç
-ôÏÂÇz[£Uÿ¥ü_ë?,`ü
-UÿÅü_ð² ÿlÈë¥ü_Ð?ðɪÿ<þ¯ÖúØÿÅä/ã^ÿôÏÂîö+ø¿¤BÕÿ×yþ?xäÿxÀùo²¡é_«ÿ¥àÿâÿbþ/ìÿaþ/ÙPõ_Ìÿý³ü¯l¨úÏSÿ«=þãü?>-6Ûõó$öÙè BÕ±ú_¨ÿËÆÙPõ_Ìÿ
üðɼþWÊÿý³ôl¨ú/æÿBý? Ùdÿóú¿ v·_Áÿ%ªþù¿°þÏü_²IÖ¿M9ùsOTxÿKÛ
-ç²Ð#þ¯ç¿wm#=þÖxøs@ÿöa=«§ãÍüKsãî¯ßóú/<ìV_0ÿEÿ¯Þ¿U=ùVßÏÆóéÅ6Òóÿ68ÿÿ
-EÿåúªæI׿óõXÿG6dýßý÷ÿÇÐ?;÷æÿbÉøþÕ t{üoùÿlÿm¡|Édÿ¯Ûÿ:è?뿹úç@;té¡ÿå"ZýÚØ)<éýßø
-óðþ/úßûÚèÿUÁx¥±QÿÎâü/zÇÿpþc6zäÿEþjüóÔÿ9ÿ;oPÿ
xþ'* É
ªÿbõÿcóÙPõ§þÏùü¯ÿ±ÿ
Ïù×ùl^@(Tý«ÿýÿ,`÷l¨ú/Vÿù?PÿG6äõ¿Rõ ü
-UÿyêÿØvýìÿaAch2ÿyëÿÀÿÃÂnõEÁÿ/ªþóÔÿñ-ýÃÿÏCÌÿCûr¡é_áü·w5þ8ÿí}óßdCÕ?Î{ßÀÿ%ªþ³ø¿Zï8ÿõ¶F ªþqþÛûã¿l¨úÇùoïø¿dC^ÿÃùoïø¿dCÕ?Î{ß`ÿl2ÿ8ÿí²ë}ü_R¡ê翽opþlhú×åü_þ/¨ñ/æÿÂþàÿ
-UÿÅü_Ð?Èÿʪÿ<õ¿Úã?ÎÿãáÓb³]?Ob@ Týó¡þ/ÿeCÕ1ÿò?,Àÿ%òú_)ÿôÏü_²¡ê¿ÿõÿX@öW6Çÿ¼þ/è
]ï«àÿ
-UÿÅü_Xÿgþ/Ù¤ê¿[ůS¢ÂÓÎÿÔV£þéñ=þ½sÝâèÿmþ?]YÄBü·ëY=oæ_ûvÿƽIÿïâÿ
` þ_«zò¾çÓËm$ÿíô_)ó?YÀ¿lú,××5LºþרÿÄô/ªþoÏþûÌÿ}ÿ/À |ïÿÿOkþoÆ0þË&×ø]ýù¿ýú_ÿ/êKI×ÿ>ýÒFzþÏXü}ã8þS=òñçÿ.å?:ÿá|ýÏ9Ôe!ÿ
- r!ê¿Kùô÷«ÞÿyÀì_6Dýw)ÿÑaýÿ|þçâåÐ?ó¯óÙ½PúïRþ£Wþ¿Âúpÿ˨ÿ.å?Òöÿïó^ÁÿËêȺþסüGñ?ù?Èÿ˨ÿ.å?ÒÇ«´ÿÐH&ßøµüGýÎÂÿËÂKÐȨÿ.å?:ÿþ\ÿ^¡þ/1ÿíË
¤ÿÅ@¢Âý_8ÿbü3ù¿Îýßó?&pþlú/åÿ²ôÏ^üdCÔÿWëý¯¹úgác½ÑÈ
¨ÿrþ/¬ÿ°ñ_6DýóÁÿÉü_²¡®ÿóaÿ'ðɨÿLþ¯ÖúVð²ý²É7þgöAÿ,¼D ÝLúÏäÿjÕsÈÿñódCÒ¿.èÿ2ðq@9ÿöÿ° ÿlú/çÿþYÀlúÏTÿ«=þãü/>-6Ûõó$vÚè BÔ9ÿò¿,`ü
-Qÿåü_Èÿ° ÿl¨ëÅü_ð² ÿlú/çÿBýOýM¾ñ?³ÿúgá%èdBÔ9ÿÖÿYÿK6©ú&ü¹'*¼»ÿ«jô¯Uðqÿ×ó;·kâú/â_Bü·ëY=}=üzióÿÿ`<üß,ìï¿Â2 PúõþêÉ·ú~6O/·¶þõ_©ó?Y@úO6ýOëë?&]ÿÎÔb¿l¨ú¿=ûï3ÿ÷öÿð°»ÿó©ä{ÿ¿n ê1ÿ·ã?C_4¹Æÿ7ìù¿Ýú_UÁÿËÂðn@0éú_.¢Õ?¥¨ð4þo0ÿgÆÙ¤ëïÿIi£[þWãVÆFýÛ`ÿå oüç?vj£GþßäÿY Æ?Sýp¾þï<öÿ°ÏÿD ¹õ_ þO÷ÿ8¬ÿñù¿lúÏTÿç|þ×ÿØÿÃÂçÅüë|6E/ ¢þÔÿÙé? þØý#¢þÔÿÙåÿ½ÿÔÿ
-uý/ý]þ?8ÌÿYÿG6DýgªÿcÏ×ÿ´Áþt@ |ã®ú?»ñõ¿8¬¿Âÿ/¢þ3Õÿñçú÷õ¿Yùh_.$ý«þ/ÿÆ1þΫpþ#8ÿM6Dýó)èø¿dCÔÿWëýÏ9ý³ð±ÞÖèäBÔ9ÿÖXÀø/¢þËù¿àÿdþ/ÙP×ÿù¿°ÿø¿dCÔóßöþ/
-ÿ'Øÿ!|ãfÿôÏÂþþÃÿ
%¢þÿ¶÷!ÿÇÎ
-Iÿº ÿõßX Æ¿ÿËcÿðɨÿrõ¿ ÿ
-QÿêµÇÿÇçÅf»~ÄN=@ú/çÿBþÿ²!ê¿ÿùàÿ
-uý¯ÿþOàÿ
-Qÿåü_¨ÿɲ¿²É7þgöAÿ,ìï?ü_R!ê¿ÿù?àÿMªþGI'î
-Oóik5ü_¤Çÿõü÷Îm¤Çßåñß>¬gõt¼iîÛý÷¦Çüß þûåÌÿ¥BÐÿ«÷oUO¾Õ÷³ñ|z¹ôõÿJÿÉÒ²!è²\_×ü1éúwÞ þðÿȪÿÛ³ÿ>ó_9¬ÿ±°»ÿó©ä{ÿ¿n ê1ÿ·8ÿ/\ãÿö¿>ù¿ªÿ
áz ɤë¹Vÿ6¢ÂCÒøo¼Åü¼ÿË&]ÿ{ÿOJÝò¿*¯´26êßü/}ã8ÿ±S=òÿ> ÿÏ1þêÿvýìÿa!ÿ
- at r!ê¿\ý¬ÿ±ù¿lúÏTÿç|þ×ÿØÿÃÂçÅüë|6E/ ¢þËÕÿÁú?Øý#¢þËÕÿÿÔÿ
-uý¯XýÌÿY@ö_6Dýgªÿc[õöÿ° : ÉäÿóÖÿÁù<ì§_ðÿK
¨ÿLõ|»þê³óÿо\HúW8ÿí½C?Î{çàü7ÙõóßÞ9ðɨÿ<þ¯ÖûÎãâc½ÑÈ
¨ÿöÎÁø/¢þqþÛ;þ/ÙP×ÿpþÛûþ/ÙõóßÞ9Øÿ!|ã?Î{ì»_ø¿¤BÔ?Î{çàü7Ùô¯ú¿PÿbüËù¿°ÿø¿dCÔ9ÿôÏò¿²!ê?Sý¯öøóÿxø´Øl×ÏØi£'Qÿåü_Èÿ²ñ_6Dýó!ÿÃü_²¡®ÿóÁÿÉü_²!ê¿ÿõ?Y@öW6ùÆÿÌþ/è
}÷ÿTú/çÿÂú?ðÉ&UÿÚ'ý¹#*¼³ÿË5_7Ú5ÿ=âÿz |×6ÒãoÿJü·ëY=oæ_wýæ$ÍÿwñÖ`ý
xû
-ó©Pôÿjþ[Õoõýl<^l#iýo§ÿJ[ìÿ`¡ðECÑÿd¹¾ªùcÒõï|
÷àÿ
-Yÿ7gÿ½æÿÍ#ôÏA¼ýÌÿÅñýÿªèöøoÏçÿ6èí¡|ÉdÿIþ¿p®
ú/<hw. at 0=ô¿\D¯B;
'½ÿ_aþÏÞÿeÓCÿ{PBÝò¿*¯´26êß9ü/½ã8 ²K=òÿÁ"ÿÏ5þ]
- ¥Ïÿ78ÿ
xþ'* É
ªÿ.óV¡þÿ˪ÿ.nçÿÎçÍøý¿,|^Ì¿ÎgSôB¡ê¿K äñ߸àQÿìþ
-Uÿ]
- õÈÿûü¨ÿ#òú_@éúêñä¿l¨úïR (Yÿ¶¹ûXÐúLÆñÿj Ûë-ÿ¿Gý/âíÇþ_¹Põߥ Ðíñß·ôÿ?1ÿíË
¦UÎÿeàÿâÿ<þ/×ÊÿbþÇÎ
-Uÿ¥ü_úgþ/ÙPõÅÿÕzÿsÞ@ÿ,|¬·5º ¹Põ_Ìÿ
õ0þ˪ÿbþ/ø?YÿK6äõ¿Rþ/èø¿dCÕÿWkýOìÿbû?dqüÏëÿþY·þ/¹PõÇÿuÿù?pþlhú×åü_þ/¨ñ/åÿ2ØÿÃü_²¡ê¿Xý/èäeCÕú_íñçÿñði±Ù®'±ÏFO ªþù¿Pÿÿ²¡ê¿ÿùàÿ
-yý¯ÿúgþ/ÙPõ_Ìÿ
ú, û+ã^ÿôÏB¼ýðÉ
ªÿRþ/äÿxÿK6Éúïfù:!*<Íÿ¥m
óYèÿ×óß»¶kË(ñß>¬gõt¼inÜýõÓcþo
-ê?° / È¢ÿWïߪ|«ïgãùôbéùÿJìÿfËÿ²¡è²\_Õü1éúwÈÿ3ÿlÈú¿9ûï5ÿ èÝý`þ/ïÿW
-@·ÇÿÿÏzäÿXÐ &ÛøÝþ×Aÿá\ÿÊaýîЦþhõOhc§ð¤÷ã+ÌÿYöeÓCÿ{ÿOBÝò¿*¯´26ê¿é
-ÿå wüç?vi£Gþ?XäÿY Æ?Oýóù?Îã"ÿ
- at r¡ê¿ØùoÈÿ±ù¿l¨úÏSÿç|þç¼ÑÐ?ó¯óÙ½P¨ú/VÿûXÀîÙPõ_¬þò, þlÈë¥êÿ@ÿ, ù/ªþóÔÿ±íú?ØÿÃпd2ÿyëÿÀÿÃÂîþcÿ¯X¨úÏSÿÇ·Ïÿ
ÿöåBÓ¿*æÿ2þ/¨ñ/uþæ<àü7ÙPõ_Ìÿý³å_ÙPõÅÿÕzÿsÞ@ÿ,|¬·5º ¹Põ_Êÿå°þÃÆÙPõ_Ìÿÿ'ðɼþWÊÿý³ ÿl¨ú/vþö±ý²É8þçõAÿ,ìî?ü_b¡ê¿ÔùoÈÿñóßdCÓ·Ãà¢Âý_ü_Pã_Ìÿ
ý?,Àÿ%ªþù¿ °ü+ªþóÔÿjÿ8ÿOÍvý<}6zPõ_Ìÿ
ú¿,`ü
-UÿÅü_Èÿ° ÿlÈë¥ü_Ð?ðɪÿbþ/ÔÿcÙ_Ùdÿóú¿ v÷þ/±Põ_Ìÿ
õàÿM²þ»ü:!*¼³ÿËVþµSþ/zÄÿõü÷®m$Åïÿ3þ?(ñß>¬gõt¼inÜýõÓcþoqþûéæÿR¡èÿÕû·ª'ßêûÙx>½ØFzþ¿Ò¨ÿÄðECÑÿd¹¾ªùcÒõï<Îÿà¿lÈú¿9ûï5ÿ]ôÏÀîþO0ÿJÆ÷ÿ« ÛãËÿg½þ9ÐP¾h²ÿ×íôÎõ¯ÖÿXÐê@ÁôÐÿrþ mìÞõýÿ/ Ð?оlzèïÿIh£[þWãVÆFý;ëÿå wüç?vi£Gþõ Æ?Oýóù¿óç?°ÏÿD ¹Põú?ïÌÿeCÕú?çó?ç
-ÞÿYø¼Ï¦èBÕ?êÿ¼o°ûG6Tý£þÏûõdC^ÿCýw
-ü?²¡ê?OýÛ®ÿý?,è ýK&ãøú?ïÝýÇþ_±Põ§þo×ÿÿ
ÿöåBÓ·b at Qáiõl°þ/¨ñÏ~þÛ.þÈÿróßdCÕvÿWÔ¿U.@ÿ,Àÿ%ªþ³ø¿ßÿã¿
þYøXoktr¡ê?»ÿk¯ÿàÿaã¿l¨úÏîÿÚé¿òë¿,Àÿ%òú_nÿ×Nÿ¡ÒÐ?ðɪÿìç¿í×ÿtÀþo°ÿC6Çÿ<þ¯ýøúLìÓ¯ðI
ªÿìç¿ôü8ÿM64ýërõ¿ü_PãÝÿõRÿùàÿ
-U
ÿÅü_ØÿËò¿²¡ê?Oý¯¶ÿÛBÿ,|Zl¶ëçIì³Ñªÿbþ/Ôÿdã¿l¨ú/æÿBþø¿dC^ÿ+Uÿùàÿ
-UÿÅü_¨ÿ˲¿²É8þçÿ
õ?öéWø¿¤BÕvÿ×Ký/äÿYÿK6Iúß4Â&ãÕòïè7õ÷xò÷Í6¢Â»ÿý{Uaýü²Iÿ«D
§ÕÿÓç¿òÿírµ|\Þÿèþ ¤Çß
ú,â¿}XÏêéx3ÿòøö4 éý¿ÿÃ þ/û 1
-
-Aÿ¯ÖßU=ùVßÏÆóéå6×ÿM¥<ÖÿY°¾hú,××5LºþQÿøÿdCÕÿíÙù¿¯,ÖÿXØ`ù¿Pò½ÿSüù¿
ÿ
-ÂM®ñÿºú{Õ©*äÿYwè$®ÿå"îôIi#-ÿõo¼Áü¼ÿË&]ÿ{û_JÝò¿*¯´26êßü/}ã8þµS=òÿ> ÿÏ1þ]Êuÿóõçqþ7ñü_T Qÿ]Êõªÿ
õ?0ÿ
-Qÿ]ÊuÈÿÏÿñõXø¼Ï¦èBÔò_½ê)¬ÿ³Ý²!ê¿Kù¯^õ¿pþ¨ÿ%êú_ò_=ÆÿÓ
Ð?Èþ˨ÿ.å¿ÒÇ«´Æþt@ |ãÿÕò_}öÿ:ÿû `ÿ¯TúïRþ«ÃøïÛç¿¢þ1ÿíË
¤UÐÿ¥áÿâÿLþ¯ÖùOÿ1óeCÔ1ÿþYÿK6DýçñµÞÿóÐ?ëm. at .Dýóaýÿ²!ê¿ÿþOàÿ
-uý¯ÿû?YÿK6DýgòµÏÔð²ý²É7þgöAÿ,ì ÿTúÏäÿjÕôÈÿñóeCÒ¿.èÿBý7ñ/çÿÂþàÿ
-Qÿåü_Ð?ÈÿʨÿLõ¿Úã?ÎÿãáÓb³]?Ob§@ Dýó!ÿËÆÙõ_Îÿ
üðɺþWÌÿÿ'ðɨÿrþ/ÔÿdÙ_Ùäÿ3û¿ öÿK*Dýóaýø¿dÓYÿå4íÔÏß
-ïìÿrÍ×Úíÿÿ«<iñÿ¯£éïôøëûÄ¿<}âß\eRÚØÅ¿ªnÄß(gÚÄó]¬ÿgþPê§>ñïÿë½HÿíôoÂûæÎbþ'>úo^úêF5;[ú×¾¥ÿe!Ærü0߬V#¥m}ØýÕÓ|³¨ýï¿.׳ùý¢ùã|±gõ÷Ùîß8;}x\Fÿo|2ÚTf¨GÆXnfëÃ_mУ&þèg~Bzÿ6¥^ó?ù}âÿ4{/¾.;·q£ÿ×F·úÿæý?þs×Gþ2{úÛr[?þq°chà o>ºàßÖ³Ùáë¡1adÍé7³éËFÊ¡
-Güi²ýx
«ÇM|ZÔ§4EPG|¯·?>`Çñÿw=ßξÔo¼rÁ¿ÍgÿUßÏ6/oôñ7ùzµ:ú!?ÉñO±X.N>a0¨;º ~ñoõÇ£+´:þþóßþ:þ¼h»æ×K/øóòy1ýÌ¿=.~Â_ë/§ÿÞéhþõÿÌ&õüé·ï¡äñOñ×Ïõþ×;N~̾ßßÉñÑs£Ú_=zh.|õ¯ÏëÕëWÿÑZHþÚ¼ü×ÍÚµïÿö|ýÏZÔÿãÁ¨¦wóÿ
ÐsþÝìqú?öìõ¯°þÇÃ!^&iú_.â6Ô6Ò×ÿM\þPwpK&}üïxèÛ½òÿùúÄ%ÿüê;%ÓGÿùó¿÷?õ^ó¿~ähþuÇé_FÎÊgña¤íÌÏIýsäÿPÿ}JF]Èÿ
JýïQçù¿0ùPÓóÚ´²Ççÿvt|ÁyþÏ83
£näÿÔüjåÿ°éhçÿ¼2Ãã¢ÿsÍ|tA;ÿ§õÉ'ÜÈÿ©[ù?u+ÿ§Zù??²CsrÁYþÏÆ\ÐÊÿy?<¾àüz3ÿ§ÿûyèùþ§SÚèãÿý?ü?åéü/ê±p)ùü¯zöÿIÒìÕÿôÿôùü?ÖYxÑáË$]ÿKþ/ÖBþ¯<}â?ÿZù?ÔÿâA»;íÑù¥þ³çÿÜ
üÎcá5ÿç|aRöod³MGFçþ¼ñ0ýäôÿµKh£Çû¿÷ØÿÉBø³ìÿDÿÏÂ>%WÝÚÿYµ÷ºQ5t§îÿ´1§xtAkÿç@û£
-¢U{ÿçÀ½9ºàFþ·ºÿÚû?vtò=\Úÿi/¸°ÿÓ|öÇwòFþ·ºÿnå«û?ÒÇ?E{ÿçÀN.håµ7ÇM¼ÿÞÌÿVÈÿþ<ôéÿ9òF£ÿçàRòo ¡E)ôÿÏÿ`ÿ7ñöOÿ xô}ÿOÉÍôzÿ·xÿç -þ«åf3o^ÒÚ¸ÿiíÿµù°ÿW6iú¨7ñ¬Ä6zè_[¬ÿ± ýË&}þçxü?þúÄcÿ¿Æþ_w#ôÿé£ÿüþÛöÿÀÿÇ«ÿGëPù¡J1 9¥Oª¿ë`S' ë°²øSÓGÿ,þ¬ÿ³°OÉ»[þ×öXÌÙ§þoGG;ÆÝÿ¯Üñ
íú߯4qÃÿánù?\Ûÿ¡«*_pÉÿ1<þ.ø?üɺTÿû¨@»åÿp·üîÿÃ]ðX_êl.îÿ#\ðÿýéÿpðü<ôéÿYöcý
SÛöK£çúOyÿÖX8ô¿¼PzêÒFÿ«°ÿ
ñ¥´Ñ+þðÿ°Ïÿ³ÈÿqÐ'þ,ûÿ±þÇVwÀåÒGÿùóUký§Bý?^óÆÙ¡IË V'ÀãgØàíiPÁbðÓÒGÿ,ù?ø¿Yاdüü¿°ÿ;Ø£Ìoçÿ\ówü íüu'´÷[3<nâFþÏßÊÿùû¿C¥N~ù¿;þ)Úù¿;þKû¿O>áFþÏßÊÿù[ù?)ÿw½óóêø¼ÿ«ª¹û7óþÍüGþïç¡OÿÏÿÃù,´v~#ÿ'ë?åó¨ÿÀÂîþOÿJOýë@zä¼óÈÿpÐ7þ)}s¯ø;ÄôøüBþ>ño®J
-Mý»þ
ñ/þ3ü¿,¸;TLý³ÔÇû?¯ùß*TrÓ«`\ó§_¬+üäôÑ?Kþúga3·ò¿æÂþÏaÓÓÎö*/hçOr¯æBþ7W7·ò¿æVþ×\Øÿ©üIò¿áø>´ó¿M/wÜÄ
üo8:æÚÜÊÿ[ù_s+ÿknåÍ¥üoÿò¿#w|Á[ù_ófþ× ÿûóÐóý/åø~ïÿXÿc¡OüYòÿð±ÐÚùü¿(zöÿåÏÿÅú/0/týüCþ>ñgÙÿùÚÜiþ.>úÏÿñ8ÿ÷Åoù«*3¬tRP;
-') á¨óq
-¨2£ÐÅüôÑ?KþõYØ/É[ùpaÿ_Ó[ÓÎöÿùãcáBþÇÙ£ÜK¸ÿ©ôÉ7ò?áVþ'\ÈÿhuòM^Üÿwü ÎÕÇpiÿßèøùp+ÿnåÂ¥ó_½=Ö
ü2Çá¾tþëÉóðVþ'¼ÿ Èÿü<ô|ÿÓ&¡ùï*ä8èóQÿ
Kÿ"ÿ#¾ý¿Mh£Oÿß\þñ/¿ÿõXØ¿ðéJ%]ÿ'ÿ§ÿã Oü«BJ=ÆðþÇBÏøßÿú?,ÿ+>úÏÿméù_&ê¿zÛÁ61ÿëON·Zsnþ²ªÔ(ÑÏüôÑ?Kþïÿ,ìSröVþ×^Øÿ§GCí
ýÕéíüïðxK½pþ£ÖG§Ú[ù_{+ÿk/ä]uŶò¿Ú_ÐÎÿzk/¸´ÿÏ7ò¿öVþ×ÞÊÿÚKûÿÌÉOq!ÿkýñ¾´ÿï$oåíù_üïÏCþeÿü?,\:üù?9ô\ÿ)¿ÿë?,ì0à
ÒSÿUJ}Öÿ+äÿYHÿC½/ë§úqü4{Z®tj#}ýßþ
õÑ\×óò¿Ù$çú/Ñ1ÿL°ÖiûÒ¡"ÿÏÁøOæäg Gü}
ýß,tÿ|J{âßü1þ®Pÿ
ñÿ²¬×Óñ¢~ê¼èwÄíù_u£ë0ÿãà¯n8ÔL¥¤ÿïæËë¹ÂMý7?Óå°ÿ
þ?,VÏÛÙzð¯Ëõ
-}$ôßüÅl;ÞÖ÷imÜÿõþPÿ¨]6ãÿbº\'·ÑcüßíÿþËó·ÿ÷§ÿl}ÿB¹¬ÿéì{ß=ÝÖvù¿FþææÁ¬ÿpp=þûßçxÒãbI8Äñ>?=ýàXÿ=Ä¿
-qý×¢þ+ãÿ4{êÿÃÇ ùÿCüCó÷¦éÿgAãü?ÑtÔüCï6nê_ÓþßÄ_Ð?ê.üs¬^ ~ßüª-l È
+ ðK ì]]sã6í×ѯàãnÕ8Á7ȼ%ÓÔl²StmíhITI´Óί_ݤHHÞ¶{4¶$ yïAªÒõRx³dÅöqûo?
+b ¥´ÿRhõ
+Qý{ÄJL0ÆÙó%ÑìC$Ç=n<îËtEnïûU¾9S.Ûí!´ÓþÛ]±Ï .³?*-µùJ"9Úgì¿ÏVw£8ÿ©6ûk%Ñþè³ÿáamX«½ß°¿þbÆý5£ÆþdS<Àíÿíòq½~}íÃ@|%ã$þ=üWBqÃ3 பþ_Rä?Å£(æNHqGTÑ7'SR1â8b«$Ò:Dæ53¿!§ÆnÕEBªFT)¥-oªÐ¶<ÓÉKy)Â8â±H1!mñ$æLG 5
èKAÉÄTdÞÊBvHôÚ<±9HÛq[R0ÉcqaÌ_J
+stLUM0RÕ¨AíïXl>T/å¤9*eêaÙºDlKjS©ÙvékãÊ¢öx9[¡ñÚØoýµ¹Â\sTTE´}ߨδDhR5h¥ªssUª
+|)gìÃxl.,±¿66ªP2jþà¬Þ¶©Û\Dmß'Ì0Íqb.ù]ã ©1eLéD±DóÇ:&ÂZ]62sàÚÏ$ç²:ÊhsÁªÃ4)hlCDuybB16EÛ2üK{̹±-+%ÌɤѰ±IhÕZT~F¥9V5RùÅ,ß;Û.'ÚxÐÑëyW ¯S**OP¯T
+ãµ·<áJ6Jà_øÂ¾ð
/|áë^³Eù¹ã,f"Ýù:3c at F'é}ØÍöûl±$¬z¿ï7|sÑãûÛU±ø=[ê¾ö#Û¨8óü¿.7å¼½ó\çÿ5aLçó$Ïÿ Ø,úv=gz£ã?»?*ê|íÃCL3ü7oòÍ]1¼óügpq2ÿ§ùùãͯØýí;C÷§l³,vó|iÞ}ÿX>d2_|ÿóG;Ý¥ë|õl¾¡r¶.ÙêoæoÎGt÷ÓUôbEægÑoËlWlþ£\ÿgôï¢XÉپ̶[sµµÿüÏ?m}4&ñ7©Ù"]<dÑ>ÿÓÖJ Ñ¿~m÷ù´P!íó[c³û½yÃfÛªùâµJûÁá«t/ßP5Ë7y:ÚÒwÛGûås¶·Î³Ïl[æÅæøeÂ2ZeOæM³?¶¯¥W©iݼ1?̸bEÛ}ûE´Þï¢mEëE->ÇU{Ñ>ÛFërg¾¹·ß¤Ñb]<b¥ýWÑbu·zÜ?DëõçèÁLì,z(£ýóÞ¼¹Öí÷ÕØ"ób[F«uÄâûaõG´Ë¶óû¢XFÛMÒ»¹)³Xoç«ì>]<ÏnûboíâªoQ~û¯W\üËÙ½½ Ç£:~©ÄÁ<ótßoÖÆK¦Ë¥¹âûªWè6/÷ÑÙþøðÉS¾+§Ì¶æwÑ:Ýfl=ß+Ýýdþ+ËílVwPúqPú¶ê¶RtPã 1}÷Ê®ÌA©O·¡ÕÉ»wPþqÐ3=hÒvPÊé7ÆÁÞ»+sPæÑ2ÒvPz·xùqз{PFÛ*ÑA¯ÃAÕ9(÷éAYÛA:èuAõ_ÆAÏô ¼í ô:4¾2>=¨h;hzüeôL*Û ^Òk¤OÚ!%QÔ*ÕïßE¯MLzÛEÏt¢]bªI×â¢×&')^´CN¢¨'U.¿½6Aém=ÓvJ¥kqÑk´G/Ê;$%Òµ¸èµJo»èÛ½(ï(ªJïø>îøo»`¼6<ò)I0ÿÞ¶ÿáï1ÜÀÝþv?Ú½ö¯ò
+ó'ûk»þCsªÐþ¸Ðþëlíòýù¿Äû+ó93åpýèÄq^À¸ÿöw½ü§¬Ùÿ3óÂõ 7
êïÝPìÂD7ÿ÷Ïcæ¾lüGSjó
+ÍðùoÛ±J÷ãx»ýaÿ}ö_®óÁ>àa©ñùØ?_B<ÿWö·@öùbþ\hÿÛ"Ý-çViòh£zÂïÍÿ]³?£TkÿCàWÇ4ÂÁ¨pâÿA¤vn£ÿò_JüÀoÿ÷ý/Ñ?õö±Ìv6|`}AHpäÿnosä
+xð_ä?ªûÿù*øo>ÈÊyÞ»µÑ?þ§'ügöä? íaãmþ/³§|1|ÙüQjFø!ÿ¯ÀùôÛßü]fë!nàfÿ*þGáþ0¸Øþby:Á
ó¿ü¿øE0þnöH÷sSƱþñ8±?£¶ÿÇñßô 7Ãÿöÿó]À½ÿ§¢þûÛm]Ú¨ì¯õEûë'IÿǾê¬k@û;Ûó¸N]6í»ÿSAOøÏ¹ÂùX[Îò2ÒJk"fÕûu¾ßGäð÷]±ËòûÍaÍl·ÊÒ§¬úà±Eº[·00a*(ÊlwøDr;ȼsxöÿN·f¯þ_bÿû/ssÍ6CzÿøéøWë¿°ÿD¬Ú5þÝv ðìÿW¦¸¸
+÷ùÎ(Îÿ@àú¿ áÉÿuº½¼^þÓÖóAþÃàe @ðáÿ:[;mÚÃÊhëþOqþ³_ìL
+~ÎÖ¿eºú.ªó8V$~ÿ¡VàÇ]¿bÆccÓfOûlùR ¢ÒîãZ+ðý¢Ì^+°PZ6éI³z
+ó]ù\¯À¢^Ãÿîò2»M¿÷FóUöoWë¥ %²ÑÄÏév[;ãQÔÏbSl5D4ÎÂ~ù[z»ªP «øåÇ_ç6ÆíL×"õ~(ÍÓõÉyvæoëmg
+¿®ÒÛæï¹âª^à²Å*Í×_ª¸~¿~ÚìE^¯T"êþùx¸óßö·5§éøö×ÇÝöõÛ¯Í
áÖÿo½Müç¸ÌCÿçç@úØpÿiý_£þûRÔ% ÀGÿ±ë¿Qÿ>öÐÿ5ÎÿàUÿæqMÇNúÂëú¿±pÂhCÿ74ÆÁÅûoÿïroöêÿ9öÿð±?þëÿ`ÀNÿC8 vÛÀ³ÿYÿWmýóÿ
+Ìý2<ù?½þ/ÿ°A0N;TøðBÿÇù$Yݧÿë¶þ/f¦þoª`õmýJjÚú?%«èÑÿuþ¯ÛúÄÆ1téÿ¼^ ÿG¢qúׯdþ¯ûôݧÿëýZ?¶þ¤Q ÿKVoâþ¯Ïêÿõÿ÷÷þÀèÿ>ö·ó¿.mxÌÿ
+ÿç§ýG×ÿdÇú_ÌÿWýO&ÒØÒ+JÌPHóºÈT
+âÍý}Âÿ ë?qÿ'´V~âúÏ à9þ|ý'Áø_\üw¢¦×óÂç?xÚrýû¼Àñ&&|ø²þ÷ÿÁA!úÒäzGNõ?'RiÖ,P×ÿ¨H(áõ§ú'õ§ú,®R¤Oÿ#}úié*ªÑD[ÿÅõ³héÂxp@[ÿ£´QCþGúô?Ò§ÿþ'³FýOZ¶Q ¥ÿI×ÓÿÈYý þ÷~àÞÿ+ý÷ýþÇÚðxþ3÷|þý!ô?ÿÁü¿hkJÜ ªF
+à81v®Ë%ä)
7÷÷ þ¬ÿBý]¿Pÿã¿é×áü/(»¡8ù.<ù?ýú/ÿÁaø
ë¿B
ÿAô\ÿ
+üê[ÿ¥:Ö±¸¶rJµ× ©kúêXÿ%xmêXÿ¥i£@þ£úôÕÿµ!R©Îõ_ºÖÑz
+]ë¿zýGõé?ªOÿQ]ë¿$¯«#ÿk]æRë¿þpNÿQgõ
úÏûïü?whÃgþßÎÿâüÿôp·¿Ñÿêð±¿)»´áÃù?Aàcÿñóòöú?ÿàUÿ³ä±ú'«¦Æiî *pX÷®áÃýõ´?\ÿ<ÇÓïÿú?â¹0<ù?½þüÁqü
7ü@áÃýó¿à É>ýOtìÿ(;)p²ÿ#Oj+Dþ'µ¨héÉF=úèÓÿDþ§µªèÒÿâú1tè²q¡:ô?ZEþ'úô?ѧÿ®ý¥®CþÔBÑ¥ÿ©Fsú8«ÿ ÔÿÞ<ÇK^óÿ¸ÿÜìÿîçb·NWs3(vϵáþü/Ì ïÿÀý?Ã{ÿ/aôú?|ì?¾þ«Ûë?1þ¯ú/Ü<ô%¹)Àº ÖÖÁäM
+àó»
ÿAô_ÿ kñ'ê¿áÀÿ ë?qþÜPÌ .<ùO]6 ñÿ³úÎÿM_û»ôÍ^öhxÚúøÜÿÕõ_`üG¨ðá?HüæÁA}ñ²cý·âµÈ Ù±þ1Q¯¡ÿÁE£@{ý7gq½øÙÿ!;öÿT4΢ký·¨E;þ#õºÖ7jèÿ}ñ²/þCvÅÔ£7dgü©dGüG}5¿<ÿ!ÏÆHÿx?pëÿé"/÷}»þÏÁø_ þ6ÜÇFÿç¨ÿCÀÇþ¦viÃgþbþøØüüßç?Ìÿ
+Züäîÿ[62 â
+J«Çµ&Â-ß#<ûåÒOÿOpÿøØdÿgÌÿ®äÿ<ûÿéó?`üÎÿ
+OþO¯ÿ#ÿA@ Ø þèÿ¸þI÷éÿ¼#ÿk1ïÈÿ ÚúzíüÖ²ð>ý÷éÿ¼#ÿе,ö¼Kÿ§²^ ÿKÎë:ô%êÇУÿó>ý÷éÿ¼Kÿg³èÐÿ¹¬_êý?iXóþÏÏêÿõÿ÷÷þÂèõ?øØßrIÿï7ÿù¿Aàcýã?aðªÿqJB¹Jô¿8iêÅ4a²¡ÿÅ\Ñj_à¯}®6<ûíßýúý?|ì¢ÿáú_´?Ôÿgÿ?¹þGPÿ»ÁÝC'ÿ'×ÿÿ08Z`@ðá?þë¿@pdhþGÛúSImA(mëÊ<ΫZþG
ëMtéµ%Æ´Oÿ£}úmëL2Z?È®õ¿ëµµ]ùßIýzô?Ú§ÿÑ>ývè6¬Ù¡ÿÖ´ô?¦§yNÿ£gõ?úßûÁÅý¿ùÊYø;ÂIÿãÊôÿDHúìoþy8ýµÕ9Gýîö_¤ÌÉ.³?QvÖßýìü?W¸ÿ7|íoÙgr¸óK
ë¿A0Ðþ«ì)[õµÑ?ÿËNì/Áüo Àܯac ÿÅC¶Ë6ç¹M4ßçv¨Âýüç'ü×õ_(Ë ùÿGú¼wót¿/yZæOyÙÚÌùþoaüÒ?häÿöáyÛøÏêö¿Mwe^æÅ <ø/(æÿÿÃÆ@þo×·ÙÎ ìïÞh£ÿâdü¯$òâ däù¼íïç¿<ÿ
+ùib.ò¿{Âïî÷!$òJüé0òÿ!Ýe˹ùbþöwýO)ù_@ÙßÂÆxü{IH/ÿëë?ü7 Ècðm Ä6aüÄø/´ÿtñ_ÿý
+ù?]ü®ÿÆ
ü)þ·â¿æÿUÈÿ1ÿÓÅáú`üWØÈÿâ¿Nã?¤¸þ0|ù?Nü=ÿB¢þOü.ÏØü)þKµùñ °÷ Cù?YüÞÿAñ_ac<þÿ
ñß08 ã¿BÅ þ_¸õ0çø/Ìÿö.þÿ@úOØÈÿéâ¿ðùÿ6òºü_ÿ ÿù?]üÆ Çÿac ÿ§Ëÿ
üæÿ
+ù?RüW;ÿBþà§Í¾Ü=.ì
+û 1ÿÓåÿBþ ó
¡ü,þó? ã¿ÂÆxü9ÿÎÿà` ÿ
+îü/6v®ß¥
+ëaÊéþÏ$ÇøOàüØpçYlUqÿ|ùÀáñ`þ?°ù°ËÒå|ßëvæÚxÿÄñpü6ÆãÿÛ@îó?cþàüOØÀÿE±Ë.`¿WüÖ8ÿu=@ÈÿçÚpÿK-pþ,pü(ðÿ5ö{.~Oï³y¾ìnÃcüO0þ4Þÿßâ|îüáó?Pÿ Nüß{;Þw?¸æÿUVÿe×ÜP]@¸p½ÿÇ˾¯p×)çõ_¸ÛÿÿçÒÆeö'IB ã¶ÿç¸ÿ|íÜÿõ¢6Üùù¿ 0ÐþÿëÊÏac ÿ1ÿ×ó
üÇü_WÌþ6òó]9pü6òó]90ÿWØÈÿqòµöÅü_Pø)v áb ÿ1ÿ×ó
¡üÇü_×Ù4Æã?æÿºF®?Áõ_bÿÙñ_
+ã¿ 0ÐþÓÅaüpö7läÿdñ_×ÿ ã¿ÂÆ@þÿÅ[ñ_¸þT!ÿCÆ@þOÿÅÿÀø¯°1ÿ#ÅÆ(Iqý(aø0ò¤ýOç
Àüß0ø´Éïòl]@ Èÿâ¿Tÿÿ{ÿǰp1ÿÅáýÿ6Æãÿ¸ñ_ÿ
+ãóÆAü§Æaþ7´ÿtñ_øüÔÂÆ@þOÿÿ@ñ_ac ÿ'Ëÿ
ñ0Àøï°1ÿÓÅaü'pü6òºü_È`þ¯°1ÿ#ŵóÿ(ä?~ÚìËÝãÂÚ°ù?]þ/ä?0ÿWØÊÿÉâ¿0ÿ0þ+lÇÿã¿pþëñ_¡ÂÿÅÆÎõ»´a]L9Ýÿäÿ ÿîü/m±*î/ߨ2Ü1þ³Úÿã?§Ç û»,]Î÷ù¹n÷g®Çø)ÿ Çac<þ¿=ä>ÿ£9æÿÎÿü_»ìö{Åhó¿ oìÆXü?×ûø_jó? ¨®?Çñ¨Àÿרïmºø=½Ïæù²»
+ñ?Áø/àò¯°1ôþÿçëpç¿ÿA7þ°áÊ*.×}^à¤ÿbøO¡¨ÿ@ÀÃþ 6.³¿òIBéø cB0´?¼íÜ ò6ÜùÏçhµÿ% Æý
8þÆÿ¡ü¿$P?ÿù ÿuÿ
+ù?=0ÿOØÊÿK 9ßÿ9¡
+õ_àêÿ°1ÿ$ òà¿ÀøOàø?låÿ% úù/NÆÿJ"ÿaùÂÆPþ_ ¨ÿòtþOrä?>¦e@¸ÊÿK ¹ßÿ
Äü¿0Àü?ac0ÿ/H ä>ÿ¯4ÅùPÿ#òÿÍ@½ü¯¯ÿ8>ÿSÿAeë?BÅ0þ³éâ¿pÿ7µÿdñ_8þÎþ¡ü,þ÷Æ
¡ü'þ·â¿4®ÿUÈÿ1ÿÅáú`üWØÊÿqâ¿Nã?T¸þ0|Cù?Jü=ÿ¡þOü.ÏØ¡ü'þKµù/ÿ°÷ ù?UüÎÿ ã¿ÂÆü5þã¿aPÙ`üW¨Æ:]üÀø/µÿdñ_ÿßÞÙí¸#kôèÔûÜärm(¶ã±n÷ÌÛËvz÷¶ãnQE~@Pkûb½Hªø©ÈûÎ|cõ¿Xþú¯ò_¾±ú_¬ÿõ ä¿}cõ¿Xþü§öÿ¾±ú_¬ÿþK ÿo¬þçÉÝ÷ÿiñ_ÂÝóñð²÷ḻú_¬ÿþK ÿoÌþÊQÿ@þË7ýÏÛÿú¿óØT俼2Ãÿýn¬õ'<cüIù&Vä?%Pÿ÷Íÿ_/úÑðÄügèÿ'Á2þÇõ°Z<o¿~¸ÍãgÆþ¯mØÿI`ÿçþ?, ¥×úþ¨ÿøÆâÿrXlÿïÿûªcýPwêÀàlþ¿óûÿ±%þþ%û·XüÍ~?
+ËÃf½Ø®~û×ÿÛúo_ÿÒÐ#¾kÌëÿçßîzúÿJ`á÷MªÿÝäS¿I:ÿiûÿu;öÿäü§<éãÿ¤<cÚøW± §×¾¦ÏÿÛñûÆ¿<sÇÿzýã¤g¤ûßX1þ
+ã?¥ýOÚþï<þùä|côJû´óß³ÿ}¨yÿ@ÿßýÒþ'}ýo«ÓÿÂ|ýï£ÿSÚÿÌñ¿«¸ÿYûßýÒþ'íûÿóþ?ü×@ÿßýÒþ'íþÇKý¯ø/áóp übôJûëÿé_ã¿úÿøÆêÿö?3ÎÿbìÈJ üï|þ?lÿöýÇÅÿ®£þ/á: Ä@bò¿)ÿjÈ)0¹üù T}cô¿\þû%ÿòÑÿLù¯ö>ÿEÿg uÄÏý/ÿ¢ÿò_¾1ú)ÿuÿþ?êªá
+À1Fÿóä¿êÛúo×Î$|Ým¿o×+¦ §ýÏÿ÷þÿ0®ÿ$Àübõ¿Xþõ_ßäó?sþü·_/`L>1ù_ÌÑÿMqüËå¿xÿÀùoþËñþ'üoþëÿEþSùoßý/ÿ"ÿ)ý¿oþëÿ
ÿèÿå£ÿò_÷ýþKø²{>^ã¦yÀ!FÿËõÿ ôÿòÕÿbù/ú?H üï|þgÎQÿp ò_NI÷¿ký)ÏÿÂâë[
ÐöãÅUÓó ïtÿ_¯üÑðÄügSÑÿOaü?ëaµxÞ~;ýnw~û¿&°ÿÀþÏ7ùü\ J¯ÿô-ý4PÿñÁÿåþ°`ÿ¬üGßSÿÐ}
+Ì Éåÿ{ÏHßÿ¾åû_ hÙÿ;ÅàÿköûiXþ6ëÅvõûgÌØÿWä¿4þôuýäü[ÒýïBÍû¿~ߤú_O¼óé-Iç?]uò¿nûó3Æÿ JxÆ´ñ¯bªºjÚñü¿;ý0þfÿõÈ)ÏH÷¿-ý$XÇJ ¤ýßyü»HÿW
+|ÿë«ÿS }ì{ã"ù? ôÿñÕÿ)
+×ÿ¶ª#ù/ Ô}cõJ þóý¿öÿ¾±ú?¥ÐÇþw7ûÿð_ý|cõJ ý·õ¿Ðà¿ÏÃq`ðÕÿ)
+Ò×ÿ.pÿ»úÿøÆìÿ@éõÿØÓÿ_Ûßdôÿa ýûýÇõýþÿÎ?ÿé?fØüÿÆó_-ù/Öñ/ÿbÿ'ío¬þËñý¯ò_¾±ú'ÿÕÞç¿øþOBñß3VÿKå¿b
ÿ
+ÈùÆêü×mþ#È÷_êªá
+À1Vÿ³ä¿êÛúoÎ$|Ým¿o×+¦ §XýÏÿ÷þÓÿS¸þ óÙÿRù/êÿÈù&£ÿyó_ä¿%\^¿ÈyÅæ].ÿÅýO¬ã_,ÿÅûÎ|cõ¿Xþú¯ò_¾±ú_¬ÿõ |cõ¿Xÿ/òØÿûÆê±þ_ø/þ_¾±ú'ÿußÿ§Á _vÏÇÃËrܳ18Äê±þ_ø/þ_¾1û_*ÿEý_Ûßdô?oþú¿óÏ_ÿòÊÿ÷»±Öðño,&åÐÿ@ýß73ü½ ~ê3FÃóM ÿËøÖÃjñ¼ývúá6û¿Ó ó¿ö¾ÉèÿÃPzý§oéÿ¡úo,þ/÷õÇöÏùþ¿¯:Ö uó©nÜÍÿw1cÿ?N ø/à¼ûbÿïÿ¯Ùï§aùsجÛÕoññú[ÿíkò_hÿëóúÿÀù·¤ûß
þ¿Xø}ìÿäS¿I:ÿiãÉÿºmèÿ!!}ü/ñgLÿ*6¡ª«¦ÏÿÛsÇÿzýã¤g¤ûßÐ1þ
+ã?¥ýOÚþï<þ§ýù_ ä|côJû´óß³ÿ} þ«þ?¾1ú?¥ýOúúßÞ¨ÿJ þá£ÿSÚÿÌñ¿«ÈI`ÿï£ÿSÚÿ¤}ÿÞÿÇÿèÿã£ÿSÚÿ¤Ýÿx©ÿuÿ%|_þOiÿ3cý?ýkü@ÿßXýÐþgÆù_-ßHàýß7ùüØþ'íûÿ]Ký_¯ iÀ'&ÿù/òã_.ÿEþC¿oþËÕ|ÿ#üoþgʵwù¯û_%Ô| ì£ÿåò_-þ+ þë£ÿò_·ù*¾ÿPW
+o 1ú'ÿUßÖOÿó _wÛïÛõ)À)Fÿ3å¿â½ÿä?$ë? 0¿Xý/ÿbýÀû¿oòù7ÿEþ[ï iÀ'&ÿ'6ÿÀó_üãøËñþ'ýoþëÿÅûò_¾1ú_¬ÿùO
+¼øùÆè¹üùO ìÿ}cô¿\ÿ/ü@ÿ/ßýÏÿºïÿð_ÂÝóñð²7mÌ1ú_®ÿþK ÿo¬þËÑÿAïÿ¾Éçæüõ ¿&`¦¤û¿ßµþg`1iýoBCþSë¿oÒý½þ}ò3FÃóuOÿ? ñ?þ8¬Õâyûíô»mÞùmfìÿÀþOû?ßäóÿq(½þÓ·ôÿÑÀþÏ7ÿûÃzý³ò}¤þ+¡úÄà\þ¿÷ôýè[ê?®#Ð2 øÄàÿköûiXþ6ëÅvõûgÌØÿWä¿4TïëúÿÈù·¤ûß
÷ ìþ}ê;ýØçôóºm:Τÿ%ÿòiã_>uÕ´ãù+Æ_ÁÜñ¿Þÿ8é3ιÿMqü¹ÿíýoþsÿÛý|cô¿\ÿÎ$üòÑîûÃaÿï£ÿåúÿà¿úÿøÆèþ?w÷?v]À ãÀà£ÿåúÿà¿úÿøÆê?÷¿ýÙüöM>ÿ¹ÿíOä:1
+øÄäS"ÿÕó_§FþKqüKå¿bEþCÕ_ßý/ÿê/ù/ê?ÈùÆè¦ü×ÿcþû_%Ôÿ=cô¿@þ«¿ä¿øþCù/ßýÏÿ
+7ûÿÈýÏ"êªá
+À1Fÿ3Ýÿvûýo×Î$|Ým¿o×+¦ §ýÏÿ7ëÿÉêÿÆõ_¬þçÏ÷ÿû5ÿòM>ÿså¿úKþ«Ã× ÿåÿuÁþ_=ù/Æñ/×ÿú¯Î|cô¿\ÿ/ê¿ÈùÆè¹þ_Ô$ÿöÑÿrý¿¨ÿH`ÿï£ÿåúá¿úùÆè¦ü×}ÿÿ¾ìå¸icpÑÿrý¿ð_ý¿|cõ¿Tÿ¯ü§ò_¾Éçæþ_Ôÿ%\GüSÒýßïÆZÊ3Æ?°´þ7¡¡ÿêÿ¾I÷ÿõþ÷ÉÏ
+Oìÿ×Tôÿ`ÿãÃzX-·ßN¿Ûæß&mÿwÎÿ7Üÿ ýoòùÿ¸ Vÿ9÷ÿkéÿ£úoþ/÷õûSÏÎëßÿÐ|bðL.ÿß{Fúþ?ô-ç¿®#°dðÁÿ×ì÷Ó°ü9lÖíê÷ϱÿ¯ý%Pÿõuýäü[ÒýïBÍû¿ü÷MÿOõóz÷è5ÿ!û{ÿsSuø/¡úT¦ ¿¤®ÿaú±ï+éç¿uÛÐÿGBúø_ò)Ï6þUlBUWM;ÎÿmlsÇÿzÿë¤g¤ûÏý*ã_ ÿW¹ÿó ¼ÿùÆè?÷?þáÐÿË7FÿôÿºÞÿÈù¯ºøÆè?÷?þá°ÿ÷Ñÿý¿®÷?â¿úùÆèþ_w÷¿v]À ãÀà£ÿú]ü'ÿ¡þ_¾±úÏý6¿|Ïîü¹Î¿ÓOLþ7ó_-ù/Æñ/ÿ"ÿ!ê¯oþËñý¯ò_¾1ú)ÿÕÞ翸ÿYBñß3Fÿå¿jî@þË7Fÿ3å¿nóûßEÔUÃcþgºÿñ¶þËý*¾î¶ß·ëSSþgÊÅ{ÿÉH×`~±ú_,ÿÅú/üoòù9ÿEþ[Âuþ%ÿåÿuÁüýß$Ç¿\þ÷? ÿøÆè¹üïÈùÆè¹þ_ä?%ÿöÑÿrý¿ÈJ`ÿï£ÿåúá¿úùÆè¦ü×}ÿÿ¾ìå¸icpÑÿrý¿ð_ý¿|cõ¿XþþÈù&ÿó_Ôÿ%\ç_ò_NI÷¿ký)ÏÿÂbÒúßü§êÿ¾I÷ÿ¸Úÿ{¿ùßô+GÃóMEÿ? ñ?þ8¬Õâyûíô»mÞùmfìÿÀþOû?ßäóÿq(½þÓ·ôÿÑ
@ýÇ7ÿûÃzý³ò}OýWB÷À3¹üïéûÿзÔ$\ eÿïÿ¯Ùï§aùsجÛÕï1cÿ_ÿÒ@úÓ7ÖõÿóoI÷¿
+ïÿ8ÿñMªÿ¯|úiç?ñäÝ6ÿHHÿKþ'åÓÆ¿M¨êê4ðUÓ´ãþñ/ÏÜñ¿Þÿ8ééþ·a<ÿcüËcÿýâyÿ×sþ+ýoþèÿÏýøþWý|cô¿@ÿxéÿCýGõ_ßý/Ðÿ'^úÿÐÿSûßý/Ðÿ'^úÿà¿úÿøÆèþ?ÿ¸ÿ1rÿÏÃq`ðÑÿý.þwø/þ?¾±ú¿ÿÏyÿÉk`÷ï|þçêÿ/ý¨ÿKøµcðÉÿaÐñ,9ÿEþOqüËå¿ÈH`ÿç£ÿÅò_§-!þ ÿå£ÿò_í}þþêÿ1ú_.ÿÅý¯ÈùÆè¦ü×mþ#ï¿$ÔUÃcþgºÿí¶þÛuó _wÛïÛõ)À)Fÿ3å¿â}þüqý'æ«ÿ¥ò_ä?4pþç|þgÎÿpj N1ù_ÌEò_
+ã_.ÿÅûÎ|cô¿\þ÷? ä¿|cô¿\ÿ/ò¨ÿøÆè¹üùO ìÿ}cô¿\ÿ/ü@ÿ/ßýÏÿºïÿð_ÂÝóñð²7mÌ1ú_®ÿþK ÿo¬þëÿEÿ ìþ}ÏÿÌù/êÿ~mÀ|îÿ~7ÖúS1þŤõ¿
+ùO Ôÿ}îÿëýï1ÿ¬{úÿI0ÿñÇa=¬ÏÛo§ßmóÎo3cÿ×öØÿù&ÿ@éõ¾¥ÿê?¾1ø¿ÜÖìÿè#õ_ ͧÀ1¹üïéûÿзÔ$\G`É$àÿ¯Ùï§aùsجÛÕï1cÿ_ÿÒ@ý×7ÖõÿóoI÷¿5ïÿ*üwMªÿqú±Ï+iç?ýÉÿºm+Τÿ%ÿòiã_Å&TuÕ´ãù[Æ_ÁÜñ¿Þÿ8ééþ·!6¿ãøèÿ3+ê?xÿóÑÿýúKÿÞÿ$ÐÿÇ7Fÿôÿé/ý¸ÿEùßý/Ðÿ§¿ôÿ!ÿ!ý¿oþèÿÓ_úÿà¿úÿøÆèþ?ÿ¸ÿ±¿ôÿÁ ãÀà£ÿúÿ\üïð_ý|cõ?ÿþrÿùO û]Ïÿ\ýúKÿêÿ®û/b N1ùßÌuä¿Ç¿\þüª¿¾1ú_.ÿÅýÈùÆè¦üW{ÿj¸ÿQBMÈ5Fÿ忸ÿQù/ßýÏÿºÍÄPóýºjxpÑÿL÷¿ÝÖ».pþ#áënû}»^18Åè¦üW¼÷üqý'æ«ÿÅò_¬ÿ(ÿù&ÿó_ä¿%\üWLþ×ó_ô`ÿrù/Þÿ$pþã£ÿåò_¼ÿI ÿå£ÿåúÿ@þÛ7FÿËå¿ÈJ`ÿï£ÿÅúá¿úùÆè¦ü×}ÿÿ¾ìå¸icpÑÿbý¿þK ÿo¬þËÑÿAù/ßäó?sþú¿ëþüSÒýßïÆZÊ3Æ¿°´þ7¡!ÿ)ú¿oÒý½ÿ}ò3FÃóMEÿ? ñ?þ8¬Õâyûíô»mÞùmfìÿÀþOû?ßäóÿq(½þÓ·ôÿÑ@ýÇ7ÿûÃzý³ò}OýWBüÔ38&ÿï=#}ÿúúË ,Ùÿ;ÅàÿköûiXþ6ëÅvõûgÌØÿWä¿4´ïëúÿÈù·¤ûß
÷ ,ü¾Iò?ýè÷ÌÇþ¿íÿOþ×1ÐÿW
Bõ©L~I]ÿë0ýÜ÷Iç¿]5úß¶ÿ
+1þ `Â3¦PÕUÓù®£ÿÙã½ vÊ3ÒýocKþCuü§4 Kzÿ;ç?ÈÿùÆêÿ`ûßÞøßHþKý¿|cõJ°äõ¿êÈù¯ºøÆêÿ`3üï"ç?ØÿûÆêÿ`ûßÝìÿcÀ
+ôÿòÕÿ)
+ÀÎ/õ¿Ðâ¿ÏÃq`ðÕÿ)
+ÀÒ×ò_*èÿå³ÿ¥×ÿcOÿ
+¤¿|Ñÿ
+À>ôÿí÷_×÷ÿú¿ñçÿëô³Olþ7åò_üëøË±ÿ@õ×7VÿKå¿z¾ÿ@þË7Vÿóä¿Ú»üWÏ÷j¹Æê±ü÷¿K ÿå«ÿyò_·ùÓë?ßI¨«7 ÇXýÏÿªoë¿÷?øºÛ~ß®WLN±ú'ÿïýø¯`\ÿIùÅì¡üWCý_ù/ßdô?kþü·ñç'ÿåÿu¹üW ÿ¥À:þÅò_¼ÿIàüÇ7Vÿõÿ¢þ+üo¬þêÿEþSùoßXý/ÿ"ÿ)ý¿o¬þëÿ
ÿèÿå«ÿyò_÷ýZüðe÷|<¼,Ç=óC¬þëÿ
ÿèÿå³ÿ¥úQÿ@þË7ýÏÿ¢þ/aüùÉùeÿÉ·@c1)ÿÓÄü§êÿ¾áÿqÿ´ÿ÷~ó¿ÉW 'æ?@ÿ? ñ?þ8¬ÕâyûíôÃmÿ83ömËþOû?ßdôÿa(½þÓ·ôÿÐ@ýÇ7ÿûÃúcûç|ÿßWõ_BÝ}b
+pL6ÿßyÆýÿøá¿ñç_²ÿwÅÿ×ì÷Ó°ü9lÖíê·Ïøxý¿ÿö5ù/
+=â»Æ¼þ?pþ-éþw¡§ÿ¯Î|êÿvõïõä+Iç?mÏ«¾çüGÁ¬ñ_¾ëÝq±:lÿ»>|øßÿñUÇýOåÓv1*ëKLþoö'ýwûÃâ°ïïÿÂÿ±æþ_
+ÿYï^Pß/Iþ?/¬Wÿ,Oûÿ[ÏÃ?¨ü^8ðL}ÿ»¬ÿuÅù
+¿¾I®ÿLkùøÞÿÎõºíÉÿI1þï?1mü«xzí««¦ßÿ»÷ ³ÇÿüýOU®ÿkÅø+°±þ¯ìÿ$Pÿ÷Õÿbý_9ÿ@ÿWßXý/Õÿû5ÐýÍ7VÿKõåþ
+ìÿ}cõ¿TÿWü×@ÿWßXýÏÒÿõmþû¥|_¬þêÿZã¿ú¿úÆì©þ¯Ôÿ%Ô \Ñÿ¬ý_kêÿοÿ_|ÿïÿM¹üWCþKuüå¿ØÿI úë«ÿÅò_ô@þË7Vÿóä¿ÚûüßÿJ¨#þ{Æê±ü÷I üë«ÿyò_·ù"ßI¨«7 ÇXýÏsÿ÷mý·
+ç?¾î¶ß·ëSS¬þçÉÝÞÿpòþïÆõ_ÌþÊQÿ@þË7ýÏÿ"ÿ-áüûÿrÍÿiÍ Ç?±äüWMþKuüå¿xÿÀöÏ7Vÿ忨ÿJ ÿå«ÿÅúQÿ@þÛ7Vÿå¿ÈJ`ÿï«ÿÅúá¿úùÆêü×}ÿÿ%|Ù=/ËqÏÆ<à«ÿÅúá¿úùÆì©üõ ä¿|Ñÿ¼ù/êÿο?ù/·Ìð¿ký ÏÿÄ&ßÿ|ö¿ =ùO ,ÿ¾áÿqÿ´ÿ÷~ó¿ÉW 'æ?@ÿ? ñ?þ8¬ÕâyûíôÃmÿ83ömÃþOû?ßdôÿa(½þÓ·ôÿÐ@ýÇ7ÿûÃúcûç|ÿßþ=þ+¨«OLÉæÿ;ϱÿ[á¿óï¿dÿïÿ¯Ùï§aùsجÛÕoññú[ÿíkò_â»Æ¼þ?pþ-éþw!ÒÿW{ߤú_M>õùiç?UlBUWM{ò¿nkÎ$¤ÿ%þòôñoÚÓ?güÌÿëõtþÛÆñü7ñW`ÿ)íÒöçñïBOþWû?ßýÒþ'íü÷ì¨ÿj ÿoþOiÿ¾þ·§÷ ê¿øúß7Fÿ§´ÿãWÿÀþß7Fÿ§´ÿIûþÿ¼ÿÿ5ÐÿÇ7Fÿ§´ÿI»ÿñRÿëþKø<& ¿ýÒþgÆúú×ø/þ?¾±ú?¡ýÏó¿[¾ÿ@ðÛ7ùüØþ'íûÿ]Ký_¯`ðÉÿ¦`þüãøËÿ@õ×7FÿËå¿øþGù/ßýÏÿjïò_5÷¿J¨#þ{Æè¹üWÿ
+(üøÆè¦ü×mþ#ï¿$ÔUÃcþçÉÕ·õßÓ¿æüGÂ×Ýöûv½b
+pÑÿLù¯xï?ù ãúOÌ/Vÿå¿Xÿ%ÿòM>ÿóæ¿Èkø5L>1ù_Ìuä¿Ç¿\þ÷? Lü¾1ú_.ÿÅûò_¾1ú_®ÿùO ä¿}cô¿\þü§öÿ¾1ú_®ÿþK ÿoþgÊÝ÷ÿ ø/áËîùxxY6æý/×ÿÿ%ÐÿË7Vÿå¿èÿ üoòù¹ÿõ ¿FiÀ'éþ¿^ÿ<ùãXbþ«îéÿ%Á0þÇõ°Z<o¿~·Í;¿Íù¿éÿ%0ÿû&ÿ_ ÓßÿúþxÿóÁÿåþ°`ÿ¬óß>RÿP}bé÷L.ÿß{Fúþ?6 ø¯à:-Oþ¿f?åÏa³^lW¿ÆýEþCûßX×ÿGο%Ýÿ.Ô¼ÿKÀߤú_WÓÏ}~vþÓü¯»±ÿ'ç?å1þ @Â3¦PÕUÓÆ¿9ßÿÅøgöø_/òtÿÛsþñ/uü§4 IÛÿãßÅ@ýWÕ_ßXýÒ äcÿÛÿûÉH ÿo¬þOi ¼þ·§Çù¾þõÕÿ)
+ at føßEê¿ØÿûÆêÿ ûßÝìÿcÀ
+ôÿðÕÿ)
+@>ö?ÜÖÿBÿ>Ç À/Vÿ§4 I_ÿ»Ðà¿úøÆìÿ éõÿØ×Ôÿ%ÔÀ\Ñÿ
+@>ôÿß\Þÿêÿ.Û¯YÀ)6ÿüù¯®ºä¿jò_
+¬ã=ÿuÿ.òýª¿¾±ú=ÿuö¿±Åä¿|cõ?OþëÆÿ¶ªéÿ¡¡øï«ÿÙó_ÿ»ÀýÈùÆêüW¸ÙÿÇ8ÿPW
+o ±ú%ÿUßÖɨøºÛ~ß®WLN±ú'ÿïýçüW¸þ óÙÿÜù¯Ëþ¿¯©ÿK ÿåþçÉ]ßÿëÿò_n±ù_ËUä¿XÇ¿Xÿ/Î$pþã«ÿ¥úÑÿGù/ßXý/Öÿü·òß¾±ú_¬ÿõ_ ìÿ}cõ?{ÿ¯_ù/òßèÿå«ÿyò_÷ýZÖ _vÏÇÃËrܳ18Äêöþ_×üWÍú/þ_¾1û_*ÿEþ[ù/ßdô?oþý¿ËöüWfø¿ßµþgb1)ÿÓÄõ_õßÌðÿõø©Ï
+OÌ6þ,ãüqX«ÅóöÛéÛ<þqfìÿÚýö¾ÉèÿÃPzý§oéÿ¡úo,þ/÷õÇöÏùþ¿¯:Ö uõ©æÐ/Ùüç3öÿã0þ8ÿþKöÿ^±øÿý~?Íz±]ýö¯ÿ·ýÿûº!ÿ!! ¾kÌëÿçßî"ßK`á÷M²ÿíäcWÒÏꮢÿãÉÿ$<cÚøW± U]5íxþßuÿI=þ×û§<cÆùoïgüËcÿb÷¿ÿ@í×7VÿÝÿFýWý|cõ?{ÿîÂ×ÿ¾±ú_ìþ7ò_ØÿûÆê±þ?ø/þ?¾±ú¥ÿÏÝý]hð_Âçá80øÅê±þ?ø/þ?¾1û_ªÿõ uþÉèÞþ?Ôÿ%«¯ßxÅæS.ÿÕÿR`ÿbù/ö¨þúÆê±üßÿH ÿå«ÿyò_í]þû5Ôÿ=cõ¿Tþ+rÿ£ò_¾±ú'ÿuÿ!òýºjxpÕÿ<÷¿ÝÖ»@ÿ
+_wÛïÛõ)À)Vÿóä¿nûü§ÿ§qý'æ³ÿ¥ò_Ôÿ%ÿòMFÿóæ¿ÈK8W_+ò_^±ù_˵ä¿XÇ¿Xþ÷? ÿøÆê±üõ_ ä¿|cõ¿Xÿ/ê?ÈûÆê±üùO ìÿ}cõ¿Tÿ/ü×@ÿ/ßXýÏÿºïÿÓâ¿/»çãáe9îÙbõ¿Tÿ¯ÿ%ÐÿË7fÿK忨ÿK ÿåþçÍQÿp®¾V俼2Ãÿýn¬õ'<cüIù&ôä?%Pÿ÷Íÿ_ïúÑ
ðÄügèÿ'Á2þÇõ°Z<o¿~¸ÍãgÆþ¯mØÿI`ÿçþ?, ¥×úþ¨ÿøÆâÿrXlÿïÿûªcýP7Íÿw1cÿzaÄçÝû·XüÍ~?
+ËÃf½Ø®~û×ÿÛúo_ÿÒ@û_ß×ÿο%Ýÿ.ôôÿÀùoRýÿ×äS¿I:ÿiûÿuKÿ
+éãÿ¤<cÚøW± U]5íxþßßÿ2þå;þ×ë'=#ÝÿöÜÿñ/qü§´ÿIÛÿÇ¿ù_ ìÿ|côJû´óß³ÿ=ýEÐÿÇ7Fÿ§´ÿI_ÿÛªæû?
+|ýï£ÿSÚÿÌñ¿«ÉI`ÿï£ÿSÚÿ¤}ÿÞÿÇÿèÿã£ÿSÚÿ¤Ýÿx©ÿuä¿5|_þOiÿ3cýïºÿèÿã«ÿÚÿÌ8ÿï?4üû]ÏÿíÒ¾ÿ¸øßêÿ.Ó/ßxÅäS0ÿÕÿR`ÿrù/ò¨þúÆè±üWÃ÷?ÈùÆè¦üW{ÿâþW 5 »Æè¹üWÿ
+ÈùÆè¦ü×mþ#îÐPW
+o 1ú'ÿUßÖ;îñu·ý¾]¯bô?Sþ+Þç¿ÈH×`~±ú_*ÿEþCù/ßäó?sþü·ËôKþË+&ÿëù/ú¿I0¹üï8ÿñÑÿrù/Þÿ$ÿòÑÿrý¿ÈJ ÿí£ÿåò_ä?%°ÿ÷Ñÿrý¿ð_ý¿|cô?Sþë¾ÿOÄ _vÏÇÃËrÜ´18Äè¹þ_ø/þ_¾±ú_¬ÿý$ÿòM>ÿ3翨ÿK¸L¿ä¿¼îÿ~7ÖúS1þŤõ¿ -ùO Ôÿ}îÿëõï1ÿl*úÿI0ÿñÇa=¬ÏÛo§ßmóÎo3cÿ×DöØÿù&ÿ@éõ¾¥ÿê?¾1ø¿ÜÖìÿè{ê¿þúÄà\þ¿÷ôýè;ê?οËþß+ÿ_³ßOÃòç°Y/¶«ß?cÆþ¿"ÿ¥Ï¿|c]ÿ9ÿtÿ»Ððþ/ó _ü?5wQ÷ È
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,68 +1,67 @@
-System(0KB HP=0*0kB TYAN Computer Corp S4881 )
- NUMANode#0(0KB)
- Socket#0
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#0
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#1
- NUMANode#1(8192MB)
- Socket#1
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#2
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#3
- NUMANode#2(8192MB)
- Socket#2
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#4
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#5
- NUMANode#3(8192MB)
- Socket#3
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#6
- NUMANode#6(0KB)
- Socket#6
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#12
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#13
- NUMANode#7(0KB)
- Socket#7
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#14
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#15
- NUMANode#4(8192MB)
- NUMANode#5(8192MB)
-depth 0: 1 System (type #0)
+Machine (phys=0 total=41943040KB TYAN Computer Corp S4881 )
+ NUMANode #0 (phys=0)
+ Socket #0 (phys=0)
+ L2Cache #0 (1024KB)
+ L1Cache #0 (64KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ L2Cache #1 (1024KB)
+ L1Cache #1 (64KB)
+ Core #1 (phys=1)
+ PU #1 (phys=1)
+ NUMANode #1 (phys=1 local=8388608KB total=8388608KB)
+ Socket #1 (phys=1)
+ L2Cache #2 (1024KB)
+ L1Cache #2 (64KB)
+ Core #2 (phys=0)
+ PU #2 (phys=2)
+ L2Cache #3 (1024KB)
+ L1Cache #3 (64KB)
+ Core #3 (phys=1)
+ PU #3 (phys=3)
+ NUMANode #2 (phys=2 local=8388608KB total=8388608KB)
+ Socket #2 (phys=2)
+ L2Cache #4 (1024KB)
+ L1Cache #4 (64KB)
+ Core #4 (phys=1)
+ PU #4 (phys=5)
+ NUMANode #3 (phys=3 local=8388608KB total=8388608KB)
+ Socket #3 (phys=3)
+ L2Cache #5 (1024KB)
+ L1Cache #5 (64KB)
+ Core #5 (phys=0)
+ PU #5 (phys=6)
+ NUMANode #4 (phys=4 local=8388608KB total=8388608KB)
+ NUMANode #5 (phys=5 local=8388608KB total=8388608KB)
+ NUMANode #6 (phys=6)
+ Socket #4 (phys=6)
+ L2Cache #6 (1024KB)
+ L1Cache #6 (64KB)
+ Core #6 (phys=0)
+ PU #6 (phys=12)
+ L2Cache #7 (1024KB)
+ L1Cache #7 (64KB)
+ Core #7 (phys=1)
+ PU #7 (phys=13)
+ NUMANode #7 (phys=7)
+ Socket #5 (phys=7)
+ L2Cache #8 (1024KB)
+ L1Cache #8 (64KB)
+ Core #8 (phys=0)
+ PU #8 (phys=14)
+ L2Cache #9 (1024KB)
+ L1Cache #9 (64KB)
+ Core #9 (phys=1)
+ PU #9 (phys=15)
+depth 0: 1 Machine (type #1)
depth 1: 8 NUMANodes (type #2)
depth 2: 6 Sockets (type #3)
- depth 3: 11 Caches (type #4)
- depth 4: 11 Caches (type #4)
- depth 5: 11 Cores (type #5)
- depth 6: 11 Procs (type #6)
+ depth 3: 10 Caches (type #4)
+ depth 4: 10 Caches (type #4)
+ depth 5: 10 Cores (type #5)
+ depth 6: 10 PUs (type #6)
+6 processors not represented in topology: 0x00000f90
+1 processors offline: 0x00000010
+5 processors online but not allowed: 0x00000f80
+1 processors allowed but not online: 0x00000010
Topology not from this system
-
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1 @@
+link 16amd64-8n2c-cpusets.tar.gz
\ No newline at end of file
Property changes on: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz
___________________________________________________________________
Added: svn:special
+ *
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz.options
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz.options (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz.options 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1 @@
+-p -v -.xml
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz.output (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets.xml.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE topology SYSTEM "hwloc.dtd">
+<topology>
+ <object type="Machine" os_level="-1" os_index="0" cpuset="0x0000f06f" complete_cpuset="0x0000ffff" online_cpuset="0x0000ffef" allowed_cpuset="0x0000f07f" nodeset="0x000000ff" complete_nodeset="0x000000ff" allowed_nodeset="0x0000003e" dmi_board_vendor="TYAN Computer Corp" dmi_board_name="S4881 ">
+ <object type="NUMANode" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0">
+ <object type="Socket" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0">
+ <object type="Cache" os_level="-1" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="NUMANode" os_level="-1" os_index="1" cpuset="0x0000000c" complete_cpuset="0x0000000c" online_cpuset="0x0000000c" allowed_cpuset="0x0000000c" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002" local_memory="8589934592">
+ <object type="Socket" os_level="-1" os_index="1" cpuset="0x0000000c" complete_cpuset="0x0000000c" online_cpuset="0x0000000c" allowed_cpuset="0x0000000c" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002">
+ <object type="Cache" os_level="-1" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002">
+ <object type="PU" os_level="-1" os_index="2" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002">
+ <object type="PU" os_level="-1" os_index="3" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="NUMANode" os_level="-1" os_index="2" cpuset="0x00000020" complete_cpuset="0x00000030" online_cpuset="0x00000020" allowed_cpuset="0x00000030" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004" local_memory="8589934592">
+ <object type="Socket" os_level="-1" os_index="2" cpuset="0x00000020" complete_cpuset="0x00000030" online_cpuset="0x00000020" allowed_cpuset="0x00000030" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004">
+ <object type="Cache" os_level="-1" cpuset="0x00000020" complete_cpuset="0x00000020" online_cpuset="0x00000020" allowed_cpuset="0x00000020" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000020" complete_cpuset="0x00000020" online_cpuset="0x00000020" allowed_cpuset="0x00000020" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000020" complete_cpuset="0x00000020" online_cpuset="0x00000020" allowed_cpuset="0x00000020" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004">
+ <object type="PU" os_level="-1" os_index="5" cpuset="0x00000020" complete_cpuset="0x00000020" online_cpuset="0x00000020" allowed_cpuset="0x00000020" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="NUMANode" os_level="-1" os_index="3" cpuset="0x00000040" complete_cpuset="0x000000c0" online_cpuset="0x000000c0" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008" local_memory="8589934592">
+ <object type="Socket" os_level="-1" os_index="3" cpuset="0x00000040" complete_cpuset="0x000000c0" online_cpuset="0x000000c0" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008">
+ <object type="Cache" os_level="-1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008">
+ <object type="PU" os_level="-1" os_index="6" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="NUMANode" os_level="-1" os_index="4" cpuset="0x0" complete_cpuset="0x00000300" online_cpuset="0x00000300" allowed_cpuset="0x0" nodeset="0x00000010" complete_nodeset="0x00000010" allowed_nodeset="0x00000010" local_memory="8589934592"/>
+ <object type="NUMANode" os_level="-1" os_index="5" cpuset="0x0" complete_cpuset="0x00000c00" online_cpuset="0x00000c00" allowed_cpuset="0x0" nodeset="0x00000020" complete_nodeset="0x00000020" allowed_nodeset="0x00000020" local_memory="8589934592"/>
+ <object type="NUMANode" os_level="-1" os_index="6" cpuset="0x00003000" complete_cpuset="0x00003000" online_cpuset="0x00003000" allowed_cpuset="0x00003000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0">
+ <object type="Socket" os_level="-1" os_index="6" cpuset="0x00003000" complete_cpuset="0x00003000" online_cpuset="0x00003000" allowed_cpuset="0x00003000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0">
+ <object type="Cache" os_level="-1" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="12" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00002000" complete_cpuset="0x00002000" online_cpuset="0x00002000" allowed_cpuset="0x00002000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00002000" complete_cpuset="0x00002000" online_cpuset="0x00002000" allowed_cpuset="0x00002000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00002000" complete_cpuset="0x00002000" online_cpuset="0x00002000" allowed_cpuset="0x00002000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="13" cpuset="0x00002000" complete_cpuset="0x00002000" online_cpuset="0x00002000" allowed_cpuset="0x00002000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="NUMANode" os_level="-1" os_index="7" cpuset="0x0000c000" complete_cpuset="0x0000c000" online_cpuset="0x0000c000" allowed_cpuset="0x0000c000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0">
+ <object type="Socket" os_level="-1" os_index="7" cpuset="0x0000c000" complete_cpuset="0x0000c000" online_cpuset="0x0000c000" allowed_cpuset="0x0000c000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0">
+ <object type="Cache" os_level="-1" cpuset="0x00004000" complete_cpuset="0x00004000" online_cpuset="0x00004000" allowed_cpuset="0x00004000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00004000" complete_cpuset="0x00004000" online_cpuset="0x00004000" allowed_cpuset="0x00004000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00004000" complete_cpuset="0x00004000" online_cpuset="0x00004000" allowed_cpuset="0x00004000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="14" cpuset="0x00004000" complete_cpuset="0x00004000" online_cpuset="0x00004000" allowed_cpuset="0x00004000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="15" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+</topology>
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets_noadmin.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets_noadmin.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets_noadmin.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1 +1,92 @@
-link 16amd64-8n2c.tar.gz.output
\ No newline at end of file
+Machine (phys=0 total=67106960KB TYAN Computer Corp S4881 )
+ NUMANode #0 (phys=0 local=8386704KB total=8386704KB)
+ Socket #0 (phys=0)
+ L2Cache #0 (1024KB)
+ L1Cache #0 (64KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ L2Cache #1 (1024KB)
+ L1Cache #1 (64KB)
+ Core #1 (phys=1)
+ PU #1 (phys=1)
+ NUMANode #1 (phys=1 local=8388608KB total=8388608KB)
+ Socket #1 (phys=1)
+ L2Cache #2 (1024KB)
+ L1Cache #2 (64KB)
+ Core #2 (phys=0)
+ PU #2 (phys=2)
+ L2Cache #3 (1024KB)
+ L1Cache #3 (64KB)
+ Core #3 (phys=1)
+ PU #3 (phys=3)
+ NUMANode #2 (phys=2 local=8388608KB total=8388608KB)
+ Socket #2 (phys=2)
+ L2Cache #4 (1024KB)
+ L1Cache #4 (64KB)
+ Core #4 (phys=0)
+ PU #4 (phys=4)
+ L2Cache #5 (1024KB)
+ L1Cache #5 (64KB)
+ Core #5 (phys=1)
+ PU #5 (phys=5)
+ NUMANode #3 (phys=3 local=8388608KB total=8388608KB)
+ Socket #3 (phys=3)
+ L2Cache #6 (1024KB)
+ L1Cache #6 (64KB)
+ Core #6 (phys=0)
+ PU #6 (phys=6)
+ L2Cache #7 (1024KB)
+ L1Cache #7 (64KB)
+ Core #7 (phys=1)
+ PU #7 (phys=7)
+ NUMANode #4 (phys=4 local=8388608KB total=8388608KB)
+ Socket #4 (phys=4)
+ L2Cache #8 (1024KB)
+ L1Cache #8 (64KB)
+ Core #8 (phys=0)
+ PU #8 (phys=8)
+ L2Cache #9 (1024KB)
+ L1Cache #9 (64KB)
+ Core #9 (phys=1)
+ PU #9 (phys=9)
+ NUMANode #5 (phys=5 local=8388608KB total=8388608KB)
+ Socket #5 (phys=5)
+ L2Cache #10 (1024KB)
+ L1Cache #10 (64KB)
+ Core #10 (phys=0)
+ PU #10 (phys=10)
+ L2Cache #11 (1024KB)
+ L1Cache #11 (64KB)
+ Core #11 (phys=1)
+ PU #11 (phys=11)
+ NUMANode #6 (phys=6 local=8388608KB total=8388608KB)
+ Socket #6 (phys=6)
+ L2Cache #12 (1024KB)
+ L1Cache #12 (64KB)
+ Core #12 (phys=0)
+ PU #12 (phys=12)
+ L2Cache #13 (1024KB)
+ L1Cache #13 (64KB)
+ Core #13 (phys=1)
+ PU #13 (phys=13)
+ NUMANode #7 (phys=7 local=8388608KB total=8388608KB)
+ Socket #7 (phys=7)
+ L2Cache #14 (1024KB)
+ L1Cache #14 (64KB)
+ Core #14 (phys=0)
+ PU #14 (phys=14)
+ L2Cache #15 (1024KB)
+ L1Cache #15 (64KB)
+ Core #15 (phys=1)
+ PU #15 (phys=15)
+depth 0: 1 Machine (type #1)
+ depth 1: 8 NUMANodes (type #2)
+ depth 2: 8 Sockets (type #3)
+ depth 3: 16 Caches (type #4)
+ depth 4: 16 Caches (type #4)
+ depth 5: 16 Cores (type #5)
+ depth 6: 16 PUs (type #6)
+1 processors offline: 0x00000010
+5 processors online but not allowed: 0x00000f80
+1 processors allowed but not online: 0x00000010
+Topology not from this system
Property changes on: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c-cpusets_noadmin.tar.gz.output
___________________________________________________________________
Deleted: svn:special
- *
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,95 +1,50 @@
- §
-J í_s½æ};þ¼ÜZeñ§&s+5®l²S¸¶öÕ&[R%ERÎëùôB²iuã°qbé<?O浤¶ õé@ã<8оzûâf¼Ùÿü(ÿÕ¥S»uQìþ{àÖF>ïÍ¥M¡ôËóãò´ÙVëÑèÃ×»åÝC³xåºz½áøxÑ'ñ_~ñ×¶°N+ëCüuâÏÁ
øÏVOÍâv9\1À~ïñª·ÅYü²ðFj¸áçx½Ù,×ÿöûúø½^Ìëi3ýái{_/¶Íìùô1<£Ûê±yø¾¢ÝÇÇå¼~ø·ðwk÷-ªÇ:|üé©zýûr]Â?ýïÕ¶^/ÿmûøßGÿùÜÒhìÝÇͶ^ÅÝ®ÙøÝÿòÿ¿«ñï¬ñgÕì¾mÿßU+SþüÇ«ûfZØýêã¦ùbv· ³ØjøÂË·Ø©Z5³ýW´ÿØ,m¾ÇáñêÛÕSüâzÿ:Õ«m³\>1=ÔßÃï¾ÅǬ^®~¨BëáðÏFßëѼ6õh»7ëѪªG³z4ûm¼ko´©W£Çí:|å.~¥ÍßÃeÛøÏ¬Ín6÷£ÇÇßF·¿
ï° ß-üÏî·£ÍMøåýþ-~½þm»»dº\mG#;_,ÿ?¹ûËh]¯¦wËå|´Z4£êþv®=®¦õ]5ûññëònùجâ
-²^ûß
üýýñä?Ù]¼êðE_ìÃ3»ÅcxJö¬æópÇ7»Ëâ÷-Ôèk³ÝÃö?FÅxÿïÍz«ð¯GÕ"4¿ÏïÃÝý=üo»]}üxüêwóê? eûÕx@Ã:Ö¿üjÞØª)=è¸ý< á-'¿üjßÍúJ:i? ¨Õ¿Ø¯þoì5Ô¨öZà}C¼{7èÏ{P£Û¨Ãú6PÿÆPKéAMûõx@߯´|7è+=¨m? %зñߨZPzТýñ¾tònÐWzP×~@'x@߯ªßZ*ÉQºÐ©$\Òî-ýGô%~þ¾Ò^J&!ôVÑ·Nò^ôB:I#´{DÇ¿þ#úÖJ?D_éE/$42Joå}k)¥ÐÚ)%Ò[yDßZRéçèÏ{Q{!©¤Uú
ßèùݨ
þïͶÚÚÆëþïð%oÏýß&|
-þobo=ÛI9¼ÕãÐ%ëBY52ÞySúñxd
-ë'£²¡SQûAC
î<Äm¤ËÂ
-çÇz¤½÷¥×oQÆëM9y¾^¼²qèîyS¸xùdlM9èp~¾ÐÜ$|£ð¡ÛpQ©vb¤F/ÍÛ×n~ÈØHxdâ
qv\lÿ±}¾2ô¤Îø]Fí¾£:þ;3ôÏ×¹ðSùð}2ñ{
Î2\Yo¾£íêÆ}ø??Büá©÷ø',ÃÝ,½ ?£öZûøM½òª|»ÐÒ]ÒûÝï<»²ûÞ=_âcì8ÜXÿuÑî'tF¿XsÜvøÞá&ñã b
-ºñ$ܰðïN~H¢ñáfÊ72\U£îN.5á×:~ÎYëv?åDáí~ÌðçClT±»=c¥ö·qþ626^cÿùHñ§4ñ'×½/Â/SLNQ½kÄe±{δ?Ù5²{.ÂÌb»íZU§¥(G/¿gxôËßµ.vOùÌî³Ex4>´ëÝÉø?ø?ø?ø?øóþ|mÛ
-cÍØ_·ÍcæF«)WâêÍÈLÆÎì>ÞL×OE³¸éÃÇ_³oõ<|»õ+Û ¾ÿo~l2Ôè¹ÿ?¼Y[h÷ÿ`aÿ?íøÏëïMÐÃÏA¿ø+ouiuqýÇ;Ä
Ç?ü}[?ñ¤Å?®ÿy]?ñ®}Òë¿øÒ£þ½â=¯xÒâ_øð£ÿg¡ü·ËÕòay÷#ýAHÌ xÄBü·÷ëºO ÝmÄ ?Ïÿ
ôYüW*äÿ8Ø xgoµ /ý?[J¦«jöº«§Íüõ6:õ¯Ìþ-
-ôÏ
ðECÐ4÷ujþtý[eáÿa¿l¨úï?û'ÍÿÓÐ?û ÌÐ
-åú÷ÿéC³yÝ/Lÿ{ñáæÚñ¿[ý}ô_´Þÿ꿳àoJô é¯ÿå"È£¦´þÊþã¿Væÿ,h¨_4ýõ¿ÛvJrôËÿ*oÒ*LüQ¾tÈÿrÿf1¯3iAzþߨùñÛÌ{·Ñ=ÿ÷çñ/½ÃøÏA,6ðgÌÄBÔÿ ¾LWÕzÛÄ¢ÛH_ÿó%ÖÿxÀü_6Dýo¬ÿukþWúúçàË¢¹mê9z¡õ¿+ÈÕ·ôñßjõ/¢þgËûz]/f?ö/ ¯/tëßÏÿ
ÿ_ uýï¾Z×óiøB@úøï´ÃüødCÔÿ?ªéòvZm6ËYSmïÍöÇÏÚ ÿ
Åþ4: Ñ\?þ?V«6º×ÿZþÿÒÃÿÃÂ> Øÿ+¢þO_ëulêm,ºÇw>ÿ] ôÏAÌÿCûr!é_1ø¿Pÿbüöïÿ0ÿ1ááþ
-Qÿùý_Ð?ðɨÿaý_÷?SÐ?ªm
. at .Dýç÷aýÿ²!ê?»ÿËÀÿÉü_²¡®ÿe÷aÿ'°È¨ÿý_õ¿ÂÀÿÉöÈæúñ?ÿþoùWø¿BÔÿÀþ¯VýG
üNc þ5ÿõßX Æ?¿ÿûXÿK6Dýç÷Aÿ, ÿ+¢þ®ÿÕÿqþíúi;oô!ê?¿ÿù_0þ˨ÿüþ/äXÿK6Ôõ¿ìþ/ø?YÿK6Dýg÷¡þ'ÈþÊæúñ?Sý/è
Cþþ/¡õßÿ
õàÿM_ý'ùxBTxÿÿ®òþ/úÇÿåü÷ä6ão´SBÄBü
·÷ëºO7Í×p¿îzÜ´ùá<ÎÿcáyILúñþªÙ·ê®6ó×ÛH[ÿúwçÿòü¿lú-×Ý?&]ÿõ_ÀÂl¨úï?û'ÍÿMúo,"0C7 ëßÿ»
-@ù¿Çù¿<`õ_6×ÿ=ìù¿ýû¿BýÌE þú_.¢ÕÒFT¸OÿÃ0ÿgë²é¯ÿ½ÿÒF¿ü¯òÆ)
-úW¾Dþ
ÔøÎLj#=ÿoâÏ1þ×ÿñçñÿxþ'* É
¨ÿõü®þÖÿxÀü_6Dý\ÿ§5ÿCý?&¾,Û¦£
-Qÿëÿø}ý¬ÿ³ülúÏXÿÇïëÿÀÿÏêÿȺþ¯þß×ÿÁüÿ²!êàú?ñ¿0ØÿÃF0Ñ\?þ]ÿÇïÏÿ
Cð ¢þ®ÿãÎçÿáBèÿöåBÒ¿Êïÿò%ü_ãñü·}þó?pþlúÏïÿþYÿK6Dýëÿj½ÿÒCÿ,|ª¶º ¹õÝÿ¥°þÃÆÙõßÿÿ'ðɺþÝÿ
ý,Àÿ%¢þ3ÿvðÁÿÉô/ëÇÿLþ/è
ç,ºõñü·ÿëÿ,àü7Ùô¯ê)ø¿8 Æ?¿ÿûXÿK6Dýç÷Aÿ, ÿ+¢þ®ÿÕÿqþíúi;oô!ê?ý/äYÀø/¢þóû¿ÿaþ/ÙP×ÿ²û¿àÿdÙÙõßÿ
ú,@ÿ²¹~üÏäÿþYxNÀ¢ Qÿùý_Xÿgþ/ÙôÕ¿#ü¹'*¼¿ÿ«ü®òÎd¡ü_ÎOn#9þF»Øÿ#þù!Ä{¿®«ùtÓ|
-÷ë®Ç=IÿÇøÎ£þõ
ILúñþªÙ·ê®6ó×ÛH[ÿúw¶Äú?ýË ÿÙrÝùcÒõoEþødCÕÿÙ?iþoPÿ
} ,æÿB¹þý¿Û Dÿ{øÿxp¾h®ÿ{Øÿóû÷
üÅ
-z Éô×ÿrþ6¢Â}Òø¯Uù?xÿMýïý?6úå¶elпòeü/©ñ?ÿÔFzþßëñ¸þ??Îa"ÿ
- at r!ê?cýrWÿë<`þ/¢þ®ÿÓÿÞCÿ|Y4·M=G/ ¢þ3Öÿ)÷õ°þÏü²!ê?cýr_ÿþPÿG6Ôõ¿|õÊ}ýÌÿY@ö_6Dý\ÿ§5þûXÐd®ÿ®ÿ³óÿþó/øÿ
BÔÿÀõÜùü_¡þ1ÿíË
¤Åàÿ²ðq@Æóßù_ÌÿXÀùo²!ê?¿ÿúgþ/Ùõ?¬ÿ«õþgÊúgáSµÐÈ
¨ÿüþ/¬ÿ°ñ_6Dýç÷ÁÿÉü_²¡®ÿe÷aÿ'ðɨÿç¿íý_þO°ÿC6×ÿyü_ðópèáÿ
-QÿÏ;ø¿°þÏÎ
-IÿÁÿ
úo,ãßÿ
ý?,Àÿ%¢þóû¿ ÿ
-Qÿ×ÿjÿ8ÿÏÍvý47zõßÿ
ü/ÿeCÔ~ÿò?,Àÿ%êú_vÿü,Àÿ%¢þóû¿PÿdesýøÉÿý³pèáÿ
-Qÿùý_Xÿgþ/ÙôÒ?ýèßÝú?®ÿàãùçÿñ n4 Ówü·¤÷D
÷÷ýëÒÿÀÿÉ@ÿøo«åÃòîGúÿÝùïN£þ#øoï×u5n¯á~Ýõ¸'÷ç±þÏÂ!cÌdBÐÿ÷wU;Uwõ´¿Þ!ÿg=ÖÿXÿG6ýÏënÍ®«,ö² ý˪ÿþ³Òüßðÿ±pÀÝL®ÿï6 æÿõx°¾h®ÿ{Ø)ùÿð ýs`nÐH¦¿þé&¨pß{üùÿð¬ÿ³÷Ùô×ÿÞÿGi£_þWyã*£|iÿå 5þó_ÚHÏÿãüG.ñ¸þo×ÿ2ÿ9çÿ¢\úÇùïÌÿeCÔÿÀõ¿Îü¿qüÇú_ÍmSÏÑ
¨ÿõ¿ü¾þæÿ,`÷lúÇùïÔÿ
-uýç?¾ý
-Qÿ×ÿjÿ¨ÿÅöè $sýøóß2`ÿ¯Pú¸þCý¯1ÿíË
¤Óÿå÷þ/ÿÄøg<ÿqÿEýwpþ£lúÏèÿò;ÿþYÿK6DýëÿjÕ5%ê¿ñð©ÚVèäBÔ~ÿüß,`ü
-Qÿý_~ïÿÿø¿dC]ÿËçÿò{ÿò?,Àÿ%¢þ3ÿè÷þ/ìÿbû?dsýø?´ÿËïý_Ð?Àÿ%¢þ3ÿ¸ÿ+äÿxÀù²!é_3ø¿4ü_ãßÿÿ?ðɨÿüþ/èäeCÔÿÀõ¿Úã¿þYø¼Øl×O³Øy£'Qÿùý_Èÿ²ñ_6Dýç÷!ÿÃü_²¡®ÿe÷ÁÿÉü_²!ê?¿ÿõÿX@öW6×ÿü_Ð?Àÿ%¢þóû¿°þÏü_²é«ÿfþ@;üóÅÿ¥
-
-ÿIñ=×õb;¯ïõºwÝó¿VþÇzìÿg¡i.Fô·ò_,×Óõ²OÝó¿óú?Ea¡ëŤ/^ú_ëMÐ=µtý+ÿL¨í ¹ôÿuA}ûK|ÿ+Â×uYj÷?â¿]®Ë»ÉBrüv¾Dü9 Ä{¿®«ùtÓ|
-7ì®û¦$åvñ/|ÿ'»Øÿa þ_6ªÙ·ê®6óWÛèÿ3ý»¢ÿ
Â
-Eÿ³åºSóǤëßÿBÿ`à
-Yÿ½gÿ¤ù¿Eý_âíaþ/Þÿ;wtÿö|þïKÔÿbAcÿh®ÿÙÿåÏõo=ÖÿXÐIÐÿr÷zÚØ)<éý?|ù?¨ÿ ýï7ÚèÿU>nû
Q»ý_Èÿæ'9þ»
-@&é1HÏÿ] ÿÏ5þ)`Óçÿ6Ú 1þ3:\TUÿ)`Óó¾,ÿcóÙPõR ¶;ÿw>ÿ³ñ?Ð?_ÍmSÏÑ
ªÿ°éã¿ÕÑÿ
-ýçÕdCÕJØôü¿×
-ù?PÿU6äõ¿°éúwa ýs ÿl¨úO) KÿÂþ´þ%3ÀøßY ¶{ýïÜÿäÿ»Ø(øÿ¥BÕJØîñßµôÿ?1ÿíË
¦ßÿåàÿâÿaý_EÛÿ
ù8ÿ[6Týg÷Aÿ,Àÿ%ªþõµÞÿ¬* >UÛ
-]\¨úÏîÿÂúÿeCÕfÿ*áÿdþ/Ù×ÿ2û¿ôÏü_²¡êXÿWkýÏ)ìÿbû?d3ÀøÇÿý³°ÿK*Týëÿ:Ïÿ;
ü8ÿ[64ýëüþ/ÿÔøg÷aÿðɪÿìþ/èäeCÕÿ°õ¿Úã?Îÿãáób³]?Íbß@ Týg÷¡þ/ÿeCÕöú_Èÿ° ÿlÈë¹ëAÿ,Àÿ%ªþ³û¿Pÿde3ÀøÇÿý³°ÿK*Týg÷aýø¿dÓKÿ«å&÷M9û7Òÿ£úÖÇó?Áû?
-Ǧ÷øO9ø÷@TxoÿgÔ¿.½Åù¿,ôÿv¹Z>,ï~¤?Éñ7:üñçÿíýº®æÓ8#hw=îIÒûÿ.þ
óØÿÁÂó,æ 2!èÿÅú»ªfߪ»zÚÌ_o#iý§g=Îÿe²!è¶\wkþtýÛÐ@ÿÀÿ'ªþûÏþIóÿ?Xt2¹þýÿ_kþï5Æ0þËæÚñ¿[ýùÿÃû?üÿ<¨ô é¯ÿå"îô¡´îÆúL@ý²é¯ÿ½ýÒF¿ü¯òÆ)þ_"ÿËBjüÇ¿&µÿ7
-ñçÿò_=æÿþ<þ¥Cýwâù¿¨ &¢þSÊÖÿ|õ?0ÿ
-Qÿ)å¿zäÿZó¿Òcÿ_ÍmSÏÑ
¨ÿò_ÿÖXÿgÆ_ÙõRþ+þÏ~þ¦ Ð?¨ÿ%êú_Bù/ÿG;ÌÿYÀû¿lúO)ÿEÿý?,h@2×ÿå¿(þÿÒÁÿÃÂó½LúO)ÿE¨ÿãFýbþÚIÿ*¿ÿËãüGñØÿu¾ÿÃ`þÇÎ
-Qÿùý_Ð?Xÿ
-QÿÃú¿Zï¦ôÐ?ªm
. at .Dýg÷)¬ÿ°ñ_6Dýç÷ÁÿÉü_²¡®ÿåöØÿÉÆÙõ?°ÿ«µþWø?YñC6×ÿü_Ð?Ï0ºõ?°ÿ«UÿQ!ÿÇÎ
-IÿÁE
'û¿Jø¿8 Æ?¿ÿûXÿK6Dýç÷Aÿ,`ýW6Dý\ÿ«=þãü?>/6ÛõÓ,vÞè BÔ~ÿò¿,`ü
-Qÿùý_Èÿ° ÿl¨ëÙëÁÿÉÆÙõßÿ
ú, û+ëÇÿLþ/è
çÝLúÏïÿÂú?ðɦ¯þÒÉ{¢Âûû¿Êá*_àüGúÇÿåü÷ä6ão´ý?âBü·÷ëºO7Í×p¿îzÜ´ùá<ê?°pÂ$@&ý¿xÿVÕì[uWOùëm¤ÿEý;[býÌþeCÐÿl¹îÖü1éú·Ê"ÿÏ~ÙPõßöOÿÔáa n@(׿ÿwóÿ°ÿÉæÚñ¿ý/1ÿ·ÿWÈÿ±PÜ8ô é¯ÿå"Zý)mD
û¤ñ÷èøeÓ_ÿ{ÿ¥~ù_å£íGô¯|iÿå 5þóÚHÏÿU"ÿÏ1þ×ÿñçñÇù/LÄó?QH.Dýg¬ÿSîêÿ`ýÌÿeCÔÿÀõZó¿Ò;è/æ¶©çèBÔÆú?;ÿÆþàÿ
-Qÿëÿûú?ðÿ³ú?²¡®ÿå«ÿSîëÿ`þÏä/¢þ®ÿÓÿý?,h@2×ÿC×ÿ)÷õàÿaáy½Lú¸þ;ÿ+Ôÿã!æÿ¡}¹ô¯ü_þ/ñÏxþÛ>ÿù8ÿM6Dýg÷ièø¿dCÔÿ°þ¯Öû)=ôϧj[¡Qÿùý_Xÿaã¿lúÏïÿÿø¿dC]ÿËîÿÂþO Ùõñü·½ÿ
ËÀÿÉöÈæúñ?ÿúgá ø¿BÔÆóßöþ/äÿxÀùo²!é_3ø¿Pÿbü³û¿<öÿ° ÿlúÏ_ÿúgù_Ùõ?pý¯öøóÿxø¼Øl×O³Øy£'Qÿùý_Èÿ²ñ_6Dýç÷!ÿÃü_²¡®ÿe÷ÁÿÉä/¢þóû¿PÿdesýøÉÿý³p ü_B!ê?»ÿù?àÿM_ýëÄ3
-ïíÿ*Â×uY)ü_$Äÿå øÔ6ão´ç?!þù¡Ä{¿®«ùtÓ|
-7ì®û¦$Íÿwñ/<Îÿæa?ûWÿ
¢ÿóߪ}«îêi3µ¤õ¿þ]QàüOPþ_6ýÏëNÍ®«ê?±_6dý÷ýæÿë<ÄÛo1ÿË ïÿ îñßÏÿ} ÿ/XþÍÕãÿ þ?®óxÐæF[tbIÐÿr½þ6v
-OzÿaþÏöÿÈ&Aÿ{¡~ù_åcÙ'elиç±ÿÃ)m¤çÿ.ÿgÿ@éó«,öÿ°ÏÿD ¹PõR (=ÿçËù?0ÿ
-Uÿ)ºóçó¿0þcÿ_ÍmSÏÑ
ªÿ@éã¿Õõ?X@úO6Tý§ JÏÿ{U"ÿÇêÿȼþP (]ÿÎèødCÕJ Âøïöÿ° ±H4ÿº×ÿÎýÿNYøXØ/¿Âÿ/ªþS
- uÿ®¥øÿyùh_.4ý«üþ/ÿÆ5þÃú¿vþó?pþl¨úÏîÿþYÿK6Týêÿj½ÿÙøèOÕ¶B ªþ³û¿°þÃÆÙPõÝÿÿ'ðɼþÛÿý³ ÿl¨úÖÿÕZÿ+JìÿbòÍ ãÿÎäawûü_R¡êXÿ×yþß)äÿxÀùo²¡é_ç÷ðq@vÿöÿ° ÿl¨úÏîÿþY@þW6Tý[ÿ«=þãü?>/6ÛõÓ,öÝè BÕvÿêÿ²ñ_6Týg÷!ÿÃü_²!¯ÿåöAÿ, ý#ªþ³û¿PÿÈ_6ÿyü_Ð?»Û¯àÿ
-UÿÙý_Xÿgþ/ÙôÖ¿¥ü¹'*<Éÿ¥ËRãüOâÿrþ{jÉñ7Úyøs@ÿö~]Wóé¦ùnØ]÷MIÿõ_xؾ`þ/þ_¼«jöº«§ÍüÕ6Ò×ÿ\QàüOPþ_6ýÏëNÍ®«ê?± ÿlÈúï=û'ÍÿÁú;÷æÿbàý¿Ó Ô=þ·ü?¾ÿm¡|É\=þwÛÿzèßëßz¬ÿ± Í
-º Á$è¹VB;
'½ÿ0ÿgïÿ²IÐÿÞÿCh£_þWyãVÆýËqþÉñ?ÿÒFzþßèù¨ñ¶þÏùüß*úÏ,Äó?QH.Týg¯ÿüÿ˪ÿaëÿÏÿÂøý?,|Y4·M=G/ ªþ³×ÿÁþ°ûG6Týg®ÿ£ò, þlÈëëÿXè$ÿeCÕÿ°õZã¿SØÿÃÆ Ñ0þg©ÿó?xؾ(øÿ¥BÕÿ°õ\»þüÿ,Äü?´/þÎ{'PãóßÞ8ÿM6Týãü·÷ü_²¡êPÿWëýç¿qñ©ÚVèäBÕ?Î{`ü
-Uÿ8ÿí} ÿlÈë8ÿí] ÿl¨úÇùoïìÿÍ ã?Î{Ãìz_ÿT¨úÇùoïÿ&þu~ÿÿjü³û¿°ÿø¿dCÕvÿôÏò¿²¡êØú_íñçÿñðy±Ù®f±ïFO ªþ³û¿Pÿÿ²¡ê?»ÿùàÿ
-yý/·ÿúgþ/ÙPõÙÿåPÿde3Àø§þôÏ®÷UðI
ªÿìþ/¬ÿ³ ÿlúê?â×)QáIçêÒÔÿb¡ü_On£_üý¿õñüç0 þ⿽_×Õ|ºi¾ûu×ã$Íÿwñ/ÿ
ç` þ_¬«jöº«§Íüõ6ÖÿvúwÖãüOðâ/þgËu·æI׿UõXþeCÕÿÙ?iþoàÿåḠrýûÿþÖüßkÿ,`ü͵ã·úó{ýøyP7XúLýïÓÿ6óFyü©ñ?ÿÔFzþ/< ?Äø§ÿè1þûóøõ_Yçÿ¡\úO)ÿAxÿ÷%ÞÿyÀì_6Dý§ÿè±þßÿþ¾,Û¦£
-Qÿ)å?(ù°þÇÜÿ²!ê?¥üGÚþÿýü_øY@ýÙP×ÿÊPòÿÚaþÏòÿ²!ê?¥üeü/üÿ,h@2×ÿå?(þßÒÁÿËÂsÐȨÿò=Æw>ÿWõYùh_.$ý'
-Oöáü'ñØÿuîÿ6ÿ1ódCÔ~ÿôÏ^üdCÔÿ°þ¯Öû)=ôϧj[¡Qÿùý_Xÿaã¿lúÏîÿÒð² ÿl¨ë¹ý_ö² ÿlúØÿÕZÿ+ü,`ÿl®ÿ3ù¿ #n@&DýìÿjÕSÈÿñódCÒ¿fðyø¿8 Æ?¿ÿûXÿK6Dýç÷Aÿ,àÅO6Dý\ÿ«=þãü/>/6ÛõÓ,vÞè BÔ~ÿò¿,`ü
-Qÿùë!ÿÃü_²¡®ÿe÷ÁÿÉü_²!ê?¿ÿõ?Y@öW6×ÿü_Ð?Ï@7 ¢þóû¿°þÏü_²é«ÿ1éäÏ=Qáýý_åp_ÿþñ9ÿ9¹äøíâú/âBü·÷뺿 ÞÝFÚü?Æ¿p%üß,ìï¿Â2 PúñþªÙ·ê®6ó×ÛH[ÿúw¶Äù, ý'þgËu·æI׿UõXÀÀ/ªþûÏþIóý?<ìî¿Åü_*׿ÿwóo0þ³0ðEsíøßÃþÿÛ¿ÿkøYßLЦ¿þhõ§´îÆ
-ÌÿYñG6ýõ¿÷ÿPÚèÿU>Ú~±AÿÊ%ò¿¤ÆÿpþcRéùÿ0 ÿÏ1þ×ÿñçñ/=öÿ°ÏÿD ¹õ±þO¹«ÿõ?0ÿ
-Qÿ×ÿiÍÿÊûXø²hnz^@(Dýg¬ÿ³óÿhÔÿà»dCÔÆú?»ù¿²ðÿ³ú?²¡®ÿå«ÿ³Ëÿkù?ðÿȨÿëÿ´ÆÿÂbÿÚ£ÌõãÿÐõvþÔÿfâ°þ
-ÿ¿Pú¸þ;ÿ) ôÏAÌÿCûr!é_e÷©ç¿±@ÆóßJÿÂÎ
-Qÿùý_Ð?ðɨÿaý_÷?SÐ?ªm
. at .Dýg÷i¬ÿ°ñ_6Dýç÷ÁÿÉü_²¡®ÿåö9ìÿdþ/Ùõñü·ÿþO°ÿC6×ÿü_Ð?ûûÿTúÏxþÛÁÿ
õpþlHú×þ/Ôcÿüþ/ìÿaþ/Ùõßÿý³ü¯lú¸þW{üÇù<|^l¶ë§Yì¼Ñ¨ÿüþ/äYÀø/¢þóû¿ÿaþ/ÙP×ÿ²×ÿÿø¿dCÔ~ÿê²ì¯l®ÿ3ù¿ ö÷þ/©õßÿ
õàÿM_ýOH'î
-OòéÒþ/úÇÿåü÷ä6ão´3ñçÿíýº®æÓMó5ܯ»÷0ÿw¨ÿÂÃ~ùó©ôÿâý[U³oÕ]=m毷AXÿ·%Îÿdé?Ùô?[®»5Lºþ²¨ÿÄü?²¡ê¿ÿì4ÿ7ë,ìî¿Åü_*׿ÿwóó?x@ø¢¹vüïaÿ£äÿ¬ÿ
ñ
-z Éô×ÿrþ6¢Â}Òø¯Cýs÷Ùô×ÿÞÿCi£_þWyã
Qeøò¿¤ÆÿpþcRéùÿ0 ÿÏ1þ×ÿñíýÿØÿÃB<ÿäBÔþú?XÿcóÙõ?pýÖü¯,±ÿ
/æ¶©çèBÔöú?ëÿ,`÷lúÏ_ÿþPÿG6Ôõ¿ìõ0ÿgÙÙõ?pýÖøþ
-ýs =: É\?þgªÿÿûéüÿR!êàú?®]ÿõ¿Yùh_.$ý+ÿö^ Æç¿½pþlúÇùoïø¿dCÔÿ°þ¯ÖûÎãâSµÐÈ
¨ÿöNÀø/¢þqþÛ;þ/ÙP×ÿpþÛû þ/ÙõóßÞ Øÿ!ëÇÿöÙw¿ðI
¨ÿöNÀùo²!é_3ÔÿBý7ñÏïÿÂþàÿ
-Qÿùý_Ð?ÈÿʨÿëµÇÿÇÃçÅf»~ÅÎ=@úÏ_ÿù_0þ˨ÿüþ/äXÿK6Ôõ¿ìþ/ø?YÿK6Dýç÷¡þ'ÈþÊæúñ?ÿúgaßýÂÿ%¢þóû¿°þÏü_²é«íHGî
-ïíÿ*Â×uYêþ/âÿr |jÉñ7Úðÿ±@ÿö~]Wóé¦ùnØ]÷MIÿïâ_øëÿ,ÄÛ?VÿK
¢ÿóߪ}«îêi3µ¤õ¿þ]¼úg ðECÑÿl¹îÔü1éú·ZáýødCÖïÙ?iþo
-ÖÿY·ù¿Xxÿït uÿö|þïKýs /«ÇÿAüþ\ÿõ_xÐÅ
-º Á$è¹^B;
'½ÿÇ ðþ/ýï
-@6úå7Ni^üÙ]ü/Éñ? ÒFzþßhü?Ôø§ JÿÛhÄøÏ@<ÿäBÕJ ôüGý&0ÿ
-Uÿ)ºóçó?«
-ìÿeáË¢¹mê9z¡PõR (}ü·ºDý°ûG6Tý§ JÏÿûðZ
-ýsú?²!¯ÿ% J׿3¨ÿÅÿ²¡ê?¥ aüw
-ûXÐúÌ ãg îõ¿sÿ¿S¨ÿÅC¼ýØÿ+ªþS
- uÿ®¥øÿyùh_.4ý«ìþ¯ÂÃÿÅ5þÃú¿¶ÿó?pþl¨úÏîÿþYÿK6Týêÿj½ÿYU@ÿ,|ª¶º ¹PõÛÿå±þÃÆÙPõÝÿÿ'ðɼþÛÿý³ ÿl¨úÖÿÕZÿs
-û¿XÀþÙ0þçñAÿ,ÄÛÿ\¨úÖÿuÿw
-ù?pþlhú×ùý_%ü_PãÝÿ
ý?,Àÿ%ªþ³û¿ ÿ
-UÿÃÖÿjÿ8ÿÏÍvý4}7zPõÝÿ
ú¿,`ü
-UÿÙý_Èÿ° ÿlÈë¹ý_Ð?ðɪÿìþ/ÔÿcÙ_Ù0þçñAÿ,ÄÛÿ\¨úÏîÿÂú?ðɦ·þÓ,_'D
'ù¿tYjÿÈBBü_ÎOm#9þF;_ þP⿽_×Õ|ºi¾v×}SÒçÿ
·¨ÿÀ:¼ ` þ_¼«jöº«§ÍüÕ6Ò×ÿ\Q`ÿ7Xþ
-Eÿ³åºSóǤëß"ÿÏü?²!ë¿÷ì4ÿ·þ?v÷ù¿Txÿï4 uÿ-ÿ/ÿcAc «Çÿnû_ýûsý[õ?´ºA ý/ÑêOhc§ð¤÷æÿ,@û²IÐÿÞÿCh£_þWyãVÆýË5ò¿$ÇÿpþcJéù¿ø3@ÿ°õÎçÿ8ÿxþ'* É
ªÿìõÿcóÙPõ?lýóù_ÿôÏÁEsÛÔsôB¡ê?{ýìÿa»dCÕæú?ªDþÔÿ
-yý/sýý³ä¿l¨ú¶þOküw8ÿí¡É0þg©ÿcàÿaawÿ±ÿW,Tý[ÿǵëÿÀÿÏBÌÿCûr¡é_å÷ø¿8 Æ?÷ùoÿñóßdCÕnÿÎáË¿²¡êPÿWëýÏ*ý³ð©ÚVèäBÕvÿÖXÀø/ªþ³û¿àÿdþ/Ù×ÿrû¿ àÿ
-UÿÏ+Jìÿbû?d3ÀøÇÿý³°»ÿð
ªÿÜç¿!ÿÇÎ
-MÿiÁE
'û¿,ü_PãÛÿe±ÿø¿dCÕöú_Ð?Xþ
-UÿÃÖÿjÿ8ÿÏÍvý4}7zPõÝÿ
ú¿,`ü
-UÿÙý_Èÿ° ÿlÈë¹ý_Ð?ðɪÿìþ/ÔÿcÙ_Ù0þçñAÿ,ìî?ü_b¡ê?·ÿù?àÿMoý§ü:!*¼·ÿËÂU¥vðqÿóßSÛHÿþügçáÿcÿíýº®æÓMó5ܰ»î>ÿ/<Îÿâa?ýÂü_*ý¿xÿVÕì[uWOù«m¤¯ÿ¹õxp¾h(ú-×?&]ÿVãü0ðˬÿÞ³Òüßj¬ÿ³°»ÿ3Ìÿ¥2Àû§¨{üoù|©¡4/«Çÿnû_ýûsý
[õ?´ºP0 ú_.¢ÕÐÆNá}ßÿcþÏPÿh_6 úßûmôËÿ*oÒÊØ /CþäøÎLi#=ÿú?\Pã?lýóù¿Uç?°ÏÿD ¹Põú?ïÌÿeCÕÿ°õÎçaüÇû?_ÍmSÏÑ
ªÔÿy`÷l¨úGý÷êÿȼþú?ïødCÕÿ°õZãQbÿÚCÿ`üGý7Ìîþcÿ¯X¨ú¶þk×ÿÿ
ÿöåBÓZ1 ¨ð¤ú?ÑÿUÂÿÅ5þÙÎÛÅù_.pþl¨úÏæÿÚéß%ôÏü_²¡êPÿ×ñûßaü/ >UÛ
-]\¨úÏæÿÚë_{äXÀø/ªþ³ù¿öó°þËü_²!¯ÿåòíôï úç þ/ÙPõíü·ýøïö³ý²`üÖÿµÿQÿ}úþ/©Põíü·þÿãç¿É¦¿þÿjü³ù¿õ?ò?,Àÿ%ªþ³û¿°ÿäeCÕÿ°õ¿Úþïúgáób³]?Íbß@ Týçö¡þ'ÿeCÕvÿò?,Àÿ%òú_îú_Èÿ° ÿl¨úÏîÿBý_ýÍ ãú_Xÿca~
ÿK*Týgóôý<Àÿ%^úßáϧ³éjù úMõ=üÝ»¨ðþçÿú¸þ_h¬ÿ±_6}Çÿrðï¨ð¤úºô8ÿþñß.WËåÝô!9þF;ú,⿽_×Õ|ºi¾>ô$½ÿïâ_8Ôÿåa1¦B!èÿÅú»ªfߪ»zÚÌ_o#}ýßÙëÿ,X_4ýÏënÍ®Ôæþ?ÙPõßöOÿõ?öaþ/ëßÿðÿµæÿþ?J_4×ÿÝê'Õ±
-ùü
-z Éô×ÿrwúPÚHËÿïò?ªÀü¼ÿ˦¿þ÷ö?Jýò¿Ê§´26è_ùÒ#ÿËAjüÇ¿&µÿ7ªDþbüSÊõÿûóøç³ÏÿE0¹õRþTÿë<`þ/¢þSÊõÈÿµæ%êÿððeÑÜ6õ½PúO)ÿEªÿ¥±þÏvÿɨÿò_ú_
-ç¿ñú_²¡®ÿ%ÿ¢ø´ÇüdÿeCÔJù/Êø_XìÿaA{t ¹~üï,ÿEñÿþöÀþ_©õRþ«ÇøïZç?¢þ1ÿíË
¤Åàÿrðq@ÿÀþ¯óýó?&pþ£lúÏïÿþYÿK6Dýëÿj½ÿ²þYøTm+tr!ê?¿ÿë?,`ü
-QÿÙý_þOàÿ
-uý/·ÿËaÿ'ðɨÿý_õ¿ÂÂÿÉöÈæúñ?ÿúga ø¿¤BÔÿÀþ¯VýG
ü8ÿQ6$ýkÿ꿱@~ÿöÿ° ÿlúÏïÿþY@þW6Dý\ÿ«=þãü?>/6ÛõÓ,vÞè BÔ~ÿò¿,`ü
-Qÿùë!ÿÃü_²¡®ÿe÷ÁÿÉü_²!ê?¿ÿõ?Y@öW6×ÿü_Ð?û Àÿ%¢þóû¿°þÏü_²éÔÿb9§úùO¢Â{û¿ðu]îöÃÿ~ñÿ/ÑôwDrüÒ±ÿGüóÿ0
-06vñ/Ëø8ìqßÇøïòÿæwCÿ¶@üSâß½Ø{¤ùßNÿÚ¼ÿ±`n,æIÑxé«Z;.ýk×Ò©ÿe!ÆtzßlGV«ÒÖO>î>õØl6#µÿûír]7wða³ØÖëºú^ïþMaÇËèOÈHÒõĸËí}½>|rl½ø£ùIÿ-¥
-Òü¯Àüø?ÖÍâvÜFGÿ¯nõÿEó¿Yøø×]=úKýø÷å¶zøýhÇØÇ^GßþxtÁÖu}øúhlXszÁM=¾`¤½ö¥?ºà³móýåÄ+r|ÜÄçEuzIx(¼:ºàS³Þþ8ú;/ø¿ëf[fß~ÿþÔ<ÔÿYÝÕçLxÓ8þ!ÿRVG¿Äá79þ-ËÅÉwJ_]¿ø÷êëÃÑZÿýÓߦ_á±×¼\r|ÁOY}ö{^ü5ÿþ¸ºøþöP}=ý÷
>æßþO={¨ÇþAÇ¿Åß¾,ÖûK^î?ù5ÿãén'§GÏjõ衹ðÕ¿=W/_ýWkA")ýÿ<¼üWáÉLm£óý߯ÿiú<z§9ÿ?hQóÿn³Ç:õìÿØëßbýCf¼Lúé¹Û<¨m¤¯ÿ+«ñþǺ\2ýÇÿÄCß åÿ
-òÿ¤Ä5ÿüê;%¢ÿ|ùßÖûÇú?/
ù_7q!&Z§¥ãô¯ñÂÒgq~¢í̯IþYóðÿ³°Oɨù?_ªæ{ÔyþÏ'Îæôãü.&ZÙãÎóEáíäøóü)Ìxâ.èÈÿ©®üjåÿü8tOÇM´óNññoÑÊÿá >º ÿÓúä;täÿTWþOuåÿT+ÿç&vlN.8Ëÿ¹ñØ'´òÎ/x-ÿ§^Íÿ)äÿ~ßÿ4¥
-ÿGÃÿÃAJüYó¿¨ÿÅÂ¥ä/ò¿rHìÿI$õÿ
-ý?ñçËÿcý
ç¾Lúë¿dÍÿÅúOÈÿå'%þùò¾ÿCý/tq£:±¤è?[þ¯hÍÿJ
óßXxÉÿ.gýØãì_ðÄèãÜ3æ²_Äñ_6ÒßÿµòØÿÉBJüó¿ý?û\Ùµÿ³lïÿ,&å¸8½àtÿ§9Å£Zû?GÚm-Ûû?GfìÌÑùß²+ÿ[¶÷ìääg¸´ÿÓ_paÿgqòC^Øÿ9ßÉüoÙÿ-»ò¿å
ýáúø·hïÿZùßèÉ<ºàµüoùjþ·Dþ÷×!¥ÿçÌÿYþKÉ¿¥8ÿçËÿ`ÿ7ñöÏÂÿ x¤¾ÿSr2¤÷÷úŵÜlðª@k£;ÿÓÚÿëòÿ,`ÿ¯lúéÿ¾Úij^mô_8¬ÿ± ý˦ÿü¯àÝÿïáÿá %þ¬ûÿ±ÿ
ñÍý¿`RôÏÿcÛþøÿXxñÿhíK7V) BéêïÚS¨-°²øK¢ÖýÿXÿga/ºüEÛÿaoÎ.8õ8;9Ú1^\ð¸²8¾ ]ÿÛ¸&:üEÿ£hû?tYúã.ù?ÆÇ?Ãÿ;¹Qê(ºüEÿ£èòüÖÇ?Ã
úß#KqÉÿáO.xÍÿQ¼êÿ(àÿøuHéÿYýXÿcáÔöýßÒH\ÿáó`ý
CÿÁ%QÿcJÿÂþã?¡´A?ü?,ô¿ãÍÿÈÿqÎýÿðÿò ÕFp¹¤è?_þ¯lçÿPÿ
ü)ìØ'Þ¤e Ëàñ{XïìiPÁbðË¢Öýßð³°Oɸ®ü»°ÿÛÛ£Ìkçÿ
-cãïÐÎÿÙâäöþokÆÇMtäÿ\WþÏ]ØÿíKuò[\ÈÿãߢÿÇßáÒþïïÐÿs]ù?×ÿsòÇÙ;w1ÿ§Èù¿ò¨»{5ÿç^Íÿ9äÿ~RúÖüÎ`¡µóù?Q$®ÿðåÿPÿ
Ýý!ÿ'DýkÊ ü+ÿá 5þ>øsÐ?þ7ÿW ÿÇAJüþI!I×ÿîrèÄøóíÿÿ
âÕß%¢Æúï¾Äû?/ùßÒ¥*®8ý¹ô¦ßà4óu
_ý³îÿþYاäLWþ×\Øÿ91=½àlÿ§Òþøvþ÷$÷j.äýqqÓÿ5]ù_saÿ§r'M\ÊÿúãûÐÎÿ^î¸ù_t̵éÊÿ®ü¯éÊÿ®ü¯¹ÿõãã_óBþwR_ðZþ×¼ÿ5Èÿþ:$¾ÿQÿ ½ÿcý
ø³æÿáÿb¡µóùQ$öÿ|ù¬ÿ±ðÜCð2é¯Ï{þ¯Bþø³ÿùÚÜhþ.ýgËÿ8ÿû¯âù«J3.uRP;ñ') ñ$Äù8TÉÄN÷èb~MRôϺÿõYØ/Éû®ü¿°ÿ/ôþô³ýîxÇ¿ÿ)ìQîÅ_ÈÿúäüïÊÿøùN~Èûÿ¿Ã¥ó_õñw¸´ÿor|AGþÇwå|WþÇ_:ÿÕÙã`]Èÿ(sîKç¿<¯åü«ùüϯCâû66Òó?Zyü)ñgÍÿ þ#ÿEþG©ý¿%´Aêÿ
-úãÏÿCý'öÃ/|ºRé¯Ë»ÿÏ!ÿÇAJüCÿï)mPÆ
÷?ãÏ·ÿõXð8ÿW4)úÏÿméù_&ê¿:Æ`ÿu''@ãøî~,K5ñcô3¿ )úgÝÿ÷ö)9Ûÿµöÿ©ñQÅP{aÿ_yzA;ÿ;>ÞRf/ÿ¨õÑ©
¶+ÿk»ò¿öBþ·(²ØöRþW»ãÚù_gíñöÿÇ?CGþ×våmWþ×^ÚÿgN~ù_ëoõ¥ý'Ñ|-ÿk_ÍÿZäRúÖüü?,\:üù?9$®ÿðå°þÃÂ> 3^(ú/)mÖÿÿg¡_üï«Ít±\?VÓÇúq¹þÔFúú¿qúÖÿEÓÖxéßlȹþKôÌÿ{ã-´ý¾h-Îÿdágñ?6=éñwZcÿ7¯Å¿ó$Ä¿0f§Pÿ
ø]
VëùtQ=&/úÑ=ÿ+Ïâ_ ó?þVÇz) Tzéÿ{xôåϵÑA§þæOô°ÿ
þ?.WOÛz=ú÷åz
¾@½ô>Qo§ÛêÖF÷ø¯Ïõï,ê?³ µË¦çø¿/×ä6ã¿òÿYøûÿûÃ_ðñ àòÿÏY È
+ ¨Ø9K í_ÛÊåïëèSðq7båEýAô=
+Ç(¼öN¬ØØ'DRÝu}}5~Q »MT¥ÎóÓܱ¤XÝHªBå©,ÊÇyðïÇ+;û¿CVQäyü_SäYýgã}ý¿G~1Æf6¯þ>Ø_2cËå}?g<íöåv4úåóÝúîa¹zåºÅvø°Óøo¶ë!nñ7λÜd.TñwÖd?füg§åê˺Ç6bÃ!ÞWâ_©ÞùøûÙ_FYßÃwQÿòÅn·ÞþÛïGÙ»_«ùz;]Ϋ?ýái¿Xí³?üåûê¡})ߪ¯üÝãz¾xø·ê÷Î~?ZêÏÊÑ¿¯·QõÏFÿ{³_l׫ÿ¶üï£ÿ|ni4ù»Ý~±Ù,Wwu³ñÓÿòÿ?ϳñï
+ïfåì~1Ú-ÿ+~ªÉ¬ýùï6÷ßvËYÕBýfïvËÏUÌîvÕì»YlµúÂËGÆ¿8|©Ü,g¯ðn¹ZîÕgÿ2^ýeó¿øm±¿.~-6ûåzuü»(ùèañkõ3Wñî«ÊªõêÕ?ýú¸Í£Ín1Úïf£ÇÝv´)£ÇÙb4ûm\·7Ú-6£Çý¶úÊ]üJ9=®.ÛÇæÂhöðåáiw?z|ümôå·êvÕ§UÿÙÑý~´û¶«~øê^ÿ¿¾øm__2]oö£Ç¯ÖÿYÿf´]l¦wëõ|´Y-GåýiuÍìq3}Xܳoï>¯ïÖËM¼A.ð»*(ÿ_<»ãþÏÕwvoÀñ»:~1øCx¦åÃònõX=%¿,çóêïêËâçúlôy¹ßÃö?F~|ø_Û}õ¤¼ÛTßñvôX®ªfâçü¾ºs£/ÕÍþµúo¿ß¼{wú7óï? Eó5|@«tl~øÔþd¨ô ãæjùVh1ùáP÷fÐWzÐIóu|@ù]õýè¨ÿÉP+èAmÖ|@=ÐcÏßÌúýÔæóý9Ðð= NÒÚæøþsÐâÍ< ¯ô ®ù|@tü= ^Òúæ:æús< 7ó¾ÒæÍtÂôçx@ÍÏJÊ%]èTa.©~DÿýÙIßD_éD¯%MúYÑ-$½èta>©~DÇ?þ#ú³%¾ÿ¾Ò^I(f~GôgK)^Ô]I)æ~GôgK*}ÿý~/ê®$³J?ð=ÞJÐ4ýß»}¹ï·×ýßÕ
»ôSÐÿ öÖ£±É(83®ºdã3lÈ-Âx<²Þ
ɨ(F¾êT²Ã UÝy·)¼ù<ÍÈ,^_}D¯·Åäùz3
+«îÎÚQ°>OÆÎ£©.2ÏÚQ>©>¨úc>vÕE
É̸jÇûQ6ziÞÉÇÕ7©x¥·¹ûóñ»ç+«4·¡nÂfõ'7ñßÙqõáùº¼ú®Bõ96³ñ³ªÎ²º²¨>¬úDÛ5/ê[Ìóøýê[X=µãêû=ýênúêÞTߣ Æø¡!Yÿ|öqUKÔMLêy<©îJý!¾®uãêÆfñ_W1ª¿ÃÜê7ζ]}vuøçÄT]'Õ
+«þÝÙ7iª°kCu3FÅ$ØIQ
\3£]j«oÜøw¹syý]N²¢ºaõ·YüùÂ*6¯oÏ8Ë·q\ýnd]¼Æýóðñ»´ñ;¯"¯à«ÆOή"MLÝó
¯3Wß©jf±ßÆv]VTO/F/?gõ(ßãë'!¼üMý·¾z4Oþè&.ägWðññññ×OôëÝlÿÛ~ä³cë'ï>ïjhuYfç¸Ånd'ãÜÖÞM·O«Õru72Ç?~XϾ.æÕÇý«_Ùzåìý÷m7D
+ûÿ«0ç¼qqÿ÷ÿ#hľøuYÉ¡Ïç [ü³àLa3Çõ<cü!|7þÕï÷Ç^´øÇõ¿9Çø#hÿlótó3^ÿ%Ëú/ºÄ?®yÞò¤Å¿¨â_øý?Îñ߯7ëõÝ7Ák\néñßßoå|úl èÐF°ÿ~þ¯ú¹¿÷Ö3ÿà ÿÆÞjIWÒõÿì(nÊÙ×òn1]Î[ÚhÕf/ô[¨ÂWMºþ£·¯]ó§¤ëß@ÿüºê?aö/ÿ,§þ0c7 ßÿ§Ë]_X0ÿ÷9ÇÂWÍãõwÑ¿¿Ô¿ñ¬ÿ!¼/Ø(¦³þ׫JQQá¯ìÿ¹2þg¡àü¡úUÓYÿõ®S [þ76ÏLf]Ôîó¿ã¿\Í¿ÙÄÇ@ÿ/óÿdñ»Ì»·Ñ>ÿõk8þ#ÅþÌ9Zdúñ Äwé¦Üî±fÇwÚH_ÿ9×ÿ0pþ¯þ÷ß6}ÿærþWÿúGðiµü²\ÌÙ(E¦ÿºWç6ÒÇ[ä\ÿ`©|ÕÈô?[ß/¶ÕìÛá e9 ]ÿî2ÿýÿg áúß}¹]̧պ ÒÇÿ<3ÿC ÿG72ýÿ£ü¶®¿LËÝn=[
ûå¯Ëý·ï¶>þÇZÔ?Ã@57ÿå¦öõ¿ÿ?ú Àý¿Zéõôøy±3Ýbߪöñ?oè?dÔ?ÿ§öõ"Ñð±þYüûö]îÿ°ÿt©F¦ÿú@ÿndúïÙÿÕxÿ³ÁRÿ>û]^dúø¿¸þã¿ndúø¿èÿ@ÿnëÃû¿¸ÿíºé¿oÿWcýÏú?!pÿnnÿòQÿùWú¿"Óßþ¯Ëü¿ÌÿaÈ
+g èß ü_¬ÿAÿû Ðÿ¥þþ/êó¿ºé¿ïú_Íñçÿaø¸Úí·O³Ø{³'PLÿ ÿó¿8þëF¦ÿùôéF¸þ7¼ÿþOôéF¦ÿõ?!0û«Çÿ¡ü_Ô?cþþ/¥Èôðqýý_ºé¨ÿÔ#Ï
+ïîÿ
+¿TWùþ/ãÿrþ{zÉñ·ÕïsÆAzü÷÷ÛE9î«Ûu×å¤Íÿcü½7<ÿÂó ¤ëÿÅû·)g_Ë»Åt9oi#mý/ê?·<ÿóÿºI×ÿl½í ùSÒõoYÿþt#ÔÂì_4ÿ7ë¿A8F`Æn@'7¿ÿw0 æÿçÿbàê¿nnÿ»Øÿóµþcýö½c Îú_¯¢Õ_ÔFTxHÿ³Ppþëºé¬ÿÿGÔF·üo¢í?³.ê?·ÌÿBHÿñüÇ´6ùÿñÇ ßõBcýþ_ñüOV ÒLÿCÖÿ ú?\ÿÀù¿ndúï»þÏåüõÿP|Z-¿,söJéÈú?µþÏõÌÿéF¦ÿ!ëÿÔù¿Óÿõt#\ÿ°þOÿ¸$Hýàø¯þû®ÿs9þ¸ÿa0ÕÜ<þ÷^ÿ'êÿÐÿá¾(E¦ÿ¾ëÿä
+ýç¬ÿ!æÿ©}½Hô!ü_þ/²øyþÛ1ÿËùÿ¦þþ/êý_ºé¿gÿWãýÏKýCøPîKvzéàÿâúÿºéàÿ¢ÿý_º®ÿ
+ïÿâþOôéF¦ÿ!Ï;ø¿xþê_77ÿù¿èÿÆðe7 þ<ÿíèÿâú?ÿ¦þ
+ÂÿåéÿB ?ÀÿÅý?èÿÒLÿ ÿõù_ÝÈôßwý¯æøÏóÿ0|\íöÛ§Yì½Ù(D¦ÿù_ÿu#Ó?ÀÿÅüú¿t#\ÿÞÿEÿ'ft#Ó?ÀÿÅú¨ÝÜ<þåÿ¢þ!<'`Ù
+èD¦ÿëÿèÿÒMGýç²?D
w÷¿TWùç?BèÿóßÓÛH¿5.öÿÿð¤Ç¿]óénù¹º]w]nIÚü?Æß{Ëúë/':I×ÿ÷oSξwérÞÒFÚú_Ôn-×ÿ!pö¯týÏÖÛ?%]ÿ6æÿ!Ðÿ£¡þfÿ¢ù¿aý 8Îÿróû`þïéÿÃSøª¹qüïbÿKÌÿÕú7ù?þ={ ÍtÖÿzþ¢6¢ÂCÒø
ó|ÿ×Mgýü?¢6ºå³`óÌdÖEýç.cþAbüç?¦µ!Èÿù²ø÷]ÿ'4Öÿyþxþ'+ éE¦ÿ!ëÿú?\ÿÀù¿ndúï»þÏåü¯ÿ-õàÓjùe¹³PLÿCÖÿ©õ_pÿ
úÿt#Óÿõêü_ôÿC`ýÝ×ÿ¬ÿSë?3ÿC`ö_72ý÷]ÿçrü6pÿØhææñ¿÷ú?µÿ?ú ç_ôÿ+E¦ÿ¾ëÿä
+ý³þÿ§öõ"ÑðÙþ/²øyþÛ!ÿËùÿ¦þþ/êý_ºé¿gÿWãýÏKýCøPîKvzéxÿçúÿºéàÿ¢ÿý_º®ÿ
+ïÿâþOôéF¦ÿ!Ï;ú¿èÿÀýº¹yüÊÿEýC8ö¿ô)E¦ÿ!Ï;ú¿¸þç¿éF¢¨ÿÅúodñø¿¸ÿý_ºéàÿ¢þ!0ÿ«þû®ÿÕÿyþ«Ý~û4½7{
Èô¨ÿÅü/ÿºéàÿbþý_º®ÿ
+ïÿ¢ÿý_ºéàÿbýOÌþêææñ(ÿõáØÿÒÿ¥þþ/®ÿC ÿK7]ôÃÑ¿5íú?ÿâùÏÿý7\PLÇñßÉNþ=ÞÝÿYéß¾°ô"èÿýz³~Xß}<iñ¯ý¿Î³þ#ôøïï·r>Ý-?W·ë®Ë-¼ÿ{ËõÇ9ÐIºþ_¼¿röµ¼[Ló6ù?k¹þþݤë¶ÞvÐü)éú·!pÿ'ê_7Bý'ÌþEóÑÿá»ÜüþßÁ (ÿ{ÖÀà(|ÕÜ8þw±ÿ
+òÿ¹q¬ÿÁ¾g Îú¿Á:ÿuþ?\ÿÀ÷ÝtÖÿÁÿ'j£[þ7uÙgë¢þsÿEÿãù¯imòÿ<ÿ,þ}×ÿ
+Íú_ã?xþ/+éE¦ÿøVàü_72ý÷]ÿëÂÿÇ®ÿAø´Z~Y.æì"Óÿõ¿ÂáüGÎÿ!p÷ndúçùoÖÿÒpýç?¾ý×Lÿ}×ÿºÿYÿ
ì 4sóøÏójàþ_¥Èôßwý¯õ¿þEÄü?µ¯þ³Aý_áàÿòô!ÅÈóù_®ÿBàùºéHÿW8ø¿¨ôéF¦ÿý_ú¯6°þå¾d þþ/ú¿!pü×LÿCú¿BíÿÊéÿ@ÿnëú¿jýÇWê ý_ºéÈóëõ?sÿîÿÐÍÍãïþ¯Pû?2êÂ1ô)E¦ÿ!Ï<èù?<ÿQ7ýÿ+§ÿ,þ ÿýÿèÿÒLÿ ÿõù_ÝÈôßwý¯æøo©W»ýöi{oö
+éàÿbþÇÝÈôð1ÿþ/Ý×ÿ÷Ñÿ þ/ÝÈô?¼ÿ+°þfusóø?ÿõ?1#@ÿRdúø¿¸þþ/ÝtÔÿrþ <üóÿ«êèÿÿÙÓv»Xí§óíò×Ŷ{íó¿Ë÷?g
+÷ÿC(gå4F£J$ú¿[Wò_·ÓíºSíó¿Ëú?ÞêÂãbõDéë¥þ7ÛŮҽ¸týgÿAdïMNýë¥ãøo¼øí/ñýÏW_¯®òßÿtÿ~½Y?¬ï¾¥?Éñ¯zëøïï·r>Ý-?W÷ë®Ã=IÊÿÔñ÷¾ ÿBê?Ît"ÐÿËæ¯M9ûZÞ-¦Ëùëm´Ïÿí
þs[Ðÿ ¡ ðU#Ðÿl½m×ü)éú·
§ÿ~ÝHõß}ö/ÿÖÿÅoÿóµÜþþß¾¤}üwóÿܱþÃý_ª¹uüïgÿWh¼ÿ®ÿA0 @Ít×ÿz÷zKÚ¨ôþó¬ÿ îú?l ´Ñ-ÿg&³.ê¿ÞÿÅüïð¤Æ¿Þ dÓôü¿¯? aü
+À¦Ïÿm(¸ÿBÕᲬbúO* ÿÁ1ÿóÝõT ¶=ÿ×ÿ
þVË/ËŽRúO* >þ»¸@ý`õÝõT Vÿ/óXÿU7Òõ¿°ýgú@ÿnúO* ®ÿà÷ÿ@0ú×Ìíã{Øöõ¿ÿ?ú Ô±Éèÿ×PÿI`ÛÇÿüRÿýÿbþÚ×HÿÀÿeèÿB Ïþ/ßÈÿrþçëF¨ÿÁý_ú@ÿnúï×ÿÕxÿ³¡ þ!|(÷%» ½õ?¼ÿë?8þëF¨ÿáý_ôB ÿK7Òõ¿Áý_Ô?ú¿t#ÔÏþ¯ÆúsÜÿû?tsûø?ÿúPÇ&£ÿK+Bý÷ìÿºÌÿûù?<ÿ[7"ýÿËÒÿ
@ÿáý_Üÿþ/Ýõ?¼ÿúÀü¯núï¹þWsüçù>®vûíÓ,vÞì "Ôÿðþ/Öÿ
Àñ_7Býïÿbþý_º®ÿ
+îÿ¢þ!Ðÿ¥¡þ÷±þfusûø?ÿúPÇ&£ÿK+Býïÿâú?ú¿tÓEÿõ.÷-:û7Ò®ÿú.Äó?]Î÷ÿVM×ñ_tðï¨ðÎþϨSøçÿBèÿýz³~Xß}<Éñ·Õï=ã =þûûí¢Oã`¹ºërKÞÿëø{o¸ÿÂó,ç :I×ÿõwSξwérÞÒFÒúÿÜZÿºI×ÿl½í ùSÒõoC`ý7ôÿéF¨ÿÙ¿hþÑÿáÇn@'7¿ÿ÷âÿkÌÿ}ÎñÇÝÜ8þwPbþÿ Cÿ?ì={ ÍtÖÿzwúÚ
+IãÆú ¨~ÝtÖÿÁþ'j£[þ76ÏLf]Ônÿ
ÿãñ¯imòÿãAÿ¤ò_æÿ¡±þoXÿB<ÿÀô"ÓRù/Áú_ȹþóÝÈôTþ«CþïrþWÿÜÿáÓjùe¹³PLÿIå¿$þÂsý¿ºé?©üWZýCþ/äôÿC`ý/Ý×ÿRÊIü?qK0õïÿºé?©ü`ü6pÿØhææñ¿½üÄÿ2ú <OÀØèD¦ÿ¤ò_ú?>ä¬ÿ!æÿ©}½Hô!ü_<ÿ,þ}û¿.÷XÎÿ@ðüGÝÈô?¼ÿËSÿ¸þ«þ{ö5Þÿl0Ô?å¾d þþ/®ÿ@àø¯þþ/ú?!Ðÿ¥áúßðþ/îÿÀñ_72ý÷íÿj¬ÿÙþO4~èææñ(ÿõá¹f7 þûö]æÿ}`þÏÔDÿ©ÁE
'û¿ý_dñÞÿe¸ÿý_ºéPÿúÀõ_ÝÈôßwý¯æøÏóÿ0|\íöÛ§Yì½Ù(D¦ÿù_ÿu#Ó?ÀÿÅüú¿t#\ÿÞÿEÿ'ÿºéàÿbýOÌþêææñ(ÿõá¹f7 þ÷1ÿþ/ÝtÔ¿üy *¼»ÿ«ø¥ºÊ<ÿBçø¿ÿÞFrüq±ÿgü'=þûûí¢OwËÏÕíºërKÒæÿ1þÞ[Öp@ÆINÒõÿâýÛ³¯åÝbº·´¶þõ[Ëõýë&]ÿ³õ¶æOI׿
+ùøu#ÔÂì_4ÿ7¬ÿá Çn@)7¿ÿw0 æÿþ?´ÿ鿯ñ¿ý/1ÿWëßxæÿ ø÷9{ ÅtÖÿzþ¢6¢ÂCÒø
óôÿ꦳þþQÝò¿Y°yf2ë¢þs[0ÿ 1þÇóÓÚäÿÇü?Yüû®ÿëÿ<ÿC<ÿô"ÓÿõCý®ÿAàü_72ý÷]ÿçrþg5Ô?O«ååbÎ^@)2ýYÿ§ÖÁý?èÿÓLÿCÖÿ©ó!Ðÿõt#\ÿ°þOÿh ¤þPþºé¿ïú?ã°û À@37ÿ½×ÿ©ýÿÁÐÿáy½Ndúï»þOÞÐ?ëÿaùj_/ýg ÿ
+ô!ÅÈóßþ/Îÿ ðü7ÝÈôðQÿèÿÒLÿ=û¿ï6XêÂr_²ÐLÿÃû¿<
× pü×Lÿ ÿýèÿÒpýopÿWÆý(ÝÈô?äùoGÿý¸ÿC77ÿCù¿¨Ç Ðÿ¥þ<ÿíèÿâú?ÿ¦þ
+ÂÿÅúodñø¿¸ÿý_ºéàÿ¢þ!0ÿ«þû®ÿÕÿyþ«Ý~û4½7{
Èôð1ÿã¿ndúø¿ÿ@ÿnëÃ×ÿ¢ÿå¯þþ/ÖÿÀì¯nnÿòQÿ ÿK)2ýü_\ÿ@ÿn:êߤùxJTxgÿ¯¾^]åsú¿tÿËðÉm$ÇßÏbüGÿýývQΧ»åçê~Ýu¸'Ióÿ:þÞóüoÙÆù¿Rú1ÿmÊÙ×òn1]Î_o#iý¯Önÿ åÿu#Ðÿl½m×ü)éú·
cý'øu#Õ÷Ù¿hþo¸þ!Þ~Çù¿Znÿow µÿîrþ[ú!pù_7·ÿýøÿBãýç?`0ö½qìÔÒ]ÿëUôúKÚ¨ôþóÜÿ£îú?$mtËÿf¡¶ý[õ2ÿ!5þÇ ÚHÏÿÛêÆ0þIÒçÿ6Üÿ!ÿÉ
+ at zê?© Pzþ/ËüÎÿu#ÔR öü_cþ
+îÿðiµü²\ÌÙ(E¨ÿ¤@éã¿Ë,ë@`úO7Bý' äÿÇüÖÿÑtý/¥ @ÿY þ!Ðÿ£¡þ
+ ¥ë?8Çý?7 ©æöñ¿½ Pûú_Ãÿý?˯ôÿkE¨ÿ¤@íã~©ÿþ1ÿOíëE¤ÿlhÿ)
+ÿAÿý_¾ÿåüÏÓPÿÃû¿¨ôéF¨ÿ~ý_÷?
+êÂr_²ÐPÿû¿× pü×PÿÃû¿èÿ@ÿn¤ëû¿¨ôéF¨ÿý_õ?ç¸ÿå¯ÛÇÿü_Ô?úögôiE¨ÿý_ù_0ÿç¿éF¤¨ÿÑÿ
@ÿáý_Üÿþ/Ýõ?¼ÿúÀü¯núï¹þWsüçù>®vûíÓ,vÞì "Ôÿðõ¿XÿÇÝõ?¼ÿùôéFºþ7¸ÿúÀônúÞÿÅú(ÝÜ>þäÿ¢þ!Ô·?£ÿK+Býïÿâú?ú¿tÓUÿNtòç¨ð$ÿWuçùºÇÿåü÷ä6ão·ñG ÿþ~»(çÓÝòsu¿î:ÜÁüß³þzõ
óµôÿâýÛ³¯åÝbº¿ÞFúú_nÿ åÿu#Ðÿl½m×ü)éú·
cý'ôÿèFªÿî³Ñüßä\ÿP»/8ÿWËíïÿí öñ¿áÿÉý¿£ò5sëøßÁþ×Aÿ¡ñþo¸þÁØ÷ìÓ]ÿëU´úKÚ¨ôþó|ÿ×Mwýü?6ºå³`óÌdÖEýçAHÿñüǤ6Òóÿ6 ? aü{®ÿs9ÿ·¡`ýgñüOV ÒPÿÃ×ÿaþçÿºê¿çú?ù_(¸ÿ§ÕòËr1g/ ¡þ¯ÿÃýÿ¸ûG7Bý_ÿù?¬ÿ£éúßàõ¨LþëF¨ÿëÿ\ê?8Çý?7 ©æöñ ú?ôÿ@¨W_2úÿµ"ÔÏõòFýúÿ1Äü?µ¯þ3ÿöVÆç¿½xþnúçùooú¿t#Ô¿þ¯ÆûÏCñ¡Üìô"Ô?Ï{#pü×Pÿ<ÿí@ÿn¤ë<ÿím@ÿnúçùooîÿÐÍíã?Ïû©{ßþ/õÏóßÞ<ÿM7"ýÿËÐÿ
@ÿáý_Üÿþ/Ýõ?¼ÿúÀü¯núï¹þWsüçù>®vûíÓ,vÞì "Ôÿðþ/Öÿ
Àñ_7Býïÿbþý_º®ÿ
+îÿ¢þ!Ðÿ¥¡þ÷±þfusûø?ÿúP÷¾ý_Zêxÿ×ÿ!Ðÿ¥úO¬øuNTxÒù¦ðõ¿ tÿËñïémtÿ±ÿw¡êÿãïéñßßoå|º[~®n×][4ÿ¯ã。ÿÂs8 ÐIºþ_¬röµ¼[Ló6ÖÿjýçÖðüO|ñ×MºþgëmÍ
®ë?A þu#ÔÂì_4ÿÏèÿÅp ] J¹ùý¿ÿOcþïsÿ8þëæÆñ¿úóýú1dï¹ô§Îú?¤ÿEm$çÿl[æ $Æÿxü[Zü_ÁøcÅ?©üGñ?4Öÿë¿Bçÿ±^dúO*ÿ!xÿ9ßÿ1pö¯þÊtXÿ¿ÿUã?ýÿ>_9{¥ÈôTþCÿ/<×ÿ Ðý¯þʤíÿ?¬ÿW/ Ô?ÖÿÐpý/¥ü$ÿSÔ? æÿu#ÓRùÁølNÿ?Øhææñ¿½üÄÿ2ú!<G½NdúO*ÿÑaüÏúÏYÿBÌÿSûzè?µHTx²ÿç?AÅ¿oÿ×¥ÿÛrþç?éF¦ÿáý_úÀ?ÝÈôß³ÿ«ñþg¡þ!|(÷%» ½ÈôðqýÇÝÈôðÑÿ þ/Ý×ÿ÷qÿ'ú¿t#Óßþ¯ÆúÍéÿÀýº¹yüÊÿEýCx »Èôß·ÿë2ÿïóxþn$ú7ÿ¥ÿ,þ ÿ÷ÿ@ ÿK72ýü_Ô?¾øéF¦ÿ¾ë5Çÿ
áãj·ß>ÍbïÍ@!2ýü_ÌÿBàø¯þþ/æ Ðÿ¥áúßðþ/ú?!Ðÿ¥þþ/ÖÿÀì¯nnÿòQÿ#Àn@'2ýü_\ÿ@ÿn:ê,;ùó@TxwÿWñK}UFÿÎñ9ÿ9½äø[ãâú/ã?<éñßßoåüåðm¤Íÿcü½·ôC8ÜÿËJI×ÿ÷oSξwérÞÒFÚú_ÔnÏÿÀônÒõ?[o;hþtýÛP°þüºê?aö/ÿîÿÁPßÇù¿Vn~ÿï` Ìÿ}àøaLá«æÆñ¿ý/1ÿWë?~ú0~?a Îú_¯¢Õ_ÔFTxHÿ³PpþÆÝtÖÿÁÿ#j£[þ76ÏLf]Ôîó¿ã<ÿ1
+Aþ¿pÌÿCÅ¿ïú?¡±þo¹ÿB<ÿô"Óÿõºþ×ÿ0pþ¯þû®ÿs9ÿ ©VË/ËŽRdú²þOÿõ?0p÷ndú²þOÿþ¬ÿ£áúßõjýgóôÿèF¦ÿ¾ëÿ\ÿÁÜÿÁv ¹yüï½þOíÿgýoÇõWúÿ"ÓßõòþëCùj_/ýgÿÏ ÿç¿<ÿ
ÏÓLÿÃû¿rêý_ºé¿gÿWãý/. Sÿ>û]^dúø¿¸þã¿ndúø¿èÿ@ÿnëÃû¿¸ÿý_ºéÈóßþ¯@ÿ'îÿÐÍÍãÿPþ/êÂáþÓÿ¥þ<ÿí æÿ0ðü7ÝHôoþ/Ö ÿðþ/Ëý?èÿÒLÿú_Ô?æu#Óßõ¿ã?ÏÿÃðqµÛof±÷fO þþ/æ!pü×Lÿ ÿó?èÿÒpýoxÿýèÿÒLÿ ÿëB`öW77ÿCù¿¨ûOÿVdúÞÿÅüú¿tÓQÿÙÉ¢Âü_ñ*CÿÎñ9ÿ=½äø[ãªË éñßßoå|º[~®n×]["ÿ{ÖÁpX~áü_+éúñþmÊÙ×òn1]Î[Ú¬ÿ[Çó?!0ý§týÏÖÛ?%]ÿ6¬ÿþÝõ0ûÍÿáúúþ;Îÿµróû`þïyþ
¯Çÿ.ö?Aþ/7þ_ã÷ì4ÓYÿëU´úÚ
+IãVdÿCàû¿n:ëÿàÿµÑ-ÿ
hûϬúÏgþAbüç?¦µ!Èÿù²ø÷]ÿ'4ëÿpÿxþ'+ éE¦@ý®ÿAàü_72ý÷]ÿçrþ7 Rÿ>_9{¥Èô¨ÿÃõÜý£þõèÿÀú?º®ÿ
+_ÿóÌþëF¦ÿ¾ëÿ\ÿÁÜÿÁv ¹yü¨þÏÿÀp~Ñÿ¯þû®ÿ7ëÿ°þ7ÿ§öõ"ÑÆóßÞ²øóü··ÏÓLÿ<ÿí@ÿndúïÙÿÕxÿãùo(>û]^dúçùooÿºé翽èÿÒpý翽èÿÒLÿ<ÿíÀýº¹yüçùo?5îþ/ÈôÏóßÞ
+<ÿM7ýÿõß Èâðqÿú¿t#Ó?ÀÿEýC`þW72ý÷]ÿ«9þóü?W»ýöi{oö
+éàÿbþÇÝÈôð1ÿþ/Ý×ÿ÷Ñÿ þ/ÝÈôð±þ'fusóø?ÿúpè~éÿÒLÿ ÿ×ÿ!Ðÿ¥ú7¹ìèϨðÎþ/_}½ºªºþ/ Ýãÿr |rÉñ·Æ[úÿ â¿¿ß.Êùt·ü\ݯ»÷$iþ_ÇßûëÿâígÿkE ÿóߦ}-ïÓåüõ6Öÿjýç.ãþ
¯þgëm»æOI׿-<ßÿ!Ðÿ£©þ»ÏþEósýB¼ý3ÎÿÕrûû»¨}üwóÿÜYêÉ©|ÍÜ:þ÷ãÿú·¬ÿÁø÷ìÓ]ÿëUôúKÚ¨ôþó|ÿ×Mwý@6ºå³mÿuQÿÁæ¤Æÿx dRéù-a? aü
+ ¥Ïÿm(xþxþ'+ éE¨ÿ¤@éù¿Àú 8ÿ×PÿIÚóù_(¸ÿ§ÕòËr1g/ ¡þ
+ ¥ÿ.³¬ÿ»t#ÔR Aþ¿pÌÿA`ýÝH×ÿR
+ ô±þ&ÿu#ÔR týç¹ÿ Ô¿fnÿÛ µ¯ÿ5üÿõ¿0ÄÛÏý¿zê?© Pûø_ê¿ ÿCÌÿSûzé?ø¿,ý_ñïÙÿåù_Îÿ0ðü7Ýõ?¸ÿËRÿèÿÒPÿýú¿ï6Ô?å¾d ¡þ÷qýÇÝõ?¼ÿþOôéFºþ7¸ÿú@ÿnúïÙÿÕXÿsû¿ pÿnnÿòQÿâí§ÿK/Bý÷ìÿºÌÿûù?<ÿM7"ýÿËÑÿ
@ÿÁý_÷ÿ@ ÿK7Bý_ÿúÀü¯núï¹þWcü/xþ«Ý~û47{
õ?¼ÿõ!pü×PÿÃû¿ÿ@ÿn¤ëû¿¨ôéF¨ÿáý_¬ÿÙ_ÝÜ>þäÿ¢þ!ÄÛOÿ^úÜÿÅüú¿tÓUÿ¯3¢Âü_ÕUç?BèÿóßÛH¿5Þf?Aü÷÷ÛE9î«ûu×áæÿ¾`ýÙñ ôÿâýÛ³¯åÝbº¿ÞFúú_nîÿÀåÝô?[oÛ5Jºþ-óÿ èÿÑTÿÝgÿ¢ù¿ÉéÿPßÿçÿZ¹ýý¿Ý Ô>þ7ü?¹eþá@5·ÿìôïÿëLö]bºë½VIµÂÞÿ³ÂsþÚ×Mwýü?6ºå³`óÌÄþC3ÿ 5þÇóÚHÏÿÛøW? aü{®ÿs9ÿçùo(âù¬ ¤¡þ?ÿù?ÿëF¨ÿëÿ4æ¡0Ô?O«ååbÎ^@)Bý_ÿû p÷nú¾þóXÿG7Òõ¿ÁëÿPÿü×Pÿ=×ÿ¹Ôp<ÿ Ô¿fnÿªÿCÿúþsÿ¯Zúï¹þOÞ<ÿþ1ÿOíëE¤ÿlhÿ)@ÿaü?ÿó?<ÿM7Býïÿ¢þ!pùW7Bý÷ëÿj¼ÿÙPPÿ>û]^úÜÿe¸þã¿núÞÿEÿ'ú¿t#]ÿÜÿEýC ÿK7Býþ÷AàþÝÜ>þäÿ¢þ!Ô÷þ/µõ?øùoÌÿaàùoºé?ñ0¸¨ðdÿWAÿaü÷qÿú¿t#Ôÿðþ/êu#ÔÏõ¿ã?ÏÿÃðqµÛof±ófO ¡þ÷±þ/ÿºêxÿó?èÿÒtýopÿõþ/Ýõ?¼ÿõÿ 0û
«ÛÇÿü_Ô?úþÓÿ¥¡þ÷qýý_ºéªÿÄ_gD
wö¹âxUnèÿBÐ=þ/ç¿'·ÿÿÏúÿ â¿¿ß.Êùt·ü\ݯ»÷D0ÿ÷<ÿÃaúÅù¿VúñþmÊÙ×òn1]Î_o#}ý/·¬ÿ!§ðU#Ðÿl½m×ü)éú¯äÏ÷øu#Õ÷Ù¿hþor®ÿC¨ïÿóÜþþßn jÿþÜæÔ?C嫿Öñ¿ý¯þCãýßpýÉÞÓ¨îú_¯¢Õ_ÒFð®ïÿ1ÿg³xõÚ×Mwýü?6ºå³`óÌdÖEýÌ3ÿ 5þÇóÚäÿYÿ0þ=×ÿ¹ÿÛxþxþ'+ éE¨Öÿy#pþ¯¡þ{®ÿs9ÿ³¡àû?O«ååbÎ^@)Bý³þÏ»t#Ô?ëÿ¼XÿG7Òõ?ÖÿyÐÿ£¡þ{®ÿs©ÿà÷ÿ@0ú×Ìíã?ëÿüÌÔ÷ûÕ"ÔÏõòfýúÿ!Äü?µ¯þE
'Õÿ±6¾Ðÿ@ÿáÎ;Äù_<ÿM7Býçÿªõ£þ!Ðÿ¥¡þûõ¾ÿÆÿ"£þ!|(÷%» ½õ?ÿ«Ö¿ÛÀ¨ ÿu#Ôÿpþ¯Zÿyá¸þþ/ÝH×ÿóôêý_ºê¸óßëÎqÿ7îÿÐÍíãÏþ¯Zÿõ@Ò¯ôiE¨ÿáÎ;è¿`þÏÓHÿPÿ+Ðÿ
@ÿáü_Ïõ¿ÿ@ÿnúÞÿÅý¿ÿÕPÿ=×ÿjø¿úðqµÛof±ófO ¡þ÷±þ'ÿºêxÿó?èÿÒtýoðú_Ìÿ@ ÿK7Býïÿbý_Ìþêæöñ ú_\ÿpH¿Òÿ¥¡þó=×ÿbþý_ºé¢ÿ]%üùôq6ݬÿQ~WþOþîÞFTx÷óC\ÿ¯f Ô?üºé8þ¢D
'Õÿ3
çù¯:ǿެÖwßBrüq9ë?BHÿþ~»(çÓÝòóCÇi@Òûÿaÿgý_ 9
+PJºþ_¬¿röµ¼[Ló6Ò×ÿsk¹þÁQøªI×ÿl½í ùSÒõÏúÏ(èÿÓPÿ ³Ñüßd\ÿpÀó¥Üüþßÿ¯1ÿ÷ôÿa((|ÕÜ8þwP¿¤þKn<óÿÂ{ö é¬ÿõ*îôµÿúÏBÁù?¾ÿ릳þö?QÝò¿Y°yfâÁ
þsgÿEÿãñ¯imòÿ
cþ,þIå¿:ÌÿCcýßòüoñü_V ÓLÿIå¿$ûÿr®ÿaàü_72ý'ÿêÿkÿXÿçÕòËr1g/ þÊIü?EÎõÜý§þÊIêÿõ¿t#\ÿK)ÿ%ñÿÄÀÔ? fÿu#ÓRù/Áølàþ&°ÐÌÍã{ù/Ñùþ pÿ¯VdúO*ÿÕaüÏ翲þÿ§öõ"Ñðú¿Èâß·ÿ«qþç xþ£ndúÞÿSÿèÿÒLÿ=û¿ïqúGð¡Üìô"Ó?ÀÿÅõÿu#Ó?ÀÿEÿ'ú¿t#\ÿÞÿÅýèÿÒLÿ}û¿ë6Ðÿ û?tsóø?ÿúp ý_Zé¿oÿ×eþßæÿ0ðüGÝHôoþ/Ö ?ÀÿÅý?èÿÒLÿ ÿõù_ÝÈôßwý¯æøÏóÿ0|\íöÛ§Yì½Ù(D¦ÿù_ÿu#Ó?ÀÿÅüú¿t#\ÿÞÿEÿ'ú¿t#Ó?ÀÿÅúýÕÍÍãÿPþ/êÂ! ôiE¦ÿëÿèÿÒMþWë¹ðÔÏÞÙÿ嫯Pïÿ¦ÿkx:Å?þ¿TÓß éñ/Øÿ3þÃÿj`EmÔñ/ø;\î«ÿÏÿváý]Ï?ì5ÿøwXì½BÒü/êßóý}ï8ÿSLþ«¾²KzЦ7ô;æ!Ä Nïû3Ù$3.LÞÕõ¸ÜíFÙá÷_ÖÛÅònUýq¹Ú/¶ò×Eýo¼OÞ=¬£8>"#c;6¿[ïïÛã_]0*þìg~@ÒÆ'jC4ÿ+8ÿCÿÇÅãrõeÞFKÿo¬iÎÿÏÿðî¯u=úËâñïë}ùðûQÍØÇ!¾þñä?mã×GckÃÄÙó>íóçF&Pþ0Û/}ùx
/ƧM|\çTEÈN.ø°Üî¿|@Íéÿw»Ü/>³¯¿ÿÎZ>,þ³¼[ì/°¹5§ßä_ÊÍæä8þ$§?Åj½:ûѨþäøÅ¿N®0Ùé÷ð×?ýmúiU=vÕ5/^ðÇõÓj¶¸ø9¯þÜ\ý¿=Ïÿ½7gÑüÛÿYÌÊåã?¿J§?Åß>¶K^îT8û1ÿãéîp'§'ÏMÖüêÉCså«{Ún^¾ú¯ÖFúÿyõò_Vfrïÿ.
»ìÿ=ëÿa°YÕ;ìåÿQJHÿw0{\¡Uÿ§þþ
+×ÿ0#0£àuÒIÿëUÜæ!n#}ý?39ßÿ dïé ×Lçñ?õзDùÿÀü?øcó¿Ìÿ@ÈÞs°fô?`þ·ñþsýÃKþ7äULIKÿúÓô¯
+ÛÂfÍÃĸ1;ýCó¬ÿáÉ®äÿBý3ß]æÿÂxÂ_pÿ3~b2wzÁeþÏûà&§\æÿ¬·ãI8¹ %ÿµåÿ²Fþ/«îé´fþ/Ïìøô§häÿ|õ\ÐÌÿsö -ù¿¬-ÿµåÿ²Fþ/¸±=»à"ÿÇÖ]ÐÈÿåùøô×òÙ«ù¿ù¿´÷?#jCäÿñôÿ H?6ÿËú_®%ÿÕCZÿ/S¤¨ÿwìÿ¤Åÿçú/ç¾N:ë¿Àæÿbý'æÿ'!þæÿBcýõ¿0ÿÞäìüÕ ÿáòþJþç¿AxÉÿù¼
+Î8)û7q§Ù¿*ÂkNs¹Íi.ûÁIÿ´!xÿ/,÷BH?vÿ'û\Ѷÿ³hîÿôbìÏ/8ßÿébNñäÆþÏÉO6Íý#;ÎíÉ-ùߢ-ÿ[4÷Üäì{¸¶ÿÓ^peÿ§?û&¯ìÿOïdKþ·hËÿmùßâÊþOÓ¢¹ÿsä'g4ò¿&·§M¼ÿ-^ÍÿÌÿþ8$ôÿÐü_aØÿ#¸üjQió\þû¿1ÄÛ?«þ£àuøþ/JÉHÞÿ£ÿïÿÃÓ)þõn·¬Þm´çûóùÜÿ«Nú¿/wñ¬iý»ë¨Ýtÿy°ÿÇÒÿ !þÐýÿû!ßOØÿ+&Aÿú\ÓÿCÿÿ.³ÏÌYõw¬õÙÈy®,þÐ$èëÿàú?CJÞ·ù?|Óÿá|°û?r79Ù1î¯ø?òÂ^Ьÿmó³&Zü¾ÍÿáþøªqzÁ5ÿÇøô{¸âÿÈÏnÔµúß'|ÿ÷ù?|ÿÃ_ñ¸¼8ý®ÔÿØ\ü5ÿG8»à5ÿÕÿáéÿøqHèÿ±û¿¹þáÜöÁýßÚH[ÿú?¸þáØÿRðJIÓÿXÔÀÿ<÷@HÿDÔ$þ9ý?:Ç?çÿóâÝÿÏõ?&{oX\/ ú0ÿW4òõÿ ¼äÿ¬wc7,Î
+ÇÏp!wç9ÀýcóôC8¤dò¶ü_~eÿwp'³¼ÿóÖúÓOhæÿ?» ¹ÿÛÙñi-ù¿¼-ÿ_Ùÿì째ÿùÓ¢ÿùÓO¸¶ÿûìZòy[þ/oËÿå×ò§Ù»üjþ/;ý&¯äÿjîù«ù¿üÕü_ÎüßCBÿÍÿñüßÌÿ©"mýÿcýõý1ÿ§4ýÑ üOa-ó?ã/êEñ7?Îñ·àü_ÆüøWúED ÿàÙÿCH?ðügú!ø÷¬þ®ýcë¿óýÂKþ·EùN.õÕg~¹®ð lþúpHÉÙ¶ü¯½²ÿs\Åôüý §4ó¿g¹W{%ÿN+Û¶ü¯mËÿÚ+û?³ü¬kùßpzùߪ;mâJþ7smÛò¿¶-ÿkÛò¿¶-ÿk¯åÃøôǼÿøÓ^ËÿÚWó¿ùß´÷?Ññ²÷®ÿAH?6ÿOÿÆÎ_æÿUÖÿÏÿåúç×IgýpþÏ3ÿ !þØýÿA0ö½ááïzIÐÿpùçÿþ«øgþÇe
&©¨³ÐxRÅù4TØÉÄMlìb~LôÍÿ°þ/Ã|hËÿ+ûÿªÞ"_p±ÿ/?Ý1®ä¼;ɽ+ùÂ]Ðÿ mùp%ÿc²³oòêþ¿ÓO¸vþ«9ýkûÿ&§´äB[þ'´åµó_sw¬+ùÌûÚù¯gÏÃkùðjþ'0ÿóãöþg¬¤
+Aþ§°ù ñÇÿËú®þËüû'iCÔÿçìÿ¤Å¸ÿõ _útµÒYÿÿ3Ìÿ!HÕÿQñ?x¾ÿAH?pÿëÿ@<ÿW5 ú0ÿÛÐ?ó¿ Nê¿æÎÄ×Óò¿ùÙ ÖV#xìi
+¸úË¢È&aÌ~æ$AÿØü/ßÿ!Rr®-ÿë®ìÿËÆ'CÝýÅùÍüïøtK»rþ£1'§º¶ü¯kËÿº+ù__d±Ýµü¯ÉO/hæsçN/¸¶ÿÏ~-ù_×ÿumù_wmÿ=û)®ä]~z«¯íÿ;ækù_÷jþ×1ÿûãÐÿc÷ÑÿáÚáÌÿé!mý¸ÿë?QðJIÓ!jC´þÏü?Nñ¿/wÓÕzûX>Lëí·´6Ò×ÿ+ØÿCȸþ¯þ«wþÝNë¿FÇü°Á9ûãMÁó?!|'þóÇeÏ þ
çþo¯Ä9ïéH¿¯þ*þ¹ó¬ÿ
+áõø^ÛùtU>¦/úÐ>ÿ+.â_8Ïõ?óã±q
+¨.úÿµzòëïK£VýW?Ó¿Íáþµþß7OûÅvôïëí}&ºè¿úÅ~º/ïm´ÿæRÿ®`ýgT»nºÿ«ùz+o#yü7Ea9þCøûÿûÃ_«aã?!B!B!B!BÈOÊÿH§â È
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16amd64-8n2c.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,89 +1,89 @@
-System(0KB HP=0*0kB TYAN Computer Corp S4881 )
- NUMANode#0(8190MB)
- Socket#0
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#0
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#1
- NUMANode#1(8192MB)
- Socket#1
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#2
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#3
- NUMANode#2(8192MB)
- Socket#2
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#4
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#5
- NUMANode#3(8192MB)
- Socket#3
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#6
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#7
- NUMANode#4(8192MB)
- Socket#4
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#8
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#9
- NUMANode#5(8192MB)
- Socket#5
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#10
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#11
- NUMANode#6(8192MB)
- Socket#6
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#12
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#13
- NUMANode#7(8192MB)
- Socket#7
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#14
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#15
-depth 0: 1 System (type #0)
+Machine (phys=0 total=67106960KB TYAN Computer Corp S4881 )
+ NUMANode #0 (phys=0 local=8386704KB total=8386704KB)
+ Socket #0 (phys=0)
+ L2Cache #0 (1024KB)
+ L1Cache #0 (64KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ L2Cache #1 (1024KB)
+ L1Cache #1 (64KB)
+ Core #1 (phys=1)
+ PU #1 (phys=1)
+ NUMANode #1 (phys=1 local=8388608KB total=8388608KB)
+ Socket #1 (phys=1)
+ L2Cache #2 (1024KB)
+ L1Cache #2 (64KB)
+ Core #2 (phys=0)
+ PU #2 (phys=2)
+ L2Cache #3 (1024KB)
+ L1Cache #3 (64KB)
+ Core #3 (phys=1)
+ PU #3 (phys=3)
+ NUMANode #2 (phys=2 local=8388608KB total=8388608KB)
+ Socket #2 (phys=2)
+ L2Cache #4 (1024KB)
+ L1Cache #4 (64KB)
+ Core #4 (phys=0)
+ PU #4 (phys=4)
+ L2Cache #5 (1024KB)
+ L1Cache #5 (64KB)
+ Core #5 (phys=1)
+ PU #5 (phys=5)
+ NUMANode #3 (phys=3 local=8388608KB total=8388608KB)
+ Socket #3 (phys=3)
+ L2Cache #6 (1024KB)
+ L1Cache #6 (64KB)
+ Core #6 (phys=0)
+ PU #6 (phys=6)
+ L2Cache #7 (1024KB)
+ L1Cache #7 (64KB)
+ Core #7 (phys=1)
+ PU #7 (phys=7)
+ NUMANode #4 (phys=4 local=8388608KB total=8388608KB)
+ Socket #4 (phys=4)
+ L2Cache #8 (1024KB)
+ L1Cache #8 (64KB)
+ Core #8 (phys=0)
+ PU #8 (phys=8)
+ L2Cache #9 (1024KB)
+ L1Cache #9 (64KB)
+ Core #9 (phys=1)
+ PU #9 (phys=9)
+ NUMANode #5 (phys=5 local=8388608KB total=8388608KB)
+ Socket #5 (phys=5)
+ L2Cache #10 (1024KB)
+ L1Cache #10 (64KB)
+ Core #10 (phys=0)
+ PU #10 (phys=10)
+ L2Cache #11 (1024KB)
+ L1Cache #11 (64KB)
+ Core #11 (phys=1)
+ PU #11 (phys=11)
+ NUMANode #6 (phys=6 local=8388608KB total=8388608KB)
+ Socket #6 (phys=6)
+ L2Cache #12 (1024KB)
+ L1Cache #12 (64KB)
+ Core #12 (phys=0)
+ PU #12 (phys=12)
+ L2Cache #13 (1024KB)
+ L1Cache #13 (64KB)
+ Core #13 (phys=1)
+ PU #13 (phys=13)
+ NUMANode #7 (phys=7 local=8388608KB total=8388608KB)
+ Socket #7 (phys=7)
+ L2Cache #14 (1024KB)
+ L1Cache #14 (64KB)
+ Core #14 (phys=0)
+ PU #14 (phys=14)
+ L2Cache #15 (1024KB)
+ L1Cache #15 (64KB)
+ Core #15 (phys=1)
+ PU #15 (phys=15)
+depth 0: 1 Machine (type #1)
depth 1: 8 NUMANodes (type #2)
depth 2: 8 Sockets (type #3)
depth 3: 16 Caches (type #4)
depth 4: 16 Caches (type #4)
depth 5: 16 Cores (type #5)
- depth 6: 16 Procs (type #6)
+ depth 6: 16 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-2m4c2t.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-2m4c2t.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-2m4c2t.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,14 +1,10 @@
- Éù$J í]ÛrÛÈõëò+ú1©J¹aðSÖNíz+ëÔe',$q+ %}z ¢,¢ÖEçO§çÞ#ºÕ6-¬éþ®
-YÎM¢º¼xt,.ü»tØ|_É)ÒIc¹\*åì
-*·eÑvqCô¢«]õîÓ§"oÙ¿nªäqIð û«4Û_+Àþ;ìÏÒ=ÚÞÀÖ;쯱¶·¿¯&4óDiô6òÛ?©Dþ»Ç/¡ÀD!ig¡$k%iKJZGÄ«KËU)MJY2NXéIg5qµ®ÆUâjÜ3ÿÎõïM2©P®ëñx6 £BgÀ EL
-ÃuÕÜI?°Sa@~¬«ZJOG}5ÇMî»YWâY ¡õoÃì¼
-y£ÏÀWá1ýÜ
-iV¨Ðc¢u]?ïTô°ÞÈ#òëXW3{í
-öÛ=îcßÝãQ÷Ù½pÝöÙ=-öß=¿Îûv/+»¹éÂHHù:ady¢~@IÑrèõn ÐBèÕµµ
- ðg¡¬°Û¢¤\èÃGg±ÎH#(ò3BðÒdhÂ]CLî²ãθ
ôdÖeEÊ-2VO|Ì[Ú¶iKR%úÏí´YeV\~åUò)swϵõxrGü_YÍÓö±¢@ÿ9Äÿi+ÿyÙiÿª¿ûÚ¿ÿôõd ÄÿDö°ÿ7Çßÿ+Û´?×VYøßCÈÃãÁV ±áû`Ý#þ«H¬<þ|Ñîø/!S«ø¯À)ÿÕ:mÿuyª.Î_Q/ÒÇÞ9E^OXóK¦KQV©Ðk^/NOÓ¦]kHY¯y'çéüZa
}ÏqýµyÍ.»¸Æd¶×üVÆ7tF2P«Þ6¦-E Y³1m¯¶×ü+kº«Á½võÿ¬KgqòiS;̬Ê?â³t½V#îÛ¼ëúÆZdà};ÉãÙa´ãõ÷iÇYÏòa~JiÕsò±lÝjÞÆñ£ð
-®§`ÝùÏ/'Ó%³wÕÛzÖ¯«E¤7:hÖ+ýPÔ7Û¼©"ë~ÏøåU?¾:4×.O>éÛDBË~nÿ-â¥!´ÑAät¨ù»V~l»¤l&ZjÞ/ÊOËfÆF6Ô^ùvqö;>ݰ¯Ø(Þ0îfñûöb¾¥ødÑÔ7k_}Yv¡Yq#M:¶©YqÀ-W¿Ö¨wý¾dÔÛù¹¿¹#{ÿI½xÊó_jì¿>ÿMÿë
óÿ²¼n¨^2´WÍ4óÇ_Ó
-þVviî#\é4.²ü5vR03ò|åïTÆEzÝúVyÿWzóÇÇSèäMÎoêe¤}ûeÒvi]ó%ïªäÝÛ/¾_ÉJ/¹ê$ñ4Èe¹4ôß½¿ÔçWmÄ9õ6åÜIë«LªI½?ô¹ä¼ÊLâ:K´¬ÌºûXöe§õÂk¯ÒÖÿ:M/´î²ª\ù¯ÂòôÏõåäs½®Ç<>àvtÁgóê6¥®M¨hªã$¥ä2ìG¤6©èÖyMLIQ]pµÎ7ãÃ?ÉOóE{Nó®¥8©3*K:½ä®ø2Ïÿ(~¡óºê\µ¼#lKj¸MRS^ðÒý_²úiÄMr>Óæ´¨JªÓYK3î»IëéYUÍ©.y7¥jhÞN:çu\RÚ
ú!ü`<->ý]ÍUxÊ\d¦rxSTWuRvÇç§S;ÇYuVYíw?}ºÉj]KZ3xçÙYY¤e7Æó9[í«õÆ4Ëxº+ÓÿøèîK.øû"Î'uõ9m¨K>â}?¯&ìÆÆny7»Ã-ìÁî'ewðÒ=#»íØØîd··ÙÍe`÷xÙíÆÆn}7»Õv+°{ÄìÇÆî×ÝnË»ÝÑó±;»w\wG[ØÝã=»µ»w\wË-W&ì1»åØØ½ãº[oa·»ÇÅîÃßa?n¹×ÿ£ÿGùÿé ²ýÿGöù|þ'øÿ^ðüÏ>ÿù #Îÿ£ÿGº>ÿÁóß"Èÿü?Èÿü?;Îÿ§Ïÿ¸ëó_Ûþü÷ÏÿÅùÿô²ùß>rt9$ÿç¨þÛçYóÿÈÑå@þ£b÷³þ§¦] äÿ»×ì] äÿ»×RFCùÝÏÿgt9$ÿçØØýg·»ÿì^³[ÝÈÿóC³ûð7Ø\îðÿ|³ÏSîóÿûd?+ÿOà¼ÿÇXÿÏAä+ÿ¿ZÆlóÿ2ûÿßzð~íá}ÿ_É@ªþÿP[-Ìÿ?SÇÈnñÿ{<é[üÿËY?Àÿú`þ-ûvËÿï^ÐVÿ¿1Öl÷ÿkãÜöÿzzÿ¿f¸!nâÿ_Âjuxg½½áWc£Ø¯üø½·^ñ±³ôã?÷÷ìXåóÿ}þrOþ/ëÌpþKéøà×ýùoðü·üÿðÿÃÿÿ}²þÿ£b7üÿðÿÝðÿÃÿvÃÿÿÿQ±þøÿÇËnøÿáÿ»áÿÿì~ »ñ¼{°{´÷»ñ¼{°{Äg÷è|¸ß
-vãy÷¸ßý°{t¾JÜï>6vãy÷¸ß=^vãy÷¸ß
-vãy÷¸ß
-vãy÷@ @ @ @ È*ÿð
+ ³Ó9K í]]oÛÈÍëêWÌc´é|é§nRìfѦXÄÉî£@QcørìüúÞ!%Ù²eÙîÚ´>çÀ5ßÃ{8$ÈËKa}nuûwëT¶ÿxóàgLøÎðî·Ðºû^ãRá¶/¤î
+3O2kX5mR3öf¶(ˬ8PÎ×Íb×þU]¦.Ø_[©ÈþJ;û}öO«UVÖG0°íí½ÇþÒ:}ÝþôòñGÁ¼rûû¦)ë°3_ÌËzÍéçϾ ø_Ö/'¤ väÙòrì$/ç~ùý+×ÿ³"Éýe%ÖÕú˧¿²÷¿~aø'&§/ù6V?ø>iZ_UY±Mu|üð=´+LlßRÑI¤§5Ù÷Ðz$bÉþýnR^4Y,Y7P1i²ÙnÑ"´¬}È ¼k2$,=Iª,ísh®Yµµ±NìÒNªUȽðMøwêÏS_µYY¬ÓÂ1gKF§òbòÚ_&Ô?ý zì,÷lîYÕxÖ6)ËUgyêYzu=²ÆW,okÊY¥yyFÅÚPMY.O«æÍÛ%i±<?g'çÔTCÍÒ¤vÚ²6gÕR.Ú"dsVS´b˦^¾vÔéé´òõI^¬ò³Í¨íÚWÓEYÎYUP%m²fófVKÇ9óMè"tFâáËÎÛÐ)IOEÿ%YUViѲerz2¥¾³y22Ϫ°õMdíÛÈM6óZÔêÞÄÓd-ÜmÌçdµ¦+Ö³YFÃÝþoLG}ÊYV·«d9©Êo¾fyR$Ú9LvÔíÆ¦nq»º£=ê î'U·yëQÝÑØÔ-oU·ä7ÕMiP÷xÕMÝêvuË=êP÷xÕMk×ÈÔ}à¼Ûí93qP÷S«;~>u±©ûÀyw¼GÝ1Ô=âµ[MÝλÅ3uXÝjlê>pÞö¨[AÝ#V·ºq½ûE©ûY¯wK36uãz÷R÷ó®Ý£»WëÝP÷VÝ£»WëÝP÷VÝ£»WëÝ/MÝÏx½{t÷*q½û¥©ûùÖn5º{¸Þ
+uoÕ=º{¸ÞýºÕ}ÿ÷>ÿÿÜçúÿs¡LïÿOÿãlçÿoüÿÀG.ÛdyÔ¯N+i´f_ßM(ç§Úû£Í©
+9ïV''´1¶9ÌFV%Êyt<¿Ì¹]Wçø[R]Ïe<äü¶ÙÙe7t5Bv9¿ÉN^¤
¬âzÓÚat´·ý\vȪËùí$W:'¬Gý{µ~¤_¯æöc+ÊâWÚ¶sv]IUíÌEõv;^&³n¡ u9|ºL²<-ûñimu×Ïñ¢îóÖ5ú~BïC
Ë!ÄýÖùïOÇÓ/amÛ´¶õ»rU¤~wª}Îv¦ój·Îû2ϳö?}u³ÜÙè2§õóéÇ]q«ºÁ}X-|·y¦WÁ¯$_±ÄÕäOÍÙ|Oòñª®v«L«_¨y¼1¤O[2@´1¥ë6KYuVyîýì¥bßú_ÐéLóO>èù?Eå¶Bàù¿!p»ýç|Ü×þá4!øéøo9ì?î²ÿc<zøüO(eÜöüÏ©pþç¤Àùß Àóðyþ0xþê×µ<ÿ W¢îÑÝS
?Ôç?áó
+üaFwOþ0/MÝxþþ0P7ÿ?Ô}PÝÃ_`á¸ëþÏcøÝåÿ£¼¼ÿ#\¸ÿ#( ÷À5ÿÁ
kkþ?ZZ)£½þ?JÞ5ãº6<¢ùÿîÝëÿ£E$Üãÿ#¸RG{üBßú\÷ÿYúþ?»Þèÿ0®ßn7üs½ßÔ
+ÿ)Üïÿ#îû¹éÿ£µ}zÿp~í9sÃÿ'æJtcû-§£K®
+¡´2±S²îJæf½¤Lo¢uÎûÓUñu]MÛØFjx"Éõ5¿¡ÜzöÛÙy ®¤è½Æ{Ï}ܵþ¾Ú?ÚÇáõ_
+ç®ûXÃ-Öÿ!ÎYð½¢£ÑqDme³VP-DRÐNÍûËz´ïéèÔ/Ë´ãȳQ
+¹-FE¸¤bÔ2ýOå\hMj:(0m9êÏ:ºDL(¤¥\R¢LhÁèø±)3G¿95ÒuìddX¦bÖñM)ZQi/e㮣*ZuÍlp¡E)|õ£#Ò,ÄN)A(B}H)º±iiS!£Ð·eC´¥LL§êçk&¢
ytŲ¢Ãá ¹àq(Å:,^w½Ââ\m~ȽE@AAAAAAAÁÿÒr»=I÷ã¬Î!Ö7¡9Ãçô!e"ÒÑ¡.&i{ÞRcTC5µY<ڪ׾oZòîw3WE&Ö¿gË2ýêçÔÜÆÿç°ÿzø?¦ÿcÿgÜeÿAâÿØËø.¤'¹ÿßÀû°ÿçuÄÿÁû° îQ=Ë÷a!þÏkQ÷èb·!þÔ÷a!þÏ+ÿ3ºØmÿóÒÔ÷a!þÔ÷a!þÔýÇÞõÚp×ýÁãÿHÞÅÿ±÷ âÿ þâÿ þÏmëÿðñtÿG þÛ xxü©ïÿGûÅÿ¡6îÿz½Oüè>ñâûÄÿQüþñÂ<ÿAAAAAAAAðOÊqÅÿy¯«¸ÃÿÆo/ý¿Tÿ£ÓðÿxÿÛï÷¼ç@AAAAAAAGÈ?¯÷ Àóáñ
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-2m4c2t.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-2m4c2t.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-2m4c2t.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,35 +1,35 @@
-System(1984MB HP=0*0kB )
- Machine(992MB HP=0*2048kB )
- Socket#1
- Core#0
- P#16
- P#20
- Core#1
- P#17
- P#21
- Core#2
- P#18
- P#22
- Core#3
- P#19
- P#23
- Machine(992MB HP=0*2048kB )
- Socket#1
- Core#0
- P#24
- P#28
- Core#1
- P#25
- P#29
- Core#2
- P#26
- P#30
- Core#3
- P#27
- P#31
+System (phys=0 total=2032544KB) "Kerrighed"
+ Machine #0 (phys=2 local=1016272KB total=1016272KB)
+ Socket #0 (phys=1)
+ Core #0 (phys=0)
+ PU #0 (phys=16)
+ PU #1 (phys=20)
+ Core #1 (phys=1)
+ PU #2 (phys=17)
+ PU #3 (phys=21)
+ Core #2 (phys=2)
+ PU #4 (phys=18)
+ PU #5 (phys=22)
+ Core #3 (phys=3)
+ PU #6 (phys=19)
+ PU #7 (phys=23)
+ Machine #1 (phys=3 local=1016272KB total=1016272KB)
+ Socket #1 (phys=1)
+ Core #4 (phys=0)
+ PU #8 (phys=24)
+ PU #9 (phys=28)
+ Core #5 (phys=1)
+ PU #10 (phys=25)
+ PU #11 (phys=29)
+ Core #6 (phys=2)
+ PU #12 (phys=26)
+ PU #13 (phys=30)
+ Core #7 (phys=3)
+ PU #14 (phys=27)
+ PU #15 (phys=31)
depth 0: 1 System (type #0)
depth 1: 2 Machines (type #1)
depth 2: 2 Sockets (type #3)
depth 3: 8 Cores (type #5)
- depth 4: 16 Procs (type #6)
+ depth 4: 16 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,69 +1,53 @@
- {J í[sIr
çÕüý¸°Çu/`ß¼V¬íp¬ÃáÝ ûÑ[$BÄ%¦FÚ_ï*ä ¨¾dWré<fw4b
-"ûtUgÌÒ¡Y×þ£»1ÓþãæÓ§ûåºÙÿÓO¢Ñûüo½:ü·vîðïG~ÒÚ(ãrZÿ¾hÓ¿*?åx}[ïªê§·Ûô«ÿà¸f·çxC¼èWâ¿ÝmS]ý⯳^+Rü½
-ñçàñ_lëOê9rÃ1Þß¿±&ñ!Ä*5Å/Ø
ðøç87ûýf÷w¿¯ÔÕf}³Ù]/oÒýk³NÑoþ}Ý6÷WéJ¨>Õ«åý·ôí¯VæþïÒÃñÕº^5é?/9|ÿïþûï«ÿm6ëßýåO_ýËýRú×ûëÕ¾m¶Ûåú6}ëìp?ýÛ_ó5~nvóôwõ⮩öË¿æîÔ<Tÿñ«íÝ·ýrQßW7ª®öË)t·û|ÈÕb³kò_É?2ÿEþ¹ú´}ÈýÙç?^7_Ͷ]nÖ/÷ê¾ù~µüýº}>ú¾N?=ýGú¶ê˪©nj»oªv¿¨Vû]µjµhªÅ×YUojßl«U»K_¹Í_©«Åjó%Öæo³¡ZܺØßU7í¾ªÛeµZ}>}M?j~lúIÿWݵU»ªößöéwMñ×ê~~uºb×íu>÷v¾s³^¶]u³¿^lïÓ»ûZ-Ò¯±øªCõµÝîªûúîÓõýêêãæv³ZnóGáõÜüìýÕÓÛxü|;~Þ×õýòv½jÖm¶]Õ77é3Ü;|ʪú¸Loý)ÿP¹Ùño¾,wíC}µÝüÚìªU½®oü~uuz©é÷y©i\jÃ/µYüÙ¨·»ÔÌû¼Ô.µqZ|»K;ÏKÍâRu©iûv{Úës5Kí2ow©ù÷y©½>WÃ¥öÃT¿Ý¥Þç¥öú\
-ÚÐùÛ]jñ}^j¯ÏÕp©ýÎÕfïóRC^íý%;æïóRC^m䥿Þ0
ûNX9¾åµöN×Yy½aºC¿Ó¤ÖF^koïÐïtÅ ¹µ÷[ÓïtÉ Éµ÷µð×Ú;]3 at ví}<ðûäþ¿òCÿgº:Ú Îñcÿ§6AÅþOüä»Úáé©LA¬ôÜÙèBV«ÇY~VY¼ª¬qÞ8Sù`fîø«*=Íé[´JWq>·Ñ¸¹«LpÆ?j6?~®tT6I=ýg1}ÓLhÕ,ÌëJå³LߦB¾
-º
-qfãáHå2iþlò¡ZµéPí®ì¼
-6ÌjÒ;qó|¤z<Ò¥oJo{^Ym}åÓ; ùØv~lþíªy<ë«Ù<ýb§ÜLu84}6>¤÷~xúxhþ!:ý¢V§OËü)åC½MHegù÷?~ 1}J6ÛÌÒ߸àìñ
-ø\?üSÍñÐY5÷j~ÉÞ²Þ|lÀIXzùC01Iìx|úysÒw¥¯ÍæÇw;Oo{[
-lú>
=
-Æ>®Ùlâ?AUÅÇO }ݧ4½¥ÎÑÃ6æOÅåßjötd~z|5émx>Ã¥]:}º¸ò¯µUÔ:æ(¦íâñ#p.+Å?éײöñh÷tH_Ñót`z#ðÎ]ô.]bF=ýl_Åt-èñPÍÓßiïò{ÞÊoz¹nwùt 7;A¥ä5}@ÿ{zå#}Bvæò;¼4\þÈ1ñäøi^ÚÍçA¥¸}oI?ËùüÏÔï/¼ðÂ/¼ðÂ/¼ðÂ/¼ðÂëÿÑëjÑ~m«h¢©¹óæêc»\59-emP>ÎÂ}ÚÊëÃßì¯wëõr}[=ý÷ÇûÍâss~äå_Ëÿï¿Mצ_ÿ¬1ZûhoÑÿÅÿ¦ù²\LÐhxüñç OüÓÛf5þ2èßÿÇãO*gîâÏÁø/¶ã®¾ý¿.DãUDü9ÿ¼Æ9ø"èyÿ7Îu¿ö> þ»Ùnî7·ßú^û¿ôGôÿcÿön×Ô7×O¹×ÎñcÿOngïÿ1¦ù Þhø8x
-Á?ÿåÞðQ¼$ý?y6¯·õâs}Û\/o¾wNý+óâþBÿGô.þ³þÍ2\ÿ.ý3 ¡ÑÐõß5û8ÿ>ÏÿÓ@ÿÏÿæÿÂ¥ÿ»f·J³þôø¿iÛû¦+4<ÿãµEþ
Iâ¿Ø<¬P(6|þîÿÈÿ°û½lÆèÿPØ;`høúOº ÿÏÂøø/×7ÍWÓç2>þ;
ýx Ç?×ñw£{üù4%ÀøÏ@îñ
¬ÿç5 ü}×Ûz×.sÓsÿÛt8ò¿, ÿ+²þÛo[òø¯/æù_~Y/?-ÜBÖÿ¡ÇÙÏ1<ÿçµÐ?Ê
-YÿÍ]³kÖoÇ梁õo_ú¿¢óÐ?Áá ²þ¿í¯7®ëý~³XÖíò˲ýv~Áú·Ê:ø?YÐú=ÿWïëô
ëU½ýî9:õÿÿ˧Û@^ÿ
-ù?B ÿLÈú_?¬>6»<Ø7í÷Ò=þûþèàÿa!¯ÿAòr!ê_ò þrü'ñ¸ñ1àþÏûC4dýòXèø?dCÖÿþç?ôϺqYÿ¥üÈÿ°ñ_6dýòÀÿÅü²!ëÿÇÅó¿uð³0üECÏÿOìÿP.¯ÿ"ÿÏĹÿý?¥AÖÿ$þóÿ-üß,X4
-QÿºXÿÿäøêÿü/¹í r!ë¿ÿõ?,`ú'²þKõÿÀúèÿ!²þKù?Ðÿÿ²!ë¿ÿë¿,Àÿ!²þKù?°þÃü²¡çÿ§öÄcÿÌÿYÿC6dýêÿþ?,äõ?H^.Ãõoìüs¤¿ÿCÇøWF{ïàÿà`Lü÷ÿìyþñºÿ[g°ÿ¤ø·w»¦¾éܶßüÿlü÷èÿÏÃùü¦IÿÏÞm½ø\ß¾¶üðõ¿h¡Ðÿ_6$ýöÿ¾æO®þÿL ß'ºþ»fÿ£æÿ:@ÿ,Íÿg ÜD1JÿwÍnfýéñÓ¶÷[Ïÿx÷ÿBþ§<ıyX·¯cøü/hÔÿóùlÆèÿ¸þÛÿýîÿé©ÏuúºÉ@Üÿ9ÿÇý?zcøøïrI0âÏ 9þeê¿CDý'yÿÔË
¬ÿRõßÈÿ°þ¿²!ë¿Tý7ú¿°úoÙõ_ªþþoàÿ
-Yÿ¥ê¿QÿÅê¿eCÖÿ$õßýÿßÝECÏÿOUÿ}¶þ"ò,<
þ/õ_¨þûÿò×ÿ y¹õ¯ù?PÿÍ9þø?Ü¥ÿýYÐp¬ÿRþèø?dCÖÿþç?ôÿçâCÝÖ¸È
¬ÿBþüÿeCÖ)ÿü_,Àÿ!²þKõÿÿ¬÷Êÿ/äÿÀó?gþôÿYÿø?^ÎÿüáÿfÁb@Ñõ¯ù?<üã_ªÿò¿,ä¶KpÈ
¬ÿRþÔÿ°élÈú/Õÿë?, ÿlÈú/åÿ@ÿ?0þˬÿRþ¬ÿ² ÿlÈú/åÿÀúXï
-=ÿ_ÈÿüðȬÿRý?Ðÿ
¼þÉËe¸þ{Y>ÎèçÿPÖµÉú×ÞcÿÆÄÿyÿÏçèÿÓûzüCÿHñoïvM}Ó¹lßùÞø1ÿ^aügá|þoÖdAÒÿ³÷g[/>×·¯íß7ÿ
wпö9ÿo¡Pÿ-þû¿_ó§Îÿê¿XÀþ¿²¡ë¿kößwþoK²éÁï°ÿ7ÖÿXÀü_6£ô×ìViÖÿ7m{ß¹øðü×V#ÿÃÁ$ñ_lÖíëç>ÿK÷¬ÿ²ùlÆèÿ¸þÛÿ=×sÁE¾nÒ
- ùÆÇÿqÿç>þ£ÿ?äøªÿFþ
¼ÿê¿åBÖ?úÿ¿k°þ#²þËÔúOPÿ-²þÑÿÿ]c¡|ÑõþÿïÔˬÿIê¿-ê¿ßÝECÏÿOUÿ}ðye
-úÿ3òø¿dBÖ©úoøXÈë¼\úWÅüþÈñÄÿá.×Ðÿ
-÷hÈú/åÿþYÿC6dýOáÿ¸xþsQAÿ,|¨Û· ¹õ_ÊÿüÿeCÖ!ÿ
ÿø?dCÖ¡þÿþoÐï[6ôüÿtýÿsÿ?eýÑÿúOàÿ
-Yÿø?^ÎÿC´ð³`!xÑõßk3Qþÿäøêÿü/¹í r!ë¿ÿõ?,`ú'²þKõÿÀúèÿ!²þKù?ÿeã¿lÈú/åÿÀú/ðȬÿBþôÿáþÙÐóÿû?:ú?ÿcþÙõ_ªÿúÿ°×ÿ y¹×¿°óÏ~þÓý´÷Øÿ
1ñÞÿ³ç9úÅÿôþo?¤ø·w»¦¾éܶïüÿdü÷Øÿ³ù¿N/LDAÒÿ³÷g[/>×·¯í?|ý/Zèè]6$ýöÿ¾æO®ü?, ÿlèúïýÿë ý³p>ÿOà~ Qú¿kv«4ëOÿ¶½ïÜ
-|xþÇküıyX·¯cøü/hìÿÈÿd3FÿÇõßþç¾þo ¸ÿs0>þûô8Çðñߥo@ü9 Ç¿LýwTð²÷Aý·\Èú/UÿüÈ÷Ȭÿ2õßQÁÿÍê¿eCÖ¡úoìÿÃ
òECÖ¡úoúPÿ-²þ'©ÿ¶õßð² ±û³hèùÿë¿Í±þÏÿ<<
þ/õ_ªþþòú$/¢þU1ÿÿrü'ñ8ôÿ#4Ü¢!ë¿ÿúgÏ{²!ë
-ÿÇÅó
-úgáCÝÖ¸È
¬ÿRýÿÿaã¿lÈú/åÿÿø?dCÖ©þÿXÿeýÿeCÏÿOíÿ@ÿNÎýèÿ)
-²þ'ñ¼ÿ£ÿ?~¨]Ìÿàÿàÿ2ý?úñÛ.Á"²þKù?Pÿæ²!ë¿Tÿ¬ÿ°þ²!ë¿Tÿôÿcã¿lÈú/åÿÀúðȬÿRþ¬ÿ° ÿlèùÿ©ýöèÿ@ÿ_àÿ
-Yÿ¥ú@ÿ,äõ?H^.Ãõ¯{íùrJ?ÿòÑô¯<þëý_ðgTü7 íw~ñºÿ§ãõèÿÂ-þíÝ®©oº¶í;ÿÿ-þÁ<ÿ³ù¿lhú6ÿlëÅçúöÍàåÿ²þÓôúgz
-Mÿ
-à¿«ùSëß§§RèôÍúïýÿý³p>ÿGÿoiÓÿ]³[¥Yzüß´í}×^àÃó?ÞhüÓıyX·¯cøü/úðü'Qú?. ÷>GÏõ4ç.êÜÿÃü¸ÿÿÇ
-@ºÏ1|üw*`ýzü»À»Çÿð2þÑÃÿÁBÞÿõßr¡ë¿» |ðüߪ¨ÿaùÙÐõß] Þ©}1ÿõ, þ[6týwXÿÕ
-ýX°P¾hèúï. ïÖ¿}9ÿWý_X@ý·lèúï. ¡gàÿdAc÷gÑLÿï, ïÔÿ¥ÿ+zäÿXx
-ü_2¡ë¿» ¼{ü÷/ë?ÿ
¼þÉË
ªUÊÿúoèñÂÿá.ýèÿÇûC4týò@ÿ,àyO6týOàÿ¸xþs1@ÿ,|¨Û· ¹Ðõ_ÈÿüÿeC×ÿÿø?dC×ÿþçgàÿfýÿe3Aþ¿ÿÏÿ,û?ÐÿStýOáÿ°þø¿Y°Ø P4TýëRþÿôøêÿü/¹í r¡ë¿ÿõ?,`ú'ºþËôÿðXÿaý?dC×!ÿúÿ±ñ_6týêÿõ_àÿ
-]ÿ
üXÿaþÙLÿ/ãÿ@þø?dCסþèÿÃB^ÿäå2Pÿû$üëýª½Þn~Mªß×_~¸õãaóÿóÞÂÿÉÆ{Ùÿûtü9'+¼Çþ_ÖµÉú×Þcÿ'ÆÄÿyûßçèÿÓû¿=ôEüËC{·kêÎ
- =ÿçø¯ÿcáìù?' 0IÿÏÖ¿m½ø\ß6×Ëïcøü?ZèÌÿeCÒÿb³{Mó§×¿Ïÿ,@ÿ²¡ë¿kö?jþ¯Ñÿóõ?ôÿÆ(ýß5»Uõ§ÇÿMÛÞ7]y áù¯BþIâ¿Ø<¬Û×Ï1|þtÿÌÿd3FÿGûGÿsô\ÿ1ÎuúºI7 äÿYÿÇízcøøïrI âÏ 9þÝíö8Ä?Dø¿XÈû?¡ÿ\Èúïnÿ0|þoUÿä{dCÖwûýÇÔ³þ²!ë¿»ýÃÿwúúçÀBù¢!ë¿»ýÃÀþÿW´èÿÄú?ȬÿîöÃõouð² ±û»hèùÿÎöcü_!"ÿÇÂSàÿ YÿÝíö8è?ZøXÈë¼\úïU>Êÿ¡áÿàÿIüîrýý?YÐp¬ÿRþè<ïɬÿ)üÏ.*è
u[ã ²þKù?ÿaã¿lÈú/åÿÿø?dCÖÿ$þçkáÿfûÈÿ/äÿÀó?gþôÿYÿø?^ÎÿC4ð³`±¨hú×ÅüþÈñ/Õÿù_rÛ%8@äBÖ)ÿêXÀôO6dýêÿõÐÿC6dýò ÿÿeCÖ)ÿÖYÿC6dýò`ýø?dCÏÿò ÿÇü²!ë¿Tÿôÿa!¯ÿAòr®ÿÙôóîÿ£}Àþo,ÿóþ=ÏÑ
/þ§÷ÿôGìÿÃ)þíÝ®©o:w1ÿ÷ó0ÿ
-IÿÏÞm½ø\ß¾¶üðõ¿h¡°ÿ§lHú?ìÿþ}Í2\ÿ.z<ÿ³ ýË®ÿ®Ùÿ¨ù¿FÿoÎæÿèÿ-Qú¿kv«4ëOÿ¶½ïÜ
-|xþÇküıyX·¯cøü/
ú/0ÿÍý×ûcøúOº ÿÏÂøø?îÿÑãÃǧ4âÏ9þeê¿£BýyÿÔË
¬ÿBõßùï
-Yÿeê¿£Bý¨ÿ
-Yÿ
ê¿Ñÿå¬ÿBõßõ, þ[6dýORÿm/ê¿=ü,hìþ,zþ¿HýwTÈÿ±ðø¿dBÖ¡úoÿyýQÿªÿCÃÿÁ9þø?ö~#4Ü¢!ë¿ÿúgÏ{²!ë
-ÿÇÅóßÁý3ð¡nkÜäBÖ)ÿò?,`ü
-Yÿ¥üð± ÿlÈú/ÔÿßÁÿÍúÿËÿ/äÿÀó?gþôÿYÿø?^ÎÿCÄþ?<Xl (¢þu1ÿÿrüKõÿ@þ
Üv ¹õ_Êÿú0ý
-Yÿ¥ú`ýôÿ
-Yÿ¥üèÿÇÆÙõ_Êÿõ_àÿ
-Yÿ¥üXÿaþÙÐóÿ
üÈÿ± ÿlÈú/ÕÿýXÈë¼\ë>`ç#ýüÊÚà£6YÿÚ ÿcâÿ¼ÿgÏsôÿéý?ýÑ!þâßÞíú¦sؾóÿ,mmÿ½Æúçó£° þ½?Ûzñ¹¾}m/ø¾ù¿þðúçÏû²!éÿ°ÿû÷5Êàü¿qÑÃÿËöÿ
-]ÿ]³ÿ¾ó£\}îæÿ:"ÿÇæÿ²¥ÿ»f·J³þôø¿iÛûÎÀç¼vèÿËÂ$ñ_lÖíëç>ÿû?óùlÆèÿ¸þÛÿ=×sáÐø3ÍAþ
ññÜÿ£Ç9ÿ.}ñçÿRõßÈÿ²÷Aý·\Èú/Uÿü/Xÿ
-Yÿ¥ê¿QÿÁê¿eCÖ©úoÔ²`¡|Ñõ_¨þÛ£ÿ/¨ÿ
-YÿÔÛúoÿ»?ÿªþûèÿÒ&ê?±ÿO!ÿK&dýªÿÿ
¼þÉË
¨
þÿïrü'ñ¸ËõôÿaAÃý!²þÑÿÿ]ÿlÈúÂÿqñüç¢þYøP·5nr!ëýÿß5ÿeCÖ?úÿ¿kàÿ
-Yÿèÿÿ®AÿÙÐóÿÓõÿÏýÿõÇþÿ¨ÿdþÙõ?ÿãåü?Dÿ
-QÿºÿÃÂÿÁ9þ¥ú ÿËBn»\Èú/åÿ@ýþɬÿRý?°þÃúȬÿRþäYÀø/²þKù?°þËü²!ë¿ÿýxÿC6ôüÿÄþ§þäÿXÿC6dýêÿþß,äõ?H^.Ãõ¯ýô÷è~etÈýáÿ(Ϩø?o ÚïýãïÿÙÿÿøs@{·kê®-`ÌÿUPÿ·Èÿ³p6ÿ¥&¢ éÿÙü³ëÛW6ÿËú6`ýôÿ
-Mÿ
-à¿«ùSúê?ÿ>Ãú?ê?x@ÿÙL ÿÙÿùÿoã0Xÿçá|þÀý@ãô×ìVi
Öÿ7m{ßµøðü7Ú#ÿÃÁ4ñ_lÖí«çþüLÀüä{d3JÿÇàÞçèwÿWƹàòÆ/i>xèÿûyñÜ ¤ûÃǧ"ÖX Ç¿» ¼{ü/ãúÿ²÷Aý·\èúï. <ÿ·*jäX@þW6týwwê__ÌÿbÿÔË®ÿîðáù?¯5ê?XÿC6týwwëß¾ÿ§) ôÏê¿eC×wøý;ÿ'»?fügx§þ/ý_Ñ#ÿÇÂSàÿ ]ÿÝàÝã¿Yÿ¡ü?,äõ?H^.Tý«BþúoèñÂÿá.Ö<êYÐp®ÿBþèø?dC×ÿþç?ôϺq]ÿ
üÈÿ°ñ_6týòÀÿÅü²¡ë
-ÿÇÅó¿3ð³õ^ÙLÿÌÿqèÿeþ<ÿópîÿ@ÿOiÐõ?
ÿÃ^ø?4üß,Xlø!ªþu)ÿGÿzüõÿ@þ
Üv ¹Ðõ_Èÿú0ý
-]ÿ
ú`ýôÿ
-]ÿ
üèÿÇÆÙÐõ_Èÿõ_àÿ
-]ÿ
üXÿaþÙLÿÖÿaÕÑÿçàÿ
-]ÿeú ÿ7yýËý÷±|Ñßÿ¡cTyÿW¬ÿQñÞÿ³ß9úÇÿéþo½r?´ø·w»¦¾éÚ¶ïüÿ¤ÿÇü³ù~ Àd@4ý?{¶õâs}ûÊ^ðÃ×ÿ¢
þy@ÿÙÐôØÿý»?e¸þ=Öÿ@¾O6è¿cö?jþoôÏÂyþý¿¥1NÿwÍnfýéñÓ¶÷][Ïÿx£±ÿ7ÓıyX·¯cøü/ÿÿÉfþ뿽ÏÑïþ¯sÁEýyÜÿ9 Äÿqÿîsÿ]/èñ/Sÿþÿ<äý_Pÿ-ºþÕ#ÿÃúÿÊ®ÿ2õߨÿÔË®ÿ2õß
-ý_XÿC6týªÿFÿ7Pÿ-ºþ§¨ÿ¾Ð¿Ãþ<hìþ, òÿÕ¬ÿGüO!ÿK&týªÿÿ
¼þÉË
ªUÊÿúoèñÂÿá.×Ðÿ
-÷hèú/äÿþYÿC6týOàÿ¸xþs1@ÿ,|¨Û· ¹Ðõ_ÈÿüÿeC×ÿöÿâþÙÐõ_¦ÿ?úÿòõ^ÙLÿ/ãÿÀó?gþôÿ]ÿSø?ì¥ÿþo,6
-Uÿ}6åÿ°ðp@¡þÈÿ²Û.Á"ºþù?Pÿ没ë¿Pÿ¬ÿ°þ²¡ë¿ÿýÿXÀø/ºþù?°þËü²¡ë¿ÿýxÀz¯l&Èÿñ ÿÇü²¡ë¿Pÿôÿa!¯ÿAòr¡ÿ>-?ÎèíÿÐ1Zþu°Øÿ
QñÞÿ³ß9zÇÿpÿ)þÖ+ìÿÃ-þíÝ®©oºví7ÿ7ʹ^6Ïÿ}Äü
óù¿SØP4ý?{¶õâs}ûÊ^ðÃòùþmþYÀúlhú?ìÿþ]Í2\ÿ>M¡0ÞËfýwÌþÎÿ;îÿ
-ý³ðbþïp?Å8ýß5»Uõ§ÇÿMÛÞwm><ÿãFþ
iâ¿Ø<¬ÛWÏ1|þîÿ¨ÿb÷{ÙÒÿqý·÷9úÝÿq.¸¨Ó× ùñÜÿ£ûÃÇÆÄzü§®ÿÇú/Ô°÷Aý·\èúºþ;ë¿ÿaýeC×ÿÔõßã?ê¿X@ý·lèúºþ;ë¿Ñÿå®ÿ©ë¿ó
úOPÿ-ºþ§¨ÿ¾Ð¿3ð² ±û³h&ÈÿOTÿ}ðyÕ±þùB ÿLèúºþ;ë¿áÿa!¯ÿAòr¡ê¿O1ø(ÿÿzü§ð¸ËõìÿÄûC4týò@ÿ,Àÿ!ºþ'ð\<ÿ¹ >Ôm[\èú/äÿ@þÿ²¡ë¿ÿCÃÿÅü²¡ëêþÿGÿöÿàý¾e3AþZÿGPèÿÏÈÿú
-®ÿ)üöÒÿÿ7
- at ECÕ¿.åÿ°ðp@¡þÈÿ²Û.Á"ºþù?ðüǦ²¡ë¿Pÿ¬ÿ°þ²¡ë¿ÿõ,`ü
-]ÿ
üXÿeþÙÐõ_Æÿþ?<Àÿ! òÿû?ìÑÿçàÿ
-]ÿ
ú ÿ7yýË@ýïðo®Wëíæ×$ú}ýå;?ÿ³ã?ïe3|üý7þz$+¼ÿKǨòü_û àÿâ`Lü·ÿíyþñºÿ§?¢ÿ¤ø·w»¦¾éÜ ºßó¿¶ÁGå£ÏÏÿÞÀÿÇÂÙóÿ,½0IÿÏÖ¿m½ø\ß6×Ëïcøü?ZÔðý?dCÒÿb³{Mó§ôÕÿaü?Ôbÿ/.ÐÿE6týwÍþûÏÿÿèÿÆÂùü?û(Féÿ®ÙÒ¬?=þoÚö¾éÊ
-Ïÿxm#ò?LÿÅæaݾ~áÏÁ(Ô±|lÆèÿhÿè~÷ÿôÔç:?ÿ¥ òÿ,ÿãö?=Î1|üwJ#þ,ãßÝþaTÿÿyÿ'ôYÿÝíÆÔüÈÿʬÿîö£ú? þô
-YÿÝíÆø¿
ÿø?dCÖwû1ý£Cýèÿ ²þ»Û?éÿb=ü,hìþ.zþ¿³ýÃÿWTÈÿ±ðø¿dBÖwûýBtðÿ°×ÿ y¹õ¯ù?PÿÍ9þø?ÜËøú4Ü¢!ë¿ÿÃBÿ,Àÿ!²þ§ð\<ÿ¹¨ >Ôm[\Èú/åÿ@þÿ²!ë¿ÿþ/àÿ
-Yÿø?.ÿÿ¬÷ÊÿÎÿÑÚöÿ@þsÿúJ¬ÿIü/çÿ!Zø¿Y°Ø T4Dýëbþ
-ÿäøêÿü/¹í r!ë¿TÿÔÿ°élÈú/Õÿë?, ÿlÈú/åÿ@ÿ?0þˬÿRþ¬ÿ² ÿlÈú/åÿÀúðÈÿÎÿqØÿMÛcÿ<ÿ³ ÿlÈú/ÕÿýXÈë¼\è½¹²ëÏoôó<îÿ£bÒº
-xø?8ÿü½¾Ð/þ§÷£Eü9ÿ4
-ýÏqñO1wÑïrü£Mã¿ù¹Üïýâ?.þ¦ÿ9ÆÄßxÄÑñps¥
øs0.þ顯NÛö|=%ØýàùO»Ï6ø¿Xȼ¾[¶ÆÎ5öêðW«å~
_©ã?mvÍòvþs¹nÝ}SißcRèÂÕý&Ûÿò
qòC6yàã_"¥ô7Ìèû¿íQãÀýÑñ×®÷9Çßú"þåÿU³Z®?mz£cü×Êèã¿ÓÿY¸úÏÃ]ý©YýeÓÖ÷¿¯2:ÄhÕç?ðÇ]Ó¿^i«â<Ùù¿ìÇ*æfvvÀ?/Úå§~66iþä_×§è¹wÞ¨>,wí·çp<èìMþÏnÙ6ëÅçÓNÂ÷ÍÕ·ÍþxϬ:;Åêíö·_"áfswú&ÿy½Yüª[NÈ_üKýñþ·#\<;à?ÿøçë_Öé²KÇüþ{oòõ¢9ÿ=Ïøó}ýñôËÆiÎøïfq_/WO§Ðótk=}þe½;òøsÒW>É·¾ +ãÇÿþç5ÿsÿ9ÿþÓ¿qñ?ãõß?<fþ¯ðüǸøß,Ó§æ(ýÎÑÿ»ô[ïÐÿìhÆßÿû' GÝÿ1þ³0:þnΣæñç`tü_3{ÎñÿbÿGkê?Yx
-ÁÁÿý)é(FëÖÿcîÿ÷FÇÞÿ£âüãçÿý
-`cæÿþOÆÇ¿ÿÀ¨ç?ø?Yÿþ³óQñÇý
ÑñýÏ1jü7? Pø?ú×Â{ ¸
\ No newline at end of file
+ GwdK í[s#9r
çÕúõhGØcÜ
+ ÷ÍëµÝpxwÂ~STÕ£y²ÔÓ½¿Þ@QÒ¢ÔuÉBöÊy>Î¥[*²Hf 8Hh_o¼kþÉÍÂ4ÿ´ûôi½ÚÖÇþiBT$eú¿¥:ÿÿ?im)rZÿ¤´uÁýTS¾·x86Õ¡(~:Voß;®ë÷ïýFüߦ»úÅ_y«}ÖÄø;k=âÏÁ÷⿬¿¬´Ãã_¯úÄ?þ¹©7ã/~ñ¾5FãLüâÏÀøowËzÔEÐSÿÆ9ïñCý³04þé?jàUÐ_ÿ¥VÎÇøkcÐÿ³0.þýV½ÏÑÆ?µëß¿µZë\¼Nb7àõO
ù9ãñÿâU"þ׿é}Qú·?£ã?ë1ñÝâÏÀxý÷ï Féß#þ¿í}Qñw?£ãß?üãÆèÿYßÿ£âö
Ññïû?.þÿ±0:þ®ÿ9FÅý?£ãßÿö\ü
+âÏÁèøÏûcÔý?ò¿,èQú?£ã¿©ö}Ïì{;þƼÿ3.Íÿ
+bGxüBðé?"7?úNÆçÿúcTûþ
qñ߯æ?~oM¿stµÿ:Æü²ý·*åÿÐþç'Eòö~Õ:;wÖØöGÕñX¨Ó?íõênÿºÚ6õa]W_êö9&Î߬wj}.³Ù5÷õáôC
.åoqúßÔÕöÓ®ç9:ôïõõËñ_ nþÔJ´øc½ùË®©Ö¿+Ém\éÏ¿?;àº>ý¾ÐV
¹7³Ë~9ÖËÇ
+ëçfvqÀ¿,Õ§/¡5ÊðÛêü=/]iÔÙVæÛóºxÿsX5õÇjñùü óWøÃj]ÿWuWOù̪Sü±Úïû7»ó7ù/ÛÝöìbnK~@úå_ªëßpáâ?ýáÏ·¿lãeùÝkoò÷»í¢¾üüy]}<ÿµqÚøþ»^¬«ÕæézîÂŧøó/ÛÃéÇ×q¾Ôí7ù£/HÀÊøñÿ1ãü/ããßhTüáÿda\ü«øÅ>ªß9:óñfïÅø/-Ãø»3ÑÐlôÇlÛÿÎõ?í0iýòXÿÃÂÀø·^ýâÛMëÿSúëÿYÿf·ßwwßz^½ãÿ[ÿï=Öÿ²@ÿbw¨o«ñ9wÇ7Ïì;çM#{ÿÒYÌÿ²p1ÿ#á ,húßß;®ÒìϾZ|®îêÛÕòstê_½ôøÒÐ?z
+MÿÍý¡®]#Aý¿³©ÿOÃEèý¿Bÿ/ Æÿ¯öùçïÿQÿ³ ½ËfþïëÃ&úc÷¿kuWU°áùgQÿiâ¿Ø=lß6oÿËx ýç í¿lFéQ-îì×þ?ÖÔ*åÿUü?ø¯¶Ëú«îqïÿqÿeÿãê¯> îþß¿ÿiôÿ<¤f÷?1]ÿÛÍÇúp»ût{¬WSÀÝú¹þËëüIÿ¿\èúNO¼ÝWfÕ¬vÛ³s¾ÿ·i¼ýsù_ÙÐõß|ÛSÇÿú*ÿ«þ9øe»ú´ªhB×ÿbw_êíâÛi ðJ: »ÿ¹þ'
õ?,xþEC×ÿ¯Õ·cºû¯ÇÝbU5«/«æR)ÃçÿGýf¿h&ÈÿßWzysûFMÀNýÿæÿ,·mþãB ÿ§Lèú_×_êõwÏ1¼ÿw&(èäÿdCÕ¿Éåÿÿzüóø?Ú{ø?äB×&ÿü_,$ýCþr¡ë?ÿþ/4Ä/ºþ3ù?0ÿËü²¡ë?ÿó¿,Àÿ!ºþ§ð\éß+ø¿YиûÍùÿiýAüÈÿ³ðÂÿú ë?ÿþ/,ô.ªþûl0ÊÿQÂÿÁ=þSø?Üuýö
+÷hèúÂÿñ2ÿã5öåÁ ,ºþ3ù?Ðÿ³ ÿlèúÀÿqåÿtÚAÿ,|¨
+M\èúÏäÿ@þø?dCצúð²ú² ÿ?qýÿÃÂÿÅÂÿê®ÿ<þõ, ÿ'áú/ûoüóH?ÿµZëúW!ÿÿ#?câ¿Û¦cú£_ûúoL`¼'ã¿>%.è×þ«2>þ/ÕÔJcÿ/FÅÿyÿç~çèÿ§ñÚêÿ!þù¡Å¿Ýÿû¸ús÷ªõ«¥_þç<þ¥3¸ÿcá"ÿûAYÐôÿìýÚWÏÕ]}»Z¾raù¤_:ÔÿaãÙÐôßÜêjÙ5ÑÿèËþ?>Ðbñÿ«}þ9ÃûgÆÿ,`¼/qú¿¯8êÝÿ®iÖuGhxþÇÙõ¿,LÿÅîaÛ¼yáíéPÿ
÷d3Jÿ'ÿOïsôÿ1Îytòÿå5ÚñÜÿ©ûÃûìÿÂ=þSïÿRbÿFR³
+ r¡ëêý_JìÿÂHÒ?ä/ºþ§®ÿQbÿFPþG6týO½ÿKý_Áþ/²¡ëêú%öaõ?dC×ÿÔõ?ÊSýÔÿbõ?d3Aþ¢úù?ûB ÿ§LèúºþGý_AþO6Tý÷Y>ÆÿQbý/ôøgò ýgÁ©9v]ÿYüFÁÿÅBÒ?ä/ºþ3ù?àÿbëÿdC×&ÿæYÿC6týgò`þø?dC×ÿþ+ý{
ù_4îþE3Aþ?ÿ÷ÿ,\ú?PÿStýgò`ýz
+Uÿ*WýÔÿgÿ)üî*ÿýÿxÐp®ÿ)ü/ó?^äY°0 ®ÿLþôÿ, ß#ºþ'ð\ù?vÐ?ª¦B ºþ3ù?ÿeþÙÐõ©þü, þl&Èÿçñ`üÏÂ¥ÿõ?¤A×&ÿÖ²ülëÖãGúù?Î÷ÿQ!ÿÿ#?câÿ¼ýgÏsôÿSûïÓþO^ÃÿÃ)þíö¯?ÿ4tüâ_Úã.ÇÿðK¤ÿç©ÿ}µø\ݽµô°ñÒÀÿÃî÷eCÒs¨«eç`Dÿï¡.úÿ D{
+úøÿõ>ÿáý?üÿ\ ÿÍ(ýß×MõÇî×4ëÎÀç5Èÿ±0Iü»móö9·ÿ¥õ¨ÿÁÚÙÑÿiú·ÿ9ÏÿTí?ããÿ¸ýGsïÿNëÿüãß½ü{`ýÿvü§Ðÿó]¬ YÿÝË¿®ÿjç´Aþ
¤È_.dýw/ÿ~ÿoãO0ÿÃÊ?ȬÿîåßëÿÆÿðóúÿ²!ë¿{ù÷ÀõßIÿA[ìÿÇÖˬÿîåß#æÿBiQÿ¬ÿ
+=ÿß¹ü{ÿÓÇã¡B ÿ§LÈúï^þ=Æÿi4öÿ`ù?Ùõo²ù?àÿaÿ\þ´ÿ,¤ýßáÿYÿ¹üð±ôùË
¬ÿ\þø¿X@¾G6dýçò`þø?dCÖ.ÿæYÿC6dýOâÿ¸Òi1ÿËÆÝ¿hèùÿLþÜÿ³páÿ@ýOqõÉÿa°þ½¨ÍÿáàÿàÿIüîÚÿýßXÐp¬ÿIü/ó?^äY°0 ¬ÿ\þôÿ, ß#²þ§ð\ù?
+Ð?ª¦B ²þsù?ÿeþÙõ«þü, þlèùÿLþÿY¸ð þ8ÈúÏUÿë?YÞe3\ÿº°õOKÿ!¶Êèøüÿó ýÎÑ?þ©ý/ÓþO>`ÿ?hño7íÚþyàø?Å¿tXÿÅÃÅøÁx@4ý?Oþï«ÅçêîÍ ÿþ}Y"ÿÇüß²¡é¿¹?ÔÕ²kзÿ÷eP^µýðÿcá²ÿ´¢`üÿjNßþ?é¿ôæ´þùÿÍ8ýß×MõÇî×4뮽Àç?Bþiâ¿Ø=l7Ï1üþ¯tí?ïÉfþOÀ½ÏѯýO¾wA«ÿo÷AûBü7 é>ÇðþßÒ þÐãß½ ¼»ÿ÷/Çý?©ÙÅ
+p¹Ðõß½ ¼[ÿåËù£0ÿËBÒ?ä/ºþ»¾ÿ·Éýsò²¡ë¿{x§þõUþW;ÔÿdõÿeC×÷ðîþß¾Ð0
+ë?XÀúoÙÐõß½ |øü_ð
+û² ¿·l&Èÿw. ïÔÿÿ³´ªÿñ?O!ÿS&týw/ Þÿ;°ÿÈÿɪËÿõ¿,ÐãÉÿö
´ÿ;ür¡ë?ÿþ/þ!¹ÐõÉÿÿXÿ'ºþ3ù?0ÿËü²¡ë?ÿó¿,Àÿ!ºþ§ð\éßkø¿YиûÍùÿÉügù?ípÿÏÂ¥ÿõ?¥A×&ÿü_, þ§l¨úW¹ü¨ÿÏ=þSø?Üuþõ_YÐp®ÿ)ü/ó?^äY°0 ®ÿLþôÿ,Àÿ!ºþ'ð\ù?.¡>TM
&@.týgò ÿËü²¡ë?Sýø?YÀ|¯l&ÈÿO[ÿÃòÿópéÿ@ýiÐõÉÿõ, ÿ'ú?Fá/oæv¿ûµ>Ü«/ßÝú½eþ}Òиÿgý½lFôÿ¶ÿÎ_'úù¿¬Õ*XÒþ¯:þÿ£â¿Û¦z£_ûÿîÿX@û/áúÜüðÿêú
+A@ûÏÁø?oÿÞóýãÿ4þ7íúOÄ??¤ø/v4áûqýý{À¾ùßßâ_Zäy¸Ìÿbý4Hú¶~î«Åçꮾ]-_;Çðüwþo°þO6$ý7÷ºZv Fôÿúçá¢ÿOÀhDAÿ¿Þç3bþG[ÿY@þO6£ô_6qÔ»ÿ]Ó¬ë®<Ððü³Ú#ÿÃÁ$ñ_ì¶ÍÛçÞþÖ£þhÿe3Fÿ'û_ÿsôkÿc«ï¼:íÿgâhÿ9ÿÇíßzcxÿouP?äøwÿ¸ÿS;þSèÿyHÍ.* É
¬ÿîò?×ÿ·ó?þ/þ!¹õß]þgøý¿M@ÿ ülÈúï.ÿ3pÿ§Çñ?Öÿ±ýdCÖwùõþ6ØÿÔÿ
+YÿÝåFÌÿ
Túg ~/ÙÐóÿåFø?½*qÿÏÂSàÿ YÿÝ寸?Æþo, ÿ'¢þM6ÿü?,ãËÿö§æØJ0dýçòÀÿÅBÒ?ä/²þ3ù?àÿâõ_eCÖ.ÿæYÿC6dýçò`þø?dCÖÿ$þ+ýó¿,hÜýÿÏãÿð¸ÿgáÂÿúâ ë?ÿë?X@ýOÙõ¯rù?<êÿ³@ÿ$þwÿ-±ÿ/îÑõ?ÿãeþÇkìÿÇ
X4dýçªÿþø?dCÖÿþ+ÿ§SúgáCÕThäBÖ
.ÿò¿,Àÿ!²þsÕÿÿÌ÷ÊÿÏTÿã.ü¨ÿ!²þsù?°þäÿd3\ÿ~ÀÎ?'úù?Î÷ÿQÁ¡þcâÿ¼ÿgÏsôÿyûo¼v?¤ø·û¿víþÜwüosÁ_öÿÃú.ÇÿÎa?@Yôÿ<÷¿¯«»·ö>þã ÔböÙôßÜêjÙ9ÔÿGáÇþ?(äÿY¸ìÿúaÐÇÿ¯÷ùçÈÿiùÿÍ(ýß×MõÇî×4ëÎÀç5Èÿ±0Iü»móö9·ÿ¥Eý/0ÞÍýæûcøüIKBÑþ30>þûô8Çðþßê`ÈñÏUÿý?©ÙÅ
+p¹õ«þ?ò?,$ýCþr!ë?WýÌÿ²ù_Ùõ«þ?Ö°úÿ²!ë?×úoø?YÀúoÙõiý·Eýo°ÞS6ôüÿTë¿[ÿgl ©þ?ê?²ðø?eBÖ®õßÐ?ÈÿɨÍÿÿäøçò ýg!íÿÿ\ÈúÏåÿÿ
¤È_.dýçòÀÿÅÖÿɬÿ\þÌÿ² ÿlÈúÏäÿÀü/ðȬÿIüWú/-üß,hÜýÿØÿ¡íÉÿû.ý¨ÿ)
+²þsù?°þ½¨ÍÿaàÿàÿIüî:ÿý_XÐp¬ÿIü/ó?>Þ
+BÿXECÖ.ÿúàÿ
+YÿSø?®üNè
US¡ Yÿ¹ê ÿËü²!ë?SýÔÿáõ?dCÏÿO]ÿÃüÿ³péÿ@ýiõËÿõ, ÿ'áúïeù¸ ÿCYëËöÆ_ÿ1ñÞÿ³ç9úÅÿ¼ýO@ÄRüÛý_»vî;þ¿ÜÿÏ¡þãÿdAÒÿóÜÿ¾Z|®îÞÚzøøß;ìÿÅî÷eCÒs¨«eç`Dÿï¡.óZ¡ÿ}üÿzÎü6ÿ³þ_6£ô_6qÔ»ÿ]Ó¬;·ÿqVcÿg&ÿb÷°mÞ>Çðö¿´%ü_, ýÍýæû£çüqλ ãÏùÆÇÿqÿçÞÿ[ê¿#þù!Ç?Sýôÿ<¤f+ÀåBÖ¦úÿØÿ¤È_.dýgZÿ
+ÿ'(ÿ ²þsÕÿGýPÿ_6dýçZÿõ_,`ý·lÈúϵþõÿYÀúoÙÐóÿSÿ¾Èÿ©÷ÿ,<
þOõiý·Býÿ
+Qÿ&ÿþÈñÏåÿ@ûÏBÚÿþ¹õËÿÿIÿ¿\ÈúÏåÿÿä{dCÖ.ÿæYÿC6dýçò`þø?dCÖÿ$þ+ýó¿,hÜýÿÏäÿÀý?þÔÿYÿ¹êÿcýz
+Qÿ½6åÿpðp@ÿ$þwíÿ°hÿ9Ðp¬ÿIü/ó?^käY°0 ¬ÿ\þôÿ, ß#²þ§ð\ù?òÐ?ª¦B ²þsù?ÿeþÙõ«þü, þlèùÿLþÿY¸ð þ8ÈúÏUÿë?YÞe3\ÿnÀÎ?'úù?Î÷ÿQÁ
ø?8ÿçý?{£_üÏÛãÓü/âRüÛý_»vµÿsüú.Æÿð¤ÿç¹ÿ}µø\ݽµôðñ ÿÏöÿ
+IÿÍý¡®#ý¿þy¸ìÿãí(èãÿ×ûüsFäÿ´Åø÷e3Jÿ÷õaGý±ûß5ͺs+ðáùg5ò,LÿÅîaÛ¼}áíi=Ö°ñlÆèÿ4ÿÛÿÃçLjÐþ30>þûô8Çðþ?vÿñçÿLõÿÑÿó]¬ YÿêÿÃÿÍCÒ?ä/²þ3ÿÆú/PþA6dýçªÿú¿, þ¿lÈúϵþõYÀúoÙõký7Ö±õß²¡çÿ§[ÿíË ±íúoìÿÅÃSàÿ Yÿ¹êÿ£þÈÿɨÍÿÿäøçò ýg!íÿÿ\ÈúÏåÿÿ
¤È_.dýçò ÿÃÖÿɬÿ\þÌÿ² ÿlÈúÏåÿÀü/ðȬÿIüWú/-üß,hÜýÿÚÿqªÿñ?þÔÿYÿ¹üXÿÁ
ÞECÔ¿ÊæÿPðp@ÿ$þwÿ-Ú4Ü¢!ëÿÇËü×ù_,À¢!ë?ÿC£ÿgùÙõ?
ÿãÊÿéþYøP5 ¹õËÿü/ðȬÿ\õ?0ÿËêÈÿÚÿ¡ZÿG ý³péÿ@ýiõËÿõ, ÿ'áúïUòã~þkµ
+ÖõÿýßXÿÝ6ÓÿýÚÿóø8DûÏÆ{²®ÿy¦ö_Ùö°õÿÇñÿcâÿ¼ÿsÏsôÿùøßxìÿÊ)þíþßÇÕÇø»×_-ýò?F9ª\»ÿ+ò?<\äbÃ;,Húö~í«Åçꮾ]-_;GßüOêþµ.Sþ7¶Ð?ÈÿȤÿæþPWËÎÀùmSý÷2@ÿ< ÿ
+}üÿzÎùäÿ@þO6£ô_6qÔ»ÿ]Ó¬ë®<Ððü³ÉÿüO~&ÿb÷°mÞ>Çðö¿´ðÿóö_6côòÿô?GÏùãwA'ÿO@ûÏÁøø?îÿÔãÃû«Gü9 Ç?×þ/èÿYHÍ.*È
¬ÿ\û¿ ÿÃBÒ?ä/²þsíÿÿï
+Yÿö Øÿìÿ"²þ3Õÿ°XÿÇêȬÿLõ?,öfõ?dCÏÿO\ÿÃ)ìÿÂÈSàÿ Yÿêø¿YÞeCÔ¯b £üðÿ°@&ÿG@ûÏSsì #²þsù?àÿb!éòYÿ¹üð±õÿ²!ë?ÿó¿,Àÿ!²þsù?0ÿËü²!ëÿÇþKù_4îþECÏÿOåÿ8ÕÿL¿äÿèÿYÿC6dýçò`ýz
+Qÿ*ÿ£ÿrü'ñ¸ëúØÿ
+÷hÈúÄÿñ2ÿãµÁý7|¢!ë?ÿý?ðȬÿ)üWþO§ôϪ©ÐÈ
¬ÿ\þäYÿC6dýçªÿÿ'¨ÿ!zþâú¶<ù?°þø?dCÖ&ÿÆúOÿÍpý;ÿèïÿÐ!¨´ÿ«
+ÎÂÿÁÁø?ïÿÙóýãÿÔþ¯áÿaÿvÿ×®ÝûÿÏ÷ÿ+ÿgábü?`<
+þçþ÷Õâsu÷Ö^ÐÃÇÿÞaýðˤÿæþPWËÎÀü*CÊÿÅ?àþ
Ëþ?>Ð>þ½Ï?§oÿßêß§úßN;Ìÿ±ülFéÿ¾>lâ¨?vÿ»¦Ywn><ÿãl ÿÃÀ$ñ_ì¶ÍÛç~ÿWZìÿÀÆ{²£ÿÓüoÿsôkÿc«ï¼:ÿL²£ýg`|ü÷ÿèqáý¿ÕÉÿøçÿLõÿÑÿó]¬ Yÿ¹êÿcþ
¤È_.dýçZÿù_à÷
+Yÿêÿ{Ìÿ²úÿ²!ë?×úo¬ÿbë¿eCÖ®õߨÿÀüÞ²¡çÿ']ÿJmÛõßÿóðø?eBÖ®õߨÿäÿdCÔ¿Aýÿ÷
+9þ¹ühÿYHû¿Ãÿ!²þsù?àÿb!éòYÿ¨ÿÿ®Áú?ÙõÉÿú<Àÿ!²þQÿÿ]ÿlÈúÄÿq¥ÿÒÂÿÍÆÝ¿hèùÿéügù?ìÿËÄ¥ÿõ?¥AÖ?êÿ¿kPÿS6Dý«lþÔÿgÿIüîÚÿú,h¸?DCÖÿ$þù¯
+ò¿,XECÖ.ÿúàÿ
+YÿSø?®üNè
US¡ Yÿüù_àÿ
+Yÿ¹êÀÿÉæ{eCÏÿOçÿÎh]>ÖÿÀø
KÿêH¬ÿ\þ¬ÿdù?Ùׯ-_.èçÿP6 Ó&é_§áÿà`Lü÷ÿìy~ñ?oÿã 0 þâßîÿÚµûsßñ¿QÎk÷ÿ+Ñÿ³p1þ
+/ì ² éÿyî_->WwoíÝwüºÓþïÞaý7ÿˤÿæþPWËÎ@ßü_«ò¥þy@ÿ/úøÿõ>ÿù¿þ@¾_6£ô_6qÔ»ÿ]Ó¬;·ÿqVcÿg&ÿb÷°mÞ>Çðö¿´%ü_, ýÍýæû£çüqλ ãÏùÆÇÿqÿçÞÿ[ê¿#þù!Ç?Sýôÿ<¤f+ÀåBÖ¦úÿØÿ¤È_.dýgZÿ
+ÿ'ï
+Yÿêÿ{ÔaõÿeCÖ®õßXÿÅÖˬÿLë¿
+êÿ³õß²¡çÿ§[ÿüÊ©vý7Öððø?eBÖ®õß𳠽˨Íÿÿäøgòx´ÿ,¤ýßáÿYÿ¹üð±ôùË
¬ÿ\þø¿XÀúÙõËÿù_àÿ
+Yÿ¹üÿe
þÙõ?ÿãJÿ¥Áü/wÿ¢¡çÿ§ò´õ?KeÍÉÿûàÿ
+Yÿ¹üXÿÁ
ÞECÔ¿Êæÿ(áÿàÿIüîºþCûÏûC4dýOâÿxÿññoÐ?7|¢!ë?ÿý?ðȬÿ)üWþOþ9øP5 ¹õËÿü/ðȬÿ\õ?àÿdõ?dCÏÿO\ÿöû?bý'ðȬÿLþ
õ, ÿ'ú?Få/o7Ûýî×úp{¬¾|ë÷ú/áÿâûÉfDÿßkϧsÂûù¿t*ù¿u[ÿþ¯üÿóÀýÎÑ?þ©ýO÷Æ£þ´ø·@wmÿÞûþÿ·øû?ópqÿ?`<
+þÍ?ûjñ¹º{c3øaãÿ6ÿW:¬ÿdë?dCÓs¨«e×`Dÿ .óÿ3
þ_ÿ_íóÏÞÿ;£0þgù?ÙÓÿ}}ØÄQìþwM³®;ò@Ãó?ÎüÓı{Ø6ocxû_Æ í?hÿe3Jÿ'Hïsôkÿc«ï¼:íÿdZÿÚÿüâÿ¸P÷9÷ÿÖ8øs@wîþß¿ÿiôÿ<¤f äB×wný/çt@þ
¤È_.týw|ÿoÓxúç ë=dC×wNýë«ü¯vð³ý?dC×wîþß¾Ð0
+ë¿Y@ýÙÐõß] bøü_ð
+õYßK6äÿ;@têÿÊÿéµÅý?O!ÿS&týwÞÿ;Pÿ
äÿdCÕ¿ÉåÿÀú_èñÏãÿphÿYpj@C×&ÿü_,$ýCþr¡ë?ÿþ/PÿO6týgò`þø?dC×&ÿæYÿC6týOáÿ¸Ò¿WÿeAãî_4äÿóø?pÿÏÂ
ÿõ?ÅA×&ÿÖ°ú²¡ê_åò þ?ôøOáÿp×õ?°ÿ3îÑÐõ?
ÿãeþÇëü/`ÑÐõÉÿþø?dC×ÿþ+ÿ§ÓúgáCÕThäB×&ÿò¿,Àÿ!ºþ3ÕÿÿÌ÷ÊfüÿÆÿ,\ø?PÿCtýçñx¬ÿdù?Ùпë¿óÏ~þkµ
+Öõ¯Ó þFÅ·Mõ>G¿öÿ<þäXÀþo²yKÿûÃn1´~íÿÓøÏÿ¤´s¥EûÏÁwã¿·wõìÏ÷Ûm¼
+/â_Úãb^¦ÛÒÂÄBÏÓö»¾Ðffçaæ}9+¬õ¥*-7Þ¥73W¨ødUèÙlnláOÑ¥Wºó¹
+ÆÍ]a¼3åóóLP³ùéyºÐAY7+â?aâfÊ«fñd¥.T:ûéÈø4å}(¯f6´GªÒ*Sèø¦ã¡ZµñÐxíèÂÎoýìt¨v>¾7OGªÇ#]|R|ÛóÂj[e|'>;#y|Ùôéy8[³yü`
ÇÜLyÕ¿ÒÇ÷Þ¾}:4½Ôêøm9¾¥thiãRØYú\óÇ/ ÄoÉÆsYüóÎÞ@©Mü\îôªætè¬j?¤oMÙÒt¬{cæ>~Ö¾¢ÄNÇÇ×7Þí<¾íY¡Ë2ê¿Ùøe{ú.
+ëMÙ~]³Ù,Æ!}ªß@ü}éæ³øâ æ1¢í6¤oÅ¥O5{:2½C=óe1÷ñmeü2Ú/K»xúxq¥åµEÐ:¤(ÆxíÂé+p.+Æß©ô±¬}<Ú¥ÏÛø=Æ7ÒwîBéâ%Ö^4êéµË"Í!êq_ÌãÏÛgºté=ÏÚ7¢Ò^mC: ¨}ûfçÁÇi¾Ôø=þûôHFüìÌ¥7Ö>¢4\úÊ1áìøiÚÍç^ŸýÒ^Ëé©ß!xàxàxàxàÇÿ£ÇÍ¢ùÚÁr¦æ®47Õ¦Ni)k½*Ãì&%Ïëã±>)©JÝþäx{xØnWÛ»âéï×»ÅçzYüÀI¸ïæÿûÕöÓzïçÿ5Þ¿Èÿǯþ_/ÕÝáï~/Ã/õv¹;Ü®ñoÿVocôëÿØ6õ:¥TOÕfµþ£ËÍnY¯ÿ.þÙþXl«MÿzMûü¿ÿï(þ·Þmÿþ/üâ_ÿëÂüìÕ¿ýû_oM½ßGIħÎÚüñßÿ^6ÍHüìæñgÉjV¤E%ñ§©X}ñ¿¿yZrZ´oTÝWãU{wLÜ,v:ý¢ýMzÉôô+sóiÿ~ü>¦?ÞÖ_õ>U}üYºÜEëgk?Ù¯ûç£×U|õøø´âKû².öǺhbs<ûª.6ºX|Õ~µ(õ¾Ø4ø»ôªXlv_âaMzõÅbýiýp¼/ͱ¨ûU±Ù|->}/ô¯ÿ)î¢ÙÇoÇøYãWüµXoâ§ÙÆ+vÛܦsï·ñ»íªÙåñv±_Çw÷µXıøª}ñµÙuuÿév½¹ù¸»ÛmVûôUzn~.˧·ñøýzwú¾o«õên»©·M¶ÝTËeüíqí·¬«øÖñiÆ¢ýÉÕ¡y¨Ö7ûݯõ¡ØTÛê®N/ô»óKM¿ÏKMãR~©ÍÂÏFý¸KͼÏKÍàRw©
w©Ù÷y©Y\j£.5mÜ¥æÞç¥ööXMãRûÎ¥¦Ì»ÔÊ÷y©½=VÃ¥öÝTÿ¸KÍ¿ÏKíí±.µïv ów©
÷y©½=VÃ¥ö·:V½ÏK
+yµ÷ì¿ÏK
+yµû)Üw:]ÄÚÈôG^kït¾ µ×ÚLwèw:aÔÚÈkíæ;ô;1 at níýåÖô;2 at rmd»æàµöNç]{÷ü>9
ø[ãÿ ^¹ à
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,50 +1,53 @@
-System(0KB HP=0*0kB )
- Socket#0
- L3Cache(4096KB)
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#0
- P#0
- P#8
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#1
- P#4
- P#12
- Socket#1
- L3Cache(4096KB)
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#0
- P#1
- P#9
- Socket#3
- L3Cache(4096KB)
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#0
- P#3
- P#11
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#1
- P#7
- P#15
- Socket#2
- L3Cache(4096KB)
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#1
- P#6
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#0
- P#10
-depth 0: 1 System (type #0)
+Machine (phys=0)
+ Socket #0 (phys=0)
+ L3Cache #0 (4096KB)
+ L2Cache #0 (1024KB)
+ L1Cache #0 (16KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ PU #1 (phys=8)
+ L2Cache #1 (1024KB)
+ L1Cache #1 (16KB)
+ Core #1 (phys=1)
+ PU #2 (phys=4)
+ PU #3 (phys=12)
+ Socket #1 (phys=1)
+ L3Cache #1 (4096KB)
+ L2Cache #2 (1024KB)
+ L1Cache #2 (16KB)
+ Core #2 (phys=0)
+ PU #4 (phys=1)
+ PU #5 (phys=9)
+ Socket #2 (phys=3)
+ L3Cache #2 (4096KB)
+ L2Cache #3 (1024KB)
+ L1Cache #3 (16KB)
+ Core #3 (phys=0)
+ PU #6 (phys=3)
+ PU #7 (phys=11)
+ L2Cache #4 (1024KB)
+ L1Cache #4 (16KB)
+ Core #4 (phys=1)
+ PU #8 (phys=7)
+ PU #9 (phys=15)
+ Socket #3 (phys=2)
+ L3Cache #3 (4096KB)
+ L2Cache #5 (1024KB)
+ L1Cache #5 (16KB)
+ Core #5 (phys=1)
+ PU #10 (phys=6)
+ L2Cache #6 (1024KB)
+ L1Cache #6 (16KB)
+ Core #6 (phys=0)
+ PU #11 (phys=10)
+depth 0: 1 Machine (type #1)
depth 1: 4 Sockets (type #3)
depth 2: 4 Caches (type #4)
depth 3: 7 Caches (type #4)
depth 4: 7 Caches (type #4)
depth 5: 7 Cores (type #5)
- depth 6: 12 Procs (type #6)
+ depth 6: 12 PUs (type #6)
+4 processors not represented in topology: 0x00006024
+4 processors offline: 0x00006024
+4 processors allowed but not online: 0x00006024
Topology not from this system
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1 @@
+link 16em64t-4s2c2t-offlines.tar.gz
\ No newline at end of file
Property changes on: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz
___________________________________________________________________
Added: svn:special
+ *
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz.options
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz.options (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz.options 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1 @@
+-p -v -.xml
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz.output (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines.xml.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE topology SYSTEM "hwloc.dtd">
+<topology>
+ <object type="Machine" os_level="-1" os_index="0" cpuset="0x00009fdb" complete_cpuset="0x0000ffff" online_cpuset="0x00009fdb" allowed_cpuset="0x0000ffff">
+ <object type="Socket" os_level="-1" os_index="0" cpuset="0x00001111" complete_cpuset="0x00001111" online_cpuset="0x00001111" allowed_cpuset="0x00001111">
+ <object type="Cache" os_level="-1" cpuset="0x00001111" complete_cpuset="0x00001111" online_cpuset="0x00001111" allowed_cpuset="0x00001111" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000101" complete_cpuset="0x00000101" online_cpuset="0x00000101" allowed_cpuset="0x00000101" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000101" complete_cpuset="0x00000101" online_cpuset="0x00000101" allowed_cpuset="0x00000101" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000101" complete_cpuset="0x00000101" online_cpuset="0x00000101" allowed_cpuset="0x00000101">
+ <object type="PU" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001"/>
+ <object type="PU" os_level="-1" os_index="8" cpuset="0x00000100" complete_cpuset="0x00000100" online_cpuset="0x00000100" allowed_cpuset="0x00000100"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010">
+ <object type="PU" os_level="-1" os_index="4" cpuset="0x00000010" complete_cpuset="0x00000010" online_cpuset="0x00000010" allowed_cpuset="0x00000010"/>
+ <object type="PU" os_level="-1" os_index="12" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Socket" os_level="-1" os_index="1" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202">
+ <object type="Cache" os_level="-1" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202">
+ <object type="PU" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002"/>
+ <object type="PU" os_level="-1" os_index="9" cpuset="0x00000200" complete_cpuset="0x00000200" online_cpuset="0x00000200" allowed_cpuset="0x00000200"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Socket" os_level="-1" os_index="3" cpuset="0x00008888" complete_cpuset="0x00008888" online_cpuset="0x00008888" allowed_cpuset="0x00008888">
+ <object type="Cache" os_level="-1" cpuset="0x00008888" complete_cpuset="0x00008888" online_cpuset="0x00008888" allowed_cpuset="0x00008888" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000808" complete_cpuset="0x00000808" online_cpuset="0x00000808" allowed_cpuset="0x00000808" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000808" complete_cpuset="0x00000808" online_cpuset="0x00000808" allowed_cpuset="0x00000808" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000808" complete_cpuset="0x00000808" online_cpuset="0x00000808" allowed_cpuset="0x00000808">
+ <object type="PU" os_level="-1" os_index="3" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008"/>
+ <object type="PU" os_level="-1" os_index="11" cpuset="0x00000800" complete_cpuset="0x00000800" online_cpuset="0x00000800" allowed_cpuset="0x00000800"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00008080" complete_cpuset="0x00008080" online_cpuset="0x00008080" allowed_cpuset="0x00008080" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00008080" complete_cpuset="0x00008080" online_cpuset="0x00008080" allowed_cpuset="0x00008080" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00008080" complete_cpuset="0x00008080" online_cpuset="0x00008080" allowed_cpuset="0x00008080">
+ <object type="PU" os_level="-1" os_index="7" cpuset="0x00000080" complete_cpuset="0x00000080" online_cpuset="0x00000080" allowed_cpuset="0x00000080"/>
+ <object type="PU" os_level="-1" os_index="15" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Socket" os_level="-1" os_index="2" cpuset="0x00000440" complete_cpuset="0x00000440" online_cpuset="0x00000440" allowed_cpuset="0x00000440">
+ <object type="Cache" os_level="-1" cpuset="0x00000440" complete_cpuset="0x00000440" online_cpuset="0x00000440" allowed_cpuset="0x00000440" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040">
+ <object type="PU" os_level="-1" os_index="6" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00000400" complete_cpuset="0x00000400" online_cpuset="0x00000400" allowed_cpuset="0x00000400" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000400" complete_cpuset="0x00000400" online_cpuset="0x00000400" allowed_cpuset="0x00000400" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000400" complete_cpuset="0x00000400" online_cpuset="0x00000400" allowed_cpuset="0x00000400">
+ <object type="PU" os_level="-1" os_index="10" cpuset="0x00000400" complete_cpuset="0x00000400" online_cpuset="0x00000400" allowed_cpuset="0x00000400"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+</topology>
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1 @@
+link 16em64t-4s2c2t-offlines.tar.gz
\ No newline at end of file
Property changes on: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz
___________________________________________________________________
Added: svn:special
+ *
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz.options
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz.options (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz.options 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1 @@
+- -v --whole-system --cpuset
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz.output (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t-offlines_noadmin.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,53 @@
+Machine (phys=0) cpuset=0x00009fdb
+ Socket #0 (phys=0) cpuset=0x00001111
+ L3Cache #0 (4096KB) cpuset=0x00001111
+ L2Cache #0 (1024KB) cpuset=0x00000101
+ L1Cache #0 (16KB) cpuset=0x00000101
+ Core #0 (phys=0) cpuset=0x00000101
+ PU #0 (phys=0) cpuset=0x00000001
+ PU #1 (phys=8) cpuset=0x00000100
+ L2Cache #1 (1024KB) cpuset=0x00001010
+ L1Cache #1 (16KB) cpuset=0x00001010
+ Core #1 (phys=1) cpuset=0x00001010
+ PU #2 (phys=4) cpuset=0x00000010
+ PU #3 (phys=12) cpuset=0x00001000
+ Socket #1 (phys=1) cpuset=0x00000202
+ L3Cache #1 (4096KB) cpuset=0x00000202
+ L2Cache #2 (1024KB) cpuset=0x00000202
+ L1Cache #2 (16KB) cpuset=0x00000202
+ Core #2 (phys=0) cpuset=0x00000202
+ PU #4 (phys=1) cpuset=0x00000002
+ PU #5 (phys=9) cpuset=0x00000200
+ Socket #2 (phys=3) cpuset=0x00008888
+ L3Cache #2 (4096KB) cpuset=0x00008888
+ L2Cache #3 (1024KB) cpuset=0x00000808
+ L1Cache #3 (16KB) cpuset=0x00000808
+ Core #3 (phys=0) cpuset=0x00000808
+ PU #6 (phys=3) cpuset=0x00000008
+ PU #7 (phys=11) cpuset=0x00000800
+ L2Cache #4 (1024KB) cpuset=0x00008080
+ L1Cache #4 (16KB) cpuset=0x00008080
+ Core #4 (phys=1) cpuset=0x00008080
+ PU #8 (phys=7) cpuset=0x00000080
+ PU #9 (phys=15) cpuset=0x00008000
+ Socket #3 (phys=2) cpuset=0x00000440
+ L3Cache #3 (4096KB) cpuset=0x00000440
+ L2Cache #5 (1024KB) cpuset=0x00000040
+ L1Cache #5 (16KB) cpuset=0x00000040
+ Core #5 (phys=1) cpuset=0x00000040
+ PU #10 (phys=6) cpuset=0x00000040
+ L2Cache #6 (1024KB) cpuset=0x00000400
+ L1Cache #6 (16KB) cpuset=0x00000400
+ Core #6 (phys=0) cpuset=0x00000400
+ PU #11 (phys=10) cpuset=0x00000400
+depth 0: 1 Machine (type #1)
+ depth 1: 4 Sockets (type #3)
+ depth 2: 4 Caches (type #4)
+ depth 3: 7 Caches (type #4)
+ depth 4: 7 Caches (type #4)
+ depth 5: 7 Cores (type #5)
+ depth 6: 12 PUs (type #6)
+4 processors not represented in topology: 0x00006024
+4 processors offline: 0x00006024
+4 processors allowed but not online: 0x00006024
+Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,88 +1,88 @@
- §
-J í]sIr®uký¾´#ì9õ]ÀÞybmc7Þ8çÑZø
-°©ö×»
- 9 1Ct%»Rò}°;3lÙoWuÖY:tëàúqs33ýÿyWÞçëèÕáÏڹÿy§µQÆ+å´~§tú¯ð®ñUÞÍîûvß4ï>ÞnoWËÍ+Çuû{7Ä>ÿn¿~¿¶Îz\Hñ·.xÄßÿl÷°Ü|Úvàp÷oÄßXÂø'ù»wí¼ðøçw÷÷Ûý?ü¡Qï?wùv³§?ý[·IA÷¾[½ODó©]/W_ÓW´¿ÞλÕ?¤ÿÇÿl6íºK¼äðýÿøßÿÔüÿn»ùÇ¿ýùÿû_?7æ§ þíßÿþþ¾ïv»åæ6}ëäp?ÿûßó5~jrÓôwílÑ5÷Ë¿çîÔ44ÿùÇ÷»Å×ûå¬]57ªÞß/?¦ÐÝÞçCÞ϶û.áðü#ó_ä/÷vù¯¿v÷ù?oº/³n×/·Ç¿Ë×ý¼YuÓ¯³_vÏG¯ÚôÓÓÒ·5×]3ïÝ}×ô÷³f}¿ovm׬g]3û2iÚÝrÖÜw»fÝïÓWnóWÚf¶Þ~NõùÛlhf«O«ûE3ïïv¶[6ëõæÓô£îÓMÿ7éÍ¢oúusÿõ>ý®é#þÒ¬Öé·Ù¤+vÓßäsï6é;·e¿Ý7óûÙnÞÝf~Ù/ýn߬ÚŧÕúýÇíív½ÜåÂë©ùÉû÷Ooãñó
-îøyß´«åífÝmúm3yßÎçé3¼?wøUóqÞúS þ¹qãß|^îûvõ~·ý¥Û7ëvÓÞvùýáýûÓKMÆ¥V~©MâOF}»KÍ|Á¥F»Ôâ·»Ôì÷y©Y\j¤KMÛow©¹ïóRûý¹Æ¥öÊ¥¦Ì·»Ôü÷y©ýþ\
-Ú«¨þvZø>/µß«áR{u ~»K-~ÚïÏÕp©ýo«M¾ÏK
-yµï/Ù1ý>/5äÕû)Üït¹ 5âú-¯µït½ 5âµö
-Óú;]0 at jx}Ã|þNW[ûþrkú;]2 at rx_ßðZûN×]û>
-ø}r?*¿åÿLE?æ9^÷jT|áÿt6jø?9ÈwµÃ-Ò[ÓØèiúø]ÈjµÓ8 ÁOkW5ÎgÌÄaU£'©±s!}öAé&N§67u Îøçï3QM¦ÇïÓÊ&©§ÿÅILß4Q&Z5I'óºQùìÇ#Ó·©¢onBØx8Ry«L?|¨VÇCm:
T{«;m
-ã¡Ú
ôNÜ4©téÒÛ6V[ßøôNB>v¢¢¦»fÇúf2M¿Xc¦é 7QAMé½Þ>N¿¨ÕéÓr&JùPoÓÒØIþ½¦@LMç6ô7.8{|>×Aä%ÿTs<tÒL½¤_2¤·¦¬7&0cÒ ÞGþLL;~ÞÔô]ékéñÝNÓÛ¤áÖ§CÃã'~¢OaÏEcñk2¤8äOP5ññH_÷iMo)ä3Eôp`izÿ.ÿV§#ó;ÔàiHoÃûôa>,íÒéÓÅðx¬m¢Ö1G1 hsé\)þidH¿µG»ü»§ûCú¦Ó9wê¢wé;\4êégû&¦kAçfþþpðD{ßóäðFT~ÓËM¿Ï¤u8¼Ùi*Å ¨ézüÿÓ+_é²ßØá¤áòGöt'ÇóÒn:
-*Åͤè{û¦å|þߨï/¼ðÂ/¼ðÂ/¼ðÂ/¼ðÂëz½õ_ú&è'jê¼yÿ±_®»²6('OKaÝ}ÚÊëÃßÜßì6åæ¶yúóÇÕvv×ÍÓüfùßùÿû¯÷ã÷ÖÿC«CÖäþ6þüFüçÝçeº|Ç»Êãïb4?¯Ä?ýwßG¸÷ÿ1FÇâ.øsp=þ³Ýï¡ñ>jòúoÔèÿÅðøç¥MúE0ðþo.E>Ç?zøsPÿ~»Û®¶·_/âþoFý³@¿ØwíüæÉ*wõ¯ûr8ó"þ.*ôcá)ÿÿáÒÞ:QPôÿdÕ¼Ùµ³»ö¶»YÎ_=ÇUý«ú÷úçÁ@è?»à¯iþrý[í<ôÏþECÖÿàÙ?iþoôÏÂùü?û(Jô¿èöë4ëOÿÛ¾_uó@åù@þ·Ä¶}Ø)+ÿ9îÿ ß#ýêy)«@Åë?F+ü?Åñ_næÝStÿÆ`ýjüsùþÐs\ÿÃËùã?¹Æb ªþ×fº]»ï¹ýÉo£|þEþäeCÕÿu7Þø¯/ò?é úçàçÍòÓ²ã. ªþͰþ ,/ªþgÛE·ï6³¯ÇWÓ×õo_è?hg |ECÕÿ/í×ûí§öþ~;[¶ýòó²ÿú;ç èß;ø?Y
Ðú9ÿ¿h÷Ýü&}áfÝî^?ÇUý_ø¿¼Èÿ±ðø¿dBÕÿæaý±ÛçÀ}×_ÑÅõñ߿Կ¶ðÿ°×ÿ y¹Ðô¯êû?üPã?®ÿÃ]ú?,îÿh¸?DCÕuÿôÏü²¡êTÿÇÅóÕ
-úgáCÛ·¸È
ªÿÚþüÿeCÕuÿü_,Àÿ!ªþÇõ¼ÿwð³0üECÎÿ×öàù
sÿúJªÿqý/çÿ^[ø¿Y°h *þu}ÿÿjü«÷ÿ@þ
Üv ¹Põ_Ýÿú0ý
+ øÓ9K í]sIr®uký¾´#ì9õ]ÀÞybmc7Þ8çÑ[ø
+ ©ö×»
+ 9 1Ct%»Rò}°;ú`
+"ûíªÎz3Kn\ÿ/nof¦ÿ?ïj Ñûü«^þ¬;üúÈ;2^)§õ;¥7þ]㫼<ìûv×4ï>Þmîõ+Çu»=ÇâEÇ»ÛÌF¿Å_[g½V.¤ø[¯âÏÁoŶ}X¬?mF;Gp8Æû7âo¬ áEüÓ¯ö]£F{¯ <þ9àÝ~¿ÙýÃõþs·¾Ýìn·éOÿÖÓeÐýǺïïÓ%Ñ|jWå×ôí߯6·ÝòÒïÃñ·Íº]uéþý?þ÷?5ÿ¿Û¬ÿñoþ§æÿþ×Ïù)¨û÷¿¿ß÷Ýv»Xߥ:9äÏÿþ÷ümÚÜ4ý];wÍ~ñ÷üÝæ?ÿø~;ÿº_ÌÚesx£êý~ñ1
îny?Ûìºü
ÃWò·Ì¿dÞÚ>ä¿þÚíóooº/³nÛ/6ëÇ¿Ë×ým³ì>§-ÿd¿l^¶é»§?¤Ö|^uÍm×l÷]ÓïgÍj¿k¶m׬f]3û2iÚíbÖì»m³êwé+wù+m3[m>§ÃúüÏlhfËOËý¼¹í÷M;Û.ÕêKóéKúVûômÓÿMúO3ï~Õì¿îÓÏ>â/Ír~uºb×ýM>÷vþåf½è7»æv3Û.Ó»ûÒÌÒ1û¢Có¥ßîe;ÿt³\½ÿ¸¹Û¬ÛüQx=5?yÿþém<~¾Á?ïv¹¸[¯ºu£m&ïÛÛÛôîÇ>eÕ|\¤·þnÜäø7»þ¡]¾ßn~évͪ]·w]þFxÿþôRÓß祦q©_jøQßîR3ßç¥fp©Ñ.µøí.5û}^jéRÓöÛ]jîû¼Ô~®¦q©½r©)óí.5ÿ}^j¿?WÃ¥öê ª¿Ý¥¾ÏKí÷çj¸Ô^@§ßîRßç¥öûs5\jÿ[çjïóRC^íûKvL¿ÏK
+y5â¥æ¾a
+÷;]. at b8~Ëkí;]/@fx}ÃtþNZ#^kß0ß¡¿ÓäÖ¾¿ÜþN\#Þ×Â7¼Ö¾Ó5d×¾g~ÜÊoù?ÓEÑy×ýÚ_ø?Ó
+þOò]ípôÖ4&Å 6zêlt!«ÕNã$?i¬
+^5Ö8oi|0w|UL¦Æ6Î
ôO´J7q:µÑ¸©kLpÆ?ÿ;ÕdzüwºÑQÙ$õô¿8éMVMÒɼnT>ûñÈôÏTÑ7A7!Nl<©¼U&ÍM>T«ã¡6ª½Õ6ÁÉñPíBz'nTGºôÒÛ6V[ßøôNB>v¢¢¦oºfÇúf2M?Xc¦é 7QAMé½Þ>¿N?¨ÕéÓr&JùPoÓÒØIþ¹¦@LMç6ô7.8{|>×Aä%Ws<tÒL½¤2¤·¦¬7&0cÒ ÞGþLL;¾ßÔô¯Ò×&Ó㻦·=IÃOÇO6}GÂ?Æã×d2IqÈ jâã'¾îÓÞRÈgèá@ó§âòO5y:2¿C= ¾ô6¼OÆáÃÒ.>]\ùÇ
+ÇÚ&jsÓ vñø8ÎâFôcYûx´Ë?{º?¤¯èi:0½Cx§.z.±ÃE£¾·obºtxh¦éïO´wù=OoDå7½X÷»|@:PÃÆ Rò> Çÿ?½ò
>!;qù^I.dOxrü8/í¦Ó RÜL¾·oú^ÎçÿýñÂ/¼ðÂ/¼ðÂ/¼ðÂ/¼~ ×ûYÿ¥o¢~¢¦Î÷ûŪËi)kòqò´ÖíÔV^þf³{X¯ë»æéÏÙ}w¾å7Ëÿ¾Èÿï¿îÇï3¬ÿ
+VÉý?lèÿÁÁoÄÿ¶û¼Hïx×Ayü½Òñçàø§ß÷ÝjË`xÿct)þÁZ
øsp=þ³íï¡ñ>jòúoÔèÿÅðøç¥MúE0ðþo.jã£Aü9(¿Ùn»¯ÅBqÿ7£þY Ä¿ïºööæÉ*wõ¯ûr8ó"þ.ôcá)ÿÿãÒÞ:QPôÿdÕ¼Ù¶³ûö®»Yܾz«úW/õï=ôÏÞECÑvÁ_Óü)åú·iýs ¡Ñõ?xöOÿ;ý³p>ÿOà~ ýÏ»Ý*ÍúÓãÿ¦ïÝà<PyþÇZüoÿló°R(V>ÿsN{Üÿ9@¾G6ú?ÔóRV×L®rÃýâø/Ö·ÝStÿ ÄjüsùþÐs\ÿÃEþGÿä>ÿ9X¨ú^Jén¶í®_äö'¿yòùTùÿ
+Uÿý×íx㿾Èÿhþ/,ü¼^|Zt·¸
ªÿCk³ç ¬ÿ¡,/ªþgy·ëÖ³¯ÇWÓ×õo_è?è ¡|ECÕÿ/í×ýÍæÓM»ßof¶_|^ô_çýû ÿ':@ÿ!çÿçí®»½I_¸YµÛ×ÏqUÿþ/¯5ò,<
þ/Põ¿~X}ìvy°ïú+º¸>þûý{øXÈë¼\húWõýþ¨ñ×ÿá.ý÷4Ü¢¡ê¿ºÿúgþÙPõ?ªÿãâùÏjý³ð¡í[ÜäBÕuÿò?,`ü
+Uÿµýþ/àÿ
+Uÿãú?^ÿÁø¿Y@þ¢!çÿkû?ðüϹÿý?¥AÕÿ¸þó¯=üß,X4
+Mÿº¾ÿÃÁÿÁ5þÕû ÿËBn»\¨ú¯îÿ@ýþɪÿÚý?4ÖX@ÿÙPõ_Ýÿþ,`ü
+UÿÕû`ýø?dCÕuÿÖXÿC6äümÿò,Àÿ!ªþ«÷ÿ@ÿòú$/Áú/ÛòåÁþ£Õú]:* ÿñÞÿ³ôãÿ|ÿ×ÁiÄJüûù®koï [>ÿwë<Íÿó &¢ èÿÙû³mg÷íÝÕ½àËóÞCÿ<`ýO6ýö¿¢ùSÊõo±þÇò}²!ëðì4ÿw
+úgá<ÿþßÒ(Ñÿ¼ÛÒ¬?=þoú~9|+ðòüµù?ÞÿÙæaÝ8GùüÏ9
+ÿÿɦ@ÿÇõ_Â9Ýÿ³êZåü¿²Èÿ³PÿÇý?JÎQ>þ'¨ñ¯^ÿþ?,äý_Pÿ-ªþ«×#ÿÃúÿʪÿêõßð²úoÙPõ_½þõ,X(_4TýWïÿþo, þ[6Tý[ÿ}¡ý?xÐØýY4äüíúoäÿXx
+ü_2¡ê¿zý7ü?,äõ?H^.4ý«êþ\ÿÿG}¨ñ×ÿá.Öú² áþ
+UÿµýèÿËü²¡êTÿÇÅóÕúgáCÛ·¸È
ªÿêþäXÀø/ªþ«û?àÿbþÙPõ_»ÿ?úÿòþÿ²!çÿ+û?ÿçáÌÿþâ ê\ÿÇËù¿×þo,¦]¿ÿÿjü«÷ÿ@þ
Üv ¹Põ_Ýÿú0ý
UÿÕû`ýôÿ
UÿÕýèÿÇÆÙPõ_Ýÿõ_àÿ
-UÿÕýXÿaþÙóÿµýÈÿ± ÿl¨ú¯ÞÿýXÈë¼\ë¿lË3û?tVëwé¨è"üÄÿyÿÏÒsÿóý_4%Dü Ä¿_ì»v>|Øòù¿Xÿãálþ 0EÿÏÞ];»ko¯î_ÿóúç벡èÿ°ÿûÍR®õ?&ï
-Yÿgÿ¤ù¿
-Ð?çùôÿFþÝ~fýéñÛ÷«á[ç¬5Èÿ±ðøÏ¶~À9ÊçÎFø?XÀüO6ú?®ÿÎ1ìþTïZåü¿ÒÈÿ³PÿÇý?JÎQ>þ£¨ñ¯^ÿþ?,äý_Pÿ-ªþ«×#ÿÃúÿʪÿÊõߨÿ Ô˪ÿêõߨÿ`ÁBù¢¡ê¿vý7öåõß²¡êÜúïý{ìÿÁÆîÏ¢!çÿk×#ÿÇÂSàÿ UÿÕë¿áÿa!¯ÿAòr¡é_Õ÷(ø?8 Æ\ÿ»Xÿ èÿÉûC4Tý×ö ÿ/ðȪÿQýÏVEè
mßâ ªþ«û?ÿaã¿l¨ú¯îÿÿø?dCÕíþÿèÿËúÿËÿ¯ìÿ@þ3ÿúªÿqý/çÿ^ø¿Y°h *þu}ÿÿjü«÷ÿ@þ
Üv ¹Põ_½ÿêXÀôO6TýWïÿõÐÿC6TýW÷ ÿÿeCÕuÿÖYÿC6TýW÷`ýø?dCÎÿ×îÿüðȪÿêý?Ðÿ
¼þÉËe°þ=eç#Ãü'ûÿè=öa¡ þÏûcXüOïÿ:øs@¿Øwí|ø°CçÿÁÇôÏ÷ÿþÎæÿ&½0EÿÏÞ];»ko¯î?4ÿwпÑyþïÖÿX@ý·l(ú?ìÿ~Eó§çÿmþ2ôÏ ô/²þÏþ
çÿÊöÿXÿgá|þÀý@%ú_tûuõ§Çÿm߯o^ÿ±Ö"ÿÇÂ[â?Û>lúç(ÿ9ýy@¾G6ú?®ÿÎQ¼þc´ÒÈÿ³PÿÇý?JÎQ>þ£¨ñ¯^ÿ
-ÿ'yÿÔË
ªÿêõßÈÿ²ü¯l¨ú¯\ÿüß, þ[6TýW¯ÿFÿO,/ªþk×;Ô°úoÙPõ?ný÷
þ½ÿÝECÎÿW¨ÿ>ªü¡þScügá)ðɪÿêõßðÿ°×ÿ y¹Ðô¯êû?,üPã?®ÿáÿÿ7BÃý!ªþ«û? àÿ
-Uÿ£ú?.ÿ¬VÐ?Ú¾Å- at .TýW÷ ÿÃÆÙPõ_½ÿ?ü_,Àÿ!ªþk÷ÿwð³þÿ²!çÿkù?|<ú? Îýèÿ)
-ªþÇõ¼ÿ£ÿ?/ÑÐô¯ëû?üPã_½ÿò¿,ä¶KpÈ
ªÿêþÔÿ°él¨ú¯ÜÿCE¬ÿ°þ²¡ê¿ºÿýÿXÀø/ªþ«÷ÿÀúðȪÿêþ¬ÿ° ÿlÈùÿjý?ÌaýW!ÿÏü²¡ê¿zÿôÿf!¯ÿAòr¬KÙùçÈpÿQÙwé¨è5üÄÿyÿÏÒsÿÓý_þ/,Pâß/ö];¾ìÐùÿÉþQáù
³ù¿(ädAÑÿ³÷g×ÎîÚÛ«{Áçÿ¼þy@ÿÙPôØÿýæO)׿Õý_X@¾O6dýýæÿ6@ÿ,Íÿ' ÜDQ¢ÿE·_§YzüßöýjøVàåùkBþ·Ä¶}ØôÎQ>ÿs6¢þÌÿdS ÿãú/áÃîÿIõ.¸¨UÎÿ+ü?ÅñÜÿ£äåã?úÿsAõúoø?XÈû¿ þ[.Tý£ÿÿúÿʪÿêõߨÿdõß²¡êýÿàÿ
-UÿèÿÿcúoÙPõ?ný÷
þQÿÍÆîÏ¢!çÿ+Ôø¿±ÿ/O!ÿK&TýW¯ÿÿ
¼þÉË
¦Ußÿúo¨ñ×ÿá.×Ðÿ
-÷h¨ú¯îÿþYÿC6Týêÿ¸xþ³ZAÿ,|hû· ¹Põ_ÝÿüÿeCÕuÿü_,Àÿ!ªþk÷ÿ·ð³õ^ÙóÿµýxþgáÌÿþâ ê\ÿÇËù¿×þo,6
-Mÿº¾ÿÃÀÿÁ5þÕû ÿËBn»\¨ú¯îÿ@ýþɪÿêý?°þ
ÃúȪÿêþôÿcã¿l¨ú¯îÿÀú/ðȪÿêþ¬ÿ°õ^ÙóÿµýÈÿ± ÿl¨ú¯ÞÿýXÈë¼\ë_;ÊÖ?ù?N÷ÿQþÿðÔ§$þÏcXüOïÿ:¦!ñgÿ~±ïÚùà-`Ëçÿ.øX8ÿ»ôÂd@$ý?ví쮽½¶|yþÏ{è¬ÿɤÿÃð¯kþrýcýô
-]ÿCgÿ¤ùúçà|þÀý@Eú_tûuõ§Çÿm߯ï^ÿ±N#ÿÇÂâ?Û>lúëç(ÿ9çáÿfùÙèÿ¸ \~òõ}¨ÿÀý¿>åñÜ ¤àåã¿1ñgÿðëãÿEý·öð³÷Aý·\Èú/( /ÿGÿaù_Ùõ_P ~Uÿõß: ÿ¨ÿ
-Yÿàõ_«PÿÅ
òECÖAøuý_Ôú/Pÿ-²þ
-À úØÿÝECÏÿ/ ¿ªÿËúoíÿcá)ðɬÿðëãÿEý·Ñðÿ°×ÿ y¹õ¯ªû?,üã?ªÿÃ]ú?Ðÿ
-÷hÈú¯íÿþYÿC6dýéÿ¸xþ³:@ÿ,|hû· ¹õ_ÛÿüÿeCÖeÿÿø?dCÖÿ¨þþÿÁÀÿÍú}Ëÿ¯ìÿÀó?çþôÿYÿ£ú?^Îÿ½Ñð³`Ñ T4Dýëêþÿäø×îÿü/¹í r!ë¿¶ÿõ?,`ú'²þ+÷ÿðXÿaý?dCÖmÿúÿ±ñ_6dý×îÿõ_àÿ
-YÿµýXÿaþÙÐóÿýÈÿ± ÿlÈú¯ÝÿýXÈë¼\ë°ñÏ#ÃüÊÚà£6Iÿ:Fþ,ÄÿyûÏÒsÿéý_ÿÿúPâß/ö];¾ìÐù¿¶6ïÿüß,ÍÿQXEÿÏÖ];»ko¯n?4ÿwпöyþï¡Pÿ-þÛ¿_Ñü)åù«ÖÿX@¾O6dýýÎÿÎóý?y8ÿî¢(Ñÿ¢Û¯Ó¬?=þoû~5|'ðòüµ& ÿÃÁ[â?Û>lúç(ÿ9áÿ`ó?Ùèÿ¸üK8ÇÀõã\pQ«ÿWùãÿ¸ýGÉ9ÊÇcâÏ5þåßúoÿe!ïÿúo¹Põ_PþM©ÿVù_°þ#ªþÊ¿)õß*ÂÿÉê¿eCÕAù7eý×`ÿg,/ªþÊ¿)õßÚ¢ÿ¨ÿ
-Uÿåßý{þO,hìþ,rþxùwÿK¹\ÿáUÄü
§Àÿ%ªþÊ¿)õßÚÂÿÃB^ÿäåBÓ¿ªíÿÐ1ÂÿÁ5þãú?ÜÅúOÿ
-÷h¨ú¯íÿ0Ð?ðȪÿQýÏVEè
mßâ ªþ«û?ÿaã¿l¨ú¯îÿÀúðȪÿqýýÿ½
ÿôÿ
-9ÿ_ËÿaýÑÿúOÎüèÿ)ªþÇõ¼ÿ{màÿfÁBð¢¡é¿l3 ÿä¿ÿjü«÷ÿ@þ
Üv ¹Põ_Ýÿú0ý
-UÿÕû`ýôÿ
-UÿÕýÈÿ²ñ_6TýW÷`ýø?dCÕuÿÖXÿC6äüµþêàÿÈÿ± ÿl¨ú¯Þÿý¿YÈë¼\ëßQvþ92Ìÿq²ÿÑcÿ
-âÿ¼ÿgé9Åÿôþ¯q?ø÷}×Îï ;tþ²ÿ_Äþï<Íÿuza2
-þ½?»vv×Þ^ݾ<ÿç=ôÏô.þû¿_Ñü)åú·ÚÁÿÃú?ȬÿÁ³Òüßè
óù÷QèÑí×iÖÿ·}¿¾xyþÇZüoÿlû°é£|þç,öäϲ)Ðÿqýpâõ£Ó×qÿç 8þû£|ü7F!þ,Pã_½þþOòþ/¨ÿUÿµë¿Ñÿä{dCÕõúoø¿Y@ý·l¨ú¯^ÿý?X°P¾h¨ú¯]ÿíPÿÁê¿eCÕÿ¸õßú÷þO4v
-9ÿ_«þÛcÿ<ÿ³ðø¿dBÕõúoøXÈë¼\húWõýþ¨ñ×ÿáÐÿÿ¡áþ
-UÿÕýÐ?xÞ
-Uÿ£ú?.ÿ¬VÐ?Ú¾Å- at .TýW÷ ÿÃÆÙPõ_½ÿ?ü_,Àÿ!ªþ«÷ÿÇú/èÿ/rþ¿ÿýÿ99÷ ÿ§4¨ú×ÿñrþþÿ\Xlø!þu}ÿ
ÿjü«÷ÿ@þ
Üv ¹Põ_Ýÿú0ý
-UÿÕû`ýôÿ
-UÿÕýèÿÇÆÙPõ_Ýÿõàÿ
-UÿµýèÿÃü²!çÿ«ù?ì±ÿúÿ² ÿl¨ú¯Þÿúg!¯ÿAòr¬]¶çË)ÃüÊGÒ¿òø¯TöÁÿQø?o Zxañºÿû¼ÿSDÿHñïû®Þvèüÿ×ø»ðüÏæÿ²!éÿÙü³kgwííµÍàËòYÿÞCÿ<@ï²!éÿ°üë?¥\ÿÖôaýdC×ÿÐÙ?iþïôÏÂùüý¿¥Q¤ÿE·_§Yzüßöýjð^àåùëTDþ7Ŷ}Øô×ÏQ>ÿsΣþ<ÿɦDÿÇàòs\ÿIª.êÜÿCü¸ÿ×§<þ£|ü7&`ýrü
-À¯ÿáåüO{ø?XÈû¿ þ[.dýÏÿcú#ôÏò=²!ë¿ üªþõEþG{Ô²úoÙõ_P NXÿµ
-ýX°P¾hÈú/( ¿®ûBÿÁhôaõß²!ë¿ ÿ`àÿdAc÷gÑÐóÿÃÀ¯êÿÂÿåµGþ
§Àÿ%²þ
-À¯ÿþ¥þÿ
¼þÉË
¨UÝÿúoÈñÕÿá.Öúÿ± áþ
-Yÿý
-úgÏ{²!ëLÿÇÅóÕúgáCÛ·¸È
¬ÿÚþäXÀø/²þkû?àÿbþÙõ?ªÿãåøÿôÿ
-=ÿ_×ÿü?çþôÿYÿ£ú?^Îÿ½Qð³`± hú×ÕýþÈñ¯Ýÿù_rÛ%8@äBÖíþ¨ÿaÓ?Ùõ_»ÿÖX@ÿÙõ_Ûÿþ,`ü
+UÿÕýXÿaþÙóÿµýÈÿ± ÿl¨ú¯ÞÿýXÈë¼\ëßSvþ92Ìÿq²ÿ1bÿ
+âÿ¼ÿgé9Åÿôþ¯ópø3@?ßuííð`Îÿé¿1ïÿ-ü?,ÍÿMza2
+þ½?ÛvvßÞ]Ý~hþï £óü߬ÿ±úoÙPôØÿýæO)Ïÿ[àÿaú
+Yÿgÿ
óåû+¬ÿ³p>ÿOà~ ýÏ»Ý*ÍúÓãÿ¦ï÷/ÏÿXëÿcá-ñmÖýsÏÿÃþ< ß#ý× ç(^ÿ1ZYäÿY(ÿãþ%ç(ÿ?ÔøW¯ÿÿ
¼ÿê¿åBÕíúoôÿäù_ÙPõ_½þþoPÿ-ªþ«×£ÿ'Ê
+Uÿµë¿ê?X@ý·l¨ú·þûBÿ>ÀÿÉÆîÏ¢!çÿ+ÔUþPÿi1þ³ðø¿dBÕõúoøXÈë¼\húWõýþ¨ñ×ÿáÐÿÿ¡áþ
+UÿÕýÐ?ðȪÿQýÏ6·þøÐö-nr¡ê¿ºÿù0þ˪ÿêýÿáÿbþÙPõ_½ÿ?üß, ÿ¿lÈùÿZþë¿úgáÜÿþÒ ê\ÿÇËù?úÿsaaø
+Mÿº¾ÿÃÂÿÁ5þÕû ÿËBn»\¨ú¯îÿ@ýþɪÿêý?°þÃúȪÿêþôÿcã¿l¨ú¯îÿÀúðȪÿÚþôÿáþÙóÿÕú£ÿùàÿ
+UÿÕû ÿ7yýË`ý[ÊÎ?Gû?tʾKG¥_áÿà þÏûcxüîÿ:8ôaÿ~¾ëÚÛá;Àÿìÿ
+ÿY8ÿ«B>@ý?{¶íì¾½»º|yþÏ{èôÿ
+Eÿý߯hþrý[Ðÿ
äûdCÖÿàÙ?iþïôÏÂÙüÀý@%úw»Uõ§ÇÿMß/o^ÿ±ÖEä8xKügu?àåó?ç4ê?XÀüO6ú?®ÿÎ1ìþU\Ô*çÿEþ
âø?îÿQròñýÿ¹ Æ¿zý7ü,äý_Pÿ-ªþÑÿÿÇ ýeCÕõúoÔ²úoÙPõþÿ?ðȪôÿÿ1@ý·l¨ú·þûBÿ¨ÿfBc÷gÑóÿê¿Oë?±ÿ/O!ÿK&TýW¯ÿÿ
¼þÉË
¦Ußÿúo¨ñ×ÿá.Öúÿ± áþ
+UÿµýúgþÙPõ?ªÿãâùÏj
+ý³ð¡í[ÜäBÕuÿò?,`ü
+UÿÕýð± ÿl¨ú¯ÝÿßÃÿÍÖ{eCÎÿWö ÿÏÃÿý?ÅAÕÿ¸þ
ó¯üß,Xl (þu}ÿÿjü«÷ÿ@þ
Üv ¹Põ_½ÿêXÀôO6TýWïÿõÐÿC6TýW÷ ÿÿeCÕuÿÖYÿC6TýW÷`ý¬÷Êÿ¯Ýÿù?àÿ
+UÿÕû ÿyýË`ýkGÙúçÀ0ÿÇéþ?êÐÿþúÄÿyÐÂsÿéý_GãHñïç»®½¼,aþSÿ8ÿ»ôÂd@$ý?¶íì¾½»¶|yþÏè¬ÿɤÿÃð¯kþrýcýô
+]ÿCgÿù¿súgá|þÀý@Eúw»Uõ§ÇÿMß/ï^ÿI¿Eþ
7ŶyX÷×ÏQ>ÿs.ÂÿÍò=²)Ñÿq¸üåë?úPÿû}Êãÿ¸HÁ9ÊÇcâÏ9þà×ÇÿËúïÿ7yÿÔË
¬ÿðòùÔùÿ
+YÿàWõÿõßýÿX@ý·lÈú/( '¬ÿZú/,/²þ
+À¯ëÿ¢þÛ8Ô±úoÙõ_P NÐÀþ?<hìþ,zþxøUýÿFýwDþ
§Àÿ%²þ
+À¯ÿõ߯ÂÿÃB^ÿäåBÔ¿ªîÿ0ðp@ÿ¨þw¹þþ,h¸?DCÖmÿôÏü²!ëLÿÇÅó5
+úgáCÛ·¸È
¬ÿÚþäXÀø/²þ+û?,ü_,Àÿ!²þGõ\ôÿþoÐï[6ôüeÿÿY8÷ ÿ§4ÈúÕÿñrþï
ÿ ¢!ê_W÷Xø?8 Ç¿vÿäYÈmà Yÿµý¨ÿaÓ?Ùõ_»ÿÖX@ÿÙõ_Ûÿþ,`ü
+YÿµýXÿeþÙõ_Ùÿþ?<Àÿ!zþ¿²ÿù?àÿ
+Yÿµû ÿyýËpý6þydÿCY|Ô&é_ÇÑÿ
ø?oÿYzañ?½ÿëÃóâ_Jüûù®koo ;tþå7þHCR4ð³p6ÿWFa=@ý?[¶íì¾½»ºüÐüßAÿÚçù¿þy@ý·l(ú?lÿ~Eó§çÿöXÿcù>Ùõ?xö_8ÿW:Ïÿ-öÿäálþo¸¢Dÿón·J³þôø¿éûåðÀËó?Ö:üoÿló°î£|þçÿÌÿdS ÿãò/á×êIøÊheÿg¡8þÛ£|üO þ,Pã_PþMªÿÖÈÿ²÷Aý·\¨ú/(ÿ¦Ô+ü/Xÿ
+Uÿåߤúo
+ÿ'¨ÿ
+Uÿåßõ_ýy°P¾h¨ú/(ÿ¦Ôkþo, þ[6TýSôï=ú?± ±û³hÈùÿáåßEþ/åì¡þ[cþÏÂSàÿ Uÿåßúoíáÿa!¯ÿAòr¡é_U÷è ÿÔøëÿpë?
+þ4Ü¢¡ê¿ºÿúgþÙPõ?ªÿãâùÏæ6 Ð?Ú¾Å- at .TýW÷ ÿÃÆÙPõ_Ýÿõàÿ
+Uÿãú?.úÿ{ÿ7èÿ/rþ¿ÿÃú£ÿõ,ù?ÐÿSTýëÿx9ÿ÷ùËÐ?
+Mÿeüþ¨ñ¯Þÿù_rÛ%8@äBÕuÿêXÀôO6TýWïÿõÐÿC6TýW÷ ÿËÆÙPõ_Ýÿõ_àÿ
+UÿÕýXÿaþÙóÿÕú¨Ãú¯Bþø?dCÕíþèÿÍC^ÿäå2Xÿ²óÏaþýtû¿°Pÿçý?KÏ1,þ§÷Eü9 Ä¿ïºövø°Cçÿ'ûÿEìÿÎÃÙü_§&¢ èÿÙû³mg÷íÝÕ½àËóÞCÿ<@ﲡèÿ°ÿûÍR®«ü?, ÿlÈú<û'ÍÿþY8ÿ'p?EþçÝnfýéñÓ÷Ëá[ç¬õÈÿ±ðøÏ6ë~À9ÊçÎaÿGðü'ý× ç(^ÿ1ZYäÿY(ÿãþ%ç(ÿ?ÔøW¯ÿÿ
¼ÿê¿åBÕíúoôÿäùÙPõ_½þþoPÿ-ªþ«×cÿ,/ªþ«×£þÔ˪ÿqë¿/ôïü,hìþ,rþ¿Vý·9Öâù§Àÿ%ªþk×£ÿyýMÿª¾ÿCÃÿÁ5þãú?úÿ#4Ü¢¡ê¿ºÿúgÏ{²¡êTÿÇÅóÕúgáCÛ·¸È
ªÿêþäXÀø/ªþ«û?àÿbþÙPõ_½ÿ?ÖY@ÿÙóÿÕüèÿÏɹÿý?¥AÕÿ¸þóôÿçÂbÃÑÐô¯ëû?üPã_½ÿò¿,ä¶KpÈ
ªÿêþÔÿ°él¨ú¯Þÿë?, ÿl¨ú¯îÿ@ÿ?0þ˪ÿêþ¬ÿ° ÿl¨ú¯îÿÀúðÈÿ¯æÿ°ÇþèÿËü²¡ê¿zÿè
¼þÉËe°þuÙ/§ó(}H¿äñ_©ìÿÿ£>%ñÞ ´ðÃâÿtÿ÷yÿ§þ/<âßÏw]{;xØ¡óÿ_ãïbÄó?ÿˤÿgó϶ݷw×6/Ëÿeý{ýó ½Ë¤ÿÃð¯kþrý[ãÐÿ
ô
+]ÿCgÿ¤ù¿Ð?çóôÿFþçÝnfýéñÓ÷ËÁ{ç¬3ùÞ
ÿÙæaÝ_?GùüϹúðü'ýËÏ1pý'Ïúîsÿ}ðàþ_òø?n RpòñßX
õÈñ/( ¿>þó?áÿ`!ïÿúo¹õ_P ^>ÿÚ"ÿÃò=²!ë¿ üªþõEþGGÔ²úoÙõ_P NXÿµýX°P¾hÈú/( ¿®ûBÿÁXôaõß²!ë¿ ÿ`áÿdAc÷gÑÐóÿÃÀ¯êÿÂÿåuDþ
§Àÿ%²þ
+À¯ÿþ¥þ
ÿ
¼þÉË
¨UÙÿa"ê¿Y ÇTÿ»Xÿ èÿÇûC4dýWöè<ïɬÿ1ýÏVGè
mßâ ²þkû?ÿaã¿lÈú¯íÿÿø?dCÖÿ¨þãþoÐÿ_6ôü]ÿòÿ<û?ÐÿSdýêÿx9ÿ÷ÆÀÿÍÅ¢!ê_Wïÿ¡àÿàÿÚý?ÿe!·]D.dý×ö þLÿdCÖíþXÿaý?dCÖmÿúÿ±ñ_6dý×ö`ýø?dCÖmÿÖXÿC6ôüeÿò,Àÿ!²þk÷ÿ@ÿòú$/áú·óîÿîð°Pÿçý?Ï1,þO÷ÿ÷¹ÿ3â_Rüûù®koï ;tþ|LÿyüÏKÿ8ÿôÂd@$ý?{¶íì¾½»¶üÐüßAÿFgýÿ¨ÿ
+Iÿýß_×ü)eùÿ<ÿ³Æaýè_6týýÎÿ;ìÿàÿcá|þÀý@Eúw»Uõ§ÇÿMß/o^ÿI¿Eþ
7ŶyX÷×ÏQ>ÿsþoïMþë¿åç(_ÿÉwÜÿ9(ÿãþç(ÿU?äøW«ÿØÿ¼ÿê¿åBÖµúïp¨ÿ¶Èÿ²ü¯lÈú¯VÿÐÿÔˬÿjõßáXÿú/,/²þ«Õcý7ê¿X@ý·lÈúµþûBÿÁÁÿÉÆîÏ¢¡çÿǯÿ>ªõ
+ã?O!ÿK&dýW«ÿÇúoøXÈë¼\úWÕýþÈñÕÿá.×PÿËûC4dý×ö@ÿ,Àÿ!²þÇô\<ÿY£ >´}[\Èú¯íÿ@þÿ²!ë¿¶ÿþ/àÿ
+YÿÕúÿýþoÐÿ_6ôü%ÿGÿôϹÿý?¥AÖÿ¨þóo°ÿ//Ñõ¯«û?üã_»ÿò¿,ä¶KpÈ
¬ÿÚþÔÿ°élÈú¯Ýÿë?, ÿlÈú¯íÿ@ÿ?0þˬÿÚþ¬ÿ° ÿlÈú¯íÿÀúðÈÿ¯ÕÿÃýÈÿ³ ÿlÈú¯Ýÿý¿YÈë¼\é{³_õ7ÛÍ/Iõûöó°òÑáù÷²<þuü9'+|Àþ_ö°¬Iú×1Fôÿa¡ þÏÛÿcXüOïÿúÿAüëC?ßuííð
+ >ÿìÿ5ÖÿY8{þWZ¡\ý?[ÿ¶íì¾½ën·¯£|þï=ôÏæÿ²¡è¶Ù]Õü)çíñüÏô/²þÏþIóýÿx8ÿ§ `þ/ýÏ»Ý*ÍúÓãÿ¦ïÝà<PyþÇÚôeäxKügu?àåó?ç°ÿÿɦ@ÿGûá×êZåü¿2Èÿ³PÿÇíJÎQ>þ£¨ñ/hÿ@êÿ Ñÿ
¼ÿú?È
ªÿöþ
+þ/ï
+UÿíHý4üß, ÿl¨ú/hÿ@Yÿ5ØÿåªÿöþÚ£þô
+Uÿí(ú÷þO4v
+9ÿ?¼ýÁÿ~Eþ
§Àÿ%ªþÚ?Pú?hÿyýMÿeÅà$ÿÿjüÇõ¸õ
þ¿,h¸?DCÕuÿôÏ÷dCÕÿ¨þç?«5ô϶oqUÿµýèÿÍÆÙPõ_ÝÿÿðȪÿqýûxÿ7ØÿC6äümÿÿY8ó ÿ§8¨ú×ÿñrþïµÿ
+ at ECÓ¿®ïÿðp@íþèÿÅCn»\¨ú¯îÿ@ýþɪÿêý?°þÃúȪÿêý?Ðÿÿ²¡ê¿ºÿë¿,Àÿ!ªþ«û?°þÃü²!çÿkû?ÿcþÙPõ_½ÿúÿ°×ÿ y¹Öÿ²óÏaþýtû¿±Pÿçý?KÏ1,þ§÷öÿaÿ~¾ëÚÛá;ÀÏÿ]4ÿ³ù¿l(úöþlÛÙ}{wu/øòü÷Ð?ØÿS6ýö¿¢ùSÊõouÀó?пlÈú<û'Íÿúóp6ÿGÿoqèÞíViÖÿ7}¿¾xyþÇZüoÿló°î£|þçFýÿɦ@ÿÇõ_Â9×Vùãÿ¸ÿGÉ9ÊÇÿâÏ5þµë¿
+ê?XÈû¿ þ[.Tý×®ÿöÈÿ°|l¨ú¯]ÿmPÿÅê¿eCÕíúoôÿæÁBù¢¡ê¿výw@ý'¨ÿ
+UÿãÖ_èßø?YÐØýY4äüåúoüO!ÿK&Tý×®ÿöðÿ°×ÿ y¹Ðô¯êû?<üPã?®ÿÃaÿçoûC4TýW÷@ÿ,àyO6Týêÿ¸xþ³Ú@ÿ,|hû· ¹Põ_½ÿ?ò?,`ü
+UÿÕýð± ÿl¨ú¯Ýÿ?ÀÿÍúÿËÿ¯íÿÀó?gþôÿUÿãú?^Îÿ½Æþ?<Xl (þu}ÿGÿjük÷ÿ@ÿ/rÛ%8@äBÕuÿêXÀôO6TýWïÿõÐÿC6TýWïÿþ,`ü
+UÿÕýXÿeþÙPõ_Ýÿõàÿ
+9ÿ_ÛÿüðȪÿêý?Ðÿ
¼þÉËe°þ§ó(kÚdý àÿ` þÏûcXüOïÿ:äü/â_
Jüûù®koï ;tþå¯ÍûÿEõ?ÎçÿFa=@ý?{¶íì¾½»ºüÐüßAÿéÁ?Íÿ=ôÏ÷eCÑÿaÿ÷+?¥<ÿouÿìÿ+²þÏþçÿJöÿVÈÿ³p6ÿÏu7¸¢Dÿón·J³þôø¿éûåðÀËó?Özôÿeá-ñmÖýsÏÿÃþÏ<`þ'ý× ç¸þT\Ô*çÿCþ
âø?îÿQròñßø³@íúoÔñ÷Aý·\¨ú¯^ÿü/Xÿ
+UÿÕë¿QÿÁê¿eCÕõúoÔ²`¡|ÑPõ_½þýY@ý·l¨ú·þûBÿ> þÝECÎÿW¨ÿÎþ/åì¡þÓ`þÏÂSàÿ Uÿµë¿ü?,äõ?H^.4ý+ôÿÿA Æ\ÿ»ìÿÿ?îÑPõþÿ?ðȪÿQýÏVè
mßâ ªþÑÿÿÇ ã¿l¨úGÿÿø?dCÕ?úÿÿ ÿ¿lÈùÿZþëþÔ²pæÿ@ÿOqPõ?®ÿãåüßkÿ7
+Mÿº¾ÿ#ÂÿÁ5þÕû ÿËBn»\¨ú¯îÿ@ýþɪÿêý?°þÃúȪÿêþäYÀø/ªþ«û?°þËü²¡ê¿ºÿë?,Àÿ!rþ¿ZÿuXÿÕÈÿ± ÿl¨ú¯Ýÿý¿yÈë¼\ë_{ÊÖ?û?téY
+C*÷ÿ
ÿ£>%ñÞ ´ðÃãïÿÙÿ«£q?¤ø÷ó]×ÞÞ¶`þ¯:ø¿Fþ
³ùÿ$½0IÿÏæm;»oï®m_ÿ;è?(¬ÿ³þÿ²!éÿ°üë?e¨þóøï9®ÿ#ÿÏú?È®ÿ¡³ÿáóÿ_Çç°þÏÃùü?û(ô?ïv«4ëOÿ¾_Þ¼<ÿSÈÿpð¦øÏ6ëþú9Êÿÿ±|lJô\ .?ǰûÿaÖç¢Îþ}èÿû}Êãÿ¸HÁ9ÊÇcÖX Ç¿ üúø^ÎÿÒqÿ9Èû¿ þ[.dýÏÿ£¶Èÿ°ü¯lÈú/( ¿ª}ÿÑþOPÿ-²þ
+ÀËÇk
+ê?XÿC6dý_׿}¡ÿ`ú¿±úoÙõ_P NÐpð² ±û³hèùÿáàWõáÿò:"ÿÇÂSàÿ Yÿà×ÇÿRÿÆÂÿÃB^ÿäåBÔ¿ªîÿ@ý7äøêÿpë?¨ÿeAÃý!²þkû? àÿ
+Yÿcú?.ÿ¬QÐ?Ú¾Å- at .dý×ö ÿÃÆÙõ_ÙÿaáÿbþÙõ?ªÿãåø
ÿ¬÷Êÿßÿqèÿeë¿xþçáÜÿþÒ ëTÿÇËù¿7þo,6ü
+QÿººÿÃÂÿÁ9þµû ÿËBn»\Èú¯íÿ@ýþɬÿÚý?°þÃúȬÿÚþôÿcã¿lÈú¯íÿÀú/ðȬÿÊþôÿáþÙÐóÿüVûàùø?dCÖíþèÿÃB^ÿäå2\ÿE3û?t*ïÿªðpPÿçý?Ï1<þO÷Bü9 Å¿ïºövð°Cçÿ'ûÿEÌÿy8ÿç LDAÒÿ³÷gÛÎîÛ»k{Áçÿ¼þy@ÿÙôØÿýuÍR®õ?&ï
+]ÿCgÿ¤ù¿óÐ?çùôÿFþçÝnfýéñÓ÷ËÁ[ç¬3Øÿ
7ŶyX÷×ÏQ>ÿs.ÂÿÁæ²)Ñÿqý·üÃîÿYõÁEýén qÿç <þû£|ü7Vaýrük×£ÿyÿÔË
¬ÿÊõßùÐÿW6dý×®ÿÿÔˬÿÚõßèÿÂü²!ë¿vý7ú¿±úoÙõ?jý÷
þöÿàAc÷gÑÐóÿã×ø¿u@þ
§Àÿ%²þk×ÃÿÃB^ÿäåBÔ¿ªìÿ0õß,ã?ªÿÃ]¬ÿôÿdAÃý!²þkû? àÿ
+Yÿcú?.ÿl:úçàCÛ·¸È
¬ÿÚþäXÀø/²þkû?àÿbþÙõ_¹ÿ?úÿòõ^ÙÐóÿýxþgáÌÿþâ ëTÿÇËù¿7þo,6
+QÿEüþÈñ¯Ýÿù_rÛ%8@äBÖmÿêXÀôO6dý×îÿõÐÿC6dý×ö ÿÿeCÖmÿÖYÿC6dý×ö`ý¬÷Êÿ¯ìÿ@þø?dCÖåþèÿÍC^ÿäå2\ÿE-?ÎìÿÐ1ZþU¾
+ÀÿÁ@Iü÷ÿ,<Çàø
îÿ!ïÿ
+öÿaÿ~¾ëÚÛÁ;ÀÍÿsü]Äþï<ÏÿÂd@$ý?{¶íì¾½»¶|Yþ/ëß{è¬ÿɤÿÃþï¯kþrý[cñüÏöÿ
+]ÿCgÿ¤ù¿óÐ?góÀý@Eúw»Uõ§ÇÿMß/o^ÿ±Î ÿÇÂâ?Û<¬ûëç(ÿ9ú/0ÿMþë¿åçvÿϪ.jóÿé¸ÿsPÿÇý?
+ÎQ>þ«Èñ¯Vÿõ_¨ÿ`!ïÿúo¹õ_þ;ë¿ÿaýeCÖµúïÇñõ_, þ[6dýW«ÿÇúoô`ÁBù¢!ë¿Zýw8Ö£þÔˬÿQë¿/ô,ü,hìþ,zþ¿Výw8Ö#ÿÇÂSàÿ YÿÕê¿ú7þòú$/¢þÁ þë¿àÿ¨9þ£ú?ÜÅúöâAÃý!²þkû? àÿ
+Yÿcú?.ÿl:úçàCÛ·¸È
¬ÿÚþäXÀø/²þkû?àÿbþÙõ_ÿÿ£ÿþoÐï[6ôüeÿÿY8ó ÿ§8ÈúÕÿñrþïÿ ¢!ê_W÷Dø?8 Ç¿vÿäYÈmà Yÿµý¨ÿaÓ?Ùõ_»ÿÖX@ÿÙõ_Ûÿþ,`ü
YÿµýXÿeþÙõ_Ûÿõàÿ
-=ÿ_¹ÿò,Àÿ!²þk÷ÿ@ÿòú$/áú·óîÿ£
ÿ
ø?ïÿYxañºÿ¼ÿSÌýÿúâß/ö];¼ìÐùð1ý3æýÿbÄøÏÂÙüߤ&¢ éÿÙû³kgwííµ½àæÿú7:Ïÿ}ÿÔˤÿÃþï¯kþ²üÿYc°þÏô/ºþÎþçÿéÁ/gü,Ïÿ¸¢Hÿn¿N³þôø¿íûÕàÀËó?ÖiäÿXxSügÛMýåó?çàÿæùÙèÿ¸þ[~òõ"òÿ,ÇÿqÿsÿÆÄrü«ÕìÿÌHÞÿõßr!ë¿Zýw8Ö#ÿËò¿²!ë¿Zýw@ÿFPÿ-²þ«Õcý7ê¿X°P¾hÈú¯VÿõߨÿÔˬÿQë¿/ôn Ð?»?ÿ¿þ;ø¨b8ÖGÿ,<
þ/õ_þ;ë¿áÿa!¯ÿAòr!ê_U÷ø?8 ÇTÿ»\ÿAý/îÑõ_Ûÿý³ ÿlÈúÓÿqñüguþYøÐö-nr!ë¿¶ÿù0þˬÿÊþôÿæþÙõ_ÿÿÑÿ¡áÿfýÿeCÏÿWòøxðè
sÿúJ¬ÿQý/çÿÞ`ÿ_,_¢!ê_W÷Xø?8 Ç¿vÿäYÈmà Yÿµý¨ÿaÓ?Ùõ_»ÿÖX@ÿÙõ_Ûÿþ,`ü
-YÿµýXÿa
þÙõ_Ùÿþ?<Àÿ!zþ¿Vÿsô ÿÏü²!ë¿vÿôÿf!¯ÿAòr¦ÿû$üùÍýº¿ÙmIª¿o?Ûúñ !ÿ
-ÿYÀx/ÁãQÇs²ÂìÿeÀ¤£Gÿ
-âÿ¼ýoé9Åÿôþ¯ùÄ¿>ø÷}×Îo =ôùÿdÿϱþÏÂÙó¿Ò
-õಠèÿÙú·kgwímw³¿zòù¿wÐ?ÿË¢ÿÙvUó§ÿµÅó?пlÈú<û'Íÿ-öÿãálþù¿,Jô¿èöë4ëOÿÛ¾_uó@åùkGþ·Ä¶}ØôÎQ>ÿsû¿ðùl
-ô´Î1pýÇ8\Ô*çÿsIîÿÇÿqûsÿÆ(ÄjüÚ?Pú?¨þß,äýÐÿA.Tý´ ôPðñ|l¨ú/hÿ@éÿ "üß, ÿl¨ú/hÿ@Yÿ5ØÿåªÿöþéÐ?èÿ ªþÚ?Pôï-ü,hìþ.rþxûÿË+ìÿÁÃSàÿ Uÿí(ý´
ÿ
¼þÉË
¦ÿ²bpÿCçú/ø?êCÿ¸þw±þÐÿ
-÷h¨ú¯îÿþYÀól¨úÕÿqñügÓ|úçàCÛ·¸È
ªÿêþäXÀø/ªþ«û?àÿbþÙPõ?®ÿãbÿoáÿfûÈÿ¯íÿÀó?gþôÿUÿãú?^Îÿ½6ð³`±¨hhú×õýþ¨ñ¯Þÿù_rÛ%8@äBÕuÿêXÀôO6TýWïÿõÐÿC6TýW÷ ÿÿeCÕuÿÖYÿC6TýW÷`ýø?dCÎÿ×ö ÿÇü²¡ê¿vÿôÿæ!¯ÿAòr¬ÿ eç#Ãü'ûÿèÿø?ïÿYzañ?½ÿë`±ÿø÷}×Îï [>ÿwQaþÏæÿ²¡èÿÙû³kgwííÕ½àËóÞCÿ<`ÿOÙPôØÿýæO)׿ÕÏÿ,@ÿ²!ëðì4ÿ·èÿÍÃÙüý¿ÅQ¢ÿE·_§YzüßöýjøVàåùk-ò,¼%þ³íæpòùs
-õ_,`þ'ý× ç(^ÿ1éÈÿ³PÿÇý?JÎQ>þt þPã_¹þ[+Ô°÷Aý·\¨ú¯]ÿmÿaùÙPõ_¹þ[+Ô±úoÙPõ_»þý¿y°P¾h¨ú¯]ÿíPÿÉê¿eCÕÿ¸õßú÷þO4v
-9ÿ_¹þ;"ÿÇÂSàÿ Uÿµë¿ü?,äõ?H^.4ý«êþ\ÿÿG}¨ñ×ÿá°ÿó7BÃý!ªþ«û? ð¼'ªþGõ\<ÿY >´}[\¨ú¯îÿ@þÿ²¡ê¿ºÿþ/àÿ
-Uÿµûÿ;ø¿Y@ÿÙóÿµýxþgáÌÿþâ ê\ÿÇËù¿×Øÿ
- ECÓ¿®ïÿðp@õþÈÿ²Û.Á"ªþ«û?Pÿ没ê¿zÿ¬ÿ°þ²¡ê¿ºÿýÿXÀø/ªþ«û?°þËü²¡ê¿ºÿë?,Àÿ!rþ¿¶ÿù?àÿ
-Uÿµû ÿ7yýË`ýO);ÿæÿPÖµIú×1ÿñÞÿ³ôÃâzÿ×!çÿúPâß/ö];¾ìÐù¿¶6ïÿîÿ98ÿ
õ YPôÿìýÙµ³»ööê^ðCóýkçÿúçÏû²¡èÿ°ÿûÍRÿ·ÚÃÿËöÿ
-Yÿgÿ
ó¥óüßäÿY8ÿî¢(Ñÿ¢Û¯Ó¬?=þoû~5|+ðòüµýYxKügÛM?àåó?ç°ÿ3ÿɦ@ÿÇõ_Â9®ÿ$ÕµÊùÿô?Üÿ9(ÿãþ%ç(ÿÑ?ÔøW¯ÿFþ
¼ÿê¿åBÕíúoìÿÄÖdCÕõúoÔ°úoÙPõ_½þõ,X(_4TýW¯ÿFÿ_Pÿ-ªþÇÿ¾Ð¿w¨ÿbAc÷gÑóÿ꿳ÿK9{¨ÿTÿ³ðø¿dBÕíúoÿyýMÿ
-ýÿ¨ñ×ÿá^æÑÿ
-÷h¨úGÿÿø?dCÕÿ¨þç?«ô϶oqUÿèÿÿcñ_6Tý£ÿÿü²¡êýÿÐÿ_6äü-ÿõGÿê?Y8ó ÿ§8¨ú×ÿñrþïµ
ÿÁ¦]¿ÿÿjü«÷ÿ@þ
Üv ¹Põ_Ýÿú0ý
-UÿÕû`ýôÿ
-UÿÕýÈÿ²ñ_6TýW÷`ýø?dCÕuÿÖXÿC6äüµþ¹ÿ¿Wù?àÿ
-UÿÕû ÿ7yýË`ýkOÙúçÀpÿ1=¤aHåþ¿ðÔ§$þÏcxüóý?ûuLCâÏ )þýbßµóÁ[ÀÌÿUP9þ.FäÿY8ÿOÒQôÿlþÙµ³»ööÚfðeù¿CýXÿgýÿeCÒÿaø×5ÊPýçñßs\ÿGþô
-]ÿCgÿÃçÿ¿ÿÎaýóù÷QéÑí×iÖÿ·}¿¼xyþÇ:mÿáàMñm6ýõs?ÿ9ç1ÿcùÙèÿ¸ \~a÷ÿ¬úà¢Îþ}èÿû}Êãÿ¸HÁ9ÊÇcÖX Ç¿ üúø^Îÿ´Gÿ_òþ/¨ÿYÿàåóÿ¨5ò?, ÿ+²þ
-À¯ê__ätÿÔˬÿðòñßZ
úàÿ
-Yÿà×õo_è?þo, þ[6dýôü,hìþ,zþxøUý_ø¿¼öÈÿ±ðø¿dBÖAøõñ߿ԿÑðÿ°×ÿ y¹õ¯ªû?PÿÍ9þ£ú?Ü¥ÿõ¿,h¸?DCÖmÿôÏü²!ëLÿÇÅóÕúgáCÛ·¸È
¬ÿÚþäXÀø/²þ+û?4ü_,Àÿ!²þGõ¼ÿC0ð³õ^ÙÐóÿãû?ý¿ÌÑÿçÎýèÿ)
-²þGõ¼ÿ{£áÿfÁbÃÑõ¯«û?üã_»ÿò¿,ä¶KpÈ
¬ÿÚþÔÿ°élÈú¯ÜÿÃcýôÿ
-YÿµýèÿÇÆÙõ_»ÿÖYÿC6dý×ö`ýø?dCÏÿWòXuìÿçàÿ
-Yÿµû ÿyýËpýY>ÎîÿÐ1ª¼ÿkDø?8(ÿóþ
çÿ§û¿J#þâß/ö];¼ìÐùÿÉþóÎæÿù QôÿìýÙµ³»ööÚ^ðåù?ï¡Ðÿ_6$ýö]ó§ëßbý äûdC×ÿÐÙ?iþïôÏÂyþý¿¥Q¤ÿE·_§YzüßöýjðVàåùëöÿfáMñm6ýõsÏÿóð°ùlJô\ÿ-?ǰûV}pQgÿVÑàþÏAyü÷ÿ(8GùøoLÀúäø×®ÿFÿòþ/¨ÿYÿµë¿ÿaýeCÖíúoø?Y@ý·lÈú¯]ÿþ/,Àÿ!²þk÷ÿGÿ7Pÿ-²þGÿ¾ÐÀþ<hìþ,zþüúïÿ·öÈÿ±ðø¿dBÖíúoøXÈë¼\úWµýõß,ã?ªÿÃ]¬ÿ8ôÿdAÃý!²þ+û?Ðÿø?dCÖÿþç?«=ô϶oqYÿµýÈÿ°ñ_6dý×öÀÿÅü²!ë¿rÿôÿåë½²¡çÿëú?ÿçáÌÿþâ ëTÿÇËù¿7
-þo,6
-QÿEPüAÁÿÁ9þµû ÿËBn»\Èú¯íÿ@ýþɬÿÚý?°þÃúȬÿÚþôÿcã¿lÈú¯íÿÀú/ðȬÿÚþ¬ÿ°õ^ÙÐóÿýÈÿ± ÿlÈú¯ÝÿýXÈë¼\뿨åÇý:F«uÒ`ÿ7Jâÿ¼ÿgá9Çÿpÿyÿ§¨°ÿ¤ø÷}×Îï [6ÿÏñwû¿óp>ÿw
-YôÿìýÙµ³»ööÚ^ðeù¿¬ï¡°þ'þû¿¿®ùSÊõoÁó?ØÿW6týýæÿÎAÿ,ÍÿÓÇù¿,ô¿èöë4ëOÿÛ¾_
-Þ
-¼<ÿcBþ
7Ŷ}Øô×ÏQ>ÿsõ_<`þ'ý×ËÏ1ìþU\Ô*çÿUDþ
òø?îÿQpòñßø³@µúïp¬ÿBýyÿÔË
¬ÿjõßáPÿ
-ÿèÿ+²þ«Õ?ÿ¨ÿbõß²!ë¿Zýw8Ö£ÿÊ
-YÿÕê¿Ã±þõ, þ[6dýZÿ}¡ÿ áÿdAc÷gÑÐóÿµê¿þoíÿcá)ðɬÿjõßáXÿ
-ÿyýQÿEÅàÿG®ÿÿ£>äøêÿpë?Øÿ
-÷hÈú¯ìÿPÐ?ðȬÿ1ýÏV{è
mßâ ²þkû?ÿaã¿lÈú¯íÿÿø?dCÖµþÿþø¿Y@¿oÙÐóÿuýÈÿópæÿ@ÿOqõ?ªÿãåüßÿ7
- at ECÔ¿®ÞÿCÁÿÁ9þµû ÿËBn»\Èú¯íÿ@ýþɬÿÚý?°þÃúȬÿÚþôÿcã¿lÈú¯íÿÀú/ðȬÿÚþ¬ÿ° ÿlèùÿÊþäÿXÿC6dý×îÿþ?,äõ?H^.Ãô?¿YÏnvÛ_èïÛÏÃv~<BÈÿyü?ØÿK6ÇÿHØøë¬ðaþ/£²ïÒQùpø¿(ÿóö¿¥çÿ§û¿ýX Ä¿_ì»v>|è¡ÏÿÁGå£ÏûFÿgÏÿôÂ|@ý?[ÿví쮽ínóWÏQ>ÿ÷õ<`ÿÙPô?Ûî¯jþ¡ú?ÿAaÿ/FÐÿE6dýýSÖÿ
-¨ÿfá|þÀý@%ú_tûuõ§Çÿm߯ºÁy òüµÖ!ÿÃÁ[â?Û>lúç(þs6ÂÿÁò=²)ÐÿÑþA8ǰûR½.êüü§Fþ
âø?nÿSròñß
ø³@AûRÿÿyÿ'ôUÿí(ýEþäeCÕAûRÿÔóþ²¡ê¿ ýÅÿî Ð?ðȪÿöþÚ¡þô
-Uÿí(ú÷þO4v
-9ÿ?¼ý¥ÿÈÿ±ðø¿dBÕAûJÿmáÿa!¯ÿAòr¡é_Õ÷ þjüÇõ¸ù_QÿÃûC4TýW÷@ÿ,Àÿ!ªþGõ\<ÿÙôoèmßâ ªþkû?ò?,`ü
-UÿÕýð± ÿl¨ú×ÿq±ÿwð³õ^Ùó
ÿüÑ7þ<ø?ðüϹÿý?¥AÕÿ¸þó¯-üß,Xl *þu}ÿGÿjü+÷ÿPèÿÅCn»\¨ú¯îÿ@ýþɪÿêý?°þÃúȪÿêý?Ðÿÿ²¡ê¿ºÿë¿,Àÿ!ªþ«û?°þÃü²!çÿ+ø?û¿éÿÏÿLÀÿ!ªþ«÷ÿ@ÿòú$/ëúßlç¤]~eÿãqÿߥ£L~þÿ£>ãÿQÖôåañ?½ÿ§kA!þÅ?MáøÇx%þ&Û¾±9þénÆóÓè¿î%Qü
-á¤øÄÒøSîɤø{Ä¢ø§¾6}\Cö|=%ؽòü§ÝËç?£4ü_,äÞ,}æÜvꬱïµ^Þß7êøß¶ûny»I\nún¿êÚÏÝá{R\x¿Úf`¾BN~È6ï|üK¤þSzÿ·sîÿ÷Jã¯]ù9(ñÿY(ÿº[/7¶¥ç¸2þ§¹¾~1þë 0þ³ðþ/!ºùs·þÛ¶oWh2:ÄhÍÝOøÓ¾ë_o´UqÌäüï»ùã
-S39;à_gýòóÓH?Bk;9à?6íé!zê7êäË}ÿõù:{ÿo¿ì»íìîô Óð§åªû¯ö¶»?`¦«ÎNñçv·ûõH¸ÉÔ¾ÉÝl7'?¡i¦ÖÓòÿÖ~\ýzgüåO½ùy.»tÌ~ëMþqû°uç¿çÙ]µO¿l6áìÿîf«v¹~:
ºxö[üõçÍþxÈãÏqÁëÃ'ù/HÀJñøO8iþ§1þsPÂôøsP¬B4ÿÇóEñ/Ó¦&
ç¸ÿ»ôë4[Áüìhïÿ éþñ
ÒøSîɤùBü9(ÿU³÷opuü¿Øÿ1}õ,<
ààÿþÀt@¥úÎA¹ÿkÜÿY(ÿpRüÿc¡xþO0æÿð²P )þð²P¤ÜÿY($ôü xÿ§ØF À
\ No newline at end of file
+=ÿ_ÙÿüðȬÿÊý?Ðÿ¼þÉËeþ÷Iø·7«ÙÍvóKý¾ý<lçÇ#üwÈÿ³ý¿d3xü¿É
+æÿÒ1*û.£ÿø?oÿ[záñºÿëàÐÿJüûù®koo =ôù?ø¨|ôyÿÏèàÿcáìù^¢ÿgëß¶Ý·wÝÍâöÕsÏÿ½GýØÿC6ýÏ6»«?e¨þãPØÿô
+Yÿgÿõ?çê¿Y8ÿ'p?EþçÝnfýéñÓ÷Ënp¨<ÿc·ÈÿpðøÏ6ë~À9ÊÿÓð°|l
+ô´Î1ìþU\ÔùùO+ü?ÅñÜþ§äåãñgÿö¤þþ/òþOèÿ ªþÚ?Pú?(üÈÿʪÿö¤þ¨ÿæýdCÕAûÿÛxø¿XÿC6Tý´ ôÐõ, ÿl¨ú/hÿ@ѿ𲠱û»hÈùÿáíHý4ò,<
þ/Põ_ÐþÒÿA{øXÈë¼\húWõý¨ÿfÿqýîÒÿú4Ü¢¡ê¿ºÿúgþÙPõ?ªÿãâùÏjý³ð¡í[ÜäBÕmÿCþÿ²¡ê¿ºÿþ/àÿ
+Uÿãú?.öÿðþo°Þ+rþ¿ÿ#:£µ·GÿÿY8÷ ÿ§4¨ú×ÿñrþïµÿ
+ at ECÓ¿®ïÿððp@õþÈÿ²Û.Á"ªþ«û?Pÿ没ê¿zÿ¬ÿ°þ²¡ê¿ºÿýÿXÀø/ªþ«û?°þËü²¡ê¿ºÿë?,Àÿ!rþ¿ÿã°ÿ>ú?ðüÏü²¡ê¿zÿôÿa!¯ÿAòr¹®ÿõæ´ëϯó<îÿ£â»tÉÏÿðÔg`üóʾ0,þ§÷ÿ4DÄ¢ø§i@ ãÿ¯ÄßêâøºÑÚ¥ù¿ùiô÷Ä¿(þpJüCü9(?åLDü9(zèkÓÇ5dÏ×SrÝ+ÏÚ½|þ3ÊÂÿÅBéÍ|Ñ7iÎm§ÎûþðW«Å~ߨãï?mvÝânþ¸X÷ÝnÙµ»Ã¿1)táýr}ù
+9ù&¼[ðñ/Rú_LéýßÎAºÿ{Üÿ9(¿våç Äßhÿ,ÅÕëOÒs\ÿu÷ñ_ñ
÷9ÑÍ»Õß6}»üCÑ!Fã|hîÿxrÀv]wüz£Ó`&çü¼ïnhlÉÙÿ:ë¾AúÚX£ÜÉÿ±nOÑSï¼Q'|Xìú¯ÏßàxÐÙü»Eß}lg÷§~?-ݵwÝþxN¬:;ÅÛíö×"á&Swú&ÿu½Y|¦ZNÈ_ü[ûqùë.ð?ýõæçuºìÒ1ø7ùÇÍÃzÖÿgüuÙ~<ý²qÚ³þ»-ÛÅêézêâÙOñ××»ã!ßǯ䷾ +Åã?á¤ùÅøÏAiü Ó?ZüâÏA±þ `ÒüÏ,Åÿv>¬45)<ǵüߥÿ[Çþ?,hdçDS|ÿ'$ I÷ÿ,ÆrO&ÍÿâÏAiü¯½«ãÿÅþÚyÔ²ðÿûSÓQêB8åþïpÿg¡4þSÂ9HñGþ
âù?Á Fÿø?Y(?aôüÿ'Åñ'LÊIñÇý
ÒøGÂ9Hã¿Fü à-ü¶Õ§« À
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,57 +1,57 @@
-System(0KB HP=0*0kB )
- Socket#0
- L3Cache(4096KB)
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#0
- P#0
- P#8
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#1
- P#4
- P#12
- Socket#1
- L3Cache(4096KB)
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#0
- P#1
- P#9
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#1
- P#5
- P#13
- Socket#2
- L3Cache(4096KB)
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#0
- P#2
- P#10
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#1
- P#6
- P#14
- Socket#3
- L3Cache(4096KB)
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#0
- P#3
- P#11
- L2Cache(1024KB)
- L1Cache(16KB)
- Core#1
- P#7
- P#15
-depth 0: 1 System (type #0)
+Machine (phys=0)
+ Socket #0 (phys=0)
+ L3Cache #0 (4096KB)
+ L2Cache #0 (1024KB)
+ L1Cache #0 (16KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ PU #1 (phys=8)
+ L2Cache #1 (1024KB)
+ L1Cache #1 (16KB)
+ Core #1 (phys=1)
+ PU #2 (phys=4)
+ PU #3 (phys=12)
+ Socket #1 (phys=1)
+ L3Cache #1 (4096KB)
+ L2Cache #2 (1024KB)
+ L1Cache #2 (16KB)
+ Core #2 (phys=0)
+ PU #4 (phys=1)
+ PU #5 (phys=9)
+ L2Cache #3 (1024KB)
+ L1Cache #3 (16KB)
+ Core #3 (phys=1)
+ PU #6 (phys=5)
+ PU #7 (phys=13)
+ Socket #2 (phys=2)
+ L3Cache #2 (4096KB)
+ L2Cache #4 (1024KB)
+ L1Cache #4 (16KB)
+ Core #4 (phys=0)
+ PU #8 (phys=2)
+ PU #9 (phys=10)
+ L2Cache #5 (1024KB)
+ L1Cache #5 (16KB)
+ Core #5 (phys=1)
+ PU #10 (phys=6)
+ PU #11 (phys=14)
+ Socket #3 (phys=3)
+ L3Cache #3 (4096KB)
+ L2Cache #6 (1024KB)
+ L1Cache #6 (16KB)
+ Core #6 (phys=0)
+ PU #12 (phys=3)
+ PU #13 (phys=11)
+ L2Cache #7 (1024KB)
+ L1Cache #7 (16KB)
+ Core #7 (phys=1)
+ PU #14 (phys=7)
+ PU #15 (phys=15)
+depth 0: 1 Machine (type #1)
depth 1: 4 Sockets (type #3)
depth 2: 4 Caches (type #4)
depth 3: 8 Caches (type #4)
depth 4: 8 Caches (type #4)
depth 5: 8 Cores (type #5)
- depth 6: 16 Procs (type #6)
+ depth 6: 16 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.xml.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.xml.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t.xml.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,86 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE root SYSTEM "hwloc.dtd">
-<root>
- <object type="System" os_index="0" cpuset="0000ffff" dmi_board_vendor="" dmi_board_name="" memory_kB="0" huge_page_free="0" huge_page_size_kB="0">
- <object type="Socket" os_index="0" cpuset="00001111">
- <object type="Cache" os_index="-1" cpuset="00001111" memory_kB="4096" depth="3">
- <object type="Cache" os_index="-1" cpuset="00000101" memory_kB="1024" depth="2">
- <object type="Cache" os_index="-1" cpuset="00000101" memory_kB="16" depth="1">
- <object type="Core" os_index="0" cpuset="00000101">
- <object type="Proc" os_index="0" cpuset="00000001"/>
- <object type="Proc" os_index="8" cpuset="00000100"/>
+<!DOCTYPE topology SYSTEM "hwloc.dtd">
+<topology>
+ <object type="Machine" os_level="-1" os_index="0" cpuset="0x0000ffff" complete_cpuset="0x0000ffff" online_cpuset="0x0000ffff" allowed_cpuset="0x0000ffff">
+ <object type="Socket" os_level="-1" os_index="0" cpuset="0x00001111" complete_cpuset="0x00001111" online_cpuset="0x00001111" allowed_cpuset="0x00001111">
+ <object type="Cache" os_level="-1" cpuset="0x00001111" complete_cpuset="0x00001111" online_cpuset="0x00001111" allowed_cpuset="0x00001111" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000101" complete_cpuset="0x00000101" online_cpuset="0x00000101" allowed_cpuset="0x00000101" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000101" complete_cpuset="0x00000101" online_cpuset="0x00000101" allowed_cpuset="0x00000101" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000101" complete_cpuset="0x00000101" online_cpuset="0x00000101" allowed_cpuset="0x00000101">
+ <object type="PU" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001"/>
+ <object type="PU" os_level="-1" os_index="8" cpuset="0x00000100" complete_cpuset="0x00000100" online_cpuset="0x00000100" allowed_cpuset="0x00000100"/>
</object>
</object>
</object>
- <object type="Cache" os_index="-1" cpuset="00001010" memory_kB="1024" depth="2">
- <object type="Cache" os_index="-1" cpuset="00001010" memory_kB="16" depth="1">
- <object type="Core" os_index="1" cpuset="00001010">
- <object type="Proc" os_index="4" cpuset="00000010"/>
- <object type="Proc" os_index="12" cpuset="00001000"/>
+ <object type="Cache" os_level="-1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010">
+ <object type="PU" os_level="-1" os_index="4" cpuset="0x00000010" complete_cpuset="0x00000010" online_cpuset="0x00000010" allowed_cpuset="0x00000010"/>
+ <object type="PU" os_level="-1" os_index="12" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000"/>
</object>
</object>
</object>
</object>
</object>
- <object type="Socket" os_index="1" cpuset="00002222">
- <object type="Cache" os_index="-1" cpuset="00002222" memory_kB="4096" depth="3">
- <object type="Cache" os_index="-1" cpuset="00000202" memory_kB="1024" depth="2">
- <object type="Cache" os_index="-1" cpuset="00000202" memory_kB="16" depth="1">
- <object type="Core" os_index="0" cpuset="00000202">
- <object type="Proc" os_index="1" cpuset="00000002"/>
- <object type="Proc" os_index="9" cpuset="00000200"/>
+ <object type="Socket" os_level="-1" os_index="1" cpuset="0x00002222" complete_cpuset="0x00002222" online_cpuset="0x00002222" allowed_cpuset="0x00002222">
+ <object type="Cache" os_level="-1" cpuset="0x00002222" complete_cpuset="0x00002222" online_cpuset="0x00002222" allowed_cpuset="0x00002222" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202">
+ <object type="PU" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002"/>
+ <object type="PU" os_level="-1" os_index="9" cpuset="0x00000200" complete_cpuset="0x00000200" online_cpuset="0x00000200" allowed_cpuset="0x00000200"/>
</object>
</object>
</object>
- <object type="Cache" os_index="-1" cpuset="00002020" memory_kB="1024" depth="2">
- <object type="Cache" os_index="-1" cpuset="00002020" memory_kB="16" depth="1">
- <object type="Core" os_index="1" cpuset="00002020">
- <object type="Proc" os_index="5" cpuset="00000020"/>
- <object type="Proc" os_index="13" cpuset="00002000"/>
+ <object type="Cache" os_level="-1" cpuset="0x00002020" complete_cpuset="0x00002020" online_cpuset="0x00002020" allowed_cpuset="0x00002020" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00002020" complete_cpuset="0x00002020" online_cpuset="0x00002020" allowed_cpuset="0x00002020" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00002020" complete_cpuset="0x00002020" online_cpuset="0x00002020" allowed_cpuset="0x00002020">
+ <object type="PU" os_level="-1" os_index="5" cpuset="0x00000020" complete_cpuset="0x00000020" online_cpuset="0x00000020" allowed_cpuset="0x00000020"/>
+ <object type="PU" os_level="-1" os_index="13" cpuset="0x00002000" complete_cpuset="0x00002000" online_cpuset="0x00002000" allowed_cpuset="0x00002000"/>
</object>
</object>
</object>
</object>
</object>
- <object type="Socket" os_index="2" cpuset="00004444">
- <object type="Cache" os_index="-1" cpuset="00004444" memory_kB="4096" depth="3">
- <object type="Cache" os_index="-1" cpuset="00000404" memory_kB="1024" depth="2">
- <object type="Cache" os_index="-1" cpuset="00000404" memory_kB="16" depth="1">
- <object type="Core" os_index="0" cpuset="00000404">
- <object type="Proc" os_index="2" cpuset="00000004"/>
- <object type="Proc" os_index="10" cpuset="00000400"/>
+ <object type="Socket" os_level="-1" os_index="2" cpuset="0x00004444" complete_cpuset="0x00004444" online_cpuset="0x00004444" allowed_cpuset="0x00004444">
+ <object type="Cache" os_level="-1" cpuset="0x00004444" complete_cpuset="0x00004444" online_cpuset="0x00004444" allowed_cpuset="0x00004444" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000404" complete_cpuset="0x00000404" online_cpuset="0x00000404" allowed_cpuset="0x00000404" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000404" complete_cpuset="0x00000404" online_cpuset="0x00000404" allowed_cpuset="0x00000404" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000404" complete_cpuset="0x00000404" online_cpuset="0x00000404" allowed_cpuset="0x00000404">
+ <object type="PU" os_level="-1" os_index="2" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004"/>
+ <object type="PU" os_level="-1" os_index="10" cpuset="0x00000400" complete_cpuset="0x00000400" online_cpuset="0x00000400" allowed_cpuset="0x00000400"/>
</object>
</object>
</object>
- <object type="Cache" os_index="-1" cpuset="00004040" memory_kB="1024" depth="2">
- <object type="Cache" os_index="-1" cpuset="00004040" memory_kB="16" depth="1">
- <object type="Core" os_index="1" cpuset="00004040">
- <object type="Proc" os_index="6" cpuset="00000040"/>
- <object type="Proc" os_index="14" cpuset="00004000"/>
+ <object type="Cache" os_level="-1" cpuset="0x00004040" complete_cpuset="0x00004040" online_cpuset="0x00004040" allowed_cpuset="0x00004040" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00004040" complete_cpuset="0x00004040" online_cpuset="0x00004040" allowed_cpuset="0x00004040" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00004040" complete_cpuset="0x00004040" online_cpuset="0x00004040" allowed_cpuset="0x00004040">
+ <object type="PU" os_level="-1" os_index="6" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040"/>
+ <object type="PU" os_level="-1" os_index="14" cpuset="0x00004000" complete_cpuset="0x00004000" online_cpuset="0x00004000" allowed_cpuset="0x00004000"/>
</object>
</object>
</object>
</object>
</object>
- <object type="Socket" os_index="3" cpuset="00008888">
- <object type="Cache" os_index="-1" cpuset="00008888" memory_kB="4096" depth="3">
- <object type="Cache" os_index="-1" cpuset="00000808" memory_kB="1024" depth="2">
- <object type="Cache" os_index="-1" cpuset="00000808" memory_kB="16" depth="1">
- <object type="Core" os_index="0" cpuset="00000808">
- <object type="Proc" os_index="3" cpuset="00000008"/>
- <object type="Proc" os_index="11" cpuset="00000800"/>
+ <object type="Socket" os_level="-1" os_index="3" cpuset="0x00008888" complete_cpuset="0x00008888" online_cpuset="0x00008888" allowed_cpuset="0x00008888">
+ <object type="Cache" os_level="-1" cpuset="0x00008888" complete_cpuset="0x00008888" online_cpuset="0x00008888" allowed_cpuset="0x00008888" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000808" complete_cpuset="0x00000808" online_cpuset="0x00000808" allowed_cpuset="0x00000808" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000808" complete_cpuset="0x00000808" online_cpuset="0x00000808" allowed_cpuset="0x00000808" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000808" complete_cpuset="0x00000808" online_cpuset="0x00000808" allowed_cpuset="0x00000808">
+ <object type="PU" os_level="-1" os_index="3" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008"/>
+ <object type="PU" os_level="-1" os_index="11" cpuset="0x00000800" complete_cpuset="0x00000800" online_cpuset="0x00000800" allowed_cpuset="0x00000800"/>
</object>
</object>
</object>
- <object type="Cache" os_index="-1" cpuset="00008080" memory_kB="1024" depth="2">
- <object type="Cache" os_index="-1" cpuset="00008080" memory_kB="16" depth="1">
- <object type="Core" os_index="1" cpuset="00008080">
- <object type="Proc" os_index="7" cpuset="00000080"/>
- <object type="Proc" os_index="15" cpuset="00008000"/>
+ <object type="Cache" os_level="-1" cpuset="0x00008080" complete_cpuset="0x00008080" online_cpuset="0x00008080" allowed_cpuset="0x00008080" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00008080" complete_cpuset="0x00008080" online_cpuset="0x00008080" allowed_cpuset="0x00008080" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00008080" complete_cpuset="0x00008080" online_cpuset="0x00008080" allowed_cpuset="0x00008080">
+ <object type="PU" os_level="-1" os_index="7" cpuset="0x00000080" complete_cpuset="0x00000080" online_cpuset="0x00000080" allowed_cpuset="0x00000080"/>
+ <object type="PU" os_level="-1" os_index="15" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000"/>
</object>
</object>
</object>
</object>
</object>
</object>
-</root>
+</topology>
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t_merge.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t_merge.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t_merge.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,34 +1,34 @@
-System(0KB HP=0*0kB )
- L3Cache(4096KB)
- Core#0
- P#0
- P#8
- Core#1
- P#4
- P#12
- L3Cache(4096KB)
- Core#0
- P#1
- P#9
- Core#1
- P#5
- P#13
- L3Cache(4096KB)
- Core#0
- P#2
- P#10
- Core#1
- P#6
- P#14
- L3Cache(4096KB)
- Core#0
- P#3
- P#11
- Core#1
- P#7
- P#15
-depth 0: 1 System (type #0)
+Machine (phys=0)
+ L3Cache #0 (4096KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ PU #1 (phys=8)
+ Core #1 (phys=1)
+ PU #2 (phys=4)
+ PU #3 (phys=12)
+ L3Cache #1 (4096KB)
+ Core #2 (phys=0)
+ PU #4 (phys=1)
+ PU #5 (phys=9)
+ Core #3 (phys=1)
+ PU #6 (phys=5)
+ PU #7 (phys=13)
+ L3Cache #2 (4096KB)
+ Core #4 (phys=0)
+ PU #8 (phys=2)
+ PU #9 (phys=10)
+ Core #5 (phys=1)
+ PU #10 (phys=6)
+ PU #11 (phys=14)
+ L3Cache #3 (4096KB)
+ Core #6 (phys=0)
+ PU #12 (phys=3)
+ PU #13 (phys=11)
+ Core #7 (phys=1)
+ PU #14 (phys=7)
+ PU #15 (phys=15)
+depth 0: 1 Machine (type #1)
depth 1: 4 Caches (type #4)
depth 2: 8 Cores (type #5)
- depth 3: 16 Procs (type #6)
+ depth 3: 16 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t_ncaches.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t_ncaches.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16em64t-4s2c2t_ncaches.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,34 +1,34 @@
-System(0KB HP=0*0kB )
- Socket#0
- Core#0
- P#0
- P#8
- Core#1
- P#4
- P#12
- Socket#1
- Core#0
- P#1
- P#9
- Core#1
- P#5
- P#13
- Socket#2
- Core#0
- P#2
- P#10
- Core#1
- P#6
- P#14
- Socket#3
- Core#0
- P#3
- P#11
- Core#1
- P#7
- P#15
-depth 0: 1 System (type #0)
+Machine (phys=0)
+ Socket #0 (phys=0)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ PU #1 (phys=8)
+ Core #1 (phys=1)
+ PU #2 (phys=4)
+ PU #3 (phys=12)
+ Socket #1 (phys=1)
+ Core #2 (phys=0)
+ PU #4 (phys=1)
+ PU #5 (phys=9)
+ Core #3 (phys=1)
+ PU #6 (phys=5)
+ PU #7 (phys=13)
+ Socket #2 (phys=2)
+ Core #4 (phys=0)
+ PU #8 (phys=2)
+ PU #9 (phys=10)
+ Core #5 (phys=1)
+ PU #10 (phys=6)
+ PU #11 (phys=14)
+ Socket #3 (phys=3)
+ Core #6 (phys=0)
+ PU #12 (phys=3)
+ PU #13 (phys=11)
+ Core #7 (phys=1)
+ PU #14 (phys=7)
+ PU #15 (phys=15)
+depth 0: 1 Machine (type #1)
depth 1: 4 Sockets (type #3)
depth 2: 8 Cores (type #5)
- depth 3: 16 Procs (type #6)
+ depth 3: 16 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16ia64-8n2s.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16ia64-8n2s.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/16ia64-8n2s.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,117 +1,117 @@
-System(46GB HP=0*262144kB )
- Misc0
- NUMANode#0(5903MB)
- Socket#0
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#0
- Socket#0
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#1
- NUMANode#1(5904MB)
- Socket#512
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#2
- Socket#512
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#3
- NUMANode#2(5904MB)
- Socket#1024
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#4
- Socket#1024
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#5
- NUMANode#3(5904MB)
- Socket#1536
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#6
- Socket#1536
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#7
- Misc0
- NUMANode#4(5904MB)
- Socket#2048
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#8
- Socket#2048
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#9
- NUMANode#5(5903MB)
- Socket#2560
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#10
- Socket#2560
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#11
- NUMANode#6(5904MB)
- Socket#3072
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#12
- Socket#3072
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#13
- NUMANode#7(5885MB)
- Socket#3584
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#14
- Socket#3584
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#15
-depth 0: 1 System (type #0)
- depth 1: 2 Miscs (type #7)
+Machine (phys=0 total=48346688KB)
+ Group0 #0 (total=24182720KB)
+ NUMANode #0 (phys=0 local=6045632KB total=6045632KB)
+ Socket #0 (phys=0)
+ L3Cache #0 (9216KB)
+ L2Cache #0 (256KB)
+ L1Cache #0 (16KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ Socket #1 (phys=0)
+ L3Cache #1 (9216KB)
+ L2Cache #1 (256KB)
+ L1Cache #1 (16KB)
+ Core #1 (phys=0)
+ PU #1 (phys=1)
+ NUMANode #1 (phys=1 local=6045696KB total=6045696KB)
+ Socket #2 (phys=512)
+ L3Cache #2 (9216KB)
+ L2Cache #2 (256KB)
+ L1Cache #2 (16KB)
+ Core #2 (phys=0)
+ PU #2 (phys=2)
+ Socket #3 (phys=512)
+ L3Cache #3 (9216KB)
+ L2Cache #3 (256KB)
+ L1Cache #3 (16KB)
+ Core #3 (phys=0)
+ PU #3 (phys=3)
+ NUMANode #2 (phys=2 local=6045696KB total=6045696KB)
+ Socket #4 (phys=1024)
+ L3Cache #4 (9216KB)
+ L2Cache #4 (256KB)
+ L1Cache #4 (16KB)
+ Core #4 (phys=0)
+ PU #4 (phys=4)
+ Socket #5 (phys=1024)
+ L3Cache #5 (9216KB)
+ L2Cache #5 (256KB)
+ L1Cache #5 (16KB)
+ Core #5 (phys=0)
+ PU #5 (phys=5)
+ NUMANode #3 (phys=3 local=6045696KB total=6045696KB)
+ Socket #6 (phys=1536)
+ L3Cache #6 (9216KB)
+ L2Cache #6 (256KB)
+ L1Cache #6 (16KB)
+ Core #6 (phys=0)
+ PU #6 (phys=6)
+ Socket #7 (phys=1536)
+ L3Cache #7 (9216KB)
+ L2Cache #7 (256KB)
+ L1Cache #7 (16KB)
+ Core #7 (phys=0)
+ PU #7 (phys=7)
+ Group0 #1 (total=24163968KB)
+ NUMANode #4 (phys=4 local=6045696KB total=6045696KB)
+ Socket #8 (phys=2048)
+ L3Cache #8 (9216KB)
+ L2Cache #8 (256KB)
+ L1Cache #8 (16KB)
+ Core #8 (phys=0)
+ PU #8 (phys=8)
+ Socket #9 (phys=2048)
+ L3Cache #9 (9216KB)
+ L2Cache #9 (256KB)
+ L1Cache #9 (16KB)
+ Core #9 (phys=0)
+ PU #9 (phys=9)
+ NUMANode #5 (phys=5 local=6045632KB total=6045632KB)
+ Socket #10 (phys=2560)
+ L3Cache #10 (9216KB)
+ L2Cache #10 (256KB)
+ L1Cache #10 (16KB)
+ Core #10 (phys=0)
+ PU #10 (phys=10)
+ Socket #11 (phys=2560)
+ L3Cache #11 (9216KB)
+ L2Cache #11 (256KB)
+ L1Cache #11 (16KB)
+ Core #11 (phys=0)
+ PU #11 (phys=11)
+ NUMANode #6 (phys=6 local=6045696KB total=6045696KB)
+ Socket #12 (phys=3072)
+ L3Cache #12 (9216KB)
+ L2Cache #12 (256KB)
+ L1Cache #12 (16KB)
+ Core #12 (phys=0)
+ PU #12 (phys=12)
+ Socket #13 (phys=3072)
+ L3Cache #13 (9216KB)
+ L2Cache #13 (256KB)
+ L1Cache #13 (16KB)
+ Core #13 (phys=0)
+ PU #13 (phys=13)
+ NUMANode #7 (phys=7 local=6026944KB total=6026944KB)
+ Socket #14 (phys=3584)
+ L3Cache #14 (9216KB)
+ L2Cache #14 (256KB)
+ L1Cache #14 (16KB)
+ Core #14 (phys=0)
+ PU #14 (phys=14)
+ Socket #15 (phys=3584)
+ L3Cache #15 (9216KB)
+ L2Cache #15 (256KB)
+ L1Cache #15 (16KB)
+ Core #15 (phys=0)
+ PU #15 (phys=15)
+depth 0: 1 Machine (type #1)
+ depth 1: 2 Groups (type #7)
depth 2: 8 NUMANodes (type #2)
depth 3: 16 Sockets (type #3)
depth 4: 16 Caches (type #4)
depth 5: 16 Caches (type #4)
depth 6: 16 Caches (type #4)
depth 7: 16 Cores (type #5)
- depth 8: 16 Procs (type #6)
+ depth 8: 16 PUs (type #6)
Topology not from this system
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/1alpha.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/1alpha.tar.gz (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/1alpha.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,7 @@
+ ¡Õ9K í×aOÜ6ÀqÞ6ÂÒÞ´£±ã$R_ mµneªtª©òå|ËÝíõÓÏI¸®k¥BµõïàØ±ó8Î!m9?³·î²¾¤qÜ}Ê4ûc©uÿ¹*[RF¡ÿIî^Ê8N¶D|§£ZEÓÚZÑéì´,ªOçêæ>t¿Eù׳üÎÁç_ÅJÿû(ëùÏç¢Ì¾ú5º'C¾?©¢èFþµýó~õ|¤|çù÷9ðàÁ®ØëAàÄt6veWõìuböûº[¶-fUWöUµ»(UMØ×øTØRTéÈÕ¾öç½(C,hM릢]Î]wþqÑÚê²òºï]ñª..lë\}ܼʪòæ
öþ¤_FIù2/Ôî¯
«ò¥xóÓ?ý~CY-6´ÅÔÕ9%Tz'¹=u¢)>8ñf´l]ÓÅÌT0?[6;Âǵk1*ÚÆG´¦öýP½#¹ÍøÁ׫8ög§³Ã¯º±+©esWW®ÊÅiåÆÂæy?¾Ô$&âá<2JYbu¢·/ìU䩪Rn=Þê'¢Ì?Ma6ô¤ú)çÎ7é:Òw2£ôQ0/m;Õþ^¶uQ^#W_ø~éXvADý
+hÄØµ.oݸ;5
+^Jñ"·ùYÎDÿ²-ÔïìrÛÿ=þ1rÝOÿå%®N¨Ûàe´yüïÿS7ý&ûìÿ¾µÿ+öÿû(nz<km¹+VŨ,ó[¡8ß|ìyíÜUH4Ñi¦ºØþb2ñ7ä:&3ÙǺ§x¼Ö,JO¬ébGïìüV\°íåmq±~9¥¢¤½¨ìfT*¦Ê\·{h«YõhW~Ç6ëíÖ£©Éµv¢tCDûÝSí.£~ÎLÔÏï¤òo¥¼µ£rm°rça9ËÏoLî2ÖÍ}ãfË,3£/c7{-ö´¨Ûåf]¢úqþ^Ùü|3>ÜO?åWþu¶%eÌC;ߦLâ!·G¥mFL$éûÍå¥-¦W©1I<Ì浪èîZKÙǺqwÖ#2ÝÏï×çGoOªæÆ
+æ°?[T¹»5ùpcîÇÓùÍv³é´h_þ×J¤õ÷!æßeo÷VíüëyÈíë©-}
+¯Ód"?¿aM¬b'ÍõóûÔÐç*vp¶¨ÎWíR©~,ßúÿTYßÿ}Ú»¸Æ'÷ÿE«äÆþi±ÿßG龸û'?Ld¦SáwþHg"QÒø}>ÚïÛþ_1ÿµ9ò{Cwߥö/ ÿ õ_üÃj¯?£}QµµSÏdZúª¨«ö
+eÿ8É|0Óáå±ÿIµ?ÖqJsu,S?F%¿ ÀD·ï[¡¤N¥Y0j©RÅ&ÔqgÁ¼å®i\#
+ÓDõÍÛzQUEu*¢Õñ¨åçnìûÛ¢P(ÿ}ù#p¢
\ No newline at end of file
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/1alpha.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/1alpha.tar.gz.output (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/1alpha.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,5 @@
+Machine (phys=0 local=8299024KB total=8299024KB)
+ PU #0 (phys=0)
+depth 0: 1 Machine (type #1)
+ depth 1: 1 PU (type #6)
+Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/256ia64-64n2s2c.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/256ia64-64n2s2c.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/256ia64-64n2s2c.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,733 +1,733 @@
-System(491GB HP=0*262144kB )
- Misc1
- Misc0
- NUMANode#0(7875MB)
- Socket#0
- Core#0
- P#0
- Core#1
- P#1
- Socket#3
- Core#0
- P#2
- Core#1
- P#3
- NUMANode#1(7888MB)
- Socket#512
- Core#0
- P#4
- Core#1
- P#5
- Socket#515
- Core#0
- P#6
- Core#1
- P#7
- NUMANode#2(7888MB)
- Socket#1024
- Core#0
- P#8
- Core#1
- P#9
- Socket#1027
- Core#0
- P#10
- Core#1
- P#11
- NUMANode#3(7888MB)
- Socket#1536
- Core#0
- P#12
- Core#1
- P#13
- Socket#1539
- Core#0
- P#14
- Core#1
- P#15
- Misc0
- NUMANode#4(7888MB)
- Socket#2048
- Core#0
- P#16
- Core#1
- P#17
- Socket#2051
- Core#0
- P#18
- Core#1
- P#19
- NUMANode#5(7888MB)
- Socket#2560
- Core#0
- P#20
- Core#1
- P#21
- Socket#2563
- Core#0
- P#22
- Core#1
- P#23
- NUMANode#6(7887MB)
- Socket#3072
- Core#0
- P#24
- Core#1
- P#25
- Socket#3075
- Core#0
- P#26
- Core#1
- P#27
- NUMANode#7(7888MB)
- Socket#3584
- Core#0
- P#28
- Core#1
- P#29
- Socket#3587
- Core#0
- P#30
- Core#1
- P#31
- Misc0
- NUMANode#8(7888MB)
- Socket#4096
- Core#0
- P#32
- Core#1
- P#33
- Socket#4099
- Core#0
- P#34
- Core#1
- P#35
- NUMANode#9(7888MB)
- Socket#4608
- Core#0
- P#36
- Core#1
- P#37
- Socket#4611
- Core#0
- P#38
- Core#1
- P#39
- NUMANode#10(7888MB)
- Socket#5120
- Core#0
- P#40
- Core#1
- P#41
- Socket#5123
- Core#0
- P#42
- Core#1
- P#43
- NUMANode#11(7888MB)
- Socket#5632
- Core#0
- P#44
- Core#1
- P#45
- Socket#5635
- Core#0
- P#46
- Core#1
- P#47
- Misc0
- NUMANode#12(7888MB)
- Socket#6144
- Core#0
- P#48
- Core#1
- P#49
- Socket#6147
- Core#0
- P#50
- Core#1
- P#51
- NUMANode#13(7888MB)
- Socket#6656
- Core#0
- P#52
- Core#1
- P#53
- Socket#6659
- Core#0
- P#54
- Core#1
- P#55
- NUMANode#14(7887MB)
- Socket#7168
- Core#0
- P#56
- Core#1
- P#57
- Socket#7171
- Core#0
- P#58
- Core#1
- P#59
- NUMANode#15(7888MB)
- Socket#7680
- Core#0
- P#60
- Core#1
- P#61
- Socket#7683
- Core#0
- P#62
- Core#1
- P#63
- Misc1
- Misc0
- NUMANode#16(7888MB)
- Socket#8192
- Core#0
- P#64
- Core#1
- P#65
- Socket#8195
- Core#0
- P#66
- Core#1
- P#67
- NUMANode#17(7888MB)
- Socket#8704
- Core#0
- P#68
- Core#1
- P#69
- Socket#8707
- Core#0
- P#70
- Core#1
- P#71
- NUMANode#18(7888MB)
- Socket#9216
- Core#0
- P#72
- Core#1
- P#73
- Socket#9219
- Core#0
- P#74
- Core#1
- P#75
- NUMANode#19(7888MB)
- Socket#9728
- Core#0
- P#76
- Core#1
- P#77
- Socket#9731
- Core#0
- P#78
- Core#1
- P#79
- Misc0
- NUMANode#20(7888MB)
- Socket#10240
- Core#0
- P#80
- Core#1
- P#81
- Socket#10243
- Core#0
- P#82
- Core#1
- P#83
- NUMANode#21(7888MB)
- Socket#10752
- Core#0
- P#84
- Core#1
- P#85
- Socket#10755
- Core#0
- P#86
- Core#1
- P#87
- NUMANode#22(7887MB)
- Socket#11264
- Core#0
- P#88
- Core#1
- P#89
- Socket#11267
- Core#0
- P#90
- Core#1
- P#91
- NUMANode#23(7888MB)
- Socket#11776
- Core#0
- P#92
- Core#1
- P#93
- Socket#11779
- Core#0
- P#94
- Core#1
- P#95
- Misc0
- NUMANode#24(7888MB)
- Socket#12288
- Core#0
- P#96
- Core#1
- P#97
- Socket#12291
- Core#0
- P#98
- Core#1
- P#99
- NUMANode#25(7888MB)
- Socket#12800
- Core#0
- P#100
- Core#1
- P#101
- Socket#12803
- Core#0
- P#102
- Core#1
- P#103
- NUMANode#26(7888MB)
- Socket#13312
- Core#0
- P#104
- Core#1
- P#105
- Socket#13315
- Core#0
- P#106
- Core#1
- P#107
- NUMANode#27(7888MB)
- Socket#13824
- Core#0
- P#108
- Core#1
- P#109
- Socket#13827
- Core#0
- P#110
- Core#1
- P#111
- Misc0
- NUMANode#28(7888MB)
- Socket#14336
- Core#0
- P#112
- Core#1
- P#113
- Socket#14339
- Core#0
- P#114
- Core#1
- P#115
- NUMANode#29(7887MB)
- Socket#14848
- Core#0
- P#116
- Core#1
- P#117
- Socket#14851
- Core#0
- P#118
- Core#1
- P#119
- NUMANode#30(7888MB)
- Socket#15360
- Core#0
- P#120
- Core#1
- P#121
- Socket#15363
- Core#0
- P#122
- Core#1
- P#123
- NUMANode#31(7888MB)
- Socket#15872
- Core#0
- P#124
- Core#1
- P#125
- Socket#15875
- Core#0
- P#126
- Core#1
- P#127
- Misc1
- Misc0
- NUMANode#32(7888MB)
- Socket#16384
- Core#0
- P#128
- Core#1
- P#129
- Socket#16387
- Core#0
- P#130
- Core#1
- P#131
- NUMANode#33(7888MB)
- Socket#16896
- Core#0
- P#132
- Core#1
- P#133
- Socket#16899
- Core#0
- P#134
- Core#1
- P#135
- NUMANode#34(7888MB)
- Socket#17408
- Core#0
- P#136
- Core#1
- P#137
- Socket#17411
- Core#0
- P#138
- Core#1
- P#139
- NUMANode#35(7888MB)
- Socket#17920
- Core#0
- P#140
- Core#1
- P#141
- Socket#17923
- Core#0
- P#142
- Core#1
- P#143
- Misc0
- NUMANode#36(7888MB)
- Socket#18432
- Core#0
- P#144
- Core#1
- P#145
- Socket#18435
- Core#0
- P#146
- Core#1
- P#147
- NUMANode#37(7887MB)
- Socket#18944
- Core#0
- P#148
- Core#1
- P#149
- Socket#18947
- Core#0
- P#150
- Core#1
- P#151
- NUMANode#38(7888MB)
- Socket#19456
- Core#0
- P#152
- Core#1
- P#153
- Socket#19459
- Core#0
- P#154
- Core#1
- P#155
- NUMANode#39(7888MB)
- Socket#19968
- Core#0
- P#156
- Core#1
- P#157
- Socket#19971
- Core#0
- P#158
- Core#1
- P#159
- Misc0
- NUMANode#40(7888MB)
- Socket#20480
- Core#0
- P#160
- Core#1
- P#161
- Socket#20483
- Core#0
- P#162
- Core#1
- P#163
- NUMANode#41(7888MB)
- Socket#20992
- Core#0
- P#164
- Core#1
- P#165
- Socket#20995
- Core#0
- P#166
- Core#1
- P#167
- NUMANode#42(7888MB)
- Socket#21504
- Core#0
- P#168
- Core#1
- P#169
- Socket#21507
- Core#0
- P#170
- Core#1
- P#171
- NUMANode#43(7888MB)
- Socket#22016
- Core#0
- P#172
- Core#1
- P#173
- Socket#22019
- Core#0
- P#174
- Core#1
- P#175
- Misc0
- NUMANode#44(7888MB)
- Socket#22528
- Core#0
- P#176
- Core#1
- P#177
- Socket#22531
- Core#0
- P#178
- Core#1
- P#179
- NUMANode#45(7887MB)
- Socket#23040
- Core#0
- P#180
- Core#1
- P#181
- Socket#23043
- Core#0
- P#182
- Core#1
- P#183
- NUMANode#46(7888MB)
- Socket#23552
- Core#0
- P#184
- Core#1
- P#185
- Socket#23555
- Core#0
- P#186
- Core#1
- P#187
- NUMANode#47(7888MB)
- Socket#24064
- Core#0
- P#188
- Core#1
- P#189
- Socket#24067
- Core#0
- P#190
- Core#1
- P#191
- Misc1
- Misc0
- NUMANode#48(7888MB)
- Socket#24576
- Core#0
- P#192
- Core#1
- P#193
- Socket#24579
- Core#0
- P#194
- Core#1
- P#195
- NUMANode#49(7888MB)
- Socket#25088
- Core#0
- P#196
- Core#1
- P#197
- Socket#25091
- Core#0
- P#198
- Core#1
- P#199
- NUMANode#50(7888MB)
- Socket#25600
- Core#0
- P#200
- Core#1
- P#201
- Socket#25603
- Core#0
- P#202
- Core#1
- P#203
- NUMANode#51(7888MB)
- Socket#26112
- Core#0
- P#204
- Core#1
- P#205
- Socket#26115
- Core#0
- P#206
- Core#1
- P#207
- Misc0
- NUMANode#52(7888MB)
- Socket#26624
- Core#0
- P#208
- Core#1
- P#209
- Socket#26627
- Core#0
- P#210
- Core#1
- P#211
- NUMANode#53(7887MB)
- Socket#27136
- Core#0
- P#212
- Core#1
- P#213
- Socket#27139
- Core#0
- P#214
- Core#1
- P#215
- NUMANode#54(7888MB)
- Socket#27648
- Core#0
- P#216
- Core#1
- P#217
- Socket#27651
- Core#0
- P#218
- Core#1
- P#219
- NUMANode#55(7888MB)
- Socket#28160
- Core#0
- P#220
- Core#1
- P#221
- Socket#28163
- Core#0
- P#222
- Core#1
- P#223
- Misc0
- NUMANode#56(7888MB)
- Socket#28672
- Core#0
- P#224
- Core#1
- P#225
- Socket#28675
- Core#0
- P#226
- Core#1
- P#227
- NUMANode#57(7888MB)
- Socket#29184
- Core#0
- P#228
- Core#1
- P#229
- Socket#29187
- Core#0
- P#230
- Core#1
- P#231
- NUMANode#58(7888MB)
- Socket#29696
- Core#0
- P#232
- Core#1
- P#233
- Socket#29699
- Core#0
- P#234
- Core#1
- P#235
- NUMANode#59(7888MB)
- Socket#30208
- Core#0
- P#236
- Core#1
- P#237
- Socket#30211
- Core#0
- P#238
- Core#1
- P#239
- Misc0
- NUMANode#60(7888MB)
- Socket#30720
- Core#0
- P#240
- Core#1
- P#241
- Socket#30723
- Core#0
- P#242
- Core#1
- P#243
- NUMANode#61(7887MB)
- Socket#31232
- Core#0
- P#244
- Core#1
- P#245
- Socket#31235
- Core#0
- P#246
- Core#1
- P#247
- NUMANode#62(7888MB)
- Socket#31744
- Core#0
- P#248
- Core#1
- P#249
- Socket#31747
- Core#0
- P#250
- Core#1
- P#251
- NUMANode#63(7865MB)
- Socket#32256
- Core#0
- P#252
- Core#1
- P#253
- Socket#32259
- Core#0
- P#254
- Core#1
- P#255
-depth 0: 1 System (type #0)
- depth 1: 4 Miscs (type #7)
- depth 2: 16 Miscs (type #7)
+Machine (phys=0 total=516912176KB)
+ Group1 #0 (total=129224048KB)
+ Group0 #0 (total=32296336KB)
+ NUMANode #0 (phys=0 local=8064400KB total=8064400KB)
+ Socket #0 (phys=0)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ Core #1 (phys=1)
+ PU #1 (phys=1)
+ Socket #1 (phys=3)
+ Core #2 (phys=0)
+ PU #2 (phys=2)
+ Core #3 (phys=1)
+ PU #3 (phys=3)
+ NUMANode #1 (phys=1 local=8077312KB total=8077312KB)
+ Socket #2 (phys=512)
+ Core #4 (phys=0)
+ PU #4 (phys=4)
+ Core #5 (phys=1)
+ PU #5 (phys=5)
+ Socket #3 (phys=515)
+ Core #6 (phys=0)
+ PU #6 (phys=6)
+ Core #7 (phys=1)
+ PU #7 (phys=7)
+ NUMANode #2 (phys=2 local=8077312KB total=8077312KB)
+ Socket #4 (phys=1024)
+ Core #8 (phys=0)
+ PU #8 (phys=8)
+ Core #9 (phys=1)
+ PU #9 (phys=9)
+ Socket #5 (phys=1027)
+ Core #10 (phys=0)
+ PU #10 (phys=10)
+ Core #11 (phys=1)
+ PU #11 (phys=11)
+ NUMANode #3 (phys=3 local=8077312KB total=8077312KB)
+ Socket #6 (phys=1536)
+ Core #12 (phys=0)
+ PU #12 (phys=12)
+ Core #13 (phys=1)
+ PU #13 (phys=13)
+ Socket #7 (phys=1539)
+ Core #14 (phys=0)
+ PU #14 (phys=14)
+ Core #15 (phys=1)
+ PU #15 (phys=15)
+ Group0 #1 (total=32309232KB)
+ NUMANode #4 (phys=4 local=8077312KB total=8077312KB)
+ Socket #8 (phys=2048)
+ Core #16 (phys=0)
+ PU #16 (phys=16)
+ Core #17 (phys=1)
+ PU #17 (phys=17)
+ Socket #9 (phys=2051)
+ Core #18 (phys=0)
+ PU #18 (phys=18)
+ Core #19 (phys=1)
+ PU #19 (phys=19)
+ NUMANode #5 (phys=5 local=8077312KB total=8077312KB)
+ Socket #10 (phys=2560)
+ Core #20 (phys=0)
+ PU #20 (phys=20)
+ Core #21 (phys=1)
+ PU #21 (phys=21)
+ Socket #11 (phys=2563)
+ Core #22 (phys=0)
+ PU #22 (phys=22)
+ Core #23 (phys=1)
+ PU #23 (phys=23)
+ NUMANode #6 (phys=6 local=8077296KB total=8077296KB)
+ Socket #12 (phys=3072)
+ Core #24 (phys=0)
+ PU #24 (phys=24)
+ Core #25 (phys=1)
+ PU #25 (phys=25)
+ Socket #13 (phys=3075)
+ Core #26 (phys=0)
+ PU #26 (phys=26)
+ Core #27 (phys=1)
+ PU #27 (phys=27)
+ NUMANode #7 (phys=7 local=8077312KB total=8077312KB)
+ Socket #14 (phys=3584)
+ Core #28 (phys=0)
+ PU #28 (phys=28)
+ Core #29 (phys=1)
+ PU #29 (phys=29)
+ Socket #15 (phys=3587)
+ Core #30 (phys=0)
+ PU #30 (phys=30)
+ Core #31 (phys=1)
+ PU #31 (phys=31)
+ Group0 #2 (total=32309248KB)
+ NUMANode #8 (phys=8 local=8077312KB total=8077312KB)
+ Socket #16 (phys=4096)
+ Core #32 (phys=0)
+ PU #32 (phys=32)
+ Core #33 (phys=1)
+ PU #33 (phys=33)
+ Socket #17 (phys=4099)
+ Core #34 (phys=0)
+ PU #34 (phys=34)
+ Core #35 (phys=1)
+ PU #35 (phys=35)
+ NUMANode #9 (phys=9 local=8077312KB total=8077312KB)
+ Socket #18 (phys=4608)
+ Core #36 (phys=0)
+ PU #36 (phys=36)
+ Core #37 (phys=1)
+ PU #37 (phys=37)
+ Socket #19 (phys=4611)
+ Core #38 (phys=0)
+ PU #38 (phys=38)
+ Core #39 (phys=1)
+ PU #39 (phys=39)
+ NUMANode #10 (phys=10 local=8077312KB total=8077312KB)
+ Socket #20 (phys=5120)
+ Core #40 (phys=0)
+ PU #40 (phys=40)
+ Core #41 (phys=1)
+ PU #41 (phys=41)
+ Socket #21 (phys=5123)
+ Core #42 (phys=0)
+ PU #42 (phys=42)
+ Core #43 (phys=1)
+ PU #43 (phys=43)
+ NUMANode #11 (phys=11 local=8077312KB total=8077312KB)
+ Socket #22 (phys=5632)
+ Core #44 (phys=0)
+ PU #44 (phys=44)
+ Core #45 (phys=1)
+ PU #45 (phys=45)
+ Socket #23 (phys=5635)
+ Core #46 (phys=0)
+ PU #46 (phys=46)
+ Core #47 (phys=1)
+ PU #47 (phys=47)
+ Group0 #3 (total=32309232KB)
+ NUMANode #12 (phys=12 local=8077312KB total=8077312KB)
+ Socket #24 (phys=6144)
+ Core #48 (phys=0)
+ PU #48 (phys=48)
+ Core #49 (phys=1)
+ PU #49 (phys=49)
+ Socket #25 (phys=6147)
+ Core #50 (phys=0)
+ PU #50 (phys=50)
+ Core #51 (phys=1)
+ PU #51 (phys=51)
+ NUMANode #13 (phys=13 local=8077312KB total=8077312KB)
+ Socket #26 (phys=6656)
+ Core #52 (phys=0)
+ PU #52 (phys=52)
+ Core #53 (phys=1)
+ PU #53 (phys=53)
+ Socket #27 (phys=6659)
+ Core #54 (phys=0)
+ PU #54 (phys=54)
+ Core #55 (phys=1)
+ PU #55 (phys=55)
+ NUMANode #14 (phys=14 local=8077296KB total=8077296KB)
+ Socket #28 (phys=7168)
+ Core #56 (phys=0)
+ PU #56 (phys=56)
+ Core #57 (phys=1)
+ PU #57 (phys=57)
+ Socket #29 (phys=7171)
+ Core #58 (phys=0)
+ PU #58 (phys=58)
+ Core #59 (phys=1)
+ PU #59 (phys=59)
+ NUMANode #15 (phys=15 local=8077312KB total=8077312KB)
+ Socket #30 (phys=7680)
+ Core #60 (phys=0)
+ PU #60 (phys=60)
+ Core #61 (phys=1)
+ PU #61 (phys=61)
+ Socket #31 (phys=7683)
+ Core #62 (phys=0)
+ PU #62 (phys=62)
+ Core #63 (phys=1)
+ PU #63 (phys=63)
+ Group1 #1 (total=129236960KB)
+ Group0 #4 (total=32309248KB)
+ NUMANode #16 (phys=16 local=8077312KB total=8077312KB)
+ Socket #32 (phys=8192)
+ Core #64 (phys=0)
+ PU #64 (phys=64)
+ Core #65 (phys=1)
+ PU #65 (phys=65)
+ Socket #33 (phys=8195)
+ Core #66 (phys=0)
+ PU #66 (phys=66)
+ Core #67 (phys=1)
+ PU #67 (phys=67)
+ NUMANode #17 (phys=17 local=8077312KB total=8077312KB)
+ Socket #34 (phys=8704)
+ Core #68 (phys=0)
+ PU #68 (phys=68)
+ Core #69 (phys=1)
+ PU #69 (phys=69)
+ Socket #35 (phys=8707)
+ Core #70 (phys=0)
+ PU #70 (phys=70)
+ Core #71 (phys=1)
+ PU #71 (phys=71)
+ NUMANode #18 (phys=18 local=8077312KB total=8077312KB)
+ Socket #36 (phys=9216)
+ Core #72 (phys=0)
+ PU #72 (phys=72)
+ Core #73 (phys=1)
+ PU #73 (phys=73)
+ Socket #37 (phys=9219)
+ Core #74 (phys=0)
+ PU #74 (phys=74)
+ Core #75 (phys=1)
+ PU #75 (phys=75)
+ NUMANode #19 (phys=19 local=8077312KB total=8077312KB)
+ Socket #38 (phys=9728)
+ Core #76 (phys=0)
+ PU #76 (phys=76)
+ Core #77 (phys=1)
+ PU #77 (phys=77)
+ Socket #39 (phys=9731)
+ Core #78 (phys=0)
+ PU #78 (phys=78)
+ Core #79 (phys=1)
+ PU #79 (phys=79)
+ Group0 #5 (total=32309232KB)
+ NUMANode #20 (phys=20 local=8077312KB total=8077312KB)
+ Socket #40 (phys=10240)
+ Core #80 (phys=0)
+ PU #80 (phys=80)
+ Core #81 (phys=1)
+ PU #81 (phys=81)
+ Socket #41 (phys=10243)
+ Core #82 (phys=0)
+ PU #82 (phys=82)
+ Core #83 (phys=1)
+ PU #83 (phys=83)
+ NUMANode #21 (phys=21 local=8077312KB total=8077312KB)
+ Socket #42 (phys=10752)
+ Core #84 (phys=0)
+ PU #84 (phys=84)
+ Core #85 (phys=1)
+ PU #85 (phys=85)
+ Socket #43 (phys=10755)
+ Core #86 (phys=0)
+ PU #86 (phys=86)
+ Core #87 (phys=1)
+ PU #87 (phys=87)
+ NUMANode #22 (phys=22 local=8077296KB total=8077296KB)
+ Socket #44 (phys=11264)
+ Core #88 (phys=0)
+ PU #88 (phys=88)
+ Core #89 (phys=1)
+ PU #89 (phys=89)
+ Socket #45 (phys=11267)
+ Core #90 (phys=0)
+ PU #90 (phys=90)
+ Core #91 (phys=1)
+ PU #91 (phys=91)
+ NUMANode #23 (phys=23 local=8077312KB total=8077312KB)
+ Socket #46 (phys=11776)
+ Core #92 (phys=0)
+ PU #92 (phys=92)
+ Core #93 (phys=1)
+ PU #93 (phys=93)
+ Socket #47 (phys=11779)
+ Core #94 (phys=0)
+ PU #94 (phys=94)
+ Core #95 (phys=1)
+ PU #95 (phys=95)
+ Group0 #6 (total=32309248KB)
+ NUMANode #24 (phys=24 local=8077312KB total=8077312KB)
+ Socket #48 (phys=12288)
+ Core #96 (phys=0)
+ PU #96 (phys=96)
+ Core #97 (phys=1)
+ PU #97 (phys=97)
+ Socket #49 (phys=12291)
+ Core #98 (phys=0)
+ PU #98 (phys=98)
+ Core #99 (phys=1)
+ PU #99 (phys=99)
+ NUMANode #25 (phys=25 local=8077312KB total=8077312KB)
+ Socket #50 (phys=12800)
+ Core #100 (phys=0)
+ PU #100 (phys=100)
+ Core #101 (phys=1)
+ PU #101 (phys=101)
+ Socket #51 (phys=12803)
+ Core #102 (phys=0)
+ PU #102 (phys=102)
+ Core #103 (phys=1)
+ PU #103 (phys=103)
+ NUMANode #26 (phys=26 local=8077312KB total=8077312KB)
+ Socket #52 (phys=13312)
+ Core #104 (phys=0)
+ PU #104 (phys=104)
+ Core #105 (phys=1)
+ PU #105 (phys=105)
+ Socket #53 (phys=13315)
+ Core #106 (phys=0)
+ PU #106 (phys=106)
+ Core #107 (phys=1)
+ PU #107 (phys=107)
+ NUMANode #27 (phys=27 local=8077312KB total=8077312KB)
+ Socket #54 (phys=13824)
+ Core #108 (phys=0)
+ PU #108 (phys=108)
+ Core #109 (phys=1)
+ PU #109 (phys=109)
+ Socket #55 (phys=13827)
+ Core #110 (phys=0)
+ PU #110 (phys=110)
+ Core #111 (phys=1)
+ PU #111 (phys=111)
+ Group0 #7 (total=32309232KB)
+ NUMANode #28 (phys=28 local=8077312KB total=8077312KB)
+ Socket #56 (phys=14336)
+ Core #112 (phys=0)
+ PU #112 (phys=112)
+ Core #113 (phys=1)
+ PU #113 (phys=113)
+ Socket #57 (phys=14339)
+ Core #114 (phys=0)
+ PU #114 (phys=114)
+ Core #115 (phys=1)
+ PU #115 (phys=115)
+ NUMANode #29 (phys=29 local=8077296KB total=8077296KB)
+ Socket #58 (phys=14848)
+ Core #116 (phys=0)
+ PU #116 (phys=116)
+ Core #117 (phys=1)
+ PU #117 (phys=117)
+ Socket #59 (phys=14851)
+ Core #118 (phys=0)
+ PU #118 (phys=118)
+ Core #119 (phys=1)
+ PU #119 (phys=119)
+ NUMANode #30 (phys=30 local=8077312KB total=8077312KB)
+ Socket #60 (phys=15360)
+ Core #120 (phys=0)
+ PU #120 (phys=120)
+ Core #121 (phys=1)
+ PU #121 (phys=121)
+ Socket #61 (phys=15363)
+ Core #122 (phys=0)
+ PU #122 (phys=122)
+ Core #123 (phys=1)
+ PU #123 (phys=123)
+ NUMANode #31 (phys=31 local=8077312KB total=8077312KB)
+ Socket #62 (phys=15872)
+ Core #124 (phys=0)
+ PU #124 (phys=124)
+ Core #125 (phys=1)
+ PU #125 (phys=125)
+ Socket #63 (phys=15875)
+ Core #126 (phys=0)
+ PU #126 (phys=126)
+ Core #127 (phys=1)
+ PU #127 (phys=127)
+ Group1 #2 (total=129236960KB)
+ Group0 #8 (total=32309248KB)
+ NUMANode #32 (phys=32 local=8077312KB total=8077312KB)
+ Socket #64 (phys=16384)
+ Core #128 (phys=0)
+ PU #128 (phys=128)
+ Core #129 (phys=1)
+ PU #129 (phys=129)
+ Socket #65 (phys=16387)
+ Core #130 (phys=0)
+ PU #130 (phys=130)
+ Core #131 (phys=1)
+ PU #131 (phys=131)
+ NUMANode #33 (phys=33 local=8077312KB total=8077312KB)
+ Socket #66 (phys=16896)
+ Core #132 (phys=0)
+ PU #132 (phys=132)
+ Core #133 (phys=1)
+ PU #133 (phys=133)
+ Socket #67 (phys=16899)
+ Core #134 (phys=0)
+ PU #134 (phys=134)
+ Core #135 (phys=1)
+ PU #135 (phys=135)
+ NUMANode #34 (phys=34 local=8077312KB total=8077312KB)
+ Socket #68 (phys=17408)
+ Core #136 (phys=0)
+ PU #136 (phys=136)
+ Core #137 (phys=1)
+ PU #137 (phys=137)
+ Socket #69 (phys=17411)
+ Core #138 (phys=0)
+ PU #138 (phys=138)
+ Core #139 (phys=1)
+ PU #139 (phys=139)
+ NUMANode #35 (phys=35 local=8077312KB total=8077312KB)
+ Socket #70 (phys=17920)
+ Core #140 (phys=0)
+ PU #140 (phys=140)
+ Core #141 (phys=1)
+ PU #141 (phys=141)
+ Socket #71 (phys=17923)
+ Core #142 (phys=0)
+ PU #142 (phys=142)
+ Core #143 (phys=1)
+ PU #143 (phys=143)
+ Group0 #9 (total=32309232KB)
+ NUMANode #36 (phys=36 local=8077312KB total=8077312KB)
+ Socket #72 (phys=18432)
+ Core #144 (phys=0)
+ PU #144 (phys=144)
+ Core #145 (phys=1)
+ PU #145 (phys=145)
+ Socket #73 (phys=18435)
+ Core #146 (phys=0)
+ PU #146 (phys=146)
+ Core #147 (phys=1)
+ PU #147 (phys=147)
+ NUMANode #37 (phys=37 local=8077296KB total=8077296KB)
+ Socket #74 (phys=18944)
+ Core #148 (phys=0)
+ PU #148 (phys=148)
+ Core #149 (phys=1)
+ PU #149 (phys=149)
+ Socket #75 (phys=18947)
+ Core #150 (phys=0)
+ PU #150 (phys=150)
+ Core #151 (phys=1)
+ PU #151 (phys=151)
+ NUMANode #38 (phys=38 local=8077312KB total=8077312KB)
+ Socket #76 (phys=19456)
+ Core #152 (phys=0)
+ PU #152 (phys=152)
+ Core #153 (phys=1)
+ PU #153 (phys=153)
+ Socket #77 (phys=19459)
+ Core #154 (phys=0)
+ PU #154 (phys=154)
+ Core #155 (phys=1)
+ PU #155 (phys=155)
+ NUMANode #39 (phys=39 local=8077312KB total=8077312KB)
+ Socket #78 (phys=19968)
+ Core #156 (phys=0)
+ PU #156 (phys=156)
+ Core #157 (phys=1)
+ PU #157 (phys=157)
+ Socket #79 (phys=19971)
+ Core #158 (phys=0)
+ PU #158 (phys=158)
+ Core #159 (phys=1)
+ PU #159 (phys=159)
+ Group0 #10 (total=32309248KB)
+ NUMANode #40 (phys=40 local=8077312KB total=8077312KB)
+ Socket #80 (phys=20480)
+ Core #160 (phys=0)
+ PU #160 (phys=160)
+ Core #161 (phys=1)
+ PU #161 (phys=161)
+ Socket #81 (phys=20483)
+ Core #162 (phys=0)
+ PU #162 (phys=162)
+ Core #163 (phys=1)
+ PU #163 (phys=163)
+ NUMANode #41 (phys=41 local=8077312KB total=8077312KB)
+ Socket #82 (phys=20992)
+ Core #164 (phys=0)
+ PU #164 (phys=164)
+ Core #165 (phys=1)
+ PU #165 (phys=165)
+ Socket #83 (phys=20995)
+ Core #166 (phys=0)
+ PU #166 (phys=166)
+ Core #167 (phys=1)
+ PU #167 (phys=167)
+ NUMANode #42 (phys=42 local=8077312KB total=8077312KB)
+ Socket #84 (phys=21504)
+ Core #168 (phys=0)
+ PU #168 (phys=168)
+ Core #169 (phys=1)
+ PU #169 (phys=169)
+ Socket #85 (phys=21507)
+ Core #170 (phys=0)
+ PU #170 (phys=170)
+ Core #171 (phys=1)
+ PU #171 (phys=171)
+ NUMANode #43 (phys=43 local=8077312KB total=8077312KB)
+ Socket #86 (phys=22016)
+ Core #172 (phys=0)
+ PU #172 (phys=172)
+ Core #173 (phys=1)
+ PU #173 (phys=173)
+ Socket #87 (phys=22019)
+ Core #174 (phys=0)
+ PU #174 (phys=174)
+ Core #175 (phys=1)
+ PU #175 (phys=175)
+ Group0 #11 (total=32309232KB)
+ NUMANode #44 (phys=44 local=8077312KB total=8077312KB)
+ Socket #88 (phys=22528)
+ Core #176 (phys=0)
+ PU #176 (phys=176)
+ Core #177 (phys=1)
+ PU #177 (phys=177)
+ Socket #89 (phys=22531)
+ Core #178 (phys=0)
+ PU #178 (phys=178)
+ Core #179 (phys=1)
+ PU #179 (phys=179)
+ NUMANode #45 (phys=45 local=8077296KB total=8077296KB)
+ Socket #90 (phys=23040)
+ Core #180 (phys=0)
+ PU #180 (phys=180)
+ Core #181 (phys=1)
+ PU #181 (phys=181)
+ Socket #91 (phys=23043)
+ Core #182 (phys=0)
+ PU #182 (phys=182)
+ Core #183 (phys=1)
+ PU #183 (phys=183)
+ NUMANode #46 (phys=46 local=8077312KB total=8077312KB)
+ Socket #92 (phys=23552)
+ Core #184 (phys=0)
+ PU #184 (phys=184)
+ Core #185 (phys=1)
+ PU #185 (phys=185)
+ Socket #93 (phys=23555)
+ Core #186 (phys=0)
+ PU #186 (phys=186)
+ Core #187 (phys=1)
+ PU #187 (phys=187)
+ NUMANode #47 (phys=47 local=8077312KB total=8077312KB)
+ Socket #94 (phys=24064)
+ Core #188 (phys=0)
+ PU #188 (phys=188)
+ Core #189 (phys=1)
+ PU #189 (phys=189)
+ Socket #95 (phys=24067)
+ Core #190 (phys=0)
+ PU #190 (phys=190)
+ Core #191 (phys=1)
+ PU #191 (phys=191)
+ Group1 #3 (total=129214208KB)
+ Group0 #12 (total=32309248KB)
+ NUMANode #48 (phys=48 local=8077312KB total=8077312KB)
+ Socket #96 (phys=24576)
+ Core #192 (phys=0)
+ PU #192 (phys=192)
+ Core #193 (phys=1)
+ PU #193 (phys=193)
+ Socket #97 (phys=24579)
+ Core #194 (phys=0)
+ PU #194 (phys=194)
+ Core #195 (phys=1)
+ PU #195 (phys=195)
+ NUMANode #49 (phys=49 local=8077312KB total=8077312KB)
+ Socket #98 (phys=25088)
+ Core #196 (phys=0)
+ PU #196 (phys=196)
+ Core #197 (phys=1)
+ PU #197 (phys=197)
+ Socket #99 (phys=25091)
+ Core #198 (phys=0)
+ PU #198 (phys=198)
+ Core #199 (phys=1)
+ PU #199 (phys=199)
+ NUMANode #50 (phys=50 local=8077312KB total=8077312KB)
+ Socket #100 (phys=25600)
+ Core #200 (phys=0)
+ PU #200 (phys=200)
+ Core #201 (phys=1)
+ PU #201 (phys=201)
+ Socket #101 (phys=25603)
+ Core #202 (phys=0)
+ PU #202 (phys=202)
+ Core #203 (phys=1)
+ PU #203 (phys=203)
+ NUMANode #51 (phys=51 local=8077312KB total=8077312KB)
+ Socket #102 (phys=26112)
+ Core #204 (phys=0)
+ PU #204 (phys=204)
+ Core #205 (phys=1)
+ PU #205 (phys=205)
+ Socket #103 (phys=26115)
+ Core #206 (phys=0)
+ PU #206 (phys=206)
+ Core #207 (phys=1)
+ PU #207 (phys=207)
+ Group0 #13 (total=32309232KB)
+ NUMANode #52 (phys=52 local=8077312KB total=8077312KB)
+ Socket #104 (phys=26624)
+ Core #208 (phys=0)
+ PU #208 (phys=208)
+ Core #209 (phys=1)
+ PU #209 (phys=209)
+ Socket #105 (phys=26627)
+ Core #210 (phys=0)
+ PU #210 (phys=210)
+ Core #211 (phys=1)
+ PU #211 (phys=211)
+ NUMANode #53 (phys=53 local=8077296KB total=8077296KB)
+ Socket #106 (phys=27136)
+ Core #212 (phys=0)
+ PU #212 (phys=212)
+ Core #213 (phys=1)
+ PU #213 (phys=213)
+ Socket #107 (phys=27139)
+ Core #214 (phys=0)
+ PU #214 (phys=214)
+ Core #215 (phys=1)
+ PU #215 (phys=215)
+ NUMANode #54 (phys=54 local=8077312KB total=8077312KB)
+ Socket #108 (phys=27648)
+ Core #216 (phys=0)
+ PU #216 (phys=216)
+ Core #217 (phys=1)
+ PU #217 (phys=217)
+ Socket #109 (phys=27651)
+ Core #218 (phys=0)
+ PU #218 (phys=218)
+ Core #219 (phys=1)
+ PU #219 (phys=219)
+ NUMANode #55 (phys=55 local=8077312KB total=8077312KB)
+ Socket #110 (phys=28160)
+ Core #220 (phys=0)
+ PU #220 (phys=220)
+ Core #221 (phys=1)
+ PU #221 (phys=221)
+ Socket #111 (phys=28163)
+ Core #222 (phys=0)
+ PU #222 (phys=222)
+ Core #223 (phys=1)
+ PU #223 (phys=223)
+ Group0 #14 (total=32309248KB)
+ NUMANode #56 (phys=56 local=8077312KB total=8077312KB)
+ Socket #112 (phys=28672)
+ Core #224 (phys=0)
+ PU #224 (phys=224)
+ Core #225 (phys=1)
+ PU #225 (phys=225)
+ Socket #113 (phys=28675)
+ Core #226 (phys=0)
+ PU #226 (phys=226)
+ Core #227 (phys=1)
+ PU #227 (phys=227)
+ NUMANode #57 (phys=57 local=8077312KB total=8077312KB)
+ Socket #114 (phys=29184)
+ Core #228 (phys=0)
+ PU #228 (phys=228)
+ Core #229 (phys=1)
+ PU #229 (phys=229)
+ Socket #115 (phys=29187)
+ Core #230 (phys=0)
+ PU #230 (phys=230)
+ Core #231 (phys=1)
+ PU #231 (phys=231)
+ NUMANode #58 (phys=58 local=8077312KB total=8077312KB)
+ Socket #116 (phys=29696)
+ Core #232 (phys=0)
+ PU #232 (phys=232)
+ Core #233 (phys=1)
+ PU #233 (phys=233)
+ Socket #117 (phys=29699)
+ Core #234 (phys=0)
+ PU #234 (phys=234)
+ Core #235 (phys=1)
+ PU #235 (phys=235)
+ NUMANode #59 (phys=59 local=8077312KB total=8077312KB)
+ Socket #118 (phys=30208)
+ Core #236 (phys=0)
+ PU #236 (phys=236)
+ Core #237 (phys=1)
+ PU #237 (phys=237)
+ Socket #119 (phys=30211)
+ Core #238 (phys=0)
+ PU #238 (phys=238)
+ Core #239 (phys=1)
+ PU #239 (phys=239)
+ Group0 #15 (total=32286480KB)
+ NUMANode #60 (phys=60 local=8077312KB total=8077312KB)
+ Socket #120 (phys=30720)
+ Core #240 (phys=0)
+ PU #240 (phys=240)
+ Core #241 (phys=1)
+ PU #241 (phys=241)
+ Socket #121 (phys=30723)
+ Core #242 (phys=0)
+ PU #242 (phys=242)
+ Core #243 (phys=1)
+ PU #243 (phys=243)
+ NUMANode #61 (phys=61 local=8077296KB total=8077296KB)
+ Socket #122 (phys=31232)
+ Core #244 (phys=0)
+ PU #244 (phys=244)
+ Core #245 (phys=1)
+ PU #245 (phys=245)
+ Socket #123 (phys=31235)
+ Core #246 (phys=0)
+ PU #246 (phys=246)
+ Core #247 (phys=1)
+ PU #247 (phys=247)
+ NUMANode #62 (phys=62 local=8077312KB total=8077312KB)
+ Socket #124 (phys=31744)
+ Core #248 (phys=0)
+ PU #248 (phys=248)
+ Core #249 (phys=1)
+ PU #249 (phys=249)
+ Socket #125 (phys=31747)
+ Core #250 (phys=0)
+ PU #250 (phys=250)
+ Core #251 (phys=1)
+ PU #251 (phys=251)
+ NUMANode #63 (phys=63 local=8054560KB total=8054560KB)
+ Socket #126 (phys=32256)
+ Core #252 (phys=0)
+ PU #252 (phys=252)
+ Core #253 (phys=1)
+ PU #253 (phys=253)
+ Socket #127 (phys=32259)
+ Core #254 (phys=0)
+ PU #254 (phys=254)
+ Core #255 (phys=1)
+ PU #255 (phys=255)
+depth 0: 1 Machine (type #1)
+ depth 1: 4 Groups (type #7)
+ depth 2: 16 Groups (type #7)
depth 3: 64 NUMANodes (type #2)
depth 4: 128 Sockets (type #3)
depth 5: 256 Cores (type #5)
- depth 6: 256 Procs (type #6)
+ depth 6: 256 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2amd64-2n.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2amd64-2n.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2amd64-2n.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,20 +1,14 @@
- §
-J íooÛ¶Æó:B_`»$EJöÞm
-Ãa]q_ÌÚBmÉl¹þRNÊv§ÎéóüÐ6̶ñÏyDb»Ììw¦^þçê¥Pܹá«ÎÚÿ¬ÝýÈÖF§ÕúJ
ï]v¸{G#n»¾häêfÕ¬6UýL9ßvoó9þÝ}÷2×À´øëÔ¥JÜñÏEü98ÿÒßU¥¿ðuè
/Ä?|ßûí
.øø»ÌÄçã_în/p
-DÅ?âY«ÎÇ?üÿ×ALüÃ+eúLLyÛ¶¾î˶ºómLCíC¼¿6GñOÃXà*Q/õ¡ÇQîªÅßëoýNÀ· ^ÿ«&È¿nÚEÛL¬ã¬þ;Ò¿
-íôÏÁÖ×·¾\&é_Ý ºÿ§óTiôÿ8ÿ¾Ù5fuOºâûÿZâ?±ñï×/®º 'k5íoÿÓãö? Ðþs ZÉÄ귾者Ø,vEù¡Xù0v<[ÇyýÿJ5ôÏüE«ÿ²i'i~L¼þÍ
-ôÏþECÒTïÒÿOsöôÿe3QÿM´áu
-Ï¢ÚåÆÿ, ÿ/ú/rM¶ÄÌÿîý?F
ï1ÿËATü«zéÿ1Ñaþߥÿgÿ®ú_TWà|ÿ?;ÿöý} ±PôÿÆ]ÑöU_5_Nüü_fÿcýÙPôßßï.Ûþëãþ_hÿ3èwuõ¾òKÜBÑÿÆßùMDüsðÿ²éÙPô_6kßúº¼ Ïÿ9åÐ?Å
- at 2ýÿ]Üwæý¢èº¦¬¾º«úûgêצräÿYÐô/Òüÿºhýr^XlÝù:âõoþYÿG6ý×·Ûß=Î÷4q^ÿ'ÏÿÚ,
þ9ò¸È%^ÿÇÿÿø_ÞÿaOó?ð²Áý!þYüÐ?ðÈ¢ÿû?NÆÆbý~.ú· ¹PôÏâÿÀühÿeCÑ?ÿþ/àÿ
-Eÿ÷ÿUÿ7HÿÊ4ÿÏàÿÐð² ÿl(ú¿¼ÿã8ÿg-æÿyp7 ÉÄë?~1xÿûÿ±@?ÿþ_àÿ
-Eÿ,þèädCÑÿå×ÿ8mÿ±þ?¿Ô]ßÞÃýwPôÏâÿÀú, ý
-Eÿ,þäYÿC6ý³ø?ÿeÙÙæÿ9Öÿ@þø?dCÑ?ÿó,Àÿ!Iú_òãÿÇ~ÿ§*ÿñÜÿRGLü?ú´ÿ
Øø÷ëÖ˸@ ýc0þgA! Xý?zvEù¡XMÚ<~þÏ)¬ÿÀöÿM¬þ÷ûOÐüBþßbýo ÙôÕû§ôÿÓ\£ýgýÙLÔ?ÿþßó?DÅsÿoÌÿ±@?ËþßXÿìÿ-þñüßëÝÙPôϲÿ7ÖdûË¢<ÿ÷zûO6ýãù¿×ÿ
-Eÿ,û#ÿÇöÿ
-iþÏÿ½ÿ
-Eÿ,ûèìÿ-xý3íÿ
-ÿøs¬ÿý?xÀúϲ¡èÃÿá 0ü
-Eÿûãùo°ÿ·l(úgñ`þ´ÿ²¡èÅÿÿðÈ¢õáÿfþOÙæÿ9öÿÿø?dCÑ?ÇúÏÿçë?Ë&^ÿLû§ðp@?Ëþßðÿ² ÿl(úgYÿúgÃ?ÙPôϲÿ7ôÏöÿ
-Eÿ,þ¬ÿÇÚÙPôÏâÿ@þø?dCÑ?ÿù_ý
-iþÃÿü/ðÈ
¢ý¿1ÿÇü²y^ÿu³$ïúóhÿÎ\ý¿YÿáxÓÏøøç.w?ãý"ªPǹö_Ûãç¿uç?yºXW}yî²tv½ÿͶêºD=|ÿ¾i}µªÃUÝûvã;¿ÿ/s§Ìõ¦ Ã52"ËôlvÝôëÐ?Üÿnn¶ý3Yÿ[¿ê÷
-¥3ú×AïÇú×úgáú÷A¥:ùÍoÿjúbóC²Ç¨y®I>ü4*ð¦õþãëÎCDgö°À»Î/?HÂ-<Ëf£?}u÷x¡D>·ã¿ÔÅa4Õ&ø¹jûûÑöïtüþÛV½¿)ÊãBjTàMµñ+ß}ú¹Êólü)Ýnô!y>áǺ©ÇGHÂu«ÇG^ü«¸ÙJØlü&óvñ®](óÃSoò§æ¶.ýÑçx»)n^6zvp&ßþéËMQm«=ê|Í·ïêö¡È§ã8óp¾õ X|ÿ/w·XǾÿçgúÿF§I³aÿW;ôÿÌ÷ý¨O#üþ?9þË*¨p["Ôq~þïxÿO*¬ÿÀQF].1÷ÿIɾ'Ïÿ
æúgAaú_4ôßÔÍï+êÎÿé0&ÿõ ØþÇ/ú?ÿ±Èÿp09þ/ÿ9îÿéÔÂÿÅÂcþǸ,OÝ<ÉÿØy>Îÿ<BÙqþg6Góòof²þ¹ó?úçà!! Èÿ¸úsPÇù£ô,µö°ÀAþ' cx
-äZ=*pÿI´UóQ§ò?z\Åü:Éÿ$ÃN3ã#æl6þ'ùÄd£Ôz"ÿó?ê\þGËÿ¨ÓüO8§ú$ÿèÙaüO¸q+äÄ1ùþÏ=ÿçYÐ*ÜÊ!z±LÖÿð ±RþW!ÿËALüYó?¸ÿ³ç¿d3Aÿ»¦ëª0 ×ÿ1*5ð²ül&è]tóÞô:ú×þ ÙLÔÝ´Ûb³ØúmÓ>·ÔËÄëßõXþ x=üô²÷ÿ h
\ No newline at end of file
+ ÀÕ9K íïnÛ8Åó9O¡]¢H{¾Í`P`0ØÁb;Å~4uÚ!)ÙÍ>ýJNÊv&oãÛAîùõOm]â="M¾[;û©þ~u1Tϲá«ö:|¯=|ýÌÖFL)«õÒÚksd{K_¹k»¼I«M½ÙÕåBÓr¼!^ÌSüÛöB×À¼øë4K2Þôñ7U?Çñ_û²¯}ÄÇßjý³ð|üûwa÷ZA|ü³L9Äã_ìï^ã¿âï·?ñïÿëmøë &þýï>þã?&fÇ¿¸kPu«uSÞ&ª!Àö1ÞÏÇ¿öQüqN_%êBùáñÏ}¹|ý½ß øDëS÷ò¯êfÕÔsëÔ¿ÊNôúúgaª;H_.sô¯¿ñ&0þë¿Áøyñïê}½7´!:þF+"ãßÝ6!_¯Úò¦?WçcºÿOOâo³èÿ9P½¿d"õ¿¿}hË"ß®öyñ)ßþÖqºiýÞÿ[ç2è
+ù&RÿEÝÌÓüxýÔ8èý¢ÿ¸Ñ?eüfý?ÿËfþëªF Ö1(ÜEõÿ*MqÿÏÆÿ²§ÿ"/néùßÿÇô¿<æ9YÃMüe@ÿO=æÿY Ä¿-ÿ7ÿ»Óûãú´2ö7ÄBÐÿS`¸'Xíó¦+»²þsåæÿÑÿcãÙôß=ì_¹ÿ×§ã?3Ü@ÿ|¨ÊeX£
+AÿÛp¶1uòÃcÀÐ?þ
+AÿE}P7 ÓÓñù¿,5)ôϳh $CÐÿòvU\åm[eÞ÷e÷ðRý{ü?ÚAÿ¡ÌÿßæMX¯úV»|?£xý[Aÿ,Àÿ#þ«»ÝMh@º9Öÿéó¿6Õúç`Èÿ¡K´þÿÃÁÿÃ!þðسüOÿ'îÑôÏãÿþYÿC6ý¿¾ÿãìþϬÿÀÃ/y£ Aÿ,þ
ùÐÿË ÿü_,Àÿ!þ/àÿ8íÿ3oàÿfé_ÙPæÿYüð² ÿlú¿ÿã4ÿgSÌÿói4 Ö?a1xÿÃcÿ?ñçñÀÿËü²!èÇÿý³ülú¿Àúçý?Öÿçáתí»bhÀÑ õ?°þèÿeCÐ?ÿù_àÿ
+Aÿ<þäY@öG6ùÿò¿,Àÿ!þyüÿcþÙÌÑ?aÉ#büý´×6
ÿyñÚÿTGLü?û%á"ãßÝ6!_Gî Jÿ+û ¢Ôÿ÷gòͼ½Àãçÿ¬Ãú<`ÿoÙDêÿ°ÿ÷Í!äÿS¬ÿÍô/þãFÿñYôÿ,`ü/yúÿû;ÌÿpÖý¿1ÿÇ!þ,ûgXÿìÿ-þñüßÃÙôϳÿ7ÖdûË <ÿ÷ûO6ýãù¿7ÿ
+Aÿ<û#ÿÇöÿ
+eþÏÿ½ÿ
+Aÿ<û;èìÿ-hýsíÿ
+ÿøó¬ÿç¿XÀúϲ!èÇÿý³Û?Ùôϳÿ7ôÏöÿ
+Aÿ<ûcþôÿ²!èÇÿÿðÈ õáÿfþOÙPæÿYüð² ÿlúçYÿó,`ýgÙDëiÿoçáÿàÿü¿,Àÿ!þyüÐ?¸ý
+Aÿ<ûCÿ,`ÿoÙôÏãÿÀú, ÿ
+Aÿ<þäYÿC6ýóø?ÿeÙÙPæÿYüÈÿ² ÿlúçñ`þø?dó¢þ«zMßõç+Ñþí¬Áþß,LÇø`úßw ?sãßwúy¦:JSý¿¶§Ïkç?y⺺-»$5K¹tq}øÉ®lÛD=þûcÝrSõßUmÈïÃá¿,3e®·õ`.áÎéÅâºînûâ
ágKaÑ¿0sõ¿»²úXêпîõ~¢å=ôÏÂõïJuò°û£îòíÉ£^g&ùôó¨À»&ϯ'}míÂøÐõIç£?]yÿt¡_Úq_«ü¸Hj
+üR6ÝÃè w:~ÿnÊ.Üäŧq!5*ð®ÜæÐ~ù~¸ÔÆ"ßïG¢ÇûÅø?Uu5>BÒ_·z|áÅ?òí¨uã7ùû»÷«UÙõe~|îMþ\ßUE8ùãï·ùÍÑËF/Îäû
b»§*´Ëü8ï?TÍc/ÇÉÌãyøÞ$`enû_ìï4µÃøßûñªÝ¡ÉÐCû÷æo¯ùIÿáíÿÜø¯Ëþ<õ¥éù¿Óý?µ¶Xÿ£º\"ÚÿyɾgÏÿ)Bÿ,(LÿfZÿu5Øü¾¥èüöþÔ0 Hf^ÿOXô)ÿ£ÿá`nü/ÿ9ÿi£àÿbá)ÿc2çÓlÆäìÒó?PvÿY,ѽü«öüOýsðPÏä²
úsP§ù£ô"µö¸ÀQþ'ñÞfnTà,ÿd©Õ£gùD[µx.ÿ£ÇULäÔYþ'1VûñÎó?[?æYþ'1nZQÏäqþGMåÔTþGçú3ytªÏò?^8Ëÿô
+·BþGsÛîùÿÏÿ² UßCôb«ÿá1 j¤ü¯Fþø³æÚðül¦õ¿¯Û¶ìï#èuDçúËþOÿÍ´þoóvxÖûê ä½ÿè_6óô_ÕÍ.ß®vaW7/.õò,ñý¿QÖbú àíðߣÖh h
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2amd64-2n.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2amd64-2n.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2amd64-2n.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,21 +1,21 @@
-System(0KB HP=0*0kB )
- NUMANode#0(2046MB)
- Socket#0
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#0
- NUMANode#1(2048MB)
- Socket#1
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#1
-depth 0: 1 System (type #0)
+Machine (phys=0 total=4192952KB)
+ NUMANode #0 (phys=0 local=2095800KB total=2095800KB)
+ Socket #0 (phys=0)
+ L2Cache #0 (1024KB)
+ L1Cache #0 (64KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ NUMANode #1 (phys=1 local=2097152KB total=2097152KB)
+ Socket #1 (phys=1)
+ L2Cache #1 (1024KB)
+ L1Cache #1 (64KB)
+ Core #1 (phys=0)
+ PU #1 (phys=1)
+depth 0: 1 Machine (type #1)
depth 1: 2 NUMANodes (type #2)
depth 2: 2 Sockets (type #3)
depth 3: 2 Caches (type #4)
depth 4: 2 Caches (type #4)
depth 5: 2 Cores (type #5)
- depth 6: 2 Procs (type #6)
+ depth 6: 2 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2ps3-2t.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2ps3-2t.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2ps3-2t.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,3 +1,2 @@
- §
-J íßn0Æs[ËMj;ÿ
u&ífÒ¤> "à&hFdJ~&ÙÖ-ÊáD*ç'EbbÄçÏçøUßÑ5ïf£A±íÆìΩ»ã/f2Â$!²¡4dÊñé
µmÒ:gó
Yè¢<ÑOÕâ`aô¯j3 úéO¹¤¸û²Æ¨?úgÕº(ÌeÇhözÕ_v ¿àDÎBrÙÇ8ÎÄõoUWÖúæCH'ÿk|RZkæó´ÌÃÏå¢(Õmê¦Ø¨,´ëª2u£ò Ó&ûÞÞÁé»ß«ùõËsP«MaSºohtOÂ7Õ¦Ý"@Bêz¼
-¿¥pÃ6ÅJÍS«\øáýî¾ Òiódê»öí++Ýþö£)·í
k+4./þ·[;RÐýÎþ»õ_F×þÕ?wr¾¼ð<ð×_0ñãú»v£VþúKÉ9êÁIý]\¾ÄðÏÿ#ÎÐÿ têoJ÷VÔ 1ºò·8Ð?îù? ä¾ò9E§ÿ«ZYU6CÆ8Ãÿ1èÐÿÓ¦ÛÿÆÚb®d Þþgmô?èÿiÓé÷¡7þû¿Øe ¸ÿ þ©6íyÁ[FÄúú7ËZ¥yÒfE¹èù>:ã¿8ÿÂ`üà··ÿm¼öÀ¦Í0ÿ'º°Ý¥ÿüßµ0ÿóÿiÓÏÿvÕ$¶4æY%¹ÒéÖoÿ33ô?ôÿéçÿj¹µEê¤ÈÏ£Ûÿìpÿ'úþÓ¦Óÿ6[*ð» 2?TØtÓç¿ÇßÿFýFÿiÓ'þkÔÿ#¬ÿBÐOÿ+Ôÿê§þpõ¬ÿõÿi3Ìÿ#Öÿ9ú¬ÿO~þ¿Bý÷ÿ `ýÚôóÿêÿèÐý Óâ'C P
\ No newline at end of file
+ èÕ9K íßn0s[ËMj;ÿ¯»Ü4i7&õ7As0Â$Súô3I#uQ ©>T
&¤FùùÃÇ'eåw¬ù4âQÔ>RÝïTÝã3Ja!²¡4¢|FS^ÔµmÒ:gó
Yè¢<qª-ÄÁÂ^ò¯jM5 úåOyDcs÷:eB2ÌòϪuQ>KÑïó~3!ØQþÄdK_È[x»²ÖÔ7_B¸ pã¾)ïµIóyZæá÷rQê6LuSlTÚuUºQyiýnßÁé»ß§ùóÇsP«MaSºWh|OÂÕ¦ÝMÔñ1^Kám§V¹äÃçÝûJ§Í©Wî¹_<X\éöo?rÛ>qí¦åà¿ÝÚÉjþ÷áôßÝÿ¹ xÿàuþ¹ÓÇYyñy0<.c\ÿAx+wܨÕå¦Áðü#NbÌù»Uù2s`xýSþп)Ýg¢FÑUÿ»ÀQþõ?ä¾ó
+9EÿU¬*qcá¿ý ý÷.ÿµÅ\« Îð?æè?è¿ßtøï~èèMàû?áþ>ù7¦2Ú,¶çNÁù33ìÿ0(ÿfY«4OÚ (½?Îõ_ÿKßÿpàö¿ïý0¿ã¢Û§50¸þgBbýÖÿ~ÓÇ»j[ó¬\ét;táþ3&"ôJúï1}ü¯[[d©Nü¬1ºý?úÿ?Fiþ«¿ßtøo³¥r¿+ *óGÕM7Cvþ{ûÏ$è?¸úûM÷úO®Óÿ§Øÿ
OþWéÿG?òìÿìÿý¿ãÿ¤ýÿý ûÿ~ÓÇÿ«ôÿqÿöÿý¦ÿWéÿ£ÿ ý ~ñAc! P
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2ps3-2t.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2ps3-2t.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2ps3-2t.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,6 +1,8 @@
-System(0KB HP=0*0kB )
- P#0
- P#1
-depth 0: 1 System (type #0)
- depth 1: 2 Procs (type #6)
+Machine (phys=0)
+ Core #0
+ PU #0 (phys=0)
+ PU #1 (phys=1)
+depth 0: 1 Machine (type #1)
+ depth 1: 1 Core (type #5)
+ depth 2: 2 PUs (type #6)
Topology not from this system
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2s390-2c.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2s390-2c.tar.gz (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2s390-2c.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,7 @@
+ *¹K í[oÛ6Çó:
+{]WÞEØCÒ!Xuv{4dvèQN~úQ²Øn]PØt~cGǼÞ$ZÔ²¿¡ñÛ³×;!êw¼ÿþÀ!»£õ÷L!ñyzdc«¨DèÌFéýsßk³ÿG¡þ·÷öµê@ÿ.8øßþ_ê;ë¯ýýÏp ú÷Âwýï>W:}±jÐßÿS
+þ÷ÁsþÍÔþþð¿Úü_äÖE¢OI£v°äüÿ#ÿËg¿ÔI>ÇÄýß02;Àh´ê¿ÔVgÕIi´ëë_b ú÷~ò2múw/|ê °ÿøÏÉÃøÏüGE´0©@ïñuaüçWì:éÒIÿU^äI¾¾ØôoÿÁú¯úù?ÎK=¯×L¶¶Óhmÿ 9jÿ)´ÿ>ØyA0MNÐÿ<1¶ÓÂ@ïù?eÂüß0ÿ6ô-¥¶Ý;ü#ÚõOÇbп@ýÓ¦þÍ2Ñó8ß¼Ðü èßT1¥
5 Òmý7ÏVf½)Þ0 ÿêûÿ@ÿ¯ôÿÓ¦þóÌMøß4@ÿTÀõ/þ§M·þ¿ìÍ<Ë+=h
+ ]ÿøxüïþýû ûü¯2©oTöù<ö?çüïp5 ä*$úÉÑIÿED¥ùU&ϤѮv¬A`ýÇ7¹slUQâ"mú?qê×Ðûú/@ÿï¸þ;mÚô_jGC:ý=zÏÿd ýû ÍÿKc¨oL¶Æ ëÿ0ÿ÷ÖÒtÿQöÿÀþo/tòÿûàþ?ÀþiÓIÿcìÿÐþû ÿ=îÿõ/ì< û&Ê úÝý?pÿ`ýwÚtÒÿû`ýϰþ7m:éý? /0Ì¥Tný(ÝÖGØÿ×½ £ÿiÓIÿ#ìÿpýÇ ÿiÓÿaÿ¬ÿ{¡ûüÏóþþ÷Á
!¾`rtÒÿû`ýǰÿgÚ´é߯7z9OãyÑåÜFw½nýhè=ÿ£õ пàúÏ´yÔQæ¯õÐZá=ÿ(1Üÿí
Cÿ»²8íQ?ߥýçâøù_T`ÿyÁõñJ%Fa(ÀL18 qÀ%Q(CbäºeÉ(áî3(³ú÷Ê8¤b+.Å!¨ÐÅC0ÁH9O×)
Û°.º$°P²;t!\XI)§!bJqUg¬Nr7SE.¬`.´ÉªI¥Hg¡B*ÁR2¡Y\ýS!æêQ©Ù¢^¿péWó곺ÂkkµE\ÊúÃæ,sDwÿ/<¾ÕKô¿ì*õêÔd«ü
ÓhÑ?áß>ÿÕùôï:ý»Ùß9j
+º½9ËU©õÎàem¹Ü¬Vº´ONÎò.ª§O0
Ëõ¨8¶¢ÆrWæn/!òqmyE6ʸê!¶ýlÊ,ûÙv¾ÍÁ¯¦¬î÷¯=ÒÏߥ©ô"o÷MlYýµ}Ê®)¨(Î
Pµ-·ë$ZìGTWj×TÖ:N"F¤É_Ýìªmé|ÎÊíÑB5±Õ©ª<·\ÿqu=ÿ¹Ú»í)×ù&õÁ©î,gú)-üËÓÔT¿÷§ÉfrWn[Kåf×Mî*H·¿Ò(qmã#æJló¶³|¶EäÎu?Ì»Mv»
+ãÚÞ¦t~Û¬uSÖó=Ïâ½Ã{nÝ?üÑÞ-¿søzSú°ùºÂUôæìÆÖߨ¶ÿ®GößþcþÍï0"áþ/Üéls³Ü5çèýå·×®RÌ~D»!R^ÚÎù:OMaQ¡KäjË9
+¤T?c<[é¨ÚÚþp´2¾Fe|lµJ4Jmú§6i«Í#GøÝ¹þÄäú]]ýYê¬2+7KÎî(D]8KÕ¿E Ý!7Hö"!Ã#Û /Á¿búJ
\ No newline at end of file
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2s390-2c.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2s390-2c.tar.gz.output (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/2s390-2c.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,8 @@
+Machine (phys=0 local=1025408KB total=1025408KB)
+ Socket #0
+ PU #0 (phys=0)
+ PU #1 (phys=1)
+depth 0: 1 Machine (type #1)
+ depth 1: 1 Socket (type #3)
+ depth 2: 2 PUs (type #6)
+Topology not from this system
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/48amd64-4d2n6c.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/48amd64-4d2n6c.tar.gz (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/48amd64-4d2n6c.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,481 @@
+ I¹±K ì]sÛ6Úsºþ8ìÎÄ-¾Aæ,i·owºéìÔÉâ+ÑNÒ_¿ )Ë "A|nµl@ >x䣿]-Æãüv>þéÕµÅßZõ¿÷0ÁãWé+$U![«<Z"ôj¹XämùºÒ/TÜÿl¹8ÊI°ûøSÁ¿5ÆÏtº8ä1Ì Kη?%RÖÆª^!|ÈJlÓÀÇÿ}<ÿ°È£ÙT*)¦2Ðçw7:í×e?'¡0)ÎMÚ»Çé4^®6i
´øÜÏÑø!XI¦XV¦Ý}2G:6ioÇyòW?'9£&íiTK¥XÜúÜQºHÿ¾i
+°ý¹jª}¼¦É,~N 㽤¾ïc?%ã<ºU*[¤½;U÷fÚ^éìZZ¥³´_eþ@ôYÔó¿Ë$ï£ñgGouÿ}íQ
+DX|î}eõj>íÝê-ÐCQ¤Í¢ûZUp ˾¾û3Ï¢dnuRTe~LeêæÓLÛ¼(ó÷xƳ»ÜnÇe©ÿS ÕÊdq.ýñëÝècºªDQwÇt\ïÍuÚ¦Ï>̳úç~^ÌçIþ¯DÿQ$ñPbÂÊ~)Óòx2z{·þ!¸¬ËæÑLýfxg"T,`RYÉW>gD²kÖi??<¦ËR=T0UôÀoâbGs[ ÇNøsõ4q&Ü=.³ZBf¿6QÌõÙs}¾pëãµ4úþÍúC¡ WÒÈÿizö=yêYô¬Æõ_ÛéÐ×¹ö뿾Ùcõû?m8×gzca$FféÉ'èÉG9$zÓW×ÎõuB¿!¡¨XôíÎ¥^òèpó#£ÒdÒS¨.WOYQÄL9eÏ<§³â.Ǥ¢¬¦sÄõ[]÷"_g ì%(ÞR9T8«!¥æ ú&£¨
Ìu®J¥ûÁ|éºÈpÝ0SYú+(~`¢¬,
+uöj1!"¨èº¢*¦ÒÕtR¾/+¢8³:cäº1¼DÓe{Í¥GZ"¬\}+Fu£qÑsL÷©5èî5¥é[SX ²«ì,¢lSY£ +Të]RcëúúU&dªÂô!cõéÓËÔ.,{7Ô×¢YVÐ$1*H· ÑW¡å{êûRºîâò8z¯{ l>ù¤MQc]
+û\Zgà¥}ȺרÎR½Õ}êP}lLM&¥Í¡çÇZI:¨L¸i2©
+Uö)Ci³6ëÓ¯ë"Bû¬¤vMª;Õ|*X÷ª6©g!æÞQȺWôÿrJn2Q»ãô´©å`Eñ²*ú>ÕZËÊÓbme6ë*ìá%AÃAº£XqfÑuYÔ¨GÏÅi`ίrp$Rµ©û5\W
5æ¶õt°îfU8¶Î4gb¦Öê¢AÑõÐ(
+gV3¢M¢ÍÍ'ë$/gÚueõ]{}îâ¼P²F]d¥¹fN©ePEQxm£çI/uh ¤û¢lBåt6-ÅÏ.ÆG_qd-G÷KP3Míú©]_ºG
+uôÅ)¬´^ð¼à/xÁ^ð¼àµýu3Î¿æ© ÝÜçÉ<ÖW2ýpKoLX;^â~tdT?¯FËÇ4MÒO®¾/¿¸Ó¥Ó<Yþ?Ô2a%&C¡Q é'7ó¤Q)Ì<Ð×(¡Àap1ßp4âÿúaÜë÷ÿR,xãûßÿ{ÑÚåßÞèSÿ)N'å(èÞ>æq'ã·ï1!4æÉìN!òf¾Ä³¿é÷aù¥Ñ<6zÿúGú)IãxiÜuͳY|³Êã,Ó?e½ÿí/ói¢0þQ7c óõ£þ ýþî&{ø¶JÆÑÕѾLîgºù½/±I)Læë´(KÆe®j&y¢KYÿÒdf&ñ[¼2oGñ×qåÉ"]ÿÎX`fñn¢®ÍÍl{éãëôÇÐf&1ÊV1ÊWc4_-QÅh>ÑøkPâÍó¥NùdR"4/t¶Ü|I4Mg«4EÓ¯º=Oÿ)zÈÑêÛJ7_÷íWë9Îd-2ýéIO÷h9ÑÎÐlØ$]|1y7º7Ìãi>2U[ÆÙèÓb1A©ùí"+~©óNFe§ h>MÆs¥ /t-º
+D¢lÓÍ¢éHd<ÏF³øS4þVOsSDÑÊñ2xþut?7õç'«h|JM:eËxçã´X=}AÉý
+>ÁA_&¹®Ù$N&#Ó©nßì~ùd12³2JI6ZEOñÍýâÓbdf~ÿz÷|âL9â¿£â«ìç¾]'J^e£¢Vs}j¿&}â¬l¦\=ß'ù
+=~¯7¿yJùc4»ÉtG/Ñ<JõaL9oôø£<ÏP®Ûu5ðüá/sίÐÃÌ|£ßÜØN#ê4Òâ4Õt§]
Ó8&?âËt½P§Ñ§M§QpÚÕ8àt»P§±§
M§1pÚÕ8íB¯iüBÆ·;â¦Ó88
+vZ§uhqi:MÓ®Æiz÷(/Ôi-±GJNà´«q/ÒiêBÖ{¤¬é4N§ÖiÁ
:%öHyÓi8
+vZ§
ê´Ø#M§
à4pÚ¿¹¾TH¤-øèDP"àµS{íR1¶ð£N¼vj¯5(Bö
+ at 2G @¼vj¯5*Òâµ$s Ä Ák§öÚYÃ"-^k B2G@¼vj¯5.Òâµ0$s! Ä!¯ÇkʳFZ¼Öd8$
8äõxíR¯kg´x%ÉqH
+qHðÚ©½vÖÐÈqH×5X±v=^»Ô{ȳÆFöC:¬QX³v=^»Ðë=knd¿8$w,Z£°jíz¼v¡×5zÖÜÈ~qHîX¶FaÝxíÔ^»Tn¤%ÉÜn¼vj¯]*7Òän7^;µ×Ρ{Å!¹#É yE^#éµ³æFZ¼Ö䮳 yE^»ÐëÚYs#-^kC
+GA¼vj¯57Òâµ8¤pÄ!Ä!¯ÇkúýÚYs#-^kC
+GAòz¼v©×µ³æFZ¼Ö8$8$xíÔ»57²_R8Ö¯1X¿^;µ×ÎÙ/)ë׬_»"¯]fÌ57²gÒ±~Ãú5ðÚ©½vÖÜÈqHÇú5ë×®Èkzy©ÜH[ÒÁpàFÀk§öÚ¥r#mqH7¹¯]è÷k쬹¶WR:ââ×ãµK½®57Òâµ8¤tÄ!9Ä!¯Èk9kn¤Åk-qHéC
+C^×.ôºvÖÜH×ZâÒ¯úßÈ>kn¤Åk-qHéC
+C×Níµ³æFZ¼Ö8¤8$xíÔ^;knd¿8¤r¬_°~
+¼vj¯57²_R9Ö¯ X¿^;µ×ÎÙ/©ë׬_»¯]èwÙü¬¹ýâʱ~MÀúµëñÚ¥^×.iC*7"¯ÚkÊ´Ä!À×NàµW «¿]éó3Îoçã´[:Æ1ôüÅßZõ¿÷0ÁãèßÊz
Ä1*S×£>¹½Z.y[¾®ôU}ü'ñS¢/¨=v®¤ñ÷¡mã¯ßçñü0§ÁîþL
+êsSóÝ'Áîã/¡0þ>ÔgüÍâ;ÎÝÇ_1
+ó¿õÿôqÝaXr¾uü 'Õñ§+}ÿßܦ>þfTGúò@à¦øY?ø®.ßOËX?m"ÃhäñrëØâ2$âF?ÜF³9At8Pâf?ÄËò7*àÏ[ýý?çI:]ìqÿ
eÍÿXaþ÷¡?SzÏ?,òhö"R)EDßYY~]Æñs
ä¸åã*l² DU ]ÊÛq<ÅV-AåiÔȤoq£¢tþ}Se¡¨£j&ä(eÌâM&$wbeªÕåcj<G÷³J+ýb~idù%Yæßê¬,ÿ]&y|?¿ÙZʯºÿ6±C+TØnÑû(ËU¡} ·ºÇê¥íÝ=èù ^]Dìø=^¦ñì.¯UØ>9ÈÓq«JQöþøõnôÑD«Ýkgy·xLÇq£2ØÕuæÙRîfÑ}½
Ý¢»?ãñ,Jæv]hPiôÝÇtYfz)KßÌÚúíñS9F#Ëq¸jÍz÷¸Ì6©ûû¿ÿü¿Géèñå\1ê>ÇèºÿÃÖæ¦(ùß¾çÜ]¾úûéÇlctú4îÿ#àÒ½?}=^ÌÓNþ%«}<Ð}ýo>ÿQ þ÷!o ßVýýÿ =[þ¿ Ø9þO Uÿ÷¢}Æóîb|~×uBì>þ/:ÈøOq<Úü¶qÝÿIë¿Á=ÿ°uÿ§Ë÷ïãi00ð¿ÿøõ¸Ìf«mÀ×aîÿÁÿÇøØêïÿIbããÝÑéÖxþÇÿ}R¤ÿ#òù?\þ³Â@Ô×ÿÄ7ÿ!þãCýÇß3ÿü½ð¿"LìÆÿÊ
+ÿ+Hÿ.$çþþ÷ÌÿÿáE%XHºù_âæ¹H7ÿ«, ¸ù_FìRü/g²QJ
+í%J:JÙÊÿ'ÿ[aÿÖ¥ÿ%Ýü/qó¿VNþ8ùß@ö ¸ø_2{ \üo±©ÅK7ÿìêºù_j×ÅÍÿJ»Nþtó¿¤ÿ%NþW¨°ÒhÿK+½ëä¶[ÔÆÿVþÿ%ù_뿼âÃVÿûå)¬ÿò"Óý¯Aa.vòÿÑø_ÑäáùÏä-!`ûᪿÿ=ó¿ÿ÷¢}ÆßÿãïEÿó¿RÿãGpÏ?lÄÿÇàÿñ"ðÿ°uÿÿ
õ?^þ¶úûß/ÿëÿýÈb~ÍÏ80Ì
+Q_ÿSßü/øõÏü/ļhÃÿ²S~ÿËÉ
ªò¿Â
ä¼Õßÿù_ÿxQ ÒÿÒâiÿEÆZT(uð¿,`,Vÿ˱
+ì5ù_Ây@¥ÔÐ^î,e+ÿK]ü/×#ØUÊ&S£.ü/íæ©ÿeÕuò¿ÔÁÿ@^F×þ¿¨Å¹ÿ¯n·ÅÍÿR;ÿ%¡}¾8ù_ªì,ü/íæi7ÿK]ü/ça¥EþN+¥¸ù_»6þ¶ò¿ôtü/õ½ÿ/Äÿ¼âÃVÿ{æ!þçE¦û
+ÿ˦öÿ vò¿Ïýaý·zKø~°êïÏü/Äÿ½hñ÷ÂÿÂø{ÑAÆÿü/¬ÿó"¸ç¶âÿcð¿pÿïEàÿaë þ?ÿë½ü?lõ÷¿gþöÿñ¢ù%ØÚXÿ;õñÿC´¥å<æñ|±ü¶ã1º¯ÿõý?âpÿïEø¢ÿCVßë?öÌÿýÿ þ{|õÏü?ð¿^ôÂÿ+ɸÜÿçþ_ Ìÿ'4àârÞêïÏü?ð^TÅØÉÿK._Ðfìàÿ ¸µC5vïÿ½¥±ÿ'vÇþß3¡ÆNþg)[ùìâÿ »JyÉT¯K'ÿ»ùìäÿi`-ÀÝü?víÿMiPF×þ߬Òh'ÿ/
]7ÿOì,.þñJü¿¨¨ÿÇÝü?îæÿ±ÿ§æ·³4ùÝs¹ø¶IÚøÜÊÿãÓñÿØ÷þßÀÿzÄÿþþ÷ÌÿÃúo/2Ýÿzý-ÌæÁi'ÿÿçç?ø÷?üß
+pýÕßÿ~ù ñ/Úgü}ðÿÆß2þÇàÿáû/çÿaë þ?ÿü¯ÿøÿü¿ç/ÿ[ýýïÿõ¿^´!ÿË-ÀÿYa êëå{ÿo ñê?þ^ù_áùÏ6ü/f»ßïà©$6ÿ+Â
ä¼Õßÿù_xþó¢,T
+þH¥µxNÕàä*°7kV.þ7BkãhåâE¬ü¯nRßÿsG)[ù_åâ"ÔYÅÿÖêÒÉÿªnþW9ù_$+]×Éÿ*'ÿ˶{×½ÿwP#ÿÀ.ÅÍÿ"»çþߺIV÷þßÜ>P'ÿ«ºù_ÕÍÿ*ÿ°â ÿ¤m8÷ÿ¦SªÿUü¯:ÿ«|ïÿ
+Ïÿ^ñ¿a«¿ÿýò¿¾ÿ÷¢éxÃÿÂþßÔNþ÷¸ÿ7õ^Äé-@«þþ÷¼ÿ7Äÿ½hñ÷²ÿ7¿düÎÿ*ÿþ£Á=ÿ°uÿÿ°ÿÿøÿûÃþ^þ¶úûß/ÿË`ÿ/*ßüݼ'0+E}ü¿HgIºïÕ}ýuþWð¿ÁþßÃVßë?óÍÿSÿúPÿñ÷¼ÿ7ð_^ôÂÿJU¸ÿ¯*ü?ç
+ÿWàpq9oõ÷¿gþø//*ÁbÖÍÿ3'ÿ/EXËRãÿz,.þ?´ÙræäÿÌd£Ú¯0v²ÿgNþ?$κØü.ü?ëæÿÿ¯ön'ÿÏü¿¢Ö*¶
ÿ¯dqîÿÍ+øeÿojeqóÿSÊÉÿW[ÔÉÿ³nþuóÿÌÉÿ+T²8ø}ͳ[ääÿ9µ{·ÿgü?;ÿÏ|óÿ°þÓ Ò7lõ÷¿çý¿aý§î±Y üÿ µÿ=òÿ°ÿ¿à2ðý`Õßÿùÿ{Ñ>ãï
ÿñ÷¢ÿ1öÿþÏàØ:ÿ±ÿ7Üÿ{øØ:ÿÁÿÃú?/ÿ[ýýïÿõ^d1ÿöB ¢>þÏ«Ur?Û{@÷õ_ÔãÿXÿ½øÿa«ïõûæÿÄ}¨ÿø{æÿ!þëEþiË ±ÿ/mþQ.xXåÿ±Ëy«¿ÿ=óÿÿõ¢,æ
+þ,0ÿ È[æ
+þÊâ¹¹ÿ'2¬
+Ò¹ÿ²ÅÁÿ#êùýÿ+Y:ùîäÿ4ÚÁÿ×ëÒÉÿónþ;ùª¤¥ÿç.þ
¬:nþßÎâÜÿ¿:F[øûdèäÿùýÿ»Eü?ïæÿy7ÿÏÝüX©®ÿÁ½ÿ?³»®ÿçü??ÿÏ}óÿÿ÷"ÿ[ýýïyÿÿyéþ×lZÌÓNþ÷ÉÿÃþ^Dù-
¤q¸êïÏü?Äÿ½hñ÷ÂÿÃø{ÑAÆÿü?¬ÿõ"¸ç¶âÿcðÿpÿïEàÿaë þ?ÿû¿yøØêïÏü?ìÿåEkø¿¾ f
¨ÿ¢Õh=î}îëÿîÿ½¨ïü/}óßâ>Ôü½òßþý??²øo¥8ÙÿaÿÍðþÂþïg®þþ÷ÌÃú/*ÁRÙÍKÿM)³ Yéä¿%µÀaéä¿y(¹ÅɳJ'ÿmï"/»ùoéä¿9VÒUÍWëÒÉËnþ[ná¿©¥ÿNþ;àpóßÕ~qñßöîúrÿì~qòß*°³tîÿ.»ùoÙÍËnþ[:ùoAd%ÿ&!µ[´
ÿ¶O©6þ[¶òßòtü·ôÍÃú/øï°ÕßÿùoXÿáEMÍþï¥`.vò¿Oþø//bòðý`Õßÿùoÿ{Ñ>ãï
ÿñ÷¢ÿÁùo¥ àúïCpÏ?lÄÿÇà¿áþßÀÿÃÖAüþø//ÿ
[ýýïÿõ^Tnø^ùÓPà0+Dþgßþ®õ?öÎgÇqÙú³®§ÈDýõ ^õ¦Ñë^LÊÊÔUÙOÿrºnµTùQKÑ@ÅùÝk§k
+*ydÄaÐ;ÿ£RÄÈÿp°büÇÿªð߯ñ&ÿ·
+ÿcaõøMÛç7Â/÷øA*?þãß¾¼õu}·ºø<nöòêèx×þoÿ8ÿaµ_Ùøë¿hºÿýÎÿðülú·÷Uõs¯±¹õÎã ÿË
+ÃsXüõ?¼tF}f ·þ£þ ÿ
V¢¹[ÿ+áÔ¿ZÄÿ Æùì×?ÿPÎäÎõÿªgøë?JBÔYx×YпDVë¿ètÿ×ͰîÌ÷÷¸õ?Ïÿ©ýÿxH£2T¡}¬×¿.^Í`%îYÿUIú/ã_ÕGóÕ×â?þ*Qÿg6þ}õ·ÔÿKæõ¿ñD
ôË
¦ÿy5§ÕÏpëYÿO±ÿgéÙÐô_4/¦3uñªÚfÿ¿Ë·þõ¿ç¿xHÑ¡W44ýó Oòou7TCÕÔ<Ã?þ§*ÿøeCÓÿýÖçMë~üÛª×jxûðø¢ÿ8ê)bþïEwæh/ÊWôuêéÿ qþûõÃÿ#»õ¿â üãûàÿ
+MÿÃ[»eýOÍë¿aáþþ¬«²2GLB¡é¿¾Lg3 ½~@wüëäÿxH°
+EÿÿËöÿÿkh㿵ÿk>ÿàþGÒö/ÉÐôÏàÿÿÔeCÓ?ÿõàÿ
+Mÿûû¿R¬ÿY@ü
+Mÿ[û¿æúOÒõý
+1ÿ·¿ÿûì×ÿ\îÖÿ^þ/ìÿY@ùW64ýoìÿúQÿìÿYøM3\húßßÿ
üðÉ¢ÿ£ÿWÿ´ñßÚÿ5Ïÿ8ÿÇD¢Ô0¹ÐôÏàÿBýÜý#þü_Øÿ± ÿlú·?äǪ×O'»têÔ¿ZÔÂñ
àëm0H¦þð° ÿ§lhúß½ÿ_û¿y $CÌÿïïÿÄúûõ[ÿgûÿDr·þ7ñ.ôÃÿÍ
+UÝ
¦þèÿÉúÿÉfü¿r<ÿþY@þ_64ýoíÿÿÃ,þ9PY@CÑ¿âðãþohãÏÐÿ÷?±þ²¡éÁÿõðȦÿ7ê¿,Àÿ-þúbýÏâ¿lhúgèÿúèþ!bþoÿ'öÿ,دý?år·þ÷êÿý?hÿ%þ·ö.ëöÿ,ü^÷Cw)lö@húgèÿ ý³þ²Yÿ¦¶¹~Ò3üóA`ýÏòÿ²YÿÛKÙ¿<Vá~þÏ IÐÿïñïÌI×Üsá÷þ'R1ú°ål¼õ?¾VuÙäÅ¥Ëí+áÎÿÌçÿ8P¨ÿ² ²i0 Å[ÿ}¡Çàs®_uuÿÚ/¦.*óÁÀ©ÿd®ÿ4 Ðÿ
wý?¨èýU½¿^Gæáp}ÁüðBÖÿsójººéV<Ãÿùß ýxhMW6ÝY×
ƲAü¿Í¦úO³yüGÿo&¦îM÷j-¼æ¡©f
+ñ³¾Õ
yh/ã[=þáw3?
+dýïºÿ2ôÿàûÙxëÿ©júüT«õjð׿= ýs ýËÿÏúëñ÷?ó ýË\ÿ:]÷Ó©ïÜêâóóþ©ÂþÄ/²þwÿq ÿgñ_6týWõfúæùø¸8@þ¢ñßÿzèý\àÂýúÿf
+ýY ÿPM>F ûóPsþ_Ôãý?y¸ù¿Ì&ÝO7ØøN}{ÜÞnoþí6تþA®9 ÷3Üë¿ùù¿X%Xÿ± )Ë^ÿÙsÿÿØÿɬÿcW½5îoÿ;Óúç`òwÖÍÇϸ^"Þú×ei
+¿àîø¿8ÿ¦¨ÿ°óß²!ÇÛø«5æ¸âîø¿èÿk¯þøåR÷¶mºqJÿS8Öé?)}nL;üÕõì?ÊT¨Pÿá`õøMÛç7Â/÷øAfïÀøïÿø»û§ÕÅgýlòʵp¯ÿÃÙøÇiý?b¾hüõ_4Ý
+Í¿þm8èlÿeCÔ_=Ù,@¿æúúOçñ?Éÿc!JãsXüõ?¼tF}f ·þ£þÀÿÃBûEs·þW<éµÿAü?ÖÛûßÛ8`*ÇëÿUÏð×àþ/ʲþ³ZÿE§û¼nº<[ÿóõ¿bÄ=jõ¿LÇ¿HÖëºÿô+qÏú¯JcÔ9ðÿéþÇÐó×ÀüÇPÿg6þ}õ÷÷ÿþ£ÿÓTÿcäÿXHTø"¿\hú?WsZý·þõÿûPÿ
+MÿEób:Ûó1·çå[ÿú_þo<¤¨ÿ¦ÿoàIþî©ìÏðÿiû¿yÀýß²¡éÿ~ëó¦Ìu?þíÊ^T
+÷ô^ÄÿLÁÿÏJ1Hÿ{Ñݵ@~ÖëNý/ý?aý?ðÿÈæný¯8 àÿã8ÆþøeCÓÿðÖnYÿSóúo&ôÏÁuUVæI@(4ý×óélÀ¶r=Ãÿãyüÿã!A0ÑPôpø¿"ø¿8 ÿÖþ¯ùü1ú?³Æ°I¦ÿü, þ+þ÷÷¨ÿ° ÿlhúgðaýÏâ¿lhúßÚÿ5×2Ýÿ ýﲿ²!æÿö÷aÿÏü_²¹[ÿ;ù¿Ðÿø¿dCÓÿÆþ¯ôH°ÿgá7=hÌ r¡éÁÿý³ ÿl(ú8ü_)ü_ÐÆkÿ×<ÿâüR8ÀäBÓÿîþ¯8@ýÜÿ'þúaÿÇü_²!êßþ«^?LîÒ©Sÿþÿñ¸ þ9¾ÞóDhúgðÂÿÁü²¡é¡ÿÎÿ³0HÿßÝÿþ?<ü¹[ÿø?úáÿæ!ãºMÿýÿÐÿôÿÍùåx[ÿ?ÈÿCÿ, ÿ/þ·öÏÏÄQû¿YPY@CÑ¿âðãþohãÏÐÿ÷?±þ²¡é¡ÿ'Ö,Àÿ!þüߨÿ² ÿ·lhúgðbýÏâ¿lhúgèÿúèþ!bþoÿþØÿ³þ²¹[ÿ{Ýÿý?èÿ)þ·ö.ë öÿ,ü^÷Cw)lö@húgèÿ ý³þ²Yÿ¦¶¹~Ò3üóAbýÏòÿ²YÿÛKÙ¿<Vá~þÏ IÑÿïñïÌI×Üsá÷þ'R ú°ül¼õ?¾VuÙäÅ¥Ëí+
áÎÿÌçÿ8PÿeAeÓ`·þûBÁç\¿êê4ÿµ_L]TæSÿÉ\ÿi¢Ðÿ
wý?¨èýU½¿^Gæáp}ÁüðBÖÿsójººéV<Ãÿùß ýxhMW6ÝY×
ƲAü¿Í¦úO³
ÿþ¦îM÷j-¼æ¡©f
+ñ³¾Õ
yh/ã[=þáw3?
+dýï¼ÿGÿ°ÿ·þª¦ÏOÕ¹Z¯ýiûXþeCÿgýu×øý³ ýË\ÿ:]÷Ó©ïÜêâóóþ©ÂþÄ/²þwÿ!òÿ, þË®ÿªÞLÿÁ<ÿÿÈ_4þûÿA½|R¸_ÿß,Dÿ_ã?TgÀþä<äÿõß8FÿOnþ¯dT\üïÓÍ|º9ÁÆwÁíÝáöæßþg ê¿ôér?ýþÿUõ²lèõ}÷ððýlÈú?vÕ«Yãþ¦ø¿£8Ë &gÝ|yüà%â]¦ð; îÿóßaú8ÿ-rü·¿Zc+áÿþ¿Aÿ¿\êþÒ¶M7Né¿b*Ç:ýÿ£ôý¹1íðWׯyBe*T¨ÿp°zü¦mNÍóáÁ{üà ³ë?ÿþøÿ·»Z]|ÖÏ&¯\k ÷ú?¢ÿ/èþ)ýM·Bóßã¯ÿ0RèÿÆBý¨ÿ¾z²Y~Íõ+ôÎãú?aüa¿þÎè£ÏàÖ4Ó¢äÿYÿñKæný¯xSÿjÿþì×ÿßð}0ãÎõÿªgøë?J"øX¿ýò¿e ýeµþN÷/yÝuyþ·þçù?¡ÿ+ETFI¦ch_&ëõ?ÝÿGz¸gýW¥8ÿÉçøO÷?¿þã?þú?´ñï«¿·¼ÿ÷ý¦ú_øÏC¢Â?úåBÓÿɼÓêg¸õ¿¬ÿãüðÿȦÿ¢y1íùÛKsÇrÀÿEý/R¨ÿ³âühhúÿæäßên:Á~ðÿøü,àþoÙÐôÿE¿õySæºÿve/ª{ú?/â¦àÿgA¥ $CÌÿ½èîÚ ?ëÖõ§þþ0ÆþûõÃÿ#»õ¿â üãûàÿ
+MÿÃ[»eýOÍë¿aàþþ¬«²2GLB¡é¿¾Lg3 ¶
+ëîøÏãüBP2ýþ¯þ/h㿵ÿk>ÿaþo,¤1ì_¡éÁÿÿ'¨ÿʦÿýý_ê?,Àÿ%þü_Xÿ³ø/þ·öÍõd
+õý
+1ÿ·¿ÿûì×ÿ\îÖÿNþ/ôâþ/ÙÐô¿±ÿëýìÿYøM3\húgðAÿ,Àÿ%þ#ÿW
+ÿ´ñßÚÿ5Ïÿ8ÿÇD¢Ô0¹Ðô¿»ÿ+Pÿa!öECÓ?Cÿ/ìÿXÿK6DýÛòcÕë§É]:uê_-ê?ã úç øzÌ¡éÁÿ ÿðʦþ8ÿÏB|À bþwÿ'úÿð`¿þÿF¸ÿO*wëÿçBÿ1üß<ñ#, ¡é¡ÿú²þ²Ù"ÿ¯ÏpëÿùèäÿeCÓÿÖþïùù8·Ð?*p`(úWþoÜÿÍmüúâþ'ÐÿS64ý3ôÿÄúø?dCÓ?ÿõ_àÿ
+MÿþO¬ÿY@ü
+Mÿý?QÿaÝ?dCÌÿíßÿûì×þr¹[ÿ{Ýÿý?0ʦÿýËú_ý?¿×ýÐ]
+½ÁD þúBÿ, ÿ§lVë¿©m®ôÿü_
Xÿ³ü¿lÖÇÿöRvæ/OëçU¸ÿ3HRôÿeÁ{ü;sÒÃ5÷ã\ø½ãÿTþ, ÿ#oý¯U]6yqérûÁg¸ó?óù?"ÔYPÙ4âÿ¾ÐãFð9ׯº:MÇíÇSù`AàÔ2×(ôÿ`á]ÿ*zUï¯×y8\_0?ü¤õÿܼ®nºÏpÇÿEþ7@ÿZÓMwÖua qlÿo3Áé §þÓláÿÿ¢©{Ó½Z¯yh꣧ãÃeü¬ouaÚæËøVøÝLåÀOYÿ;ïÿÑÿìÿeãÿ§ªéóSu®Ö«Á_ÿaáþ ÙãÿYÝ5þCÿ,@ÿ²!×ÿN×ýtê;·º¸çüç¼ÿ_ª°ÿçá ñ¬ÿãü?ÿ²¡ë¿ª7Ó0ÏÿÃÿÃÅòÿþÐCïçî×ÿ7ÑÿâøÕÙäc°?99çÿEý7Ñÿÿ+§"õéæ>Ý`ã»àöîp{óoÿ³ÁFPõßút͹á^ÿÍÏÿÅ*ÃúHY6ôúϾû?ø?xÀþO6dý»êÕ¬qSüßQeÐ?¿³n¾<~ÆEðñÖ¿.KSø wÇÿÅùï0Cýÿ
+9þÛÆ_1ÇÏpÇÿEÿß ÿ
_.uiÛ¦§ô_1c¥þCJßÓuý'úO 2eûÿ£þ³?«ÇhÚæÔ<¿~¼Ç?²4Áøsà?þßîþiuñY?¼rÜëÿp6þqû?y@ÿ?Ùøë¿hºÿýQþo,àú?ÙõßWO6Я¹þc
þÓyüORÔÿYPáca¿þÎè£ÏàÖ4Ó ÿÏCöÿ¢¹[ÿ+áÔ¿ZÄÿ ÷ÿñ`¿þÿA<¦qܹþ_õýGIÿïú/ËúÈjýî_òº>êòü1nýÿíù¯ñôÏÁ!N#éÚÉzýO÷ÿa%îYÿîAýw<ǺÿÑ×â?þ*Qÿg6þ}õ÷÷ÿþ£ÿÓTÿw ÿ$*ü¡_.4ýÌ«9~[ÿóõ¥Èÿ±ô¿lhú/ÓÙ¹½8w,ÜúfúO¢ ýYHa
+Mÿß<Àü[Ý
+S'ØáÿSÁÿËü¿²¡éÿ~ëó¦Ìu?þíÊ^T
+÷ô^Äÿýßy
P)& Éó/º»¶ ÈϺu=éÿ¥ÿ'PÿgÁ~ýðÿÈåný¯8 àÿ'ýÇèÿÌü¿²¡éxk·¬ÿýãþðZÿCügáϺ*+sÄ$ þëËùÉt6`Û ¹áÿñLÿqüÂ@2ý»ú¿®þß8ÿÚøoíÿÏÿãúû?Òö/ÉÐôÏàÿÂùPÿ
+Mÿ»û¿BÜÿÄü_²¡éÁÿ
õ?ÿ²¡ékÿ×\ÿIû_x@öW6Äüßþ¯kýýx°_?ü_r¹[ÿû¿&ýÇ!öÿ,Àÿ%þ7öý£ÿõþcÿÏÂozÐäBÓ?ÿúgþ/ÙPôqôÿJáÿâ6þ[û¿æçÿàÿç"Qê \húßÓÿu½ÿ+Cÿp÷lhúßÓÿ]û¡ÿðɨûC~¬zýt2¹K§Ný«Åùÿ0Büg!øzÌ¡éOÿgtõ¢ÿ7ðʦÿ=ûÿE×þð±0Hÿß½ÿ_õ?öë·÷ÿØänýoâÿ\è?Æý?<¨Ãc\húß³ÿ_ÿ'#èÿ'-òÿÊñRþúgùÙÐô¿µÿ{~ÿgþ/L¨,À
+ ¡è_qôÿàÿæ6þý?áÿbý?eCÓ?CÿOäYÿC64ý3ôÿÄù/àÿ
+Mÿý?±þgñ_64ýïÞÿ3àÿbÝ?dCÌÿíßÿûì×þr¹[ÿ{õÿÄþôÿ
+Mÿ[û?õ¿û~¯û¡»6{@ 4ý3ôÿþY@ÿOÙ¬ÖSÛ\?éþù¿
+°þgùÙ¬ÿí¥ìÌ_ÖÏ «p¿þ¿A ÿ/Þãß®¹çÂï¿üÿHÅèÿÁò?²ñÖÿøZÕe.·¬x;ÿ3ÿã Äù?T6 &¡xë¿/ô¸|Îõ«®NÓñ_ûñÅÔEe>X8õÌõ&ê¿,¼ëÿAEï¯êýõ:2ëæ²þWÓÕM·âîø/â?ü<´¦+î¬ëÂ@ãÙ þßfÓNý§Ù<þ£ÿ7ES÷¦{µ^óÐÔG3NÇËøYßêÂ<´Íñÿð»Ë²þwÝÿGúðý¿l¼õÿT5}~ªÎÕz5øë\ ÀÿÁô/rü?믻Æèè_6äúßÐéºN}çÖP÷ÿ÷ÿKöÿ< ~Ñõ¿kü
ü?ÿ²¡ë¿ª7Ó0ÏÿÃÿÃÅòÿþÐCïçîåÿVáÿæ8þCu6ùìOÎCAÎùQÿãõnþ¯$£ÿeé§,øtsïÛ»ÃíÍ¿ýÏAÕ3èÓ5ä~{ý7¿ÿ9V)Ö,@ʲ¡×öÜÿÁÿÁö²!ëÿØU¯fûâÿâçÿYüuóåñ3.·þuYÂï ¸;þ/θÿÿ
+9þÛÆ_1ÇÏpÇÿÅýïÿ
_.uiÛ¦§ô_1cþãÒ÷çÆ´Ã_]ÿÉþ¨L©õVÿдͩy~#ü"xdîÿdÁü¿ÝýÓêâ³~6yåZ¸×ÿálüã4Aþ
1_4þú/n
æ¿Ç_ÿaõ?Hý˨ÿ¾z²Y~Íõ+ôÎãü?QúgÄâ¯ÿá¥3úè3¸õÍô¨ñ#èùÑÜÿÏpê_-â ÿ3öæ¿ÿÞÆS8î\ÿ¯z¿þ£ýy(ËúÌjýî_òº>êòü1nýÏ×ÿ*Âý<¨8NCéâÉzýO÷ÿa%îYÿUiú/ã?ÝÿèkñÿñÔÿY _ý½åý¿ÿèÿ]ïÿEþ
D
òË
¦ÿy5§ÕÏpëYÿϰÿgéÙÐô_4/¦³=s{)pîX¸õ¿¨ÿáþ_&Òdhúÿæäßên:Á~ðÿøü,àþoÙÐôÿE¿õySæºÿve/ª{ú?/â¦àÿgA¥ $CÌÿ½èîÚ ?ëÖõ§þþ0Æþøds·þW ðÿ
qaÿÏü¿²¡éxk·¬ÿ©yý7côÿcáϺ*+sÄ$ þëËùÉt6`Û ¹áÿñ<þGÈÿñ(, $CÑÀáÿRðq@ÿý_óù\ÿáþ?Òö/ÉÐôÏàÿÿÔeCÓ?ÿõàÿ
+Mÿþ/¬ÿY@ü
+Mÿ[û¿æúO² õý
+1ÿ·¿ÿûàÿÍÝúßËÿ
ý?ðɦÿý_?èÿ`ÿÏÂozÐäBÓ?ÿúgþ/ÙPôqø¿bø¿8 ÿÖþ¯yþ'Äù?&¥pÉ
¦ÿê?,àþ?ÙÐô¿¿ÿKaÿÇü_²!êßþ«^?LîÒ©Sÿþÿq!þ³|½
+æÐôÏàÿÿø?eCÓ?Cÿ?ÿg!>`1ÿ¿¿ÿëÊþOÉÜÿMüýÇðóqÝ
¦þèÿÉúÿÉfü¿r<Ãÿäÿ¡ÿ
+Mÿ[û¿çç?â(Àýß,¨,À
+ ¡è_qø¿qÿ7´ñgèÿûX@ÿOÙÐôÏàÿÆúø?dCÓ?CÿOÔYÿ[64ý3ø?±þgñ_64ý3ôÿDýtÿ
+1ÿ·¿ÿûÐÿS6wë¯þØÿ³þ²¡ékÿç²þ`ÿÏÂïu?tÂfo0¦þÐ?èÿ)Õúojë'=Ã?ÿD
+ëÿÍúøß^ÊÎüåiý°
+÷óIþ¿,xgNz¸æ~¿wüó?JÐÿädãÿñµªË&/.]n?Xñwþg>ÿÇAú/*F P¼õßzÜ>çúUW§éø¯ýøbê¢2,úOæúO
þ,¼ëÿAEï¯êýõ:2ëæ²þWÓÕM·âîø¿ÈÿèÿÃCkº²éκ.4.
+âÿm&ø0àÔ-üßððP4uoºWká5M}4ãTp|¸õ.ÌCÛ|ßêñ¿)°øi ëçý?úðý¿l¼õÿT5}~ªÎÕz5øë?L#ÜÿÃô/rü?믻Æèè_6äúßÐéºN}çÖP÷ÿ÷ÿKöÿ< ~Ñõ¿süÿgñ_6týWõfúæùø¸8@þ¢ñßÿzèý\àÂýúÿf!úÿ²@ÿ¡:| ö'ç¡ çü¿¨ÿÆ1úòpó%Ùø¥«øÓÍ|º9ÁÆwÁíÝáöæßþg ê¿ôér?ýþÿUõ²lèõ}÷ððýlÈú?vÕ«Yãþ¦ø¿£8K &gÝ|yüà%â]¦ð; îÿóßaú8ÿ-rü·¿Zc+áÿþ¿Aÿ¿\êþÒ¶M7Né¿b*ÇJýSÚþ|cÚᯬÿÄÙ¨Mç?QÿÙµã?4msjßöîÿ4d*Ãøsà=þß®þiuñY?¼r.Üëÿp6þqý?HýÉÆ[ÿEÓÑü÷øë?Äùo&pýlhúï«'è×Üþáwþãÿú?²<*´ ·þÎè£×àÿ Dügñ_6÷êÍ3úÿ.ÿÿÿÿæÁ~ýï÷ÿ)ääqßúÝ3üõÅ)îÿaáÿô_%ô/µú/:Ý¿äu3|Ôäùÿ[ÿóú
+SäÿYPO*Ó1"¿TVëºþö+qÏú¯
+RÔ9ðÿéúÇÐ÷×ÀüU¡þÏiüûêo ñÿqþD
øË
¤ÿy5§õÏpëQÿBìÿYý_6$ýÍélËÇÜÞ »nýGóú_áü)
+¢!éÿx«»ajûÑ3üãªPÿçæÙôÿE¿õySæºÿreïªÛ?Sâ!ÿÏJ1Hÿ{Ñݵ@~ÖóNý/ý?*ÃþûõÃÿ#{õ¿æ ÿú?RøÿYÀö_6$ýoí¦õ¿
ÿÇ6þ9ø³®ÊÊ1
¤ÿúr~2Í Ø.@Îg¸ã<ÿ!ò<$
+@Éô°ø¿ø¿8 ÿæþ¯ùüªýYHcØ¿$CÒ?ÿKÁÿÉ꿲!éÃÿ
úðɤÿÖÿ, þˤÿÍý_þOiúÈþÊÿÛßÿ
ó<دþ/¹Ü«ÿÝü_èÿƶÿ²!ékÿ×ú?àþw~ÓÆ þ9ü_Ð?ðÉ ÿÁÿÙþÏðíiü7÷Íó?!Îÿ1(uL.$ýsôÿBý
Ú
+Iÿþ/ìÿXÿK64ýÛòcÕë§É2uê_Íõ+ÿç!øzÌ!éÃÿ ÿðʤþ8ÿÏB|À Zþ¡ÿÖÿ,دÿÝÿáþ?yÜ«ÿmüÿGûÿx¨^0$ýsôÿÃý, ÿl6Èÿ+×3ÜúÿAþúgùÙô¿¹ÿ{~þ##ÿbAen Aÿ¥ÿ'îÿf4þý?ÿaý?eCÒ?ÿë?àÿ
+IÿþoÔYÿ[6$ýsø?±þgñ_6$ýsôÿDýtÿ
+-ÿÇàÿÄþûõ£ÿ§\îÕÿný?Ñÿ
lÿeCÒÿæþÏeý/Ãþ
ßë~è.
Mß`&Iÿý?¡ÐÿS6kõßÔ6×O{ÿúßÎ Ð?ÈÿËfuüo/egþòµ~NX
ûù?D¡ÿ/¾ãß®¹÷Âïÿù?
+°ÿãùÙøê|ê²ÉKÛÖ<ÃÿÏÿQ þËʦÀ, _ý÷
7Ϲ~ÕÕi:þk?¾º¨ÌG§þ¹þÓ8Bÿ?Þõÿ`oÜ^Õûëud×Ì?)Tý?7¯¦«nÍ3Üñÿ2ÜÿÊCkº²éκ.4.ûãÿm&ø8àÔÿ(ö¹ÿý¿y(º7Ý«õð¦>q*8>\ÆÏúVæ¡m¾oõøßÍXü4Põ¿÷þý?xÀþ_6¾úª>?UçÊCþú÷ÿ° ýËÿÏúë®ñ÷?ó ýËZÿ:]÷Ó©ïÜêâ®óóþiý?_4TýïÿcäÿY@ü
+YÿU½þyþþ.¿h¼÷ÿzOø¤p¿þ¿iþ¿,ÐÆ¨Î&#ýÉ}(È9ÿ/ê¿qþ<Üü_IFÉÿÔ§,øtsïÛ»ÃíÍ¿ýÏAÔ3èÓ5´âîõߢÿÇø#ôϤ,rýgçýü<`ÿ'ªþ]õjV¹¿Iþï8Dÿ/&gÝ|yüà%â«]¦ð< î¿þBBÿàü·l¨ñß6þj9®y;þÏûÿFYÿ¿\êþÒ¶M7Îé¿b.Ç:ý«Ôøçi¿²þê?Êúÿð°zü¦mNÍóáÁ{üà Kc?þãÿíòVõ³É+×"Àgýÿ8Eÿ?ÐÿO6þú/n
æ¿Ç_ÿa þǺÿʨÿ¾z²i~£û?ÒyüORÔÿXPáca¿þÎè£ÏàÖ4ÓdÈÿ± P ÍÝú_ñ§þÕ"þ1ú?³`¿þéþ¿8
+H w®ÿW=Ã_ÿQ¢þÏ»þ˲þ%²ZÿE§û¼nÛ<[ÿóüßAÿ¤Qþ/Ó1´/õú. $=ÃJܳþ«ìùoÔ÷Çsü§ ÃÏÿÞæÿõhãßW{ÜèÎÿ%óú_øÏC¢Â?úåBÓÿɼÓêg¸õ¿¬ÿ§Øÿ³ú¿lhú/ÓÙ¦¹½8w,Üú_Ôÿ¢ õRÔÿDCÓÿ7ð$ÿVwÃÔ
+ögøÇÿTeðÿ± ÿ¯lhúÿ¢ßú¼)sÝ»²UÃÇ
+ ñ?àÿgA¥ $CÌÿ½èîÚ ?ëÖõ§þþ0ÂþûõÃÿ#»õ¿â ücôÿâþ_ÙÐô?¼µ[ÖÿÔ¼þ¸ÿ?몬ÌPhú¯/ç'ÓÙíäz;þÇõ?ò<$
+@ÉPôpø¿Bø¿8 ÿÖþ¯ùü?®ÿÐÿ
4ýK24ý3ø¿àÿdõ_ÙÐô¿»ÿ+ÌPÿaþ/ÙÐôÏàÿÂúÄÙÐô¿µÿk®ÿ$ÍPÿaÙ_Ùóûû¿°ÿgÁ~ýðÉånýïäÿBÿ'àÿ
+Mÿû¿~Ðÿ!Æþ
ßô 1È
¦ÿôÏü_²¡è?âð%ðq@ÿý_óüOóL$Jà Mÿþ/ÔXÀÝ?²¡é¡ÿö,Àÿ%¢þíù±êõÓÉä.:õ¯õ0Düg!øzÌ¡éÁÿ ÿðʦþ8ÿÏB|À bþÿ'Öÿ,دßú?#Üÿ'»õ¿ÿs¡ÿþoTø¨2è^,4ýïßÿ/FÿOÐÿO6[äÿãü?úÿòü¿lhúßÚÿ=?ÿYýs ² 7¢ÅáÿÆýß,ÐÆ¡ÿ'îbý?eCÓ?ÿë?àÿ
+Mÿý?QÿeþoÙÐôÏàÿÄúÄÙÐô¿{ÿÏ,@ýtÿ
+1ÿ·¿ÿûì×þr¹[ÿ{õÿÄþôÿ
+Mÿ[û?õ¿û~¯û¡»6{@ 4ý3ôÿþY@ÿOÙ¬ÖSÛ\?éþù¿
+°þgùÙ¬ÿí¥ìÌ_ÖÏ «p?ÿg$èÿË÷øwæ¤kîǹð{Ç?ÿ©ý?X@þG6Þú_«ºlòâÒåöÏpçæó< èM#I@(Þúï=nsýª«Ótü×~|1uQNý'sý§Iþ,¼ëÿAEï¯êýõ:2ëæ²þWÓÕM·âîø¿ÈÿèÿÃCkº²éκ.4.
+âÿm&ø0àÔÍã?ú3Q4uoºWká5M}4ãTp|¸õ.ÌCÛ|ßêñ¿)°øi ë×ý¡ÿØÿËÆ[ÿOUÓç§ê\W¿þÇ îÿaú
+9þõ×]ã?ôÏô/rýoètÝO§¾sk¨{ÎÎûÿ¥
+û¿hÈúß5þǶ$ ý3ø/ºþ«z3ýóü?ü?\ Ñøïÿ=ô~.ðIá~ý3
þ¿,ǨÎ&#ýÉy(È9ÿ/ê¿qþ<Üü_IF útónN°ñ]p{w¸½ù·ÿÙ`#¨úo}ºæÜÏp¯ÿæçÿbbýǤ,zýgÏýü\`ÿ'²þ]õjÖ¸¿)þï(NSèÉßY7_?ã"xxë_¥)ü»ãÿâüw¢þÃÎËÿmã¯Öãg¸ãÿ¢ÿo àÿbáKÝ_Ú¶éÆ)ýWLâX¡ÿ¶3½©ïøåwÇÿÿóÅYú@e òÿ<qÙËeeü(}¿nL>ú¯Êíÿúïþ¬ÿ¡iSóüFøEðÿ0ÈRÔÿYðÿowµºø¬M^¹ö îø¿¨ÿ¥1Öÿ, ÿ§lüõ_4Ý
+Í¿þÃ(@ÿo ÙõßWO6د¹þg
þù¿$Áù/TøFÄâ¯ÿá¥3úè3¸õ¿¸ÿ;ÈÐÿñæný¯xSÿ?¨ÿŨÿ³`¿þéþÏ0
+P w®ÿW=Ã_ÿQ¢þÇ»þ˲þ%²ZÿE§û¼nº¼[ÿßçÿ{þ3ÿc!Ê0ÉtíËd½þ§û?Iϰ÷¬ÿª$DýÏñî
+=
+üÇ_E1êÿ,ÐÆ¿¯þÞòþïEÿ·0ÿc!Qáýr¡éÿd^Íiõ3Üú_Öÿáÿå·Ë¦ÿ¢y1íùÛKÁsÇrÀÿEý/ÌPÿg!Åù?ÑÐôÿÍ<É¿ÕÝ0uþàþñ?Uò,Àÿ'þ¿è·>oÊ\÷ãß®ìåaÕpOÿ÷EüÏøÿYP)& Éó/º»¶ ÉϺu=éÿ¥ÿ'°ÿgÁ~ýðÿÈåný¯8 àÿã÷¿ð ÿ¯lhúÞÚ-ëËûÃýÿXø³®ÊÊ1
¦ÿúr~2Í Ø6`®g¸ãÿ¼ÿçþÿc!Q¨ J¢ÿ`Wÿ×Õÿðq@ÿý_ñlüG°ÿc!aÿMÿ{ú¿«ÿë?Pÿ
+Mÿ{ú¿«ÿç¿YÿK64ýïéÿ
+&ÿWõ?ÿ²¡ékÿ×\ÿIûßx@öW6Äüßþ¯àêÿÂþûõÃÿ%»õ¿¹ÿ+¸ú¿°ÿgþ/ÙÐô¿±ÿëý®õ¿û~ÓÆ þ÷ô]×ÿÈÿñ ÿl(ú÷½Î*Ü»ÿWÿ´ñßÚÿ5?ÿâüR8ÀäBÓ?Cÿ/ÿaéÙÐô¿{ÿ¯hücèø¿dCÔ¿ý!?V½~:Ü¥S§þÕâü"þ³|½
+æÐôÏÐÿý¿YÿS64ý3ôÿÿ
ø @2Äüÿþýÿ°þgÁ~ýÖÿáþ?ÜÿMüýǸÿ>ªºMÿýÿàÿbýÿd³Eþ_9AÊÿCÿ, ÿ/þ·öÏïÿÑÿ
¸D0ý+ÿ7îÿf6þ{öÿ|ßÿáþ'ÐÿS64ý3ø¿±þcþÙÐôÏpÿ3ê¿,Àÿ-þüXÿ³ø/þ÷ìÿ©®ý?QÿaÝ?dCÌÿíïÿÄþûõ£ÿ§\îÖÿ^÷?cÿÏúʦÿýËûÿbô`á÷ººKa³7BÓ?ÃýÏÈÿ±þ²Yÿ¦¶¹~Ò3üò6þQþ, ÿ/õñ¿½ùËÓú9aîçÿýYðÿÎôpÍý8~ïøç"£ÿÈÿÈÆ[ÿãkUM^\ºÜ~°âîüÏ|þ
ú/*F P¼õßzÜ>çúUW§éø¯ýøbê¢2,úOæúO ý?Xx×ÿÞ_Õûëud×Ì?)dý?7¯¦«nÅ3Üñÿ
+ÐÿÖteÓu]h\ ÄÿÛLða:À©ÿ4Çôÿf¢hêÞt¯ÖÂkúhÆ©àøp?ë[]¶ù2¾Õã~7S`9ðÓ@Öÿ®ûÿ(Cÿ°ÿ·þª¦ÏOÕ¹Z¯ý ø¿XþeCÿgýu×øý³ ýË\ÿ:]÷Ó©ïÜêâóóþ©ÂþÄ/²þwÿ±m ý3ø/ºþ«z3ýóü?ü?\ Ñøïÿ=ô~.ðIá~ý3
þ¿,ǨÎ&#ýÉy(È9ÿ/ê¿qþ<Üü_IFÙA}ºùÀO7'Øø.¸½;ÜÞüÛÿl°Tý7>]s@îg¸×óþ_±J°þcR
+½þ³çþþ.°ÿ
+YÿÇ®z5kÜßÿw§8ÿÏÂäï¬/q¼D¼õ¯ËÒ~ÀÝñqþ;LQÿaç¿eCÿ¶ñ
WkÌqÅ3ÜñÑÿס~¹Ôý¥mnÒÅT uú¾?7¦þêúOúÀ"Ô8X=þCÓ6§æùðà=þaÙû0þûã?þßîþiuñY?¼rÜëÿp6þãöû°ü¿þ¦[¡ùïñ×)ø¿Y@÷_ÙõßWO6Я¹þc
þÓyüO2äÿXÒÇ8à ý/ÑGÀÿh¦ÿDðÿ°¡ì'»õ¿âNý«EüRäÿYøzÿS8î\ÿ¯z¿þÇ÷¸ÿ
²,¡Á¬ÖÑéþ%¯á£.ÏãÖÿ|ý?þøÏ
+£2ü_¦c_$ëõ?ÝÿGz¸gýW¥)ê¿xÿtÿcèùkà?þã¨ÿ³@ÿ¾ú{ËûÿÑÿ)½Þÿü
+ÿ@äMÿ'ójN«áÖÿ¢þØÿ³ú¿lhú/ÓÙ¹½8w,Üú_Ôÿ"ôã!1H¦ÿoàIþî©ìÏðÿiÀÿÇîÿ
+Mÿ_ô[7e®ûñoWöò j¸§ÿó"þg
+þT @2Äüßî®- ò³n]Ïpêéÿ ìÿYÿG6wëÅ ÿøÇ1öÿ,Àÿ+þ·vËú×Ã0 ¡þ¬«²2GLB¡é¿¾Lg3 ¶
+ëîøÏãüBP2ýþ¯þ/h㿵ÿk>ÿãó?iûdhúßÝÿeð²ú¯lhúgð¡þÃü_²¡éÁÿ
õ?ÿ²¡ékÿ×\ÿÉtÿ'ô¿?ÈþÊÿÛÝÿ
ó<Àÿ%»õ¿ÿûàÿ
+Mÿû¿~Ðÿ!Áþ
ßô 1È
¦ÿôÏü_²¡è?bðÙþÏðímü·öÍó?!Îÿ1(uL.4ý3ôÿBýÜÿ'þü_Øÿ± ÿlú·?äǪ×O'»têÔÿ¢ÿ<þôÏAðõ6$BÓ?ÿþàÿ
+Mÿýÿpþ
þÑóÿû÷ÿÃú
Âý¹[ÿø?úáÿæ!JcìäBÓ?Cÿ?ôÿdýÿd³Eþ_9áÖÿòÿÐ?Èÿ˦ÿýßóóq¤pÿ7*p`(úWý?qÿ7´ñgèÿûX@ÿOÙÐôÏàÿÆúä~eCÓ?ÿõ_àÿ
+MÿþO¬ÿY@ü
+Mÿý?QÿaÝ?dCÌÿíïÿÄþôÿÍÝúß«ÿ'öÿ, ÿ§lhúßÚÿ¹¬ÿ%Øÿ³ð{ÝÝ¥°ÙL¡é¡ÿ'ôÏúÊfµþÚæúIÏðÏÿQõ?ÈÿËf}üo/egþò´~NX
ûù?$Cÿ_¼Ç¿3'=\s?Î
ß;þùH%èÿÁò?²ñÖÿøZÕe.·¬x;ÿ3ÿã BýM#I@(Þúï=nsýª«Ótü×~|1uQNý'sý§BÿÞõÿ ¢÷WõþzÃõóÃO
+YÿÏÍ«éê¦[ñwü_äôÿá¡5]Ùtg]Èñÿ6|pê?Íþoø?x(º7Ý«µð¦>q*8>\ÆÏúVæ¡m¾oõøßÍXü4õ¿óþý?xÀþ_6Þúª>?Uçj½üõ¦îÿaú
+9þõ×=ã?îæú
+¹þ7tºî§Sß¹5ÔÅ=ç?çýÿR
ý?_4dýïÿCäÿY@ü
+]ÿU½þyþþ.¿hü÷ÿz?ø¤p¿þ¿Yþ¿,ǨÎ&#ýÉy(È9ÿ/ê¿ãê?,Üü_IÆQxøtónN°ñ]p{w¸½ù·ÿÙ`#¨úo}ºæÜÏp¯ÿæçÿbaýǤ,zýgßýü<`ÿ'²þ]õjÖ¸¿)þï( ôÏÁäï¬/qT"Þú×ei
+¿àîø¿8ÿf¨ÿ°óß²!ÇÛø«5æ¸âîø¿èÿ;þúçàKÝ_Ú¶éÆ)ýWLâX§ÿ8 ôý¹1íðWײÿ*S*AýÕã?4msjß¿ÞãY¦0þøÿ·»Z]|ÖÏ&¯\k ÷ú?âü7b¾hüõ_4Ý
+Í¿þCÜÿήÿ
+Qÿ}õd³ ýë?Vè?Çÿ$Eÿo¢ô1Î0Å_ÿÃKgôÑgpë?é?Q¨ÿñ£ö/»õ¿âNý«Eüÿd!PîÿÌëÿUÏð×àüeYBÿYÿ¢ÓýK^7ÃG]?Æÿ¹ÿGE1Öÿ,¨0*#iìd²^ÿÓý¤gX{ÖUûXðÿéþÇÐó×ÀüÇPÿg6þ}õ÷÷ÿ.ú?
aú
+ÿ@äMÿ'ójN«áÖÿüüoeÈÿ±ÛeCÓѼÎö|Ìí¥À¹c9àÖÿ|ÿDèÿÊC
+hhúÿæäßên:Á~ðÿø*ÿã÷˦ÿ/úÏ2×ýø·+{yP5ÜÓÿyÿ³ ÷?³ RL !æÿ^twmuëzSÿËó¿¸ÿ øds·þW ðÿÿ/àÿguÙÐô?¼µ[Öÿ÷¿
1ü,üYWeeBÓ}9?Îf l ×3Üñqÿ;ú1(T %CÑ¿o3 «pÏû¢÷?°@ÿý_óù?±ÿã!aÿMÿþ/ø?Y@ýW64ý3ø¿Pÿaþ/ÙÐôÏàÿÂúÄÙÐô¿µÿk®ÿ$PÿaÙ_Ùóûû¿°ÿgþ/ÙÜÿÍý_éÕÿ
ý?ðɦÿý_?êÿý?¿éAcMÿþ/èø¿dCÑÄÑÿ+ÿÚøoíÿ÷ÿ
ÿD©`r¡éOÿ×õþ¯ýXÀý²¡éOÿWvõ¡ÿðɨûC~¬zýt2¹K§Ný«Åùÿ0Büg!øzÌ¡éOÿ§Õâþ?àÿ
+Mÿ{öÿÖÿîÿæ!>`1ÿ¿£ÿóºþ±þg!pÿdîÖÿ&þÏ
þcÜÿÇC>ÆØÈ
¦ÿ=ûÿeð2þ²Ù"ÿ¯ÏpëÿùèäÿeCÓÿÖþïd®ôaBen Eÿ£ÿgÿ7´ñgèÿ ÿèÿ)þú"ÿËr¿²¡é¡ÿ'α ÿ·lhúgèÿõ?ÿ²¡é¡ÿ'ü_, ûlù¿ýûbÿÏúÊænýïÕÿûÐÿS64ýoíÿ\ÖÿbìÿYø½îîRØì
+&ÐôÏÐÿúgý?e³ZÿMmsý¤gøçÿHaýÏòÿ²YÿÛKÙ¿<Vá~ý$Eÿ_¼Ç¿3'=\s?Î
ß;~ù;þJÐÿädãÿñµªË&/.]n?Xñwþg>ÿÇAó,¨lLBñÖ_èq#øëW]¦ã¿öã©Ê|° pê?ë?Mê¿,¼ëÿAEï¯êýõ:2ëæ²þWÓÕM·âîø/â?ü<´¦+î¬ëÂ@ãÙ þßfÓNý§Ù¢ÿ/úóP4uoºWká5M}4ãTp|¸õ.ÌCÛ|ßêñ¿)°øi ëçý?úðý¿l¼õÿT5}~ªÎÕz5øë\ ÀÿÁô/rü?ë¯ûÅÿ(ÿè_6äúßÐéºN}çÖP÷ÿ÷
ÿKöÿ< ~Ñõ¿küùÿeC×Uo¦ÿ`ÿÿä/ÿýÿ ÞÏ>)ÜËÿ²0ÿâøÕÙäc°?99çÿEý73ÔX¸ù¿,£L}ºùÀO7'Øø.¸½;ÜÞüÛÿl°Tý7>]s@îg¸×óûcbýǤ,zýgßýü<`ÿ'²þ]õjÖ¸¿)þï(Îpþ
ÉßY7_?ã"xxë_¥)ü»ãÿâüwû?xÀùoÙã¿müÕs\ñwü_Üÿn?þøåR÷¶mºqJÿS8Vè¿)Krë¯ wüWßôgé%!Öÿ,@ò²Y¡ÿ¾xûç"öy¯_Çø¿¶÷Å'ÿ?é?S
ü?XþËfåúß÷Êç0eø}ü*SvýÿÇþ¬ÿ¡iSóüFøEðÿ0È2ôdÁü¿Ýý×êâ³~6yåÊøÄÿ÷ýþ<Dÿ¢ñ×Ñt+4ÿ=þú#ôã!þECÔ_=Ù*@¿æú¯ú_äÿù¢ô1Î0Å_ÿÃKgôÑgpë^ÿOü<ĸ D4wëÅ3úÿAý?Aý
Äý¿¹sý¿êþúôá¡,Kè_0«õ_tºÉëføèqë¾þWQøÏ
+£2J2
+°LÖëºÿô+qÏú¯Jê¿xÿtÿsèùkà?þã¨ÿ³@ÿ¾úÛÃìÿþa#ÿÇB¢Â?ùåBÓÿɼÓêg¸õ¿¬ÿgØÿ³Bü¢¡é¿h^Lg{>çödPîX¸õ¿¨ÿEêÿ,¤1& ÉÐôÿÍ<É¿ÕÝ0uÿàþñ?
+øÿX@ù_64ýÑo}Þ¹îÇ¿]ÙË«áûñ?Sðÿ³ RL !æÿ^twmuëzSÿKÿOcÿÏü?²¹[ÿ+ øÇÿ8°ÿgþ_ÙÐô?¼µ[Öÿ÷¿1ú°ðg]9b
+Mÿõåüd:°m ]ÏpÇÿyÿß8BþD¡(þÿîb6þ[û¿æó¿5`þç aÿMÿþ/ø?Y@úG64ý3ø¿Pÿaþ/ÙÐô¿»ÿKeXÿ³ø/þ·öÍõdê?, û+bþoÿöÿ,Àÿ%»õ¿ÿûàÿ
+Mÿû¿~Ôÿû~ÓÆ þw÷
Èÿñ ÿl(ú8ü_ü_ÐÆkÿ×<ÿâüR8ÀäBÓ?ÿõpÿlhúgðaÿÇü_²!êßþ«^?LîÒ©Sÿþÿq!þ³|½
+æÐôÏÐÿþPþ
+Mÿýÿpþ
ø @2ÄüÿþþO¬ÿY"Üÿ'»õ¿ÿs¡ÿþo¢ôPÁÐôÏÐÿý?Y@ÿ?ÙlÿWg¸õÿü?ôÏòÿ²¡ékÿ÷üüG¸ÿ¸D0ý+ÿ7îÿf6þû÷ÿqÿèÿ)þüßXÿ±Ü¯lhúgð£þËüß²¡éÁÿõ?ÿ²¡é¡ÿ'ê?, ûlù¿ýýØÿ³þ²¹[ÿ{õÿÄþ?eCÓÿÖþÏeý/Áþ
ßë~è.
ÍÞ`"Mÿ÷?Cÿ, ÿ§lVë¿©m®ôÿü_)¬ÿYÀò_6ëã{);ó§õsÂ*ÜÏÿ$)úÿ²à=þ9éáûq.üÞñÏÿÓ?ú°ül¼õ?¾VuÙäÅ¥Ëí+áÎÿÌçÿ8QÿeAeÓ`·þûBÁç\¿êê4ÿµ_L]TæSÿÉ\ÿi¢Ðÿ
wý?¨èýU½¿^Gæáp}ÁüðBÖÿsójººéV<Ãÿùß ýxhMW6ÝY×
ƲAü¿Í¦úO³
ÿþ¦îM÷j-¼æ¡©f
+ñ³¾Õ
yh/ã[=þáw3?
+dýï¼ÿGÿ°ÿ·þª¦ÏOÕ¹Z¯ý ÜÿÃô/rü?ë¯ûÅÿ(ÃýÏ<@ÿ²!×ÿN×ýtê;·º¸çüç¼ÿ_ª°ÿçá ñ¬ÿ]ã<n ÿeC×Uo¦ÿ`ÿÿä/ÿýÿ ÞÏ>)ܯÿo¢ÿ/Äñª³ÉÇ`r
+rÎÿúo£ÿ'7ÿW
qô¿èÓÍ|º9ÁÆwÁíÝáöæßþg ê¿ôér?ýþÿUõ²lèõ}÷ððýlÈú?vÕ«Yãþ¦ø¿£8¡&gÝ|yüà%â]¦ð; îÿóßaú8ÿ-rü·¿Zc+áÿþ¿ÿ
_.uiÛ¦§ô_1c¥þJßÓmýG«L[ÔX=þCÓ6§æùðà=þaeÆÿñÿv÷O«ÏúÙäk
+à^ÿ³ñÓù"Ä|Ñøë¿hºÿýQõ?пlúï«'è×\ÿ±Bÿé<þ')òÿ,Déca¿þÎè£ÏàÖ4ÓÿøÿÑÿ
8ø%s·þW<éµÿú?ó¸ÿO2w®ÿW=Ã_ÿQ¡þÏBYп`Vë¿ètÿ×ÍðQçqë¾þWQøÏã4<f:øE²^ÿÓý¤gX{ÖU¡þËçøO÷?¿þã?þú?´ñï«¿·¼ÿ÷ûþO×ú_#ÿÇB¢Â?ùåBÓÿɼÓêg¸õ¿¬ÿÃÿÏnÿ
+MÿEób:Ûó1·çå[ÿú_ þÏBcMÿß<Àü[Ý
+S'ØáÿS
þÏ<àølhúÿ¢ßú¼)sÝ»²UÃ=ýñ?àÿgA¥ $CÌÿ½èîÚ ?ëÖõ§þþ÷?ò ÿlîÖÿ þñ?#ìÿYÿW64ýoíõ?5¯ÿaþ,üYWeeBÓ}9?Îf l ×3Üñ?^¬ÿÿã!Q¨ J¢ÿÁÿeûÀÿµ?´ñßÚÿ5ÿÃ÷ÿñưI¦ÿü, þ+þü_¨ÿ° ÿlhúgðaýÏâ¿lhúßÚÿ5×áþ'ý
+1ÿ·¿ÿûàÿÍÝúßËÿ
ý?ðɦÿý_?êÿý?¿éAcMÿþ/èø¿dCÑÄÑÿKÁÿÅmü·öÍó?!Îÿ1(uL.4ý3ø¿Pÿa÷ɦÿö,Àÿ%¢þíù±êõÓÉä.:õ¿èÿâ?Á×Û `Mÿ»û?CÜÿÇü²¡é¡ÿÎÿ³0Hÿßßÿõ?eÿ§dîÖÿ&þÏ
þcø¿yÃÇ8îÅBÓ?Cÿ?ôÿdýÿd³Eþ_9áÖÿòÿÐ?
Èÿ˦ÿýßóóqàþoTàÁPô¯8úâþohãÏÐÿ÷?±þ²¡éÁÿõðȦÿ7ê¿,Àÿ-þúbýÏâ¿lhúgèÿúèþ!bþoÿ'öÿ, ÿ§lîÖÿ^ý?±ÿgý?eCÓÿÖþÏeý/Æþ
ßë~è.
ÍÞ`"Mÿý?¡ÐÿS6«õßÔ6×Ozþ/Öÿ, ÿ/õñ¿½ùËÓú9aîçÿýYðÿÎôpÍý8~ïøç"£ÿÈÿÈÆ[ÿãkUM^\ºÜ~°âîüÏ|þÇÿ@ÿ¨lLBñÖ_èq#øëW]¦ã¿öã©Ê|° pê?ë?µ/Ð?ïúPÑû«z½ÌÃáúùá'
¬ÿçæÕtuÓx;þ/ò¿úÿðЮlº³®dø >L8õfþ¿ððP4uoºWká5M}4ãTp|¸õ.ÌCÛ|ßêñ¿)°øi ëçý?úðý¿l¼õÿT5}~ªÎÕz5øë\ àþ ÙãÿYÝ/þGîæú
+¹þ7tºî§Sß¹5ÔÅ=ç?çýÿR
ý?_4dýïÿã DþÄÙÐõ_Õé?çÿáÿáâ ùÆÿ?è¡÷sO
+÷ëÿ)ôÿe8þCu6ùìOÎCAÎùQÿcôÿäáæÿJ²ñK?Dn>°àÓÍ 6¾nï·7ÿö?lUÿÍ O×ûîõßüü_¬R¬ÿXeC¯ÿì»ÿÿìÿdCÖÿ±«^Í÷7ÅÿÅYýs0ù;ëæËãg\/oýë²4
ßpwü_ÿ3ÔXÀùoÙã¿müÕs\ñwü_ôÿ
+ü_,ür©ûKÛ6Ý8¥ÿ©@ëôï{ãã?vø+ë?qþ'PY¡þÃÂÚñ¶95Ïo{÷Æ?2Ûÿ
+ã¿?ÞãÿíêVõ³É+çÀ½þgã'¨ÿñÔl¼õ_4ÝÍ¿þÃ0Bþôÿ
+Mÿ}õd ýÛ?üÎÜâþß,
+S`¼õ?¼tF½f ÿøK è_6÷êÍ3úÿ.ÿÕeðÿ±`¿þÛý¸ D÷ÿ×= ÿ8Aý
ÿÓYп8Öê¿ètÿ×ÍðQçÿnýÏë?*LÿgAé$Ó1ª RYÿéú?Ú3¬Ä=ë¿*QÿåÀoü§ëCß_ÿñWaú?¤ñï«¿}ntÆÿEþ?T)ú?±¨ð¹ô2¯æ´þný/êÿü¿< ç'þæÅt¶åcnïÎ]Ë·þ£yý/qÿ#i @2$ýó Oòou7L`?züOêÿ< þ/þ¿è·>oÊ\÷ã_®ìÝAÕðqûgJüO#äÿYP)& ÉÐò/º»v ÈϺu>éÿEý?V)öÿ,دþ¹Ü«ÿ5 ü×ÿqÀÿÏÖÿ²!éxk7ÿ-ü?¡J¡þ¬«²2GÌB!鿾Lg3 ¶óîøÏãüª_2ý,þ/ÿ¤ñßÜÿ5ÿÇõú?²Æ°I¤ÿü, ÿ#þ9ü_¨ÿ° ÿlHúçðaýÏâ¿lHúßÜÿµèÿ¨ÿ°ì¯lhù?ÿöÿ,دþ/¹Ü«ÿÝü_èÿÆÖÿ²!ékÿ×ú?àþ7~ÓÆ þ9ü_Ð?ðÉ ÿÅÿÃÿÅiü7÷Íó?!Îÿ1(uL.$ýsø¿Pÿa!öECÒ?ÿ+Âþø¿dCÓ¿ý!?V½~:Ü)S§þÕ\ÿ±Âù¯·AÀ< þ9üð°ú¯lHúçèÿóÿ,ÄL ¡åÿüXÿ³`¿þwÿgûÿäq¯þ·ñ.üîÿã!xL zÁôÏÑÿ÷°þ²Ù ÿ¯\ÏpëÿùèäÿeCÒÿæþïùù8qþ¸D0ý+ÿ7îÿf4þý?ÿaý?eCÒ?ÿë?àÿ
+Iÿý?QÿeþoÙôÏáÿÄúÄÙôÏÑÿõÐýC6´üÿûì×þr¹Wÿ»õÿDÿ°þ
+Iÿû?õ¿û~¯û¡»6}@ $ýsôÿþY@ÿOÙ¬ÕSÛ\?íþëÿ PÿcëÙ¬ÿí¥ìÌ_¾ÖÏ «p?ÿgèÿËïøwæ¤kîǽð{ÇþìÿxÀü/_ý¯U]6yqérûÁg¸ó?óù?ÊbÔYPÙ4â«ÿ¾ÐãFð9ׯº:MÇíÇ
SùhAàÔ2×:¾
þ9x×ÿÞ_Õûëud×Ì?)Tý?7¯¦«nÍ3Üñÿ2ÜÿÊCkº²éκ.4.ûãÿm&ø8àÔ-üßèÿÍCÑÔ½é^×<4õÑSÁñá2~Ö·º0móe|«Ç?ün¦Àr৪ÿ½÷ÿèÿÁöÿ²ñÕÿSÕôù©:Wbð×$¸ÿè_6ÔøÖ_÷ÿÐ?пl¨õ¿¡Óu?úÎ! .î:ÿ9ïÿØÿópøECÕÿÞñ?FþÄÙõ_ÕÛé?çÿáÿáâ ùÆ{ÿ?è¡÷tO
+÷ëÿÆèÿËmüêlò1ØÜóÿ¢þÇèÿÉÃÍÿdaé§,øtsïÛ»ÃíÍ¿ýÏAÔ3èÓ5´âîõߢÿ
+°þcR
+¹þ³óþþ°ÿ
+UÿÇ®z5«Üß$ÿw¬Ðÿ
ÉßY7_?ã"xøê_¥)<û¯ÿ£P
Ð?8ÿ-jü·¿Zckáÿóþ¿QÃÿÅÂ/º¿´mÓsú¯Ä±Nÿ ©ïÏi¿ºþý'PY£ÿkÇhÚæÔ<¿Q~¼Ç?&ÿ/ƼÇÿÛÝ?.>ëgWÎ5ßúßdð²Ôl¼õ_4ÝÍ¿þÃq ýs@ÿ¢¡é¿¯l _uýçùküWð³<*¤ ãÿá¥3úè5øÇÿ$Àý< þËæ^ý¯ySÿÿÈÿOñüúçÀ~ýï÷ÿ
ÈÈã¾õÿºgøë?SÔÿYø?ýe ýcþN÷/yÝvyþ·þçõ¦Èÿ³ LÇüRYÿéþ?Ú3¬Ä=ë¿ÓùÔ÷Çoü§ûCß_ÿñ·§1þÆ¿¯þÞôþßEþ?Tü,$*üÁ_.$ýÌ«9[ÿúbÿÏnÿ
+IÿEób:Ûó1·ç®å[ÿѼþF8ÿËBcIÿß<Àü[Ý
+S'ØáÿS
ú?0ÿȤÿ/úÏ2×ýø+{wP5ÜÕÿyÿÓùT @2´üßî®- ò³nÏpêéÿQöÿ,دþ¹Ü«ÿ5 ü×ÿqû_yÿW6$ýoí¦õ¿
ÿ'TôÏÂuUVæY@($ý×óélÀ¶r>Ãÿãyüÿã!Q¨ J ÿÁÿÚþðíiü7÷ÍçÿP¥èÿÊBÃþ%þ9ü_ð²ú¯lHúçð¡þÃü_²!éÃÿ
õ?ÿ²!ésÿ×¢ÿS¡þò¿²¡åÿü_Øÿ³`¿~ø¿är¯þwó¡ÿðɤÿý_?êÿý?¿éAc
+Iÿþ/èø¿dCÐÄÒÿKÁÿÅiü7÷Íó?!Îÿ1(uL.$ýsø¿Pÿa!öECÒ?ÿû?àÿ
+MÿöüXõúédr§LúWsýÇ
+çÿy¾ÞóDHúgðFð° ÿ§lHúçèÿóÿ,ÄL ¡åÿüXÿ³`¿þwÿgûÿäq¯þ·ñ.üîÿã!xT2$ýsôÿÃý, ÿl6Èÿ+×3ÜúÿAþúgùÙô¿¹ÿ{~þ##ÿbAen Aÿ¥ÿ'îÿf4þý?ÿaý?eCÒ?ÿë?àÿ
+IÿþoÔYÿ[6$ýsôÿÄúÄÙôÏÑÿõÐýC6´üÿûì×þr¹Wÿ»õÿDÿàþ
+Iÿû?õ¿û~¯û¡»6}@ $ýsôÿþY@ÿOÙ¬ÕSÛ\?íþë»þ9@þ_6«ã{);ó¯õsÂ*ÜÏÿ$
+ýYðÿÎôpÍý¸~ïøÏÿQýÈÿÈÆWÿãkUM^\ºÜ~°æîüÏ|þ²õ_T6 f¡øê¿/ô¸|Îõ«®NÓñ_ûñÅÔEe>Z8õÌõ?þ¯Ñÿ
wý?¨èýU½¿^Gæáp}ÁüðBÕÿsójººéÖ<Ãÿçùß(Ãý¯<´¦+î¬ëÂ@ã¹?þßfÓNý§ÙÂÿþß<MÝîÕzxÍCSÍ8.ãg}«óÐ6_Æ·züÃïf
+,~¨úß{ÿþ<`ÿ/_ý?UMªså!ýIûXþeCÿgýu×øûyþeCÿ
+®ûéÔwn
+uq×ùÏyÿ¿4ÀþÄ/ªþ÷ÿ òÿ, þˬÿªÞNÿÁ<ÿÿÈ_4ÞûÿA½§|R¸_ÿß4Fÿ_hã?TgÀþä>äÿõß8FÿOnþ¯$£TEn>°àÓÍ 6¾nï·7ÿö?lQÿÍ O×Ðg¸×þJaýǤ,rýgçýü<`ÿ'ªþ]õjV¹¿Iþï8Dÿ/&gÝ|yüà%â«]¦ð< î¿þBAÿàü·l¨ñß6þj9®y;þÏûÿFYÿ¿\êþÒ¶M7Îé¿b.Ç:ý§¤¾?7¦¾OýGeÕ?ê?û³vü¦mNÍóåÁ{üà Ñÿïñÿv÷O«ÏúÙäs
+à¿þëú·þ¦[£ùïñ×¢ÿпlhúï«'èW]ÿA8ÿ'¨ÿó<*´ ·þÎè£×àÿ Büg!
øEs¯þ×<éÿåývJþ°_ÿûý1öò¸oý¿îþúbÿæáÿô_%ô/µú/:Ý¿äu3|ØåùcÜú¯ÿUûyã4TFìÊjýO÷ÿÑa%îYÿU*@ý¿ñî}
+üÇ_Eêÿ,Æ¿¯þÞôþßEþIÿ,$*ü¡_.$ýÌ«9[ÿúbÿÏnÿ
+IÿEób:Ûó1·ç®å[ÿѼþFðÿ³Æ $CÒÿ7ð$ÿVwÃÔ ö£gøÇÿT¡þÏÌ?²!éÿ~ëó¦Ìu?þåÊÞT
+wõ^Äÿ4ÿhhù¿Ý][ ägÝ:áÔÿÒÿ£2ìÿY°_?ü?r¹Wÿk ø¯ÿã(
ÿÙô?¼µÖÿ÷¿©úgáϺ*+sÄ, þëËùÉt6`Û 9áÿóþqüBP2ýþ¯0Ãý,Æsÿ×|þUbþç aÿIÿþ/ø?Y@ýW6$ýsø¿Pÿaþ/ÙôÏàÿ
+±þgñ_6$ýoîÿZôJ#ÔX@öW6´üÿûì×ÿ\îÕÿnþ/ôcþ/Ùô¿µÿëGý°ÿgá7=hLr!éÁÿ
üðÉ ÿ¥ÿWÿ¤ñßÜÿ5Ïÿ8ÿÇD¢Ô0¹ôÏáÿBý
Ú
+Iÿþ/ìÿXÿK64ýÛòcÕë§É2uê_Íõ+ÿç!øzÌ!é£ÿü,Àÿ)þúÿáþoâ& ÉÐòÿþO¬ÿY°_ÿûý¶ ò¸WÿÛø?çþ¯8ÊÿYH¶ !é£ÿîÿ`ýÿd³Aþ_¹AÊÿCÿ, ÿ/þ7÷/Öÿaó_,¨,À0Áô¯Xü߸ÿÒøsôÿÄýO, ÿ§lHúçðcýÇ¿²!éÃÿú/ðˤþXÿ³ø/þ9ú¢þúÈÿcðbÿÏýúÑÿS.÷ê·þèÿ¿²!ésÿç²þaÿÏÂïu?t¦o0¤þÐ?èÿ)µúojë§=Ãý?Î ¨ÿ±ü¿lVÇÿöRvæ/_ëçU¸ÿ3ÃüøgNz¸æ~Ü¿wüçÿ(Àþädã«ÿñµªË&/.]n?Xówþg>ÿG6\@ÿ¨lÌBñÕ_èq#øëW]¦ã¿öã©Ê|´ pê?ëü_£ÿïú°'®¦WõþzÃõóÃO
+UÿÏÍ«éê¦[ówüç£÷¿òЮlº³®äþø >N8õfÿ7úóP4uoºWëá5M}4ãTp|¸õ.ÌCÛ|ßêñ¿)°øi êïý?úðý¿l|õÿT5}~ªÎüõ& îÿaú
+5þõ×]ã?îæú
+µþ7tºî§Sß¹5ÔÅ]ç?çýÿÒ û¿h¨úß;þ'Èÿ³ø/²þ«z;ýóü?ü?\ Ñxïÿ=ô.ðIá~ýÓýY ÿPM>F ûûPsþ_Ôãý?y¸ù¿,Ò(þtónN°ñ]p{w¸½ù·ÿÙ`#úo}ºæV<ýþ[ôÿP
+ë? eÙë?;ïÿàÿàû?ÙPõìªW³ÊýMòÇ!ú±0ù;ëæËãg\/_ýë²4
çpÿõ¸ÿÿ
+5þÛÆ_1Ç5ÏpÇÿyÿß(áÿbáKÝ_Ú¶éÆ9ýWÌâX§ÿ(!5þygÚᯬÿ$Áø¿SRê?¬ÿ¡iSóüFøEðÿ0ȲãÏÿø»ü§ÕÅgýlòʵðYÿ_Ç?NáÿâÝ?eã¯ÿ¢éVhþ{üõF
+ùè_4Dý÷ÕMôÝÿÎãû¿yãÇs\üõ?¼tF}f ·þ£þ þÇÄ/»õ¿âNý«Eüÿdaüöÿ½¦qܹþ_õýG îÿåaüöËÿ%ô/Õú/:Ý¿äu3|ØæùCÜúçÿTcýÏÓ(É4îþÊzýO a%îYÿU)îÿaÁsü§ ÃÏÿÞæÿõhãßW{Üèÿßõz¯ÿ
ÿ<$*ü¡_.4ýÌ«9~[ÿËúý?ðÿȦÿ¢y1múÛ[sÇrÀÿEý/
+Pÿg!1H¦ÿoàIþî©ìÏðÿiÀÿÇîÿ
+Mÿ_ô[7e®ûñoWöò jø¸4!þg
+þ ÿ{Ñݵ@~ÖëNý/ý?aý?ü?¢¹[ÿ+ øÇÿ8°ÿgþ_ÙÐô?¼µ[ÖÿÔ¼þèÿÁÃuUVæI@(4ý×óélÀör=Ãÿãyüÿã!Q¨ J¢ÿÃÿ¥àÿâ6þ[û¿æóÿ¸þCÿGÒö/ÉÐôÏàÿÿÔeCÓ?ÿõàÿ
+Mÿþ/¬ÿY@ü
+Mÿ[û¿æúO² õý
+1ÿ·¿ÿûø¿Ds·þ÷òaÿÏü_²¡écÿ×ú?$Øÿ³ð4f ¹ÐôÏàÿþYÿK6ýGþ¯þ/h㿵ÿkÿ qþD©`r¡éÁÿ
ú´/þ÷÷)ìÿXÿK6DýÛòcÕë§É]:uê_-ê?aøÏBðõ6$BÓ?ÿþàÿ
+Mÿýÿpþ
ø @2ÄüÿþþO¬ÿYìý¶ R¹[ÿø?úáÿæ!
+aMÿýÿÐÿôÿÍùåx[ÿ?ÈÿCÿ, ÿ/þ·öÏÏÄQCÿ¨,À
+ ¡è_qø¿qÿ7´ñgèÿûX@ÿOÙÐôÏàÿÆúø?dCÓ?CÿOÔYÿ[64ý3ø?±þgñ_64ý3ôÿDýtÿ
+1ÿ·¿ÿûôÿÍÝúß«ÿ'öÿ,Àü)þ·ö.ë öÿ,ü^÷Cw)lö@húgèÿ ý³þ²Yÿ¦¶¹~Ò3üóA¤°þgùÙ¬ÿí¥ìÌ_ÖÏ «ðõþÏÔê?Iø?9ðÿÎôpÍý8~ïøç" ÿÈÿÈÆ[ÿãkUM^\ºÜ~°âîüÏ|þý?YPÙ4âÿ¾ÐãFð9ׯº:MÇíÇSù`AàÔ2×(ÔYx×ÿÞ_Õûëud×Ì?)dý?7¯¦«nÅ3Üñÿ
+ÐÿÖteÓu]h\ ÄÿÛLða:À©ÿ4Çôÿ`¢hêÞt¯ÖÂkúhÆ©àøp?ë[]¶ù2¾Õã~7S`9ðÓ@ÖÿÎûÿ ÷±ý¿l¼õÿT5}~ªÎÕz5øë?L#ø?XþeCÿgýuøÝÿãþg ÙëC§ë~:õ[C@]ÜsþsÞÿ/U8ÿÁÃâ
+Yÿ;ÇÿùÿeC×Uo¦ÿ [êù¿hü÷ÿz?ø¤p/ÿ·Êlüÿ{ã?TgÀþä<äÿõß8ÎPÿaáæÿJ²0ÓøÓÍ|º9ÁÆwÁíÝáöæßþg ê¿ôér?ýþçú-¡ eÙÐë?ûîÿpÿØÿɬÿcW½5îoÿ;ÂúÉßY7_?ã"xxë_¥)ü»ãÿâüw¡þÃÎËÿmã¯Öãg¸ãºðð²ðË¥î/mÛtãþ+¦q¬Ô¿ïÿ`ÚáûÜÿ¨²ñGÔ8X=þCÓ6§æùðà=þa¥Æÿñÿv÷O«ÏúÙäk
+à^ÿÏûÿÅiý?èþ)ýM·Bóßã¯ÿ÷ÿ1þ²!꿯l _sýÇ
+ý/îÿIRäÿXãG¤ ã¯ÿá¥3úè3¸õ¿¸ÿ7Èàÿf!Â@4wëÅ3ú_Þÿg[BBÿدÿ¿÷qÀT ;×ÿ«á¯ÿ(AÿÆo¿üoYBÿBYÿ¢ÓýK^7ÃG]?Æÿïó±=ÿ¡ÿ&NÃ$Ó1´/õúîÿ#=ÃJܳþ«õ_<Ǻÿ1ôü5ðŨÿ³@ÿ¾ú{ËûýBôf"Qáýr¡éÿd^Íiõ3Üú¯ÿGù#ÿÇü?²¡é¿h^Lg{>æöRàܱpë?é?ÜÿÈBcMÿß<Àü[Ý
+S'ØáÿS
ó¿< ü/þ¿è·>oÊ\÷ãß®ìåAÕpOÿçEüÏÐÿb1ÿ÷¢»kü¬[×3ú_úÂõì×ÿ\îÖÿ ~ñÒÿøúç þ_ÙÐô?¼µ[ÖÿþqÿÃÿGügâϺ*+sÄ$ þëËùÉt6`Û ¹áÿûßÃþ?
+ d(úvõ]ý¿ãtÿ´ñßÚÿ/ÖØÿñưI¦ÿýý_)Ö, ý#þü_ð² ÿlhúgðaýÏâ¿lhúßÚÿ5רÿ°ì¯lù¿ý_ñTÿAÿì×ÿ\îÖÿæþ¯øêÿÂþø¿dCÓÿÆþ¯ôx÷aÿÏÂozÐäBÓÿþ¯ëúù?àÿ
+EÿCÿ/Ûÿþ¯ý¡ÿÖþ¯ùù?øÿ¹H:À&þ÷ô]ïÿÊÐÿ
Ú
+Mÿ{ú¿«ÿý?XÿK6DýÛòcÕë§É]:uê_-Îÿâ?Á×Û `Mÿ{ú?«ÿý¿Y@ùW64ýïÙÿ/¹ú?áÿb!>`1ÿ¿ÿ?¬ÿYìý¶ R¹[ÿø?úqÿQð%нXhúß³ÿ_ÿ'#èÿ'-òÿÊñ·þÿþY@þ_64ýoíÿßÿ£ÿ*p`(úWý?ø¿9 ?CÿOø¿X@ÿOÙÐôÏÐÿù_àÿ
+Mÿý?qþø¿eCÓ?CÿO¬ÿY@ü
+Mÿý?áÿbÝ?dCÌÿíßÿûì×þr¹[ÿ{õÿÄþôÿ
+Mÿ[û?õ¿û~¯û¡»6{@ 4ý3ôÿþY@ÿOÙ¬ÖSÛ\?éþù¿ RXÿ³å¿lÖÇÿöRvæ/OëçU¸_ÿß IÑÿïñïÌI×Üsá÷_þǤbôÿ`ùÙxë|ê²ÉKÛV<ÃÿÏÿñ8@ÿ¨lLBñÖ_èq#øëW]¦ã¿öã©Ê|° pê?ë?MÔYx×ÿÞ_Õûëud®¥áÌ?)dý?7¯¦«nÅ3Üñ?^Äø?xhMW6ÝY×
ƲAü¿Í¦úO³yüGÿo&¦îM÷j-¼æ¡©f
+ñ³¾Õ
yh/ã[=þáw3?
+dýï¼ÿGÿ°ÿ·þª¦ÏOÕ¹Z¯ý ø?XþeCÿgýu¿øeðñ ýË\ÿ:]÷Ó©ïÜêâóóþ©ÂþÄ/²þwÿq ÿgñ_6týWõfúæùø¸8@þ¢ñßÿzèý\à½üß*S)üßǨÎ&#ýÉy(È9ÿ/ê¿q¡þÃÂÍÿda¬²øÓÍ|º9ÁÆwÁíÝáöæßþg ê¿ôér?ýþßÿ«ë? eÙÐë?ûîÿàÿàû?ÙõìªW³ÆýMñGqóÿ,LþκùòøÁKÄ[ÿº,Máw Üÿç¿CÜÿÁÎËÿmã¯Öãg¸ãÿâþw»$þøåR÷¶mºqJÿS8Öé?ô½òñL;üÕõð?Ê=ÿúÏþ¬ÿ¡iSóüFøEðÿ0Èlþã¿?þãÿíîVõ³É+×À½þgã§1öÿ,`ù/ýM·Bóßã¯ÿ0Âý?<Dпhúï«'è×\ÿ±Bÿé<þ' ò,¨ð1Ä ý/ÑGÀÿh¦ÿ$Èàÿa!Ä@4wëÅ3úWøàþì×ÿßq6¦qܹþ_õýGI@ÿ¼ë¿,Kè_"«õ_tºÉëfø¨ËóǸõ?Ïÿ©(Âú
CÇLÇоLÖëºÿô+qÏú¯JBÔ9ðÿéþÇÐó×ÀüU£þÏmüûêï-ïÿýGÿ§©þ"þó¨ð~¹Ðô2¯æ´úný/ëÿ)öÿ,àö_ÙÐô_4/¦³=s{)pîX¸õ¿¨ÿ
êÿ,¤1& ÉÐôÿÍ<É¿ÕÝ0uýàþñ?Uü, ü/þ¿è·>oÊ\÷ãß®ìåAÕpOÿçEüÏøÿYP)& Éó/º»¶ ÈϺu=éÿ¥ÿ'°ÿgÁ~ýðÿÈåný¯8 àÿã8ÄþøeCÓÿðÖnYÿSóú¯- @ÿüYWeeBÓ}9?Îf l ×3Üñ?^¬ÿÿã!Q¨ J¢ÿÃÿ¥àÿâ6þ[û¿æó¿m ù4ýK24ý3ø¿àÿdéÙÐôÏàÿBýø¿dCÓ?ÿëÿeCÓÿÖþ¯¹þ4CýdeCÌÿíïÿÂþûõÃÿ%»õ¿ÿûàÿ
+Mÿû¿~Ðÿ!Æþ
ßô 1È
¦ÿ
ôÏü_²¡è?âðÅðq@ÿý_óüOóL$Jà Mÿþ/ÔXÀÝ?²¡éwÿW`ÿÇü_²!êßþ«^?LîÒ©SÿjQÿ Cį·AÀ< þüð°ò¯lhúgèÿóÿ,ÄL !æÿ÷÷býÏýúíý¶ "¹[ÿø?úáÿæACÔ äBÓ?Cÿ?ôÿdýÿd³Eþ_9AÊÿCÿ, ÿ/þ·öÏÏÄaCÿ¨,À
+ ¡è_qø¿qÿ7´ñgèÿûX@ÿOÙÐôÏàÿÆúø?dCÓ?CÿOÔYÿ[64ý3ø?±þgñ_64ý3ôÿDýtÿ
+1ÿ·¿ÿûì×þr¹[ÿ{õÿÄþôÿ
+Mÿ[û?õ¿û~¯û¡»6{@ 4ý3ôÿþY@ÿOÙ¬ÖSÛ\?éþù¿
+°þgËÙ¬ÿí¥ìÌ_ÖÏ «p?ÿg$èÿË÷øwæ¤kîǹð{Ç?ÿ©ý?X@þG6Þú_«ºlòâÒåöÏpçæó(ÔYPÙ4âÿ¾ÐãFð9ׯº:MÇíÇSù`AàÔ2×èÿÁ»þTôþªÞ_¯#óp¸¾`~øI!ëÿ¹y5]Ýt+áÿüoþ?<´¦+î¬ëÂ@ãÙ þßfÓNý§Ù<þ£ÿ7ES÷¦{µ^óÐÔG3NÇËøYßêÂ<´Íñÿð»Ë²þwÝÿGúðý¿l¼õÿT5}~ªÎÕz5øë\ àþ ÙãÿYÝ5þCÿ,@ÿ²!×ÿN×ýtê;·º¸çüç¼ÿ_ª°ÿçá ñ¬ÿ]ãl[Cÿ þË®ÿªÞLÿÁ<ÿÿÈ_4þûÿA½|R¸_ÿßL¡ÿ/Äñª³ÉÇ`r
+rÎÿúo£ÿ'7ÿW
ÑÿäÓÍ|º9ÁÆwÁíÝáöæßþg ê¿ôér?ýþÿUõ²lèõ=÷ðpýlÈú?vÕ«Yãþ¦ø¿£8M &gÝ|yüà%â]¦ð; îÿóßaú8ÿ-rü·¿Zc+áÿþ¿¶$ý3ðË¥î/mÛtãþ+¦q¬Ó¿ú¥ïÏiïSÿQ§ÔX=þCÓ6§æùðà=þae¨ÿ±à?þßîþiuñY?¼rÜëÿEþ?MÿYÀò_6þú/n
æ¿Ç_ÿa¤Ðÿè_6Dý÷ÕÍôk®ÿX¡ÿÅþ?Iqþ>æ ±øëxé>úÌ ný/îÿUú¿² þñKæný¯xSÿ?Èÿ'¨ÿ±`¿þÿÿ|@
+ÄqçúÕ3üõ%¸ÿwýe ýKdµþN÷/yÝuyþ·þçù?áþq&¡}¬×ÿtÿéVâõ_*Ô9ðÿéþÇÐó×ÀüÇPÿg6þ}õ÷÷ÿ.ú?
!â?
+ÿ@èMÿ'ójN«áÖÿ²þó<àö_ÙÐô_4/¦³=s{)pîX¸õ¿¨ÿáþ_&Òdhúÿæäßên:Á~ðÿøü,Àÿ'þ¿è·>oÊ\÷ãß®ìåAÕpOÿçEüÏpþb1ÿ÷¢»kü¬[×3ú_úÂûì×ÿ\îÖÿ þñ?#ìÿYÿW64ýoíõ¿åýoaþ_,üYWeeBÓ}9?Îf l ×3Üñqÿ{üBP2ýþ¯ þ/h㿵ÿk>ÿ[æÒö/ÉÐôÏàÿÿÔeCÓ?ÿõàÿ
+Mÿ»û¿Tõ?ÿ²¡ékÿ×\ÿI þò¿²!æÿö÷aÿÏýúáÿËÝúßËÿ
ý?ðɦÿý_?êÿý?¿éAcMÿ»û¿BäÿxÿK6ýGþ¯þ/h㿵ÿkÿ qþD©`r¡éÁÿ
ú¸ûG64ý3ø¿°ÿcþ/ÙõoÈU¯N&wéÔ©µ¨ÿâ?Á×Û `Mÿýÿàÿ`þOÙÐôÏÐÿçÿY $CÌÿïïÿÄúûõÛûÿ
+lDr·þ7ñ.ôÃÿÍ:<¨È
¦þèÿÉúÿÉfü¿r<ÿþY@þ_64ýoíÿÿ£ þ9PY@CÑ¿âðãþohã¿ÿÏ÷?±þ²¡éÁÿõðȦÿ7ê¿,Àÿ-þüXÿ³ø/þú¢þúÈÿÛßÿý?öëGÿO¹Üÿ½úbÿÏúʦÿýËú_ý?¿×ýÐ]
+½ÁD þîþY@ÿOÙ¬ÖSÛ\?éþù¿ RXÿ³ü¿lÖÇÿöRvæ/OëçU¸ÿ3HRôÿeÁ{ü;sÒÃ5÷ã\ø½ãÿ§ôÿ`ùÙxë|ê²ÉKÛV<ÃÿÏÿq¢þËʦÀ$ oý÷
7Ϲ~ÕÕi:þk?¾º¨Ì§þ¹þÓD¡ÿïúPÑû«z½ÌÃáúùá'
¬ÿçæÕtuÓx;þ/ò¿úÿðЮlº³®dø >L8õfÿ7ü<MÝîÕZxÍCSÍ8.ãg}«óÐ6_Æ·züÃïf
+,~Èúßyÿþ<`ÿ/oý?UMªsµ^
+þú ¸ÿè_6äøÖ_÷ÿQûyþeC®ÿ
+®ûéÔwn
+uqÏùÏyÿ¿TaÿÏÃâ
+Yÿ»ÆÿxÜ@ÿ þË®ÿªÞLÿÁ<ÿÿÈ_4þûÿA½|R¸_ÿß,Dÿ_ã?TgÀþä<äÿõß8FÿOnþ¯$£ÿ©ðÓÍ|º9ÁÆwÁíÝáöæßþg ê¿ôér?ýþÿUõ²lèõ}÷ððýlÈú?vÕ«Yãþ¦ø¿£8¡&gÝ|yüà%â]¦ð; îÿóßaú8ÿ-rü·¿Zc+áÿþ¿ÿ
_.uiÛ¦§ô_1cþ£Ò÷çÆ´Ã_]ÿÿw*Sã õVÿдͩy~#ü"xdYñçÀü¿ÝýÓêâ³~6yåZ¸×ÿálüã4Fþtÿ¿þ¦[¡ùïñ×Xÿ³ ý˨ÿ¾z²Y~Íõ+ôÎã"ÿÏB?F æ ±øëxé>úÌ nýG3ý'
+ýÿy° ÍÝú_ñ§þÕ"þèÿÌýöÿ{Lâ¸sý¿êþúõÆo¿üoYBÿBYÿ¢ÓýK^7ÃG]?ÆÿyþOE1Öÿ,8
+ÿéÚÉzýO÷ÿa%îYÿUIú/ã?ÝÿèkñÿñÔÿY _ý½åý¿ÿèÿ4ÕÿBÄþÐ/þOæÕV?Ãÿeýþþ
+MÿEób:Ûó1·çå[ÿú_ þÏBcMÿß<Àü[Ý
+S'ØáÿS
þÏ<àþoÙÐôÿE¿õySæºÿve/ª{ú?/âÀÿÏJ1Hÿ{Ñݵ@~ÖëNý/ý?!îä!ÿG4wëÅ ÿøÇöÿ,Àÿ+þ·vËú×Ã0Fÿ?þ¬«²2GLB¡é¿¾Lg3 ¶
+ëîø/ÖÿÈÿñ(, $CÑÀàÿ²ý?àÿÚÚøoíÿÏÿaûÿxHcØ¿$CÓ?ÿþOPÿ
+Mÿþ/ÔXÿK64ý3ø¿°þgñ_64ýoíÿë?ÉpÿÈþÊÿÛßÿ
ý?ü_¢¹[ÿ{ù¿°ÿgþ/ÙÐô¿±ÿëGý°ÿgá7=hÌ r¡éÁÿý³ ÿl(ú8ú)ø¿8 ÿÖþ¯yþ'Äù?&¥pÉ
¦ÿê?,DоhhúgðaÿÇü_²!êßþ«^?LîÒ©SÿjQÿ #į·AÀ< þw÷¸ÿø?eCÓ?Cÿ?ÿg!>`1ÿ¿¿ÿë{ÿ_-TîÖÿ&þÏ
þcø¿yÇ(îÅBÓ?Cÿ?ôÿdýÿd³Eþ_9áÖÿòÿÐ?Èÿ˦ÿýßóóq(è¸D0ý+þ¸ÿÚø3ôÿÄýO, ÿ§lhúgðcýÇü²¡éÁÿú/ð˦þXÿ³ø/þú¢þúÈÿÛßÿý?úænýïÕÿûÐÿS64ýoíÿ\ÖÿbìÿYø½îîRØì
+&ÐôÏÐÿúgý?e³ZÿMmsý¤gøçÿHaýÏòÿ²YÿÛKÙ¿<Vá~þÏ IÑÿïñïÌI×Üsá÷þ'R1ú°ül¼õ?¾VuÙäÅ¥Ëí+áÎÿÌçÿxüôÏʦÀ$ oý÷
7Ϲ~ÕÕi:þk?¾º¨Ì§þ¹þÓD¡ÿï
úPÑû«z½ÌÃáúùá'
¬ÿçæÕtuÓx;þ/ò¿úÿðЮlº³®dø >L8õfþ¿ððP4uoºWká5M}4ãTp|¸õ.ÌCÛ|ßêñ¿)°øi ëçý?úðý¿l¼õÿT5}~ªÎÕz5øë\ àþ ÙãÿYÝ/þGîæú
+¹þ7tºî§Sß¹5ÔÅ=ç?çýÿR
ý?_4dýïÿã DþÄÙÐõ_Õé?çÿáÿáâ ùÆÿ?è¡÷sO
+÷ëÿ)ôÿe8þCu6ùìOÎCAÎùQÿcôÿäáæÿJ²0VÿK?Ý|`Á§l|ÜÞnoþí6تþA®9 ÷3Üë¿ùù¿X¥Xÿ± )Ë^ÿÙwÿÿØÿɬÿcW½5îoÿ;³úç`òwÖÍÇϸ^"Þú×ei
+¿àîø¿8ÿf¨ÿ°óß²!ÇÛø«5æ¸âîø¿èÿ(ø¿XøåR÷¶mºqJÿS8Vê?£ôý¹1íðW×Òÿ*Saú«ÇhÚæÔ<¿~¼Ç?2Ûÿã¿?þãÿíîVõ³É+×À½þgã§ òÿ,Dù¢ñ×Ñt+4ÿ=þú#¬ÿy@ÿOÙõßWO6Я¹þc
þÓyüOÿç!JãsXüõ?¼tF}f ·þ£þ ÿ?Ä/»õ¿âNý«EüôfaÜ{¸ÿO.w®ÿW=Ã_ÿã{ÔÿY(ËúÌjýî_òº>êòü1nýÏ×ÿ*Âý<¨0*Ã$Ó1Ä/õúîÿ#=ÃJܳþ«Òõ_<Ǻÿ1ôü5ðÿñÔÿY _ý½åý¿ÿèÿâþ_FþÈ/þOæÕV?ÃÿEý?°ÿgöÙÐô_4/¦³=s{)pîX¸õ¿¨ÿE
+õÒdhúÿæäßên:Á~ðÿøü,Àÿ'þ¿è·>oÊ\÷ãß®ìåAÕpOÿçEüÏüÿ,¨dù¿Ý][ ägݺáÔÿÒÿ&Øÿ³ ÿlîÖÿ þñ?cìÿYÿW64ýoíõ?5¯ÿaþ,üYWeeBÓ}9?Îf l ×3Üñ?Çÿù?
+ d(ú8ü_1ü_ÐÆkÿ×|þÇù4ýK24ýïîÿ2ø?Y@ýW64ý3ø¿Pÿaþ/ÙÐôÏàÿÂúÄÙÐô¿µÿk®ÿ$S¨ÿ°ì¯lù¿Ýý_8ÿÉü_²¹[ÿ{ù¿°ÿgþ/ÙÐô¿±ÿëýìÿYøM3\húgðAÿ,Àÿ%þ#ÿWÿ´ñßÚÿ5Ïÿ8ÿÇD¢Ô0¹ÐôÏÐÿõpÿlhúgðaÿÇü_²!êßþ«^?LîÒ©Sÿþÿq#þ³|½
+æÐôÏàÿÿø?eCÓ?Cÿ?ÿg!>`1ÿ¿ÿ?¬ÿY"Üÿ'»õ¿ÿs¡ÿþo¢ô1Æ@.4ý3ôÿCÿOÐÿO6[äÿãnýÿ ÿý³ü¿lhúßÚÿ=?ÿGîÿfAen EÿÃÿû¿Y ?CÿOÜÿÄúʦþXÿ±Ü¯lhúgð£þËüß²¡éÁÿõ?ÿ²¡é¡ÿ'ê?, ûlù¿ýûbÿÏúÊænýïÕÿûÐÿS64ýoíÿ\ÖÿìÿYø½îîRØì
+&ÐôÏÐÿúgý?e³ZÿMmsý¤gøçÿ(Äúäÿe³>þ·²3yZ?'¬ÂýüA¢ÿ/Þãß®¹çÂïÿüO¤ôÿ`ùÙxë|ê²ÉKÛV<ÃÿÏÿñ¸ þ9PÙ4âÿ¾ÐãFð9ׯº:MÇíÇSù`AàÔ2×(ôÿ`á]ÿ*zUï¯×y8\_0?ü¤õÿܼ®nºÏpÇÿEþ7@ÿZÓMwÖua qlÿo3Áé §þÓláÿÿ¢©{Ó½Z¯yh꣧ãÃeü¬ouaÚæËøVøÝLåÀOYÿ;ïÿÑÿìÿeãÿ§ªéóSu®Ö«Á_ÿaáþ ÙãÿYÝ5þCÿ,@ÿ²!×ÿN×ýtê;·º¸çüç¼ÿ_ª°ÿçá ñ¬ÿãü?ÿ²¡ë¿ª7Ó0ÏÿÃÿÃÅòÿþÐCïçî×ÿ7ÑÿâøÕÙäc°?99çÿEý7Ñÿÿ+Éì¡ËôÓÍ|º9ÁÆwÁíÝáöæßþg ê¿ôér?ýþÿÇ ýs )Ë^ÿÙwÿÿØÿɬÿcW½5îoÿ;JÆ?þüuóåñ3.·þuYÂï
¸;þ/Îê?,àü·lÈñß6þj9®x;þ/úÿS ôÏÁ/º¿´mÓSú¯
+ıNÿJÛoL;üÕõñsMõ_ÔögíøMÛç·ýû?¶ÿS6?ÞãÿíêVõ³É+çÀ½þgã')ú²Ôl¼õ_4ÝÍ¿þmpètÿ
+Mÿ}õd ýÛ?|Ï\ãó,
+-ãÿá¥3úè5øÇÿQþÿ, ê'{õ¿æNýÿ#ÿoõe)ü?,دÿzÿ
+H ÷ÿ×= ÿñúçàÿô_%ô/µú/:Ý¿äu3|Ôäùÿ[ÿÿ·þ·P
êÿ,qþ/Ó1b¿LVëºþö+ñµõß«þ¥PÿgÁoü§ëCß_ÿñWíÿ
ñßÒø÷Õß>7:ãÿwùÿëø
+ñD
ôË
¤ÿy5§õÏpë¾þ#Ôÿy@ý_6$ýÍélËÇÜÞ »nýG3ý'aü?i @2$ýó Oòou7L`?züOú¿ñ ólHúÿ¢ßú¼)sݹ²wUÃÇí)ñ?EÿgT @2´üßî® ò³nÏpêÿ»úÿUÿ±Ê°ÿgÁ~ýðÿÈå^ý¯9 à¿þ£ý?XÿW6$ýoí¦õ?5¯ÿ
+ýxø³®ÊÊ1
¤ÿúr~2Í Ø.@Îg¸ã<ÿ!ò<$
+@Éô°ø¿ü_Æsÿ×|þ×8ÿÁBÃþ%þ9ü_ð²ú¯lHúçð¡þÃü_²!éÃÿ
õ?ÿ²!ésÿ×\ÿI¡þò¿²¡åÿü_Øÿ³`¿~ø¿är¯þwó¡ÿ;ðɤÿý_Ëþ!îäá7=hLr!éÃÿý³ ÿlúöô]û¿ªÐöÿkH㿹ÿkÞÿ7T)æ¥pÉ
¤ÿê?,DоhHúßÑÿõ~ÿOÿ'ðɦûC~¬zýt2¹S¦Ný«¹þc ÿÁ×Û `Iÿ;ú?¯úOÂúø?eCÒÿýÿÞ×ÿ)úóà "Zþ?ÿçmýbýÏýúßïÿ+°Ç½ú߯ÿÌõ%ÿ,¤
+[ ÁôÏÑÿ÷°þ²Ù ÿ¯\Ï åÿÑÿäÿeCÒÿæþïÅú\ @ÿ¨,À
+ !è_±ôÿÄýß,Æ£ÿ'ò¿, ÿ§lHúçðãü?Hþʤþð± ÿ·lHúçèÿõ?ÿ²!é£ÿ'ò¿, ûlhù?þØÿ³`¿~ôÿ˽úßÿ'ü,àølHúßÜÿ¹¨ÿ
öÿ,ü^÷Cw)lú3@Húçèÿ ý³þ²Y«ÿ¦¶¹~Ú3ü×ÿãúÈÿËfuüo/egþòµ~NX
ûõÿ
+ì4 ÿ'¾ãß®¹÷Âïùÿ:þQû_x@þG6¾ú_«ºlòâÒåö5ÏpçæóÅ8ÿÇʦÀ, _ý÷
7Ϲ~ÕÕi:þk?¾º¨ÌG§þ¹þÓý¿yx×ÿÞ_Õûëud×Ì?)Tý?7¯¦«nÍ3Üñ?^Äÿúg¡5]Ùtg]Èýñÿ6|pê?ÍýÑÿ¢©{Ó½Z¯yh꣧ãÃeü¬ouaÚæËøVøÝLåÀOUÿ{ïÿÑÿìÿeã«ÿ§ªéóSu®<Äà¯ÿp|ýs ýËÿÏúë¾ñúgú
+µþ7tºî§Sß¹5ÔÅ]ç?çýÿÒ û¿h¨úß;þ£ÿÿ²!뿪·Ó0ÏÿÃÿÃÅò÷þÐCïéîåÿViÀÿÍmüêlò1ØÜóÿ¢þÇê?,Üü_IFi}ºùÀO7'Øø.¸½;ÜÞüÛÿl°Dý7>]s at +á^ÿÍÏÄ*ÀúHY6äúÏÎû?ø?xÀþO6Tý»êÕ¬rüßã úç`òwÖÍÇÏ8 *_ýë²4
çpÿõèÿÇT/jü·¿Zckáÿé²þÿ¿\êþÒ¶M7Îé¿b.Ç:ý«Ôøçi¿ºþ£þ¨L)
ú«ÇhÚæÔ<¿~¼Ç?²õ?üÇÿÛå?.>ëgW®Eßúßâüèÿ'ýM·Bóßã¯ÿ0
+Ðÿ
ú
+Qÿ}õdÓ ýF÷¤óø¤8ÿÁ
+CÌrñ×ÿðÒ}ôÜúfúOÆý"ôÏJ ~ÉÜÿÏpê_-âþÿ<دºÿAErçúÕ3üõ%!ü,¼ë¿,Kè_"«õ_tºÉëfø°Íó¸õ?Ïÿ©(Âú
4*Ãc¦ch_&ëõ?] Hz¸gýW%1ê¿xÿtd¸ëùßëü£þÏmüûêo» Ýù¿d^ÿÿyHTøB¿\hú?WsZý·þõÿûpû¯lhú/ÓÙ¦¹½8w,Üú_Ôÿ¢ õÒdhúÿæäßênZÁ~ðÿøªþ?àÿ
+Mÿ_ô[7e®ûñoWöò jø¸4!þgüÿ,¨dù¿Ý]{ ägݺáÔÿÒÿFØÿ³`¿~øär·þW ðÿqaÿÏü¿²¡éxk·¬ÿ©yý7côÿbáϺ*+sÄ$ þëËùÉt6`û ¹áÿñbýüBP2ýþ¯þ/h㿵ÿk>ÿaþï,¤1ì_¡éÁÿÿ'¨ÿʦÿÝý_aúðɦÿÖÿ, þ˦ÿý_sý'YúÈþÊÿÛßÿ
ý?öëÿK.wë'ÿú?ñ ÿlhúߨÿõþ1öÿ,ü¦@.4ý3ø¿ àÿ
+Eÿÿ+
ÿÚøoíÿçBÿc"Qê \húßßÿ¡þÃîþ
+Mÿý¿°ÿcþ/ÙõoÈU¯N&wéÔ©µ¨ÿâ?Á×Û `MÿþOø?XÿS64ý3ôÿÃùâ& Éóÿ»û?Ñÿûõ[ÿgûÿDr·þ7ñ.ôÃÿÍ
+UÝ
¦þèÿÉúÿÉfü¿r<ÿþY@þ_64ýoíÿÿÃ,
þ9PY@CÑ¿âðãþohãÏÐÿ÷?±þ²¡é¡ÿ'Ö,Àÿ!þüߨÿ² ÿ·lhúgðbýÏâ¿lhúgèÿúèþ!bþoÿþØÿ³`¿~ôÿËÝúßëþgìÿY@ÿOÙÐô¿µÿsYÿ±ÿgá÷ººKa³7BÓ?CÿOèôÿÍjý7µÍõáÿ"
õ?ÈÿËf}üo/egþò´~NX
ûù?$Aÿ_¼Ç¿3'=\s?Î
ß;þùHÅèÿÁò?²ñÖÿøZÕe.·¬x;ÿ3ÿã DýM#I@(Þúï=nsýª«Ótü×~|1uQNý'sý§Iþ,¼ëÿAEï¯êýõ:2ëæ²þWÓÕM·âîø¿ÈÿèÿÃCkº²éκ.4.
+âÿm&ø0àÔÍã?ú3Q4uoºWká5M}4ãTp|¸õ.ÌCÛ|ßêñ¿)°øi ë×ý¡ÿØÿËÆ[ÿOUÓç§ê\W¿þÇ îÿaú
+9þõ×]ã?ôÏô/rýoètÝO§¾sk¨{ÎÎûÿ¥
+ûpìK6dýïÿã@!ÿÏâ¿lèú¯êÍôÌóÿðÿpqüEã¿ÿôÐû¹À'
ûõÿÍúÿ²@ÿ¡:| ö'ç¡ çü¿¨ÿÆ1úòpó%YÂäÓÍ|º9ÁÆwÁíÝáöæßþg ê¿ôér?ýþÿUõ²lèõ=÷ðpýlÈú?vÕ«Yãþ¦ø¿£xÜ@ÿLþκùòøÁKÄ[ÿº,Máw Üÿç¿Ãõpþ[6äøoµÆW<Ãÿýÿ¿\êþÒ¶M7Né¿b*Ç:ýG)¥ïÏi¿ºþþ'P²õ_ÔögõøMÛç7Â/÷øA%üÇÿÛÝ?.>ëgW®5{ýÎÆ?Nôÿd!BÌ¿þ¦[¡ùïñ׿m ýsÔ¿lúï«'è×\ÿ±Bÿé<þ'êÿ,Déca¿þÎè£ÏàÖ4Ó¢Ðÿ(
ø%s·þW<éµÿAÿöðÝoã©@w®ÿW=Ã_ÿQÁÿÃBYп`Vë¿ètÿ×ÍðQçqë¾þWQøÏ
+£2T!~¬×ÿtÿéVâõ_âü'ã?Ýÿzþøÿøêÿ,ÐÆ¿¯þÞòþßôJ¯÷ÿ"ÿÇB¢Â?ùåBÓÿɼÓêg¸õ¿¬ÿgØÿ³ÛeCÓѼÎö|Ìí¥À¹c9àÖÿ¢þ)ÔÿYHcL ¡éÿx«»aêûÁ3üãðÿ±û¿eCÓÿýÖçMë~üÛ½<¨îéÿ¼ÿÿÿhù¿Ý][ ägݺáÔÿÒÿÆØÿ³ ÿlîÖÿ þñ?cìÿYÿW64ýoíõ?5¯ÿaû_Xø³®ÊÊ1
¦ÿúr~2Í Ø6@®g¸ã<ÿò<$
+@ÉPôpø¿"ø¿8 ÿÖþ¯ùü1ú¿±Æ°I¦ÿü, þ+þ÷÷¨ÿ° ÿlhúgðaýÏâ¿lhúßÚÿ5×)ÔX@öW6Äüßþþ/ìÿYÿK6wë'ÿú?ñ ÿlhúߨÿõþ öÿ,ü¦@.4ý3ø¿ àÿ
+Eÿÿ+
ÿÚøoíÿçBÿc"Qê \húßÝÿ¨ÿ°ûÿdCÓ?Cÿ/ìÿXÿK6DýÛòcÕë§É]:uêÑÿ? Ð?Á×Û `MÿþOø?XÿS64ý3ôÿÃùâ& Éóÿ»û?Ñÿ Âý¹[ÿø?úáÿæ!JcìäBÓ?Cÿ?ôÿdýÿd³Eþ_9áÖÿòÿÐ?Èÿ˦ÿýßóóqàþoTà`(úWþoÜÿÍmüúâþ'ÐÿS64ý3ôÿÄúä~eCÓ?ÿõ_àÿ
+MÿþO¬ÿY@ü
+Mÿý?QÿaÝ?dCÌÿíßÿûÐÿS6wë¯û±ÿgý?eCÓÿÖþÏeý/Áþ
ßë~è.
ÍÞ`"Mÿý?¡ÐÿS6«õßÔ6×Ozþ/B¬ÿY@þ_6ëã{);ó§õsÂ*ÜÏÿ$)úÿ²à=þ9éáûq.üÞñÏÿD*Aÿÿ·þÇת.¼¸t¹ý`Å3Üùùüê¿,¨lLBñÖ_èq#øëW]¦ã¿öã©Ê|° pê?ë?Mú°ð®ÿ½¿ª÷×ëÈ<®/~RÈún^MW7Ýg¸ãÿ"ÿ ÿéʦ;ëº0и@6ÿ·àÃtSÿi¶ðÃÿÁCÑÔ½é^
×<4õÑSÁñá2~Ö·º0móe|«Ç?ün¦Àr৬ÿ÷ÿèÿÁöÿ²ñÖÿSÕôù©:WëÕà¯ÿ0pÿпlÈñÿ¬¿îÿ¡ ÙëC§ë~:õ[C@]ÜsþsÞÿ/UØÿópøECÖÿÎñ?DþÄÙÐõ_Õé?çÿáÿáâ ùÆÿ?è¡÷sO
+÷ëÿ
èÿËqüêlò1Øóÿ¢þÇèÿÉÃÍÿñ§,øtsïÛ»ÃíÍ¿ýÏAÕ3èÓ5ä~{ý7?ÿ«ë? eÙÐë?ûîÿàÿàû?ÙõìªW³ÆýMñGqAÿLþκùòøÁKÄ[ÿº,Máw Üÿç¿Ãõpþ[6äøoµÆW<Ãÿýþ/~¹Ôý¥mnÒÅT ú·rójjߺÏi¿¶þ£Ûÿ'ÎPÿaÁsü;cO|ülü£ÏðÊÿNã¡ÿ3HýÈÆSÿö¨oÑ}NÿPô&ú¿²þ²Y¹ÿh+¿+^ë¿`'T¦ìýOXÿíÏêñ¶95Ïo_ïñ,M0þøÿ·»[]|ÖÏ&¯\9 ¯ø?âþwÐý]6þú/n
æ¿Ç_ÿa ÿ/Øÿ˨ÿ¾z²U ~Íõo+ôÎãÂÿÉB?F æ ±øëxé>úÌ nýG3ý'ü<DX æný¯xSÿjÿÜÿÌýúÿ¿¦qܹþ_õýGIÿ7ã·_þ·,¡¡¬ÖÑéþ%¯á£[>>ÆÿyþOEÖÿ,8
+U¦ch_&ëõ?ÝÿLz¸gýwºÿõßýñÿéþïÐó×ÀüU£þÏmüûêo« ñÿý?§ú_øÏC¢Â?úåBÓÿɼÓêg¸õ¿¬ÿ§Øÿ³ ÿlhú/ÓÙßù©ªm6ðÿ»pëQÿÔÿYHcL ¡éÿx«»aº àgøÇÿTeðÿ±ó?²¡éÿ~ëó¦Ìu?þíÊ^Y
+÷Üÿ±ÿY ÿ?
+ý_DCÌÿ½èîÚ*?ëÖõ§þþ0ÂþûõÃÿ#»õ¿â ücÜÿÁü¿²¡éxk·¬ÿ©yý7Ñÿ?몬ÌPhú¯/ç'ÓÙméz;þÇõ?ò<$
+@ÉPôïÛÈ*ÜÛÿÁÿÅmü·öÍçÿ0Ðÿ
4ýK24ý3ø¿àÿdõ_ÙÐô¿»ÿ+Äý?<Àÿ%þü_Xÿ³ø/þ·öÍõdê?, û+bþoÿöÿ,دþ/¹Üÿü_èÿÄü_²¡écÿ×ú?ÄØÿ³ð4f ¹ÐôÏàÿþYÿK6ýGþ¯þ/h㿵ÿkÿ qþD©`r¡éÿWú´/þúaÿÇü_²!êßþ«^?LîÒ©SÿjQÿ #į·AÀ< þüð° ÿ§lhúgèÿóÿ,ÄL !æÿw÷¢ÿ½ÿ¯À@*wëÿçBÿ1üß<DÁc@÷b¡é¡ÿú²þ²Ù"ÿ¯ÏpëÿùèäÿeCÓÿÖþïùù8ÌRè¸D0ý+ÿ7îÿf6þý?qÿèÿ)þúbýÇü²¡éÁÿú/ð˦ÿ'Öÿ, þ˦þ¨ÿ°î²!æÿöïÿý?öëGÿO¹Üÿ½îÆþôÿ
+Mÿ[û?õ¿û~¯û¡»6{@ 4ý3ôÿþY@ÿOÙ¬ÖSÛ\?éþù¿ RXÿ³ü¿lÖÇÿöRvæ/OëçU¸ÿ3HôÿeÁ{ü;sÒÃ5÷ã\ø½ãÿTþ, ÿ#oý¯U]6yqérûÁg¸ó?óù?BÔYPÙ4âÿ¾ÐãFð9ׯº:MÇíÇSù`AàÔ2×èÿÁ»þTôþªÞ_¯#óp¸¾`~øI!ëÿ¹y5]Ýt+áÿüoþ?<´¦+î¬ëÂ@ãÙ þßfÓNý§Ù<þ£ÿ7ES÷¦{µ^óÐÔG3NÇËøYßêÂ<´Íñÿð»Ë²þwÝÿGúðý¿l¼õÿT5}~ªÎÕz5øë\ àþ ÙãÿYÝ5þCÿ,@ÿ²!×ÿN×ýtê;·º¸çüç¼ÿ_ª°ÿçá ñ¬ÿ]ã(äÿY@ü
+]ÿU½þyþþ.¿hü÷ÿz?ø¤p¿þ¿Bÿ_ã?TgÀþä<äÿõß8FÿOnþ¯$cDn>°àÓÍ 6¾nï·7ÿö?lUÿÍ O×ûîõßüü_¬R¬ÿXeC¯ÿì¹ÿÿìÿdCÖÿ±«^Í÷7ÅÿÅã úg`òwÖÍ
Çϸ^"Þú×ei
+¿àîø¿8ÿ¦¨ÿ°óß²!ÇÛø«5æ¸âîø¿èÿ(ø¿XøåR÷¶mºqJÿS8Öé_¥¾?7¦þêúúO 2eõúÏþ¬ÿ¡iSóüFøEðÿ0ÈRôbÁü¿ÝýÓêâ³~6yåZ¸×ÿálüãýx@ÿ?Ùøë¿hºÿýú¿ðëÿdCÔ_=Ù,@¿æúúOçñ?I±ÿgA
a9@,þú^:£>3[ÿÑLÿIú?*
ø%s·þW<éµÿAú?öëÿ¯ûS8î\ÿ¯z¿þ£ç¿yx×YпDVë¿ètÿ×ÍðQçqëÿSîÿå!ÊHe:öe²^ÿÓý¤gX{ÖÕø?GýÏñî=
+üÇ_E1êÿ,ÐÆ¿¯þÞòþßôê!â?
+ÿ@èMÿ'ójN«áÖÿ²þaÿÏnÿ
+MÿEób:Ûó1·çå[ÿú_ þÏB
+hhúÿæäßên:Á~ðÿøªþ?àÿ
+Mÿ_ô[7e®ûñoWöò j¸§ÿó"þgüÿ,Àÿ#bþïEw× ùY·®g8õ¿ôÿ1öÿ,دþ¹Üÿ üãGØÿ³ø/þ·vËú×Ã0FÿOþ¬«²2GLB¡é¿¾Lg3 ¶
+ëîø/ÖÿÈÿñ(T %CÑÀáÿÂý,ÐÆkÿ×|þÃ(ÂüÏAÃþ%þ÷÷áþPÿ
+Mÿþ/ÔXÿK64ý3ø¿°þgñ_64ýoíÿë?ÉÔX@öW6Äüßîþ/ÿäÁ~ýðÉånýïåÿÂþø¿dCÓÿÆþ¯ô±ÿgá7=hÌ r¡éÁÿý³ ÿl(ú8ü_ü_ÐÆkÿ×<ÿâüR8ÀäBÓ?Cÿ/ÔXÀÝ?²¡éÁÿ
ýðɨûC~¬zýt2¹K§Ný«Eý'ÿY¾ÞóDhúgðÂÿÁü²¡é¡ÿÎÿ³0Hÿß¿ÿÖÿ,دßú?#Üÿ'»õ¿ÿs¡ÿþoTø¨2è^,4ý3ôÿCÿOÐÿO6[äÿã¤ü?ôÏòÿ²¡ékÿ÷üüGfôÏÊ EÿÃÿû¿Y ?CÿOÜÿÄúʦþXÿ± ÿlhúgð£þËüß²¡éÁÿõ?ÿ²¡é¡ÿ'ê?, ûlù¿ýûbÿÏýúÑÿS.wë¯þØÿ³þ²¡ékÿç²þcÿÏÂïu?tÂfo0¦þÐ?èÿ)Õúojë'=Ã?ÿD
+ëÿÍúøß^ÊÎüåiý°
+÷óIþ¿,xgNz¸æ~¿wüó?ÑÿädãÿñµªË&/.]n?Xñwþg>ÿÇAú/*F P¼õßzÜ>çúUW§éø¯ýøbê¢2,úOæúO ý?Xx×ÿÞ_Õûëud×Ì?)dý?7¯¦«nÅ3Üñÿ
+ÐÿÖteÓu]h\ ÄÿÛLða:À©ÿ4Çôÿf¢hêÞt¯ÖÂkúhÆ©àøp?ë[]¶ù2¾Õã~7S`9ðÓ@Öÿ®ûÿ(Cÿ°ÿ·þª¦ÏOÕ¹Z¯ýÛ ôÏô/rü?믻Æèè_6äúßÐéºN}çÖP÷ÿ÷ÿKöÿ< ~Ñõ¿küíPèÄÙÐõ_Õé?çÿáÿáâ ùÆÿ?è¡÷sO
+÷ëÿ)ôÿe8þCu6ùìOÎCAÎùQÿcôÿäáæÿJ²0:ÄÙ§,øtsïÛ»ÃíÍ¿ýÏAÕ3èÓ5ä~{ý7?ÿ«ë? eÙÐë?{îÿàÿàû?ÙõìªW³ÆýMñGq@ÿLþκùòøÁKÄ[ÿº,Máw Üÿç¿Ãõpþ[6äøoµÆW<Ãÿýí°Ð?¿\êþÒ¶M7Né¿b*Ç:ýÇ¥ïÏi¿ºþý'P
+Ô8X=þCÓ6§æùðà=þaÙþÿýñÿowÿ´ºø¬M^¹Ö îõ8ÿ8Mÿg!BÌ¿þ¦[¡ùïñ×aýÏúʨÿ¾z²Y~Íõ+ôÎãü?QúgÄâ¯ÿá¥3úè3¸õÍô¨ ýÿY±ÍÝú_ñ§þÕ"þ ú?³®÷ÿM`*ÇëÿUÏð× ÿ#eYBÿYÿ¢ÓýK^7ÃG]?Æÿùú_E¸ÿÇid:øE²^ÿÓý¤gX{ÖU¡þËçøO÷?¿þãoÀøs@ÿ¾ú{ËûÿÑÿ)Ãý¿$*ü_.4ýÌ«9~[ÿËúý?¸ýW64ýÍélÏÇÜ^
+;ný/êBý
4Æ þ¿y'ù·º¦N°<Ã?þ§a ÿðÿɦÿ/úÏ2×ýø·+{yP5ÜÓÿyÿ3ÿ?8ÿ+bþïEw× ùY·®g8õ¿ôÿ1öÿ,Àÿ#»õ¿â üãûàÿ
+MÿÃ[»eýOÍë¿a£ÿÖUY#&¡Ðô__ÎO¦³ ÛÈõwüçñ?BþD¡(þÿWÿ´ñßÚÿ5ÿÇõîÿc!aÿMÿþ/ø?Y@ýW64ýïïÿ
+Pÿaþ/ÙÐôÏàÿÂúÄÙÐô¿µÿk®ÿ$PÿaÙ_Ùóûû¿°ÿgþ/ÙÜÿü_èÿÄü_²¡écÿ×ú?$Øÿ³ð4f ¹ÐôÏàÿþYÿK6ýû^gîíÿJàÿâ6þ[û¿æùçÿH:À&þü_¨ÿ°ôlhúgèÿ
ýðɨûC~¬zýt2¹K§Ný/úÿÇã úç øzÌ¡éÁÿ ÿðʦþ8ÿÏB|À bþÿ'Öÿ,ü¹[ÿø?úáÿæ!ãºMÿû÷ÿKÐÿôÿÍùåx[ÿËü?úÿòü¿lhúßÚÿ=?ÿGîÿfAen EÿÃÿû¿Y ?CÿOÜÿÄúʦÿ7Ö,Àÿ!þú¢þËüß²¡éÁÿõ?ÿ²¡éÿþ
+õÐýC6ÄüßþþOìÿY@ÿOÙÜÿ½úbÿÏúʦÿýËú_ý?¿×ýÐ]
+½ÁD þúBÿ, ÿ§lVë¿©m®ôÿü_)¬ÿY@þ_6ëã{);ó§õsÂ*ÜÏÿ$)úÿ²à=þ9éáûq.üÞñÏÿD*Aÿÿ·þÇת.¼¸t¹ý`Å3Üùùüê¿,¨lLBñÖ_èq#øëW]¦ã¿öã©Ê|° pê?ë?Mú°ð®ÿ½¿ª÷×ëÈ<®/~RÈún^MW7Ýg¸ãÿ"ÿ ÿéʦ;ëº0и@6ÿ·àÃtSÿi¶ðÃÿÁCÑÔ½é^
×<4õÑSÁñá2~Ö·º0móe|«Ç?ün¦Àr৬ÿ÷ÿèÿÁöÿ²ñÖÿSÕôù©:WëÕà¯ÿ0pÿпlÈñÿ¬¿îÿ¡ ÙëC§ë~:õ[C@]ÜsþsÞÿ/UØÿópøECÖÿÎñ?DþÄÙÐõ_Õé?çÿáÿáâ ùÆÿ?è¡÷sO
+÷ëÿ
èÿËqüêlò1Øóÿ¢þÇèÿÉÃÍÿd¶éBúéæ>Ý`ã»àöîp{óoÿ³ÁFPõßút͹á^ÿÍÏÿÅã¯%ôϤ,zýgßýü<`ÿ'²þ]õjÖ¸¿)þï(ÎRèÉßY7_?ã"xxë_¥)ü»ãÿâüw¡þÃÎËÿmã¯Öãg¸ãÿ¢ÿoÂÿÅÂ/º¿´mÓSú¯
+ıNÿaFéûscÚᯮÿóÊíÿ
úÏþ¬ÿ¡iSóüFøEðÿ0È2ÔÿXðÿowÿ´ºø¬M^¹Ö îõ8ÿ8MÿY@÷OÙøë¿hºÿýBÿ_°ý
+Qÿ}õd³ ýë?Vè?Çÿ$ÅùÂø1J0Å_ÿÃKgôÑgpë?é?Qú¿²f¿dîÖÿg8õ¯ñ?HPÿcÁ~ýÿ
+®. ØäqçúÕ3üõ%ü,ß~ùß²þ
²ZÿE§û¼nº<[ÿóüb¬ÿY(¢2<f:öe²^ÿÓý¤gX{ÖU¢þËçøO÷?¿þã?þú?´ñï«¿·¼ÿ÷ý¦ú_øÏC¢Â?úåBÓÿɼÓêg¸õ¿¬ÿãü?ðÿȦÿ¢y1íùÛKsÇrÀÿEý/
+Pÿg!1H¦ÿoàIþî©ìÏðÿiÀÿÇîÿ
+Mÿ_ô[7e®ûñoWöò j¸§ÿó"þg
+þT @2Äüßî®- ò³n]Ïpêéÿ cìÿY°_?ü?r¹[ÿ+ øÇÿ8Æý<Àÿ+þ·vËú×Ã0Fÿ/þ¬«²2GLB¡é¿¾Lg3 ¶
+ëîøÏãüBP2ýþ/ÿ´ñßÚÿ5ÿÇõú¿³Æ°I¦ÿü, þ+þü_¨ÿ° ÿlhúgðaýÏâ¿lhúßÚÿ5רÿ°ì¯lù¿ýý_Øÿ³`¿~ø¿är·þ÷òaÿÏü_²¡écÿ×ú?$Øÿ³ð4f ¹ÐôÏàÿþYÿK6ýGþ¯þ/h㿵ÿkÿ qþD©`r¡éÁÿ
ú¸ÿK64ýïïÿRØÿ± ÿlú·?äǪ×O'»têÔ¿ZÔÂñ
àëm0H¦ÿ'ü,Àÿ)þúÿáü?ñdùÿýýXÿ³`¿þÿF¸ÿO*wëÿçBÿ1üß<ñcø?è^,4ý3ôÿCÿOÐÿO6[äÿãnýÿ ÿý³ü¿lhúßÚÿ=?ÿGãôÏÊÜ "þÿ÷³@þ¸ÿôÿ
+Mÿþo¬ÿXÿC64ý3ôÿDýø¿eCÓ?ÿëÿeCÓ?CÿOÔX@÷Ùóûû?±ÿgÁ~ýèÿ)»õ¿WÿOìÿY@ÿOÙÐô¿µÿsYÿK°ÿgá÷ººKa³7BÓ?CÿOèôÿÍjý7µÍõáÿ"
õ?ÈÿËf}üo/egþò´~NX
ûù?$Eÿ_¼Ç¿3'=\s?Î
ß;þùH%èÿÁò?²ñÖÿøZÕe.·¬x;ÿ3ÿã DýM#I@(Þúï=nsýª«Ótü×~|1uQNý'sý§BÿÞõÿ ¢÷WõþzkeøóÃO
+YÿÏÍ«éê¦[ñwü_äôÿá¡5]Ùtg]Èñÿ6|pê?Íþoø?x(º7Ý«µð¦>q*8>\ÆÏúVæ¡m¾oõøßÍXü4õ¿óþý?xÀþ_6Þúª>?Uçj½üõ¦îÿaú
+9þõ×]ã?ôÏô/rýoètÝO§¾sk¨{ÎÎûÿ¥
+û¿hÈúß9þÈÿ³ø/ºþ«z3ýóü?ü?\ Ñøïÿ=ô~.ðIá~ý³ýY ÿPM>F ûóPsþ_Ôãý?y¸ù¿lºìÓÍ|º9ÁÆwÁíÝáöæßþg ê¿ôér?ýþÿUõ²lèõ}÷ððýlÈú?vÕ«Yãþ¦ø¿£8K &gÝ|yüà%â]¦ð; îÿóßaú8ÿ-rü·¿Zc+áÿþ¿Aÿ¿\êþÒ¶M7Né¿b*Ç:ý+ß+ÿÁ´Ã_]ÿ?W
+Ðÿ
Õã?4msjß¿ÞãY`ü9ðÿowÿ´ºø¬M^¹Ö îõ8ÿ8
ÿ¤þdã¯ÿ¢éVhþ{üõê,$пhúï«'è×\ÿáyþcÿIüÁ£B`Áøëxé>úÌ nýG3ý'AüP¿lîÖÿg8õÿüpíÿû?X°_ÿ§A8À$;×ÿ«á¯ÿ( Ñÿ
ÿÓYп8Vë¿ètÿ×ÍðQçqëÿSú?ñ`K-I¦cÄ~¬×ÿtÿéVâõ_g¨ÿrà9þÓý¡ç¯ÿø«(FýÚø÷Õß[Þÿ»Èÿ!â?
+ÿ@èMÿ'ójN«áÖÿ¢þ¥Øÿ³ÛeCÓѼÎö|Ìí¥À¹c9àÖÿ¢þ¢ÿi @24ýó Oòou7L`?xüOÑÿ ÿeCÓÿýÖçMë~üÛ½<¨îéÿ¼ÿiÿ?*Å bþïEw× ùY·®g8õ¿ôÿöÿ,دþ¹Üÿ üãØÿ³ ÿ¯lhúÞÚ-ëj^ÿ
+ÃçXø³®ÊÊ1
¦ÿúr~2Í Ø6@®g¸ã¼Xÿ#ÿÇC¢PEÿÿËöÿÿkh㿵ÿk>ÿ ÿ+iûdhúgðÁÿÉÒ?²¡éÁÿ
úðɦÿÖÿ, þ˦ÿý_sý')îàÙ_Ùóûû¿°ÿgÁ~ýðÉånýïåÿÂþø¿dCÓÿÆþ¯õÀþ
ßô 1È
¦ÿôÏü_²¡è?âèÿ¥àÿâ6þ[û¿æùçÿH:À&þü_¨ÿ°Aû¢¡éÁÿ
ýðɨûC~¬zýt2¹K§Ný«Eýg\@ÿ_oy@"4ýïïÿÄý< ü+þúÿáü?ñdùÿýýXÿ³`¿þ÷ûÿ
+läq·þ7ñÎý_q"þ³>Â*þúÿ¡ÿ'èÿ'-òÿÊñRþúgùÙÐô¿µÿ{±þ3ýs ² 7¢ÅÑÿ÷³@þ¸ÿôÿ
+Mÿþo¬ÿX@òW64ý3ø¿QÿeþoÙÐôÏÐÿëÿeCÓ?CÿOÔX@÷Ùóûû?±ÿgÁ~ýèÿ)»õ¿WÿOìÿYûS64ýoíÿ\Öÿ"ìÿYø½îîRØì
+&ÐôÏÐÿúgý?e³ZÿMmsý¤gøçÿ(Àú,ÿe³>þ·²3yZ?'¬ÂýüA ÿ/Þãß®¹çÂïÿüO¤"ÿeùÙxë|ê²ÉKÛV<ÃÿÏÿ±M Aÿ¨lLBñÖ_èq#øëW]¦ã¿öã©Ê|° pê?ë?µ/Ð?ïúPÑû«z½ÌÃáúùá'
¬ÿçæÕtuÓx;þ/ò¿îå¡5]Ùtg]Èñÿ6|pê?Íæñý¿(º7Ý«µð¦>q*8>\ÆÏúVæ¡m¾oõøßÍXü4õ¿ëþ?ÊÐÿìÿeãÿ§ªéóSu®Ö«Á_ÿaªpÿпlÈñÿ¬¿îÿqÿ3пlÈõ¿¡Óu?úÎ! .î9ÿ9ïÿ*ìÿy8@ü¢!ë×øÛ ÿeC×Uo¦ÿ`ÿÿä/ÿýÿ ÞÏ>)ܯÿo ÿ/Äñª³ÉÇ`r
+rÎÿúo£ÿ'7ÿW
Q«O7Xðéæß·wÛû
+6ªÿfЧkÈý÷úo~þ/V Ö,@ʲ¡×öÜÿÁÿÁö²!ëÿØU¯fûâÿâ4þ9üuóåñ3.·þuYÂï ¸;þ/Î)ê?,àü·lÈñß6þj9®x;þ/úÿZKôÏÀ/º¿´mÓSú¯
+ıNÿaBéûscÚᯮÿDÿ T¦lýõýY=þCÓ6§æùðà=þaeÆÿñÿv÷O«ÏúÙäk
+à^ÿ³ñÓý?Y@÷OÙøë¿hºÿýQþo,`û/¢þûêÉfú5׬Ð:ÿIú?aü%Äâ¯ÿá¥3úè3¸õÍô(ôã!øEs·þW<éµÿAÿöëÿo^ÇS8î\ÿ¯z¿þ£$ÿ
ñÛ/ÿ[пPVë¿ètÿ×ÍðQçqëÿSQõ?ETI¦ch_&ëõ?ÝÿGz¸gýW%8ÿÉçøO÷?¿þã?þú?´ñï«¿·¼ÿ÷ý¦ú_øÏC¢Â?úåBÓÿɼÓêg¸õ¿¬ÿgØÿ³ ÿlhú/ÓÙ¹½8w,Üú_Ôÿ¢ õÒdhúÿæäßên:Á~ðÿøªþ?àÿ
+Mÿ_ô[7e®ûñoWöò j¸§ÿó"þgüÿ,¨dù¿Ý][ ägݺáÔÿÒÿ3þôÏýúáÿËÝú_q À?þÇqý?ðÿʦÿáݲþ§æõß0qÿÖUY#&¡Ðô__ÎO¦³ ÛÈõwüëäÿxH*¡è?`ðÙþðímü·öÍçÿ0Ðÿ
4ýK24ý3ø¿àÿdõ_ÙÐôÏàÿBýø¿dCÓ?ÿëÿeCÓÿÖþ¯¹þ,@ýdeCÌÿíïÿÂþûõÃÿ%»õ¿ÿûàÿ
+Mÿû¿~Ôÿû~ÓÆ þü_Ð?ðÉ¢ÿ£ÿÿÚøoíÿçBÿc"Qê \húgð¡þÃBí¦ÿö,Àÿ%¢þíù±êõÓÉä.:õ¯õ0Büg!øzÌ¡éwÿgûÿxÿS64ý3ôÿÃùâ& Éóÿûû?±þgÁ~ýÿpÿTîÖÿ&þÏ
þcø¿yãÇðнXhúgèÿþ, ÿl¶Èÿ+Ç3ÜúÿAþúgùÙÐô¿µÿ{~þ#ýs ² 7¢ÅÑÿ÷³@þ¸ÿôÿ
+Mÿþo¬ÿXÿC64ý3ø¿QÿeþoÙÐôÏÐÿëÿeCÓ?CÿOÔX@÷Ùóûû?±ÿgÁ~ýèÿ)»õ¿WÿOìÿY@ÿOÙÐô¿µÿsYÿ±ÿgá÷ººKa³7
BÓ?CÿOèôÿÍjý7µÍõáÿ"
õ?ÈÿËf}üo/egþò´~NX
ûù?$Eÿ_¼Ç¿3'=\s?Î
ß;þùHÅèÿÁò?²ñÖÿøZÕe.·¬x;ÿ3ÿãñ?Ð?*F P¼õßzÜ>çúUW§éø¯ýøbê¢2,úOæúO
þ,¼ëÿAEï¯êýõ:2ëæ²þWÓÕM·âîø¿ÈÿèÿÃCkº²éκ.4.
+âÿm&ø0àÔ-úÿÂÿÁCÑÔ½é^
×<4õÑSÁñá2~Ö·º0móe|«Ç?ün¦Àr৬ÿ÷ÿèÿÁöÿ²ñÖÿSÕôù©:WëÕà¯ÿqûXþeCÿgýu¿øe¸ÿè_6äúßÐéºN}çÖP÷ÿ÷ÿKöÿ< ~Ñõ¿küùÿeC×Uo¦ÿ`ÿÿä/ÿýÿ ÞÏ>)ܯÿo¦ÐÿâøÕÙäc°?99çÿEý7Ñÿÿ+ɬé&útónN°ñ]p{w¸½ù·ÿÙ`#¨úo}ºæÜÏp¯ÿæçÿbbýǤ,zýgßýü<`ÿ'²þ]õjÖ¸¿)þï(ÎBèÉßY7_?ã"xxë_¥)ü»ãÿâüw¡þÃÎËÿmã¯Öãg¸ãÿ¢ÿo àÿbáKÝ_Ú¶éÆ)ýWLâX§ÿÒöçÓeý'ÎÒÿ*bôÿaaíøMÛç·½û?Mãÿ1þûã=þß®þiuñY?¼r.Üëÿp6þqÁÿÉR²ñÖÑtk4ÿ=þúÃõ?"è_44ý÷ÕMôknÿð;ÿqÿèÿÄCð¨ÐX0Þú^:£^3üOàÿfñ_6÷êÍ3úÿ.ÿÕáþì×ÿß÷a@÷ÿ×= ÿ8AÿwþOÿeYBÿâX«ÿ¢ÓýK^7ÃGMÿ?¸õ?¯ÿ¨0Eþ¥QÊjýO×ÿÑa%îYÿUAú/~ã?]ÿúþø¿
+3ÔÿY _ýís 3þ/òÿ¡Jáÿc!Qáþr!éÿd^Íiý3Üú_Ôÿ#
ý?¸ýW6$ýÍélËÇÜÞ »nýGóúß8@ÿ¤1& ÉôÿÍ<É¿ÕÝ05ýèþñ?U¨ÿó ólHúÿ¢ßú¼)sݹ²wUÃÇí)ñ?EÿgT @2´üßî® ò³nÏpêQÿUý?öëÿG.÷êÍ ÿõ¥ðÿ³ ÿ¯lHúÞÚMëÿO¨Ðÿ?몬̳PHú¯/ç'ÓÙíä|;þÇóø"ÿÇC¢PAÿÿ+ÿÒøoîÿÏÿ¡JÑÿ
4ýK2$ýsø¿àÿdõ_ÙôÏàÿ
+Qÿaþ/ÙôÏáÿÂúÄÙô¿¹ÿkÑÿ)PÿaÙ_ÙÐòþ/ìÿY°_?ü_r¹Wÿ{ù¿ôcþ/Ùô¿µÿëýpÿ#¿éAc
+Iÿþ/èø¿dCп÷epVáÞþ¯þ/H㿹ÿkÿ qþD©`r!éÁÿ¢þÃò?²!é£ÿö,Àÿ%þíù±êõÓÉäN:õ¯æúÎÿó|½
+æôÏáÿÿø?eCÒ?Gÿ?ÿg!éK4´üÿþþOôÿáÁ~ýïþÏ÷ÿÉã^ýoãÿ\ø?"ÜÿÇCð@õ!é£ÿîÿ`ýÿd³Aþ_¹áÖÿòÿÐ?ÈÿˤÿÍýßóóqâü*p`úW,þoÜÿÍiü9ú"ÿÃúʤþXÿ± ÿlHúçð£þËüß²!éÃÿõ?ÿ²!é£ÿ'ê?, ûlhù?þØÿ³`¿~ôÿ˽úßÿ'ú¿°þ²!ésÿç²þaÿÏÂïu?t¦o0¤þÐ?èÿ)µúojë§=Ãý?Î ¨ÿ±ü¿lVÇÿöRvæ/_ëçUøzÿgfõüøgNz¸æ~Ü¿wüçÿ(Àþädã«ÿñµªË&/.]n?Xówþg>ÿGYþ,¨lÌBñÕ_èq#øëW]¦ã¿öã©Ê|´ pê?ë?#ÔYx×ÿÞ_Õûëud×Ì?)Tý?7¯¦«nÍ3Üñÿ2ÜÿÊCkº²éκ.4.ûãÿm&ø8àÔÍã?ú0Q4uoºWëá5M}4ãTp|¸õ.ÌCÛ|ßêñ¿)°øi êïýÿØÿËÆWÿOUÓç§ê\yÁ_ÿa ÿÏô/jü?ë¯;Åÿëþ÷?ó ýËZÿ:]÷Ó©ïÜêâ®óóþiû¿x8@ü¢¡êïø#ÿÏâ¿lÈú¯êíôdý'Èÿ³püEã½ÿôÐ{ºÀ'
{ù¿Ujã?üßûCÿ¡:| ö'÷¡ çü¿¨ÿƱBý
ÿ+ÉÂ(ÉO7ØøN}{ÜÞnoþí6Ø¢þA®9 Ïp¯ÿ¹þBþHY6äúÏÎû?ÜÿÂö²¡êÿØU¯fûÛ×ÿ=ù¿âõ&gÝ|yüîñÕ¿.KSx ÷[ÿOñ?§èÿ
+5þÛÆ_1Ç5ÏpÇÿtáÿáÿdáKÝ_Ú¶éÆ9ýWÌâX§ÿ8%5þygÚᯬÿ$jü\eJ¡þÃÂêñ¶95Ïo_ïñ,SüÇÿÛå?.>ëgW®EÏ
úÿ:þq£þÇÖÿ²ñ×Ñt+4ÿ=þú#
ü¸þO6Dý÷ÕMôÝÿÎãþ/<Déca¿þÎè£ÏàÖ4Óÿøÿáÿf!N!~ÉÜÿÏpê_-âþ¯<ÄÁÿÝÿ<î\ÿ¯z¿þ£$Bý
²,¡Á¬ÖÑéþ%¯áÃ6ÏâÖÿ|ý¯¢ñÇi¤2Cü"Y¯ÿé@Ò3¬Ä=ë¿ÊöAýw<Ǻ 2ÜñüïmþOPÿg6þ}õ·Ç]Îøÿ]ÿ§÷ú_#ÿÇB¢Â?ùåBÓÿɼÓêg¸õ¿¬ÿãþ7pû¯lhú/ÓÙ¦¹½8w,Üú_Ôÿ¢ õRDCÓÿ7ð$ÿVwÃÔ
+ögøÇÿ4àÿc÷˦ÿ/úÏ2×ýø·+{yP5|Ü ÿ³ þü?¢!æÿ^twíuëzSÿKÿOó¿<Àÿ#»õ¿â üãûàÿ
+MÿÃ[»eýOÍë¿á8@ÿüYWeeBÓ}9?Îf l ×3Üñ?Çÿù?
+ d(úü_¶ÿü_ûCÿý_óù?#ôf!aÿMÿþ/ø?Y@ýW64ý3ø¿Pÿaþ/ÙÐô¿»ÿKeXÿ³ø/þ·öÍõdê?, û+bþoÿöÿ,Àÿ%»õ¿ÿûàÿ
+Mÿû¿~Ôÿû~ÓÆ þw÷
Èÿñ ÿl(ú8ú
ðq@ÿý_óüOóL$Jà Mÿþ/ÔXÀý²¡éÁÿ
ýðɨûC~¬zýt2¹K§Ný/úÿÇaøÏBðõ6$BÓ?Cÿ?ø?XÿS64ýïßÿ÷ó0Hÿßßÿõ?eÿ§dîÖÿ&þÏ
þcø¿yÃÇ8îÅBÓ?Cÿ?ôÿdýÿd³Eþ_9áÖÿòÿÐ?Èÿ˦ÿýßóóqàþoTà`(úWþoÜÿÍmüúâþ'ÐÿS64ý3ø¿±þcþÙÐôÏàÿFýø¿eCÓ?CÿO¬ÿY@ü
+Mÿý?QÿaÝ?dCÌÿíïÿÄþôÿÍÝúß«ÿ'öÿ, ÿ§lhúßÚÿ¹¬ÿÅØÿ³ð{ÝÝ¥°ÙL¡é¡ÿ'ôÏúÊfµþÚæúIÏðÏÿÂúäÿe³>þ·²3yZ?'¬ÂýüA¢ÿ/Þãß®¹çÂïÿüO¤ôÿ`ùÙxë|ê²ÉKÛV<ÃÿÏÿq¢þËʦÀ$ oý÷
7Ϲ~ÕÕi:þk?¾º¨Ì§þ¹þÓD¡ÿïúPÑû«z½ÌÃáúùá'
¬ÿçæÕtuÓx;þ/ò¿úÿðЮlº³®dø >L8õfþ¿ððP4uoºWká5M}4ãTp|¸õ.ÌCÛ|ßêñ¿)°øi ëçý?úðý¿l¼õÿT5}~ªÎÕz5øë\ àþ ÙãÿYÝ/þGîæú
+¹þ7tºî§Sß¹5ÔÅ=ç?çýÿR
ý?_4dýïÿã DþÄÙÐõ_Õé?çÿáÿáâ ùÆÿ?è¡÷sO
+÷ëÿ
èÿËqüêlò1Øóÿ¢þÇèÿÉÃÍÿdaɧ,øtsïÛ»ÃíÍ¿ýÏAÕ3èÓ5ä~{ý7?ÿ«ë? eÙÐë?ûîÿàÿàû?ÙõìªW³ÆýMñGqAÿLþκùòøÁKÄ[ÿº,Máw Üÿç¿Ãõpþ[6äøoµÆW<ÃÿýíGÐ?¿\êþÒ¶M7Né¿b*Ç:ýGÿ£ôý¹1íð×Öô?ÊT£þÃÁêñ¶95Ïo_ïñmÅãÏÿø»û§ÕÅgýlòʵp¯ÿÃÙøÇiøÏB/ýM·Bóßã¯ÿ0RèÿËô/¢þûêÉfú5׬Ð:ÿIó,Déca¿þÎè£ÏàÖ4Ó¢ú¿²ýâÌÝú_ñ§þÕ"þ)ê,Á÷ÿ æÎõÿªgøë|ÿeYBÿYÿ¢ÓýK^7ÃG]?ÆÿùúüñFexÌtñd½þ§ûÿHϰ÷«ÿ+õ_<Ǻÿ1ôü5ð¥¨ÿ³@ÿ¾ú{Ëû¿ïÿtÿ
¸ÿD
òË
¦ÿy5§ÕÏpëQÿqþÜþ+þæÅt¶çcn/ÎË·þõ?ÜÿËDcMÿß<Àü[Ý
+S'ØáÿÓ0ÿÜÿ-þ¿è·>oÊ\÷ãß®ìåAÕpOÿçEüÏpþ
ó¿¢!æÿ^twmuëzSÿKÿO`ÿÏü?²¹[ÿ+ øÇÿxúç þ_ÙÐô?¼µ[ÖÿÔ¼þ ú±ðg]9b
+Mÿõåüd:°m\ÏpÇÿxÿ#äÿxH*¡è?`ðÙþðímü·öÍçÿ0Ñÿ
4ýK24ý3ø¿àÿdõ_ÙÐôÏàÿBýø¿dCÓ?ÿëÿeCÓÿÖþ¯¹þL¡þò¿²!æÿö÷aÿÏü_²¹[ÿ{ù¿°ÿgþ/ÙÐô¿±ÿëGý°ÿgá7=hÌ r¡éÁÿý³ ÿl(ú8ú)ø¿8 ÿÖþ¯yþ'Äù?&¥pÉ
¦ÿê?,àþ/ÙÐôÏàÿÂþø¿dCÔ¿ý!?V½~:Ü¥S§þýÿã0Füg!øzÌ¡éÿ'îÿãþOÙÐôÏÐÿçÿY $CÌÿïïÿÄú
Âý¹[ÿø?úáÿæ!JcìäBÓ?Cÿ?ôÿdýÿd³Eþ_9áÖÿòÿÐ?Èÿ˦ÿýßóóq¤pÿ7*p`(úWý?qÿ7´ñgèÿûX@ÿOÙÐôÏàÿÆúä~eCÓ?ÿõ_àÿ
+Mÿý?±þgñ_64ý3ôÿDýtÿ
+1ÿ·¿ÿûÐÿS6wë¯þØÿ³þ²¡ékÿç²þ`ÿÏÂïu?tÂfo0¦þÐ?èÿ)Õúojë'=Ã?ÿD!Öÿ, ÿ/õñ¿½ùËÓú9aîçÿýYðÿÎôpÍý8~ïøç" ÿÈÿÈÆ[ÿãkUM^\ºÜ~°âîüÏ|þõ_T6 &¡xë¿/ô¸|Îõ«®NÓñ_ûñÅÔEe>X8õÌõ&!ú°ð®ÿ½¿ª÷×ëÈ<®/~RÈún^MW7Ýg¸ãÿ"ÿ ÿéʦ;ëº0и@6ÿ·àÃtSÿi¶ðÃÿÁCÑÔ½é^
×<4õÑSÁñá2~Ö·º0móe|«Ç?ün¦Àr৬ÿ÷ÿèÿÁöÿ²ñÖÿSÕôù©:WëÕà¯ÿ0pÿпlÈñÿ¬¿îÿqÿ3ÿ¯½÷ÝmY¶=Ïçz
+?@y.Õ=
+ì;5Óè{0w¦ùF¤©MD²IÊ.÷Ó²j×&ËÌ
+T¬ÎÙU]`Aé±2ú
+¹þ×·ºêÆSß¹5TÅ-ç?§ýÿR
ý?;_4dýoÿ#äÿY@ü
+]ÿeµþiþþ.v¿hü÷ÿ½î;?ø¨p¿þ¿Yþ¿,Ç¿/O&"ýÉy(È9ÿÏê¿Ãê?,\ý_IÆQ|¸úÀwêë»àúnw}ówÿ³ÁJPõ_÷úxɹá^ÿMÏÿÅ*ÃúHY6ôú϶û?ø?xÀþO6dýïÛòÙ,qSüßÃJ4þ9ýUýrÿÁKÄ[ÿúp0
ßpwüÿv¡Ð?8ÿ-rü·¿cöáÿ³þ¿Aÿ?«îÜ4u;Lé¿`*Ç2ýg¶?_wøë?qýG ²ÀÞÿúÏö,ÿ¾nêcýøºuÿ§qüà C?ÞãÿõêFõ£ÉKçÀ½þ'ã§XÿóÔl¼õ_ÔíÍ¿þÃ0Fþôÿ
+Mÿ]ù` ÝÛ?üμÅÿDaÿÏBp¯0Æ[ÿýSkôÞkðÿI!þ³Aü¢¹UÿKáÔÿ7ùÿ·øoKÐ?öë»ÿo\<n[ÿ/{¿þ£8
ÿ
éÿp8@ÿâXªÿ¢ÕÝS^Õý{Mÿ·þ§ëfðÿ±Æid:FìÉbý×ÿÑa%îYÿU
+÷ÿ°à7þãõ¡ï¯ÿø«(@ýÒøwå>7:ãÿ,ÿo#þs¨ð7~¹ô4Ïæ¸ünýÏêÿQý?¸ýW6$ýõimËÇÜÞ »nýGÓú_áþoÒdHúÿêåßè¶Á¾÷ÿø*ÔÿyùG6$ý¿è×.¯¹î¿\Ú»ÊþýöÏøÆðÿ³ RL ¡åÿt{é tã|Sÿsÿú1a¿~øär«þ ð_ÿÇQ
+ÿ?ðÿʤÿþµYµþ§¦õßPeÐ?¿Wå¡4{ÌB!é¿:Lk3 ¶óîøOãüBP2ý,þ¯ þ/H㿺ÿk:ÿ*Í0ÿsưI¤ÿü, þ+þ9ü_¨ÿ° ÿlHúgð
Xÿ³ø/þW÷Íú?¥ê?, û+ZþÁÿ
ý?öëÿK.·ê3ÿú¿± ÿlHú_Ûÿõ½þØÿ³ðI÷S\Húgð!ÿÇü_²!è?bñEðq@ÿÕý_ÓüOóL$Jíà Iÿþ/ÔX }ÑôÏáÿÂþø¿dCÓ¿ý!ß~8Ü)S§þÕTÿ±Âù/×AÀ< þ9úÿÁÿÁü²!é£ÿÎÿ³ï0HÿgðbýÏýúßîÿ+°Çú_Çÿ9õÅQøÏBz¯°Iÿýÿpÿèÿ'òÿÊõRþúgùÙô¿ºÿ{¶þ#ÿbAen AÿÅÿû¿Y ?CÿÏ÷?±þ²!éÃÿõHþʤÿ7ê¿,Àÿ-þ9üXÿ³ø/þ9ú¢þúÈÿcðbÿÏýúÑÿS.·ê³þèÿÂúʤÿÕý³ú_`ÿϯU×·ç¦o0¤û¡ÐÿS6Kõ_W6×O{ÿúPÿcùÙ,ÿÍùÐ?|#Vá~þÏ QèÿËïø·æ¨ûKîǽð{Ãþö< ÿ#_ý¯eu¨óâÜæö%Ïpç¦ó%¨ÿ² ²q0ÅWÿ]¡àc®uyÿÚϦ*JóÞÀ©ÿdªÿá¿Fÿ?Þô§¢·Wõöz»ÝåóÃ
+Uÿõ³i«º]òwüæ£÷¿òÐöP·']Èíñÿ:¼pê?Ífþoôÿ桨«Î´ÏÖÃkîêjo©`w>ë]»¦~Þêá¿)°øa êëý?úðý¿l|õÿPÖ]~,O¥üõ& îÿaú
+5þôMã?îæú
+µþ×·ºêÆSß¹5TÅMç?§ýÿÒ ûv¿h¨úß:þ'Èÿ³ø/²þËj=ýÓü?ü?\ì Ñxïÿ{Ýw.ðQá~ýÓýY _L>D ûûPsþÕãý?y¸ú¿,Ò$ýpõ®N°á]p}·»¾ù»ÿÙ`%ú¯{}¼ä<ýþõÿP
+ë? eÙë?ïÿàÿàû?ÙPõ¿oËg³ÈýMòÇ!ú±0ú;«úåþ3.¯þõá`
+Ïàþëÿ(qÿ38ÿ-jü·¿cöKáÿÓþ¿QÃÿÅÂÏçª;7MÝsú/ıLÿQDjüóƸÃ_XÿIá¿SR ê?,ÿ¾nêcýøJøEðÿ0È2ÔÿXðÿ¯ÿ4ºø¬M^º>ëÿËøÇ)â?èþ)ýu»@óßâ¯Û úç þECÔW>Ø4@·Òýé4þ'8ÿÁCßG æ ±øë¿jÞûÌ nýGý'*@þ
ÑܬÿÏpê_Íâó_<ØÍ×Çë8`*ÇëÿEÏð×ÀÿÇÃðí>пPë¿hu÷WuÿnçwqëÿSQõ?&NÃ}¦ch_&Ëõ?^ Hz¸gýW¥ê¿xÿxd¸áùßëüó¿<ÐÆ¿+ÿô¸Ðÿ¿éÿôVÿÿyHTøB¿\hú?gs\ü·þçõÿûàÿ
+MÿEýdZÛô1··çå[ÿ³ú_ þÏBcMÿ_=À£üÝöc+ØwáÿÓ÷¿òû¿eCÓÿ~íòúënøÛ¥½<¨ìßo MÿY ÿ?*Å bþïI· ùI7®g8õ?÷ÿ1öÿ,ðÿæfý/8 àÿã8ÂþøeCÓÿÚ¬YÿSÓúo8Ì Ð?¿Wå¡4{LB¡é¿:Lk3 ¶ëîøOãüBP2ýþ/Ûÿþ¯í¡ÿÚþ¯éüú¿³Æ°I¦ÿü, þ+þü_¨ÿ° ÿlhúßÜÿ¥2¬ÿY@ü
+Mÿkû¿¦úO² õý
+1ÿ·½ÿûø¿Ds³þ·òaÿÏü_²¡éeÿ×÷ú?`ÿÏÂ'ÝkÌ r¡ésÿWüðÉ¢ßËà¬Â½û
ðq@ÿµý_ÓüOóL$Jíà Mÿþ/ÔX@úG64ý3ø¿°ÿcþ/ÙõoÈ÷e§&wéÔ©5«ÿâ?Áë `Mÿýÿàÿ`þOÙÐô¿}ÿ?ÜÿÍC¼Ã bþ{ÿ'Öÿ,öþ¿[ ©Ü¬ÿUü3ýÇðó÷QÝ
¦þèÿÉúÿÉfü¿r<Ãÿïäÿ¡ÿ
+Mÿkû¿§ç?â(¡TàÁPô¯8ü߸ÿÚø3ôÿÄýO, ÿ§lhúgðcýÇü²¡éÁÿú/ð˦þXÿ³ø/þú¢þúÈÿ
ÛÞÿý?úæfýoÕÿûÐÿS64ý¯íÿ×ÿbìÿYøµêúö\Øì
+&ÐôÏÐÿúgý?e³Xÿuesý¤gøçÿHaýÏòÿ²Yÿó¡5xZ?G¬ÂýüA¢ÿ/Þãߣî/¹çÂï
+ÿüO¤ôÿ`ùÙxëx-«Cç6·,x;ÿ3ÿã Dý#I@(Þúï
+=lsý¬Ëãxü×~|6UQwNý'Sý§BÿÞô§¢·Wõöz»ÝåóÃ
+Yÿõ³i«º]ðwüåôÿá¡1í¡nOº*4.âÿu&x7àÔÍúÿÂÿÁCQWi
×ÜÕÕÞSÁþî<|Ö5º0wMý2¼ÕÃ~3S`9ðÃ@ÖÿÆûôÿàûÙxëÿ¡¬»üXÊåjð×ÿ° Àý?,@ÿ²!Çÿþ²]ü2ÜÿÌô/rý¯ouÕ§¾sk¨[ÎNûÿ¥
+ûv¿hÈúß4þÇAü?ÿ²¡ë¿¬VÓ0ÍÿÃÿÃÅòÿþ¿×}ççî×ÿ7Ñÿâø÷åÉäC°?99çÿYý7Ñÿ«ÿ+ÉÂ8WØðN}}\ßí®oþî6X ªþë^/9 ÷3Üë¿éù¿X¥Xÿ± )Ë^ÿÙvÿÿØÿɬÿ}[>%îoÿ;³úç`ôwVõËýg\/oýëÃÁ~ÀÝñvþ;ÌPÿaç¿eCÿ¶ñWcÌ~Á3ÜñÖÿ×~ý3ðó¹êÎMS·Ãþ¦q,Ó@iûóq¿°þgé*¢õ_7õ±~|ݺÿÓ8þa)ôbÁ{ü¿^ýÓèâ³~4yé\¸×ÿádüã$Cÿ'ú·þº]¢ùoñ×FØÿ³ ý˦ÿ®|°InÉí~ç?®ñ÷ñÜ+´ ·þû§Öè½×àÿÿ`ñ_6·êÉ3úÿ&ÿÑ¡þÏýú¯÷ÿa! ÛÖÿËAÐàü7ÿÒÿápþűTÿE«»§¼ªû÷<ÿnýOë?*LÿgAié» ©,ÖÿxýíVâõ_(Ô9ðÿñúÇÐ÷×ÀüU¡þÏiü»òO ñÿUó?,$*ü
+Á_.$ýͳ9.[ÿ³ú?îÿd·ÿʤÿ¢~2mùÛ;s×rÀÿhZÿÑÿ4Æ þ¿zGù7ºíÇF°ï=Ã?þ§
+õPó
+Iÿ/úµËëC®»á/öî ²¿ý3%þ§òÿ,¨dhù¿'Ý^: ä'Ý8áÔÿ¬þ«ûì×ÿ\nÕÿ þëÿ8JàÿgÙôß¿6«Öÿfþý?ø½*¥Ùc
+IÿÕùô`Z°]ÏpÇÿxÿCäÿxH*!èß»U¸·ÿ÷?°@ÿÕý_Óù?TIù4ýK2$ýsø¿àÿd9_ÙôÏáÿBýø¿dCÒ?ÿKaýÏâ¿lHú_Ýÿ5ëÿâþ_ý
+-ÿÇàÿÂþûõÃÿ%[õ¿ÿýßXÿK6$ý¯íÿú^ÿìÿYø¤{)@.$ý3ø¿ÿãþ/Ùô±ø¿"ø¿8 ÿêþ¯iþ'Äù?&¥vpÉ
¤ÿê?,àúoÙôÏáÿÂþø¿dCÓ¿ý!ß~8Ü)S§þÕTÿ±Âù/×AÀ< þ9úÿÁÿÁ<²!é£ÿÎÿ³ï0HÿgðbýÏýúßüîÿÇú_Çÿ9óD¸ÿà>êCÒ?Gÿ?ÜÿÁúÿÉf
ü¿r=Ãÿïäÿ¡ÿ
+Iÿ«û¿§ç?â0Äù/TàÁô¯Xü߸ÿÒø3ôÿDþôÿ
+Iÿþo¬ÿXÿC6$ýsø¿QÿeþoÙôÏáÿÄúÄÙôÏÑÿõÐýC6´üÿûì×þr¹UÿõÿDÿ`û
+Iÿ«û?çõ¿û~º¾=6}@ $ýsÜÿý³þ²Y¬ÿæ|h;֯«p?ÿWèÿÉïø·æ¨ûËÞÏ=ñ¿á¿ÿ¬ÿxÀþO6¾ú^ËêPçŹÍíKáÞÿMçÿ(QÿaaØh[0ÅWÿ]¡eõëg]Çãö㳩Ҽ· pê?ê?#ôÿbáMÿw*z{Uo¯¹Û]^0?ü PõÿX?¶ªÛ%ÏpÇÿiþ'Êpÿ#iu{ÒUa qÜÿ¯3Áûé §þÓlæÿDÿ_ºêLûl=|æ®®öf
+öwçá³®Ñ
¹kêáþð˪þ·Þÿãü?ØÿËÆWÿeÝåÇòTzÁ_ÿaãþ ÙPãÿIÙ4þãþW ÙPë}««n<õ[C at UÜtþkÚÿ+
+°ÿçañªÿãü?ÿ²!뿬ÖÓ0ÍÿÃÿÃÅò÷þ¿×}çéî×ÿ3ÑÿÚø÷åÉäC°?¹O:çÿYý7Ñÿ«ÿ+ÉÂ( WXðáêÞ×w»ë¿û
+V¨ÿº×ÇKhÁ3Üë¿Ùù`ýǤ,rýgãýü<`ÿ'ªþ÷mùl¹¿IþïX¡ÿ£¿³ª_î?ã"høê_¦ð< î¿þB
ûßY@è
+5þÛÆ?1û%ÏpÇÿiÿÏ(àÿbáçsÕ¦n9ýÌâX ÿº²mþox;þOü_j?â?Á}AörYÿUFjüõÆá[XÿMeõ¯ú±°xüûº©õã+áÁ{üà K3?þãÿõòFõ£ÉK×&Àgÿÿ8áÿf=ÿeã¯ÿ¢nhþ[üõF¨ÿó@ÿ¢!ê¿+l°[éþtÿÜÿÃ
+ïÃsXüõß?µFï}f ·þ£þ Cþ
ìhnÖÿg8õ¯fñß¶
þ°_¿½ÿ/´o0ãÆõÿ¢gøë?J"ÔÿXxÓÿápþ%²XÿE«»§¼ªûwÛ¼¿[ÿÓüàÿá!QéÚÉrý a%îYÿUIú/ã?^ nxþÿ:ÿǨÿ³@ÿ®üÓÃèÎÿ%Óú_øÏC¢ÂßúåBÓÿÑ<ãâg¸õ?¯ÿÃÿËnÿ
+MÿEýdZÛô5·GrÇrÀÿYý/
+Pÿg!1H¦ÿ¯àQþnû±ô;Ïðÿ©Êàÿcþ_ÙÐôÿ¢_»¼>äºþvi/+û÷ÀâÀÿÏJ1Hÿ{Òí¥H~ÒëNýÏý?aý?öëÿG.7ëÁ ÿøo¡àÿ
+Mÿýk³fýOMë¿aû_xø½*¥Ùc
+MÿÕùô`Z°}À\ÏpÇÿx¶þGþD¡(þÿWÿ´ñ_Ûÿ5ÿÃ0BÿgÒö/ÉÐô¿½ÿ+
ÿÔeCÓ?ÿõàÿ
+Mÿþ/¬ÿY@ü
+Mÿkû¿¦úO² õý
+1ÿ·¹ÿç?y°_?ü_r¹Yÿ[ù¿°ÿgþ/ÙÐô¿²ÿë;ýbìÿYø¤{@.4ý3ø¿ àÿ
+EÿÿËöÿk{hã¿¶ÿkÿ qþD©`r¡é¡ÿê?,àîÙÐôÏàÿÂþø¿dCÔ¿ý!ß~8Ü¥S§þÕ¬þFÿ,_®y@"4ý3ø?áÿ`þOÙÐôÏÐÿçÿYw $CÌÿoßÿëì×oýîÿÉÍú_Åÿ9Óÿ7*¼T04ý3ôÿCÿOÐÿO6käÿã¤ü?ôÏòÿ²¡émÿ÷ôüG
+ý3 ² 7¢ÅÑÿ÷³@þ¸ÿôÿ
+Mÿþo¬ÿXÿC64ý3ø¿QÿeþoÙÐôÏàÿÄúÄÙÐôÏÐÿõÐýC6ÄüßöþOìÿY°_?úÊåfýoÕÿû`þ
+Mÿkû?çõ¿û~º¾=6{@ 4ý3ôÿþY@ÿOÙ,Ö]Ù\?éþù¿ RXÿ³ü¿lÇÿæ|hÍÖÏ«ðåþÏÐê?Iüxkº¿ä~¿7üò?vü#ãü/ÈÿÈÆ[ÿÃkYê¼8·¹ý`Á3Üùéüÿýs ²q0 Å[ÿ]¡àc®uyÿÚϦ*JóÎÀ©ÿdªÿ4Q¨ÿ²ð¦ÿ;½½ª·×ËÈÜí./~PÈú¬M[Õíg¸ã<ÿððÐöP·']È
+ñÿ:¼pê?ͦñý?(êª3í³µð»ºÚa*ØßϺF殩_·zøÃof
+,~Èúßxÿàþ/°ÿ·þʺËå©\®ý ø?XþeCÿ'ýeøoýQûyþeC®ÿõ®ºñÔwn
+UqËùÏiÿ¿Táü;_4dýoÿã@ÁÿÃâ¿lèú/«Õôd3ýÈÿ³°üEã¿ÿïußù¹ÀG
{ù¿Ufã?üßÛCÿ¾<| ö'ç¡ çü?«ÿÆqúWÿW
Ñ.Ý}¸úÀW'Øð.¸¾Û]ßüÝÿl°Tý×½>^r@îg¸×áTÿ*EþHY6ôú϶û?ÜÿÂö²!ëßÏfûâÿâõFgU¿ÜÆEðñÖ¿>Láw Üÿgç¿CÜÿÁÎËÿmã¯Æýg¸ã:ó+ø?Yøù\u禩ÛaJÿS8é?ÜQúþ\wøë?Ã<¡2¨ÿp°xüûº©õã+áÁ{üÃ`ôÿbü·Çü¿ÞýÓèâ³~4yéZ¸×ÿádüã4Áþtÿ¿þº] ùoñ×)ø¿XÀõ²!ê¿+l [rýÇý§Óø ÿÇCßG æ ±øë¿jÞûÌ nýGý'*ÿ
e?ÑܬÿÏpê_Íâ ÿÏýú?¾|aÇëÿEÏð×D)ôÏÁðí>пPë¿hu÷Wuÿ^ç÷qëÿSQõ?EtT¦ch_&Ëõ?ÞÿGz¸gýW¥ê¿xÿxÿcèùkà?þö?´ñïÊ?×¼ÿ÷ßú?ÅûÿYHTøB¿\hú?gs\ü·þçõÿûàÿ
+MÿEýdZÛó1·çå[ÿ³ú_ûxHa
+Mÿ_=À£üÝöc'ØwáÿÓ0ÿÜÿ-þ_ôk×\wÃß.íåAeKÿçYüÏüÿ,¨dù¿'Ý^Z ä'ݸáÔÿÜÿÆØÿ³`¿~øär³þ ðÿqû_yÿW64ý÷¯Íõ?5ÿaûXø½*¥Ùc
+MÿÕùô`Z°m\ÏpÇÿxÿ#äÿxH*¡è?àð
ðq@ÿµý_ÓùXÿáþÒö/ÉÐôÏàÿÿÔeCÓÿöþ¯ õàÿ
+Mÿþ/¬ÿY@ü
+Mÿkû¿¦úO² õý
+1ÿ·½ÿûì×ÿ\nÖÿFþ/ôâþ/ÙÐô¿²ÿë;ýìÿYø¤{@.4ý3ø¿ àÿ
+Eÿÿ+ÿÚø¯íÿæBÿc"Qj\húgð¡þÃBí¦þ_Øÿ± ÿlú·?äû²ÓG»têÔ¿Õ ôÏAðå:$BÓ?ÿþàÿ
+Mÿýÿpþ
þÑóÿÛû?±þgÁ~ý#Üÿ'õ¿ÿs¦ÿþoÂø>ü ºMÿÛ÷ÿKÐÿôÿÍùåx[ÿóü?úÿòü¿lhú_Ûÿ==ÿGÃGÐ?*p`(úWþoÜÿÍmüúâþ'ÐÿS64ý3ø¿±þcþÙÐôÏÐÿõ_àÿ
+MÿþO¬ÿY@ü
+MÿÛ÷ÿT¨ÿ°î²!æÿ¶÷bÿÏýúÑÿS.7ë«þØÿ³þ²¡émÿç¼þ`ÿϯU×·çÂfo0¦þÐ?èÿ)Åú¯+ë'=Ã?ÿD
+ëÿÍòøßùÃÓú9bîçÿýYðÿÖuÉý8~oøç" ÿÈÿÈÆ[ÿÃkYê¼8·¹ý`Á3Üùéüê¿,¨lLBñÖWèa#øëg]Çã¿ö㳩Ҽ³ pê?ê?Mú°ð¦ÿ;½½ª·×ËÈÜí./~PÈú¬M[Õíg¸ãÿ,ÿ ÿiu{ÒUa q¬ÿ¯3Á»é §þÓlæÿÿ¢®:Ó>[¯¹««½¦ýÝyø¬ktaîúex«?üf¦Àrà¬ÿ÷ÿèÿÁöÿ²ñÖÿCYwù±<ËÕà¯ÿ0pÿпlÈñÿ¤¿lÿ¡ Ùë}««n<õ[C at UÜrþsÚÿ/UØÿó°øECÖÿÆñ?DþÄÙÐõ_V«é?æÿáÿábùÆÿßë¾ós
+÷ëÿ
èÿËqüûòdò!Øóÿ¬þÇèÿÉÃÕÿda¬TðáêÞ©¯ïë»ÝõÍßýÏ+AÕÝëã%ä~{ý7=ÿ¿Ð?²lèõm÷ððýlÈúß·å³Yâþ¦ø¿£8K¡FgU¿ÜÆAPxë_¦ð; îÿ³óßaú8ÿ-rü·¿cöáÿ³þ¿Aÿ?«îÜ4u;Lé¿`*Ç2ýÇ¥ïÏq¿´þ£ÏU¦)õ_7õ±~|%ü"xdYñçÀü¿ÞýÓèâ³~4yéZ¸×ÿádüã4Aþ
1_4þú/êvæ¿Å_ÿa¤°þg!þECÔW>Ø,@·äúúO§ñ?Iÿg!JïãsXüõß?µFï}f ·þ£þÿEÿ ~ÙܬÿÏpê_ÍâþÏ<XÿÏÇë8`*ÇëÿEÏð×D¨ÿ³p8 Á,ÖÑêî)¯êþ½.ÏïãÖÿtý¯¢ñÇid:øE²\ÿãý¤gX{ÖUªPÿåÀsüÇûCÏ_ÿñ~@ýÚøwåkÞÿûmÿ§Ký/ÿc!Qáoür¡éÿhÍqñ3Üú×ÿáÿç·ÿʦÿ¢~2íùÛKsÇrÀÿYý/
+Pÿg!1H¦ÿ¯àQþnû±ì;ÏðÿiþÏ<àþoÙÐôÿ¢_»¼>äºþvi/*û[ú?Ïâ¦àÿgA¥ $CÌÿ=éöÒ ?éÆõ§þçþ÷?ò ÿlnÖÿ þñ?#ìÿYÿW64ý÷¯Íõ?5ÿaþ,ü^Òì1
¦ÿê|z0Í Ø6@®g¸ã<ÿò<$
+@ÉPôpø¿ø¿8 ÿÚþ¯éüo
+ ÿ9HcØ¿$CÓ?ÿþOPÿ
+Mÿþ/ÔXÿK64ýoîÿRÖÿ, þ˦ÿµý_Sý'îâÙ_ÙóÛû¿°ÿgþ/Ùܬÿü_Øÿ³ ÿlhú_Ùÿõ½þØÿ³ðI÷3\húßÜÿ"ÿÇü_²¡è?âðEðq@ÿµý_ÓüOóL$Jíà Mÿþ/ÔXÀý²¡éÁÿ
ýðɨûC¾/;ýp4¹K§NýÏúÿÇaøÏBðå:$BÓ?Cÿ?ø?XÿS64ý3ôÿÃùâ& ÉóÿÛû?±þgáPÀÿ)õ¿ÿs¦ÿþoâðPÁÐôÏÐÿý?Y@ÿ?Ù¬ÿWg¸õÿü?ôÏòÿ²¡émÿ÷ôüG¸ÿ¸D0ý+ÿ7îÿf6þÛ÷ÿqÿèÿ)þüßXÿ± ÿlhúgð£þËüß²¡éÁÿõ?ÿ²¡é¡ÿ'ê?, ûlù¿íýØÿ³þ²¹Yÿ[õÿÄþ?eCÓÿÚþÏyý/Áþ
_«®oÏ
ÍÞ`"Mÿ÷?Cÿ, ÿ§lë¿®l®ôÿü_)¬ÿY@þ_6Ëãs>´æOëçU¸ÿ3HRôÿeÁ{ü[sÔý%÷ã\ø½áÿ¦ôÿ`ùÙxëx-«Cç6·,x;ÿ3ÿã Dý#I@(Þúï
+=lsý¬Ëãxü×~|6UQwNý'Sý§BÿÞô§¢·Wõöz»ÝåóÃ
+Yÿõ³i«º]ðwüåôÿá¡1í¡nOº*4.âÿu&x7àÔÍüßððPÔUgÚgká5wuµ7ÃT°¿;u.Ì]S¿oõðßÌXü0õ¿ñþý?xÀþ_6Þú(ë.?§r¹üõ?, pÿпlÈñÿ¤¿lÿ£÷?ó ýË\ÿë[]uã©ïܪâóÓþ©ÂþÄ/²þ7ÿñ°þ9@ü
+]ÿeµþiþþ.v¿hü÷ÿ½î;?ø¨p¿þ¿Yþ¿,Ç¿/O&"ýÉy(È9ÿÏê¿qþ<\ý_IÆI}¸úÀW'Øð.¸¾Û]ßüÝÿl°Tý×½>^r@îg¸×Óó±J±þcR
+½þ³íþþ°ÿ
+Yÿû¶|6KÜßÿwg1ôÏÁèï¬êûϸ^"Þú×)ü»ãÿìüw¡þÃÎËÿmã¯Æýg¸ãÿ¬ÿo àÿbáçsÕ¦n)ýLâX¦ÿ0¦ôý¹2îðÖµÀ þáGÔ8X<þ}ÝÔÇúñðà=þa¥Æÿñÿz÷O£ÏúÑä¥k
+à^ÿñÓþOÐýS6þú/êvæ¿Å_ÿaûx@ê_6DýwåÍtK®ÿX ÿtÿÇþÐÿöñ}`¿þû§Öè½ÏàÖ4Ñàü'!îÿÍÍú_ð§þÕ,þ¸ÿûõÞ¾
+ÄqãúÑ3üõ%ú¿³0|ûô/Åú/ZÝ=åUÝ¿×åù}ÜúæÿTaýÏBBéÚÉrý÷ÿa%îYÿUIú/ã?Þÿzþø¿bÔÿY Wþ¹æý¿ßöºÔÿBÄþÐ/þæÙ?Ãÿyý?ÃþødCÓQ?Öö|Ìí¥À¹c9àÖÿ¬þáü/)ꢡéÿ«x£Û~ìûÎ3üãª2øÿXÀýß²¡éÿE¿vy}Èu7üíÒ^Tö·ôÅÿ,ÿb1ÿ÷¤ÛKü¤×3úûÂûì×ÿ\nÖÿ þñ?ÞBÿÀÿ+þû×fÍúÖÃ÷?óð{UJ³Ç$ þ«óéÁ´6`Û ¹áÿñlýüBP2ýþ¯þ/hã¿¶ÿk:ÿaþ¯,¤1ì_¡é{ÿW
+ÿ'¨ÿʦÿê?,Àÿ%þü_Xÿ³ø/þ×öMõdê?, û+bþosÿÎò`¿~ø¿är³þ·òaÿÏü_²¡éeÿ×wú?ÄØÿ³ðI÷3\húgðAÿ,Àÿ%þ#ÿíÿÿ×öÐÆmÿ×4ÿâüR;8ÀäBÓ?Cÿ/ÔX }ÑÐôÏàÿÂþø¿dCÔ¿ý!ß~8Ü¥S§þÕ¬þFÿ,_®y@"4ý3ø?áÿ`þOÙÐôÏÐÿçÿYw $CÌÿoßÿëì×ÿ1ÂýR¹Yÿ«ø?gúáÿæ!ïà {±ÐôÏÐÿý?Y@ÿ?Ù¬ÿWg¸õÿü?ôÏòÿ²¡émÿ÷ôüG
+ý3 ² 7¢ÅÑÿ÷³@þ¸ÿôÿ
+Mÿþo¬ÿXÿC64ý3ø¿QÿeþoÙÐôÏàÿÄúÄÙÐôÏÐÿõÐýC6ÄüßöþOìÿY°_?úÊåfýoÕÿûÐÿS64ý¯íÿ×ÿbìÿYøµêúö\Øì
+&ÐôÏÐÿúgý?e³Xÿuesý¤gøçÿHaýÏòÿ²Yÿó¡5xZ?G¬ÂýüA¢ÿ/Þãߣî/¹çÂï
+ÿüO¤bôÿ`ùÙxëx-«Cç6·,x;ÿ3ÿãa
+þ9PÙ8âÿ®ÐÃFð1×Ϻ<ÇíÇgS¥ygAàÔ2ÕèÿÁÂþïTôöªÞ^/#s·»¼`~øA!ëÿ±~6mU·áÿ³üoþ?<4¦=ÔíIW
ƲBü¿Îï¦úO³iüGÿo&ºêLûl-¼æ®®öf
+öwçá³®Ñ
¹kêáþð˲þ7Þÿ£ÿØÿËÆ[ÿeÝåÇòT.W¿þ îÿaú
+9þôíâáþg Ùë}««n<õ[C at UÜrþsÚÿ/UØÿó°øECÖÿ¦ñ?òÿ, þË®ÿ²ZMÿÁ4ÿÿ;È_4þûÿ^÷|T¸_ÿßL¡ÿ/ÄñïËÉ`r
+rÎÿ³úo£ÿ'WÿWÙ «>\}`Á«lx\ßí®oþî6X ªþë^/9 ÷3Üë¿éù¿X¥Xÿ± )Ë^ÿÙvÿÿØÿɬÿ}[>%îoÿ;3ýs0ú;«úåþ3.·þõá`
+¿àîø?;ÿ¦¨ÿ°óß²!ÇÛø«1f¿àîø?ëÿkÐ??«îÜ4u;Lé¿`*Çý7u×GZï/;þÿËÿgé*ËBôÿc!¸3È^.Ëâ¿
+(}¿®¾ÅõßÀê_Ùû?PÿÝÅãß×M}¬_ ¿ÞãÿyñçÀü¿ÞýÕèâ³~4yéÚ¸ã8ÿ8Åý¿< õ/ýu»@óßâ¯ÿ0ÌÐÿ¤ÿdCÔ¿MÕc·äúÏó_cüOÿb!¸Wh.ý÷OÑ{Àÿh¢ÿ$@ý
+hnÖÿg8õÿoõ¿1þ¸ÿûõ!
+P 7®ÿ=Ã_ÿQÂÿÇ¿ô8 q,ÖÑêî)¯êþ½.ïïãÖÿ4ÿ§¢ël©Ee:FìÉrý÷a%îYÿïBýw{<Ǽÿ5ôü5ðE¨ÿ³@ÿ®üsÍû¿gù[ Düç Qáoýr¡éÿhÍqñ3ÜúÕÿ£ûpû·lhú/ê'ÓÚ¯¹½<w,ÜúÕÿÂý?XHa
+Mÿ_=À£üÝöc'èwáÿSÂÿÇÌ?²¡éÿE¿vy}Èu7üíÒ^Vö·ôÅÿ4ÿb1ÿ÷¤ÛKü¤×3úûÂûì×ÿ\nÖÿ þñ?ÑÿøeCÓÿÚ¬YÿSÓúoûø½*¥Ùc
+MÿÕùô`Z°mÀ\ÏpÇÿx¶þGþD¡(þ}Y
{û¿ø¿8 ÿÚþ¯éü?þ,¤1ì_¡é{ÿWÿ'¨ÿʦÿê?,Àÿ%þü_Xÿ³ø/þ×öMõ¤ê?, û+bþosÿÎò`¿~ø¿är³þ·òaÿÏü_²¡éeÿ×wú?DØÿ³ðI÷3\húgðAÿ,Àÿ%þ#ÿíÿÿ×öÐÆmÿ×4ÿâüR;8ÀäBÓ?Cÿ/ÔX }ÑÐôÏàÿÂþø¿dCÔ¿ý!ß~8Ü¥S§þÕ¬þ3ì /×AÀ< þüð° ÿ§lhúgèÿóÿ,Ä;L !æÿ·ïÿõ?öë»ÿ¯À@7ëÿçÔÿÇ!â?é½Â@04ý3ôÿCÿOÐÿO6käÿã¤ü?ôÏòÿ²¡émÿ÷lýfôÏÊÜ "þGÿOÜÿÍmüúâþ'ÐÿS64ý3ø¿±þcÉ_ÙÐôÏàÿFýø¿eCÓ?ÿëÿeCÓ?CÿOÔX@÷ÙóÛû?±ÿgÁ~ýèÿ)õ¿UÿOìÿY@ÿOÙÐô¿¶ÿs^ÿ°ÿgáתëÛsa³7BÓ?CÿOèôÿÍbý×Íõáÿ¢ ëÿÍòøßùÃÓú9bîçÿýYðÿÖuÉý8~oøç"áü/ÈÿÈÆ[ÿÃkYê¼8·¹ý`Á3ÜùéüÛ#Ð?*G P¼õßzØ>æúYÇñø¯ýølª¢4ï,úO¦úOãýÿXxÓÿÞ^ÕÛëedîvÌ?(dý?ÖϦêvÁ3Üñÿ
+pÿ+iu{ÒUa q¬ÿ¯3Á»é §þÓlÿÑÿ¢®:Ó>[¯¹««½¦ýÝyø¬ktaîúex«?üf¦Àrà¬ÿM÷ÿQþ<`ÿ/oý?uËS¹\
+þúS
ûXþeCÿ'ýeËøûyþeC®ÿõ®ºñÔwn
+UqËùÏiÿ¿TaÿÏÃâ
+YÿÆÿ8ÿgñ_6týÕjú¦ùø¸ØAþ¢ñßÿ÷ºïü\à£Âýúÿfúÿ²@ÿ¾<| ö'ç¡ çü?«ÿÆ1úòpõ%YeaðáêÞ©¯ïë»ÝõÍßýÏ+AÕÝëã%ä~{ý7=ÿ«ë? eÙÐë?[îÿàÿà
û?Ùõ¿oËg³ÄýMñGqª FgU¿ÜÆEðñÖ¿>Láw Üÿgç¿Ãõpþ[6äøo5Æì<ÃÿgýmK0èÏUwnº¦ô_0cþCJÛ¯;ü
õ8Kÿ#PY£ÿKÇ¿¯úX?¾nÝÿiÿ0Ȭÿã¿=ÞãÿõêFõ£ÉKçÀ½þ'ã'¸ÿ,ÿeãÿ¢nhþ[üõê, û¯lhúïÊèÜþáwþãÿáÿæ!¸Wh,oý÷OÑ{¯À?þ'AøÏâ¿lnÕÿg8õÿMþÿ¢ÿ(Ëpÿöëÿø6¸
+\·ÿ= ÿ8Aÿwþ¥ÿÃá ýc©þVwOyU÷ï5yþÜúÖT"ÿÏÒ?e:F@*õ?^ÿG{¸gýWê¿øÿxý£·ÄüU¡þÏiü»òO ñÿú¿ñ¨ð7¹ô4Ïæ¸ünýÏêÿÂþäÿeCÒQ?Ö¶|ÌíÀ¹k9àÖ4ÿ
Îÿ²"é/þ¿zGù7ºíÇF°ï=Ã?þ§
+õ`þ
+Iÿ/úµËëC®»á/öî ²¿ý3%þ§òÿ,¨dhù¿'Ý^: ä'Ý8áÔÿ¬þ«ûì×ÿ\nÕÿ þëÿ8Bÿÿ
+Iÿýk³jýoæÿ U
+ý³ð{UJ³Ç, þ«óéÁ´6`» 9áÿñ4þÈÿñ(¬ $CÐÀâÿ
+áÿâ4þ«û¿¦óÿ°þCÿWÒö/ÉôÏáÿÿÔeCÒ?ÿ+Dýø¿dCÒ?ÿëÿeCÒÿêþ¯Yÿ§4DýdeCËÿ1ø¿°ÿgÁ~ýðÉåVýoæÿBÿ7ÿeCÒÿÚþ¯ïôȰÿgáî5¦ ¹ôÏáÿþYÿK6ýG,þ¯þ/H㿺ÿkÿ qþD©`r!éÃÿ
ú´/þ9úaÿÇü_²¡éßþïËN?Mî©SÿjªÿXáü?Áë `IÿþOø?XÿS6$ýsôÿÃùâ& ÉÐòÿþO¬ÿY°_ÿÿ3Âýò¸Uÿëø?gþ÷ÿñÜ'P½`HúgèÿáþÐÿO6+äÿënýÏóÿ)ôÏòÿ²!éuÿ÷ôüG8ÿŰÐÂ
+ !è_±ø¿qÿ7¤ñçèÿüèÿ)þ9üßXÿ± ÿlHúçèÿú/ðˤÿ'Öÿ, þˤþê?, ûlhù?ÿ'öÿ,دý?år«þ7ëÿþ/, þˤÿÕýóú_ý?¿V]ß¾ÁL þ9úBÿ, ÿ§lê¿®l®öÿõF¨ÿ±ü¿lÇÿæ|h;ÖÏ«p?ÿgèÿËïø·æ¨ûKîǽð{ÃþìÿxÀêO6¾ú^ËêPçŹÍíKáÎÿLçÿ(KPÿeAeã`¯þ»BÁÇ\?ëò8ÿµMUæ½SÿÉTÿi¡ÿoú¿SÑÛ«z{½ÌÝîòùá
ªÿÇúÙ´UÝ.y;þOó¿Qû_yhL{¨Û®
+äöø ÞO8õf3ÿ7úóPÔUgÚgëá5wuµ7ÃT°¿;u.Ì]S¿oõðßÌXü0Põ¿õþý?xÀþ_6¾ú(ë.?§ÒCþú÷ÿ° ýËÿOú˶ñúgú
+µþ×·ºêÆSß¹5TÅMç?§ýÿÒ ûv¿h¨úß:þÇÈÿ³ø/²þËj=ýÓü?ü?\ì Ñxïÿ{Ýw.ðQá~ýÓýY _L>D ûûPsþÕãý?y¸ú¿,`÷áê>\`ûàúnw}ówÿ³ÁJõ_÷úxÉ-x{ý7ëÿ1üòAÿ@ʲ!×6ÞÿÁÿÁö²¡êßÏfûäÿú±0ú;«úåþ3.¯þõá`
+Ïàþëÿ(TôÏÎËÿmã¯Æýg¸ãÿ´ÿoÅð±ðó¹êÎMS·Ãþæq,Ó¹?RëqïSÿQY:l PÿaÀcüsÛªÿzà/oëeÏp¯ÿ¦þ¿(ÿaádª3¦}¹ôïúq¯ÿf÷?&¸ÿ]4enHèÿóíÍÑ:~ÏpÇÿéý¶ ôÏAAøYÿè»?¿ý_2ÌÃþO
+KìÿX<þ}ÝÔÇúñðà=þa¥)Æÿñÿzùk£ÏúÑ«GÇ3Üñ?âüèÿ.ýu»@óßâ¯ÿaùý? ô/¢þ»òÁ»îL§ñ?IÑÿÞæ ±øë¿jÞûÌ >ù¿þaýs ñËæfý/xSÿjÿýX°_ÿÇ À1¡Ü¸þ_ôýG ê<¼éÿp8@ÿY¬ÿ¢ÕÝS^Õý»×ü¼[ÿÓü"¬ÿYØÅid:öe²\ÿãð¤gX{ÖUû_Yðÿ²Ú/áý®óú?´ñïÊ?=îwçÿiý/Düç!Qáoýr¡éÿhÍqñ3Üú×ÿ3ìÿYÀùoÙÐô_ÔO¦µMÿócYÙlà_.ÜúÕÿ¢ õÒdhúÿêåß趯yçþñ?Uü,Àÿ+þ_ôk×\wÃß.íå±eÿþ@øðÿ³ RL !æÿt{étãzSÿsÿOcÿÏýúáÿËÍú_p À?þÇqý?ðÿʦÿþµY³þ§¦õß0DÿG~¯ÊCiöBÓu>=Öf lX×3Üñ?ÿÿã!Q¨ J¢ÿÃÿ
þ¯,ÐÆmÿ×tþÃýÿYHcØ¿$CÓÿöþ¯þOPÿ
+Mÿþ/ÔXÿK64ý3ø¿°þgñ_64ý¯íÿê?ÉÔX@öW6Äüßæþ/ÿäÁ~ýðÉåfýoåÿÂþø¿dCÓÿÊþ¯ïô±ÿgáî5f ¹ÐôÏàÿþYÿK6ýû^gîíÿÊàÿâ6þkû¿¦ùçÿHÚÁ&þú¡þÃÒ?²¡éÁÿ
ýðɨûC¾/;ýp4¹K§Ný«Yý'ÿY¾\óDhúgðÂÿÁü²¡é¡ÿÎÿ³ï0Hÿß¾ÿÖÿ,دßÞÿW` õ¿ÿs¦ÿþoÔîPÁÐôÏÐÿý?Y@ÿ?Ù¬ÿWg
òÿÐ?Èÿ˦ÿµýßÓóqeÐ?*p`(úWþoÜÿÍmüúâþ'ÐÿS64ý3ôÿÄúø?dCÓ?ÿõ_àÿ
+MÿþO¬ÿY@ü
+Mÿý?QÿaÝ?dCÌÿmßÿûì×þr¹Yÿ[õÿÄþ?eCÓÿÚþÏyý/Æþ
_«®oÏ
ÍÞ`"Mÿý?¡ÐÿS6õ_W6×Ozþ/Öÿ, ÿ/åñ¿9Zó§õsÄ*ÜÏÿ$ úÿ²à=þ9êþûq.üÞðÏÿD*Fÿÿ·þײ:ÔyqnsûÁg¸ó?Óù?BÔYPÙ8âÿ®ÐÃFð1×Ϻ<ÇíÇgS¥ygAàÔ2ÕèÿÁÂþïTôöªÞ^/#sw)ßa~øA!ëÿ±~6mU·áÿ³üoþ?<4¦=ÔíIW
ƲBü¿Îï¦úO³iüGÿo&ºêLûl-¼æ®®öf
+öwçá³®Ñ
¹kêáþð˲þ7ÝÿGúðý¿l¼õÿPÖ]~,Oår5øëß. ÙãÿIÙ4þCÿ,@ÿ²!×ÿúVWÝxê;·ª¸åüç´ÿ_ª°ÿçañ¬ÿMãlBÿ þË®ÿ²ZMÿÁ4ÿÿ8ø-ÿý¯ûÎÏ>*ܯÿo¦Ðÿâø÷åÉäC°?99çÿYý7Ñÿ«ÿ+É ®>°àÃÕ 6¼®ïv×7÷?¬Uÿu¯ûîõßôü_¬R¬ÿXeC¯ÿl¹ÿÿìÿdCÖÿ¾-Í÷7ÅÿÅY ýs0ú;«úåþ3.·þõá`
+¿àîø?;ÿ¦¨ÿ°óß²!ÇÛø«1f¿àîø?ëÿk¯
þøù\u禩ÛaJÿS8ê?¥ôý¹2îð}ê?*S¨ÿð°xüûº©õã+áÁ{üÃ ËÆÿñÿz÷O£ÏúÑä¥k
+à^ÿÏòÿiüèþ)ýu»@óßâ¯ÿ0RÈÿ± ý˨ÿ®|°YnÉõô?Ûÿ')ú?²Æ÷Q9@,þúïZ£÷>3[ÿ³ûîÿå!L!~ÉܬÿÏpêÿ;ùÿþ?ì×ÿ1/ã©@7®ÿ=Ã_ÿQ¡þÇÂðí>пPë¿hu÷Wuÿ^ç÷qëÿSQõ?EtÊtíËd¹þÇûÿHϰ÷¬ÿª4@ýÏñï=
+üÇøõhãß®yÿï¬ÿS"þó¨ð7~¹Ðô4Ïæ¸ønýÏëÿèÿÈêÿ²¡é¿¨Lk{>æöRàܱpëVÿÔÿYHcL ¡éÿ«x£Û~ìûÎ3üãðÿ±û¿eCÓÿ~íòúënøÛ¥½<¨ìoéÿ<ÿY ÿ?
+þÑóOº½´ ÈOºq=éÿ¹ÿ'±ÿgÁ~ýðÿÈåfý/8 àÿã8ÂþøeCÓÿÚ¬Yÿßÿ6Ì Ð?¿Wå¡4{LB¡é¿:Lk3 ¶
+ëîø?»ÿ=BþD¡(þÿíÿÿ×öÐÆmÿ×tþÃýYHcØ¿$CÓ?ÿþOPÿ
+Mÿþ/ÔXÿK64ýoîÿRÖÿ, þ˦ÿµý_Sý'YúÈþÊÿÛÞÿ
ý?öëÿK.7ë+ÿöÿ,Àÿ%þWö}¯ÿöÿ,|Ò½Æ þ7÷
Èÿñ ÿl(ú8ú
ðq@ÿµý_ÓüOóL$Jíà Mÿþ/ÔXÀõß²¡éÁÿ
ýðɨûC¾/;ýp4¹K§Ný«Yý'ÿY¾\óDhúgèÿÿðʦÿíûÿáþoâ& ÉóÿÛû?±þgÁ~ý#Üÿ'õ¿ÿs¦ÿþoÂø>ü ºMÿýÿÐÿôÿÍùåx[ÿßÉÿCÿ, ÿ/þ×öOÏÄQBÿ¨,À 0ÁPô¯8ü߸ÿÚø3ôÿÄýO, ÿ§lhúgðcýÇü²¡éÁÿú/ð˦þXÿ³ø/þú¢þúÈÿÛÞÿý?öëGÿO¹Ü¬ÿúbÿÏúʦÿµýóú_ý?¿V]ß½ÁD þúBÿ, ÿ§lë¿®l®ôÿü_)¬ÿY@þ_6Ëãs>´æOëçUørÿglõ¤üxkº¿ä~¿7üó?JÐÿädãÿᵬu^ÛÜ~°àîüÏtþý?YPÙ8âÿ®ÐÃFð1×Ϻ<ÇíÇgS¥ygAàÔ2Õ(ÔYxÓÿÞ^ÕÛëedîvÌ?(dý?ÖϦêvÁ3Üñÿ
+ÐÿÆ´º=éª0и@Vÿ×àÝtSÿi6ÿèÿÁDQWi
×ÜÕÕÞSÁþî<|Ö5º0wMý2¼ÕÃ~3S`9ðÃ@ÖÿÆûÿ ÷±ý¿l¼õÿPÖ]~,Oår5øëX ÀÿÁô/rü?é/ÛÄÿ±þáþg Ùë}««n<õ[C at UÜrþsÚÿ/U8ÿÁÃâ
+YÿÆÿ8ÿgñ_6týÕjú²¹þÿgaùÆÿßë¾ós
+÷ò«ÌÆø¿·8þ}y2ùìOÎCAÎùVÿãõ®þ¯$n|¸úÀW'Øð.¸¾Û]ßüÝÿl°Tý×½>^r@îg¸×áTÿ*EþHY6ôú϶û?ÜÿÂö²!ëßÏfûÛ×ÿmãg¨ÿ°0ú;«úåþ3.·þõá`
+¿àîø?;ÿf¨ÿ°óß²!ÇÛø«1f¿àîøÎüß
+þO~>WݹiêvÒÁT eúW;Jß+ãqý'üAüJ%¨ÿp°xüûº©õã+áÁ{üà ËPÿcÁü¿ÞýÓèâ³~4yéZ¸×ÿádüãýy@ÿ?Ùøë¿¨ÛÿýBÿ7ú
+Qÿ]ù`³ Ýë?è?Æÿ$
ÿÞæ ±øë¿jÞûÌ nýGý'*@þ
²hnÖÿg8õ¯fñ?HàÿaÁ~ýÿo ÄT ×ÿá¯ÿ(àÿgáMÿÃúÈbýîòªîßëòü>nýOó*BÿWvqªLÇоLë¼ÿô+qÏú¯JÔ9ðÿñþÇÐó×ÀüPÿg6þ]ùç÷ÿþ[ÿ§ðrÿ/â?
+CèMÿGóláÖÿ¼þóÿ<àö_ÙÐô_ÔO¦µ=s{)pîX¸õ?«ÿEêÿ,¤1& ÉÐôÿÕ<Ê¿Ñm?v}çþñ?
+øÿXÿW64ý¿è×.¯¹î¿]ÚËÊþþϳøðÿ³ pþW4Äüßn/- òn\Ïpêîÿ cìÿY°_?ü?r¹Yÿ øÇÿ8Æý<Àÿ+þû×fÍúÖÃaþ9ø½*¥Ùc
+MÿÕùô`Z°m\ÏpÇÿxÿ#äÿxH*¡è?`ðÙþðmmü×öMçÿ0Ðÿ
4ýK24ý3ø¿àÿdõ_ÙÐôÏàÿBýø¿dCÓÿæþ/aýÏâ¿lhú_Ûÿ5Õ¨ÿ°ì¯lù¿íý_Øÿ³`¿~ø¿är³þ·òaÿÏü_²¡éeÿ×÷ú?`ÿÏÂ'ÝkÌ r¡ésÿWüðÉ¢ÿ£ÿWÿ´ñ_Ûÿ5Íÿ8ÿÇD¢Ô0¹ÐôÏàÿBýÜý#þü_Øÿ± ÿlú·?äû²ÓG»têÔ¿ÕÂñ
àËu0H¦þð° ÿ§lhúß¾ÿîÿæ!ÿC4ÄüÿöþO¬ÿY°_¿½ÿ¯À@$7ëÿçLÿ1üß<¨Ý}\húgèÿþ, ÿlÖÈÿ+Ç3HùèäÿeCÓÿÚþïéù8^ TàÁPô¯8ü߸ÿÚø3ôÿÄýO, ÿ§lhúgðcýÇü²¡éÁÿú/ð˦þXÿ³ø/þú¢þúÈÿÛÞÿý?öëGÿO¹Ü¬ÿúbÿÏúʦÿµýóú_ý?¿V]ß½ÁD þúBÿ, ÿ§lë¿®l®ôÿü_)¬ÿY@þ_6Ëãs>´æOëçU¸ÿ3HRôÿeÁ{ü[sÔý%÷ã\ø½áÿTþ, ÿ#oý¯eu¨óâÜæöÏpç¦ó¨ÿ² ²q0 Å[ÿ]¡àc®uyÿÚϦ*JóÎÀ©ÿdªÿ4QèÿÁÂþïTôöªÞ^/#s·»¼`~øA!ëÿ±~6mU·áÿ³üoþ?<4¦=ÔíIW
ƲBü¿Îï¦úO³Yÿ_ø?x(êª3í³µð»ºÚa*ØßϺF殩_·zøÃof
+,~Èúßxÿþ<`ÿ/oý?uËS¹\
+þú ¸ÿè_6äøÒ_¶ÿQûyþeC®ÿõ®ºñÔwn
+UqËùÏiÿ¿TaÿÏÃâ
+YÿÆÿ8ÿgñ_6týÕjú¦ùø¸ØAþ¢ñßÿ÷ºïü\à£Âýúÿf!úÿ²@ÿ¾<| ö'ç¡ çü?«ÿÆ1úòpõ%Yí~
+>\}`Ã;õõ]p}·»¾ù»ÿÙ`%¨ú¯{}¼äÜÏp¯ÿ¦çÿbbýǤ,zýgÛýü<`ÿ'²þ÷mùl¸¿)þï(Î"èÑßYÕ/÷qT"Þú×)ü»ãÿìüw¡þÃÎËÿmã¯Æýg¸ãÿ¬ÿ¯ýúgàçsÕ¦n)ýLâX¦ÿ0 ôý¹2îð}ê?*SAúÇ¿¯úX?¾~¼Ç?2ôâÁü¿ÞýÓèâ³~4yéZ¸×ÿ³ü£ÿèÿ'ýu»@óßâ¯ÿ0
+°ÿgÝeCÔW>Ø,@·äúúíÿûTxFÄâ¯ÿþ©5zï3¸õ?»ÿ7ÿµÑܬÿÏpêÿ;ùÿõì×ÿÑÀ³`*ÇëÿEÏð×8ÿÍÂþô/Åú/ZÝ=åUÝ¿×åù}ÜúæÿTaýÏÂ.NÃ2Cû2Y®ÿñþ?Ò3¬Ä=ë¿*Q¨ÿrà9þãý¡ç¯ÿø«(FýÚøwåkÞÿ;ëÿÿ<$*ü
+¡_.4ýͳ9.~[ÿóúý?¨ÿ˦ÿ¢~2íùÛKsÇrÀÿYý/DÿWÒdhúÿêåßè¶;Á¾óÿø*ÿãþ_ÙÐôÿ¢_»¼>äºþvi/*û[ú?ÏâÀÿÏJ1Hÿ{Òí¥@~ÒëNýÏý?¸ÿ ûõÃÿ#õ¿à ücÜÿÄü¿²¡é¿mÖ¬ÿÍï#ôÿdá÷ª<fI@(4ýWçÓimÀ¶r=Ãÿg÷¿£ÿBP2ýû6²
+÷öáþhã¿¶ÿk:ÿdÿ9HcØ¿$CÓ?ÿþOPÿ
+Mÿþ/ÔXÿK64ýoïÿJ±þgñ_64ý¯íÿê?I3ÔX@öW6Äüßöþ/ìÿY°_?ü_r¹Yÿ[ù¿°ÿgþ/ÙÐô¿²ÿë{ý°ÿgáî5f ¹Ðô¿½ÿù?àÿ
+Eÿÿ+ÿÚø¯íÿæBÿc"Qj\húgð¡þÃîþ
+Mÿþ/ìÿXÿK6DýÛò}Ùé£É]:uê_Íê?aøÏBðå:$BÓ?Cÿ?ø?XÿS64ý3ôÿÃùâ& ÉóÿÛû?±þgÁ~ýöþ¿[ ܬÿUü3ýÇðó v÷!j r¡é¡ÿú²þ²Y#ÿ¯Ï åÿ¡ÿ
+Mÿkû¿§ç?â0 TàÁPô¯8ü߸ÿÚøoßÿ3ÂýO, ÿ§lhúgðcýÇü²¡éÁÿú/ð˦ÿ'Öÿ, þ˦þ¨ÿ°î²!æÿ¶÷bÿÏýúÑÿS.7ë«þØÿ³þ²¡émÿç¼þcÿϯU×·çÂfo0¦û¡ÐÿS6õ_W6×Ozþ/¬ÿY@þ_6Ëãs>´æOëçU¸ÿ3HôÿeÁ{ü[sÔý%÷ã\ø½áÿTþ, ÿ#oý¯eu¨óâÜæöÏpç¦ólKBÐ?*G P¼õßzØ>æúYÇñø¯ýølª¢4ï,úO¦úOíôÏÀþïTôöªÞ^/#s·»¼`~øA!ëÿ±~6mU·áÿ³üoþ?<4¦=ÔíIW
ƲBü¿Îï¦úO³iüGÿo&ºêLûl-¼æ®®öf
+öwçá³®Ñ
¹kêáþð˲þ7ÝÿGúðý¿l¼õÿPÖ]~,Oår5øëß þ9þeCÿ'ýeËøûyþeC®ÿõ®ºñÔwn
+UqËùÏiÿ¿TaÿÏÃâ
+YÿÆÿ8PÈÿ³ø/ºþËj5ýÓü?ü?\ì Ñøïÿ{Ýw~.ðQá~ý3
þ¿,Ç¿/O&"ýÉy(È9ÿÏê¿qþ<\ý_IF?EÑ«,øpu
+ïë»ÝõÍßýÏ+AÕÝëã%ä~{ý7=ÿ«ë? eÙÐë?[îÿàÿàû?Ùõ¿oËg³ÄýMñGqCÿþΪ~¹ÿà%â}8Âï ¸;þÏÎ)ê?,àü·lÈñß6þjÙ/x;þÏúÿÚ-ôÏÀÏçª;7MÝSú/
+ıLÿ?QÚþ|eÜá/®ÿ«,Ðÿ
¥ãß×M}¬_·ïÿØþOÿ1þÛã=þ_¯þitñY?¼t.Üëÿp2þqÂÿÉÿ²ñÖQ·K4ÿ-þú@ý
ú
+Mÿ]ù` ÝÛ?|Ï\â?ú?ñÜ+´ ·þû§Öè½×àÿø¿ø âÍú_ò§þÿ-ÿ\ü?¸ÿûõ¼ÌÁ° ä¶õÿ²gô'èÿοô8 q,ÕÑêî)¯êþ½&Ï[ÿÓõ¿
+ÔÿYã4Üg:FìÉbý×ÿÑa%îYÿ
+²õ_üƼþ1ôý5ð¦¨ÿ³@ÿ®üÓç&@güåÿC
øÏC¢ÂßúåBÒÿÑ<ãòg¸õ?«ÿG
+ûpû¯lHú/ê'ÓÚ¹½8w-Üú¦õ¿aþ9HcL !éÿ«x£Û~lûÞ3üãªPÿçæÙôÿ¢_»¼>äºþriï*û÷Û?SâþÏ<¨dhù¿'Ý^: ä'Ý8áÔÿ¬þ«ûì×ÿ\nÕÿ þëÿ8Jàÿgþ_Ùôß¿6«ÖÿÔ´þ*ôÿáá÷ª<fY@($ýWçÓimÀvr>Ãÿãiüÿã!Q¨ J ÿÅÿÀÿÅiüW÷MçÿP%èÿÊBÃþ%þü_èÿÈ꿲!éÃÿ
úðɤÿÖÿ, þˤÿÕý_³þOiúÈþÊÿÛÞÿ
ó<دþ/¹ÜªÿÍü_èÿÆü_²!émÿ×wú?àþG>é^c
+Iÿþ/èø¿dCÐÄáÿ²ýáÿÚÒø¯îÿæBÿc"Qj\Húçèÿ
ú¸ÿK6$ýsø¿°ÿcþ/ÙÐôoÈ÷e§&wÊÔ©5Õ¬pþàËu0H¤ÿ'ü,Àÿ)þ9úÿáü?ñdhùþXÿ³`¿þ·ûÿ
+läq«þ×ñNý_q þ³Þ+lCÒ?Gÿ?ÜÿÁúÿÉf
ü¿r=ÿþY@þ_6$ý¯îÿÿÃç¿XPY@Cпbéÿû¿Y ?GÿOÜÿÄúʤÿ7Ö, ù+þ9üߨÿ² ÿ·lHúçðbýÏâ¿lHúçèÿúèþ!ZþÁÿý?öëGÿO¹ÜªÿÍú¢ÿèÿ)þW÷Îë)öÿ,üZu}{.lú3@Húçèÿ ý³þ²Yªÿº²¹~Ú3ü×ÿA¡þÇòÿ²Yÿó¡5øZ?G¬Âýü}ÿßñoÍQ÷Ü{á÷ÿüØÿñül|õ?¼Õ¡ÎsÛ<ÃÿÎÿQ£þËÊÆÀ, _ýw
6¹~Öåq<þk?>ª(Í{§þ©þÓ8Dÿ?Þô§¢·Wõöz»ÝåóÃ
+Uÿõ³i«º]òwüæ£÷¿òÐöP·']Èíñÿ:¼pê?Ífþoôÿ桨«Î´ÏÖÃkîêjo©`w>ë]»¦~Þêá¿)°øa êëý?úðý¿l|õÿPÖ]~,O¥üõ&1îÿaú
+5þôMã?îæú
+µþ×·ºêÆSß¹5TÅMç?§ýÿÒ ûv¿h¨úß:þGÈÿ³ø/²þËj=ýÓü?ü?\ì Ñxïÿ{Ýw.ðQá~ýÓýY _L>D ûûPsþÕãý?y¸ú¿,Òv®>°àÃÕ 6¼®ïv×7÷?¬Qÿu¯Ðg¸×³þ*ÀúHY6äúÏÆû?ø?xÀþO6TýïÛòÙ,rüß±Bÿ/FgU¿ÜÆEðñÕ¿>Láy Üý
îfç¿eCÿ¶ñWcÌ~É3ÜñÚÿ7Ê"ø¿Xøù\u禩ÛaNÿs8é?IÞwøë?ç2¥Pÿaañø÷uSëÇWÂ/÷øA
üÇÿëå?.>ëG®Eßúß&Èÿ±î²ñ×Q·4ÿ-þú#äÿxÀõ²!ê¿+l [éþtÿù?Âø>J0Å_ÿýSkôÞgpë?è?Qαa õ¿àNý«YüøÿX¾ýøãu0ãÆõÿ¢gøë?JPÿãaøöè_(õ_´º{Ê«º·Íó»¸õ?Íÿ©(Æú§ÊtíËd¹þÇ Iϰ÷¬ÿªT¡þËçø@ÿ½Ìÿ êÿ,ÐÆ¿+ÿô¸ÐÿÿÿÓXÿÿyHTøB¿\hú?gs\ü·þçõÿûàÿ
+MÿEýdZÛô1··çå[ÿ³ú_ó?<¤¨ÿ¦ÿ¯àQþnû±ì;ÏðÿiÀÿÇîÿ
+Mÿ/úµËëC®»áoöò ²¿4!þgèÿÅJ1Hÿ{Òí¥@~ÒëNýÏý?!îá!ÿG47ëÁ ÿøÇöÿ,Àÿ+þû×fÍúÖÃ0N ~¯ÊCiöBÓu>=Öf l ×3Üñ?Æÿù?
+ d(ú8ü_ü_ÐÆmÿ×tþ·Ìÿ¤1ì_¡éÁÿÿ'¨ÿʦÿê?,Àÿ%þ7÷©ëÿeCÓÿÚþ¯©þ,@ýdeCÌÿmïÿÂþ
þ/Ñܬÿü_Øÿ³ ÿlhú_Ùÿõ½þØÿ³ðI÷3\húßÜÿ"ÿÇü_²¡è?âðEðq@ÿµý_ÓüOóL$Jíà Mÿþ/ÔX }ÑÐôÏàÿÂþø¿dCÔ¿ý!ß~8Ü¥S§þÕ¬þFÿ,_®y@"4ý3ôÿÿø?eCÓ?Cÿ?ÿg!Þa1ÿ¿½ÿë{ÿ_-TnÖÿ*þÏþcø¿yû(îÅBÓ?Cÿ?ôÿdýÿd³Fþ_9áÖÿwòÿÐ?Èÿ˦ÿµýßÓóqDÐ?*p`(úWþoÜÿÍmü·ïÿãþ'ÐÿS64ý3ø¿±þcþÙÐôÏàÿFýø¿eCÓ?ÿëÿeCÓ?CÿOÔX@÷ÙóÛû?±ÿg!@ÿOÑܬÿúbÿÏúʦÿµýóú_ý?¿V]ß½ÁD þîþY@ÿOÙ,Ö]Ù\?éþù¿ RXÿ³ü¿lÇÿæ|hÍÖÏ«p?ÿg¤èÿË÷ø·æ¨ûKîǹð{Ã?ÿ3LÿèÿÁò?²ñÖÿðZV:/Îmn?Xðwþg:ÿÇAú/*G P¼õßzØ>æúYÇñø¯ýølª¢4ï,úO¦úO
þ,¼éÿNEo¯êíõ22w»Ëæ²þëgÓVu»àîø?ËÿèÿÃCcÚCÝtUh\ +ÄÿëLðn:À©ÿ4ù¿áÿࡨ«Î´ÏÖÂkîêjo©`w>ë]»¦~Þêá¿)°øa ëãý?úðý¿l¼õÿPÖ]~,Oår5øëX àþ ÙãÿIÙ.þGîæú
+¹þ×·ºêÆSß¹5TÅ-ç?§ýÿR
ý?;_4dýoÿãa ýsø/ºþËj5ýÓü?ü?\ì Ñøïÿ{Ýw~.ðQá~ý³ýY _L>D ûóPsþÕãý?y¸ú¿Ì6] ?\}`Á«lx\ßí®oþî6X ªþë^/9 ÷3Üë¿éù¿X¥Xÿ± )Ë^ÿÙvÿÿØÿɬÿ}[>%îoÿ;³úç`ôwVõËýg\/oý
ëÃÁ~ÀÝñvþ;ÌPÿaç¿eCÿ¶ñWcÌ~Á3ÜñÖÿ7Pð±ðó¹êÎMS·Ãþ¦qLõ_uçYÞq2îðÖÔðùð>Qÿáàûã¿?+þøf Æ÷ǿܯõ+à7þÊj×ÿÿíùËñ/ÊnXëµ¥^~ßã÷þOMÆ?KÑÿ,ùdóúoÚz.úüÙ´Ýû×»9që?ý÷øüÿ<ü/ó|ÐrùKýÚ¯öºü¼[ÿñdýÙ%ôÏÀ?ÿëÔ/Eñ¿Ò'Zç÷Ný«éþ?Sø?Xøô¿þùü_ÿõOÌBùKý½>öÞ[ÿÑDÿi¡þÃ
+ÿJþÛ°áú SDÜú¿}àÔNã¿
+ÿcá>Õ¦*¿Üý¿¦xªêcýXîîôûÿ
+ÓþZÿµn÷·®þ)ëÿ4
ÿ¬ÿe³@ÿæÏ{ýH};ÿ§¦ñ?áÿfÂÍýßXý#ÔÿTÇÐ?¨ÿÉæ¯óÿöpÐí.0«p?ÿW:öÿÿk{ÿþlÎÍ
+Ïð[ÿþ¯0ÂüϦ~Ùü¥þÏæÙT·ÿÖ»ôÎü©RèÿÁÂýßþù?~ýçÿó¿Cþçê-üm:Øf?jÿç§ÿùÏÿOݧÿxØÿ«jôî¹úç}úGS½eþÑ<·Ã¢2üG{ùöë´oP\þ èÃhxßþSÐßÈ"ÿÇù\.9ç÷Îø'Óý_ÂÿÅBìvqü)¸CßúO¥îÿûî§ÿ¼ÿÏ$øÏL%ÿ]Åÿ'üÀ,:ÿ±¹ÿ{²þÇôÏ ´-%þӿ꿳úOàü×E=æ,ÿýk³©ÿûÛþ?ü_ ÿÇBAùYTÿ½Ñ êÖÿìüWÀÿÅÎÉfþoìþ@9ÿú¾ê$Ív8ÿ!Eëÿ ü_û?xêeóú?Õ{},õÂ6¿ïâÒÿ°Ýú¿â ç?Y@Ù_6ë7e üöÿþo¨ÿóý¿lù¶îÿ8ßÿ§!ê,`ÿ ÿfÔr p5
\ No newline at end of file
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/48amd64-4d2n6c.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/48amd64-4d2n6c.tar.gz.output (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/48amd64-4d2n6c.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,222 @@
+Machine (phys=0 total=100661148KB AMD DRACHMA)
+ Socket #0 (phys=0 total=25163676KB)
+ NUMANode #0 (phys=0 local=8386460KB total=8386460KB)
+ L3Cache #0 (5118KB)
+ L2Cache #0 (512KB)
+ L1Cache #0 (64KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ L2Cache #1 (512KB)
+ L1Cache #1 (64KB)
+ Core #1 (phys=1)
+ PU #1 (phys=1)
+ L2Cache #2 (512KB)
+ L1Cache #2 (64KB)
+ Core #2 (phys=2)
+ PU #2 (phys=2)
+ L2Cache #3 (512KB)
+ L1Cache #3 (64KB)
+ Core #3 (phys=3)
+ PU #3 (phys=3)
+ L2Cache #4 (512KB)
+ L1Cache #4 (64KB)
+ Core #4 (phys=4)
+ PU #4 (phys=4)
+ L2Cache #5 (512KB)
+ L1Cache #5 (64KB)
+ Core #5 (phys=5)
+ PU #5 (phys=5)
+ NUMANode #1 (phys=1 local=16777216KB total=16777216KB)
+ L3Cache #1 (5118KB)
+ L2Cache #6 (512KB)
+ L1Cache #6 (64KB)
+ Core #6 (phys=0)
+ PU #6 (phys=6)
+ L2Cache #7 (512KB)
+ L1Cache #7 (64KB)
+ Core #7 (phys=1)
+ PU #7 (phys=7)
+ L2Cache #8 (512KB)
+ L1Cache #8 (64KB)
+ Core #8 (phys=2)
+ PU #8 (phys=8)
+ L2Cache #9 (512KB)
+ L1Cache #9 (64KB)
+ Core #9 (phys=3)
+ PU #9 (phys=9)
+ L2Cache #10 (512KB)
+ L1Cache #10 (64KB)
+ Core #10 (phys=4)
+ PU #10 (phys=10)
+ L2Cache #11 (512KB)
+ L1Cache #11 (64KB)
+ Core #11 (phys=5)
+ PU #11 (phys=11)
+ Socket #1 (phys=1 total=25165824KB)
+ NUMANode #2 (phys=2 local=8388608KB total=8388608KB)
+ L3Cache #2 (5118KB)
+ L2Cache #12 (512KB)
+ L1Cache #12 (64KB)
+ Core #12 (phys=0)
+ PU #12 (phys=12)
+ L2Cache #13 (512KB)
+ L1Cache #13 (64KB)
+ Core #13 (phys=1)
+ PU #13 (phys=13)
+ L2Cache #14 (512KB)
+ L1Cache #14 (64KB)
+ Core #14 (phys=2)
+ PU #14 (phys=14)
+ L2Cache #15 (512KB)
+ L1Cache #15 (64KB)
+ Core #15 (phys=3)
+ PU #15 (phys=15)
+ L2Cache #16 (512KB)
+ L1Cache #16 (64KB)
+ Core #16 (phys=4)
+ PU #16 (phys=16)
+ L2Cache #17 (512KB)
+ L1Cache #17 (64KB)
+ Core #17 (phys=5)
+ PU #17 (phys=17)
+ NUMANode #3 (phys=3 local=16777216KB total=16777216KB)
+ L3Cache #3 (5118KB)
+ L2Cache #18 (512KB)
+ L1Cache #18 (64KB)
+ Core #18 (phys=0)
+ PU #18 (phys=18)
+ L2Cache #19 (512KB)
+ L1Cache #19 (64KB)
+ Core #19 (phys=1)
+ PU #19 (phys=19)
+ L2Cache #20 (512KB)
+ L1Cache #20 (64KB)
+ Core #20 (phys=2)
+ PU #20 (phys=20)
+ L2Cache #21 (512KB)
+ L1Cache #21 (64KB)
+ Core #21 (phys=3)
+ PU #21 (phys=21)
+ L2Cache #22 (512KB)
+ L1Cache #22 (64KB)
+ Core #22 (phys=4)
+ PU #22 (phys=22)
+ L2Cache #23 (512KB)
+ L1Cache #23 (64KB)
+ Core #23 (phys=5)
+ PU #23 (phys=23)
+ Socket #2 (phys=2 total=25165824KB)
+ NUMANode #4 (phys=4 local=8388608KB total=8388608KB)
+ L3Cache #4 (5118KB)
+ L2Cache #24 (512KB)
+ L1Cache #24 (64KB)
+ Core #24 (phys=0)
+ PU #24 (phys=24)
+ L2Cache #25 (512KB)
+ L1Cache #25 (64KB)
+ Core #25 (phys=1)
+ PU #25 (phys=25)
+ L2Cache #26 (512KB)
+ L1Cache #26 (64KB)
+ Core #26 (phys=2)
+ PU #26 (phys=26)
+ L2Cache #27 (512KB)
+ L1Cache #27 (64KB)
+ Core #27 (phys=3)
+ PU #27 (phys=27)
+ L2Cache #28 (512KB)
+ L1Cache #28 (64KB)
+ Core #28 (phys=4)
+ PU #28 (phys=28)
+ L2Cache #29 (512KB)
+ L1Cache #29 (64KB)
+ Core #29 (phys=5)
+ PU #29 (phys=29)
+ NUMANode #5 (phys=5 local=16777216KB total=16777216KB)
+ L3Cache #5 (5118KB)
+ L2Cache #30 (512KB)
+ L1Cache #30 (64KB)
+ Core #30 (phys=0)
+ PU #30 (phys=30)
+ L2Cache #31 (512KB)
+ L1Cache #31 (64KB)
+ Core #31 (phys=1)
+ PU #31 (phys=31)
+ L2Cache #32 (512KB)
+ L1Cache #32 (64KB)
+ Core #32 (phys=2)
+ PU #32 (phys=32)
+ L2Cache #33 (512KB)
+ L1Cache #33 (64KB)
+ Core #33 (phys=3)
+ PU #33 (phys=33)
+ L2Cache #34 (512KB)
+ L1Cache #34 (64KB)
+ Core #34 (phys=4)
+ PU #34 (phys=34)
+ L2Cache #35 (512KB)
+ L1Cache #35 (64KB)
+ Core #35 (phys=5)
+ PU #35 (phys=35)
+ Socket #3 (phys=3 total=25165824KB)
+ NUMANode #6 (phys=6 local=8388608KB total=8388608KB)
+ L3Cache #6 (5118KB)
+ L2Cache #36 (512KB)
+ L1Cache #36 (64KB)
+ Core #36 (phys=0)
+ PU #36 (phys=36)
+ L2Cache #37 (512KB)
+ L1Cache #37 (64KB)
+ Core #37 (phys=1)
+ PU #37 (phys=37)
+ L2Cache #38 (512KB)
+ L1Cache #38 (64KB)
+ Core #38 (phys=2)
+ PU #38 (phys=38)
+ L2Cache #39 (512KB)
+ L1Cache #39 (64KB)
+ Core #39 (phys=3)
+ PU #39 (phys=39)
+ L2Cache #40 (512KB)
+ L1Cache #40 (64KB)
+ Core #40 (phys=4)
+ PU #40 (phys=40)
+ L2Cache #41 (512KB)
+ L1Cache #41 (64KB)
+ Core #41 (phys=5)
+ PU #41 (phys=41)
+ NUMANode #7 (phys=7 local=16777216KB total=16777216KB)
+ L3Cache #7 (5118KB)
+ L2Cache #42 (512KB)
+ L1Cache #42 (64KB)
+ Core #42 (phys=0)
+ PU #42 (phys=42)
+ L2Cache #43 (512KB)
+ L1Cache #43 (64KB)
+ Core #43 (phys=1)
+ PU #43 (phys=43)
+ L2Cache #44 (512KB)
+ L1Cache #44 (64KB)
+ Core #44 (phys=2)
+ PU #44 (phys=44)
+ L2Cache #45 (512KB)
+ L1Cache #45 (64KB)
+ Core #45 (phys=3)
+ PU #45 (phys=45)
+ L2Cache #46 (512KB)
+ L1Cache #46 (64KB)
+ Core #46 (phys=4)
+ PU #46 (phys=46)
+ L2Cache #47 (512KB)
+ L1Cache #47 (64KB)
+ Core #47 (phys=5)
+ PU #47 (phys=47)
+depth 0: 1 Machine (type #1)
+ depth 1: 4 Sockets (type #3)
+ depth 2: 8 NUMANodes (type #2)
+ depth 3: 8 Caches (type #4)
+ depth 4: 48 Caches (type #4)
+ depth 5: 48 Caches (type #4)
+ depth 6: 48 Cores (type #5)
+ depth 7: 48 PUs (type #6)
+Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ia64-4s.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ia64-4s.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ia64-4s.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,15 +1,14 @@
- §
-J í_ÛÆÅýìO± ng3d6o F @ôQàR´D¬V(Ê©úéKIk[6ïÔsZèx1Ë]]áðòÌß¹ã§y3P°ûÓÁìÿn½ßÿùÌ+kqÁoÝ+cmÈ«»ðgúÌfÝÝÝÝ«Y;[4˯WwkÄŪÿªk«Dqõ·YÈqÃׯ:_ä¬?Ïõ_oשÆÑõ·ÁØCýÏëà¤þÓúcSÕßüs ¯Vÿ!¼Xÿáë¾~úfyýCæ,ëàkõ¯Voò[ïlp¶ê[çX×ê?üãþÛ¨þn§ÿ¼È9þCUÿ¾]µv¶ü HÆÿ`ÿîLîY²ú÷ó®.§uó0¼U³±oÇ®ÀþPïë?ö§õÏÝõß$ýÍQ^ÿO%øÓóþõÿú'"Hdú_Í·ë¦*UY=³zÒLGãªþMv¦vó?ê?=o,¯þ«¶©ùc®ëÿüúïlNýC0¿j"ô/ýGÍÿ½¡þ!pþ¯Qú¯Êj^ÇwÅý_7Üðù/Aýå´þWL3XÞÿ³Î±ÿA^ÿuóïZvëóÿp1ÿ·¯ÿ\ÈÿÊK¾^äú/û¾k6}=Z
-Wõo/æÿÙnü§þÓóÏ®éëËêJäúï·«o}ý·çó¿áúSÿ~[6zJõ+E®ÿEý±^ÎÑÿw×ÊW\ÿU;¯»zYm'\vO®¶®ëßé?ØÜPÿ¬û#bäúÿ½Ü®'íI¹^·USöÍǦß~õòëÔ?ª_7ýÿyÙÕÓÉðÂä©\9üù¿·Ïÿ!ðù¿näú_nên7X×ý(EÈçÿÞê9¯©þ
-ÊÿÁõÿäõOáÿ8ÿµ¼ÿ`iÿP\ÿ)üçþ¯,s|þaïÿx?ïÚÍlÎ@rý'ð¼àÿt¼þCx[ö%u¯¹þAþú¿!pù·näúOáÿ8Ͼ¢ÿBÎ>ªëãÿ¼ÿ@ùë&¢ÿñðþýºë?
ÿã"ÿÍúúGÀù¿n¤úÏPþæ¿@×?
ÿ#¿ô°ÿÁ{:@#×?(ÿýÌÿÐ\ÿ üÞÿA`þnäúù?xýQùªëÿÁý 0ÿC7rý§ð\ø¿÷ÿÀ`¹üW5ýÿþoôèF®ÿþóõ_ÞOý#pÆó@1Rý[ÿÃÓÿ@^Pþû?ÿ¡¹þ
ø?½ô°ÿâ×\ÿ)ü×Çë?wËußmª¾i
-"×?ÈÿÁþæèF®Pþý_¸þO7rýò?èÿ@ùë&¢ÿñðþýºëÿÿóÝÐLäÇ cýÞÙàÜðºÍùFÕ¿oWí¢m#?cëÿeü7¹gý!ÈêßÏ»ºNÖÍÃðVÍÆ¾òùVðù?óù?Í ºé5ß®ª\LVeõXÎêI3qùp\ÿá
- ªF¦ÿªíFjþyÿßÙú`(ÕDè_8ûÿ{CýCàü_7£ôèÿGCÔÿ³Å®ÿc²ýúïÿ8æ?ßòú§Xÿw¹ÿ§¥ÿ\ ¨¹þÿ|K0ÿY7rý3ÿù`þ³näúgþó-á¨|ÕÈõÏüç[ùϺë³þúÇ@õë&¢ÿÏüçÏÿu#×õçóoõÁn ¡©þ
-óo
-yýÿ|K0ÿY7rý§ðû¿²Ìñù/½ÿãý¼k7³9}ÈõÀÿñÿùÏÞ}IÝëE®æ?ß\þ¹þÿ|K0ÿM7rý3ÿù üuÑÿgþó
-Aÿnäúgþó-Áù¿n¤ú ò0ÿ¼þ)üù¥ÿýÞÜÓ¢¹þAùìÿ@`þnäúÇä8ÞÿA`þnäúù?xýQùªëÿÁý 0ÿC7rý§ð\ø¿÷ÿÀ`¹üW5ýÿþoôèF®ÿþóõ_Þ@ý#pÆSòêߢüþòúò?ØÿÀüÝÈõÀÿaì¥ÿý¿näúOáÿ¸¼þ;^ÿ!¼[®ûnSõM»äP ¹þAþö 0ÿC7rýò?èÿÀõºë´ÿýß(ÝDôÿ1þÞÿC ÿC7rýò?ÿóÝÐåã±þïlpnxÝæEÎý_ ªß®ÚE;ÛF~ÆÖÿËøorÏúCÕ¿wu9¬á};äóÿ¬àúoçóî¯þWóíº©ÊÅdUVå¬4Óçÿîÿá
- ªF¦ÿªíFjþyÿßYîÿÁPþªÐ¿pö5ÿ÷úÀù¿nFéÿÐÿ>¨ÿg]ÿÇd\ÿAPÿýóÇý¿o
-yýS¬ÿ»ÜÿÏÿ1¸ÀëÿÌüÌÖ\ÿügËõ?ÿ¬¹þ¹ÿ÷-Á~näúÇä?sýæ?ëF®îÿ}KPýºèÿsÿïÏÿu#×õçó®ÿCá7ÐTÿ&¹ÿ#üýäõÇä?ÞÿA`þ³näúOáÿ8÷eãó_{ÿÇûy×nfsúë?ÿãÄÿ¸ÿ7·e_R÷zë?µÿ#üÜÿëF®Pþ3ý_ÿ¦¹þAþÞÿC üuÑÿø?ØÿÇ@ÿnäúÇä?ûúGÀù¿n¤úϸÿ÷M!¯
-ÿG~¹þýÞÜÓ¢¹þAùìÿ@`þnäúåðþó?t#×?÷ÿ¾%2*_5rýcò?¸ÿ/æèF®ÿþÿWàþ,ÿª&¢ÿÏý¿oú?t#×
-ÿÇùúOo×@pÆó@1RýÇlåÿ`þyý1ùýÌÿÐ\ÿ üÆ^ú?Øÿ@ñëF®ÿþËë?ó?0¼[®ûnSõM»äP ¹þAþö 0ÿC7rýò?èÿÀõºëÿAÿ7Ê_7ýÿ÷ÿèÿÐ\ÿ üæÿ@àü_7#ô³åË cýÞÙàÜðºÍþ£êß·«vÑζ±õÿÿlòÝþ߬zdõïç]]N'ëæax«fcßÙüWÿ¬àó?çó>Ð
Lÿ«ùvÝTåb²*«ÇrVOésÈæÿ;ýû@ÿ7¼jdú¯Ún¤æõÿûÿpý'Cù«&BÿÂÙÔüßêçÿº¥ÿCÿ?ú¢þ-vý±ÿAPÿýóÚÿõ ¯õû2ÿ\ ¨¹þSç?Ãú?æ¿C`þ³näúOÿü|ý§ÿóu#×?hÿo^ÿ!Ð﫹þSç?Ãú?ú!0ÿY7rý§^ÿëÿ¨T¿n"úÿ×ÿ
Ãú?>ÿÀçÿºë?Åú¿óù¿·úà7ÐTÿ1£üþòú§Î><ÿ1¼ÿÀügÝÈõÂÿqîÿâþß(öþ÷ó®ÝÌæô!×ÿÇKþO^ÿ!¼-ûº×\ÿ ÿýߨïÕ\ÿ©óýôA`þnäúù?xÿò×MDÿâÿ`ÿýºë?uþóAÿû?@àü_7Rýg(ÿG ÿ¼þ)üùåóö xsObäúå°ÿùºëÿÁû?ÌÿÐ\ÿ ÿ¯ÿ2*_5rýcò?rîÿùºë?
ÿãÂÿ¸ÿË忪èÿcò?èÿ@ÿnäúOáÿ8_ÿåmȨÎxÞ (Fªòpÿoòúcò?,û?ÿ¡¹þø?½ô°ÿâ×\ÿ)ü×Çë?wËußmª¾i
-"×?ÈÿÁþö{u#×?(ÿþ/\ÿ§¹þAùôC üuÑÿÇø?xÿþÝÈõÊÿ`þÎÿuó5ý/Ûia÷¸`¬ÿÃ;-^»Ýúú?Òsµþ»ÅlúsÄØúÿmárÏú#Yÿaà¢Ï±¯Q\©¿nû[,®ÿÆfþÝ¿á/úG°þcê?LúÊáê£Îqmþg³óük<ýv
ÌþÎÞð]özÿ÷§f½¾3¯?´]ÝÌÃ_e_wºüXïÿPØâõ¢ÊÅd÷ùô
-Ú~>ÜìÿáÔòÿñã}¨ñßrüG0²þOõS³üÐÆãÊøowsþÓñßäý?¯ÝÔw¿ÔOïÛ¾\|·ÇsïÌÝãGüÔÕõóëwwÁ:ðÛº~>ÀßÞù£~¨úæãopçAÁ}wtÀ»eyzóöäÙüø§ÜcÎ8ù)Ïø[ûû×Íá¯ÿo®ß|ÿ»pïØ'j=Õãý?5úïå¬^?à+§9þ5)W«£7r`ø¿ÃËvyüî¬ËOÞêÝïËÅÑE~ü~ýéßÃG8æû~ÈÛͲ:}OøÇ¢|8~y¸}?}£~ÞÌ¿æäè7¯½Ý0Àý·Ñç¹þ»×#ë?m·i¢Îq½ÿþüÏ9ûÿ8äêfüø¯Æ¨ñ?çø`|ýG=^àêøáÿ0>gþ7O%øäÿøÀë!róüì¶Ï ¨
\ No newline at end of file
+ Ö9K í_oÛFÅóOá°ÙÎußZEÝ4Ab$²(PTºÚO¿ä$úãÚ¼³³ÝóC[;kʼ:äðòÌß¹ã×{3P°ûj`ö¶Þï¿>òÊZg\0Æ[÷ÊXu¾§/lÖ}ÙÝܼºµ³E³|f»º[#Þÿ¹þ«®}ÆÕßf!3Æ
+ßë
+¬?/õ_oF×ßcõÏ
+Çú#8©ÿ´þÔTõ7ÿÈëïXOÖø¾¯¾ÙÇ@^ÿyÃú#x®þÕjóM>cëï
+ÎCýsë-ëà¥úÿºÿöC ª¿Ûé¿nX£êß·«vÑζÉù?
nòõ «?ïêr:Y7wá=»ûC½®¿sgõÏÝõß$ýÍQ^ÿÏ%øËãWÿúýþWóíº©ÊÅdUV÷å¬4ÓûxQÿ&;Ó¿»ñõ7×LÿUÛÔü1/ëÿüú?ÜPÿå¯ýGÿQãï¨ÿëfþ«²×ñ]@qÿ×øü þÍrZÿ+¦,ïÿYçÙÿ ¯ÿºùw-ÛÇËãÿp>þ·ãõùßyÉ×\ÿeßwÍݦ¯G«áEýÛñ¶;ÿSÿéù½kúúDzºçI@%rý÷ÛÕ·¾þÛóñßpýÔ?ËæcSO©~¥Èõ¿¨?ÕÑ>búÿ9¯ÿ¯¹þ«v^wõ²ÚN¹ì¼ØxYÿþLÿÁõÀºïxP\ÿÛõ¤ý8)×ë¶jʾùÔôÛg÷!¿þ@ýc úuÑÿ]=/LÊÕ}Èÿ{ñù?>ÿ×\ÿËÍÃ]ÝíF 뺥ùøßÛúàBNÅ+Fªòpþ?yýSø?ÎÏÿÃ÷,íªë?
ÿãÜÿeÏ!ìýïç]»Íy"Ð\ÿ üOù?yýð¶ìKê^/rýüôCàôoÝÈõÂÿqÿlAÿ|T#×?ÈÿÁû¿n"úÿÿûÿèÿÐ\ÿ)üùo6Ï©ÿëFªÿåÿ`þyýSø?òËç?ìÿ@ðæÅÈõÊÿ`ÿó?t#×?(ÿ÷ÿ¡¹þAþ^ÿ!dT¾jäúäì¥þ0ÿC7rý§ð\ø¿r®ÿÁrú¯j"úÿüú¿!Ðÿ¡¹þSø?Îçy[dÔ?g<o #Õ¿Eù?2ú?ÈëÉÿÈØÿÀüÝÈõÀÿaì¥ÿý¿näúOáÿ¸¼þ{^ÿ!¼[®ûnSõM»ä©@!rýüìÿ@`þnäúåÐÿóÿt#×?(ÿþo¿n"úÿÿïÿ!Ðÿ¡¹þAùÌÿÀñ¿nFè?&òã±þïlpnxÝ;Ký FÕ¿oWí¢m#?cëÿõüoòõ «?ïêr:Y7wá=òñVðù?óñ?Í ºé5ß
®ª\LVeu_ÎêI3±ñðÿá
+ ªF¦ÿªíFjþyÿ¸ þ!Ê_5úþ£ÆÿÞQÿ8þ×Í(ýúÿÑûõÿl±ëÿ³ÿ@PÿýóÇüç«B^ÿóÿXÿþ_.p fäúgþó5ÁügÝÈõÏüçkùϺëùÏ×£òU#×?ó¯ æ?ëF®Èü¿úÇ@õë&¢ÿÏüç+Ïÿu#×ùçãoêÂ0Ô¢â#Õ¿aþóU!¯?ó¯ æ?ëF®ÿþsÿWy>ÿ
°÷¼wíf6ç@rý'ð<áÿdþ3·e_R÷zëùÏ×§ëF®æ?_ÌÓ\ÿ̾&(ÝDôÿÿ|EÐÿ¡¹þÿ|Mpü¯©þc £üÌ ¯
+ÿG~éÿ`ÿ7·t(F®Pþû?ÿ¡¹þAù¼ÿÀüÝÈõòðú!£òU#×?(ÿëÿ@`þnäúOáÿ¸ðå\ÿåô_ÕDôÿ1þú¿!Ðÿ¡¹þSø?Îçy[xê3WTÿåÿðô ×ÿÁþæèF®ÿþc/ýìÿ@ øu#×
+ÿÇåõßóúáÝrÝwªoÚ%O
+ëäÿ`ÿó?t#×?(ÿþ/ÿ§¹þAùôC üuÑÿÇø?xÿþÝÈõÉÿ(ÿãÝÐåã±þïlpnx}P¿áú/FÕ¿oWí¢m#?cëÿõüoòõ «?ïêr:Y7wá=òñVpþ7óñ?××
Lÿ«ùvÝTåb²*«ûrVOé}Dÿ×ÿÀð U#ÓÕv#5¼ÿ?ÜPÿå¯ýGÿQãï¨ÿëfþýÿè}ú¶ØõLàü/úïÿ8®ÿ}UÈëbþßåú|þÁN Ô\ÿ ügæ¿@`þ³näúå?sþæ?ëF®®ÿ}M°ß§¹þ!ùÏÿùϺëë_T¿n"úÿ\ÿûàóÝÈõbþßùøóÿP¸À 4#Õ¿Iîÿÿ£ÿ¼þügÇû?ÌÖ\ÿ)üçþ¯,ó|þaïÿx?ïÚÍlÎ>äúOàÿ8ñ®ÿ
+ämÙÔ½^äúOíÿÿ×ÀéߺëÿLÿæ¿éF®ÿ÷ÿ(ÝDôÿ!þöÿ1Ðÿ¡¹þ1ùÏy þpü¯©þ3®ÿ}UÈëÂÿ_Îÿeÿ7·t(F®Pþû?ÿ¡¹þAù¼ÿÀüÝÈõÏõ¿¯ÊW\ÿ üú?!0ÿC7rý§ð\ø¿r®ÿÁrú¯j"úÿ\ÿû ÿC7rý§ðÏÿô¶àüÎxÞ (FªÿÅÀ£üÌÿ ¯?(ÿýÌÿÐ\ÿ üÆ^ú?Øÿ@ñëF®ÿþËë?ó?0¼[®ûnSõM»ä©@!rýüìÿ@`þnäúåÐÿóÿt#×?(ÿþo¿n"úÿüÞÿC ÿC7rýò?ÿãÝÐÌ/'õxgsÃë¶ØÝÐÿ`TýûvÕ.ÚÙ6ò0¶þ_óM¾[ÿõO¬þý¼«ËédÝÜ
+j6öpÈÆÿ»úgÿa8ÿóy.dú_Í·ë¦*UYݳzÒLGìC6þßéßú0¼¡àU#ÓÕv#5¬ÿXÿó?1Ê_5úþ£ÆÿÞQÿ8þ×Í(ýúÿÑûõÿl±ëÿÀþAý÷ÏjýoÖ¼þ)æÿ=±þ'ó ¸À ë?uþs8Ìÿcþ;æ?ëF®ÿÔùÏ×úÿ!0ÿY7rýÖÿæõý¾ºë?uþs8Ìÿ£ÿóu#×
êùá0ÿú@õë&¢ÿxþ_8ä?óù?>ÿ×\ÿ)æÿÿ½-¨.pÍHõ30Êÿaéÿ@ ¯êüçÃóÇû?ÌÖ\ÿ)üçþ/®ÿbïÿx?ïÚÍlÎ>äúOàÿxÊÿÉë?·e_R÷zëäÿ ÿû½ºë?uþó£ÿþ/ÌÓ\ÿ ÿïÿ!PþºèÿCüìÿc ÿC7rý§Î>è?çú8þ×TÿÊÿáéÿ@ ¯
+ÿG~ùüýÞÜÒ¢¹þAùìÿ@`þnäúåðþó?t#×?ÈÿÁë?ÊW\ÿ ü®ÿùºë?
ÿãÂÿsýÓUÑÿÇäÐÿ
+þÝÈõÂÿq>ÿËÛÂQÿñ¼PTÿåÿàúßäõå°ÿùºë?ÿÃØKÿû?(~ÝÈõÂÿqyýÏxýðn¹î»MÕ7í§
Èõò°ÿý^ÝÈõÊÿ ÿçÿéF®Pþýß(ÝDôÿ1ù¼ÿ@ÿnäúå0ÿÇÿºyNÿËvZGØ=.ëÿðÎgWÆæn7ÿþô¼XÿÝbý9blý¿ÿm
+ÖÀÈúà ½}ýA?_ÿÌæYÈí×cà ÷×oøþ¬ÿú¾r8P}Ô>^ÿí{8óÿþ»ÂNæMcoMø.{½ÿóC³^ßÃ÷Û®nfËáͲ¯»E]~ª÷ÿC(lñzÑVåb²û|þm?îöc8´ü¿güù?ÞGÌù§ÿÓ3²þõC³üØÆíã
ó¿ÝùOÏÿ&ìÿAxýëþL}óKýð¾íËÅ÷7{¬1··ÎÜÜÿx´ÁO]]?¾~s¬ó·ùéÖõôËþ¶ðÎmðCÕ7¾þ7ÜwG¼[§ìúÀÇüÜÌæÇïr9Ûàä]oðöçÍaçÍ·M×oO~þM¸uGìµîÊêþÏÞäOÍ¢þg9«×¸áÊiÍ_ÊÕêè@ïñø'ü°lÇ?áÆºüäPï^|_Þ-¶(òãðëO¿M>,þ°Í÷O½ÉÛͲ:=§ü¶(ï_nßOÔÏÙá×qsùêÑáæÎøë¿ÞGÔý_Îë?õ6ÃaNQûx¹ÿþüÏî"ayýÀS®nÆÿãÕuþ<ÿ#_ÿf'xñüáÿ¾0ÿÂç|ö|äõB¹zþs¯2 ¨
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ia64-4s.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ia64-4s.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ia64-4s.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,33 +1,33 @@
-System(0KB HP=0*0kB )
- Socket
- L3Cache(4096KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#0
- Socket
- L3Cache(4096KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#1
- Socket
- L3Cache(4096KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#2
- Socket
- L3Cache(4096KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#3
-depth 0: 1 System (type #0)
+Machine (phys=0)
+ Socket #0
+ L3Cache #0 (4096KB)
+ L2Cache #0 (256KB)
+ L1Cache #0 (16KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ Socket #1
+ L3Cache #1 (4096KB)
+ L2Cache #1 (256KB)
+ L1Cache #1 (16KB)
+ Core #1 (phys=0)
+ PU #1 (phys=1)
+ Socket #2
+ L3Cache #2 (4096KB)
+ L2Cache #2 (256KB)
+ L1Cache #2 (16KB)
+ Core #2 (phys=0)
+ PU #2 (phys=2)
+ Socket #3
+ L3Cache #3 (4096KB)
+ L2Cache #3 (256KB)
+ L1Cache #3 (16KB)
+ Core #3 (phys=0)
+ PU #3 (phys=3)
+depth 0: 1 Machine (type #1)
depth 1: 4 Sockets (type #3)
depth 2: 4 Caches (type #4)
depth 3: 4 Caches (type #4)
depth 4: 4 Caches (type #4)
depth 5: 4 Cores (type #5)
- depth 6: 4 Procs (type #6)
+ depth 6: 4 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ppc-4c.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ppc-4c.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ppc-4c.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,4 +1,9 @@
- §
-J íQoÛFýZÿ{Ü6#y¼ãÝÞ¶¼týµT#,ûõ£ìm]ÔU[@1~0bY¶I)ßñÄy»-Þá axF °{Ì»ç¿Y P `¤è¶îrárôÇ®_µÎ-îîûMUù\Ùvsмð¿þ·ms¡A0Î?zö!øÁ¿6ÿspà¿Ø>VõoÍysãÞ÷þ
ÂöÎ{/ó?÷?X/»®ißüè`©úßèÆííu¸¹}ëV¾z*×=n·MÛëe±ißg¹
-;7ïÿ\¶åSÕUMïàºï¶OÓé à÷Ëåá\h®Dþú꡼[uåð>{LúµåêøXÕåíúý¯·îoÞ¦Äüî§k\àÿ þµú³±×ê?Ãú÷1Õÿè°u1BÁÅY$8L^0¸$DñäPÄÀpÕ"Â~Ú G)IÆá QRäÐg9iÜÈÑÖF/¹Ì)í ½CÊ1k$ÞGÙA²cÖ@à8ÇKô0÷ÈQ&}°&Ì!ÆGÂ(¬
¤¼öQÏP/-A¼H$èR@ò¼à5 &1sC ñr õ´v0"épÖ UÝ·0îЧÿ£wr)§åÝPÅ ù$ÿLe§;}Ö2 Ý®îCûX×U}¯³äþõÝ0mkÍqÿê¿{î.´×ÿAô(µñÓþ/²õÿ³ð¹ÿµ^tPyî)ùýëv_>kàß{õ¯4ÿspÔ¿^Ï1FùÑë»DTÿÚADó?¯ú£¯§ßÿòæÆùïm³iî§
-ëÉîÿÍÂ8ÿÛÏ]U¬6ªõ`>²þ×¥ÏçõOÈ^lý?þJãáhý×ͺ<C8¡ÿÞæÿYxÝÿð¾jLèÿù±þ¬Ssìüëú¿ÿ?ìî0/]óL¿ùëßOÍ1É?ÿ98Á?NÍ1É?ÿ9ë]éÿ©.Ê)9^_ÿùÃõyoë¿9Àüªh|+0ÿO.ÇIó?Úüoaaaaaaaaq¿ çÊÐ P
\ No newline at end of file
+ 4Ö9K íQoÛFÇýZ{Ü6#ïÈã]ß¶¼t}"±µT¨#,ûôãÙ
+Щ#+¶bü!°eÙ&Oþ<R¡õzñ¿ÍN(Â\Q¶¯hûü¢Ï ~Ìaæøzä®ë¯6ÎÍ®oÚUÝìù\µé¦XдÐ7ý×ödA0LA
ôìÅô'ú/Öwuów{lEà¸ÓûEýÅó3ýµ
+àÌÁ±òÿsýîU×µwÌ5 ÞéÁååy¸¸|ï®V}}_-\w·^·¾ZΫvñµ|ÈS3Þ
+xñéßù¦º¯»ºmô<C÷Ëú~ã´üu>ÿÞNåÈOå(ÒQ_ßV×W]UÞ§I¿6¿½Z|©ªX;ÿô×¥ûó÷)}øýçèÿ$ÿ5úÄØkùùyþëa°ü
+[ç#°`d9;ì ;fá Á; ì£ó$ ¸@¥Pîló)³$cù&¨U%9 CNj7ZtLÚè%ÉcJ;¨$BÄàÐçLÕ@¢l
+DòÙ©!pcÎÉ%`]æÎw>{ý#u9Ú×]$
+i"© ýeÔ+¤@,A
+$/裴3Ô ®IÆ)Åb@Ü£^y@#z]Êj núóÞc=¡
§ÿ§wrÎ>§ùuÉb5BÇòQuz2dM¿=Õ}ÞÜ5MÝÜhܽ¾.e£ZªèÿÿÝCw²`Xÿ1 øÈTú?Bëÿ'á{ýºiH=× °é?/é¯Ç}u{¼08@ÿDTLÿ)Ø£¿nÇAúèþ.ÑÎÊÎÊhúOÁ+ú¶èÍApøý4ý'aþ}»nWíÍÃØ@88ÿ=D±û0Dÿõ®^\>×ËQ>À´gþ×Ñçiþ{»¼ÍÿSN1T?
+{ò¿iÕQÀý_ «ÿðþåÞ#ú¿ [é?Ãô/·WÇûØê_æú½úÍúrg5þO'ÀógÇ»ÎbúÓ?÷1JoúOÁ`ýq¼Qúé?Ãô_Öú+5j×ç¿ð|þ6ÿMä¿ÆÏÂàúÿdSÿY¬þaaaaaaaaaìã?æuêL P
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ppc-4c.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ppc-4c.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4ppc-4c.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,8 +1,8 @@
-System(0KB HP=0*0kB )
- P#0
- P#1
- P#2
- P#3
-depth 0: 1 System (type #0)
- depth 1: 4 Procs (type #6)
+Machine (phys=0)
+ PU #0 (phys=0)
+ PU #1 (phys=1)
+ PU #2 (phys=2)
+ PU #3 (phys=3)
+depth 0: 1 Machine (type #1)
+ depth 1: 4 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4qs22-2s2t.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4qs22-2s2t.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/4qs22-2s2t.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,11 +1,11 @@
-System(15GB HP=0*16384kB )
- NUMANode#0(8192MB)
- P#0
- P#1
- NUMANode#1(8192MB)
- P#2
- P#3
-depth 0: 1 System (type #0)
+Machine (phys=0 total=16777216KB)
+ NUMANode #0 (phys=0 local=8388608KB total=8388608KB)
+ PU #0 (phys=0)
+ PU #1 (phys=1)
+ NUMANode #1 (phys=1 local=8388608KB total=8388608KB)
+ PU #2 (phys=2)
+ PU #3 (phys=3)
+depth 0: 1 Machine (type #1)
depth 1: 2 NUMANodes (type #2)
- depth 2: 4 Procs (type #6)
+ depth 2: 4 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/64fake-4n2s2ca2c2t.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/64fake-4n2s2ca2c2t.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/64fake-4n2s2ca2c2t.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,206 +1,202 @@
- §
-J íýQoÜ̶µ}×çWì\¾FX$sA A.k¡ÝeÁþÜÔ>óëC6ZrëX"9kwÏç ¶óôAWVqÖcví×Ý÷ÛíÏú¦þ?ÔûúøüÅ©úÇÿú\þÿ§¶=ýß3ÿ#¥ºªsUµ©ùUjªáö_¹üÿ§¼æ×Óq÷ø_ÿõ?¾Üî~Üÿ|ãwûø¤øÿ -Ý«õúýTø7°lýSS×¶}7®jÖ_ÁÿöúßÜþ¯÷ûÛR¿åëß7}5ü¿§ÜÔë¯àíõþ}¼ýÖÁýç4ü÷©þÁú+X´þû_ßÀýw}?¬ßfÿ¯ÿðÔmû¬Xÿn|ðWuÕV¬¿ë<<~î~¯ú!¬xþç¾ô_×u×°þ
-¶®ÿñÛãíîæúéþËð¥Ý½ýÅÜMëý¿½þu}±þ¹iÓÿø¯Jñ_ÿy þ$ÿø_þ÷þÿ"P²Uÿß~?Ýïw?®vûï»»Ûëû¿~Æ»ú¯þ£ÿáÏ ÿ.5úWP£÷ÐlÕÿþðø¦æ_²^ÿMîÙÿ%°ßÇÆ¤ÿE§ÿuçÿ¶®þÇé"¨Cÿ
-^ÿ¿~åüúßïößn×VÕª®®úÔµ£þSÛPÿ°iýïÞÜþëÅ?5õßá?cýoü°þ,ëÿtÿÿ»]òã·oÿóiýÑWþBËþ¯ ÎÝÿ-?.ý?× ÝÜ^?ì÷ÇûÃk ½¯ÿúBÿ}ô¯ !þÐXôüýPfÿOÕôßô§ý¿Îè_Áÿûçý×ûÛA±èÿÇíÿzûcÁg¬ßÿ®¥þ'û¿ØXô¿?|»}¼ý¹ÿ=½ üµð¾þýw¹ãþ_B×ò ©þ÷m÷x{s=ü7Ãàéø×Ïx_ÿí
þs¸ÿPýà 2ýÿv¿®_¯wOOýýîxÿ¿Þÿo|Æú_êп+ÔBûÿÿÜ=üý3F
/óÿô]_üÿÿ¯y þ©ªÇð<
Eÿ?ýÏ/·ã àéöø66ÿ3÷r¢íú¯|ü_M{òáÿÓ`Yÿrþ¯öÕýoêyþ+hjì_±èßÅÿuÒßfô/ÿWl,ú/æÿzéÿý_è_§ÝqÇ# .ý»ø¿&ýwcþú÷ý?6ý»ø¿NúïrGÿü_±1Õÿ<ü_'ýç>Ñÿ!ÿWl,úwñMõ¿Ô¡ ø¿bShÿ/æÿîs®9ÿKü×Xô_Îÿuùþs¦ÿSïÿ±Ù®ÿÆ)ÿëìÿbþËúóu¯ó¿xþK¸JqÆ¢×ü/Þÿ$pÿþ]ò¿ÎûMÿò¿bcÑ¿kþþO
-ÊEÿ®ù_äH þSýÏ3ÿÿ·êCÏ 0ýó]îÿ}êÈÿ:äBû9ÿW:û¿ðJù1±è¿ÿërþW@ÿ
-Æû$íúONù_Õäÿªñ)°¬¿gþ÷¿ÈÿEÿù_ÌÑÿ+6ýó½ÞÿÉ×ðùçÓññ×~|nó$Eÿ®ù_ÜÿH`ÿEÿ®ù_Ô%àÿ©þçÿEÿ§ò¿bcÑ¿kþúúcShÿ/ÿ5ù?jú?$ÌK@þWL,úwÿxÎÿâþOCªI Ìýw_2*|©ÿ«©»AÿU3îÿø¿üY·þÇÃÃáÇáî÷ºÂòõïr×òßêõ°qýßow7×O÷_ïìîïeùù^ÿ\3ÿOÃóÿtLã4ú¶þ=ìößww·×÷7ÿwõ_ýGÿÃñþ¯"ÿEïû±Ù¨ÿýáñmÍ¿d½þ¿¼ÿK ÿ)6ý/;ý¯;ÿ7§óÛ7ø$\ÿ¿~åyuúÊÿk?cYý§êêªOSÿ÷ð,h©ÿ(زþ§ëzùÏ`MýwøÏXÿËcýõ÷ǰþKÛ7ä?ÿÄÿ/¡Î
-À1èiûïùMOþ£úbcÐÿÒößuó¦þ¿ñþ0ÿ!6ý/mÿÝ2ÿþ?¿ÅÆ ÿ¥í¿[æ?´=÷ÿèÿ¥þ·°ýwËüü
-ôÿÆÆ ÿ¥í¿[ê©BÿèþMýÿÍößåþzøgÇý¿eÿ×0/ÁÙÿ3ÏPô¿´ýwËù¿åþOCNT #³Yÿÿ«i'ÿþ? õ/èÿzÿÜ6ä?I`þClú÷ñMùoMþ%àÿAÿåü_/ýß³ÿýKø´;îxÄÅ ÿ×yþKOþ£öÿØôïãÿ:Ϩèÿÿ+6úÿkÊíú?$àÿAÿ>þ¯óü
-ýKÀÿ2û!ÿ×óýon[Îÿæ% ÿ5&ýô]¾ÿç¶§ÿSïÿ±Ù¬ÿÆ+ÿëìÿÊø¿Ö¿ ÿ«{ÿÅó_ÂUú,0ýûæñþ'ûߨôïÿ5ïÿäH ÿ+6ýûæáÿÀüØôïÿÉÿÐ@ý76úkþþo Õ@`ú/èÿºÜÿûTÿ!!uÈ?2eöÿþ¯töáÿ0/óÿbbÐAÿ×åü¯Üöè_Âxÿäã²YÿÉ+ÿ«ü_ ÿÃúûæqÿ+ü¯Øôïÿ
þ%àÿAÿý_¯÷ÿýKøüóéøøk?>¸yÄ ßü/î$°ÿÇÆ ßü/ê¿ðÅÆRÿsÍÿ¢ÿSù_±1èß7ÿýK@ý±)³ÿÌÿü-ýæ% ÿ+&ýûÌó¿¨ÿKH5 Y£ÿöj¹çë%£Âú¿ºô_µUÿKÁÊõ??w¿Wý¯×Õí)ÿîðÿIغþÇo·»ë§û/Ãv÷ö³üü?¯nðÿiV"½8ÿW§PlÕÿ³ùïa·ÿ¾»»½¾¿ùëg¼«ÿêYÿyø3Þÿ%êÿhÿÍVýïojþ%ëõßdæÿj`¿IÿNÿ«Îÿ§ÆÏáü_Õø$-ßÿã²RÿÓÀÊÏXVÿ©ººêÓÔÿ=ü·5õÖÿtT/þ¬©ÿæúÔÿ;^±þ,ë¿´øt÷*ÿ¡É5ùoêÜÑ þ6 ¿¯ÿWóÚÿúbcÑÿÒàwõÿrþùÿ¯¡ÿOóbcÑÿÒàõûÓeæ?I ü-6ý/m ~_ÿ¯ç?tÜÿK ÿ76¦úßÂà÷õÿjþC¸ÿ@ÿol,ú_Ú ¼¡þÿ¦îØÚÿßl ¾°ÿ·þϸÿçó¿ªÊy\ü?1±èiðóæþOCNT #³]ÿÿ«9õvøÿ4XÖ¿ÿëUþsÆÿù±±èßÅÿ5念úÿ+6ýó½ôÏþ/ô/áÓî¸ãþ]ü_þ»LþöÿØXôïâÿ:Ïèéÿÿ+6¦úÿkÊíkú?$àÿEÿ.þ¯óüæ¿iÀÿBû)ÿ×ùþ7çó¿ò_ccÑ9ÿ×åûÎýxÿÍvý7>þ¯tö5ø¿XÖ¿ÿ«{ÿÅó_ÂUú,0ý»æñþ'ûߨXôïÿ5ïÿôÿI ÿ+6ý»æáÿÐ üÐXôïÿEþ
꿱1Õÿ<ó¿ðK¨>ô< cÑ9ÿ×åþ?Èü ¡)´ÿó¥³ÿÿ§æÿÅÆ¢ÿrþ¯Ëù_9wè_Âxÿäã²]ÿÉ)ÿ+Mþ¯
-ÿËú»æqÿ+ü¯ØXôïÿ
þ%àÿEÿåü_¯÷ÿýKøüóéøøk?>·yÄ¢Ïü/òß5°ÿÇÆ¢×ü/ê¿ðÅÆTÿóÌÿ¢ÿSù_±±èß5ÿýK@ý±)´ÿÌÿJÓüGüßÈÿEÿ.óçü/êÿRMhdÖè¿Yùõ£Âú¿ºô_µUÂÿ¥`åú»ß«~Ë׿ëª~|þ×õ8ÿ
õ÷gëú¿=Þîn®î¿_ÚÝÛ_Ìòóÿ¼þ¹áþ_ü ÿc²UÿÏÞ¿Ýþûîîöúþæ¯ñ®þ«gýçáÏxÿxÿ×@ý/6[õ¿?<¾©ù¬×éÿÖÀ~þþWÿsÛïÿ¹Jÿ%Lðõ+çÿ¬ÔÿTÿ_ùËê?UWW}ú¿S;Îÿ¦þãϦõ?ÝÿÔ>ý¿uuêÿm¨ÿJ°¬¹þßËüá§ÿGB;cÑ¿çüÿ_ý?±±èßeþÃÿAþ»æ?ÄÆ¢Ïù-õ? ¿ÅÆ¢Ïùû ôÿÆÆTÿóÿÀý¿úccÑ¿Kÿïyþù?èþM¡ý¿Lÿo=¼ 4'ÿONÌ0-Ànÿ'&ý»ôÿç?pÿ§!'*Ù®ÿÊiþC;ù¿ðÿI°¬¿çüÄü_ ÌEÿó2úÿ+6ýó½ôÏþ/ô/áÓî¸ãþ=ç?dê¿ØÿccÑ¿çüþ/ ø¿bcªÿ9ÎHôHÀÿþ=ç?tè_þ¯ØÚÿÎh§ùÿ%Ìÿ+&ýó]¾ÿçô¯÷ÿØl×ÿòa£Âû¿ÒÙÿñ)°¬9ÿW÷:ÿç¿«ôX`,úwÍÿâýO÷¿±±èß%ÿkÞÿÉÿ@þWl,úwÍÿÂÿ)¡Aù¡±èß3ÿü
-ÔccªÿyæáÿP}èy Æ¢ÿrþ¯Ëý¿OùRü#Shÿ/çÿJgÿþO Ó0ÿ/*ýó]ÎÿÊ9£ ãý?Ëvý'§ü¯4ù¿jü_
-,ëïÿÅý¯ò¿bcÑ¿kþúÿ+6ýó½Þÿkô/áóϧãã¯ýøÜæIþ]ó¿¸ÿÀþþ]ó¿¨ÿJÀÿSýÏ3ÿþO äÅÆ¢×ü/ô/õǦÐþ_0ÿ+Mþ/üßæÀÿþ]æ?Îù_Ôÿ%¤ÐȬѺZlùúQáKý_M=ήÚùV®ÿñðpøq¸û½ê°|ý»|úßÕuݱþ¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëû? óü3Ñ8ÿc«þ½»ý÷ÝÝíõýÍ_?ã]ýWÿÑÿðg¼ÿK
-ú@óGl¶êx|Só/Y¯ÿ&÷ä?JÀÿþþ×ÿÛúÔÿ9FB¢/Îÿ_¿rþÇJýOõÿ±¬þSuu5ÎýõÚ¦§þ£`ÓúîjþßÓó¿îê,ë_®ÿ÷2ÿa<
-°ÿ+¨sGp`,úwÿÿOïÿ±±èßeþý¿Rÿþ=ç?dê¸ÿEÿ®ó¸ÿ@ÿolLõ?ÏùÜÿK ÿ76ý»ôÿÎóпºbShÿ/Óÿ[ÿì§þ¿÷ óüSU9ÿày
-þ]úçùÜÿIÈ
-`d¶ë¿rÿÐNþ/ü,ëï9ÿü
-ÌEÿó:ô/ÿWl,ú/æÿzéÿ>ïÿ
-úðiwÜñEÿ®óÈÀþþ]ç?Ðÿ%ÿWlLõ?ÏùôHÀÿþ]ç? ø¿bShÿ/8ÿ¡ü_ÿ%ÌK@þkL,ú/çÿº|ÿϹÃÿ)÷ÿØl×ããÿJÿ«ð)°¬9ÿW÷*ÿÿ¿«ôX`,úwÍÿâýO÷¿±±èß%ÿkÞÿÉÿ@þWl,úwÍÿÂÿ)¡Aù¡±èß5ÿü ÔccªÿyæáÿP}èy Æ¢ÿrþ¯Ëý¿OùRü#Shÿ/çÿJgÿþO ó0ÿ/&ýó]ÎÿÊ9£ ãý?Ëvý'§ü/æ?*±¬¿kþ÷¿ÈÿEÿ®ù_è_þ¯ØXô_ÎÿõzÿoпÏ?¿öãs'A@,úwÍÿâþGûl,úwÍÿ¢þ+ÿWlLõ?Çü/ú?5ÿþ=ó¿zô/õǦÐþ_0ÿkòÔôHü¯Xôï2ÿqÎÿ¢þ/!Õ$Ffþëů?¾ÔÿÕÔÝ ÿªIÿuë<<~î~¯û!,_ÿ.wùäÿ;å?³þþl\ÿã·ÇÛÝÍõÓýá;»{ç{Y~þ×?×-÷^ÿ§c§PlÔÿ³õïa·ÿ¾»»½¾¿ùûg¼«ÿê?úþ÷UËû¿Þ÷c³QÿûÃãÛÉzý7¹"ÿAþØXô¿ìô¿îüßôcÿwÛ3ÿWÃÅùÿëW¡X§ÿ©ü¿ö3Õª®®ú4õÏòÿ%lYÿÓõÏbðúïð±þsÃú+0¬ÿÒöß
-ùMKþ:w4 Æ ÿ¥í¿[æ?4ÌÿÖÀûlú_Úþ»nþÃÔÿ×¶ø%0ÿ!6ý/mÿÝ2ÿ!wÔÿ$þþ¶ÿnÿÐöÜÿK ÿ76úßÂöß-óºû ôÿÆÆ ÿ¥í¿[êUþ%Ðý2ûÿí¿Ëý?u5FûËþ¯a^³ÿ'g¡0èiûïóËý¨ Ff³þ+'ÿWÓNþ/üë_Ðÿõ*ÿ¹%ÿYóbcпÿkÊkzô/ÿWlú/çÿzéÿý_è_§ÝqÇ# .ýûø¿Îó_ÿý?6ýûø¿¦ùmOÿü_±±Ôÿ\ü_Sþk×Ðÿ!ÿWlú÷ñç?Tè_þ¯ØÙÿù¿ïsÛpþ0/ù¯11è¿ ÿ
ëòý?·=ýxÿÍfý7^ù_gÿWÂÿ¥À°þý_Ý«ü/ò?5\¥8Àcпoþï¸ÿAÿ>ù_óþOþò¿bcпoþþO
-ÊAÿ¾ù_ôÿK þKýÏ5ÿÿ·êCÏ 0ýô]îÿ}Õÿ!!uÈ?2eöÿþ¯4ù¿Èÿ×0/óÿbbÐAÿ×åü¯Üöè_Âxÿäã²YÿÉ+ÿ«:ù¿ÚÿKaý}ó¿¸ÿ@þWlú÷ÍÿBÿðÅÆ ÿþ¯×ûþ%|þùt|üµÜ< bпoþ÷?ØÿccпgþW&ÿCþ¯ØXê®ù_ôJ ÿ+6ýûæ¡ ¨?6eöÿù_ÿ£¡ÿC¼äÅÄ ùsþõ ©&42«ô¿bæãKF
/õ5õ8ÿ¹jzü_V®ÿñðpøq¸û½ê°|ý»Üw§ü·:³þ¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëü^ÿSÿÁi [õÿlþ{Øí¿ïîn¯ïoþúïê¿úþ?ãý_ªÑ¿?b³UÿûÃãÉzý7¹£þ'ýÇÆ¤ÿE§ÿuçÿ¶>Õÿ+îÿ4¼8ÿýÊù?+õ?] ¬üeõª««>Mýß©çÿQÿñgÓú.êÅ?5õß|zþ×§ü/ÖßËú/m >ÝðÊþAþ»:w4 Æ¢ÿ¥
-ÀïëÿÕü¶¥ÿGý?±±èið»ú9ÿáÜÿWÓÿ#ù±±èiðúý¿éZê¨ÿÇÆ¢ÿ¥
-ÀïëÿÕü¹ÿ@ÿolLõ¿
-ÀïëÿÕü¾âþ_ý¿±±èiðú_Êè_Ý?±)´ÿ¿Ù <*|iÿoêÿɹFÿæ%ø§ªrÿÁó ý/m ÞpþÏÜÿiÈ
-`d¶ëy3ð¨ðåóNýþ?
-õ/çÿzÿ<<xþ+`þCl,úwñMùomFÿðÅÆ¢ÿbþ¯þïÙÿ
þ%|Úw<âbÑ¿ÿkÒ7ÎÿCÿþ°ÿÇÆ¢ÿ×yþC¦ÿKþ¯Øêþ¯)ÿµOôHÀÿþ]ü_çùúÿ+6
öÿbþ¯éþ7ÿDÿ
-æ% ÿ5&ýó]¾ÿçáþðþíúo|ü_éìÿJø¿XÖ¿ÿ«{ÿxþK¸JqÆ¢×ü/Þÿ$pÿþ]ò¿æýü äÅÆ¢×ü/üþ]ó¿èÿ@ý76¦úgþþo Õ@`,ú/çÿºÜÿûÉÿ:äBû9ÿWü_äÿkù1±è¿ÿërþWÎýKïÿ|\¶ë?9å1ÿQeý]ó¿¸ÿ@þWl,úwÍÿBÿðÅÆ¢ÿrþ¯×ûþ%|þùt|üµÛ< bÑ¿kþ÷?ØÿccÑ¿gþùðÅÆTÿóÌÿ¢ÿSù_±±èß5ÿýK@ý±)´ÿÌÿüþ óÿþ]æ?Îù_Ôÿ%¤ÐȬѷ<òëF
/õ5§ùÏU;<ð X¹þÇÃÃáÇáî÷ªÂòõïºfòÿÕãü7Ößëüöx»»¹~ºÿ2|iwo1ËÏÿóúçñÿ°ÿ¸ºz>ÿOpÅVý?{ÿvûï»»Ûëû¿~Æ»ú¯õ?ãý_jÈ@÷wl¶êx|Só/Y¯ÿ&÷¼ÿK ÿ)6&ý/:ý¯:ÿç\êUÂÿ'ajúæüúêÿ+?cYý§êêªOSÿwjúMëºÿ©}úë©ÿ·¡þ+Á²þåú/óÆ£ û¿:w4 Æ¢ÏùüG ôÿÄÆ¢ùsÿ/ó_$0ÿ!6ý{Î ÿMáo±±èßsþCÇý¿úccªÿ9Î ÿOý¿±±èߥÿ÷<ÿ¡CÿèþM¡ý¿Tÿor=Í þ/a· ÿOL,úwéÿç? 9QÌvýWNóÚÉÿ
ÿOeý=ç?Ôä?I`þCl,ú÷ÿ@þü_±±è¿ÿë¥ÿû¼ÿ7è_§ÝqÇ# .ý{ÎÈä?J`ÿEÿ®óèÿÿ+6¦úçüú?$àÿEÿ®óпü_±)´ÿÿÐNþ/ÎÿÈEÿåü_ïÿù"xÿÍvý/1*|±ÿ+Mþ¯¶Âÿ¥À²þåü_Ý«ü¯ç¿«ôX`,úwÍÿâýO÷¿±±èß%ÿkÞÿÉÿ@þWl,úwÍÿÂÿ)ù±±èß5ÿü ÔccªÿyæáÿP}``d,ú/çÿºÜÿûÔÿ!!uÈ?2
öÿrþ¯töáÿÀü¿ØXô_Îÿu9ÿ+çþ%÷ÿH>.Ûõò¿Òÿñ)°¬¿
kþ÷¿ÈÿEÿ®ù_è_þ¯ØXô_ÎÿõzÿoпÏ?¿öãs'A@,úwÍÿâþGûl,úwÍÿ¢þ+ÿWlLõ?Çü/ú?5ÿþ=ó¿zô/õǦÐþ_0ÿ+Mþ/üßÈÿEÿ.óçü/êÿRMhdÖè?/v|ýɨð¥þ¯¦îýWMMþuë<<~î~¯û!,_ÿ±î;úëÔ·¬¿ëüöx»»¹~ºÿ2|gwï|/ËÏÿóúçáÿÇþ¯`^æà4ú¶þ=ìößww·×÷7ÿwõ_ýGÿÃñþ¯jÉÀû~l6êx|[ó/Y¯ÿ&WÜÿK`¿EÿËNÿëÎÿM?ö·}Cý_ÂÅùÿëW¡X§ÿ©ü¿ö3Õª®®ú4õÏú-ëºþ©ÿÖÔÿõ¿<æ³þþÖiûïüáÔÿ$Ô¹£80ý/mÿÝ2ÿ¡éÉ@ÿOlú_Úþ»nþÃÔÿ×¶ä?K`þClú_Úþ»eþCî¨ÿI þþ¶ÿnÿÐöÜÿK ÿ76úßÂöß-ó:ò5Ðÿþ¶ÿn©ÿU=ú@÷OlÊìÿo¶ÿ.÷ÿÔÃ?ÛzÜÿ[ú5ÌKpöÿìv<BaÐÿÒöß-çÿû?
-9QÌfýWNþ¯¦ü_øÿ$Ö¿ ÿëUþsÛÿ*ù±1èßÇÿ5å¿5=úÿ+6ýó½ôÏþ/ô/áÓîHÉ'0ýûø¿Îó_ÈÕÀþþ}ü_çùý_ðÅÆRÿsñMù¯]Cÿü_±1èßÇÿuÿP¡ ø¿bSfÿ/äÿz¾ÿÍmËù_Â¼ä¿ÆÄ ÿþ¯Ë÷ÿÜöø?%ðþÍúo¼ò¿Îþ/òÿ%Ö¿ ÿ«{ÿÅó_ÂUú,0ýûæñþ'ûߨôïÿ5ïÿäH ÿ+6ýûæáÿÐ üÐôïÿEþ꿱±Ôÿ<ó¿üߪ=Àô_Ðÿu¹ÿ÷©"ÿCBêdÊìÿý_éìÿÂÿ)a^æÿÅÄ ÿþ¯Ëù_¹íÑ¿ñþÉÇe³þWþW5ù¿*ü_
-ëïÿÅý¯ò¿bcпoþúÿ+6ýô½Þÿ[ô/áóϧãã¯ýøàæIþ}ó¿¸ÿÀþþ}ó¿¨ÿJÀÿKýÏ5ÿþO äÅÆ ßü/ô/õǦÌþ_2ÿkò4ôHü¯ôï3ÿqÎÿ¢þ/!Õ$Ffþv¹çë%£Âú¿ºô_µcþ?þ/V®ÿñðpøq¸û½ê°|ý»n~N!õxÿËúû³uýßow7×O÷_/íîí/fùù^ÿÜ0ÿ]ÃùüÕþ3¯§PlÕÿ³ùïa·ÿ¾»»½¾¿ùëg¼«ÿêYÿyø3Þÿ%ú¿5PÿÍVýïojþ%ëõÿGþØô¿èô¿êüGãïpþ¯õ? Ó|ýÊù?&+õ?] ¬üeõª««>Mýß©m2õÖÿtT/þ¬©ÿæúÔÿÛ5Ô%XÖiðTaZÿÐ10ìÿêÜÑ þ6 ¿¯ÿWóÚÿ_ïÿ±±èið»ú9ÿáÜÿWÿ.ù±±èiðúý¿éèÿ×ß76ý/m ~_ÿ¯æ?äû ôÿÆÆTÿ[Ø ü¾þ_Íè÷ÿèÿEÿK7ÔÿRþ%ÐýBûÿ
-À£ÂùêáM ýyx çû×ÿ'&ý/m ÞpþÏÜÿiÈ
-`d¶ë¿òñ5íäÿÂÿ'Á²þåü_¯òÏÌEÿ.þ¯)ÿÍè_þ¯ØXô_ÌÿõÒÿ=û¿Ð¿O»ãG@\,úwñMúïrþ°ÿÇÆ¢ÿ×yþCGÿü_±1Õÿ<ü_Sþkèÿÿ+6ý»ø¿Îó:ô/ÿWl
-íÿeü_Ï÷¿9ÿªá|þ"ÿ5(ýó]¾ÿçñJàý?6Ûõßøø¿ÒÙÿEþ¿Ëúóu¯ó¿xþK¸JqÆ¢×ü/Þÿ$pÿþ]ò¿ÎûMþò¿bcÑ¿kþþO
-ÊEÿ®ù_äH þSýÏ3ÿÿ·êCÏ 0ýó]îÿ}êÈÿ:äBû9ÿW:û¿ðJùQ±è¿ÿërþW@ÿ
-Æû$íúONù_iò5ø¿XÖß3ÿû_
-äÅÆ¢Ïü/æ¿hÀÿþËù¿^ïÿ
-úðùçÓññ×~|nó$Eÿ®ù_ÜÿH`ÿEÿ®ù_Ô%àÿ©þçÿEÿ§ò¿bcÑ¿kþúúcShÿ/ÿ5ͬñK8¿Èÿ
-Eÿ.óÏù_ÜÿiH5 Y£ÿÜ-¶|ýÁ¨ð¥þ¯¦îýWmEþë<<~î~¯ú!,_ÿ®kwÁá<Xgü¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëþo )MKÀù?&[õÿìý{Øí¿ïîn¯ïoþúïê¿zÖþ÷ÃË úW@÷wl¶êx|Só/Y¯ÿ&÷ÜÿK`¿IÿNÿ«Îÿ9W§ú_Eÿ¯_9ÿGf¥þ§úÿÊÏXVÿ©ººêÓÔÿ=ü·úMëºÿ©}úëùB,ë_®ÿ÷2ÿþ_uîh Eÿ®óÈ@ÿOl,úwÿ0÷ÿrÿ'ù±±èßsþCÆÿ+ð·ØXôï:ÿû ôÿÆÆTÿóÿÀý¿úccÑ¿Kÿï<ÿýK û'6
öÿRý¿ýð÷ÔÿGþ§%Àÿþ]úçùÜÿIÈ
-`d¶ë¿rÿÐü_øÿ4XÖßuþù¯ÿþ]ç? ø¿bcÑ1ÿ×Kÿ÷ìÿBÿ>í;q±èßuþù¯ØÿccÑ¿çüû ø¿bcªÿ9Ψéÿÿ+6ý{ÎèÑ¿ü_±)´ÿÿÐâÿBþkl,ú/çÿº|ÿϹ£ÿSïÿ±Ù®ÿÆÇÿÎþ¯ÿËúóu¯ó¿xþK¸JqÆ¢Ïü/æiàþ76ý»äÍû?ùÈÿEÿ®ù_ø?%4(?4ý»æÿ!úolLõ?Ïü/üߪL Eÿåü_ûÿ ò?$¤ùG¦Ðþ_ÎÿÎþ/üÿþËù¿.çåÜ¡ ãý?Ëvý'§ü¯4Íìñ)°¬¿kþ÷¿ÈÿEÿ®ù_è_þ¯ØXô_ÎÿõzÿoпÏ?¿öãs'A@,úwÍÿâþGûl,úwÍÿ¢þ+ÿWlLõ?Ïü/ú?%ÿþ]ó¿Ð¿ÔBûÁü¯tòÔø¿%ÿþ]æ?Îù_Ôÿ%¤ÐȬÒÿÕbË×
-_êÿj¿ª«6Uø¿¬\ÿãááðãp÷{Õaùúw]Fÿo]çõW°uýßow7×O÷_/íîí/fùù^ÿÜ4¼ÿKh[ÎÿÙªÿgïßÃnÿ}ww{}ó×ÏxWÿÕ³þóðg¼ÿK
-ïÿèþÍVýïojþ%ëõßäÿü?±1éÑéÕù?çêTÿ«¸ÿ×@ÿwlVêªÿ¯üeõª««>MýßÃÛPÿQ°iýO÷?µOÿo]Mó¨ÿJ°¬¹þßËüæ?¨¨sGp`,úwÿÿ_ïÿ±±èßeþÃÜÿKþ»æ?ÄÆ¢×ùøÿ$þþ]ç?pÿ/þߨêó¸ÿ@ÿol,úwéÿeþºbShÿ/Óÿ[ÏfÊOÔÿ$ä<-þXôïÒÿËü)9QÌvýWNóÚÉÿ
ÿOeý]ç?0ÿWóbcÑ¿ëüô/ÿWl,ú/æÿzéÿý_è_§ÝqÇ# .ý{Îè*ô¯ý?6ý»Î ÿKþ¯Øêó¸ÿÿ+6ý»Î@ÿðŦÐþ_pþC{òÿªüרXô_ÎÿuùþÏü¼ÿÇf»þÿW:û¿Èÿ`Yÿrþ¯îuþÏ Wé#°ÀXôïÿÅûîccÑ¿Kþ×¼ÿÿ!ü¯ØXôïÿ
ÿSBòCcÑ¿kþù¨ÿÆÆTÿsÌÿªñK¨>002ýó]îÿ}êÉÿ:äBû9ÿW:û¿ðJ`þ_l,ú/çÿºÿsþ%÷ÿH>.Ûõò¿ÒäÿJø¿XÖß5ÿû_ äÅÆ¢×ü/ô/ÿWl,ú/çÿz½ÿ7è_ÂçOÇÇ_ûñ¹Í ý»æqÿ#ý?6ý»æQÿÿ+6¦úgþýÈÿEÿ®ù_è_êM¡ý¿`þWü_ø¿%ÿþ]æ?Îù_Ôÿ%¤ÐȬѻ|äã
-_êÿjênÐÕô=þ/+×ÿxx8ü8Üý^õCX¾þ]zôÿÕmfýl]ÿã·ÇÛÝÍõÓýáK»{ûY~þﺺ×?75÷Nk8ÿGe«þ½»ý÷ÝÝíõýÍ_?ã]ýWÏúÏÃñþ/1ÿWCFï¡ÙªÿýáñMÍ¿d½þÞÿE°ßÇÆ¤ÿE§ÿUçÿÜv§úÿ þ_ÿØÎù?&+õ?ÕÿW~ƲúO5¼û÷iêÿNí8ÿú?ÖÿtÿSûôÿÖÕ©ÿ·¦þ+Á²þåú/óõ? uîh Eÿó2ç ôÿÄÆ¢ùsþó_$0ÿ!6ý{Îhéÿ@ø[l,ú÷ÿÀü
-ôÿÆÆTÿsÿPqÿ/þߨXôïÒÿ{ÿÑ¿ºbShÿ/Õÿ;ìûSþ{BÿN·¯ÿOT,úwéÿ=ÏàþOCNT #³]ÿËG
/ÿÐü_øÿ4XÖßsþC"ÿIóbcÑ¿çüþ%àÿEÿÅü_/ýß³ÿýKø´;îxÄÅ¢Ïùmþ°ÿÇÆ¢ÏùÌÑÿ+6¦úãüDÿü_±±èßsþCþ%àÿM¡ý¿àüöäÿ ÿUÃi-È
-Eÿåü_ïÿ9gú?%ðþíúo|ü_éìÿjð)°¬9ÿW÷:ÿç¿«ôX`,úwÍÿâýO÷¿±±èß%ÿkÞÿÉÿ@þWl,úwÍÿÂÿ)¡Aù¡±èß5ÿþ ÔccªÿyæáÿP}èy Æ¢ÿrþ¯Ëý¿OùRü#Shÿ/çÿJgÿþO ã×Ïü¿¸Xô_Îÿu9ÿ+ ô¯`¼ÿGòqÙ®ÿäÿ&ÿW
ÿKeý]ó¿¸ÿ@þWl,úwÍÿBÿðÅÆ¢ÿrþ¯×ûþ%|þùt|üµÛ< bÑ¿gþùïØÿccÑ¿kþõ_ ø¿bcªÿyæÑÿ)ü¯ØXôïÿ
þ% þØÚÿæ¥iþ#þo §µ ÿ+,ý»Ìó¿¨ÿKH5 Y£ÿ¼|äã
-_êÿjênÐÕVø¿$¬\ÿãááðãp÷{Õaùúw]ÑÿWgæJغþÇo·»ë§û/Ãv÷ö³üü?¯nîÿ$'³q 8ÿÇd«þ½»ý÷ÝÝíõýÍ_?ã]ýWÏúÏÃñþ/Õä?H ý36[õ¿?<¾©ù¬×;êðÿÄÆ¤ÿE§ÿUçÿÜö§þïþ
-S÷7çÿ¨¬ÔÿTÿ_ùËê?UWW}ú¿SKþ¿Mëºÿ©}úëþ_!õ/×ÿ{ÿ0üðÿJ¨sGp`,úgþÿÞÿccÑ¿Ëü¹ÿÿ¯æ?ÄÆ¢æ?üû!ü-6ý3ÿáßý¿±1Õÿÿð¯þߨXôïÒÿ{ÿÑ¿ºbShÿ/Óÿ[Ï4õÿVÜÿI¨ªá»®ðÿDÅ¢þßyþ÷r¢íú_Þ<*|ùüvòáÿ`Yæ?üûaþCl,úgþÿü_±±è¿ÿë¥ÿùR>í;q±èùÿ~ØÿccÑ?óþýàÿ©þÇü=ø¿bcÑ?óþýàÿM¡ý¿àüSþS®9ÿK ÿ56ýó]¾ÿçéÿÀûl¶ë¿ññ¥³ÿ«Åÿ¥À²þåü_Ýëü/ÿ®ÒG`±èß5ÿ÷? ÜÿÆÆ¢ü¯yÿ'ÿCù_±±èß5ÿÿ§åÆ¢×ü/ò?$Pÿ©þçÿðK¨>ô< cÑ9ÿ×åþß§ü ¡)´ÿó¥³ÿÿ§æÿÅÆ¢ÿrþ¯Ëù_9gô/a¼ÿGòqÙ®ÿäÿ&ÿWÂÿ¥À²þ®ù_ÜÿJ ÿ+6ý»æ¡ ø¿bcÑ9ÿ×ëý¿Fÿ>ÿ|:>þÚÏm±èß5ÿû ìÿ±±èß5ÿú¯ü_±1Õÿ<ó¿èÿ@þWl,úwÍÿBÿPl
-íÿó¿¦ù5þo äÅÆ¢ùsþõ ©&42«ô[¾þ`TøRÿWSwþ«¶Êø¿¬\ÿãááðãp÷{Õaùúw]ÝçÑÿWwÌÿ°uýßow7×O÷_/íîí/fùù^ÿÜ´ÜÿI¨ª«+ÎÿqÙªÿgïßÃnÿ}ww{}ó×ÏxWÿÕ³þóðg¼ÿK
-÷hÿÍVýïojþ%ëõßäú¿òbcÒÿ¢Óÿªú®ûSÿgÈ@ÿwlVêªÿ¯üeõª««ñÞÔÿðßVÔlZÿÓýOíÓÿ[WSÿ/õ_ õ/×ÿ{ÿ0þØÿÔ¹£80ý»Îàþ_ý?±±èßeþùÿ·Áÿ'ù±±èßsþý¿EÿóèÿÕ@ÿolLõ?ÏùÜÿK ÿ76ý»ôÿÎóпºbShÿ/ÕÿÛ§¦úÑ¿ªÚíÆ%Àÿþ]úçùÜÿIÈ
-`d¶ë¿rÿÐü_øÿ4XÖßsþÃp$äù/ù±±èßsþCþ%àÿEÿÅü_/ýß³ÿýKø´;îxÄÅ¢×ùôJ`ÿEÿ®óèÿÿ+6¦úãüò5àÿEÿózô/ÿWl
-íÿç?´ÿó¿ò_ccÑ9ÿ×åûÎýxÿÍvý7>þ¯tö%ü_
-,ë_ÎÿÕ½ÊÿªyþK¸JqÆ¢×ü/Þÿ$pÿþ]ò¿æýü äÅÆ¢×ü/üÿþ]ó¿èÿ@ý76¦úgþþo Õ@`,ú/çÿºÜÿûÔÿ!!1 44
öÿrþ¯4ù¿Èÿ×Àü¿ØXô_Îÿu9ÿ+çýKïÿ|\¶ë?9å¥iþcÿKeý]ó¿¸ÿ@þWl,úwÍÿBÿðÅÆ¢ÿrþ¯×ûþ%|þùt|üµÛ< bÑ¿kþ÷?ØÿccÑ¿gþùðÅÆTÿóÌÿ¢ÿSù_±±èß5ÿýK@ý±)´ÿÌÿJSþþo äÅÆ¢ùsþõ ©&42«ôß/¶|ýÁ¨ð¥þ¯¦îýWmÕãÿR°rýÃÃÝïU?åëßuMGÿ_Y [×ÿøíñvwsýtÿeøÒîÞþbÿçõÏMÃù_B]OKÀù?&[õÿìý{Øí¿ïîn¯ïoþúïê¿zÖþ÷ ýk û;6[õ¿?<¾©ù¬×{ü?ØïccÒÿ¢ÓÿªóÎÕ©þWqÿ¯aêþæüúêÿ+?cYý§êêªOSÿ÷ðßÖÔlZÿÓýOíÓÿ[WSÿ/õ? õ/×ÿ{ÿÀüuîh EÿóÈÑ@ÿOl,úwÿ0÷ÿÿ.ù±±èßuþþ? ¿ÅÆ¢×ùÜÿK ÿ76¦úçüîÿ%Ðÿþ]úÿ
îØÚÿËôÿÖÃsâÔÿsbþ³ÝnZü?1±èߥÿùRr¢íú¯æ?´'ÿþ?
-õwÿÀü_ ÌEÿ®óпü_±±è¿ÿë¥ÿ{ö¡ vǸXôï:ÿú¯öÿØXôï:ÿþ/ ø¿bcªÿyÎ ÿCþ¯ØXôï:ÿýKÀÿBûÁùíÉÿÑpþ@þkl,ú/çÿº|ÿgþ
-Þÿc³]ÿÿ+ý_
-þ/õ/çÿê^çñüp>â Eÿ®ù_¼ÿIàþ76ý»äÍû?ùÈÿEÿ®ù_ø?%4(?4ý»æÿ!úolLõ?Ïü/üߪL Eÿåü_ûÿ ò?$¤ùG¦Ðþ_ÎÿÎþ/üÿþËù¿.çåÜ¡ ãý?Ëvý'§ü¯4ù¿*ü_
-,ëïÿÅý¯ò¿bcÑ¿kþúÿ+6ýó½Þÿô/áóϧãã¯ýøÜæIþ=ó¿È×Àþþ]ó¿¨ÿJÀÿSýÏ3ÿþO äÅÆ¢×ü/ô/õǦÐþ_0ÿ+ü5þo äÅÆ¢ùsþõ ©&42kô__-¶|ýÁ¨ð¥þ¯æ4ÿ¹j«ÿKÁÊõ??w¿Wý¯×Uùäÿ«3ùo¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëò5ÌKðOJÿ²UÿÏÞ¿Ýþûîîöúþæ¯ñ®þ«gýçæ¤ÿ.5Ôÿ$ÿúßßÔüKÖë¿É=ùOhþIÿNÿ«Îÿ¹6þáü_%êÏÿs#8ÏP¬ÔÿTÿ_ùËê?UWW}ú¿ÿþO ÖÿtÿSûôÿÖÕ©ÿ·¡þ+Á²þåú/óÆû¿:w4 Æ¢ÏùüW ôÿÄÆ¢ùsÿ/ýÿþ]ç?pÿ/úl,úwÿÀý¿úccªÿyÎàþ_ý¿±±èߥÿ÷<ÿ¡CÿèþM¡ý¿Tÿo_¥zêÿåý_¼ÿä<ýçA(,úwéÿ=ÏàþOCNT #³]ÿÓüùB,ëï:ÿüG ÌEÿ®óпü_±±è¿ÿë¥ÿ{ö¡ vǸXôï9ÿ!Óÿ)ý?6ý{Îèèÿÿ+6¦úçüú?$àÿEÿ®óпü_±)´ÿÿÐ2ÿAÈ¼ä¿ÆÄ¢ÿrþ¯Ë÷ÿ;üxÿÍvý7>þ¯tö%ü_
-,ë_ÎÿÕ½ÊÿÂÿ¯á*}Äþ]ó¿xÿÀýol,úwÉÿ÷ò?$ÿþ]ó¿ðJ`þOl,úwÍÿ"ÿCõߨêù_ø¿%Tz ±è¿ÿërÿïSGþÔ!ÿÈÚÿËù¿Òäÿ"ÿ_üÌÿEÿåü_ó¿rîпñþÉÇe»þSþWæ?vø¿XÖß5ÿû_ äÅÆ¢×ü/ô/ÿWl,ú/çÿz½ÿ7è_ÂçOÇÇ_ûñ¹Í ý»æqÿ#ý?6ý{æÿ¡ÿWlLõ?Ïü/ú?%ÿþ]ó¿Ð¿ÔBûÁü¯4åáÿ0/ù_1±èßeþãÿEý_BªI Ì*ý×-_0*|©ÿ«©»AÿUÓ÷ø¿¬\ÿãááðãp÷{Õaùúw¹ïÇçÿh dýl]ÿã·ÇÛÝÍõÓýáK»{ûY~þ×?7-ïÿÏÿãó8¶êÿÙû÷°ÛßÝÝ^ßßüõ3ÞÕõýÆû¿Äû¿?b³UÿûÃãÉzý7þo
-ä?ÅÆ¤ÿE§ÿuçÿ¶>õ ô/àÅùê çyúêÿ+?cYý§êêªOSÿwjÇùßÔüÙ´þ§ûåÅà5õß|zþ×]MýWeýËõÿ^æ??êêÜÑ þ]ç?àÿ@ÿOl,úwÿ0çÿ.ù±±èßsþCKýO÷±±èßsþCæþ_ý¿±1Õÿç?TÜÿK ÿ76ý»ôÿç?ÿ£îØÚÿËôÿÖÃ@:íÿmÏüg óüSU9ÿày
-þ]úÏó¸ÿÓÀÈl×å4ÿ¡æ?àÿ`YÏùù¿ÿþ=ç?dô/ÿWl,ú/æÿzéÿý_è_§ÝqÇ# .ý{Îh©ÿJ`ÿEÿó:ú¿$àÿ©þç8ÿ!Ñÿ!ÿWl,ú÷ÿС ø¿bShÿ/8ÿ¡æ?pþ0/ù¯1±è¿ÿëòý?çLÿ§Þÿc³]ÿÿ+ý_äÿK°¬9ÿW÷:ÿç¿«ôX`,úwÍÿâýO÷¿±±èß%ÿkÞÿÉÿ@þWl,úwÍÿÂÿ)ù±±èß5ÿü ÔccªÿyæáÿP}èy Æ¢ÿrþ¯Ëý¿OùRü#Shÿ/çÿJgÿþO ó0ÿ/&ýó]ÎÿÊà ý+ïÿ|\¶ë?9å1ÿQeý]ó¿¸ÿ@þWl,úwÍÿBÿðÅÆ¢ÿrþ¯×ûþ%|þùt|üµÛ< bÑ¿gþùïØÿccÑ¿kþõ_ ø¿bcªÿyæÑÿ)ü¯ØXôïÿ
þ% þØÚÿæMþDÿy ÈÿEÿ.óçü/êÿRMhdÖèyâ×
-_êÿjênÐÕû?þ/Öÿñðpøq¸û½î°|ý»Üÿ»ºþw¬¿ëüöx»»¹~ºÿ2|gwï|/ËÏÿóúçüO
-/Îÿ#Wb±QÿÏÖ¿Ýþûîîöúþæïñ®þ«ÿèø3ÞÿUä¿hà}?6õ¿?<¾ù¬×+Þÿ%àÿEÿËNÿëÎÿM?ö·}ÿGÂÅùÿëW¡X§ÿ©ü¿ö3Õª®®ú4õÏê?
-¶¬ÿéú§^þ3XSÿþ3ÖÿrnYõ_Úþ»!ÿaø'þ uîh AÿKÛ·Ìh:ò%ðþþ¶ÿ®ÿ0õÿµ-ó_$0ÿ!6ý/mÿÝ2ÿþ?¿ÅÆ ÿ¥í¿[æ?´=÷ÿèÿ¥þ·°ýwËüü
-ôÿÆÆ ÿ¥í¿[êUþ%à÷MýÿÍößUý¿]3úÿrÛrÿ'a^³ÿg·ãy
-þ¶ÿn9ÿ·ÜÿiÈ
-`d6ë¿rò5íäÿÂÿ'Á°þý_¯òÛþO ÌAÿ>þ¯)ÿéÑ¿ü_±1è¿ÿë¥ÿ{ö¡ vGJ>1èßÇÿuÿÒÿ(ý?6ýûø¿Îó*î$àÿ¥þçâÿò_Çk`ô/ ÿWlú÷ñç?Tè_þ¯ØÙÿËù¿¦û_ü_*æ% ÿ5&ýô]¾ÿç¶§ÿSïÿ±Ù¬ÿà F
/Ïÿ:û¿jü_
-ë_ÐÿÕ½Îÿâù/á*}Äþ]ó¿zÞÿ$pÿþ}ò¿æýü äÅÆ ßü/üþ}ó¿Èÿ@ý76úkþþo Õ@`ú/èÿºÜÿûª'ÿCBêdÊìÿý_éìÿÂÿ)a^æÿÅÄ ÿþ¯Ëù_¹íÑ¿ñþÉÇe³þWþWuòµþ/õ÷ÍÿâþWù_±1èß7ÿýKÀÿþú¿^ïÿ-úðùçÓññ×~|pó$Aÿ¾ù_ÜÿH`ÿAÿ¾ù_Ô%àÿ¥þçÿEÿ§ò¿bcпoþúúcSfÿ/ÿ5ù?ú?$ÌK@þWLú÷ÿ8çQÿj5úOýrÏ×KF
/õ5u7è¿j«ÿë<<~î~¯ú!,_ÿ.÷¹ýuW±þ
-¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëþO /Îÿu=þÓ@(¶êÿÙü÷°ÛßÝÝ^ßßüõ3ÞÕõýÆû¿Äü
-4Äf«þ÷Ç75ÿõúo2ùߨïccÒÿ¢Óÿºó[êÿÃ#úWðâüÿõ+çÿp¬Ôÿt°ò3Õª®®ú4õ§¶¡ÿS¦õ?] Õkê¿ùôü¯»ú¯Ëú/m >ÝðÊ~
-ÜÿK¨sGp`,ú_Ú ü¾þ_Íh3÷ÿèÿEÿKßÕÿËùçþ?ò_50ÿ!6ý/m ^¿ÿ7]KýO÷±±èiðûú5ÿ!wÜÿK ÿ76¦úßÂà÷õÿjþC¸ÿ@ÿol,ú_Ú ¼¡þ:ô/îØÚÿßl ¾ÈÿSWcôç¸ÿçÄüG óüSU»Ýø¡°èiðóæþOCNT #³]ÿÿ«i'ÿþ? õ/çÿzÿ<Ú yþ`þCl,úwñMùomþ%àÿEÿÅü_/ýßçý¿Aÿ>í;q±èßÅÿ5éxDÿ
-ØÿccÑ¿ÿë<ÿ¡£ÿKþ¯Øêþ¯)ÿµOôHÀÿþ]ü_çùúÿ+6
öÿ2þ¯çûßkÎÿæ% ÿ5&ýó]¾ÿçéÿÀûl¶ë¿ññ¥³ÿ«Çÿ¥À²þåü_Ýëü/ÿ®ÒG`±èß5ÿ÷? ÜÿÆÆ¢ü¯óþ_ÿ!ü¯ØXôïÿñJhP~h,úwÍÿ"ÿCõߨêù_ø¿%Tz ±è¿ÿërÿç ¡©Cþ)´ÿó¥³ÿÿ§y ÿþËù¿.çåÑ¿ñþÉÇe»þSþóXÖß5ÿû_ äÅÆ¢×ü/ô/ÿWl,ú/çÿz½ÿ7è_ÂçOÇÇ_ûñ¹Í ý»æqÿ#ý?6ý»æQÿÿ+6¦úgþýÈÿEÿ®ù_è_êM¡ý¿`þ×äÿ¨éÿ0/ù_1±èßeþã9ÿû?
-©&42kôßô-_0*|©ÿ«©»AÿU[eü_
-V®ÿñðpøq¸û½ê°|ý».¥<úÿêñþõ÷gëú¿=Þîn®î¿_ÚÝÛ_Ìòóÿ¼þ¹i8ÿKày-8
-b«þ½»ý÷ÝÝíõýÍ_?ã]ýWÏúÏÃñþ/5ôK þúßßÔüKÖë¿É=þ 4ÅÆ¤ÿE§ÿUçÿܶãû®èÿÑ0-Àׯÿc²RÿSýåg,«ÿT]]¹/ãýßðßVÔlZÿÓýOíÓÿ[û©ÿJ°¬¹þßËüæ?¨¨sGp`,úwÿÿ_ý?±±èßeþÃÜÿKþ»æ?ÄÆ¢×ùÔÿ$PÿEÿ®ó¸ÿ@ÿolLõ?ÏùÜÿK ÿ76ý»ôÿ2ÿA
-Ý?±)´ÿéÿ7vêÿãþOô »þXôïÒÿËü)9QÌvýWNóÚÿÿËú»Î ÿSóbcÑ¿ëüô/ÿWl,ú/æÿzéÿý_è_§ÝqÇ# .ý»ÎÈè_ûl,úwÿÀýü_±1Õÿç?ÔôHÀÿþ=ç?ôè_þ¯ØÚÿÎh§ùÿ%Ìÿ+&ýó]¾ÿ3ÿAïÿ±Ù®ÿÆÇÿÎþ¯ÿKeýËù¿ºWù_äj¸JqÆ¢×ü/Þÿ$pÿþ]ò¿æýü äÅÆ¢×ü/üþ]ó¿Èÿ@ý76¦úgþþo Õ@`,ú/çÿºÜÿûÔÿ!!uÈ?2
öÿrþ¯4ù¿Èÿ×0- óÿ¢bÑ9ÿ×åü¯;ô/a¼ÿGòqÙ®ÿäÿ¦ùþ/õwÍÿâþWù_±±èß5ÿýKÀÿþËù¿^ïÿ
-úðùçÓññ×~|nó$Eÿ®ù_ÜÿH`ÿEÿù_ähÀÿSýÏ3ÿþO äÅÆ¢×ü/ô/õǦÐþ_0ÿ+Mù_ø¿%Ìÿ+&ý»Ìó¿¨ÿKH5 Y¥ÿ¼Øòõ£Âú¿ºô_µUÿKÁÊõ??w¿Wý¯×¥j|þ×ufý%l]ÿã·ÇÛÝÍõÓýáK»{ûY~þ×?7
-ïÿ¦¸ºâüúöþ=ìößww·×÷7ýwõ_=ë?Æû¿þ5PÿÍVýïojþ%ëõßäü' øbcÒÿ¢ÓÿªónÛñý?ÿCô¯`Z ú¿£²RÿSýåg,«ÿT]]õiêÿN-ý6ÿéþ§öéÿ«©ÿúËúëÿ½Ì~
-ÜÿK¨sGp`,úwÿ@þ«ÞÿccÑ¿Ëü9ÿþ? ÌEÿóZêEÿ®ó¸ÿ@ÿolLõ?ÏùÜÿK ÿ76ý»ôÿÎóпºbShÿ/ÕÿÛWMGÿ¯iv;ü?1±èߥÿ÷<ÿû?
-9QÌvýWNóZæ?±¬¿ëüò%0ÿ!6ý»Î@ÿðÅÆ¢ÿbþ¯þïyþúðiwÜñEÿ®óÈÀþþ=ç?tÜÿHÀÿSýÏqþC¢ÿCþ¯ØXôï9ÿ¡CÿðŦÐþ_pþCÿKÈ´ ä¿FÅ¢ÿrþ¯Ë÷ÿ3ýxÿÍvý7>þ¯töõø¿XÖ¿ÿ«{ÿÅó_ÂUú,0ý»æñþ'ûߨXôïÿuÞÿÿü¯ØXôïÿñJhP~h,úwÍÿ"ÿCõߨêù_ø¿%Tz ±è¿ÿërÿç ¡©Cþ)´ÿó¥³ÿÿ§iÿþËù¿.çåÑ¿ñþÉÇe»þSþWü_-þ/õwÍÿâþWù_±±èß5ÿýKÀÿþËù¿^ïÿ
-úðùçÓññ×~|nó$Eÿ®ù_ÜÿH`ÿEÿ®ù_Ô%àÿ©þçÿEÿ§ò¿bcÑ¿kþúúcShÿ/ÿ&ÿþo Óÿþ]æ?ó¿¸ÿÓj@#³FÿõrË×
-_êÿjêqþsÕô̰rýÃÃÝïU?åëßå¾ÿu=>ÿY¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏë÷ óü3®çÿplÕÿ³÷ïa·ÿ¾»»½¾¿ùëg¼«ÿê?úþ÷©æþ_ͱ٪ÿýáñMÍ¿d½þæ@ÿ±1éÑéÝù¿Oýã#ýxqþÿúó8Vêªÿ¯üeõª««1÷eÔjê?6ÿéþ§öéÿ==ÿ뮦þ+Á²þåú/óù¯êÜÑ þ=ç?´Ôÿ%Ðÿþ]æ?ÿ!
ù±±èßsþCKýOõÿØXôï9ÿþ
-ôÿÆÆTÿsÿPqÿ/þߨXôïÒÿ{ÿÀüW
-tÿĦÐþ_¦ÿ·ÞìÿÃÿ£a^ªj·ÿÁó ý»ôÿç?pÿ§!'*Ù®ÿÊiþC;ÍÀÿ'Á²þóÿ©ù±±èßsþCFÿðÅÆ¢ÿbþ¯þïÙÿ
þ%|Úw<âbÑ¿çüüw ìÿ±±èßuþý_ðÅÆTÿóÿ@ÿü_±±èßuþúÿ+6
öÿóÚiþç óÿþËù¿.ßÿóð @ÿ
-xÿÍvý7>þ¯töÕø¿XÖ¿ÿ«{ÿÅó_ÂUú,0ý{æeÞÿ$pÿþ]ò¿æýü äÅÆ¢×ü/üþ]ó¿Èÿ@ý76¦úgþþo Õ@`,ú/çÿºÜÿûÉÿ:äBû9ÿW:û¿ðJù1±è¿ÿërþ×ðúþ%÷ÿH>.Ûõò¿ÿ¨Ä²þ®ù_ÜÿJ ÿ+6ý»æ¡ ø¿bcÑ9ÿ×ëý¿Fÿ>ÿ|:>þÚÏm±èß5ÿû ìÿ±±èß5ÿú¯ü_±1Õÿ<ó¿èÿ@þWl,úwÍÿBÿPl
-íÿó¿&ÿG¢ÿC¼äÅÄ¢ùsþõ ©&42kôÚů?¾ÔÿÕÔÝ ÿªþð X¹þÇÃÃáÇáî÷ªÂòõïr?Íÿ¬Çþ_Ößëüöx»»¹~ºÿ2|iwo1ËÏÿóúç¦!ÿAÂóÿxHãüúöþ=ìößww·×÷7ýwõ_ýGÿÃñþ/ÕôKàþ?6[õ¿?<¾©ù¬×;ü?ÈIÿNÿëÎÿm5¾ÿç1ýøãü?vó<ÅJýOõÿ±¬þSuuÕ§©ÿ;µãû?õ6ÿéþ§vÿÐOóèÿ`Yÿrý¿ùÌPQçàÀXôï:ÿÿ¿ê±±èßeþÃÜÿËýæ?ÄÆ¢×ùøÿ$þþ]ç?pÿ/þߨêó¸ÿ@ÿol,úwéÿeþºbShÿ/Óÿ[ÿì¦ùø4ÌKpòÿäÿ'ý»ôÿ2ÿAJNT #³]ÿÓüvòáÿ`Y×ùä¿H`þCl,úwÿþ%àÿEÿÅü_/ýß³ÿýKø´;îxÄÅ¢Ïùú¯öÿØXôï:ÿþ/ ø¿bcªÿyÎ ÿCþ¯ØXôï:ÿýKÀÿBûÁùÿ«æü/a^ò_cbÑ9ÿ×åû?óTðþíúoò¿Îþ¯ÿËúóu¯ó¿xþK¸JqÆ¢×ü/Þÿ$pÿþ]ò¿æýü äÅÆ¢×ü/üÿþ]ó¿Èÿ@ý76¦úcþùª=ÀXô_Îÿu¹ÿ÷©#ÿCBêd
-íÿåü_éìÿÂÿ)a^æÿÅÄ¢ÿrþ¯Ëù_9gô/a¼ÿGòqÙ®ÿäÿUMþ¯
-ÿËú»æqÿ+ü¯ØXôïÿ
þ%àÿEÿåü_¯÷ÿýKøüóéøøk?>·yÄ¢×ü/î$°ÿÇÆ¢×ü/ê¿ðÅÆTÿóÌÿ¢ÿSù_±±èß5ÿýK@ý±)´ÿÌÿüþ óÿþ]æ?Îù_Ôÿ%¤ÐȬÒÿÇů?¾ÔÿÕÔÝ ÿª2þ/+×ÿxx8ü8Üý^õCX¾þ]î»4úÿêqþëïÏÖõ?~{¼ÝÝ\?ݾ´»·¿åçÿyýsÓÒÿ)áÅùÿêjü§PlÕÿ³÷ïa·ÿ¾»»½¾¿ùëg¼«ÿê?úþ÷©áþOͱ٪ÿýáñMÍ¿d½þÜSÿÿ'6&ý/:ý¯;ÿ·õ©þ_%ü^ÿÇîoÎÿÁX©ÿ©þ¿ò3Õª®®Æ{ÿQÿÃKÿ§Mëºÿ©}úësÿ/õ_ õ/×ÿ{ÿÐpÿ/¢Î
-À±èßuþ÷ÿxÿEÿ.óÎý¿
-÷ÿþ=ç?Ðÿ«û¿ØXôï9ÿþ_
-ôÿÆÆTÿóÿÀý¿úccÑ¿Kÿï<ÿýK û'6
öÿbý¿ýðï±ÿúy þ©ªÝnüÏPXôïÒÿ;ÏàþOBNT #³]ÿÓüöäÿÂÿ§Á²þóc ÏÌEÿó:ô/ÿWl,ú/æÿzéÿý_è_§ÝqÇ# .ý»ÎÈè_ûl,úwÿ@ÿü_±1Õÿç?ÔÜÿJÀÿþ=ç?ôè_þ¯ØÚÿÎhOþó¿y ÈEÿåü_ïÿ9wôJàý?6Ûõßøø¿ÒÙÿð)°¬9ÿW÷*ÿ«æù/á*}Äþ]ó¿xÿÀýol,úwÉÿ÷ò?$ÿþ]ó¿ðJhP~h,úwÍÿ"ÿCõߨêù_ø¿%Tz ±è¿ÿërÿïSGþÔ!ÿÈÚÿËù¿RKþy ÿþËù¿.çåÜ¡ ãý?Ëvý'§ü/æ?*±¬¿kþ÷¿ÈÿEÿ®ù_è_þ¯ØXô_ÎÿõzÿoпÏ?¿öãs'A@,úwÍÿâþGûl,ú÷Ìÿ"ÿCþ¯Øêù_ôJ ÿ+6ý»æ¡ ¨?6
öÿù_ÿ£¦ÿC¼äÅÄ¢ùsþõ ©&42kôß\-¶|ýÁ¨ð¥þ¯¦îýWmÕáÿR°rýÃÃÝïU?åëßu©N£ÿ¯û
ÿY¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëú?4Ï_í?óZpÅVý?{ÿvûï»»Ûëû¿~Æ»ú¯õ?ãýßð2þPÿÍVýïojþ%ëõßäü ä?ÅÆ¤ÿE§ÿUçÿܶãûÿпi¾~åüúêÿ+?cYý§êêªOSÿ÷ðßÿ/aÓúîjþßúÜÿKýWeýËõÿ^æ?4ùêÜÑ þÿðïþØXôï2ÿaîÿÅÿ+ù±±èùÿ~EÿÌø÷CÿolLõ?æ?üë¡ÿ76ý»ôÿÎóпºbShÿ/Óÿ[o¹9õÿ±ÿk8ß¿fü?1±èߥÿ÷<ÿû?
-9QÌvýWNóÚÿÿËú3ÿáßóbcÑ?óþýàÿEÿÅü_/ýßÌòiwÜñEÿÌø÷ÃþþÿðïÿWlLõ?æ?üëÁÿþÿðïÿWl
-íÿç?´'ÿù¯Îç/ò_bÑ9ÿ×åûÎýxÿÍvý7>þ¯töÿ/Á²þåü_Ýëü/ÿ®ÒG`±èß3ÿ«ãýO÷¿±±èß%ÿkÞÿÉÿ@þWl,úwÍÿÂÿ)ù±±èß5ÿþ ÔccªÿyæáÿP}èy Æ¢ÿrþ¯Ëý?ùRü#Shÿ/çÿJgÿþO Ó0ÿ/*ýó]ÎÿʹCÿÆû$íúONù_iÿØãÿR`Y×ü/î%ÿþ]ó¿Ð¿ü_±±è¿ÿëõþß >íÇç6OXôïÿÅýöÿØXôïÿEýWþ¯Øêù_ôJ ÿ+6ý»æ¡ ¨?6
öÿù_éäÿ¨ñK8¿Èÿ
-Eÿ.óçü/êÿRMhdÖè¿«[¾þ`TøRÿW3lüU]µUÿKÁÊõ??w¿Wý¯7¬ýÃÀú+غþÇo·»ë§û/Ãv÷ö³üü?¯nÿ¥¡m§%àüúöþ=ìößww·×÷7ýwõ_=ë?Æû¿Dÿº¿c³UÿûÃãÉzý7ú¿òbcÒÿ¢ÓÿªóÎÕ©þW%ò$|ýÊù?2+õ?ÕÿW~ƲúOÕÕU¦þïÔ6õÖÿtÿ³¼¼¦þëjêÿ¥þ+Á²þåú/óû¿:w4 Æ¢Ïùû ôÿÄÆ¢ùsþþ? ÌEÿóZú%þþ]ç?pÿ/þߨêó¸ÿ@ÿol,úwéÿç? tÿĦÐþ_¦ÿ·çþ?îÿ4ä<-þXôïÒÿ{ÿÀý¨ Ff»þ+§ùíäÿÂÿ'Á²þ®ó*ÿ
-ÿþ]ç? ø¿bcÑ1ÿ×Kÿ÷<ÿýKø´;îxÄÅ¢×ùä¿H`ÿEÿó:î$àÿ©þç8ÿ!Ñÿ!ÿWl,ú÷ÿС ø¿bShÿ/8ÿ¡æ?pþ@þkl,ú/çÿº|ÿÏù¯xÿÍvý7>þ¯töõø¿XÖ¿ÿ«{ÿÅó_ÂUú,0ý»æñþ'ûߨXôïÿuÞÿkò?$ÿþ=ó¿2þO ÌÿEÿ®ù_äH þSýÏ3ÿÿ·ê #cÑ9ÿ×åþ?ÎBÿ
-Rü#Shÿ/çÿJgÿþO ÌÿEÿåü_ó¿rÎè_Âxÿäã²]ÿÉ)ÿ+Mþ¯ÿËú»æqÿ+ü¯ØXôïÿ
þ%àÿEÿåü_¯÷ÿýKøüóéøøk?>·yÄ¢×ü/î$°ÿÇÆ¢×ü/ê¿ðÅÆTÿóÌÿ¢ÿSù_±±èß5ÿýK@ý±)´ÿÌÿJÿÿ·ò¿bcÑ¿ËüÇsþ÷RMhdVéùÈÇ?¾ÔÿÕÔÝ ÿªþ/+×ÿxx8ü8Üý^õCX¾þ]פ<úÿê\³þ
-¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëæiHód¶êÿÙû÷°ÛßÝÝ^ßßüõ3ÞÕõ¬ÿ<üïÿRMýOÝß±ÙªÿýáñMÍ¿d½þܳÿK ù+6&ý/:ý¯:ÿç\êù/èÿÍJýOõÿ±¬þSuu5æ¾ýß©¥ÿSæõ?ÝÿÔ>ý¿u5õÿRÿ`Yÿrý¿ùÃOý_B;cÑ¿ëüò_%Ðÿþ]æ?ÌùôÿI`þCl,ú÷ÿÐ2ÿIõÿØXôï9ÿù¿èÿ©þç9ÿû ôÿÆÆ¢þßyþú@÷Ol
-íÿ¥úûÔæ©ÿú§%Àÿþ]úçùÜÿIÈ
-`d¶ëy3ð¨ðåóZæ?±¬¿çüDþ£æ?ÄÆ¢ÏùÌÿÒÿ+6ýó½ôÏþ/ô/áÓî¸ãþ]ç?ÿ&ý?6ý»Î ÿKþ¯Øêó¸ÿÿ+6ý»Î@ÿðŦÐþ_pþCËü!ä¿ÆÆ¢ÿrþ¯Ë÷ÿ<þðþíúo|ü_éìÿÊø¿XÖ¿ÿ«{ÿÅó_ÂUú,0ý»æñþ'ûߨXôïÿ5ïÿäH ÿ+6ý»æáÿÐ üÐXôïÿEþ꿱1Õÿ<ó¿ðK¨>002ýó]îÿ}êÈÿ:äBû9ÿWjÉÿÂü¿ØXô_Îÿu9ÿ+çþ%÷ÿH>.Ûõò¿Òäÿªñ)°¬¿kþ÷¿ÈÿEÿ®ù_è_þ¯ØXô_Îÿõzÿ¯Ñ¿Ï?¿öãs'A@,úwÍÿâþGûl,úwÍÿ¢þ+ÿWlLõ?Ïü/ú?%ÿþ]ó¿Ð¿ÔBûÁü¯4ù¿ðK ÿ+6ý»Ìó¿¨ÿKH5 Y£ÿº]lùúQáKý_MÝ
-ú¯Ú*áÿR°rýÃÃÝïU?åëßuU׿®ÿë/`ëú¿=Þîn®î¿_ÚÝÛ_Ìòóÿ¼þ¹aþy þ_8
-b«þ½»ý÷ÝÝíõýÍ_?ã]ýWÏúÏÃñþ/áÿÑ@þKl¶êx|Só/Y¯ÿ&÷ä¿H`¿IÿNÿ«Îÿ¹mñü_ÿ¢áùü?7ó<ÅJýOõÿ±¬þSuu5Îýû¿SÛ´ÔlZÿÓýOíÓÿ[WSÿ/õ_ õ/×ÿ{ÿ0üÈPçàÀXôï:ÿþ ôÿÄÆ¢ùsÿ/ý?ÿþ]ç?àÿ@ø[l,ú÷ÿÿWý¿±1Õÿ<ç?pÿ/þߨXôïÒÿ;Ï@ÿèþM¡ý¿XÿoßçSÿ_CýO¼ÿä<ýçA(,úwéÿç?pÿ'!'*Ù®ÿÊiþC;ù¿ðÿI°¬¿ëüú?%0ÿ!6ý»Î@ÿðÅÆ¢ÿbþ¯þïÙÿ
þ%|Úw<âbÑ¿ëüú?%°ÿÇÆ¢×ùôIÀÿSýÏsþ÷¿ðÅÆ¢×ùè_þ¯ØÚÿÎh§ùÿ%ÌK@þkL,ú/çÿº|ÿÏè_ïÿ±Ù®ÿÆÇÿÎþ¯ÿKeýËù¿º×ù_<ÿ%\¥8ÀcÑ¿kþï¸ÿEÿ.ù_óþ
Oþò¿bcÑ¿kþþO ÌÿEÿù_äh þSýÏ3ÿÿ·êCÏ 0ýó]îÿ}êÈÿ:äBû9ÿW:û¿ðJù1±è¿ÿërþWÎýKïÿ|\¶ë?9å1ÿQeý]ó¿¸ÿ@þWl,úwÍÿBÿðÅÆ¢ÿrþ¯×ûþ%|þùt|üµÛ< bÑ¿kþ÷?ØÿccÑ¿kþõ_ ø¿bcªÿyæÑÿ)ü¯ØXôïÿ
þ% þØÚÿæMþþ óÿþ]æ?Îù_Ôÿ%¤ÐȬÑÓ-¶|ýÁ¨ð¥þ¯¦îýWmÅüG +×ÿxx8ü8Üý^õCX¾þ]7üßÑÿW·=ë¯`ëú¿=Þîn®î¿_ÚÝÛ_Ìòóÿ¼þ¹©yÿ0- at JÿÌkÁi [õÿìý{Øí¿ïîn¯ïoþúïê¿zÖþ÷©áþ_õ¿ØlÕÿþðø¦æ_²^ÿMîÉ@óWlLú_tú_uþÏm;¾ÿçú¿i¾~åüúêÿ+?cYý§êêjû5Þÿ¥¶¡þ#aÓúîjþßúÜÿKýWeýËõÿ^æ?Göuîh Eÿ®ó¨ÿK ÿ'6ý»Ì ÿW
-óbcÑ¿çüLýOõÿØXôï:ÿû ôÿÆÆTÿóÿÀý¿úccÑ¿Kÿï<ÿýK û'6
öÿRý¿}Õ¦©ÿó¿óýkÆÿþ]úçùÜÿIÈ
-`d¶ë¿rÿÐNþ/ü,ëï9ÿ¡fþ§æ?ÄÆ¢Ïùúÿ+6ýó½ô÷ÿýKø´;îxÄÅ¢×ùä¿K`ÿEÿ®óèÿÿ+6¦úçüú?$àÿEÿ®óпü_±)´ÿÿÐNþ/Îÿ¦ ÿ5*ýó]¾ÿçÜÑÿ)÷ÿØl×ããÿJÿ«ð)°¬9ÿW÷*ÿüO
-Wé#°ÀXôïÿÅûîccÑ¿Kþ×¼ÿÓÿ'ü¯ØXôïÿ
ÿSBòCcÑ¿kþù¨ÿÆÆTÿóÌÿÂÿ-¡úÐó Eÿåü_û:ò?$¤ùG¦Ðþ_ÎÿÎþ/ü¦`þ_T,ú/çÿºÿsFÿÆû$íúONù_iÊÿÊø¿XÖß5ÿû_ äÅÆ¢×ü/ô/ÿWl,ú/çÿz½ÿ7è_ÂçOÇÇ_ûñ¹Í ý»æqÿ#ý?6ý»æQÿÿ+6¦úcþýÈÿEÿù_=úúcShÿ/ÿuÿÿ[¹ KþWP,úwÿ8çQÿj@#³Jÿ[¾þ`TøRÿWSwþ«¶bþ£ë<<~î~¯ú!,_ÿ®K§õ¯ëü7 [×ÿøíñvwsýtÿeøÒîÞþbÿçõÏMCþi®®8ÿÇd«þ½»ý÷ÝÝíõýÍ_?ã]ýWÏúÏÃñþ/5ÜÿK þúßßÔüKÖë¿É=û¿òbcÒÿ¢ÓÿªónÛÓùx ÓÐÿúêÿ+?cYý§êêªOSÿ÷ðßÖÔlZÿÓýOíÓÿ[WSÿ/õ_ õ/×ÿ{ÿÐäüW uîh Eÿóÿ¥þØXôï2ÿþ_)ÌEÿ®ó¨ÿI ü-6ý»Îàþ_ý¿±1Õÿ<ç?pÿ/þߨXôïÒÿ;Ï@ÿèþM¡ý¿Tÿo_÷Äu¦þ'bZÝÿOL,úwéÿ=ÏàþOCNT #³]ÿÓüöäÿÂÿ§Á²þ®óÈÀüØXôï:ÿýKÀÿþù¿^ú¿gÿúðiwÜñEÿ®óÈÀþþ=ç?ôôIÀÿSýÏsþ÷¿ðÅÆ¢×ùè_þ¯ØÚÿÎh'ÿç ÓÿþËù¿.ßÿsîèÿÀûl¶ë¿ññ¥³ÿ«Áÿ¥À²þåü_Ýëü/ÿ®ÒG`±èß5ÿ÷? ÜÿÆÆ¢ü¯y
ÿ'ÿCù_±±èß5ÿÿ§æÄÆ¢×ü/ò?$Pÿ©þçÿ
ÿ[Bõ¡çþËù¿.÷ÿAþäHHòL¡ý¿ÿ+µä ùQ±è¿ÿërþWÎú0Þÿ#ù¸l×rÊÿJÿ«Âÿ¥À²þ®ù_ÜÿJ ÿ+6ý»æ¡ ø¿bcÑ9ÿ×ëý¿Aÿ>ÿ|:>þÚÏm±èß3ÿüw
-ìÿ±±èß5ÿú¯ü_±1Õÿ<ó¿èÿ@þWl,úwÍÿBÿPl
-íÿó¿ÒÉÿQãÿ0- ù_Q±èßeþãÿEý_BªI Ìý/w|ýɨð¥þ¯¦îýWMjñ)X·þÇÃÃáÇáî÷ºÂòõïºÑÿÆç?ëïÏÆõ?~{¼ÝÝ\?ݾ³»w¾åçÿyýsÝòþ/a^æà4ú¶þ=ìößww·×÷7ÿwõ_=ë?Æû¿ªåþOïû±Ù¨ÿýáñmÍ¿d½þ\±ÿK@ÿ±±èÙéÕù?7ýØÿÝö
-þ? çÿ¯_ybþ§òÿÚÏXVÿ©ººêÓÔÿ¶§þ£`Ëú®êå?5õßá?cý/çõW`Xÿ¥í¿ò¶&ÿQB;cÐÿÒöß-óîÿ5Ðÿþ¶ÿ®ÿ0õÿµ
-þ? ÌAÿKÛ·ÌÈôÿjà¾?6ý/mÿÝ2ÿ¡¥ÿWý¿±±Ôÿ¶ÿnÿÐÑÿ«þߨô¿´ýwKý¯¢ÿWÝ?±)³ÿ¿Ùþ»ÜÿSÿlêqÿoÿ¤a^³ÿg·ãy
-þ¶ÿn9ÿÿ+"'*Ù¬ÿÊÉÿÕ´'ÿþ?
-õ/èÿzÿÜ6ç¿æ?ÄÆ ÿ×ÿÖôè_þ¯Øô_ÎÿõÒÿ}Þÿ[ô/áÓîHÉ'0ýûø¿Îó_ºý+`ÿAÿ>þ¯iþCÛÓÿ%ÿWl,õ?ÿ×ÿÚÿ¬ÿWlú÷ñMõ¿ªGÿðŦÌþ_Èÿõ|ÿÛó¿y ÈAÿý_ïÿ¹íéÿÀûl6ë¿ñÊÿü_Ãÿÿ Ãúôu¯ò¿ÈÿÔp>â Aÿ¾ù_¼ÿIàþ76ýûäÍû?ùÈÿAÿ¾ù_ø?%4(?4ýûæÿ!úol,õ?×ü/üߪ=Àô_Ðÿu¹ÿ÷UOþÔ!ÿÈÙÿú¿ÒÙÿ
ÿS¼ÌÿAÿý_ó¿rÛ¡ ãý?Ëfý'¯ü¯jÊÿjñ)0¬¿oþ÷¿ÈÿAÿ¾ù_è_þ¯Øô_ÐÿõzÿoÑ¿Ï?¿öã'A@ú÷ÍÿâþGûlú÷Íÿ¢þ+ÿWl,õ?Ïü/ú?5ÿþ=ó¿R
þ% þØÙÿKæMþþ óÿþ}æ?Îù_Ôÿ%¤ÐȬÑÝ-÷|½dTøRÿWSwþ«¶jð)X¹þÇÃÃáÇáî÷ªÂòõïºê´þuY [×ÿøíñvwsýtÿeøÒîÞþbÿçõÏ
-ó?5<ÿÛvú§PlÕÿ³ùïa·ÿ¾»»½¾¿ùëg¼«ÿêYÿyø3Þÿ%ô¯üØlÕÿþðø¦æ_²^ÿMæý_þØô¿èô¿êü*üçÿ*Qÿð|þÿúó@Vêº XùËê?UWW}ú¿Óiþõ6ÿé¨^ü3XSÿÍõ©ÿ·k¨ÿI°¬ÿÒàÓ
-ߪüá§ÿ_B;cÑÿÒà÷õÿjþCÉÀûl,ú_Ú ü®þ_Î8÷ÿÕÌÀüØXô¿´xýþßt-ýðûÆÆ¢ÿ¥
-ÀïëÿÕüæ¿ ÿ76¦úßÂà÷õÿjþC¸ÿ@ÿol,ú_Ú ¼¡þ:ô/îØÚÿßl ¾ÈÿSo§ûß+êÿæ%øgøÊOð<
EÿK7ÿ3÷r¢íú¯|ü_M;ù¿ðÿI°¬9ÿ׫üçÑÈó_ óbcÑ¿ÿkÊk;ô/ÿWl,ú/æÿzéÿ>ïÿä¿jø´;îxÄÅ¢ÿפÿ.Óÿ)ý?6ý»ø¿¦ù
Ìÿ+6¦úÿkÊíýðÅÆ¢ÿ×yþCþ%àÿM¡ý¿ÿëùþ7çó¿y ÈEÿåü_ïÿ9gú?%ðþíúo|ü_éìÿêñ)°¬9ÿW÷:ÿç¿«ôX`,úwÍÿâýO÷¿±±èß%ÿë¼ÿ×äH ÿ+6ý{æeüÿþ]ó¿Èÿ@ý76¦úgþþo Õ@`,ú/çÿºÜÿÇ9@è_Aêd
-íÿåü_éìÿÂÿ)a^æÿÅÄ¢ÿrþ¯Ëù_9gô/a¼ÿGòqÙ®ÿäÿ&ÿWÿKeý]ó¿¸ÿ@þWl,úwÍÿBÿðÅÆ¢ÿrþ¯×ûþ%|þùt|üµÛ< bÑ¿kþ÷?ØÿccÑ¿kþõ_ ø¿bcªÿyæÑÿ)ü¯ØXôïÿ
þ% þØÚÿæ¥Éÿ
ÿ[¼äÅÄ¢ùçü/îÿ4¤ÐȬѳÜòõ£Âú¿ºô_5=ù_V®ÿñðpøq¸û½ê°|ý»n8(þ¿:'Ö_ÁÖõ?~{¼ÝÝ\?ݾ´»·¿åçÿyýsSóþ/áùüuÅù? [õÿìý{Øí¿ïîn¯ïoþúïê¿zÖþ÷üo
-ä¿Äf«þ÷Ç75ÿõúo¸ÿþccÒÿ¢Óÿªónf<ÿ/è_Áóùþï¬ÔÿTÿ_ùËê?UWWcîËØÿÚ¦¦þ£`Óúîjþߺ:õÿÖÔ%XÖ¿\ÿïeþÃðSàþOB;cÑ¿ëüò%Ðÿþ]æ?Ìùä?K`þCl,ú÷ÿÐâÿ@ø[l,ú÷ÿÀü7
-ôÿÆÆTÿsÿPqÿ/þߨXôïÒÿ{ÿ@þ³ºbShÿ/ÕÿÛïþ§þ¿Äù_¼ÿìvÓ?x¢þßyþ÷r¢íú¯æ?´Óüü,ëï9ÿ!ÿ*ù±±èßsþùÏðÅÆ¢ÿbþ¯þïÙÿ
þ%|Úw<âbÑ¿çüþO ìÿ±±èßuþý_ðÅÆTÿóÿ@ÿü_±±èßuþúÿ+6
öÿóÚiþç óÿþËù¿.ßÿsÎôJàý?6Ûõßøø¿ÒÙÿÕàÿR`Yÿrþ¯îuþÏ Wé#°ÀXôïÿÅûîccÑ¿Kþ×¼ÿÓÿ'ü¯ØXôïÿ
ÿSó?bcÑ¿kþù¨ÿÆÆTÿóÌÿÂÿ-¡úÐó Eÿåü_û:ò?$¤ùG¦Ðþ_ÎÿÎþ/üæ%`þ_L,ú/çÿºÿ úW0Þÿ#ù¸l×rÊÿJÿ«Âÿ¥À²þ®ù_ÜÿJ ÿ+6ý»æ¡ ø¿bcÑ9ÿ×ëý¿Fÿ>ÿ|:>þÚÏm±èß3ÿüw
-ìÿ±±èß5ÿú¯ü_±1Õÿ<ó¿èÿ@þWl,úwÍÿBÿPl
-íÿó¿Ò4ÿÿ·y ÈÿEÿ.óçü/êÿRMhdÖè¿]ùõ£Âú¿ºô_µó%¬\ÿãááðãp÷{Õaùúw]òèÿ«3ë/aëú¿=Þîn®î¿_ÚÝÛ_Ìòóÿ¼þ¹i¸ÿ0~ýãÑÿy-8
-b«þ½»ý÷ÝÝíõýÍ_?ã]ýWÏúÏÃñþ/¡
-½f«þ÷Ç75ÿõúorOþ£ü?±1éÑéÕù?·Ý©þ_qÿ¯aüúÇÖoÎÿ1Y©ÿ©þ¿ò3Õª®®ú4õ§¶ÉÔlZÿÓýOíÓÿ[WSÿ/õ? õ/×ÿ{ÿÐ10ìÿêÜÑ þ]ç?pþÀûl,úwÿ@ÿ¯æ?ÄÆ¢×ùä¿K ü-6ý{Î ÿYý¿±1Õÿç?$îÿ%Ðÿþ]úçùè_Ý?±)´ÿêÿí«nêÿÃÿ«aüúw;ü?Q±èߥÿwÿÀý¨ Ff»þ+§ùíäÿÂÿ'Á²þ®óÈÀüØXôï:ÿýKÀÿþù¿^ú¿gÿúðiwÜñEÿ®óÈÀþþ]ç?Ðÿ%ÿWlLõ?ÏùôHÀÿþ]ç? ø¿bShÿ/8ÿ¡=ù?jÎÿƯü׸Xô_Îÿuùþs¦ÿSïÿ±Ù®ÿåà F
/ö¥³ÿ«Ãÿ¥À²þåü_Ýëü/ÿ®ÒG`±èß5ÿ÷? ÜÿÆÆ¢ü¯óþ_Óÿ'ü¯ØXôïÿ
ÿSBòCcÑ¿kþù¨ÿÆÆTÿóÌÿÂÿ-¡úÐó Eÿåü_û:ò?$¤ùG¦Ðþ_ÎÿÎþ/üƯùq±è¿ÿërþW@ÿ
-Æû$íúONù_iò5ø¿XÖß3ÿû_
-äÅÆ¢Ïü/æ¿hÀÿþËù¿^ïÿä¿køüóéøøk?>·yÄ¢×ü/î$°ÿÇÆ¢×ü/ê¿ðÅÆTÿóÌÿ¢ÿSù_±±èß5ÿýK@ý±)´ÿÌÿJÿÿ·ñë'ÿ+.ý»Ì<çqÿ§!Õ$Ffþ;¾þdTøRÿWSwþ«fÿÿËuë<<~î~¯û!,_ÿ.w]ý©gý%l\ÿã·ÇÛÝÍõÓýá;»{ç{Y~þ×?×ø¿5ÌKp>ÿ'îc±QÿÏÖ¿Ýþûîîöúþæïñ®þ«ÿèø3ÞÿU-úÀû~l6êx|[ó/Y¯ÿ±þÐüþþ×ÿ~ìÿnûÿóÿׯ<B±NÿSùíg,«ÿT]]õiêÿ5õ[ÖÿtýS/ÿ¬©ÿÿë§þÖßÃú/mÿÝÿ0üüG uîh AÿKÛ·Ìhzîÿ%PïAÿKÛ×ÍúÿÚÿæ?ÄÆ ÿ¥í¿[æ?dò_5PÿAÿKÛ·Ìh{îÿ%ÐÿKýoaûïù]Íý¿úccÐÿÒöß-õ¿ªGÿèþMýÿÍößUý¿]sÿ0>.пy Îþy ÿ¥í¿[Îÿ-÷r¢Íú¯ü_§ý Áÿ¥À°þý_¯òÛóæ?ÄÆ ÿ×ÿ6¶ ø¿bcÐ9ÿ×Kÿ÷ìÿBÿ>í;q1èßÇÿuÿÒõè_ûlú÷ñç?TôIÀÿKýÏÅÿ5å¿v
-ýðÅÆ ÿ×yþC
þ%àÿMý¿ÿ+Ïþ/Îÿæ% ÿ5&ýô]¾ÿç¶§ÿSïÿ±Ù¬ÿÆ+ÿëìÿjð)0¬AÿW÷:ÿç¿«ôX`ú÷ÍÿâýOï{±1èß'ÿkÞÿÉÿ@þWlú÷ÍÿÂÿ)¡Aù¡1èß7ÿü Ôcc©ÿ¹æáÿP}èy Æ ÿþ¯Ëý¿OùRü#Sfÿ/èÿJgÿþO ó0ÿ/&ýô]ÎÿÊmþ%÷ÿH>.õ¼ò¿ªÿ«íñ)0¬¿oþ÷¿ÈÿAÿ¾ù_è_þ¯Øô_ÐÿõzÿoÑ¿Ï?¿öã'A@úwÍÿ"ÿ]ûlú÷Íÿ¢þ+ÿWl,õ?×ü/ú?%ÿþ}ó¿Ð¿Ô2ûÉü¯ÉÿÑÐÿ!
a^ò¿bbпÏüÇ9ÿú¿T 5úOõrÏ×KF
/õ5u7è¿jÆþOü_þ¬\ÿãááðãp÷{Õaùúw¹?ÿh dýl]ÿã·ÇÛÝÍõÓýáK»{ûY~þ×?7äÿkøãüRUqÅVý?ÿvûï»»Ûëû¿~Æ»ú¯þ£ÿáÏxÿjò_$ð¾úßßÔüKÖë¿ÉïÿhþIÿNÿëÎÿmu:ÿÐè_Àçÿ¯_9ÿc¥þ§±¬þSuuÕ§©ÿ;µM¢þ£`Óú.×Ôÿõ¿®¡þ'Á²þKO7|«òþ uîh EÿKß×ÿ«ùmKþ£ê±±èið»ú9ÿáÜÿW3ÿEóbcÑÿÒàõûÓÿ¨úl,ú_Ú ü¾þ_ÍÈû ôÿÆÆTÿ[Ø ü¾þ_Íè+îÿ%Ðÿþ6 o¨ÿ¥þ%ÐýBûÿ
-À£ÂöÿvýiÿÏ5ýÿæ%8ùrÆÿþ6 o8ÿgîÿ4äD02Ûõ_ùø¿vòáÿ`Yÿrþ¯WùÏ9qþÀüØXôïâÿòßÚþ%àÿEÿÅü_/ýß³ÿýKø´;îxÄÅ¢ÿפÿ®¥ÿSûl,úwñç?tôIÀÿSýÏÃÿ5å¿öþ ø¿bcÑ¿ÿë<ÿ¡CÿðŦÐþ_Ìÿ5Ýÿæ\sþ0/ù¯1±è¿ÿëòý? ô¯÷ÿØl×ãÿuöÕø¿XÖ¿ÿ«{ÿÅó_ÂUú,0ý{æeÞÿ$pÿþ]ò¿æýü äÅÆ¢×ü/üþ]ó¿Èÿ@ý76¦úgþþo Õ@`,ú/çÿºÜÿûÉÿ:äBû9ÿW:û¿ðJù1±è¿ÿërþ×ðúþ%÷ÿH>.Ûõò¿ªÿ«îð)°¬¿kþ÷¿ÈÿEÿ®ù_è_þ¯ØXô_Îÿõzÿ¯Ñ¿Ï?¿öãs'A@,úwÍÿâþGûl,úwÍÿ¢þ+ÿWlLõ?Ïü/ú?%ÿþ]ó¿Ð¿ÔBûÁü¯Éÿèÿ0/ù_1±èßeþãÿEý_BªI Ìý×ýbË×
-_êÿjênÐÕü_V®ÿñðpøq¸û½ê°|ý»®jóèÿ«Çþ_Ößëüöx»»¹~ºÿ2|iwo1ËÏÿóúç¦!ÿAÂóùÿêjú§PlÕÿ³÷ïa·ÿ¾»»½¾¿ùëg¼«ÿêYÿyø3Þÿ¥úò_b³UÿûÃãÉzý7¹gÿÿ'6&ý/:ý¯:ÿçv8øçÿþ
-Ïçÿ±÷ó8Vêªÿ¯üeõª««>Mýß©mzê?
-6ÿéþ§öéÿ§þßú¯Ëúëÿ½Ììÿ
-êÜÑ þ]ç?àÿÀûl,úwÿ0÷ÿÒÿ'ù±±èßsþó4þþ=ç?Ðÿ£þߨêó÷ÿèÿEÿ.ý¿çùú@÷Ol
-íÿ¥úûªúÿÈÿÓ0/Á?»Ýô¡°èߥÿwÿÀý¨ Ff»þ+§ùíäÿÂÿ'Á²þóÿ¥ù±±èßsþù¯ðÅÆ¢ÿbþ¯þïóþß vǸXôï9ÿü7
-ìÿ±±èßuþý_ðÅÆTÿóÿ@ÿü_±±èßuþúÿ+6
öÿóÚÉÿÅù_Â¼ä¿ÆÄ¢ÿrþ¯Ë÷ÿ;ú?%ðþíúo|ü_iòµþ/õ/çÿê^åÕ<ÿ%\¥8ÀcÑ¿kþï¸ÿEÿ.ù_óþOþò¿bcÑ¿kþþO ÌÿEÿ®ù_äH þSýÏ3ÿÿ·êCÏ 0ýó]îÿ}êÈÿ:äBû9ÿW:û¿ðJù1±è¿ÿërþWÎýKïÿ|\¶ë?9å¥)ÿ+ãÿR`Y×ü/î%ÿþ]ó¿Ð¿ü_±±è¿ÿëõþß >íÇç6OXôïÿÅýöÿØXôïÿEýWþ¯Øêù_ôj ÿ+6ý{æõè_êM¡ý¿`þWbþ£y ÈÿEÿ.óçü/êÿRMhdVé?/¶|ýÁ¨ð¥þ¯¦îýWíðJÿKÀÊõ??w¿Wý¯×UõÉÿW·øÿ$l]ÿã·ÇÛÝÍõÓýáK»{ûY~þ×?75ýßÏÿuÍù? [õÿìý{Øí¿ïîn¯ïoþúïê¿zÖþ÷©¡þ'üØlÕÿþðø¦æ_²^ÿMîÉÀ~þþWÿsÛ4ãù¿JÔÿ$<ÿéÿÉJýOõÿ±¬þSuuÕ§©ÿ;µôjØ´þ§ûÚ§ÿ·®¦þ_ê¿,ë_®ÿ÷2ÿ¡Éä¿i¨sGp`,úwÿ@ý_ý?±±èßeþÃÿAÿæ?ÄÆ¢Ïù-ó$þþ]ç?pÿ/þߨêó¸ÿ@ÿol,úwéÿç? tÿĦÐþ_¦ÿ·ÞR>õÿUäÿHàÝnúÏPXôïÒÿ;ÏàþOBNT #³]ÿÓüùB,ëï9ÿ!qþÀüØXôï9ÿù_ðÅÆ¢ÿbþ¯þïÙÿ
þ%|Úw<âbÑ¿ëüú?%°ÿÇÆ¢×ùôIÀÿSýÏqþC¢ÿCþ¯ØXôï9ÿ¡CÿðŦÐþ_pþCËü!óÿþËù¿.ßÿsÎôJàý?6Ûõßøø¿ÒÙÿ
ÕáÿR`Yÿrþ¯îuþÏ Wé#°ÀXôïÿÅûîccÑ¿Kþ×yÿgþ·ò¿bcÑ¿kþþO ÌÿEÿ®ù_äH þSýÏ3ÿÿ·êCÏ 0ýó]îÿ}êÈÿ:äBû9ÿW:û¿ðJù1±è¿ÿërþW@ÿ
-Æû$íúONù_ÌTbYÏü/î5ÿþ=ó¿ÿ¢ÿWl,ú/çÿz½ÿ7è_ÂçOÇÇ_ûñ¹Í ý»æqÿ#ý?6ý»æQÿÿ+6¦úgþýÈÿEÿ®ù_è_êM¡ý¿`þ×äÿ¨éÿ0/ù_1±èßeþã9ÿû?
-©&42kôßv-_0*|©ÿ«©»AÿU[1ÿQÂÊõ??w¿Wý¯×ÕMýõxÿÃúû³uýßow7×O÷_/íîí/fùù^ÿÜ4ÿ%Lg³áü?¯§PlÕÿ³÷ïa·ÿ¾»»½¾¿ùëg¼«ÿêYÿyø3Þÿ¥û ½f«þ÷Ç75ÿõúorOþ£òbcÒÿ¢Óÿªón»Óù¿âþ_Ãøõßÿc²RÿSýåg,«ÿT]]õiêÿþÛúMëºÿ©}úësÿ/õ_ õ/×ÿ{ÿ0þØÿÔ¹£80ý»Îàü/þØXôï2ÿþ_)ÌEÿó2÷ÿEÿ®ó¸ÿ@ÿolLõ?ÏùÜÿK ÿ76ý»ôÿÎóпºbShÿ/Óÿ[o}ú©ÿI8ݾfü?Q±èߥÿwÿÀý¨ Ff»þ+§ùíÉÿ
ÿOeý]ç?0ÿSóbcÑ¿ëüô/ÿWl,ú/æÿzéÿý_è_§ÝqÇ# .ý»Î ÿ]ûl,úwÿ@ÿü_±1Õÿç?pÿ«ÿWl,ú÷ÿУ ø¿bShÿ/8ÿ¡ü_ÿ%LÏfü_Q±è¿ÿëòý?çþO ¼ÿÇf»þÿW:û¿þ/õ/çÿê^å1ÿKÃUú,0ý»æñþ'ûߨXôïÿ5ïÿäH ÿ+6ý»æáÿÀüØXôïÿEþ꿱1Õÿ<ó¿ðK¨>ô< cÑ9ÿ×åþß§ü ©Cþ)´ÿó¥ÉÿEþ¿ñëgþ_\,ú/çÿºÿsþ%÷ÿH>.Ûõò¿Ò4ÿ±Ãÿ¥À²þ®ù_ÜÿJ ÿ+6ý»æ¡ ø¿bcÑ9ÿ×ëý¿Aÿ>ÿ|:>þÚÏm±èß5ÿû ìÿ±±èß3ÿü
-ø¿bcªÿyæÑÿ)ü¯ØXôïÿ
þ% þØÚÿæ¥)ÿÿ·éÙÿ+*ý»Ìó¿¨ÿKH5 Y£ÿ´<òëF
/õ5u7è¿júÿë<<~î~¯ú!,_ÿ
.÷ÿ¯Îä¿IغþÇo·»ë§û/Ãv÷ö³üü?¯nÈÿÕ0/Á?Ó:pþÆVý?{ÿvûï»»Ûëû¿~Æ»ú¯þ£ÿáÏxÿxÿ×Àýl¶êx|Só/Y¯ÿ&Óÿæ¯Øô¿èô¿îüßVãû^Ñ¿?Îÿc#8ÏP¬ÔÿTÿ_ùËê?UWW}ú¿S;Îÿ¦þãϦõ?ÝÿÔNóú©ÿ7³þ
-,ë_®ÿ÷2ÿaø)àÿPçàÀXôï:ÿÿ¿ê±±èßeþÃÿAþ»æ?ÄÆ¢Ïù-þ? ÔÿccÑ¿çüÌý¿úccªÿ9Ψ¸ÿ@ÿol,úwéÿ=Ï ÿGÝ?±)´ÿéÿvõ©ÿ¯âü/a^ÿg·Ãÿþ]úÏó¸ÿÓÀÈl×å4ÿ¡ü_øÿ$XÖßsþCbþ¯æ?ÄÆ¢ÏùýKÀÿþù¿^ú¿gÿúðiwÜñEÿóZú?%°ÿÇÆ¢Ïùý_ðÅÆTÿsÿèÿÿ+6ý{Îèпü_±)´ÿÿÐNó8ÿKü×Xô_Îÿuùþs¦ÿSïÿ±Ù®ÿåà F
/Ïÿ:û¿ü_
-,ë_ÎÿÕ½Îÿâù/á*}Äþ]ó¿xÿÀýol,úwÉÿ÷úÿ$ÿþ]ó¿ðJhP~h,úwÍÿ"ÿCõߨêù_ø¿%Tz ±è¿ÿërÿïSGþÔ!ÿÈÚÿËù¿ÒÙÿ
ÿS¼ÌÿEÿåü_ó¿òð @ÿ
-Æû$íúONù_ÕÉÿU÷ø¿XÖß5ÿû_ äÅÆ¢×ü/ô/ÿWl,ú/çÿz½ÿ×è_ÂçOÇÇ_ûñ¹Í ý{æÿ®ý?6ý»æQÿÿ+6¦úgþýÈÿEÿ®ù_è_êM¡ý¿`þ×äÿHôHü¯Xôï2ÿqÎÿ¢þ/!Õ$FfþÛ¼Øòõ£Âú¿ºô_µÃ#ÿë<<~î~¯ú!,_ÿ®«ë<úÿêñùÏúû³uýßow7×O÷_/íîí/fùù^ÿÜ4¼ÿKýÿÌkÁi [õÿìý{Øí¿ïîn¯ïoþúïê¿zÖþ÷©áþOBFï¡ÙªÿýáñMÍ¿d½þܳÿK ù+6&ý/:ý¯:ÿç¶õ+ú4_ÿØöÍù?&+õ?ÕÿW~ƲúOÕÕU¦þïÔ6ôJØ´þ§ûÚ§ÿ·úê¿,ë_®ÿ÷2ÿ¡áþ_D;cÑ¿ëüÎÿèÿEÿ.óæþ_ò_%0ÿ!6ý{Î ÿWõÿØXôï9ÿþ_
-ôÿÆÆTÿsÿ@ÿ¯úccÑ¿Kÿï<ÿýK û'6
öÿ2ý¿õð&ÐuSÿ/õ? ã׿ÛáÿEÿ.ý¿óüîÿ$äD02Ûõ_9Íh'ÿþ? õ÷ÿP'ÿ
-ÿþ=ç?tè_þ¯ØXô_ÌÿõÒÿ}Þÿô/áÓî¸ãþ]ç?´è_ûl,úwÿ@ÿü_±1Õÿ<ç?pÿ+ÿWl,úwÿþ%àÿM¡ý¿àüöäÿ¨9ÿK¾~ü_Q±è¿ÿëòý?çþO ¼ÿÇf»þÿWü_m
ÿKeýËù¿ºWù_5Ï Wé#°ÀXôïÿÅûîccÑ¿Kþ×¼ÿÿ!ü¯ØXôïÿ
ÿSBòCcÑ¿kþù¨ÿÆÆTÿóÌÿÂÿ-¡úÐó Eÿåü_û:ò?$¤ùG¦Ðþ_ÎÿÎþ/üƯùq±è¿ÿërþWÎýKïÿ|\¶ë?9å¥)ÿ+ãÿR`Y×ü/î%ÿþ]ó¿Ð¿ü_±±è¿ÿëõþß >íÇç6OXôïÿÅýöÿØXôïÿEýWþ¯Øêù_ôj ÿ+6ý{æõè_êM¡ý¿`þWü_ø¿%L_?þ¯¨Xôï2ÿqÎÿ¢þ/!Õ$Ffþûů?¾ÔÿÕÔãüçª:ü_
-V®ÿñðpøq¸û½ê°|ý»®nòèÿ«;òß$l]ÿã·ÇÛÝÍõÓýáK»{ûY~þ×?7
-ùOƯÿêóT¶êÿÙû÷°ÛßÝÝ^ßßüõ3ÞÕõ¬ÿ<üïÿô¯ £÷ÐlÕÿþðø¦æ_²^ÿMîñÿH ÿ)6&ý/:ý¯:ÿçqð÷pþ¯ÿ¥aüúéÿËJýOõÿ±¬þSuuÕ§©ÿ{øoõÖÿtÿSûôÿÖÕÔÿKýWeýËõÿ^æ?0ÿAE;cÑ¿ëüÎÿèÿEÿ.óæþ_òß%0ÿ!6ý»ÎÀÿ'ð·ØXôï:ÿû ôÿÆÆTÿóÿÀý¿úccÑ¿Kÿ/ó¤ÐýBûþßzxNϱÿ/qÿ'aüúw;ü?Q±èߥÿùRr¢íú¯æ?´'ÿþ?
-õwÿÀü_ ÌEÿ®óпü_±±è¿ÿë¥ÿ{ö¡ vǸXôï:ÿü ìÿ±±èßsþùÏðÅÆTÿóÿ@ÿü_±±èßuþúÿ+6
öÿóÚÿ£áü/aüúÉEÿåü_ïÿÌPÁûl¶ë¿ññ¥³ÿ«Æÿ¥À²þåü_Ýëü/ÿ®ÒG`±èß3ÿ«ãýO÷¿±±èß%ÿkÞÿÉÿ@þWl,úwÍÿÂÿ)ù±±èß5ÿü ÔccªÿyæáÿP}èy Æ¢ÿrþ¯Ëý?ùRü#Shÿ/çÿJgÿþO ã×Ïü¿¸Xô_Îÿu9ÿ+çýKïÿ|\¶ë?9å¥iþcÿKeý]ó¿¸ÿ@þWl,úwÍÿBÿðÅÆ¢ÿrþ¯×ûþ%|þùt|üµÛ< bÑ¿kþ÷?ØÿccÑ¿kþõ_ ø¿bcªÿyæÑÿ)ü¯ØXôïÿ
þ% þØÚÿæ¥ÿ£Æÿ-aüúÉÿEÿ.óçü/êÿRMhdÖè?/·|ýÁ¨ð¥þ¯fØø«ºj+æ?JX¹þÇÃÃáÇáî÷ªÂòõïº:Ïÿzü?¬¿ëüöx»»¹~ºÿ2|iwo1ËÏÿóú禡ÿ[Âtúçüúöþ=ìößww·×÷7ýwõ_=ë?Æû¿Tsÿ/öÏØlÕÿþðø¦æ_²^ÿ
-ó¿DàÿIÿNÿ«Îÿ¹íOýßù/¦îoÎÿQY©ÿ©þ¿ò3Õª®®ú4õ§vôÿSÿñgÓúîjþߺú©ÿJ°¬¹þßËü
á§@þ«:w4 Æ¢ÏùÿÞÿccÑ¿Ëüò?¤0ÿ!6ý{Îh¹ÿ@ø[l,ú÷ÿ@ÿ¿úccªÿyÎàþ_ý¿±±èߥÿwÿþ%ÐýBû©þß>ÕSÿ/þ
-UµÛKÿ'&ý»ôÿç?pÿ§!'*Ù®ÿÊiþC;ù¿ðÿI°¬¿çüÎÿþ=ç?dô/ÿWl,ú/æÿzéÿý_è_§ÝqÇ# .ý»Î ÿ]ûl,ú÷ÿÐÑÿ%ÿWlLõ?Çùþ ø¿bcÑ¿çüò5àÿM¡ý¿àüvÿÀù_ù¯±±è¿ÿëòý? ¼ÿÇf»þÿW:û¿2þ/õ/çÿê^çñüp>â Eÿ®ù_¼ÿIàþ76ý»äÍû?ùÈÿEÿ®ù_ø?%4(?4ý{æÿ¡úolLõ?Ïü/üߪ=ÀXô_Îÿu¹ÿ÷©#ÿCBb hh
-íÿåü_éìÿÂÿ)ù±±è¿ÿërþWÎýKïÿ|\¶ë?9å¥ÉÿUãÿR`Y×ü/î%ÿþ]ó¿Ð¿ü_±±è¿ÿëõþ_£ >íÇç6OXôïÿÅýöÿØXôïÿEýWþ¯Øêù_ôJ ÿ+6ý»æ¡ ¨?6
öÿù_ÓüÇÿ·ò¿bcÑ¿ËüÇ9ÿú¿T Uú¯[¾þ`TøRÿWSwþ«¶Âÿ%aåú»ß«~Ë׿ëêîäÿ«ÇüÖßëüöx»»¹~ºÿ2|iwo1ËÏÿóúç¦áü/aXÄù?.[õÿìý{Øí¿ïîn¯ïoþúïê¿zÖþ÷©!ÿAí±ÙªÿýáñMÍ¿d½þܳÿK ù+6&ý/:ý¯:ÿç¶?õWôÿh ÿ;6+õ?ÕÿW~ƲúOÕÕÕ8÷kìÿN-ùÿ6ÿéþgy1xMý7×ý¿B,ë_®ÿ÷2ÿ¡ÉÌÿÔPçàÀXôÏü?ôÿÄÆ¢ùsÿ/þ_ ÌEÿÌø÷Cý?6ý3ÿáßý¿±1Õÿÿð¯þߨXôïÒÿ;Ï@ÿèþM¡ý¿Tÿoêþ_!Uó¸øbbÑ¿Kÿï<ÿû? 9QÌvýWNóÚÉÿ
ÿOeýÿðïù±±èùÿ~ðÅÆ¢ÿbþ¯þoæ?Hù´;îxÄÅ¢æ?üûaÿEÿÌø÷ÿ+6¦úóþõàÿEÿÌø÷ÿ+6
öÿóÚÉÿÅù_ù¯±±è¿ÿëòý?çLÿ§Þÿc³]ÿÿ+ý_þ/õ/çÿê^çñüp>â Eÿ®ù_¼ÿIàþ76ý»ä÷ÿü äÅÆ¢×ü/üþ]ó¿èÿ@ý76¦úgþþo Õ@`,ú/çÿºÜÿûÔÿ!!1 44
öÿrþ¯töáÿÀü¿ØXô_Îÿu9ÿ+ ãý?Ëvý'§ü¯4ù¿ü_
-,ëïÿÅý¯ò¿bcÑ¿gþó_4àÿEÿåü_¯÷ÿýKøüóéøøk?>·yÄ¢×ü/î$°ÿÇÆ¢×ü/ê¿ðÅÆTÿóÌÿ¢ÿSù_±±èß5ÿýK@ý±)´ÿÌÿJÿÿ·ò¿bcÑ¿ËüÇsþ÷RMhdÖèùÄÇ?¾ÔÿÕÔÝ ÿªIø¿$¬[ÿãááðãp÷{ÝaùúsFÿoÆù¬¿?×ÿøíñvwsýtÿeøÎîÞù^ÿçõÏuËù_¼çóâ>0õÿlý{Øí¿ïîn¯ïoþþïê¿úþ?ãý_Õÿ ÷ýØlÔÿþðø¶æ_²^ÿM®Øÿ% ÿØXô¿ìô¿îüßôcÿwÛ3ÿWÃÅùÿëW¡X§ÿ©ü¿ö3Õª®®ú4½ÿ§¦%ÿ_Âõ?]ÿÔËkê¿ÃÆú_¬¿ Ãú/mÿÝÿдä¿h¨sGp`ú_Úþ»eþCÃüo
-ÔûccÐÿÒößuó¦þ¿¶Áÿ+ù±1èiûïù9Sÿ@ø[lú_Úþ»eþCÛsÿ/þߨXêÛ·ÌèèÿÑ@ÿolú_Úþ»¥þWõè_Ý?±)³ÿ¿Ùþ»ªÿ·KyÜÿÛ÷ óý?9ó<
AÿKÛ·ÿ[îÿ4äD02õ¿¢xTøòùíÉÿ
ÿOaýú¿^å?·ä?k`þClú÷ñMùoMþ%àÿAÿåü_/ýßçý¿Eÿ>í;q1èßÇÿuÿÂüo
-ìÿ±1èßÇÿ5Íh{ú¿$àÿ¥þçâÿò_»þ ø¿bcпÿkªÿU=úÿ+6eöÿrþ¯éþ7ô¯`^ò_cbÐAÿ×åûn;üxÿÍfý7^ù_gÿWÿKaýú¿º×ù_<ÿ%\¥8ÀcпoþïxßAÿ>ù_çý¿!ÿCù_±1èß5ÿùþ}ó¿Èÿ@ý76úkþþo Õ@`ú/èÿºÜÿûª'ÿCBêdÊìÿý_éìÿÂÿ)a^æÿÅÄ ÿþ¯Ëù_¹íпñþÉÇe³þWþW5ù¿ü_
-ëïÿÅý¯ò¿bcпoþúÿ+6ýô½Þÿ[ô/áóϧãã¯ýøàæIþ}ó¿¸ÿÀþþ}ó¿¨ÿJÀÿKýÏ5ÿþO äÅÆ ßü/ô/õǦÌþ_2ÿkò4ôHü¯ôï3ÿñÿÅýT 5úoêå¯
-_êÿjênÐÕÿOø¿¬\ÿãááðãp÷{Õaùúw]Õ7£ÿ¯Î5ë¯`ëú¿=Þîn®î¿_ÚÝÛ_Ìòóÿ¼þ¹aþ§ùØÿϼB±UÿÏæ¿Ýþûîîöúþæ¯ñ®þ«gýçáÏxÿÿ¡ú_l¶êx|Só/Y¯ÿ&ÿý>6&ý/:ý¯:ÿç¶ßÿóh Fÿ¦øúóLVêº XùËê?UWW}ú¿SÛÐÿ)aÓú.×Ôs}êÿíê¿,ë¿´øt÷*ÿaø)pÿ/¡Î
-À±èiðûú5ÿ¡ÍÜÿKÀïþ6 ¿«ÿóÎýä¿j`þCl,ú_Ú ¼~ÿoÆr!ú@ø[l,ú_Ú ü¾þ_ÍÈû ôÿÆÆTÿ[Ø ü¾þ_Íè+îÿ%Ðÿþ6 o¨ÿ¥þ%ÐýBûÿ
-À£ÂöÿöÕ©ÿ'çú¿óýkÆÿþ6 o8ÿgîÿ4äD02Ûõ_ùø¿vòáÿ`Yÿrþ¯WùÏ9eÿ
-ÿþ]ü_Sþ[Ñ¿ü_±±è¿ÿë¥ÿ{ö¡ vǸXôïâÿôßeò_$°ÿÇÆ¢ÿ×4ÿ!wôIÀÿSýÏÃÿ5å¿öþ ø¿bcÑ¿ÿkªÿ¥ýKÀÿBû)ÿ×ùþ7çó¿iÈEÿåü_ïÿ9gú?%ðþíúo|ü_éìÿjñ)°¬9ÿW÷:ÿç¿«ôX`,úwÍÿâýO÷¿±±èß%ÿkÞÿÉÿ@þWl,úwÍÿÂÿ)¡Aù¡±èß5ÿü Ôccªÿ9æ%üߪ=ÀXô_Îÿu¹ÿ÷©#ÿCBêd
-íÿåü_éìÿÂÿ)aZ æÿEÅ¢ÿrþ¯Ëù_9gô/a¼ÿGòqÙ®ÿäÿ&ÿWÂÿ¥À²þ®ù_ÜÿJ ÿ+6ý»æ¡ ø¿bcÑ9ÿ×ëý¿Fÿ>ÿ|:>þÚÏm±èß5ÿû ìÿ±±èß5ÿú¯ü_±1Õÿ<ó¿èÿ@þWl,úwÍÿBÿPl
-íÿó¿ÒäÿÂÿ-á\%ÿ+(ý»Ìó¿¨ÿKH5 Y£ÿöãbË×
-_êÿjNó«vìÿÂÿåÏÊõ??w¿Wý¯×Õã_×õØÿËúû³uýßow7×O÷_/íîí/fùù^ÿÜ4ä?H¿üq 8ÿÇd«þ½»ý÷ÝÝíõýÍ_?ã]ýWÏúÏÃñþ/5ÿ%ÐþúßßÔüKÖë¿É=ù/ØïccÒÿ¢ÓÿªónûSÿwÅü_
-cï7çÿ¸¬ÔÿTÿ_ùËê?UWWã½ÿøþ?ü·
-õÖÿtÿSûôÿÖ§úßø3`ýXÖ¿\ÿïeþCÃü/uîh EÿóÈÓ@ÿOl,úwÿpîÿmèÿÀüØXôï9ÿùEÿó:îÿ%ÐÿSýÏsþ÷ÿèÿEÿ.ý¿óüô/îØÚÿËôÿÖÃs¢êNýäÿj¨ªÝn\ü?1±èߥÿ÷<ÿû?
-9QÌvýWNóÚÉÿ
ÿOeý=ç?àÿÖÀüØXôï9ÿ¡CÿðÅÆ¢ÿbþ¯þïÙÿ
þ%|Úw<âbÑ¿çüüG ìÿ±±èßsþCOÿü_±1Õÿç?ÔôHÀÿþ=ç?ôè_þ¯ØÚÿÎ8å?åó¿ò_ccÑ9ÿ×åûÎÌÒÀûl¶ë¿ññ¥³ÿ«Åÿ¥À²þåü_Ýëü/ÿ®ÒG`±èß5ÿ÷? ÜÿÆÆ¢ü¯yÿ§ÿOù_±±èß5ÿÿ§åÆ¢×ü/ò?$Pÿ©þçÿUãÿP}èy Æ¢ÿrþ¯Ëý¿O=ù@CShÿ/çÿJgÿþO ÌÿEÿåü_ó¿rîпñþÉÇe»þSþWü_ ÿËú»æqÿ+ü¯ØXôïÿ
þ%àÿEÿåü_¯÷ÿýKøüóéøøk?>·yÄ¢×ü/î$°ÿÇÆ¢×ü/ê¿ðÅÆTÿóÌÿ¢ÿSù_±±èß5ÿýK@ý±)´ÿÌÿJÿÿ·ò¿bcÑ¿ËüÇ9ÿú¿T 5úï[¾þ`TøRÿWSó«vx%Àÿ%`åú»ß«~Ë׿ÖôÿÖuÛ³þ
-¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëæjNÿÿ£²UÿÏÞ¿Ýþûîîöúþæ¯ñ®þ«gýçáÏxÿxÿ×@÷wl¶êx|Só/Y¯ÿ&Óÿæ¯Øô¿èô¿êüsuªÿ`ô/`êþæüúêÿ+?cYý§êêªOSÿwjÇùßÔüÙ´þ§ûÚ§ÿwªÿu
-õ_ õ/×ÿ{ÿÐdö
-uîh Eÿó2þ ôÿÄÆ¢ùsþ÷ÿþ=ç?´øÿ$PÿEÿ®ó¸ÿ@ÿolLõ?Çùû ôÿÆÆ¢þßóüò4ÐýBûþßzxN4ùÔÿÿ,a· ÿOL,úwéÿ=ÏàþOÃð EñÙ®ÿÊiþC;ù¿ðÿI°¬¿çüÄü_ ÌEÿó2úÿ+6ýó½ôÏþ/ô/áÓî¸ãþ=ç?dê¿ØÿccÑ¿çüþ/ ø¿bcªÿ9ÎHôHÀÿþ=ç?tè_þ¯ØÚÿÎhOþæ?i ÿ56ýó]¾ÿçéÿÀûl¶ë¿ññ¥³ÿ«Ãÿ¥À²þåü_Ýëü/ÿ®ÒG`±èß5ÿ÷? ÜÿÆÆ¢ü¯óþ_ÿ!ü¯ØXôïÿ
ÿSBòCcÑ¿kþù¨ÿÆÆTÿóÌÿÂÿ-¡úÀÀÈXô_Îÿu¹ÿ÷©#ÿCBêd
-íÿåü_éìÿÂÿ)ù±±è¿ÿërþW@ÿ
-Æû$íúONù_iò5ø¿XÖß3ÿû_
-äÅÆ¢Ïü/æ¿hÀÿþËù¿^ïÿ
-úðùçÓññ×~|nó$Eÿ®ù_ÜÿH`ÿEÿ®ù_Ô%àÿ©þçÿEÿ§ò¿bcÑ¿kþúúcShÿ/ÿ&ÿþo äÅÆ¢ùçü/îÿ4¤ÐȬÑn[¾þ`TøRÿWSwþ«vx$àÿ°rýÃÃÝïU?åëßuëßèÿ«3ùo¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëü' ãÉó\¶êÿÙû÷°ÛßÝÝ^ßßüõ3ÞÕõ¬ÿ<üïÿRÃû¿Ú?c³UÿûÃãÉzý7¹Çÿ#ü§Øô¿èô¿ªþ<ÿ`ô/ ª¦pÎÿ1Y©ÿ©þ¿ò3Õª®®ú4õ§¶é©ÿ(Ø´þ§ûÚ§ÿ·®¦þ_ê¿,ë_®ÿ÷2ÿù*êÜÑ þ]ç?àÿ@ÿOl,úwÿ0çÿ.ù±±èßsþCÆÿ'ð·ØXôï:ÿû ôÿÆÆTÿóÿÀý¿úccÑ¿Kÿ/ó¤ÐýBûþßzxNÿûÿïÿª*çq ðÿÄÄ¢þ_æ?HÉ
-`d¶ë¿rÿÐNþ/ü,ëï:ÿù¿ÿþ]ç? ø¿bcÑ1ÿ×Kÿ÷<ÿýKø´;îxÄÅ¢×ùôJ`ÿEÿ®óèÿÿ+6¦úçüú?$àÿEÿ®óпü_±)´ÿÿÐNó8ÿK ÿ56ýó]¾ÿ3ÿAïÿ±Ù®ÿÆÇÿ&ÿW[áÿR`Yÿrþ¯îUþWÍó_ÂUú,0ý»æñþ'ûߨXôïÿ5ïÿäH ÿ+6ý»æáÿÀüØXôïÿEþ꿱1Õÿ<ó¿ðK¨>ô< cÑ9ÿ×åþß§ü ¡)´ÿó¥³ÿÿ§æÿÅÆ¢ÿrþ¯Ëù_9gô/a¼ÿGòqÙ®ÿäÿ¦ü¯ÿKeý]ó¿¸ÿ@þWl,úwÍÿBÿðÅÆ¢ÿrþ¯×ûþ%|þùt|üµÛ< bÑ¿kþ÷?ØÿccÑ¿kþõ_ ø¿bcªÿ9æÑÿ©ü¯ØXôïÿÕ£ ¨?6
öÿù_iòáÿ@þWl,úwÿ8çQÿj@#³FÿW_2*|©ÿ«©»AÿUS7ø¿¬[ÿãááðãp÷{Ýaùúw¹O£ÿ·N}Íú+ظþÇo·»ë§û/Ãwv÷Î÷²üü?¯®3ïÿæ%8ÿSâüú¶þ=ìößww·×÷7ÿwõ_ýGÿÃñþ¯"ÿE÷ÿ±Ù¨ÿýáñmÍ¿d½þ¿¼ÿK`¿EÿËNÿëÎÿm5¾ÿ·}Cþ?Îÿc+8ÏP¬ÓÿTþ_ûËê?UWW}ú¿gAGýGÁõ?]ÿÔËkê¿ÃÆú_îë¯À°þKÛ7ä?ÿdÿW0(àÀô¿´ýwËü¦Çÿ#ú_lú_Úþ»nþÃÔÿ×¶ÌÀüØô¿´ýwËüúÿDþþ¶ÿnÿPqÿ/þߨXêÛ·ÌèÈÿÑ@ÿolú_Úþ»¥þ*ô/îØÙÿßlÿ]ÕÿÛåzÜÿ[üÿæ%8ùrÆÿþ¶ÿn9ÿ·ÜÿiÈ
-`d6ë¿rò5íÉÿ
ÿOaýú¿^å?·-ç? ÌAÿ>þ¯óü
-ýKÀÿþËù¿^ú¿Ïû?õ
-vǸôïãÿ:ÏééÿÀþþ}ü_çùý_ðÅÆRÿsñMù¯]Cÿü_±1èßÇÿuÿP¡ ø¿bSfÿ/çÿîsÛrþ0/ù¯11è¿ ÿëòý?·=ýxÿÍfý7^ù_gÿWÿKaýú¿º×ù_<ÿ%\¥8Àcпoþï¸ÿAÿ>ù_çý¿%ÿCù_±1èß5ÿùßþ}ó¿Èÿ@ý76úkþþo Õ@`ú/èÿºÜÿûTÿ!!uÈ?2eöÿþ¯töáÿ0/óÿbbÐAÿ×åü¯Üöè_Âxÿäã²YÿÉ+ÿ«ü_
-þ/õ÷ÍÿâþWù_±1èß7ÿýKÀÿþú¿^ïÿýKøüóéøøk?>¸yÄ ßü/î$°ÿÇÆ ßü/ê¿ðÅÆRÿsÍÿ¢ÿSù_±1èß7ÿýK@ý±)³ÿÌÿü-ýæ% ÿ+&ýûÌÎÿû?
-©&42kôÿq¹åëF
/õ5u7è¿jêÿuë<<~î~¯û!,_ÿ.÷©ý©gþ§ëüöx»»¹~ºÿ2|gwï|/ËÏÿóúçá
-ý_Áçÿºæüúöþ=ìößww·×÷7ÿwõ_ýGÿÃñþ¯Ê¼ÿKàþ?6õ¿?<¾ù¬×ÿðü ì÷±±èÙéÝù¿Æ÷ÿ¶o8ÿKøãüOÿw8Öéªÿ¯ýeõª««>Mýßóü [ÖÿtÿS{ÍèOý¿]Íú+0¬ÁþßËüáø%J£80ý3ÿá¿ÔÿbcпÏü9ÿÿ¯æ?ÄÆ æ?ü7ð·ØôÏüÿÐÿKýùÿ~èÿAÿ>ý¿óüô/îØÙÿõÿÖÃ?óÉÿß6ÿ%ÌKpòÿìvøaпOÿï<ÿû? 9QÌfýW^óÚiþþ? õgþÃÿþÿðß ü_±1è¿ÿë¥ÿùR>í;q1èùÿ
-`ÿAÿÌøo þ¯ØXêÌø÷ÿ+6ý3ÿá¿ø¿bSfÿ/9ÿ¡æ?pþ0/ù¯11è¿ ÿëòý?çþO ¼ÿÇf³þ¯ü¯ÉÿÕUø¿Ö¿ ÿ«{ÿÕòüp>â Aÿ¾ù_¼ÿIàþ76ýûäÍû?ýÈÿAÿ¾ù_ø?%4(?4ýû
æÿ!úol,õ?×ü/üߪ=Àô_Ðÿu¹ÿ÷©"ÿCBêdÊìÿý_éìÿÂÿ)a^æÿÅÄ ÿþ¯Ëù_¹íÑ¿ñþÉÇe³þWþW5åµø¿Öß7ÿû_ äÅÆ ßü/ô/ÿWlú/èÿz½ÿgô/áóϧãã¯ýøàæIþ}ó¿¸ÿÀþþ}ó¿¨ÿJÀÿKýÏ3ÿþO
-äÅÆ ×ü¯þ% þØÙÿKæMþþ óÿþ}æ?Îù_Ôÿ%¤ÐȬÑÛ.÷|½dTøRÿWSwþ«vìÿÄÿåÏÊõ??w¿Wý¯×Õuýu&ÿMÂÖõ?~{¼ÝÝ\?ݾ´»·¿åçÿyýóø`ÿpZt>ÿpÅVý?ÿvûï»»Ûëû¿~Æ»ú¯õ?ãý_jÈÑ{h¶êx|Só/Y¯ÿ&÷¼ÿK ù+6&ý/:ý¯:ÿç¶;ÿGK0ú0~ýcÛ7çÿ¬Ôÿt°ò3Õª®®ú4õ§¶é¨ÿ(Ø´þ§ zñÏ`Mý7×§þß®¡þ+Á²þKO7|«òþ uîh EÿKß×ÿ«ùmæü/þØXô¿´ø]ý¿ÿpîÿãþOóbcÑÿÒàõûÓÿ¨úl,ú_Ú ü¾þ_Ïè¸ÿ@ÿolLõ¿
-ÀïëÿÕü>qÿ/þߨXô¿´xCý/uè_Ý?±)´ÿ¿Ù <*|aÿo_õ'ÿO®©ÿK8ݾfü?Q±èiðóæþOCNT #³]ÿÿ«i'ÿþ? õ/çÿzÿ<Ú yþ`þCl,úwñç?tè_þ¯ØXô_ÌÿõÒÿ}Þÿô/áÓî¸ãþ]ü_þ÷@ô¯ý?6ý»ø¿Îó:ú¿$àÿ©þçáÿò_ûDÿü_±±èßÅÿuÿС ø¿bShÿ/åÿ:ßÿæ\sþpZò_ÃbÑ9ÿ×åûÎþO ¼ÿÇf»þÿW:û¿zü_
-,ë_ÎÿÕ½Îÿâù/á*}Äþ]ó¿xÿÀýol,úwÉÿ:ïÿ5ùÈÿEÿù_ÿ§åÆ¢×ü/ò?$Pÿ©þçÿ
ÿ[Bõ¡çþËù¿.÷ÿqúW:äBû9ÿW:û¿ðJ¿~æÿÅÅ¢ÿrþ¯Ëù_9gô/a¼ÿGòqÙ®ÿäÿ&ÿWÿKeý]ó¿¸ÿ@þWl,úwÍÿBÿðÅÆ¢ÿrþ¯×ûþ%|þùt|üµÛ< bÑ¿kþ÷?ØÿccÑ¿kþõ_ ø¿bcªÿyæÑÿ)ü¯ØXôïÿ
þ% þØÚÿæç?âÿpZò¿ÂbÑ¿ËüÇsþ÷RMhdVé¿^lùúQáKý_MÝ
-ú¯Ú*áÿR°rýÃÃÝïU?åëßuuªGÿ_Ý2ÿSÂÖõ?~{¼ÝÝ\?ݾ´»·¿åçÿyýsÃüw
-ÓÙóT¶êÿÙû÷°ÛßÝÝ^ßßüõ3ÞÕõ¬ÿ<üïÿRMýOBFï¡ÙªÿýáñMÍ¿d½þÜÿ$ÿOlLú_tú_uþÏ£ñ8ÿWü' ã×Oÿw\Vêªÿ¯üeõª««1÷eìÿN-ý6ÿéþgy1xMý7×ÕÔÿKýWeýËõÿ^æ??îÿ%Ô¹£80ý»Îàü/÷ÿØXôï2ÿaÎÿàþOóbcÑ¿çüùOEÿóÿ«þߨêó¸ÿ@ÿol,úwéÿç? tÿĦÐþ_¦ÿ·Þºÿ?³ÿk8ݾfü?Q±èߥÿwÿÀý¨ Ff»þ+§ù-óXÖßsþC"ÿQóbcÑ¿çüæiÀÿþù¿^ú¿gÿúðiwÜñEÿ®óÈÀþþ]ç?Ðÿ%ÿWlLõ?ÏùôHÀÿþ]ç? ø¿bShÿ/8ÿ¡eþéÙÿ+*ýó]¾ÿçô¯÷ÿØl×ããÿJgÿWÆÿ¥À²þåü_Ýëü/ÿ®ÒG`±èß5ÿ÷? ÜÿÆÆ¢ü¯yÿ'ÿCù_±±èß5ÿÿ§åÆ¢Ïü/ò?4Pÿ©þçÿ
ÿ[Bõ¡çþËù¿.÷ÿ>uäHHòL¡ý¿ÿ+ý_ø?%_?óÿâbÑ9ÿ×åü¯3ú0Þÿ#ù¸l×rÊÿJÿ«Æÿ¥À²þ®ù_ÜÿJ ÿ+6ý»æ¡ ø¿bcÑ9ÿ×ëý¿Fÿ>ÿ|:>
þÚÏm±èß5ÿû ìÿ±±èß5ÿú¯ü_±1Õÿ<ó¿èÿ@þWl,úwÍÿBÿPl
-íÿó¿ÒäÿÂÿ-az6ãÿEÿ.óçü/êÿRMhdÖè?\lùúQáKý_MÝ
-ú¯Ú±ÿÿ?+×ÿxx8ü8Üý^õCX¾þ]×LùouÇúKغþÇo·»ë§û/Ãv÷ö³üü?¯nö WWÓpþÉVý?{ÿvûï»»Ûëû¿~Æ»ú¯õ?ãý_BÿèþÍVýïojþ%ëõßtù/ðÿÄÆ¤ÿE§ÿUçÿ«Sý¯bþ±÷ó\Vêªÿ¯üeõª««qîרÿÆëê?6ÿéþ§öéÿ«SÿoKýOeýËõÿ^æ?4ÌÿQçàÀXôï9ÿü7
-¼ÿÇÆ¢ùçþßþ ÌEÿóÿ©ð·ØXôï:ÿû ôÿÆÆTÿsÿPsÿ/þߨXôïÒÿ{ÿУ tÿĦÐþ_ªÿ·Omsêÿk¨ÿKØí¦%Àÿþ]úÏó¸ÿÓÀÈl×å4ÿ¡ü_øÿ$XÖßsþCÍüo ÌEÿó:ô/ÿWl,ú/æÿzéÿý_è_§ÝqÇ# .ý{ÎèÈÀþþ=ç?ôôIÀÿSýÏqþCMÿü_±±èßsþCþ%àÿM¡ý¿àüvòqþ@þkl,ú/çÿº|ÿÏùOxÿÍvý7>þ¯töeü_
-,ë_ÎÿÕ½Îÿâù/á*}Äþ]ó¿xÿÀýol,úwÉÿ÷ò?$ÿþ]ó¿ðJhP~h,ú÷Ìÿ"ÿCõߨêù_ø¿%T þËù¿.÷ÿ>õäHHòL¡ý¿ÿ+ý_ø?%0ÿ/6ýó]ÎÿʹCÿÆû$íúONù_iòÕø¿XÖß5ÿû_ äÅÆ¢×ü/ô/ÿWl,ú/çÿz½ÿ7è_ÂçOÇÇ_ûñ¹Í ý»æqÿ#ý?6ý»æQÿÿ+6¦úgþýÈÿEÿ®ù_è_êM¡ý¿`þWü_ø¿%ÿþ]æ?Îù_Ôÿ%¤ÐȬÑÊ-_0*|©ÿ«©»AÿU[%ü_
-V®ÿñðpøq¸û½ê°|ýǺïèÿëܰþ
-¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëÎÿæ%8ÿÇN¡ØªÿgïßÃnÿ}ww{}ó×ÏxWÿÕô?üïÿþ_
-ÜÿÇf«þ÷Ç75ÿõúoÈAþSlLú_tú_wþo«ñý?Wó¿?Îÿc38ÏP¬ÔÿTÿ_ùËê?UWW}ú¿S;æ?PÿñgÓúîj§ùý©ÿwìÿ`ýý±¬¹þßËüá§@þ»:w4 Æ¢Ïùþ ÔÿbcÑ¿Ëü9ÿþ ÌEÿóZüÿEÿó2÷ÿèÿ©þç8ÿ!qÿ/þߨXôïÒÿ{ÿС tÿĦÐþ_¬ÿ·¯¦þ_æ?iàäÿÙíðÿâþßóüîÿ4äD02Ûõ_9Íh'ÿþ? õ÷ÿÿ-ù±±èßsþCFÿðÅÆ¢ÿbþ¯þïÙÿ
þ%|Úw<âbÑ¿çüLýWûl,ú÷ÿÐÑÿ%ÿWlLõ?Çùþ ø¿bcÑ¿çüýKÀÿBûÁùíäÿâü/a^ò_cbÑ9ÿ×åû@ÿ
-xÿÍvý7Nù_gÿWÆÿ¥À²þåü_Ýëü/ÿ®ÒG`±èß5ÿ÷? ÜÿÆÆ¢ü¯yÿ'ÿCù_±±èß5ÿÿ§æÄÆ¢Ïü/ò?4Pÿ©þçÿ
ÿ[Bõ¡çþËù¿.÷ÿ>uäHHòL¡ý¿ÿ+ý_ø?%ÌKÀü¿Xô_Îÿu9ÿ+çþ%÷ÿH>.Ûõò¿ªÉÿð)°¬¿kþ÷¿ÈÿEÿ®ù_è_þ¯ØXô_Îÿõzÿ¯Ñ¿Ï?¿öãs'A@,úwÍÿâþGûl,úwÍÿ¢þ+ÿWlLõ?Ïü/ú?%ÿþ]ó¿Ð¿ÔBûÁü¯ÉÿQÓÿ!a^ò¿bbÑ¿ËüÇ9ÿú¿T Uú_nùúQáKý_MÝ
-ú¯ü/ +×ÿxx8ü8Üý^õCX¾þ]î³àp¬ÛõW°uýßow7×O÷_/íîí/fùù^ÿÜÔ¼ÿKàüúöþ=ìößww·×÷7ýwõ_ýGÿÃñþ/ÿûÿØlÕÿþðø¦æ_²^ÿ
-÷ÿ"ÐlLú_tú_wþo«ñý?-¡è_Àçú¿Ã±RÿSýåg,«ÿT]]s¿Æû¿Ô6õÖÿtÿS;Íè§þßõW`Yÿrý¿ùÃ?¸ÿPçàÀXôï9ÿüg
-¼ÿÇÆ¢ùsÿ/þ? ÌEÿ®óÈ@ø[l,ú÷ÿÀü7
-ôÿÆÆTÿsÿPqÿ/þߨXôïÒÿ{ÿ@þ³ºbShÿ/ÖÿÛuçùø$ÌKpòÿìvøaÑ¿Kÿïyþ÷r¢íú¯æ?´ÿÿËú»Î ÿUóbcÑ¿ëüô/ÿWl,ú/æÿzéÿý_è_§ÝqÇ# .ý{Îh©ÿJ`ÿEÿóÈÔÿ+6¦úçüú?$àÿEÿ®óпü_±)´ÿÿ0ù¿ÿ®a^ò_cbÑ9ÿ×åû è_ïÿ±Ù®ÿÆ)ÿëìÿJø¿XÖ¿ÿ«{ÿxþK¸JqÆ¢×ü/Þÿ$pÿþ]ò¿æýü äÅÆ¢×ü/üþ]ó¿Èÿ@ý76¦úgþþo Õ@`,ú/çÿºÜÿûÉÿ:äBû9ÿW:çáÿ0/óÿbbÑ9ÿ×åü¯3ú0Þÿ#ù¸l×rÊÿªNþ¯1ÿÿ?õwÍÿâþWù_±±èß5ÿýKÀÿ
þËù¿^ïÿ5úðùçÓññ×~|nó$Eÿ®ù_ÜÿH`ÿEÿù_ähÀÿSýÏ3ÿþO äÅÆ¢×ü/ô/õǦÐþ_0ÿkò$ú?$ÌK@þWL,úwÿ8çQÿj@#³FÿÍò0*|©ÿ«©»AÿUÓwø¿¬\ÿãááðãp÷{Õaùúw]Õüõð_³þ¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëæix>ÿ·íôN¡ØªÿgïßÃnÿ}ww{}ó×ÏxWÿÕ³þóðg¼ÿK5ïÿÈÍVýïojþ%ëõßäü è?6&ý/:ý¯:ÿç¶iÆóÿ þ<ÿÇÞoÎÿáX©ÿ©þ¿ò3Õª®®ú4õ§ü
-ÖÿtÿSûôÿÖçþ_ê¿,ë_®ÿ÷2ÿaø)àÿPçàÀXôÏü?ôÿÄÆ¢ùsÿ/þ_ ÌEÿÌø÷Cø[l,úgþÿúccªÿ1ÿá_ý¿±±èߥÿwÿþ%ÐýBûþßzxhÒ©ÿ¯¢þ'a^¯üÏPXôïÒÿ{ÿÀý¨ Ff»þ7
-_>ÿ¡=ù¿ðÿi°¬?óþý0ÿ!6ý3ÿáßþ¯ØXô_ÌÿõÒÿÍü)vǸXôÏü?ìÿ±±èùÿ~ðÅÆTÿcþÿü_±±èùÿ~ðŦÐþ_pþC{òÔÿ%ÌK@þkL,ú/çÿº|ÿÏà ý+àý?6Ûõßøø¿ÒÙÿUãÿR`Yÿrþ¯îuþÏ Wé#°ÀXôïÿyÿÀýol,úwÉÿ÷ò?$ÿþ]ó¿ðJ`þGl,úwÍÿ"ÿCõߨêù_ø¿%Tz ±è¿ÿërÿïS&ÿCBêd
-íÿåü_éìÿÂÿ)a^æÿÅÄ¢ÿrþ¯Ëù_Ãë?ú0Þÿ#ù¸l×rÊÿJÓüÇÿËú»æqÿ+ü¯ØXôïÿ
þ%àÿEÿåü_¯÷ÿýKøüóéøøk?>·yÄ¢×ü/î$°ÿÇÆ¢×ü/ê¿ðÅÆTÿóÌÿ¢ÿSù_±±èß5ÿýK@ý±)´ÿÌÿæ?&üßæ% ÿ+&ý»Ìó¿¨ÿKH5 Y£ÿv¹åëF
/õ5u7è¿6#ü_
-V®ÿñðpøq¸û½ê°|ý»®®Æõ¯ëÌúKغþÇo·»ë§û/Ãv÷ö³üü?¯ìÿ¦¯8ÿÏkÁi [õÿìý{Øí¿ïîn¯ïoþúïê¿zÖþ÷ ýkÈè=4[õ¿?<¾©ù¬×;ü?ØïccÒÿ¢Óÿªón»Sý¿bþñë[¿9ÿÇd¥þ§úÿÊÏXVÿ©wÿ>Mýß©mê?
-6ÿéþ§öéÿ«iþõ? õ/×ÿ{ÿÀüuîh Eÿ®ó8ÿK ÿ'6ý»ÌûÉÀüØXôï:ÿÿÂßbcÑ¿ëüîÿ%ÐÿSýÏsþ÷ÿèÿEÿ.ý¿ÌB÷Ol
-íÿeúëáM OýúñëßíðÿDÅ¢þ_æ?HÉ
-`d¶ë¿rÿÐNþ/ü,ëï:ÿù¿ÿþ]ç? ø¿bcÑ1ÿ×Kÿ÷ìÿBÿ>í;q±èßsþÃÿþýaÿEÿ®óèÿÿ+6¦úçüî%àÿEÿ®óпü_±)´ÿÿÐü5ç Ó×ÿ+*ýó]¾ÿ3ÿAïÿ±Ù®ÿÆÇÿÎþ¯ÿËúóu¯ó¿xþK¸JqÆ¢×ü/Þÿ$pÿþ]ò¿æýü äÅÆ¢×ü/üþ]ó¿Èÿ@ý76¦úcþWÂÿ-¡úÐó Eÿåü_û:ò?$¤ùG¦Ðþ_ÎÿÎþ/üƯùq±è¿ÿërþWÎýKïÿ|\¶ë?9å¥Éÿð)°¬¿kþ÷¿ÈÿEÿ®ù_è_þ¯ØXô_Îÿõzÿ¯Ñ¿Ï?¿öãs'A@,úwÍÿâþGûl,úwÍÿ¢þ+ÿWlLõ?Ïü/ú?%ÿþ]ó¿Ð¿ÔBûÁü¯4ù¿ðK¾~ü_Q±èßeþãÿEý_BªI Ìý§å#ÿ`TøRÿWSwþ«¦'ÿKÂÊõ??w¿Wý¯7¿ÑÿWgü¶®ÿñÛãíîæúéþËð¥Ý½ýÅ,?ÿÏëþo óü3Ò8ÿc«þ½»ý÷ÝÝíõýÍ_?ã]ýWÿÑÿðg¼ÿKäkàþ?6[õ¿?<¾©ù¬×Ãý¿ôþþ×ÿÛêtþKè_Àçÿ±çA(Vêªÿ¯üeõª««ñÞìÿNíøþOýÇMëºÿ©æ?ôSÿoÍú+°¬¹þßËüñìÿ
-êÜÑ þ=ç?ÿ¬÷ÿØXôï2ÿaÎÿàþOóbcÑ¿ëüü¿Eÿ®ó¸ÿ@ÿolLõ?Çù÷ÿèÿEÿ.ý¿çùä?k û'6
öÿ2ý¿õðÏ|òÿäú¿y NþákÇÿþ]úÏó¸ÿÓÀÈl×ÿòfàQáËç?´'ÿþ?
-õwÿ@þ«æ?ÄÆ¢×ùè_þ¯ØXô_ÌÿõÒÿ=Ï@ÿ>í;q±èßsþCKÿ§öÿØXôï9ÿüG
-ø¿bcªÿ9Ψèÿÿ+6ý{ÎÈè_þ¯ØÚÿÎhOþæ¿kü×Xô_Îÿuùþs¦ÿSïÿ±Ù®ÿÆ)ÿkò5þ/õ/çÿê^å%ÿ®ÒG`±èß5ÿ÷? ÜÿÆÆ¢ü¯yÿ'ÿCù_±±èß5ÿÿ§åÆ¢×ü/ò?$Pÿ©þçÿ
ÿ[Bõ¡çþËù¿.÷ÿ>eò?$¤ùG¦Ðþ_ÎÿÎþ/üæ%`þ_L,ú/çÿºÿsþ%÷ÿH>.Ûõò¿ª)ÿ«Åÿ¥À²þ®ù_ÜÿJ ÿ+6ý»æ¡ ø¿bcÑ9ÿ×ëý¿Fÿ>ÿ|:>þÚÏm±èß5ÿû ìÿ±±èß5ÿú¯ü_±1Õÿó¿èÿÔ@þWl,ú÷ÌÿêпÔBûÁü¯Éÿèÿ0/ù_1±èßeþãÿEý_BªI Ìý×[¾þ`TøRÿWSó«¶êð)X¹þÇÃÃáÇáî÷ªÂòõïºjüßÕuÝÿ&aëú¿=Þîn®î¿_ÚÝÛ_Ìòóÿ¼þ¹iÈð|þ¯ëéB±UÿÏÞ¿Ýþûîîöúþæ¯ñ®þ«gýçáÏxÿ7¼ ä¿Äf«þ÷Ç75ÿõúorÿGÍ_±1éÑéÕù?·M3ÿ+æhx>ÿ½ßÿñRÿSýåg,«ÿT]]õiêÿþÛDýGÁ¦õ?ÝÿÔ>ý¿õÔÿÛPÿ`Yÿrý¿ùÍø3`ÿPçàÀXôï9ÿÿ¿úbcÑ¿ËüsÿoCþ»æ?ÄÆ¢Ïùøÿ4PÿEÿó:îÿ%ÐÿSýÏqþCâþ_ý¿±±èߥÿ÷<ÿ¡CÿèþM¡ý¿Lÿo=¼ Ôyêÿåü/a^v»é<BaÑ¿Kÿïyþ÷r¢íú¯æ?´'ÿþ?
-õ÷ÿPÿ"ù±±èßsþCþ%àÿ
EÿÅü_/ýß³ÿýKø´;îxÄÅ¢ÏùþO ìÿ±±èßsþCOÿü_±1Õÿç?ÔôHÀÿþ=ç?ôè_þ¯ØÚÿÎhOþó¿y ÈEÿåü_ïÿ9wôJàý?6Ûõßøø¿ÒÙÿUãÿR`Yÿrþ¯îuþÏ Wé#°ÀXôïÿÅüO
-ÜÿÆÆ¢ü¯yÿ§ÿOù_±±èß5ÿÿ§æÿÄÆ¢×ü/ò?$Pÿ©þçÿ
ÿ[Bõ¡çþËù¿.÷ÿAþäHHòL¡ý¿ÿ+ý_ø?%ÌKÀü¿Xô_Îÿu9ÿ+çýKïÿ|\¶ë?9å¥iþcÿKeý]ó¿¸ÿ@þWl,úwÍÿBÿðÅÆ¢ÿrþ¯×ûþ%|þùt|üµÛ< bÑ¿kþ÷?ØÿccÑ¿kþõ_ ø¿bcªÿyæÑÿ)ü¯ØXôïÿ
þ% þØÚÿæ¥ÿ£Æÿ-a^ò¿bbÑ¿ËüÇ9ÿú¿T 5úï;¾þdTøRÿW3lüU]55ù_Öÿñðpøq¸û½î°|ýǹ£ÿ·NãüÖßëüöx»»¹~ºÿ2|gwï|/ËÏÿóúçºåü/áùü?ý+N±Ø¨ÿgëßÃnÿ}ww{}ó÷ÏxWÿÕô?üïÿªLþÞ÷c³QÿûÃãÛÉzý¹ÿ@þSl,ú_vú_wþoú±ÿ»íÎÿ.Îÿ_¿ò<Å:ýOåÿµ±¬þSuuÕ§©ÿ{xdê?
-¶¬ÿéú§^þ3XSÿþ3ÖÿrGýOaý¶ÿnÈþÉýAi4 Æ ÿ¥í¿[æ?4=ùÏèÿAÿKÛ×ÍúÿÚüg ÌAÿKÛ·ÌÈõ? ¿ÅÆ ÿ¥í¿æ?TÜÿK ÿ76úßÂöß-ó:ò5Ðÿþ¶ÿn©ÿ¥
-ýKÀï2ûÿí¿«ú»vìÿÉm¦ÿ_¼gÿÏnÇó ý/mÿÝrþo¹ÿÓÀÈlÖåäÿjÚÿÿÃúô½Ênò_%0ÿ!6ýûø¿¦ü·¦GÿðÅÆ ÿrþ¯þïÙÿ
þ%|Ú)ùÆ ÿ×yþù¯Øÿccпÿë<ÿ¡¢ÿKþ¯ØXê.þ¯)ÿµkèÿÿ+6ýûø¿Îó*ô/ÿWlÊìÿåü_Óýoè_À¼ä¿ÆÄ ÿþ¯Ë÷ÿÜöôJàý?6õßxåý_þ/õ/èÿê^çñüp>â Aÿ¾ù_¼ÿIàþ76ýûä÷ÿü äÅÆ ßü/üÿþ}ó¿Èÿ@ý76úkþþo Õ@`ú/èÿºÜÿûTÿ!!uÈ?2eöÿþ¯töáÿ0/óÿbbÐAÿ×åü¯Üöè_Âxÿäã²YÿÉ+ÿ«ü_5þ/õwÍÿâþWù_±1èß3ÿ«eþü_±1è¿ ÿëõþÑ¿Ï?¿öã'A@ú÷ÍÿâþGûlú÷Íÿ¢þ+ÿWl,õ?×ü/ú?%ÿþ}ó¿Ð¿Ô2ûÉü¯ÉÿÑÒÿ!a^ò¿bbпÏüÇéü¹ÿÓj5ú¯Wd~½dTøRÿWSó«Óý?þ/V®ÿñðpøq¸û½ê°|ý»n|ÎuÿOÂÖõ?~{¼ÝÝ\?ݾ´»·¿åçÿyýsS³ÿKxqþ¿ºÿÁi [õÿlþ{Øí¿ïîn¯ïoþúïê¿zÖþ÷©¦þ'æØlÕÿþðø¦æ_²^ÿä?© ÿ)6&ý/:ý¯:ÿç¶>Õÿ+æÿixqþÿúó8Vêº XùËê?UWW}ú¿SÛ4ÔlZÿÓP½øg°¦þOÏÿºk¨ÿJ°¬ÿÒàÓ
-ߪüá§@þ:w4 Æ¢ÿ¥
-ÀïëÿÕü6ãÿ@ÿOl,ú_Ú ü®þ_Î8÷ÿÕôÿI`þCl,ú_Ú ¼~ÿo:æÿjàþ/6ý/m ~_ÿ¯ç?dîÿ%ÐÿSýoaðûú5ÿ¡¯¸ÿ@ÿol,ú_Ú ¼¡þ2ú@÷Ol
-íÿo6
-_ÚÿÛ·Ý©ÿ¯¡þ/a^ªj·ÿÁó ý/m ÞpþÏÜÿiÈ
-`d¶ë¿òñ5íäÿÂÿ'Á²þåü_¯òs"ÿQóbcÑ¿ÿë<ÿ!£ ø¿bcÑ1ÿ×Kÿ÷ìÿBÿ>í;q±èßÅÿ5é¿cþöÿØXôïâÿ:Ïèèÿÿ+6¦úÿkÊíýðÅÆ¢ÿ×yþCþ%àÿM¡ý¿ÿkºÿ͹æü/a^ò_cbÑ9ÿ×åûÎþO ¼ÿÇf»þ¾ØÿÎþ¯ÿËúóu¯ó¿xþK¸JqÆ¢×ü/Þÿ$pÿþ]ò¿æýü äÅÆ¢×ü/üÿþ]ó¿Èÿ@ý76¦úcþWÂÿ-¡úÐó Eÿåü_û:ò?$¤ùG¦Ðþ_ÎÿÎþ/üæ%`þ_L,ú/çÿºÿsFÿÆû$íúONù_ÌTbY×ü/î%ÿþ]ó¿Ð¿ü_±±è¿ÿëõþ_£ >íÇç6OXôïÿÅýöÿØXôïÿEýWþ¯Øêù_ôJ ÿ+6ý»æ¡ ¨?6
öÿù_ÿ#Ñÿ!a^ò¿bbÑ¿ËüÇ9ÿú¿T 5úÏË#¿þ`TøRÿWSó«¶bþ£ë<<~î~¯ú!,_ÿ®«»<úÿêÿëüöx»»¹~ºÿ2|iwo1ËÏÿóúç¦aÿ0~ùçóÿ§PlÕÿ³÷ïa·ÿ¾»»½¾¿ùëg¼«ÿêYÿyø3Þÿ¥û ´Æf«þ÷Ç75ÿõúorOþ£¿bcÒÿ¢ÓÿªónûSÿwUÿ"anûæüúêÿ+?cYý§êêj¼÷ïÿR;¾ÿSÿñgÓúîjþßúÜÿKýWeýËõÿ^æ??ò_%Ô¹£80ý»ÎÀÿ'þØXôï2ÿþ_)ÌEÿ®óðÿJ þþ=ç?ÿ¬þߨêó¸ÿ@ÿol,úwéÿç? tÿĦÐþ_¦ÿ·iêÿKäÿH¨ªÝn\ü?1±èߥÿwÿÀý¨ Ff»þ+§ùíäÿÂÿ'Á²þóðk`þCl,ú÷ÿС ø¿bcÑ1ÿ×Kÿ÷yÿoпO»ãG@\,úwÿ@ýWûl,úwÿ@ÿü_±1Õÿ<ç?Ðÿ!ÿWl,úwÿþ%àÿM¡ý¿àüSþS®9ÿK ÿ56ýó]¾ÿçéÿÀûl¶ëù0Qáý_éìÿêñ)°¬9ÿW÷
:ÿç¿«ôX`,úwÍÿâýO÷¿±±èß%ÿë¼ÿ×äH ÿ+6ý{æeüþ]ó¿Èÿ@ý76¦úgþþo Õ@`,ú/çÿºÜÿÇ9@è_Ab hh
-íÿåü_éìÿÂÿ)ù±±è¿ÿërþWÎýKïÿ|\¶ë?9å¥ÉÿÕâÿR`Y×ü/î%ÿþ]ó¿Ð¿ü_±±è¿ÿëõþß >íÇç6OXôïÿÅýöÿØXôïÿEýWþ¯Øêù_ôJ ÿ+6ý»æ¡ ¨?6
öÿù_iòáÿ@þWl,úwÿxÎÿâþOCªI Ì"ýÿ<ÜÜ.v{½fTøBÿWÓÏñÕÿ%aùú{þ^²|ý»¾îáù_u©bý¬]ÿÿyû?ï~=¬úwÏÿ}ó¼þM5ú¿ëDþÿǰªÿþëÿ~û?ÿ_ãîÇÿé¿RÕ^å¾û¯ïÿçÿåüßý_ÝÝþ?ww·O×ÿÇÛÛñQ·ãý¿÷ÿ§CÖêx
-xó]ÿåïÿ]_åñü_Wôkà¯_§F0duú_>óý%«Îu{:ÿUôHX»þÞç¿úTÿ©óß4ÎxÕç¿óßgÖêßÿüwzÿ-aè_Àóùoü3u(Öé¿Ôÿº©þÇùOÂÚõ÷¯ÿ5Óùû? §3^ýÆù¯æü÷ßµúw?ÿõiªÿÿ,a>öáÿÉ:ý/ùõU翾âþWÈÚõw?ÿ¥éþ·ãù/átÆkÞ8ÿ5ÿþ;³VÿÞç¿áÿNõ?ú¿%Ì×¾ÿ þ{óÿ6Dµ À+
\ No newline at end of file
+ 0Ï9K íýÑn˲®íëóëà̬Ê,ê\aÁ°áû(5)¶h¶¶-?½«ºº8©î-²ª"#ÆïÃZs
+èþYüQÚ¯ý÷ûíÏôv}Ú¥ãÿé¿Õ&t9ÿ]§ÿ?¶íéßgþ[)¤BÿbÓ¤î¿ýW®þ¿ä¯çcø¯ÿúo_ö?¾ñ÷îÏÿl)×õþý\÷w`YýcciÛ®õoc©¿©ÿÝýÿxÜÝWú=X^ÿ®éÂðÇ\B¦þ¼SÿáÏÇûÿ.ü5X£ÿÿ~Pj©¿Ëê¿{ú%øX£ÿÒucý»ç¿ Ëë?ü˦ßõ/MÖÿJ¡þ&¬ÿqÿ´ÿ±ø½æaÅó?wí ÿr¨¿ëüv¸ïïn¿ßÚÃßÌXà2Õû^ÿ.êK
+ÿí¿Åà¼þs þJÇ?üoÿGÿ/K6ëÿéÛïçÇ]ÿãö©ß}ïîoïþöïê?üGÿÃAÿ¥
+ú· ¡w×lÖÿnxKó¯Y¯ÿ6dÖXï}#ÓÿÝÿºý;lüý*ý[ðjÿÿõ+ûw¬Õÿ®ß}»_y
+¸ìü'ïü]vþþc9ÿ7a[ýÞÝÿÓÒ_5ç¿Ã?Cý¹ÿ7ATÿçÇÿßýÏܾ¹ÿϧú·Mþ®kXÿ-H¹üßXòý"ÒÿËà ûÛ§þp|<>î¯4ô¾þÓ
þù'ôoADü®éÿøû©ÊúÃôßt§ó¿Ð¢þß?¿>ÞßñpHÿ?îÿÇý÷?cýú߯Äù ÜÿùF¤ÿÝþÛýáþçî÷ôð·ã÷õß\îÿCÃý¿ ¥åàÙùß·þpw;ü7Ãàùø·Ïx_ÿí
þKì¸ÿ7!üÃÀ3"ýÿúßÏ·û¯·ýóó~÷ØÿÇãñ÷õgl8ÿk[ôoÂ
+êwMõÿ¿÷OýQáËü?]éÂxþWþ_æüBÎãx¸B¤ÿ¿þûûøx¾?þ]öÿû?räÐ3ýÿWÓNþ/ü&ê_ÍÿÕ^Üÿ6]Wxþ[Ð$ì_é_ÃÿuÒ×5èßü_¾é¿ÿëµÿ{ö¡>õÇG_Dú×ðMúcþú×õß7"ýkø¿¦ýhéÿ2ÿodç
+þ¯þKìèÿ0ÿoDú×ðMëÿø×Ñ¿ø¿|Ský¯åÿîËøJþ
+K@þ«ODú¯æÿº|ÿ/¡¡ÿÓÞÿ}#Уÿuö1ÿÇQý«ù¿ÊuþÏnâG`é_3ÿ÷?¸ÿõHÿù_óúOÿ äùF¤Íü/ü&4(ß5"ý+æÿa翾ÿ)æáÿ6!|èx 8F¤ÿjþ¯«õ¿mÉÿ0!äïZë5ÿW<û¿ð0ù>é¿ÿërþW
+ú7a¼ÿGò~è?êä
ÉÿñY ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×åúßÿnÄçÏÇÃ¯ÝøØæIàþ5ó¿¸ÿ1õß7"ýkæqþkþ/ßÈÎÿó¿èÿ4ü/ßô¯ÿ
þM@ý¾©µþ×Ëÿüþæÿåþ5æ?Îù_ÿ Y¥ÿ²Ôñõ'£Âú¿Tý2®ÿø¿ôYYÿãþiÿcÿð{Õ/Âòú\ºÑÿÚBýMØZÿã·Ã}wûüøeøÒÞþbïÿçúçÌü?^íÿ§m»WlÕÿõï©ß}ïîoïþúïê?üGÿÃqÿßÿbïû¾ÙªÿÝþð¦æ_³^ÿMWxÿ7ü'ßô¿h÷¿nÿßLûÿñÿp±ÿÿúç+Vê:þ_ùËÎBI¡Sÿw,cþ3ç?úlªÿéú'-þ5Xsþ;ü3îÿÂxþCýõÔaûïü¦øÿMH¹Ð ìþ¶ÿnÿ0¬èßú|#ÑÿÂößuóÎùù/&0ÿÁ7ý/lÿÝ2ÿþ?#óDÿÛ7ä?.sÿoý¿¾ÿ-kÿÝ4ÿüèÿõDÿÛ·ÿ5ý@÷o*ÿoµÿ.÷ÿ¤ámý?ë¿
+s Îþy¸B¢ÿ
í¿öÿ¹ãþÏ9ôÌvýÿWÓNþ/ü&Hê_Ïÿu=ÿ!ÿdó|#Ñ¿ÿkÊ+ýÿË7ýWó½öÏþ/ôo§þØóðDÿ*þ¯óüLþ£ ¬ÿ¾è_Åÿ5å?v
þ/ðùFtþ§áÿ:ÏôÿË7ý«ø¿¦ó¿¦ ðù¦Òú_Çÿõrÿ»Äþß¹ä¿úD¢ÿzþ¯Ë÷ÿÜeú?Màýß7Ûõß(åý_-þ/$õ¯çÿ*×ù_<ÿM¸q9F¢Õü/ÞÿLàþ×7ý«äÍë?ù&ÿåþUó¿
ðÀüßHô¯ÿEÿ¿ ÿúFtþ§ÿñ>t< #Ñ=ÿ×åúß5
übAþ©´þ×óųÿÿ§ s ÿçþëù¿.çå.£Æû$ïíúJù_aòü_Hê¯ÿÅý¯ äùF¢Õü/ôoþ/ßHô_Ïÿu½þ'ôoÂçÏÇÃ¯ÝøÜæIàþUó¿¸ÿ1õß7ý«æqþkþ/ßÎÿ4ó¿èÿ4ü/ßHô¯ÿ
þM@ý¾©´þWÌÿüþæÿåþUæ?Îù_ÿ Y¥ÿöf±çë5£Âú¿TýR
+þ/ÖÖÿ¸ÚÿØ?ü^ó°¼þ¥¤ñ?O)·øÿLØ\ÿã·Ã}wûüøeøÖÞüfïÿçúçÿÏ¡ñÕþ?v®Ø¬ÿóßS¿ûÞ?Üß>Þýí3ÞÕxÑ~çÿ-çÿ6ÐþéÍúßíoiþ5ëõßæÿÚÀzïþìþWíÿsÛöÿMÀÿcÂØòÍþß/kõ?] ¬ûeç?¡¤ÐÅ©ÿ;v)rþcÁ¶ú.ÒÒ_5ç¿9úcäü×Qý6 nøVå?´ã¯ë¿)#ÒÿÂà÷õ5ÿ¡kðÿ@ÿoDú_Ø ü®þ_Ï8÷ÿEúÿL`þoDú_Ø ¼~ýocÃü'óHÿß×ÿUþóð÷Ñ¿ôÿúFvþ·¬ø}ý_Ïè¸ÿ7þ_ßô¿°xÃù_Ëü7èþñMõÿàQáû»á_ãú?n п!ä< ÿODú_Ø ¼aÿ¸ÿ³!GN =#ÐPñ5íÉÿ
ÿÏQý«ù¿.óÚÿÛæ?øF¤
+ÿ×ÿÖµèßü_¾é¿ÿëµÿ{ö¡>õÇG_Dú×ðMú
+ù/&°þûF¤
+ÿ×´ÿþ/ðùFvþ§àÿæ?¤@ÿ ø¿|#Ò¿ÿkZÿ[æ¿ÙÿË7µÖÿJþ¯óýo[BÑ¿ä¿úF¤ÿjþ¯«ù¡¥ÿÓÞÿ}#УâÿgÿWÂÿe¨þÕü_å:ÿç¿ 7ñ#0Çô¯ÿÕòþg÷¿¾é_#ÿk^ÿéÿ3ü/ßô¯ÿ
ÿÓå»F¤Íü/ò?Làü×7²ó?Åü/üß& Çô_Íÿuµþ·-ù&Dº¦Öú_ÍÿÏþ/ü&0ÿÏ7"ýWó]Îÿ*¡Eÿ&÷ÿHÞ/ýGü¯8ÍìðY ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×õúÑ¿ >¿vãc'CDú×ÌÿâþÇÖßô¯ÿÅù¯ ø¿|#;ÿSÌÿ¢ÿÓò¿|#Ò¿fþú7õû¦Öú_/ÿ+Nóñ@þoDú×ÿ8çqþoBL$zfþÅ_0*|©ÿ«IeÐ(%àÿ²`mýû§ýýÃï5¿Ëë?½ÿ)ó_¨¿>ëüv¸ïïn¿ßÚÃßÌòýÿ\ÿ\¸ÿ·a. ûlÖÿ÷ï©ß}ïîoïþöïê?¼è??ÆýËû¿
+ÿùf³þwûÃ[Ízý·þoXï}#
ÓÿÝÿªýnÛñý?§ý¿ S¾~eÿïµúÎÿ×}ƲóPRèâÔÿ»qþ7ç?úl«ÿéþ'©ôÿ¦0õÿrþk¨þÕú/ó®ÃÿcBÊ
`Çô¯8ÿ¡Áÿoý?¾é_cþÃÿAþ» ÌðHÿóç&þæþç?4Üÿ@ÿ¯odçzó
+÷ÿ&Ðÿëþ5úÏóÈÿ±îßÔZÿ«ôÿ¦áM 9ùºùÏ&Lè{ü?>é_£ÿ÷<ÿû?räÐ3ýùíäÿÂÿg¨þjó®cþ¯ ÌðHÿóôoþ/ßô_ËÿõÚÿ=û¿Ð¿ úcÏ#À/"ýkÎàü×Ößô¯8ÿ¡¥ÿËü_¾ÿ©Íý&àÿòHÿóZôoþ/ßÔZÿëÍh§ùìÿMÿË'"ýWó]¾ÿÐÐÿiïÿ¾èñ0Qáý_ñìÿjñY ª5ÿW¹ÎÿâùoÂMüÌ1"ýkæñþg÷¿¾é_#ÿk^ÿÉÿ0ü/ßô¯ÿ
ÿÓå»F¤Íü/ò?Làü×7²ó?½ü/ò?l: é¿ÿëjýo[ò?Lù{¦Öú_ÍÿÏþ/ü&L`þWDú¯æÿºÿUBþMïÿ¼_ú:ù_qòEü_ê¯ÿÅý¯ äùF¤Íü/ôoþ/ßô_Íÿu¹þ·£%ýðùçóñðk7>¶y8D¤Íü/îL`ý÷Hÿù_ÿÿË7²ó?Åü/ú?M ÿË7"ýkæ¡P¿ojÿõò¿âäÿÂÿmÂ\ ü_>é_cþãÿÅù¿ 1 êUú7K-_0*|©ÿ«IãüçP
+óMX[ÿãþiÿcÿð{Í/Âòú|ú{)åú°¹þÇoûþîöùñËð=¼ùÍ,ßÿÏõÏ%qÿgÂ\Æ-ûwlÖÿ÷ï©ß}ïîoïþöïê?üGÿÃqÿßFôo;٬ÿÝþðæ_³^ÿmÈä?ÿÇ72ý/Ùý¯Ûÿ·iìÿÌ©ÿd«ýÿׯìÿݱVÿÓùÿºÏXvþJ
+]ú¿ãðÎ,ØVÿÓýORéÿ==ÿáÿ£þê_ÿ÷2ÿ¡é:ò_MH¹Ð ìþ5ç?àÿ3÷ßô¯1ÿþ_Sÿàþ5ç?pþg÷¾é_qþùÏ6ÐÿëÙùâüîÿM ÿ×7"ýkôÿÎóп tÿø¦Öú_¥ÿ7
ñèôÿtïÿ&Ì%ø'Ç?ð<p
Hÿý¿óüîÿLÈ@Ïôtæ?´ÿÿ ¢ú«Í;yþ[Àüßô¯8ÿ¡Eÿ&àÿòHÿµü_¯ýßçõ?¢>õÇG_Dú×ÿ@þ» ¬ÿ¾é_sþý_&àÿòìüOqþý&àÿòHÿóп ø¿|Ský¯7ÿ¡æ?°ÿ7a.ù¯>é¿ÿëòý¿ÿ§ ¼ÿûF ÿFÅÿÏþ¯ÿ¢úWóëü/ÿ&ÜÄ8À#Ò¿fþï&pÿëþ5ò¿¦üá?Cÿÿåþó¿ü&4(ß5"ýkæÿa翾ÿ)æáÿ6!|èx 8F¤ÿjþ¯«õüëèßX¿gjÿÕü_ñìÿÂÿiÂ\æÿùD¤ÿjþ¯Ëù_%4èßñþÉûE ÿ¨ÿÅüGKDõ×Ìÿâþ×ò¿|#Ò¿fþú7ÿoDú¯æÿº^ÿ#ú7áóÏçãá×n|ló$pHÿù_ÜÿÀúïþ5ó¿8ÿ5ÿodçù_ô@þoDú×ÌÿBÿ& ~ßÔZÿëåMþ@ÿ s ÈÿòHÿóÏù_ÜÿÙ Y¥ÿ´Ôñõ'£Âú¿Týܵø¿,XYÿãþiÿcÿð{Õ/Âòú\Æÿ>¥Sþ3õ×gkýß÷ýÝíóãáK{xûY¾ÿësâþÏWûÿiÆnÀ[õÿbý{êwßûûÛÇ»¿~Æ»úÿÑÿðcÜÿ7÷xß÷ÍVýïö75ÿõúoôoþßô¿h÷¿nÿßtcÿwNÌÿµábÿÿõ+ÏW¬Ôÿtü¿ò3ÿB§þïXùÿ&lªÿéúgùaðóßáqÿDý-Ôaûïü¦#ÿÅ
+Àèaûïù
ùß6ðþïþ¶ÿ®ÿpòÿ4]Äÿkó|#ÑÿÂöß-óBËù ¿ùF¢ÿ
í¿òK¹ÿ7þ_ßÎÿµÿnÿ¸ÿ7þ_ßHô¿°ýwËù_Ñ¿ tÿø¦ÒúÿVûïrÿOþØý?¹cý·a.ÁÙÿ3ÏW
Hô¿°ýwÃþ?wÜÿÙ#'Ù®ÿ ãÿjÚÿÿ
+ú×ó]æ?4ùÏ60ÿÁ7ý«ø¿¦ü·Ñ¿ ø¿|#Ñ5ÿ×kÿ÷yýOèßOý±çàþUü_çù/Ìÿ¶õß7ý«ø¿¦üÇ.Óÿeþ/ßÎÿ4ü_çùþðùF¢ÿ×tþ×dôoþ/ßTZÿëø¿^îsÙÿ0üWHô_ÏÿuùþÇ¿þ
+àýß7Ûõß(åMþ¯&àÿ²@Rÿzþ¯rÿEþ§
+7ñ#0ÇHô¯ÿÅû ÜÿúF¢ü¯yý'ÿÃò¿|#Ñ¿jþþOïþUó¿èÿ7ó_ßÎÿ4ó¿ð>t< #Ñ=ÿ×åúß5übAþ©´þ×óųÿÿ§ s ÿçþëù¿.çå®Eÿ&÷ÿHÞ/Ûõò¿ÂÿÕâÿ²@RÕü/îM ÿË7ý«æ¡ðùF¢ÿzþ¯ëõ?¡>ÿ|>~íÆç6OHô¯ÿÅý ¬ÿ¾è_5ÿó_ðùFtþ§ÿEÿ§
+äùF¢Íü¯þM@ý¾©´þWÌÿüþæÿåþUæ?Îù_ÿ Y§ÿå3_3*|©ÿ«IãüçP2þ/ÖÖÿ¸ÚÿØ?ü^ó°¼þ%weôÿ§1ú°¹þÇoûþîöùñËð=¼ùÍ,ßÿÏõÏÿ
+¯öÿ1`7àÍú1ÿ=õ»ïýÃýíãÝß>ã]ýÿèø1ÿ·ý@óo6ë·?¼¥ù׬×ZÎÿL@ÿ¾éÉîÝþ¿M§óÿÄý
+¯öÿ_¿²ÿwÇZýO ë>cÙùO()tqêÿÝ8ÿó}¶Õÿtþ¬9ÿͧçsÊÿ¢þúê¿°øt÷*ÿ¡é
+ùï&¤\h vHÿß×ÿÕü.Ñÿcý?¾éað»ú=ÿáÜÿÛÑÿcó|#ÒÿÂàõëç&pþïþ6 ¿¯ÿ«üçÐpÿoý¿¾ÿ-k ~_ÿ×ó
+÷ÿ&Ðÿëþ6 o8ÿkôoÝ?¾©µþ¿Õ <*|iÿowêÿ)ã+ú7`.Á?!ä<þç+Dú_Ø ¼aÿ¸ÿ³!GN =#ÐÿâfàQáËç?´ÿÿ ¢úWó]ç?wÌÿ6ù¾é_Ãÿ5å¿u
+ú7ÿoDú¯åÿzíÿ>ç¿ôo§þØóðHÿþ¯Iÿqÿþõaý÷Hÿþ¯iÿú¿LÀÿåÙùÿë<ÿ¡Ðÿaþ/ßô¯áÿÖÿ¶Aÿ&àÿòMõ¿ÿkºÿÍ]Çþß¹ä¿úD¤ÿjþ¯«ù¡¡ÿÓÞÿ}#УâÿÿkÿÿKQý«ù¿ÊUþWÇóßøcDú×ÌÿâýÏî}#Ò¿Fþ×¼þÿaù_¾é_3ÿÿ§
+ÊwHÿù_ôÿÀù¯odçù_ø¿M: é¿ÿëjýþþ-ù{¦Öú_ÍÿÏþ/ü&Ì%`þODú¯æÿºÿU- ú·`¼ÿGò~è?êä1ÿÑQý5ó¿¸ÿ5ü/ßô¯ÿ
þMÀÿåþ«ù¿.×ÿv|$ >ÿ|>~íÆÇ6Oô¯ÿÅý ¬ÿ¾é_3ÿó_ðùFvþ§ÿEÿ§
+äùF¤Åü¯ýú}Ský¯ÿ&ÿý&Ì% ÿË'"ýkÌó¿8ÿ7!&@=³Jÿeqä×
+_êÿjNóC)
+þ/ÖÖÿ¸ÚÿØ?ü^ó°¼þCÙOû¿ÇùoÔ_Íõ?~;Ü÷w·Ï_oíáÍofùþ®.ónn^öÿì\±Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿð¢ÿ<ü÷ÿm$ÿź¿}³Yÿ»ýá-Í¿f½þÛyÿ7ü'ßÈô¿d÷¿jÿsÏÿrêðÿ05}³ÿ÷ÊZýOçÿë>cÙùO()tqêÿÃ8ÿ±`[ýO÷?I¥ÿ7Mý¿ó_Dõ¯Öÿ{ÿÐt¬ÿ6¤\h vHÿóòM ÿÇ7"ýkÌûÿbó|#Ò¿æüîÿM üÍ7"ý+Îh¹ÿ7þ_ßÈÎÿôæ?ÿgý¿¾é_£ÿ÷<ÿ¡Eÿ&ÐýãZë¥þß.ætêÿÿÐ÷S ðÿøD¤þßóüîÿlÈ@Ïôtæ?´ÿÿ ¢ú«ÍhÇ_ ÿ0ÿÁ7"ý+Î ÿÍü_¾é¿ÿëµÿû¼þGôo§þØóðHÿóòM`ý÷HÿóZú¿LÀÿåÙùâüú?LÀÿåþ5ç? ðù¦Öú_oþC;ù¿Øÿ@þ«oDú¯æÿº|ÿ/Ì4÷ßô¿xĨðÅþ¯xöuø¿,Õ¿ÿ«\çñü7á&~Äæþ5ó¿xÿ3û_ßô¯ÿ5åÿÿú·ü/ßô¯ÿÕàÿ4ù¾é_3ÿü8ÿõìüO1ÿÿ· á =#Ò5ÿ×Õú?þuôo@,Èß3µÖÿjþ¯xöáÿ4ù¾é¿ÿërþW
+ú7a¼ÿGò~è?êäÅÉÿÕâÿ²@TÍü/îM ÿË7"ýkæ¡ðùF¤ÿjþ¯ëõ?¢>ÿ|>~íÆÇ6Oô¯ÿÅý ¬ÿ¾é_3ÿó_ðùFvþ§ÿEÿ§ äùF¤Íü/ôoê÷Mõ¿^þWü_ø¿M ÿË7"ýkÌ<çqÿgCL$zfþóRÇ×
+_êÿjRôrGþ +ëÜ?íì~¯úEX^ÿK7úSêoÁÖú¿îû»ÛçÇ/Ãöðö³|ÿ?×?¯¬ÿÌ%øg®»WlÕÿõï©ß}ïîoïþúïê?üGÿÃqÿß$òßLà}ß7[õ¿ÛÞÔükÖë¿é
+÷ÿ&°ÞûF¤ÿE»ÿuûÿ¦û¿sÿp±ÿÿúç+Vê:þ_ùËÎBI¡Sÿw^ 8ÿ±`SýO×?iñ¯ÁóßáqÿÆüoꯤþÛ7ä?4ý?6¤\h vDÿÛ·Ì(ügèÿñDÿÛ×Í8ù.ÿló|#ÑÿÂöß-óBËù ÿûF¢ÿ
í¿òËx\þ
+ ÿ×7¢ó¿eí¿æ?ÿlý¿¾èaûïó¿&£èþñM¥õÿößåþ4ü±M£ÿ§£ÿ×¹gÿOßó<p
DÿÛ7ìÿsÇý
+9rèíú:þ¯¦ü_øÿLÔ¿ÿë2ÿ¡é"ù¯&0ÿÁ7ý«ø¿¦ü·Ñ¿ ø¿|#Ñ5ÿ×kÿ÷ìÿBÿ&|êù8F¢ÿ×yþù¯6°þûF¢ÿ×ÿØú¿LÀÿåÑùÿë<ÿ!Òÿaþ/ßHô¯âÿÎÿþMÀÿåJëÿ×Ëýoîûæÿêþëù¿.ßÿsñÀû¿o¶ë¿QÊÿ:û¿Èÿ7ARÿzþ¯rÿÅóßøc$úWÍÿâýÏî}#Ñ¿Jþ×¼þÿaù_¾è_5ÿÿ§
+ÊwDÿªù_äÀù¯oDçù_ø¿M: è¿ÿërýïBþ ± ÏTZÿëù¿âÙÿ
ÿÓ¹ÌÿóDÿõü_ó¿rÑ¿ ãý?÷ËvýG¥ü¯Óýßð
+ÿËIýUó¿¸ÿ5ü/ßHô¯ÿ
þMÀÿåþëù¿®×ÿþMøüóùxøµÛ< "Ñ¿fþùï6°þûF¢Õü/ÎMÀÿåÑùfþý&ÿåþUó¿Ð¿ ¨ß7Öÿù_ÿ#ÒÿaÂ\ò¿|"Ñ¿ÊüÇ9ÿób"Ô3«ôß´=_¯¾ÔÿÕ¤2è?1ÿÿ>këÜ?íì~¯ùEX^ÿ¡ì¡êòxÿKýõÙ\ÿã·Ã}wûüøeøÖÞüfïÿçúçÂüwÎû¯ö¹ì\±Yÿ/æ¿§~÷½¸¿}¼ûÛg¼«ÿð¢ÿ<üÏÿ[ú¿màüÏ7õ¿ÛÞÒükÖëÿø|#ÓÿÝÿªýnÛñý?§ó?¦|ýÊþß'kõ?] ¬ûeç?¡¤ÐÅ©ÿ;v±åüÇmõ?] ¥¥¿kÎs:õÿÿ/õ·@Tÿ
+ÀÓ Óü¦ë8ÿ3!åB°cDú_Ø ü¾þ¯æ?t
+þxÿ÷HÿßÕÿëùçþ¿@þ» ÌðHÿׯÿm¤ÿßü¾¾éaðûú¿Ê
+÷ÿ&ÐÿëÙùß²à÷õ=ÿ¡ãþßú}#ÒÿÂà
+çmþM ûÇ7µÖÿ·G
/òÿ¤áM §þ¿Âû¿ çû×ÿÇ'"ý/l Þ°ÿÜÿÙ#'è?¨ø¿vòáÿ3ATÿjþ¯ëüçüÿàþ5ü_Sþ[× ðùF¤ÿZþ¯×þïÙÿ
þMøÔ{~é_Ãÿ5é?6ý[Àúïþ5ü_Óþ?´ôÿË7²ó?ÿ×yþCGÿ ø¿|#Ò¿ÿkZÿÇ¿þ
+ÀÿåZëÿ×Ëýo ä¿ÚpÞÿêþ«ù¿®æ?ÿ§ ¼ÿûF ÿFÅÿÏþ/òÿMÕ¿ÿ«\çñü7á&~Äæþ5ó¿xÿ3û_ßô¯ÿ5¯ÿä@þoDú×ÌÿÂÿiBò]#Ò¿bþù6pþëÙùbþþoÂcDú¯æÿºZÿÛübAþ©µþWóųÿÿ§ Sÿçþ«ù¿.çÐ Æû$ïþ£NþWü_ ÿ¢úkæqÿkù_¾é_3ÿýÿË7"ýWó]®ÿí°aDÿ|þù|<üÚmé_3ÿûXÿ}#Ò¿fþç¿&àÿòìüO1ÿþOÈÿòHÿù_èßÔïZë½ü¯8ù¿ð
pÞÿåþ5æ?Îù_ÿ Y¥ÿ\Z¾þ`TøRÿWÊ ÿP
+ù_&¬ÿqÿ´ÿ±ø½æayýKiwÁa?ü&l®ÿñÛ᾿»}~ü2|ko~3Ë÷ÿsýsôãTöÿ>Ù¬ÿïßS¿ûÞ?Üß>Þýí3ÞÕxÑ~ûÿ6ÿfÝß¾Ù¬ÿÝþðæ_³^ÿmÈÜÿÀzïþìþWíÿsãù_NôÿØðõ+ûϬÕÿtþ¿î3ÿB§þïØ¥ÀùÛêºÿI*ý¿)0ÿÁQý«õÿ^æ?ÐÿkEÊ
`Çô¯9ÿügèÿñHÿóÎý¿ÜÿÙÀüßô¯8ÿ¡Áÿkáo¾é_sþ÷ÿ&ÐÿëÙùâüîÿM ÿ×7"ýkôÿÎóп tÿø¦Öú_©ÿ·~Ný¿ÜÿóTü?>é_£ÿwÿÀý 9rèþÎüöäÿÂÿg¨þjóÚñç¿ÌðHÿóÿiþ/ßô_ËÿõÚÿ=û¿Ð¿ úcÏ#À/"ýkÎ ÿÕÖßô¯9ÿûðùFvþ§6ÿ!ú?LÀÿåþç?dôoþ/ßÔZÿëÍhñBþ«oDú¯æÿº|ÿ/¡¥ÿÓÞÿ}#УâÿgÿWÄÿe¨þÕü_å²ÿù_FÜÄ8À#Ò¿fþï&pÿëþ5ò¿æõüÈÿòHÿù_ø?MhP¾kDú×Ìÿ"ÿÃÎ}#;ÿSÌÿÂÿmBøÀ@Ïô_Íÿuµþ·-ù&Äü=Ský¯æÿÿüÿçþ«ù¿.çТÆû$ïþ£NþWæ?ü_ê¯ÿÅý¯ äùF¤Íü/ôoþ/ßô_Íÿu½þGôoÂçÏÇÃ¯ÝøØæIàþ5ó¿¸ÿ1õß7"ý+æÿaþ/ßÈÎÿó¿èÿ4ü/ßô¯ÿ
þM@ý¾©µþ×ËÿSþþoÈÿòHÿóçü/ÎÿMPϬÓÿÍRË×
+_êÿjRôJéðY°¶þÇýÓþÇþá÷_åõ/¥£ÿ7妡þl®ÿñÛ᾿»}~ü2|ko~3Ë÷ÿsýs¼ÿжìÿ=³Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿð¢ÿ<ü÷ÿmäýߺ¿}³Yÿ»ýá-Í¿f½þÛñÿÿÇ72ý/Ùý¯ÚÿçÆó¿Üpÿoýß¾Y«ÿéüÝg,;ÿ %
.Nýß± ÿ°þ§û¤ÒÿÂÔÿËù¯ ¢úWëÿ½Ì`þ)#Ò¿âüò_làýß7"ýkÌûÉ7ù¾é_sþþ?óHÿó¸ÿ7þ_ßÈÎÿç?pÿoý¿¾é_£ÿù¦ÐýãZëþß4<'ÿ¿ë8ÿ3!ç©ø|"Ò¿Fÿ/óLÉ@Ïôtæ?´'ÿþ?Dõ×ÿÀü_ÿàþ5ç? ðùF¤ÿZþ¯×þïÙÿ
þMøÔ{~é_sþCþ-`ý÷Hÿóèÿ2ÿodçó¸ÿ5ÿoDú×ÿþMÀÿåZë½ùíÉÿAþ«
+ä¿úF¤ÿjþ¯Ë÷æ?XÁû¿oúoTü_ñìÿ"ÿßQý«ù¿ÊuþÏnâG`é_3ÿ÷?¸ÿõHÿù_óúOþ äùF¤Íü/ü&4(ß5"ýkæÿa翾ÿ)æáÿ6!|` gDú¯æÿºZÿÛLþ ± ÏÔZÿ«ù¿âÙÿ
ÿÓæÿùF¤ÿjþ¯Ëù_%´èßñþÉûE ÿ¨ÿ'ÿWÀÿe¨þù_Üÿ@þoDú×ÌÿBÿ&àÿòHÿÕü_×ëDÿ&|þù|<üÚmé_1ÿüwXÿ}#Ò¿fþç¿&àÿòìüO1ÿþOÈÿòHÿù_èßÔïZë½ü¯xòüß&ÿåþ5æ?Îù_ÿ Y¥ÿvñÈÇ?¾ÔÿÕ¤2è?\ðY°¶þÇýÓþÇþá÷_åõ/%6i¨Ê©¥þl®ÿñÛ᾿»}~ü2|ko~3Ë÷ÿåüR^ Xÿ-8Õ"²ÿ÷Êfý¿xÿúÝ÷þáþöñîoñ®þÃþóðcÜÿ·Ìÿµ!£w×lÖÿnxKó¯Y¯ÿ÷#Xï}#ÓÿÝÿªýn˨ÿ
+çÿ&_ÿØÎþß'kõ?ÿ¯ûeç?ax÷ïâÔÿ»qþç?úl«ÿéþ'©ôÿ¦pêÿ
+ÿ ªµþßËü¦ë8ÿ3!åB°cDúWÿØÿ@ÿoDú×ÿ0ç0ÿÅæ?øF¤Åùþ?óHÿóÿbý¿¾ÿéÍ(Üÿ@ÿ¯oDú×èÿ=Ïhп tÿø¦Öú_©ÿ·eÔî:ôoÂéö5ãÿñHÿý¿çùÜÿÙ#'èq3ð¨ðåóÚÿÿ
+¢ú«Íhºü'ÿàþç?4èßü_¾é¿ÿëµÿ{ö¡>õÇG_DúWÿ
+ú·õß7"ý+Î`þ
+ø¿|#;ÿSÿ;ú?LÀÿåþç?´èßü_¾©µþ×ÿÐNóØÿpªù¯né¿ÿëòý¿þOxÿ÷@ÿÿ+ý_ ÿ¢úWóëü/ÿ&ÜÄ8À#Ò¿bþWÃû ÜÿúF¤ü¯yý'ÿÃò¿|#Ò¿fþþOïþ5ó¿èÿ7ó_ßÈÎÿó¿ð>t< #Ò5ÿ×Õúß6äò÷Lõ¿ÿ+ý_ø?M¿~æÿùE¤ÿjþ¯Ëù_%4èßñþÉûE ÿ¨ÿ§ùþ/Dõ×Ìÿâþ×ò¿|#Ò¿fþú7ÿoDú¯æÿº\ÿÛqKþ
+øüóùxøµÛ< "Ò¿fþ÷?&°þûF¤Íü/ÎMÀÿåÙùbþý&ÿåþ5ó¿Ð¿ ¨ß7µÖÿzù_qÿÿÛS-ÈÿrHÿóçü/ÎÿMPϬÒ^<òñF
/õ5©ú%ãÿ2amýû§ýýÃï5¿Ëë_JÊÍPÿ4n©¿ëüv¸ïïn¿ßÚÃßÌòýÿ\ÿ\÷&;³±ìÿ}²Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿð¢ÿ<ü÷ÿm ÿÁÚ?}³Yÿ»ýá-Í¿f½þÛÐrþgþßÈô¿d÷¿jÿÛnìÿÎþ¦îoöÿ^Y«ÿéüÝg,;ÿ %
.Nýß±#ÿßmõ?Ýÿ$þßèÿ5DTÿjý¿ùMÇüOR.4 ;F¤æ?üëáýß7"ýkÌûñÿÀüßôÏü=¿ùF¤æ?üë¡ÿ×7²ó?æ?üÛ¡ÿ×7"ýkôÿÎóп tÿø¦Öú_¥ÿ7
+Ï8õÿîÿL!ç±ø|"Ò¿Fÿï<ÿû?räÐ3ý/n¾|þC{òáÿ³ATæ?üëaþoDúgþÿü_¾é¿ÿëµÿù¦|ê= ¿ôÏü=¬ÿ¾éùÿzðùFvþÇü;ø¿|#Ò?óþõàÿòMõ¿ÞüöäÿìÿM ÿÕ7"ýWó]¾ÿÐÐÿiïÿ¾è¿Qñųÿ«Áÿe¨þÕü_å:ÿç¿ 7ñ#0Çô¯ÿÅû ÜÿúF¤ü¯yý'ÿÃò¿|#Ò¿fþþOïþ5ó¿Èÿ0ó_ßÈÎÿó¿ð>t< #Ò5ÿ×Õúß¶ä êZë5ÿW<û¿ðÀ
ü?ßô_Íÿu9ÿ«ý0Þÿ#y¿ôuò¿âäÿ
+ø¿,Õ_3ÿû_ÈÿòHÿù_èßü_¾é¿ÿërýoÇWBôoÀçÏÇÃ¯ÝøØæIàþó¿È·õß7"ýkæqþkþ/ßÈÎÿó¿èÿ4ü/ßô¯ÿ
þM@ý¾©µþ×Ëÿæ?vø¿M ÿË7"ýkÌó¿8ÿ7!&@=³Nÿy©åëF
/õ5©ú¥´ø¿,X[ÿãþiÿcÿð{Í/Âòúºáï¥[æ°¹þÇoûþîöùñËð=¼ùÍ,ßÿÏõÏ%qÿgB77ìÿý²Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿð¢ÿ<ü÷ÿmäþÏÚ?}³Yÿ»ýá-Í¿f½þÛ9ÿ7ü'ßÈô¿d÷¿êü?§nìÿþEþ ôûfþ§óÿu±ìü'ïü]ú¿c;Î,ØVÿÓýORéÿMaêÿåü×Qý«õÿ^æ?4]Gþ£ )#Ò¿æüîÿM ÿÇ7"ýkÌûñÿÀüßô¯8ÿþ_óHÿóèÿµþ_ßÈÎÿôæ?Ðÿký¿¾é_£ÿwÿþM ûÇ7µÖÿJý¿]lÒ4ÿýBß%Àÿãþ5úçùÜÿ#'è?èÌh'ÿþ?DõWÿÐç¿ÌðHÿóZôoþ/ßô_ËÿõÚÿ}^ÿ#ú7áSìyøE¤ÍùôÀúïþ5ç?Ðÿeþ/ßÈÎÿç?Ðÿaþ/ßô¯9ÿýÿË7µÖÿzóÚÉÿÅþßò_}#Ò5ÿ×åû -ý&ðþïþÿWü_cþ;þ/}Dõ¯æÿ*ýÿã¯ÏnâG`é_3ÿ÷?¸ÿõHÿù_óúOþ äùF¤Íü/ü&0ÿÃ7"ýkæÑÿo翾ÿ)æáÿ6!|èx 8F¤ÿjþ¯«õ¿mÉÿ0!2 Ô5µÖÿjþ¯xöáÿ4ù¾é¿ÿërþW
+ú7a¼ÿGò~è?êäÅ)ÿ+ãÿ²@TÍü/îM ÿË7"ýkæ¡ðùF¤ÿjþ¯ëõ?¢>ÿ|>~íÆÇ6Oô¯ÿÅý ¬ÿ¾é_3ÿó_ðùFvþ§ÿèÿ´ü/ßô¯ÿÑ¿ ¨ß7µÖÿzù_qòáÿ6ü/ßô¯1ÿqÎÿâüßH õÌ:ýwK-_0*|©ÿ«IeÐ(¥àÿ²`mýû§ýýÃï5¿Ëë_J¿Rn¨¿ ëüv¸ïïn
¿ßÚÃßÌòýÿ\ÿ\"ûRJÀþß'õÿâý{êwßûûÛÇ»¿}Æ»ú/úÏÃqÿߢèþöÍfýïö·4ÿõúoCÆÿcë½odú_²û_µÿÏ9ç¹áþß©ûý¿WÖê:ÿ_÷ËÎBI¡SÿwìRäüÇmõ?Ýÿ$þߦþ_ÎÿLÕ¿Zÿïeþó¬H¹Ð ìþ5ç?àÿ7þßô¯1ÿaîÿ%ÿÝæ?øF¤ÍùøÿL üÍ7"ýkÎàþßú}#;ÿSÿÀý¿ ôÿúF¤þ_æ?B÷ojÿUúÓð8õÿä®cþ³ }? ÿODú×èÿeþ)9rèþÎüöäÿÂÿg¨þóÿkó|#Ò¿æüôoþ/ßô_ËÿõÚÿ=û¿Ð¿ úcÏ#À/"ýkÎàü×Ößô¯8ÿügðùFvþ§8ÿþðùF¤Íùèßü_¾©µþ×ÿÐüý¿ ä¿úF¤ÿjþ¯Ë÷æ?XÁû¿oúoTü_ñìÿJø¿,Õ¿ÿ«\çñü7á&~Äæþó¿ZÞÿLàþ×7"ýkäÍë?ù&ÿåþ5ó¿ðÐ |×ô¯ÿEþ ÿúFvþ§ÿ
ÿÛð é¿ÿëjýo[ò?Lù{¦Öú_ÍÿÏþ/ü&0ÿÏ7"ýWó]Îÿ*¡Eÿ&÷ÿHÞ/ýGü¯8ÍìðY ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×õúÑ¿ >¿vãc'CDú×ÌÿâþÇÖßô¯ÿÅù¯ ø¿|#;ÿSÌÿ¢ÿÓò¿|#Ò¿fþú7õû¦Öú_/ÿ+üÿ· äùF¤ùsþçÿ&ÄD¨gVé?Ý,µ|ýÁ¨ð¥þ¯æ4ÿ9Òâÿ²`mýû§ýýÃï5¿Ëë_Êxð;ìsCþ ëüv¸ïïn¿ßÚÃßÌòýÿ\ÿ\Èÿµa.Á?1²ÿwÈfý¿xÿúÝ÷þáþöñîoñ®þÃþssÒi#ç&ÿâÍúßíoiþ5ëõßLþ 4ùF¦ÿ%»ÿUûÿÜ6͸ÿOç&¼ìÿçFp®X«ÿéüÝg,;ÿ %
.Nýß±£ÿÓmõ?Ýÿ$þߦþ_ÎMÕ¿ZÿïeþCÓÿfCÊ
`Çô¯8ÿ¡!ÿÕú|#Ò¿Æü9ÿþ?ÿàþ5ç?pÿoçÿ¾
é_sþ÷ÿ&ÐÿëÙùâüîÿM ÿ×7"ýkôÿÎóп tÿø¦Öú_©ÿ·1Mý¿¼ÿ0à§?ð<p
Hÿý¿çùÜÿÙ#'è?èÌhÿ`¨þóÈ4ù¾é_sþú7ÿoDú¯åÿzíÿç? >õÇG_Dú×ÿ@ÿ§ ¬ÿ¾é_qþCKÿ ø¿|#;ÿSÿ;ú?LÀÿåþç?´èßü_¾©µþ×ÿÐ2ÿÁ¹ä¿úD¤ÿjþ¯Ë÷ÿZü&ðþïþÿWü_)àÿ²@Tÿjþ¯rÙÿðÿÛp?â sHÿù_¼ÿÀý¯oDú×Èÿ×ò?L ÿË7"ýkæáÿ4ù?¾é_3ÿü8ÿõìüO1ÿÿ· áCÇÀ1"ýWó]ÿmKþ ± ÏÔZÿ«ù¿âÙÿ
ÿÓ¹ÌÿóHÿÕü_ó¿Jhп ãý?÷@ÿQ'ÿ+Nù_ÿ¢úkæqÿkù_¾é_3ÿýÿË7"ýWó]¯ÿýðùçóñðk7>¶y8D¤Íü/îL`ý÷Hÿù_ÿÿË7²ó?µü¯Dÿ§
+äùF¤Åü¯þM@ý¾©µþ×Ëÿÿÿ· s ÈÿòHÿóçü/ÎÿMPϬÓZjùúQáKý_M*þCÉÿkëÜ?íì~¯ùEX^ÿ»n|þ§<>ÿ©¿>ëüv¸ïïn¿ßÚÃßÌòýÿ\ÿ\ïÿ&¼ìÿÇ-ûwlÖÿ÷ï©ß}ïîoïþöïê?üGÿÃqÿßòþo;٬ÿÝþðæ_³^ÿüñÿ@þodú_²û_·ÿoÓØÿSáüÏWûÿ©ç+Öê:ÿ_÷ËÎÂðÎßÅ©ÿ;vãüoÎôÙVÿÓýÏâÃà5ç¿ùôüobàü×Qý«õÿ^æ?4]Çù )#Ò¿âüÿßú|#Ò¿Æü9ÿüwÿàþç?$ÎÿLàþÏ7"ý+Îh¸ÿ7þ_ßÈÎÿôæ?îÿM ÿ×7"ýkôÿç?ÿcÝ?¾©µþWéÿMÃ@<ùºÌügæüBÎãx¸B¤þßóüîÿlÈ@Ïôtæ?´Óüü&ê¯6ÿ¡é:æÿÀüßô¯8ÿ¡Aÿ&àÿòHÿµü_¯ýß³ÿýð©?ö<ü"Ò¿âüÄù¯ ¬ÿ¾é_sþý_&àÿòìüOmþCì
èÿ0ÿoDúWÿТðù¦Öú_oþC;Í`ÿoÂ\ò_}"Ò5ÿ×åû
+ý&ðþïþÿW<û¿Èÿ7ATÿjþ¯rÿÅóßøcDúWÌÿjxÿ3û_ßô¯ÿ5¯ÿä@þoDú×ÌÿÂÿió?|#Ò¿fþù&pþëÙùbþþoÂcDú¯æÿºZÿÛübAþ©µþWóųÿÿ§ s ÿçþ«ù¿.çÐ Æû$ïþ£Nþó-Õ_3ÿû_ÈÿòHÿù_èßü_¾é¿ÿërýoÇ-ú7àóÏçãá×n|ló$pHÿù_ÜÿÀúïþ5ó¿8ÿ5ÿodçù_ô@þoDú×ÌÿBÿ& ~ßÔZÿëåMó;ú?LK@þODú×ÿ8çqþoBL$zfþ'~ýɨð¥þ¯&Aÿ!ë?þ/}VÖÿ¸ÚÿØ?ü^õ°¼þ%ñï¥Ôæú[°µþÇoûþîöùñËð¥=¼ýÅ,ßÿÏõÏüO^íÿGnØ
+øb«þ_¬Oýî{ÿpûx÷×ÏxWÿá?ú~ûÿüxß÷ÍVýïö75ÿõúoºÂû¿ ø|#Òÿ¢ÝÿºýÓýß9Eü?&\ìÿ¿~åyàúÿW~ƲóPRèâÔÿËÿÌù>êºþI
+Öÿÿû¿Ð4ÔßIý¶ÿnÈhºÿß
+Àèaûïù¥%ÿÑÞÿ}#ÑÿÂößuóÎùù/&0ÿÁ7ý/lÿÝ2ÿþ?#óDÿÛ7ä?.sÿoý¿¾ÿ-kÿÝ4ÿüèÿõDÿÛ·ÿ5ýß×7Öÿ·ÚWõÿ&ú#÷&Ì%8ûúç+$ú_Øþ»aÿ;îÿlÈ@Ïl×Ðñ5íäÿÂÿg¤þõü_×ó"ý&0ÿÁ7ý«ø¿¦ü·Ñ¿ ø¿|#Ñ5ÿ×kÿ÷ìÿBÿ&|êù8F¢ÿ×yþKKþ£ ¬ÿ¾è_Åÿ5å?vûðùFtþ§áÿ:ÏôÿË7ý«ø¿¦ó¿¦ ðù¦Òú_Íÿ5Ýÿâÿ²b.ù¯>è¿ÿëòý?wþOxÿ÷Ívý/1*|yþ×ÙÿñY ©=ÿW¹Êÿ"ÿÓøc$úWÍÿâýÏî}#Ñ¿Jþ×¼þÿaù_¾è_5ÿÿ§
+ÊwDÿª
ù_äÀù¯oDçù_ø¿M: è¿ÿërýïLþ ± ÏTZÿëù¿âäÿ"ÿß¹ÌÿóDÿõü_ó¿òø×пãý?÷ËvýG¥ü¯ÓýßðÀÿe¤þªù_Üÿ@þo$úWÍÿBÿ&àÿòDÿõü_×ëBÿ&|þù|<üÚÏmè_5ÿûXÿ}#Ñ¿fþù6àÿòèüO3ÿþOÈÿòDÿªù_èßÔïJëÅü¯Éÿéÿ0a.ù_>è_eþãÿÅù¿ 1¡xϬÒì{¾^3*|©ÿ«IeÐ(%áÿ²`mýû§ýýÃï5¿Ëë_êò°P6×ÿøípßßÝ>?~¾µ7¿åûÿ¹þ¹Dú?MxµÿOiü»WlÖÿùï©ß}ïîoïþöïê?üGÿÃñü¿eþ
+4øf³þwûÃ[Ízý·üoXï}#ÓÿÝÿºýNçÿ©àÿ3áÕþÿëWöÿîX«ÿé`Ýg,;ÿ %
.Nýß±ô°þ§ ´ô×`Íùo>=ÿ9ÿ5ATÿ
+À§¾UùM×qÿoBÊ
`Çô¿°ø}ý_ÍèîÿM ÿÇ7"ý/l ~Wÿ¯ç?ûÿȵù¾éaðúõ¿ó?¸ÿóHÿß×ÿUþsh¹ÿ7þ_ßÈÎÿ5 ¿¯ÿëù÷ÿ&Ðÿëþ6 o8ÿk[ôoÝ?¾©µþ¿Õ <*|ÿ'
±õÿÔÿ×1ÿѹÿÐ÷ãx¸B¤ÿ
+Àöÿû?räÐ3ýÿWÓNþ/ü&ê_ÍÿuÿÜu<ÿ-`þoDú×ðMùo]þMÀÿåþkù¿^û¿gÿú7áSìyøE¤
+ÿפÿØpþkë¿oDú×ðMûÿáï£ðùFvþ§àÿ:Ïèèÿ0ÿoDú×ðMëÛ¢ðù¦Öú_Åÿõrÿ[Æ-ú7`.ù¯>é¿ÿëjþchèÿ4÷ßôߨø¿âÙÿUðY ª5ÿW¹ÎÿâùoÂMüÌ1"ýkæñþg÷¿¾é_#ÿkÊÿ·èß ò¿|#Ò¿fþþOïþ5ó¿Èÿ0ó_ßÈÎÿó¿ð>t< #Ò5ÿ×Õúß¶äò÷Lõ¿ÿ+ý_ø?MKÀü?ô_Íÿu9ÿ«ý0Þÿ#y¿ôuò¿ÿh¨þjù_ÜÿZAþoDúWÌÿb
þ
+ø¿|#Ò5ÿ×õúÑ¿ >¿vãc'CDú×ÌÿâþÇÖßô¯ÿÅù¯ ø¿|#;ÿSÌÿ¢ÿÓò¿|#Ò¿fþú7õû¦Öú_/ÿkòú?LK@þODú×ÿxÎÿâþÏH õÌ*ý7ÝRË×
+_êÿjRôJiñY°¶þÇýÓþÇþá÷_åõ/eü9ìDòxÿCýõÙ\ÿã·Ã}wûüøeøÖÞüfïÿçúçá߬ÿÌøg®»WlÖÿ÷ï©ß}ïîoïþöïê?¼è??Æýéÿ6ó?ßlÖÿnxKó¯Y¯ÿ6dü?&ÐüåþìþWíÿóxñ7ìÿúl
+ðõ+û¬Õÿtþ¿î3ÿB§þïØÅó¶ÕÿtÿTúÓ¹ÿó_Dõ¯Öÿ{ÿÀü+R.4 ;F¤ÍùøÿM ÿÇ7"ýkÌó?È7ù¾é_qþCÃù ÿûF¤ÍùÜÿ@ÿ¯odçó¸ÿ7þ_ßô¯ÑÿËüSèþñMõ¿JÿoÞÚñü/sÿgÄT¾Çÿãþ5úÿ`J zF ÿ 3ÿ¡ü_øÿLÕ_sþý&0ÿÁ7"ýkÎ@ÿ&àÿòHÿµü_¯ýßóüôo§þØóðHÿóZôoë¿oDú×ÿÀý ø¿|#;ÿSÿ@ÿ ø¿|#Ò¿æüôoþ/ßÔZÿëÍh§ùìÿMÿË'"ýWó]¾ÿ3ÿÁ
+Þÿ}#Уâÿÿ+ü_ê_ÍÿU.ûÿù6ÜÄ8À#Ò¿fþï&pÿëþ5ò¿æõüÈÿòHÿù_ø?MhP¾kDú×Ìÿ"ÿÃÎ}#;ÿSÌÿÂÿmBøÐñ pHÿÕü_WëÛÿaB,Èß3µÖÿjþ¯xöáÿ4a* óÿ¼"Ò5ÿ×åü¯ôoÂxÿäý"ÐÔÉÿSþWÆÿe¨þù_Üÿ@þoDú×ÌÿBÿ&àÿòHÿÕü_×ëDÿ&|þù|<üÚmé_3ÿûXÿ}#Ò¿fþç¿&àÿòìüO-ÿ+Ñÿiù_¾é_1ÿ+£P¿ojÿõò¿âäÿÂÿmÂ\ ü_>é_cþãÿÅù¿ 1 êuúÏK-_0*|©ÿ«IeÐ(%áÿ²`mýû§ýýÃï5¿Ëë_Jãó?åú°¹þÇoûþîöùñËð=¼ùÍ,ßÿÏõÏÿYÿ-
+psÃþß'õÿâý{êwßûûÛÇ»¿}Æ»ú/úÏÃqÿߢ8ÿóÍfýïö·4ÿõúoC&ÿÉü?¾éÉîÕþ?·íøþSGþ« SèÿöÊZýOçÿë>cÙùO()tqêÿý6l«ÿéþ'©ôÿ¦0õÿrþg¨þÕú/óü7R.4 ;F¤Íùä¿Àû¿oDú×ÿ0çÐÿgó|#Ò¿âüÄù ¿ùF¤ÍùÜÿ@ÿ¯odçó¸ÿ7þ_ßô¯Ñÿ;Ï@ÿ&ÐýãZë¥þß.4
þ_C¦ô=þô¯Ñÿ;ÏàþÏ9ô@ÿAgþCËüCDõWÿÐtù&0ÿÁ7"ý+Î`þ
+ø¿|#Ò-ÿ×kÿ÷ìÿBÿ&|ê= ¿ô¯9ÿü7Xÿ}#Ò¿æüîLÀÿåÙùÚüáï¡ðùF¤Åù-ú7ÿojÿõæ?´ø¿
+@þ«WDú¯æÿº|ÿ/£
+ýÀû¿oúoTü_ñìÿ*ø¿,Õ¿ÿ«\çñü7á&~Äæþ5ó¿xÿ3û_ßô¯ÿ5åÿæÛ@þoDú×ÌÿÂÿiBò]#Ò¿fþù&pþëÙùbþþoÂcDú¯æÿºZÿÛübAþ©µþWóųÿÿ§ Sÿçþ«ù¿.çÐ Æû$ïþ£NþWü_
+þ/DõWËÿâþ×
+ò¿|#Ò¿bþó_lÀÿåþ«ù¿®×ÿþMøüóùxøµÛ< "Ò¿fþ÷?&°þûF¤Íü/ÎMÀÿåÙùbþý&ÿåþ5ó¿Ð¿ ¨ß7µÖÿzù_qòáÿ6a* ù_^é_cþã9ÿû?b"Ô3«ô[¾þ`TøRÿWÆùÏ¡dæ?°¶þÇýÓþÇþá÷_åõ/¹+ãó?åñùOýõÙ\ÿã·Ã}wûüøeøÖÞüfïÿçúçyÿ7a.Á?cØÿ»c³þ_¼Oýî{ÿpûx÷·ÏxWÿá?ú~ûÿ6pÿo;٬ÿÝþðæ_³^ÿ-ó¿@ÿ¾éÉîÝþ¿McÿgN
ü'^íÿ¿~eÿïµúÎÿ×}ƲóPRèâÔÿ»Èù ÛêºÿI*ý¿§çç¿&ê_ÿ÷2ÿ¡Yÿ
+H¹Ð ìþç?$ÎÿM ÿÇ7"ýkÌ ÿÃæ?øF¤ÍùÿÀù¿oDúWÿ@ÿ¿
+ôÿúFvþ§7ÿ¡pÿoý¿¾é_£ÿ÷<ÿù¯6ÐýãZëþß4¼ <ú:ü?6Ì%ø'¾ÿÀóÀ"ýkôÿç?pÿgC zF ÿ 3ÿ¡æ?àÿ3ATµùMÇüOÿàþç?4èßü_¾é¿ÿëµÿ{ö¡>õÇG_DúWÿÈ7õß7"ý+Îhèÿ2ÿodçóèÿ0ÿoDú×ÿþMÀÿåZë½ùíÉÿÕ±ÿ7a.ù¯>é¿ÿëòý¿ÿ§ ¼ÿûF ÿFÅÿÏþ¯ÿËQý«ù¿ÊUþWÇóßøcDú×ÌÿâýÏî}#Ò¿Fþ×¼þÿaù_¾é_3ÿÿ§
+ÊwHÿù_äÀù¯odçù_ø¿M: é¿ÿëjýoò?Lù{¦Öú_Íÿuºÿ-üæ0ÿÏ'"ýWó]Îÿ*¡Aÿ&÷ÿHÞ/ýGü/æ?Z"ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×åúßGÂèßÏ?_»ñ±ÍÀ!"ýkæqÿcë¿oDúWÌÿ"ÿÃü_¾ÿ)æÑÿiù_¾é_3ÿýú}Ský¯ÿ¦ü/ú?LK@þODú×ÿ8çqþoBL$zfþc»Ôòõ£Âú¿Tý;ü_¬ÿqÿ´ÿ±ø½æayý²ò_ÓKý
+Ø\ÿã·
Ã}wûüøeøÖÞüfïÿçúçÉ0áÕþܤ±ÿwÆfý¿xÿúÝ÷þáþöñîoñ®þÃô?ü÷ÿm ÿÛîÿ}³Yÿ»ýá-Í¿f½þÛÐâÿ1ü'ßÈô¿d÷¿nÿßñý?§Bþ« ìÿÇp®X«ÿéüÝg,;ÿ %
.Nýß±ßÿ9ÿÑg[ýO÷?IgþC7Í ÿ×Qý«õÿ^æ?0ÿÁ
+Àé_qþù/6pþçþ5æ?Ìý¿ÜÿÀüßô¯9ÿÿ ¿ùF¤ÍùÜÿ@ÿ¯odçó¸ÿ7þ_ßô¯ÑÿËüSèþñMõ¿Jÿo
+£õ÷Ôÿÿǹ'ÿOÎø!Ò¿Fÿ/óLÉ@Ïôtæ?´ÿÿ ¢úkÎ ÿÅæ?øF¤Íùèßü_¾é¿ÿëµÿ{ö¡>õÇG_Dú×ÿÀù¯ ¬ÿ¾é_sþý_&àÿòìüOqþý&àÿòHÿóп ø¿|Ský¯7ÿ¡=ù?ûæÿêþ«ù¿.ßÿÿ`ïÿ¾è¿ÑÉÿ:û¿ü_ê_ÍÿU®ó¿xþp?â sHÿù_¼ÿÀý¯oDú×Èÿ×ò?L ÿË7"ýkæáÿ4ù¾é_3ÿü8ÿõìüO1ÿÿ· áCÇÀ1"ýWó]ÿmKþ ± ÏÔZÿ«ù¿âÙÿ
ÿÓ¹ÌÿóHÿÕü_ó¿Jhп ãý?÷@ÿQ'ÿëtÿCÿËQý5ó¿¸ÿ5ü/ßô¯ÿ
þMÀÿåþ«ù¿.×ÿv|%Dÿ|þù|<üÚmé_1ÿüwXÿ}#Ò¿fþç¿&àÿòìüO1ÿþOÈÿòHÿù_èßÔïZë½ü¯pÿØÑÿaÂ\ò¿|"Ò¿ÆüÇ9ÿób"Ô3ëôÿq©åëF
/õ5©ú¥´ø¿,X[ÿãþiÿcÿð{Í/ÂòúÜ8Ô?åqþõ×gsýß÷ýÝíóãá[{xóY¾ÿëK¤ÿÓWûÿñì\±Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿðý?Æý¹ÿ3æßlÖÿnxKó¯Y¯ÿ6dÎÿMÀÿãþìþ×íÿÛt:ÿOþ?^íÿÇîoöÿÎX«ÿéüÝg,;ÿ %
.Nýß±ô°þ§û¤Òÿ¦þßÈù¯ ¢úWëÿ½Ìh¸ÿ7"åB°cDú×ÿÀý¿ ¼ÿûF¤ùsÿ/÷&0ÿÁ7"ý+Î ÿ×îÿ|#Ò¿âüúm ÿ×7²ó?½ùôÿÚ@ÿ¯oDú×èÿç? èþñMõ¿Vÿo7üù4ÿó?æüBßàyà
+þ5úçùÜÿ#'è?èÌh'ÿþ?DõWÿÐç¿ÌðHÿóZôoþ/ßô_ËÿõÚÿ}^ÿ#ú7áSìyøE¤Íù-ú·õß7"ýkÎ ÿËü_¾ÿ)Îàþ×ü_¾é_sþú7ÿojÿõæ?´ÿý¿ s ÈõHÿÕü_ïÿ%´ôÀû¿oúoTü_qò¥ÿËQý«ù¿Êeÿÿø+ÁóßøcDú×ÌÿâýÏî}#Ò¿Fþ×¼þÿaù_¾é_3ÿÿ§
+ÊwHÿù_äÀù¯odçù_ø¿M: é¿ÿëjýo[ò?Lù{¦Öú_Íÿ[ò¿KÀü?ô_Íÿu9ÿ«ý0Þÿ#y¿ôuò¿ÿh¨þù_Üÿ@þoDú×ÌÿBÿ&àÿòHÿÕü_×ëDÿ&|þù|<üÚmé_3ÿûXÿ}#Ò¿fþç¿&àÿòìüO-ÿ+Ñÿiù_¾é_1ÿ+£P¿ojÿõò¿&ÿG ÿùäùD¤ùsþçÿ&ÄD¨gV鿹YjùúQáKý_M*þC)ÿkëÜ?íì~¯ùEX^ÿRbCýSûÿ©¿>ëüv¸ïïn¿ßÚÃßÌòýÿ\ÿ\èÿ°á¼ÿjÿkÁnÀõÿâý{êwßûûÛÇ»¿}Æ»ú/úÏÃqÿßFÞÿMàüÏ7õ¿ÛÞÒükÖë¿
+üÈòLÿKvÿ«öÿ¹mÇ÷ÿÜòßL
+ðõ+û¬Õÿtþ¿î3ÿB§þïØÿoöúîJÿo:÷ÿrþk¨þÕú/óù6¤\h vHÿÌø×CÿoDú×ÿ0÷ÿâÿ5ù¾éùÿzóHÿÌø×Cÿ¯odçÌø·Cÿ¯oDú×èÿç? èþñMõ¿JÿoÞr3ú:ÖÎ÷¯ÿODú×èÿç?pÿgB zF ÿ 3ÿ¡=ù¿ðÿÙ ª?óþõ0ÿÁ7"ý3ÿá_þ/ßô_ËÿõÚÿÍüS>õÇG_DúgþÿÖßôÏü=ø¿|#;ÿcþÿü_¾éùÿzðù¦Öú_oþC;Í`ÿoÂyÿEþ«SDú¯æÿº|ÿ/¡¥ÿÓÞÿ}#Уâÿgÿùÿ&ê_ÍÿU.ûÿù6ÜÄ8À#Ò¿fþï&pÿëþ5ò¿æõüÈÿòHÿù_ø?M`þoDú×Ìÿ¢ÿßÎ}#;ÿSÌÿÂÿmBøÐñ pHÿÕü_Wëÿ8ýò÷Lõ¿ÿ+Nþ/òÿm
+Àü?¯ô_Íÿu9ÿ«ý0Þÿ#y¿ôuò¿â4ÿ±àÿ²@TÍü/îM ÿË7"ýkæ¡ðùF¤ÿjþ¯ëõ?¢>ÿ|>~íÆÇ6Oô¯ÿÅý ¬ÿ¾é_1ÿüðùFvþ§ÿEÿ§ äùF¤Íü/ôoê÷Mõ¿^þWò¿ðpÞÿåþ5æ?Îù_ÿ Y¥ÿZ¾þ`TøRÿWÊ ÿPJÂÿeÁÚú÷Oûûßk~׿õþ^Jc,õ7`sýß÷ýÝíóãá[{xóY¾ÿëó¿lhÛ©ìÿ}²Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿð¢ÿ<ü÷ÿ-ý_6ÐýíÍúßíoiþ5ëõßÎÿm ÿÉ72ý/Ùý¯ÚÿçÆó¿:òLøúý¿gÖê:ÿ_÷ËÎBI¡SÿwìbæüÇmõ?Ýÿ,>^sþSú9ÿ5ATÿjý¿ùMÇúoCÊ
`Çô¯9ÿûèÿñHÿóæüü&0ÿÁ7"ý+ÎHôÿ@øoDú×ÿÀý¿ ôÿúFvþ§8ÿûèÿõHÿý¿óüôoÝ?¾©µþWéÿMÃsâtþ¹ÿ3"ç©ø|"Ò¿Fÿïyþ÷6äÈ gú:óÚÉÿ
ÿÏQýÕæ?4]×ñü·ù¾é_qþCþMÀÿåþkù¿^û¿gÿú7áSìyøE¤Íùä¿Àúïþç?´ÜÿÿË7²ó?µùÃßCÿàÿòHÿóZôoþ/ßÔZÿëÍh§ùìÿM ÿÕ7"ýWó]¾ÿÀüWxÿ÷@ÿÿ+ý_ÿ¢úWóëü/ÿ&ÜÄ8À#Ò¿fþï&pÿëþ5ò¿¦üqKþ
+ ÿË7"ýkæáÿ4ù¾é_3ÿü8ÿõìüO1ÿÿ· á =#Ò5ÿ×Õúß¶äò÷Lõ¿ÿ+ý_ø?M`þoDú¯æÿºÿUBþMïÿ¼_ú:ù_qò5ø¿,Õ_-ÿû_+ÈÿòHÿù_̱ÿoDú¯æÿº^ÿ#ú7áóÏçãá×n|ló$pHÿù_ÜÿÀúïþ5ó¿8ÿ5ÿodçù_ô@þoDú×ÌÿBÿ& ~ßÔZÿëåÅÉÿ
ÿÛò¿|#Ò¿ÆüÇsþ÷6ÄD¨gÖéñÈÇ?¾ÔÿÕ¤2è?ðY°
¶þÇýÓþÇþá÷_åõ/¥ÃßKiÜR6×ÿøípßßÝ>?~¾µ7¿åûÿ¹þ¹0ÿËÙÿ{f³þ_¼Oýî{ÿpûx÷·ÏxWÿáEÿyø1îÿÛÀù tûf³þwûÃ[Ízý·¡eý7æ/ßÈô¿d÷¿jÿsÏÿr"ÿÅú¿}³VÿÓùÿºÏXvþJ
+]ú¿cGÿ§
+ÛêºÿI*ý¿)Lý¿ÿ ªµþßËü¦cý·!åB°cDú×ÿ@þ« ôÿøF¤ùsþý&0ÿÁ7"ýkÎ`þ ÿûF¤ÅùÌÿµþ_ßÈÎÿôæ?îÿM ÿ×7"ýkôÿç?4èߺ|Ský¯ÔÿÛÅ6Oý¿ÿóTü?>é_£ÿwÿÀý 9rèþ7
+_>ÿ¡eþ!¢ú«ÍhºüGÿàþç?0ÿËü_¾é¿ÿëµÿ{ö¡>õÇG_Dú×ÿ@þ ¬ÿ¾é_sþý_&àÿòìüOqþ÷¿&àÿòHÿóп ø¿|Ský¯7ÿ¡eþ!ä¿úF¤ÿjþ¯Ë÷ÿú?Màýß7ý7*þ¯xöµø¿,Õ¿ÿ«\çñü7á&~Äæþ5ó¿xÿ3û_ßô¯ÿ5¯ÿä@þoDú×ÌÿÂÿiBò]#Ò¿fþù&pþëÙù^þWÿÛð é¿ÿëjýo[ò?Lù{¦Öú_Íÿ[ò¿aþoDú¯æÿºÿUBþMïÿ¼_ú:ù_qòEü_ê¯ÿÅý¯ äùF¤Íü/ôoþ/ßô_Íÿu¹þ·£%ýðùçóñðk7>¶y8D¤Íü/îL`ý÷Hÿù_ÿÿË7²ó?Åü/ú?M ÿË7"ýkæ¡P¿ojÿõò¿âäÿÂÿmù_¾é_cþãÿÅù¿ 1 êUúOíRË×
+_êÿjRôJ ø¿,X[ÿãþiÿcÿð{Í/ÂòúecýSNõ·`sýß÷ýÝíóãá[{xóY¾ÿëó¿lKðÏü"ÀnÀõÿâý{êwßûûÛÇ»¿}Æ»ú/úÏÃqÿßâÿ±üßlÖÿnxKó¯Y¯ÿ6´ä¿ÀzïþìþWíÿsÛ4ãþ?ÿbÃËþnçyàµúÎÿ×}ƲóPRèâÔÿ»ØpþcÁ¶úîJÿo
+Sÿ/ç¿&ê_ÿ÷2ÿ¡é:òßMH¹Ð ìþ5ç?Ðÿcý?¾é_cþÃÜÿKÿ ÌðHÿóðÿ@øoDú×ÿÀý¿ ôÿúFvþ§7ÿ¡pÿoý¿¾é_£ÿ÷<ÿùO6ÐýãZëþ߮˧þ¿Èù s þÉyúÏWô¯Ñÿ;ÏàþÏ9ô@ÿAgþC;ù¿ðÿ ª¿æüú?M`þoDú×ÿþMÀÿåþkù¿^û¿gÿú7áSìyøE¤ÍùôÀúïþ5ç?Ðÿeþ/ßÈÎÿç?pÿkþ/ßô¯9ÿýÿË7µÖÿzóÚiþûæÿêþ«ù¿.ßÿKhèÿ4÷ßôߨø¿âÙÿÕâÿ²@Tÿjþ¯rÿÅóßøcDú×ÌÿâýÏî}#Ò¿Fþ×¼þÿaù_¾é_3ÿÿ§ ÌÿñHÿù_äÀù¯odçzù_Ìÿ±!|èx 8F¤ÿjþ¯«õ¿mÉÿ0!äïZë5ÿW<û¿ð0ù>é¿ÿërþW
+ú7a¼ÿGò~è?êä1ÿÑQý5ó¿¸ÿ5ü/ßô¯ÿ
þMÀÿåþ«ù¿.×ÿv´£>ÿ|>~íÆÇ6Oô¯ÿÅý ¬ÿ¾é_3ÿó_ðùFvþ§ÿEÿ§ äùF¤Íü/ôoê÷Mõ¿^þ×xÿ»þæÿåþ5æ?Îù_ÿ Y¥ÿ¦,µ|ýÁ¨ð¥þ¯&Aÿ¡æ?°¶þÇýÓþÇþá÷_åõ/eø÷Pÿ_êoÀæú¿îû»ÛçÇ/÷öðæ7³|ÿ?×?Àû¿ Sbüg®»WlÖÿ÷ï©ß}ïîoïþöïê?¼è??Æý¹ÿ7ó?ßlÖÿnxKó¯Y¯ÿ6dòM ùË72ý/Ùý¯Úÿç¶ßÿsâüß© _¿²ÿ÷ÉZýOçÿë>cÙùO()tqêÿÃ8ÿ±`[ýO÷?I¥ÿ7û9ÿ5ATÿjý¿ùM×ÿjBÊ
`Çô¯9ÿóèÿñHÿóèÿ5
ù¾é_sþç&pþïþç?ÿlý¿¾ÿ)Îàþßú}#Ò¿Fÿï<ÿý@÷ojÿúOÿÓüöÿ&ï_3þô¯Ñÿ;ÏàþÏ9ô@ÿAgþC;ù¿ðÿ ª¿Úüvüàùo ó|#Ò¿âüýÿË7"ý×
ò½ö×ÿþMøÔ{~é_sþùï&°þûF¤ÍùôÿË7²ó?ÅùôÿË7"ýkÎ@ÿ&àÿòMõ¿Þüvò±ÿ7a* ù¯^é¿ÿëòý¿þOxÿ÷@ÿÿ+ý_þ/Dõ¯æÿ*×ù_<ÿM¸q9F¤Íü/ÞÿLàþ×7"ýkäMù?ôÿAþoDúWÌÿjðÐ |×ô¯ÿEþ ÿúFvþ§ÿ
ÿÛð¡ãàþ«ù¿®Öÿñ¯£bAþ©µþWóųÿÿ§ Sÿçþ«ù¿.çÐ Æû$ïþ£NþWü_-þ/Dõ×Ìÿâþ×ò¿|#Ò¿fþú7ÿoDú¯æÿº^ÿ#ú7áóÏçãá×n|ló$pHÿù_ÜÿÀúïþ5ó¿8ÿ5ÿodçù_ô@þoDú×ÌÿBÿ& ~ßÔZÿëåç?âÿ6á| KþSDú×ÿxÎÿâþÏH õÌ:ý\jùúQáKý_M*þC)Ì4amýû§ýýÃï5¿Ëë_J<Õ?åü76×ÿøípßßÝ>?~¾µ7¿åûÿ¹þ¹DòL
+psÃþß'õÿâý{êwßûûÛÇ»¿}Æ»ú/úÏÃqÿßFîÿMàüÏ7õ¿ÛÞÒükÖë¿
+õßò|#ÓÿÝÿªýÿûÿ&ÿdÂT ú¿½²VÿÓùÿºÏXvþJ
+]ú¿c"ç?l«ÿéþ'©ôÿ¦0õÿrþk¨þÕú/óÚñWõß
+Àé_sþþ?èÿñHÿóèÿ5
ù¾é_sþç&þæþ5ç?pÿoý¿¾ÿ)Îàþßú}#Ò¿Fÿï<ÿý@÷ojÿú»Ñø7öÿqþgÃT¾Çÿãþ5úçùÜÿ#'è?èÌhOþ/ü6ê¯9ÿüÿàþ5ç? ðùF¤ÿZþ¯×þïÙÿ
þMøÔ{~é_sþùï&°þûF¤Åùþ/ðùFvþ§6ÿ!1ÿÕü_¾é_qþCFÿ&àÿòMõ¿Þüvò±ÿ7a* ù¯^é¿ÿëòý¿þOxÿ÷@ÿÿ+ý_ ÿ¢úWóëü/ÿ&ÜÄ8À#Ò¿bþWËû ÜÿúF¤ü¯yý'ÿÃò¿|#Ò¿fþþOÿáþ5ó¿Èÿ0ó_ßÈÎÿó¿ð>t< #Ò5ÿ×Õúß¶äò÷Lõ¿ÿ+¶ä2ù^é¿ÿërþW -ú7a¼ÿGò~è?êäÅiþcÿËQý5ó¿¸ÿ5ü/ßô¯ÿ
þMÀÿåþ«ù¿®×ÿþMøüóùxøµÛ< "Ò¿fþ÷?&°þûF¤Íü/ÎMÀÿåÙùbþý&ÿåþ5ó¿Ð¿ ¨ß7µÖÿzù_ñäÿø¿M
+@þWDú×ÿ8çqþoBL$zfþ;¾þdTøRÿWÊ ÿ»ÿ+ëÜ?íì~¯úEX^ÿRbnú§q¹ þlÿñÛ᾿»}~ü2|io1Ë÷ÿsýsN¼ÿ0à¹ì\±Uÿ/Ö¿§~÷½¸¿}¼ûëg¼«ÿð¢ÿ<ü÷ÿMâþÏÞ÷}³Uÿ»ýáMÍ¿f½þ®°þþ}#Òÿ¢Ýÿªýnº±ÿ;§ÿÏýÿׯ<\±RÿÓñÿÊÏXvþÊ ú8õÇ
+ç?lªÿéú'-þ5Xsþ;ü3îÿB©¿ú/lÿÝÿÐtüGR.4 ;F¢ÿ
í¿[æ?îÿm ÿÇ7ý/lÿ]7ÿáäÿiôoó|#ÑÿÂöß-óý¿6pßïþ¶ÿnÈ.ý¿6ÐÿëÑùß²ößMóèÿµþ_ßHô¿°ýwËù_Cÿ¯
+tÿø¦ÒúÿVûïrÿOþؤÑÿSÿdÃ\³ÿ§ïy¸B¢ÿ
í¿öÿü_#räÐ3Ûõtü_M{òáÿ³ARÿzþ¯Ëü¦ç¿ÌðDÿ*þ¯)ÿdôoþ/ßHô_ÍÿõÚÿ}^ÿú7áSäÈÇ1ý«ø¿Îó_Úý[ÀúïþUü_Sþãx\þ
+ÀÿåÑùÿkÒ$ÿÙü_¾è_Åÿ5ÿ5ýÿË7Öÿ:þ¯ûßÜEöÿ&Ì% ÿÕ'ý×ó]¾ÿ箥ÿÓÞÿ}³]ÿRþ×ÙÿÕáÿ²@Rÿzþ¯rÿÅóßøc$úWÍÿâýÏî}#Ñ¿Jþ×yýä@þo$ú×ÌÿjñÐ |×Hô¯ÿEþ ÿúFtþ§ÿ
ÿÛð¡ãàþëù¿.×ÿ®Éäò÷L¥õ¿ÿ+ý_ø?MKÀü?Hô_Ïÿu9ÿ+w-ú7a¼ÿGò~Ù®ÿ¨ÿ&ÿWÿËIýUó¿¸ÿ5ü/ßHô¯ÿ
þMÀÿåþëù¿®×ÿþMøüóùxøµÛ< "Ñ¿jþ÷?&°þûF¢Õü/ÎMÀÿåÑùfþý&ÿåþUó¿Ð¿ ¨ß7Öÿù_ÿ#ÒÿaÂ\ò¿|"Ñ¿ÊüÇsþ÷6ÄD¨gVé?ů×
+_êÿjRôJIø¿,X[ÿãþiÿcÿð{Í/ÂòúNõO¹¡þ&l®ÿñÛ᾿»}~ü2|ko~3Ë÷ÿsýsaþ§
+/ûÿ¶þÀnÀõÿbþ{êwßûûÛÇ»¿}Æ»ú/úÏÃñü¿Eÿ6ÿâÍúßíoiþ5ëõßÞÿmÀÿãþìþWíÿsÛ4ãþ?uÿð²ÿÿúý¿CÖêº X÷ËÎBI¡Sÿw<ÍÿáüGmõ?] ¥¥¿kÎs:õÿÆÈù ¢ú/l >ÝðÊhºÿ¿ )#ÒÿÂà÷õ5ÿ¡kÈ4÷ßô¿°ø]ý¿ÿpîÿÌ1ù¾éaðúõ¿þ?ðûúF¤ÿ
+Àïëÿ*ÿù/FÐÿëÙùß²à÷õ=ÿ¡ãþßú}#ÒÿÂà
+çmþM ûÇ7µÖÿ·G
/òÿ¤áM Mý¿
óæüóô®éaðýàþÏ9ô@ÿAÅÿÕ´ÿÿ ¢úWó]ç?wä?Àüßô¯áÿòߺýÿË7"ý×ò½öÏþ/ôo§þØóðHÿþ¯Iÿ±¡ÿÓÖßô¯áÿöÿÌ1ÿodç
+þ¯óüþðùF¤
+ÿ×´þ·-ú7ÿojÿUü_/÷¿eÜ æÿêþ«ù¿®æ?þOxÿ÷@ÿÿ+ý_ÿ¢úWóëü/ÿ&ÜÄ8À#Ò¿fþï&pÿëþ5ò¿¦üqKþ
+ ÿË7"ýkæáÿ4ù?¾é_3ÿü8ÿõìüO1ÿÿ· áCÇÀ1"ýWó]ÿmKþ ± ÏÔZÿ«ù¿âÙÿ
ÿÓ¹ÌÿóHÿÕü_ó¿Jhп ãý?÷@ÿQ'ÿ+Nþ¯ÿ¢ú«åqÿkù_¾é_1ÿù/6àÿòHÿÕü_×ëDÿ&|þù|<üÚmé_3ÿûXÿ}#Ò¿fþç¿&àÿòìüO1ÿþOÈÿòHÿù_èßÔïZë½ü¯8ù¿ð0ü/ô¯1ÿñÿÅý
+1 êUúo[¾þ`TøRÿWÊ ÿP2ù_&¬ÿqÿ´ÿ±ø½æayýK6CýSnõ·`sýß÷ýÝíóãá[{xóY¾ÿë³þ[ð²ÿ¿¹aÿïÍúñþ=õ»ïýÃýíãÝß>ã]ýýçáǸÿoÉÿ¶üßlÖÿnxKó¯Y¯ÿû#пodú_²û_µÿÏmÓûÿTØÿð²ÿ§ÿÛ%kõ?ÿ¯ûeç?¡¤ÐÅ©ÿ;v1rþcÁ¶úîJÿo:åÿÇÀù¯ ¢úWëÿ½Ìhºû?R.4 ;F¤Åùä?Û@ÿoDú×ÿ0çÿló|#Ò¿æüü¿&þæþç?0ÿÍú}#;ÿÓÿP¸ÿ7þ_ßô¯Ñÿ{ÿ@þ³
+tÿø¦Öú_©ÿ·éäÿé:öÿ&Ì%ø§ï§?ð<p
Hÿý¿çùÜÿÙ#'è?èÌh§ùøÿLÕ_mþCÓuä¿Àüßô¯8ÿügðùF¤ÿZþ¯×þïÙÿ
þMøÔ{~é_qþC¢ÿÓÖßô¯9ÿþ/ðùFvþ§8ÿþðùF¤Íùèßü_¾©µþ×ÿÐNóØÿ0üWô_Íÿuùþ_BCÿ§ ¼ÿûF ÿFÅÿÏþ¯ÿËQý«ù¿ÊuþÏnâG`é_1ÿ«áýÏî}#Ò¿Fþ×¼þÓÿgù_¾é_3ÿÿ§ ÌÿðHÿù_äÀù¯odçù_ø¿M: é¿ÿëjýoò?Lù{
¦Öú_ÍÿÏþ/ü&Ì%`þODú¯æÿºÿUBþMïÿ¼_ú:ù_qÿØáÿ²@TÍü/îM ÿË7"ýkæ¡ðùF¤ÿjþ¯Ëõ¿·èßÏ?_»ñ±ÍÀ!"ýkæqÿcë¿oDú×Ìÿâü×ü_¾ÿ)æÑÿiù_¾é_3ÿýú}Ský¯ÿ§ùø¿MK@þODú×ÿ8çqþoBL$zfþÛÅ_0*|©ÿ«IeÐ(
ù&¬ÿqÿ´ÿ±ø½æayýKIqø{)Û@êoÀæú¿îû»ÛçÇ/÷öðæ7³|ÿ?×?Àý ã×?nýÿkÁnÀõÿâý{êwßûûÛÇ»¿}Æ»ú/úÏÃqÿߢ2zwÍfýïö·4ÿõúoC&ÿÑü?¾éÉîÕþ?·åtþ¸ÿ·aüúÇÖoöÿ>Y«ÿéüÝg,;ÿ %
.Nýß±-ç?l«ÿéþ'©ôÿ¦0ÍàüÏQý«õÿ^æ?4]Gþ« )#Ò¿æüöÿ&ðþïþ5æ?Ðÿk
+ó|#Ò¿æüòßM üÍ7"ýkÎàþßú}#;ÿÓÿÐqÿoý¿¾é_£ÿ÷<ÿ¡Eÿ&ÐýãZë¥þß.©ÿÿ¯
+ã×ß÷ø¼"Ò¿Fÿï<ÿû?räÐ3ýùíäÿÂÿg¨þóÈ1ù¾é_sþú7ÿoDú¯åÿzíÿý_èßOý±çàþç?0ÿÓÖßô¯9ÿþ/ðùFvþ§8ÿþðùF¤Íùèßü_¾©µþ×ÿÐNþ/öÿ&_?ù¯~é¿ÿëòý¿þOxÿ÷@ÿA
+_ìÿgÿWÆÿe¨þÕü_å:ÿç¿ 7ñ#0Çô¯ÿÅû ÜÿúF¤ü¯yý§ÿÏò¿|#Ò¿fþþOïþó¿Èÿ°ó_ßÈÎÿó¿ð>t< #Ò5ÿ×Õúß¶äò÷Lõ¿ÿ+ý_ø?M¿~æÿùE¤ÿjþ¯Ëù_%4èßñþÉûE ÿ¨ÿ'ÿWÂÿe¨þù_Üÿ@þoDú×ÌÿBÿ&àÿòHÿÕü_ëKþ»>¿vãc'CDú×ÌÿâþÇÖßô¯ÿÅù¯ ø¿|#;ÿSÌÿ¢ÿÓò¿|#Ò¿fþú7õû¦Öú_/ÿ+Nþ/üß&_?ù_~é_cþãÿÅù¿ 1 êuú_êøúQáKý_M*þCçÿáÿÒgeýû§ýýÃïU¿Ëë_r)ÃßK©ÍÔßõ?~;Ü÷w·Ï_/íáí/fùþ®Îø¿mKpÞÿGî}±Uÿ/Ö¿§~÷½¸¿}¼ûëg¼«ÿðý?Æýп ¼ïûf«þwûÃÍzý7]áüß¿|#Òÿ¢ÝÿºýÓýß9Eü&\ìÿ¿~åyàúÿW~ƲóPRèâÔÿË8ÿó}6Õÿtýÿ¬9ÿþ÷§þꯤþÛ7ä?4]$ÿÑ
+Àèaûïù¥åþßÎû}#ÑÿÂößuóÎù ÿ ÌðDÿÛ·Ìä¿ÚÀù¿o$ú_Øþ»!ÿ¹tûèÿõèüoYûï¦ùûèÿõDÿÛ·ÿ5ý@÷o*ÿoµÿ®êÿ-ÍÉÿÓ%æ?0àìÿÉç+$ú_Øþ»aÿ;îÿlÈ@Ïl×ÐñÖÿ&àÿ³ARÿzþ¯ëùý ÌðDÿ*þ¯)ÿmXпø¿|#Ñ5ÿ×kÿ÷ìÿBÿ&|ê= ¿Hô¯âÿ:Ïiú·õß7ý«ø¿¦üÇ®Ðÿeþ/ßÎÿ4ü_çùþðùF¢ÿ×tþ×ôoþ/ßTZÿ«ù¿òìÿbÿoÂ\ò_}"Ñ=ÿ×åûî2ý&ðþïíúoò¿Îþ¯ÿËIýëù¿ÊuþÏnâG`è_3ÿ+óþgï{¾è_%ÿk^ÿÉÿ0ü/ßHô¯ÿ
ÿÓå»F¢Õü/ò?Làü×7¢ó?Íü/üß& ÇHô_Ïÿu¹þwM&ÿÃX¿g*ÿõü_ñìÿÂÿiÂ\æÿù
D¢ÿzþ¯Ëù_¹ËèßñþÉûe»þ£Rþ×éþ/¤ÿËIýUó¿¸ÿ5ü/ßHô¯ÿ
þMÀÿåþëù¿®×ÿþMøüóùxøµÛ< "Ñ¿jþ÷?&°þûF¢Õü/ÎMÀÿåÑùfþý&ÿåþUó¿Ð¿ ¨ß7Öÿù_ÿ#ÒÿaÂ\ò¿|"Ñ¿ÊüÇ9ÿób"Ô3«ôÓbÏ×kF
/õ5©úeìÿÄÿ¥ÏÚú÷Oûûßk~׿äîTÿú[°¹þÇoûþîöùñËð=¼ùÍ,ßÿÏõÏ
üþØÿÇ»WlÖÿùï©ß}ïîoïþöïê?üGÿÃñü¿
+ä¿Àû¾o6ë·?¼¥ù׬×ZÞÿM ùË72ý/Ùý¯Ûÿ·á´ÿO
óþØÿýÊþßkõ?] ¬ûeç?¡¤ÐÅ©ÿ;v1pþcÁ¶ú.¯9ÿþû?ÿú[ ªÿÂàÓ
+ߪü¦+øÿMH¹Ð ìþ6 ¿¯ÿ«ùã5 ú7ó?ßô¿°ø]ý¿ÿpîÿÌ1ù¾éaðúõ¿ä?ÚÀù¿oDú_Ø ü¾þ¯òCÃý¿ ôÿúFvþ·¬ø}ý_Ï(Üÿ@ÿ¯oDú_Ø ¼áü¯mп tÿø¦ÖúÿVð¨ð¥ý¿¥;ÿã#ý0àäÿÉÿ3Dú_Ø ¼aÿ¸ÿ³!GN =#ÐPñ5íäÿÂÿg¨þÕü_×ùÏû?ÿàþ5ü_Sþ[× ðùF¤ÿZþ¯×þïÙÿ
þMøÔ{~é_Ãÿ5é?&ú?M`ý÷Hÿþ¯iÿú¿LÀÿåÙùÿë<ÿ¡£ÿÃü_¾é_Ãÿ5ÿmþMÀÿåZë-ÿ×tÿ»ý¿ s ÈõHÿÕü_WóCCÿ§ ¼ÿûF ÿF'ÿëìÿø¿,Õ¿ÿ«\åu<ÿM¸q9F¤Íü/ÞÿLàþ×7"ýkäÍë?ù&ÿåþ5ó¿ðÐ |×ô¯ÿEþ ÿúFvþ§ÿ
ÿÛð¡ãàþ«ù¿®Öÿ¶!ÿÃX¿gjÿÕü_§ûßÈÿ·a.óÿ|"Ò5ÿ×åü¯ôoÂxÿäý"ÐÔÉÿ:ÝÿÅáÿË Qý5ó¿¸ÿ5ü/ßô¯ÿ
þMÀÿåþ«ù¿.×ÿv<Fÿ|þù|<üÚmé_3ÿûXÿ}#Ò¿bþù6àÿòìüO1ÿ
þOÈÿòHÿù_èßÔïZë½ü¯0åÑÿaÂ\ò¿|"Ò¿ÆüÇ9ÿób"Ô3«ôº¥¯?¾ÔÿÕ¤2è?Òàÿ²`mýû§ýýÃï5¿Ëë_Jh¿ÒKý
+Ø\ÿã·Ã}wûüøeøÖÞüfïÿçúçÉ0áeÿs3ýÝ+6ëÿÅû÷Ôï¾÷÷·wûwõ^ôãþ¿ÿ@þo6ë·?¼¥ù׬×2ë¿ ø|#ÓÿÝÿªýnfÜÿ'úlxÙÿ½ßìÿݱVÿÓùÿºÏXvþJ
+]ú¿ãðÎ,ØVÿÓýORéÿMSÿoäü×Qý«õÿ^æ?4]Gþ )#Ò¿âüò_màýß7"ýkÌûéÿ3ù¾é_sþóL üÍ7"ý+Î ÿÇú}#;ÿÓÿÐqÿoý¿¾é_£ÿ÷<ÿ¡Eÿ&ÐýãZë¥þß.©ÿü?æüÓ÷Óx¸B¤þßyþ÷&äÈ gú:óÚÉÿ
ÿÏQýÕæ?´ù_60ÿÁ7"ý+Î ÿÕü_¾é¿ÿëµÿû¼þGôo§þØóðHÿóȳõß7"ýkÎ ÿËü_¾ÿ)Î ÿÃü_¾é_sþú7ÿojÿõæ?´ÿý¿ s ÈõHÿÕü_ïÿ%4ôÀû¿oúoTü_ñìÿêðY ª5ÿW¹ÎÿâùoÂMüÌ1"ýkæñþg÷¿¾é_#ÿkÊÿþ3ôoù_¾é_1ÿ«Áÿió|#Ò¿fþù&pþëÙùbþþoÂcDú¯æÿºZÿÇ¿þ
+ù{¦Öú_ÍÿÏþ/ü&Ì%`þODú¯æÿºÿUBþMïÿ¼_ú:ù_qòµø¿,Õ_3ÿû_ÈÿòHÿù_èßü_¾é¿ÿëzýèßÏ?_»ñ±ÍÀ!"ýkæqÿcë¿oDú×Ìÿâü×ü_¾ÿ)æÑÿiù_¾é_3ÿýú}Ský¯ÿÿhÈ\ò¿|"Ò¿ÆüÇsþ÷6ÄD¨gÖé?/µ|ýÁ¨ð¥þ¯&Aÿ¡ÿ˵õ?îö?ö¿×ü",¯)!û¿þ?6×ÿøípßßÝ>?~¾µ7¿åûÿ¹þyø7ë¿/ûÿØÿ;d³þ_¼Oýî{ÿpûx÷·ÏxWÿáEÿyø1îÿÛÀù ä¿øf³þwûÃ[Ízý·!ÿdë½odú_²û_µÿÏmÓûÿÔqþgÂËþþo¬Õÿtþ¿î3ÿB§þïØÑÿiöúîJÿo
+Sÿ/ç¿&ê_ÿ÷2ÿ¡éȳ!åB°cDú×ÿÀù¿ ôÿøF¤ùsþý&0ÿÁ7"ý+ÎHÌ2ð7ßô¯8ÿù¿6ÐÿëÙùâüîÿM ÿ×7"ýkôÿÎóп tÿø¦Öú_¥ÿ7
+o1þ®ÿcÂ\ú~úÏWô¯Ñÿ;ÏàþÏ9ô@ÿAgþCËüCDõWÿÐtû?ÿàþç?0ÿËü_¾é¿ÿëµÿ{ö¡>õÇG_Dú×ÿ@ÿ§ ¬ÿ¾é_sþý_&àÿòìüOqþý&àÿòHÿóп ø¿|Ský¯7ÿ¡eþ!s ÈõHÿÕü_ïÿ%4ôÀû¿oúoTü_ñìÿÊø¿,Õ¿ÿ«\çñü7á&~Äæþ5ó¿xÿ3û_ßô¯ÿ5¯ÿä@þoDú×ÌÿÂÿió|#Ò¿bþù6pþëÙùbþþoÂcDú¯æÿºZÿÛübAþ©µþWóųÿÿ§ s ÿçþ«ù¿.çÐ Æû$ïþ£Nþó-Õ_3ÿû_ÈÿòHÿù_èßü_¾é¿ÿërýo
+#ú·àóÏçãá×n|ló$pHÿù_ÜÿÀúïþ5ó¿8ÿ5ÿodçù_ô@þoDú×ÌÿBÿ& ~ßÔZÿëåMþ@ÿ s ÈÿòHÿóçü/ÎÿMPϬÒ[Z¾þ`TøRÿWÊ ÿP
+óMX[ÿãþiÿcÿð{Í/Âòú8Ô?åñþúë³¹þÇoûþîöùñËð=¼ùÍ,ßÿÏõÏ%²ÿ7aÚ
+ûÿ¹ì\±Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿð¢ÿ<ü÷ÿmäþßÞ]³Yÿ»ýá-Í¿f½þÛÉ4ü'ßÈô¿d÷¿jÿÛrÚÿ'îÿm¿þ±õý¿OÖê:ÿ_÷ËÎBI¡SÿwìbÇùÛêºÿI*ý¿éÜÿËù¯ ¢úWëÿ½ÌhºüWR.4 ;F¤ÍùìÿM ÿÇ7"ýkÌ ÿ׿?øF¤Åù
+÷ÿ&þæþ5ç?pÿoý¿¾ÿ)Îàþßú}#Ò¿Fÿï<ÿý@÷ojÿUúÓð&ÐåÑÿCþ¯§Û×ÿÇ+"ýkôÿÎó¸ÿ3!GN =#ÐÐÿÐNþ/ü&ê¯6ÿ¡þÏÿàþç?´èßü_¾é¿ÿëµÿû¼þGôo§þØóðHÿóÈ7õß7"ýkÎ ÿËü_¾ÿ)Îàþ×ü_¾é_sþú7ÿojÿõæ?´Óüöÿ&LÏfü_^é¿ÿëòý¿þOxÿ÷@ÿÿ+Nþ¯ðY ª5ÿW¹ìÿÌÿ²á&~Äæþ5ó¿xÿ3û_ßô¯ÿ5¯ÿä@þoDú×ÌÿÂÿió?|#Ò¿fþù&pþëÙùbþþoÂcDú¯æÿºZÿÛübAþ©µþWóųÿÿ§ ã×Ïü?¿ô_Íÿu9ÿ«ý0Þÿ#y¿ôuò¿âÿñY ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×õúÑ¿ >¿vãc'CDú×ÌÿâþÇÖßô¯ÿÅù¯ ø¿|#;ÿSËÿJôÚ@þoDúWÌÿÊèßÔïZë½ü¯8ù¿ð0=ñyE¤ùsþçÿ&ÄD¨gVé?.üúQáKý_M*þCÉÿkëÜ?íì~¯ùEX^ÿ»Óþ/åü76×ÿøípßßÝ>?~¾µ7¿åûÿ¹þ¹ÿkÃ\¦:°ÿwÆfý¿xÿúÝ÷þáþöñîoñ®þÃô?ü÷ÿ-ïÿ6pÿïÍúßíoiþ5ëõ?Èÿ 4ùF¦ÿ%»ÿuûÿ6ïÿ9öÿ&ü±ÿÁy¸bþ§óÿu±ìü'º8õÇnÿÍù>ÛêºÿI:
óº©ÿ·¥þê_ÿ÷2ÿ¡é:ü?&¤\h vHÿóþ8ÿóHÿóæüòßM`þoDúWÿðÿÀù¿oDúWÿÐpÿoý¿¾ÿéÍ(Üÿ@ÿ¯oDú×èÿ=Ï ÿǺ|Ský¯ÒÿÂý1úºÂþß¹'ÿOßãÿqHÿý¿çùÜÿÙ#'è?èÌh'ÿþ?DõWÿÐtóM`þoDúWÿÐ ðùF¤ÿZþ¯×þïÙÿ
þMøÔ{~é_qþC¢ÿÓÖßô¯9ÿþ/ðùFvþ§6ÿ!vôÿË7"ý+ÎhÑ¿ ø¿|Ský¯7ÿ¡æ?°ÿ7a.ù¯>é¿ÿëòý¿þOxÿ÷@ÿA
+_ÿuö%ü_ê_ÍÿU®ó¿xþp?â sHÿù_
+ï&pÿëþ5ò¿æõþ?ÈÿòHÿù_ø?MhP¾kDú×Ìÿ"ÿÃÎ}#;ÿSÌÿÂÿmBøÐñ pHÿÕü_WëÛÿaB,Èß3µÖÿjþ¯xöáÿ4a.óÿ|"Ò5ÿ×åü¯ôoÂxÿäý"ÐÔÉÿ:ÝÿÅPðY ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×åúß[ôoÀçÏÇÃ¯ÝøØæIàþ5ó¿¸ÿ1õß7"ýkæqþkþ/ßÈÎÿó¿èÿ4ü/ßô¯ÿ
þM@ý¾©µþ×Ëÿ
+§ùý&Ì% ÿË'"ýkÌó¿8ÿ7!&@=³Jÿm^jùúQáKý_M*þC)
+þ/ÖÖÿ¸ÚÿØ?ü^ó°¼þ¥¤4ü½áÇøü§þúl®ÿñÛ᾿»}~ü2|ko~3Ë÷ÿsýs¼ÿ0oûÿkÁnÀõÿâý{êwßûûÛÇ»¿}Æ»ú/úÏÃqÿßFîÿLÈèÝ5õ¿ÛÞÒükÖë¿
+õß¿|#ÓÿÝÿªýn˨ÿèÿ±aüúǶoöÿ>Y«ÿéüÝg,;ÿ %
.Nýßqøç?l«ÿéþ'©ôÿ¦©ÿ7rþk¨þÕú/óîÿH¹Ð ìþ5ç?°ÿ7þßô¯1ÿaîÿ%ÿÕæ?øF¤ÍùôÿÀù¿oDúWÿ@ÿ¯
+ôÿúFvþ§7ÿþ_èÿõHÿý¿çùôÿÚ@÷ojÿUúÓð&PÊÔÿËù ã×ß÷ø¼"Ò¿Fÿï<ÿû?räÐ3ýùíäÿÂÿg¨þjóÚñWç¿ÌðHÿóZôoþ/ßô_ËÿõÚÿ}^ÿ#ú7áSìyøE¤ÅùMþ-`ý÷Hÿóèÿ2ÿodçó¸ÿ5ÿoDú×ÿþMÀÿåZë½ùíÉÿØÿ0}ýø¿¼"Ò5ÿ×åû
+ý&ðþïþÿW<û¿:ü_ê_ÍÿU®ó¿xþp?â sHÿù_¼ÿÀý¯oDú×Èÿòÿý[@þoDúWÌÿjðÐ |×ô¯ÿEþ ÿúFvþ§ÿ
ÿÛð¡ãàþ«ù¿®Öÿñ¯£bAþ©µþWóųÿÿ§ ã×Ïü?¿ô_Íÿu9ÿ«ý0Þÿ#y¿ôuò¿âäÿjñY ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×õúÑ¿ >¿vãc'CDú×ÌÿâþÇÖßô¯ÿÅù¯ ø¿|#;ÿSÌÿ¢ÿÓò¿|#Ò¿fþú7õû¦Öú_/ÿ+Nþ/üß&L_?þ/¯ô¯1ÿñÿÅý
+1 êuúïZ¾þ`TøRÿWÆùÏ¡ÿ˵õ?îö?ö¿×ü",¯)©þ^J¹!ÿÍÍõ?~;Ü÷w·Ï_oíáÍofùþ®.ü'Ưÿæý¿W6ëÿÅû÷Ôï¾÷÷·wûwõ^ôãþ¿¼ÿÑ»k6ë·?¼¥ù׬×2þÈòLÿ
Kvÿ«öÿ¹-£þsbþ
+ã×Oÿ·_Öê:ÿ_÷ËÎBI¡SÿwìRàüÇmõ?Ýÿ$þߦþ_ÎMÕ¿Zÿïeþó¬H¹Ð ìþ5ç?°ÿ7þßô¯1ÿaîÿ%ÿÝæ?øF¤ÍùøÿL üÍ7"ýkÎàþßú}#;ÿSÿÀý¿ ôÿúF¤þ_æ?B÷ojÿUúÓð!å®pÿgÂøõ÷=þ¯ô¯ÑÿËüSräÐ3ýùíÉÿ
ÿÏQý5ç?0ÿ׿?øF¤Íùèßü_¾é¿ÿëµÿ{ö¡>õÇG_Dú×ÿ@þ ¬ÿ¾é_sþ÷?&àÿòìüOmþC
+ôÿË7"ý+ÎÈèßü_¾©µþ×ÿÐNóØÿ0~ýä¿úE¤ÿjþ¯Ë÷æ?XÁû¿oúoTü_ñìÿø¿,Õ¿ÿ«\öÿç¿7ñ#0Çô¯ÿÅû ÜÿúF¤ü¯yý'ÿÃò¿|#Ò¿fþþOÿáþ5ó¿Èÿ0ó_ßÈÎÿó¿ð>t< #Ò5ÿ×Õúß¶äò÷Lõ¿ÿ+Nþ/òÿm¿~æÿùE¤ÿjþ¯Ëù_%´èßñþÉûE ÿ¨ÿ§ùÿ¢úkæqÿkù_¾é_3ÿýÿË7"ýWó]¯ÿýðùçóñðk7>¶y8D¤Íü/îL`ý÷Hÿù_äØÿË7²ó?Åü/ú?M ÿË7"ýkæ¡P¿ojÿõò¿âÿ
ÿÛñë'ÿË/"ýkÌó¿8ÿ7!&@=³Jÿy±åëF
/õ5©ú¥0ÿѵõ?îö?ö¿×ü",¯))Ïÿü&l®ÿñÛ᾿»}~ü2|ko~3Ë÷ÿsýsô0íþÙÿ{e³þ_¼Oýî{ÿpûx÷·ÏxWÿáEÿyø1îÿÛÀý¿ ´úf³þwûÃ[Ízý·Ìÿ2ÿodú_²û_µÿÏm7öçDþ
+S÷7û¯¬Õÿtþ¿î3ÿB§þïØþÎôÙVÿÓýORéÿMaêÿåü×Qý«õÿ^æ?4]Gþ« )#Ò¿æüü&ðþïþ5æ?ÿa
+ó|#Ò¿âüÄý¿ ¿ùF¤ÅùôÿÛ@ÿ¯odçzó
+÷ÿ&Ðÿëþ5úÏóÿjÝ?¾©µþWêÿíbý¹ÃÿcC}? ÿODú×èÿ=ÏàþÏ9ô@ÿAgþC;ù¿ðÿ ª¿ÚüýÌðHÿóôoþ/ßô_ËÿõÚÿ=û¿Ð¿ úcÏ#À/"ýkÎ ÿÝÖßô¯8ÿ¡¥ÿËü_¾ÿ©Íý&àÿòHÿóȶÿojÿõæ?´Óüöÿ&ÿêþ«ù¿.ßÿKhèÿ4÷ßôߨø¿âÙÿÕâÿ²@Tÿjþ¯rÿÅóßøcDú×ÌÿâýÏî}#Ò¿Fþ×¼þÿaù_¾é_3ÿÿ§
+ÊwHÿù_äÀù¯odçzù_þoÂcDú¯æÿºZÿÛü"@]Ský¯æÿgÿþOÿçþ«ù¿.çÐ Æû$ïþ£NþWü_ÿ¢úkæqÿkù_¾é_3ÿýÿË7"ýWó]®ÿíh Gÿ|þù|<üÚmé_3ÿûXÿ}#Ò¿fþç¿&àÿòìüO1ÿþOÈÿòHÿù_èßÔïZë½ü¯8ù¿ð@þoDú×ÿ8çqþoBL$zfþÓRË×
+_êÿjRôJÁÿeÂÚú÷Oûûßk~׿TÆý_Êcþõ×gsýß÷ýÝíóãá[{xóY¾ÿëKdÿoÂPÈþß/õÿâý{êwßûûÛÇ»¿}Æ»ú/úÏÃqÿßòL ýÓ7õ¿ÛÞÒükÖë¿
+õß¿|#ÓÿÝÿªýn»±ÿ;'úl ÿÛ7kõ?ÿ¯ûeç?¡¤ÐÅ©ÿ;väÿÛ°þ§ûÅÁkÎs
+ôÿ"ªµþßËü¦cþ§
+)#Ò?óþõÐÿãþ5æ?Ìý¿øM`þoDúgþÿÎÿ}#Ò?óþõÐÿëÙùóþíÐÿëþ5úçùèߺ|Ský¯ÔÿÛÅÔÐÿkH9%Àÿãþ5úçùÜÿ#'è?èÌh'ÿþ?Dõgþÿæ?øF¤æ?üëÁÿåþkù¿^û¿ÿ`ʧþØóðHÿÌø×Ãúïþÿð¯ÿodçÌø·ÿË7"ý3ÿá_þ/ßÔZÿëÍh'ÿûÈõHÿÕü_ïÿ%4ôÀû¿oúoTü_ñìÿÊø¿,Õ¿ÿ«\çñü7á&~Äæþ5ó¿xÿ3û_ßô¯ÿ5¯ÿä@þoDú×ÌÿÂÿiBò]#Ò¿bþù6pþëÙùbþþoÂcDú¯æÿºZÿÛü"@]Ský¯æÿgÿþOÿçþ«ù¿.çÐ Æû$ïþ£NþWü_ ÿ¢úkæqÿkù_¾é_3ÿýÿË7"ýWó]®ÿí°aDÿ|þù|<üÚmé_3ÿûXÿ}#Ò¿fþç¿&àÿòìüO1ÿþOÈÿòHÿù_èßÔïZë½ü¯8ù¿ð@þoDú×ÿ8çqþoBL$zfþO|üQáKý_M*þCîð°²þÇýÓþÇþá÷ª_åõ/yòÿ¦vÿ@ýõÙZÿã·Ã}wûüøeøÒÞþbïÿçúçØÿ0à¼ÿÜúb«þ_¬Oýî{ÿpûx÷×ÏxWÿá?ú~ûÿ&ÿ`ïû¾ÙªÿÝþð¦æ_³^ÿMWXÿM@ÿ¾éÑîÝþ¿éÆþïÿkÃÅþÿëW®X©ÿéøåg,;ÿ %
.Nïÿ±$òÿMØTÿÓõOZük°æüwøgÜÿ
&P$õ_Øþ»!ÿ¡éȱ!åB°c$ú_Øþ»eþCaþ·
+÷ûF¢ÿ
í¿ëæ?ó?"þ_ÿàþ¶ÿnÿÎÿL üÍ7ý/lÿÝÿ\Æ¿þ
+ ÿ×7¢ó¿eí¿æ?Ðÿcý¿¾èaûïó¿Ñþ
+ ûÇ7Öÿ·ÚWõÿGÿOyÿ7a.ÁÙÿ3ÏWHô¿°ýwÃþ?wÜÿÙ#'Ù®ÿåÍÀ£ÂÏhOþ/ü6Hê_Ïÿu=ÿügÿàþUü_Sþ[iÑ
¿ ø¿|#Ñ5ÿ×kÿ÷ìÿBÿ&|ê= ¿Hô¯âÿ:Ïaþ·
+¬ÿ¾è_Åÿ5å?vþ/ðùFtþ§áÿ:ÏôÿË7ý«ø¿¦ó¿&£ðù¦Òú_Íÿ5Ýÿæ.²ÿ7a.ù¯>è¿ÿëòý?w-þOxÿ÷Ívý7Jù_gÿWÁÿe¤þõü_å:ÿç¿ 7ñ#0ÇHô¯ÿÅû ¼ïùF¢ü¯óúÉÿ0ü/ßHô¯ÿ
ÿÓå»F¢Õü/ò?Làü×7¢ó?Íü/üß& ÇHô_Ïÿu¹þwM&ÿÃX¿g*ÿõü_ñìÿÂÿiÂ\æÿùD¢ÿzþ¯Ëù_¹kÑ¿ ãý?÷ËvýG¥ü¯0ù¿þ/$õ×Ìÿâþ×ò¿|#Ñ¿fþó_lÀÿåþëù¿®×ÿþMøüóùxøµÛ< "Ñ¿jþ÷?&°þûF¢Õü/ÎMÀÿåÑùfþý&ÿåþUó¿Ð¿ ¨ß7Öÿù_ÿ#ÒÿaÂ\ò¿|"Ñ¿ÊüÇsþ÷6ÄD¨gVé¿I=_¯¾ÔÿÕ¤2è?Üáÿ²`mýû§ýýÃï5¿Ëë_Jè¡þ)7ú[°¹þÇoûþîöùñËð=¼ùÍ,ßÿÏõÏ
ù6ÌÛþæZ°pÅfý¿ÿúÝ÷þáþöñîoñ®þÃþóðc<ÿoÿaç¾Ù¬ÿÝþðæ_³^ÿm ÿÛÖ{ßÈô¿d÷¿jÿÛv|ÿÏ©ÃÿgÂT¯_Ùÿûdþ§u±ìü'º8õÇ.Òÿi¶ú.¯9ÿÍéÔÿç¿&ê¿°øt÷*ÿ¡é:îÿMH¹Ð ìþ6 ¿¯ÿ«ù]Ãý¿ ø}|#ÒÿÂàwõÿzþùÿüWÿàþ6 ¯_ÿÛ8ÿ3ð7ßô¿°ø}ý_å?ûèÿõìüoYðûú¿ÿP¸ÿ7þ_ßô¿°xÃù_Û èþñMõÿàQáû»pêÿ)ã0ú7à|ÿñÿøD¤ÿ
+Àöÿû?räÐ3ýÿWÓü_øÿlÕ¿ÿë:ÿ¹kyþ[Àüßô¯áÿòߺýÿË7"ý×ò½öÏþ/ôo§þØóðHÿþ¯Iÿ1ÿbë¿oDú×ðMûÿÐÒÿeþ/ßÈÎÿü_çùý&àÿòHÿþ¯iýo[ôoþ/ßÔZÿ+ù¿Î÷¿eøèß© ä¿zE¤ÿjþ¯«ù¡¡
ÿÓÞÿ}#УâÿgÿWÿËQý«ù¿ÊuþÏnâG`é_3ÿ÷?¸ÿõHÿù_óúOþ äùF¤Íü/ü&4(ß5"ýkæÿa翾ÿ)æáÿ6!|èx 8F¤ÿjþ¯«õ¿mÉÿ0!äïZë5ÿW<û¿ð0ù^é¿ÿërþW
+ú7a¼ÿGò~è?êäÅÉÿðY ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×åú߯èßÏ?_»ñ±ÍÀ!"ý+æÿnë¿oDú×Ìÿâü×ü_¾ÿ)æÑÿiù_¾é_3ÿýú}Ský¯ÿ5Þÿæ®ÃÿmÂù ü/§ô¯1ÿqÎÿâüßH õÌ*ý·Z¾þ`TøRÿWsÿÊØÿ
ÿKµõ?îö?ö¿×ü",¯)iüïSÊcÿ/õ×gsýß÷ýÝíóãá[{xóY¾ÿëK$ÿÁñËKÀþß'õÿâý{êwßûûÛÇ»¿}Æ»ú/úÏÃqÿßFöÿ&ÐþéÍúßíoiþ5ëõßLþ ¬÷¾éÉîÕþ?·ÝØÿæÿÚ0ö~³ÿ÷ËZýOçÿë>cÙùO()tqêÿÝðHàüÇmõ?Ýÿ$þߦþ_ÎMÕ¿ZÿïeþCËü/#R.4 ;F¤Åùä¿Ù@ÿoDú×ÿpîÿôÿÀüßô¯8ÿù6þæþç?´Üÿ@ÿ¯odçzó:îÿM ÿ×7"ýkôÿÎóп tÿø¦Öú_¥ÿ7
+ÏP¦þ_öÿ&Ð÷c ðÿøD¤þßóüîÿlÈ@Ïôtæ?´'ÿþ?DõWÿÐüß60ÿÁ7"ý+ÎhÑ¿ ø¿|#Ò-ÿ×kÿ÷ìÿBÿ&|ê= ¿ô¯9ÿüGXÿ}#Ò¿âüLÿ ø¿|#;ÿSÿý&àÿòHÿó2ú7ÿojÿõæ?´'ÿGdÿoù¯¾é¿ÿëòý¿æ?ÙÀû¿oúoTü_ñìÿjðY ª5ÿW¹ÎÿâùoÂMüÌ1"ýkæñþg÷¿¾é_#ÿk^ÿéÿ3ü/ßô¯ÿ
ÿÓå»F¤Íü/ò?Làü×7²ó?Åü/üß& Çô_Íÿuµþ·ü"@]Ský¯æÿgÿþOÿçþ«ù¿.çТÆû$ïþ£NþWü_ÿ¢úkæqÿk
ù_¾é_3ÿýÿË7"ýWó]¯ÿýðùçóñðk7>¶y8D¤Åü/òßm`ý÷Hÿù_ÿÿË7²ó?Åü/ú?M ÿË7"ýkæ¡P¿ojÿõò¿âÉÿð@þoDú×ÿ8çqþoBL$zfþËbË×
+_êÿjÒ8ÿ9ñY°¶þÇýÓþÇþá÷_åõ/CýGÿoÊïõ7`sýß÷ýÝíóãá[{xóY¾ÿëó?mvÿìÿ½²Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿð¢ÿ<ü÷ÿ-ïÿ6ÐýíÍúßíoiþ5ëõßú¿m ùË72ý/Ùý¯ÚÿçÆó¿:îÿLº¿Ùÿ{eþ§óÿu±ìü'º8õÇnÿÍù>ÛêºÿI*ý¿§ó&FÎMÕ¿ZÿïeþCÓ±þÛr¡Ø1"ý+Îhðÿ@ÿoDú×ÿ0çpÿgó|#Ò¿âüÿÏÎÿ}#Ò¿âüûèÿõìüOqþ÷ÿ&Ðÿëþ5úÏóÈÿ±îßÔZÿ«ôÿ¦á9ÑäÑÿÓuÌ6¡ï§àÿñHÿý¿çùÜÿÙ#'è?èÌh'ÿþ?DõWÿÐtóM`þoDúWÿÐ ðùF¤ÿZþ¯×þïÙÿ
þMøÔ{~é_qþCÃù¯ ¬ÿ¾é_qþCKÿ ø¿|#;ÿSÿ;ú?LÀÿåþç?´èßü_¾©µþ×ÿÐNóØÿ@þ«oDú¯æÿº|ÿ/¡¡ÿÓÞÿ}#УâÿgÿWÆÿe¨þÕü_å:ÿç¿ 7ñ#0Çô¯ÿÅû ÜÿúF¤ü¯yý'ÿÃò¿|#Ò¿fþþOïþó¿Èÿ°ó_ßÈÎÿó¿ð>0Ð3"ýWó]ÿmKþ ± ÏÔZÿ«ù¿âÙÿ
ÿÓæÿùF¤ÿjþ¯Ëù_%4èßñþÉûE ÿ¨ÿ'ÿWÂÿe¨þù_Üÿ@þoDú×ÌÿBÿ&àÿòHÿÕü_ë;lÑ¿>¿vãc'CDú×ÌÿâþÇÖßô¯ÿÅù¯ ø¿|#;ÿSÌÿ¢ÿÓò¿|#Ò¿fþú7õû¦Öú_/ÿ+Nþ/üß&ÿåþ5æ?Îù_ÿ Y¥ÿÜ.µ|ýÁ¨ð¥þ¯&Aÿ¡ÿkëÜ?íì~¯ùEX^ÿRR7îÿRnÈ3asýß÷ýÝíóãá[{xóY¾ÿëK$ÿÉqgÆþß/õÿâý{êwßûûÛÇ»¿}Æ»ú/úû§÷ÿ6òþoí¾Ù¬ÿÝþðæ_³^ÿmÈøL ÿÉ72ý/Ùý¯:ÿÏ©öÿ©cÿoBS8û¬Õÿtþ¿î3ÿB§þï8üó¶ÕÿtÿT
úSú9ÿ5ATÿjý¿ṵ̀"åB°cDú×ÿÿßú|#Ò¿Æü¹ÿüwÿàþ5ç?àÿ3ð7ßô¯9ÿûèÿõìüOqþ÷ÿ&Ðÿëþ5úÿ`
+Ý?¾©µþWéÿMÃsbøsH¹+¼ÿBÎc ðÿøD¤þ_æ?#'è?èÌh'ÿþ?DõWÿ0¶$òü·ù¾é_qþó¿mÀÿåþkù¿^û¿ÏëDÿ&|ê= ¿ô¯9ÿþOXÿ}#Ò¿æüú¿LÀÿåÙùâüú?LÀÿåþ5ç? ðù¦Öú_oþC;Í`ÿoù¯¾é¿ÿëòýùVðþïþÿW<û¿:ü_ê_ÍÿU®ó¿xþp?â sHÿù_¼ÿÀý¯oDú×Èÿòÿiù_¾é_1ÿ«Áÿió?|#Ò¿fþù&pþëÙùbþþoÂcDú¯æÿºZÿÇ¿þ
+ uMõ¿ÿ+ý_ø?M`þoDú¯æÿºÿUBþMïÿ¼_ú:ù_qòµø¿,Õ_3ÿû_ÈÿòHÿù_èßü_¾é¿ÿëzýèßÏ?_»ñ±ÍÀ!"ýkæqÿcë¿oDú×Ìÿâü×ü_¾ÿ)æÑÿiù_¾é_3ÿýú}Ský¯ÿ'ÿþoÈÿòHÿóÏù_ÜÿÙ Y¥ÿ¥¯?¾ÔÿÕ¤2è?á ÿ+ëÜ?íì~¯úEX^ÿ»8úS#õ·`kýß÷ýÝíóãáK{xûY¾ÿësâýß¹§ýìÿ±Uÿ/Ö¿§~÷½¸¿}¼ûëg¼«ÿðý?ÆýCþ
+Üÿûf«þwûÃÍzý7]Çû¿ ¬÷¾éÑîÝþ¿
+ãûNü'þØÿà<\±RÿÓñÿÊÏXvþJ
+]ú¿có9ÿÑgSýO×?iñ¯Áóßáqÿ_êo¤þÛ7ä?4]ÄÿoBÊ
`ÇHô¿°ýwËüñÿÀùo$ú_Øþ»nþÃÉÿÓtù/&0ÿÁ7ý/lÿÝ2ÿþ?#óDÿÛ7ä?®pÿoý¿¾ÿ-kÿÝ4ÿüèÿõDÿÛ·ÿ5ý@÷o*ÿoµÿ®êÿ-9þÿ¿
+s Nþñÿ8C¢ÿ
í¿öÿ¹ãþÏ9ôÌvýÿWÓü_øÿlÔ¿ÿë2ÿ¡é"û?ÿàþUü_Sþ[Éèßü_¾è¿ÿëµÿ{ö¡>õÇG_$úWñç¿dú?M`ý÷Dÿ*þ¯)ÿ±+ôÿË7¢ó?
+ÿ×yþC¤ÿÃü_¾è_Åÿ5ÿ5ýÿË7Öÿjþ¯éþ7wý¿ s ÈõDÿõü_ïÿ¹ËôÀû¿o¶ë¿QÊÿ:û¿
+þ/$õ¯çÿ*×ù_<ÿM¸q9F¢Õü/ÞÿLàþ×7ý«ä×ÿDþ äùF¢Õü/ü&4(ß5ý«æÿa翾ÿiæáÿ6!|èx 8F¢ÿzþ¯Ëõ¿k
+ù&Äü=Siý¯çÿgÿþOæ0ÿÏ'ý×ó]ÎÿÊ£]ý0Þÿ#y¿l×TÊÿ
+ÿ+áÿ²@RÍü/îm ÿË7ýkæ1ÿÅü_¾è¿ÿëzýoп >¿vãs'C$úWÍÿâþÇÖßHô¯ÿÅù¯ ø¿|#:ÿÓÌÿ¢ÿÓò¿|#Ñ¿jþú7õû¦Òú_1ÿkò$ú?LK@þO$úWÿxÎÿâþÏH õÌ*ý\lùúQáKý_M*þC
+þ/VÖÿ¸ÚÿØ?ü^õ°¼þ%w±êÚÌüO¶ÖÿøípßßÝ>?~¾´·¿åûÿ¹þ97ÜÿðÇþ?%öÿÎØªÿïßS¿ûÞ?Üß>Þýõ3ÞÕøþãùÓðþo÷ÿ¾ÙªÿÝþð¦æ_³^ÿM×ÿ`ë½oDú_´û_·ÿoÃøþSdÿoÂûú¿Ý±RÿÓùÿÊÏXvþJ
+]ú¿c!ÿßMõ?Ýÿ$¥ù§þÐFêo¤þõú/óù6¤\h vDÿÌø÷Ãùo$úWÿ0çàÿ5ù¾èùÿ~óDÿÌø÷Cÿ¯oDçÌø×Cÿ¯o$úWéÿç? èþñM¥õ¿NÿoþOþÿ.²ÿ7a.ÁÉÿÓ÷ø!Ñ¿Jÿï<ÿû?räÐ3Ûõæ?´Óüü&HêÏü?ÌðDÿÌø÷ÿË7ýWó½ö3ÿÁOý±çàþÿðïõß7ý3ÿáßþ/ßÎÿÿð¯ÿo$úgþÿü_¾©´þWÿÐNóØÿ0üWHô_Ïÿuùþ»Lÿ§ ¼ÿûf»þ¥ü¯³ÿ«Ãÿe¤þõü_å:ÿç¿ 7ñ#0ÇHô¯ÿÅû ÜÿúF¢ü¯óúÏüOÈÿòDÿù_ÿ§
+ÊwDÿªù_äÀù¯oDçù_ø¿M: è¿ÿërýïBþ ± ÏTZÿëù¿âÙÿ
ÿÓ¹ÌÿóDÿõü_ó¿rÑ¿ ãý?÷ËvýG¥ü¯0ù¿ü_Hê¯ÿÅý¯ äùF¢Õü/ôoþ/ßHô_Ïÿu½þ7èßÏ?_»ñ¹ÍÀ!ý«æqÿcë¿o$úWÍÿâü×ü_¾ÿiæÑÿiù_¾è_5ÿýú}Siý¯ÿ5ù?ý&Ì% ÿË'ý«Ì<çqÿgCL$zfþÛv±çë5£Âú¿Tý2öâÿÒgmýû§ýýÃï5¿Ëë?=Å¡þ)'òßLØ\ÿã·Ã}wûüøeøÖÞüfïÿçúçÈ2áTxÞÿ°pÅfý¿ÿúÝ÷þáþöñîoñ®þÃþóðc<ÿo#ù/&dôîÍúßíoiþ5ëõßÌû¿ 4ùF¦ÿ%»ÿUûÿÜÓþ?uä¿0~ýcÛ7û¬Õÿt°î3ÿB§þïØÅÌùÛêº JK
+Öÿætêÿó_Dõ_Ø |ºá[ÿÐtþR.4 ;F¤ÿ
+ÀïëÿjþC×°ÿ7þßô¿°ø]ý¿ÿpîÿãþÏæ?øF¤ÿ
+Àë×ÿ6ÿhçÿ¾éaðûú¿Ê-÷ÿ&ÐÿëÙùß²à÷õ=ÿ¡ãþßú}#ÒÿÂà
+çmþM ûÇ7µÖÿ·G
/ìÿíBwòÿ¯èßÓíkÆÿãþ6 oØ
ÿîÿlÈ@ÏôTü_M;ù¿ðÿ ª5ÿ×uþsGþ ÌðHÿþ¯)ÿkп ø¿|#Ò-ÿ×kÿ÷ìÿBÿ&|ê= ¿ô¯áÿôòM`ý÷Hÿþ¯iÿ?ü}ôoþ/ßÈÎÿü_çùý&àÿòHÿþ¯iýo[ôoþ/ßÔZÿ+ù¿Î÷¿eÜ Nµ ÿÕ-"ýWó]Í
+ý&ðþïþÿW<û¿
+þ/Dõ¯æÿ*×ù_<ÿM¸q9F¤Íü/ÞÿLàþ×7"ýkäMù?ãý@þoDú×ÌÿÂÿiBò]#Ò¿fþù&pþëÙùbþþoÂcDú¯æÿºZÿÛübAþ©µþWóųÿÿ§ ã×Ïü?¿ô_Íÿu9ÿ«ý0Þÿ#y¿ôuò¿âäÿjðY ª¿Zþ÷¿Vÿåþó¿ÿbþ/ßô_Íÿu½þGôoÂçÏÇÃ¯ÝøØæIàþ5ó¿¸ÿ1õß7"ýkæqþkþ/ßÈÎÿó¿èÿ4ü/ßô¯ÿ
þM@ý¾©µþ×Ëÿ:ÏÄÿm©ä¹E¤ùçü/îÿlPϬÓZjùúQáKý_M*þC)ÿkëÜ?íì~¯ùEX^ÿRRLCýSNÌÿ4asýß÷ýÝíóãá[{xóY¾ÿëóßmöfìÿ½²Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿð¢ÿ<ü÷ÿmàüÏÞ]³Yÿ»ýá-Í¿f½þÛÐÿdþßÈô¿d÷¿jÿÛ2ê?§ü'Ưþo¿¬Õÿtþ¿î3ÿB§þïØÑÿiöúî¯9ÿÍ)Lý¿ÿ ªµþßËü¦#ÿÍ
+Àé_sþûxÿ÷HÿóæüîÿL`þoDú×ÿÀü'óHÿóÿký¿¾ÿéÍ(Üÿ@ÿ¯oDú×èÿ=Ïhп tÿø¦Öú_¥ÿ7
+oåäÿïXÿm8ݾfü?^é_£ÿwÿÀý 9rèþÎüùê¯6ÿ¡é:òM`þoDúWÿÀü/ðùF¤ÿZþ¯×þïÙÿ
þMøÔ{~é_sþùo&°þûF¤ÍùôÿË7²ó?ÅùôÿË7"ýkÎ@ÿ&àÿòMõ¿ÞüùLÏfü_^é¿ÿëòý¿þOxÿ÷@ÿÿ+ý_-þ/Dõ¯æÿ*×ù_<ÿM¸q9F¤Íü/ÞÿLàþ×7"ýkäÍë?ù&ÿåþ5ó¿ðÐ |×ô¯ÿEÿ¿ ÿúFvþ§ÿÕáÿ6!|èx 8F¤ÿjþ¯«õ¿mÉÿ0!äïZë5ÿW<û¿ð0~ýÌÿóHÿÕü_ó¿Jhп ãý?÷@ÿQ'ÿ+Nþ¯ÿËQý5ó¿¸ÿ5ü/ßô¯ÿ
þMÀÿåþ«ù¿.×ÿv´
£>ÿ|>~íÆÇ6Oô¯ÿÅý ¬ÿ¾é_3ÿó_ðùFvþ§ÿEÿ§ äùF¤Íü/ôoê÷Mõ¿^þWü_ø¿MÍø¿¼"Ò¿ÆüÇ9ÿób"Ô3«ô?.µ|ýÁ¨ð¥þ¯&Aÿ¡ý_ø¿ôY[ÿãþiÿcÿð{Í/ÂòúÒüÿ)·ÔßÍõ?~;Ü÷w·Ï_oíáÍofùþ®.õß©ìÿ}²Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿð¢ÿ<ü÷ÿ-ú·îoßlÖÿnxKó¯Y¯ÿ6dò_LÀÿãþìþWíÿsãù_nÿaÃØûÍþß/kõ?ÿ¯ûeç?¡¤ÐÅ©ÿ;v©áüÇmõ?Ýÿ$þßtÊÿó?Dõ¯Öÿ{ÿÐ2ÿË
+Àé_qþùo6ðþïþ5æ?û#ý?&0ÿÁ7"ý+Î`þ§
+¿ùF¤Åù-÷ÿ&ÐÿëÙùâüîÿM ÿ×7"ýkôÿÎóп tÿø¦Öú_©ÿ·msêÿÿÐ÷S ðÿøD¤þßóüîÿlÈ@Ïôtæ?´ÿÿ ¢ú«ÍhGKÏÿàþç?´èßü_¾é¿ÿëµÿ{ö¡>õÇG_DúWÿÐÿhë¿oDúWÿéÿ2ÿodçjóR ÿÃü_¾é_qþCFÿ&àÿòMõ¿Þüvò±ÿ7üWßô_Íÿuùþ_ólàýß7ý7*þ¯xöµø¿,Õ¿ÿ«\çñü7á&~Äæþ5ó¿xÿ3û_ßô¯ÿ5¯ÿä@þoDú×ÌÿÂÿiBò]#Ò¿fþù&pþëÙùZþW
+ø¿M èþ«ù¿®Öÿ6ÿaB,Èß3µÖÿjþ¯xöáÿ4ù¾é¿ÿërþW -ú7a¼ÿGò~è?êäÅÉÿñY ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×õúÑ¿ >¿vãc'CDú×ÌÿâþÇÖßô¯ÿÅù¯ ø¿|#;ÿSÌÿ¢ÿÓò¿|#Ò¿fþú7õû¦Öú_/ÿ+Nþ/üß&ÿåþ5æ?Îù_ÿ Y¥ÿZ¾þ`TøRÿWÊ ÿPJÀÿeÁÚú÷Oûûßk~׿äîäÿM¹IÔßÍõ?~;Ü÷w·Ï_oíáÍofùþ®.ìÿmKpÚÿ/ì\±Yÿ/Þ¿§~÷½¸¿}¼ûÛg¼«ÿðý?Æýÿ×îÿ}³Yÿ»ýá-Í¿f½þ[ò_ ÿÉ72ý/Ùý¯Ûÿÿ°ÿOûþØÿÍà<\±VÿÓùÿºÏXvþJ
+]ú¿c7æ?pþ£Ï¶úîÎüîÔÿ;öP}Dõ¯Öÿ{ÿÐtùï&¤\h vHÿóúLàüÏ7"ýkÌó?èÿ1ù¾é_qþCÂÿoáo¾é_qþCÃý¿ ôÿúFvþ§6ÿ!îÿM ÿ×7"ýkôÿç?4èߺ|Ský¯ÕÿÛ
©ÿùO6Ì%8ùúÿ3Dú×èÿ=ÏàþÏ9ô@ÿAgþC;ù¿ðÿ ª¿Úü¦ëÿmó|#Ò¿âüýÿË7"ý×ò½öÏþ/ôo§þØóðHÿóÎM`ý÷HÿóZú¿LÀÿåÙùÚüØÑÿaþ/ßô¯8ÿ¡Eÿ&àÿòMõ¿Þüvò±ÿ7a.ù¯>é¿ÿëòý¿þOxÿ÷@ÿNþ×ÙÿÕâÿ²@Tÿjþ¯rÿÅóßøcDú×ÌÿâýÏî}#Ò¿Fþ×¼þÿaù_¾é_3ÿÿ§ ÌÿðHÿù_äÀù¯odçzù_Ìÿ±!|èx 8F¤ÿjþ¯«õ¿mÉÿ0!äïZë5ÿW<û¿ð0ù>é¿ÿërþW
+ú7a¼ÿGò~è?êä
ÉÿðY ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×åúßpôoÀçÏÇÃ¯ÝøØæIàþ5ó¿¸ÿ1õß7"ýkæqþkþ/ßÈÎÿó¿èÿ4ü/ßô¯ÿ
þM@ý¾©µþ×Ëÿïs×ÑÿaÂ\ò¿|"Ò¿ÆüÇ9ÿób"Ô3ëô¿Øòõ£Âú¿TýÉÿ2amýû§ýýÃï5¿Ëë_r7ìý`~
+¨¿ëüv¸ïïn¿ßÚÃßÌòýÿ\ÿ\ïÿ&°ÿ÷Ífý¿xÿúÝ÷þáþöñîoñ®þÃô?ü÷ÿ-ùß6pÿïÍúßíoiþ5ëõßrÿoú÷LÿKvÿëöÿmßÿ×?öÿ&ü±ÿ§ÿÛkõ?ÿ¯ûeç?¡¤ÐÅ©ÿ;v¡ãüÇmõ?Ýÿ$ùÝÔÿ¨¿¢úWëÿ½ÌhºÂý )#Ò¿âüòmàýß7"ýkÌó?ðÿÀüßô¯9ÿügóHÿó¸ÿ7þ_ßÈÎÿôæ?îÿM ÿ×7"ýkôÿç?ÿlÝ?¾©µþ×êÿ-å<ÿÿ s Nþ¾Çÿãþ5úÏó¸ÿ³!GN =#ÐÐÿÐü_øÿl
Õ_sþù¯&0ÿÁ7"ýkÎ@ÿ&àÿòHÿµü_¯ýßóüôo§þØóðHÿóç¿&°þûF¤Åùä?ÚÿË7²ó?½ù
þðùF¤Åù
+ú7ÿojÿõæ?´Óüöÿ&Ì% ÿÕ'"ýWó]¾ÿÐÐÿiïÿ¾è¿ÑÉÿü_1àÿ²@Tÿjþ¯rÿÕñü7á&~Äæþ5ó¿xÿ3û_ßô¯ÿ5¯ÿä@þoDú×ÌÿÂÿiBò]#Ò¿fþù&pþëÙùbþþoÂcDú¯æÿºZÿ?¢bAþ©µþWóųÿÿ§ s ÿçþ«ù¿.çaþ-ïÿ¼_ú:ù_aÊÿjñY ª¿fþ÷¿&ÿåþ5ó¿Ð¿ ø¿|#Ò5ÿ×åúßôoÀçÏÇÃ¯ÝøØæIàþ5ó¿¸ÿ1õß7"ýkæqþkþ/ßÈÎÿôò¿èÿ´ü/ßô¯ÿÕ¢P¿ojÿõò¿Âäÿ¢ÿùäùD¤ùsþçÿ&ÄD¨gVé¿Y<òñF
/õ5©úeøëø¿X[ÿãþiÿcÿð{Í/ÂòúʸÿK95ÔßÍõ?~;Ü÷w·Ï_oíáÍofùþ®.Ìÿ²áeÿß¶ÓØ
+¸b³þ_¼Oýî{ÿpûx÷·ÏxWÿáEÿyø1îÿÛÀû¿ ä¿øf³þwûÃ[Ízý·¡%ÿÁôïþìþWíÿsÛ4ãþ?ü&¼ìÿÇÞoöÿîX«ÿéüÝg,;ÿ %
.Nýß±#ÿßmõ?Ýÿ$þßtîÿåü×Qý«õÿ^æ?4ó?mH¹Ð ìþÿð¯þßô¯1ÿaîÿÅÿkó|#Ò?óþõþæþÿð¯þ_ßÈÎÿÿðoþ_ßô¯Ñÿ;Ï@ÿ&ÐýãZëþß4¼ 4ñÔÿ[8ÿ3a.Á?9Oàyà
+þ5úçùÜÿ#'èq3ð¨ðåóÚÿÿ
+¢ú3ÿá_ó|#Ò?óþõàÿòHÿµü_¯ýßÌ0åSìyøE¤æ?üëaý÷HÿÌø×ÿË7²ó?æ?üÛÁÿåþÿð¯ÿojÿõæ?´Óüöÿ&Ì% ÿÕ'"ýWó]¾ÿÐÐÿiïÿ¾è¿Qñųÿ+âÿ²@Tÿjþ¯rÿÕñü7á&~Äæþ5ó¿xÿ3û_ßô¯ÿ5¯ÿä@þoDú×ÌÿÂÿió?|#Ò¿fþù&pþëÙùbþþoÂcDú¯æÿºZÿÛübAþ©µþWóîK ÿß¹ÌÿóHÿÕü_ó¿Jhп ãý?÷@ÿQ'ÿ+Nóþ/Dõ×Ìÿâþ×ò¿|#Ò¿fþú7ÿoDú¯æÿº\ÿÛñHýðùçóñðk7>¶y8D¤Íü/îL`ý÷Hÿù_äØÿË7²ó?Åü/ú?M ÿË7"ýkæ¡P¿ojÿõò¿¦ùþoæÿåþ5æ?Îù_ÿ Y¥ÿv±åëF
/õ5©ú%wø¿,X[ÿãþiÿcÿð{Í/Âòú2~¨Êú°¹þÇoûþîöùñËð=¼ùÍ,ßÿÏõÏ%°ÿ7aúúýÿ\v®Ø¬ÿïßS¿ûÞ?Üß>Þýí3ÞÕxÑ~ûÿýÛÑ»k6ë·?¼¥ù׬×Zü?&°ÞûF¦ÿ%»ÿUûÿÜÓùbþ
+ã×?¶~³ÿ÷ÉZýOçÿë>cÙùOÞý»8õÇ.&Î,ØVÿÓýORéÿMaêÿåüÏQý«õÿ^æ?0ÿÁ
+Àé_qþù/6Ðÿãþ5æ?Ìý¿ä¿Àüßô¯9ÿÿ ¿ùF¤ÍùÜÿ@ÿ¯odçó¸ÿ7þ_ßô¯ÑÿËüSèþñMõ¿JÿoÞr7õÿrþgÂøõ÷=þ¯ô¯ÑÿËüSräÐ3ýùíÉÿ
ÿÏQý5ç?0ÿ׿?øF¤Íùèßü_¾é¿ÿëµÿ{ö¡>õÇG_Dú×ÿСXÿ}#Ò¿æüú¿LÀÿåÙùâüîMÀÿåþ5ç? ðù¦Öú_oþC{òöÿ&L_?þ/¯ô_ÍÿuùþÏü+xÿ÷@ÿÿ+ý_
+þ/Dõ¯æÿ*×ù_<ÿM¸q9F¤Íü/ÞÿL
àþ×7"ýkäÍë?ù&ÿåþ5ó¿ðÐ |×ô¯ÿEþ ÿúFvþ§ÿ
ÿÛð¡ãàþ«ù¿®Öÿ¶%ÿÃX¿gjÿÕü_ñìÿÂÿiÂøõ3ÿÏ/"ýWó]Îÿ*¡Aÿ&÷ÿHÞ/ýGü¯8ù¿þ/Dõ×Ìÿâþ×ò¿|#Ò¿fþú7ÿoDú¯æÿº\ÿÛñýðùçóñðk7>¶y8D¤Åü/òßm`ý÷Hÿù_ÿÿË7²ó?Åü/ú?M ÿË7"ýkæ¡P¿ojÿõò¿â4ÿÿ· Ó×ÿË+"ýkÌó¿8ÿ7!&@=³JÿqñÈÇ?¾ÔÿÕ¤2è?û ü_¬ÿqÿ´ÿ±ø½æayýKîâXÿü&l®ÿñÛ᾿»}~ü2|ko~3Ë÷ÿsýs ô0àiÆþßõÿâý{êwßûûÛÇ»¿}Æ»úÿÑÿðcÜÿ·äÛÀý¿o6ë·?¼¥ù׬×Ëý¿èß72ý/Ùý¯Ûÿ·á´ÿO
û?þØÿà<\±VÿÓùÿºÏXvþJ
+ÃÛÿ©ÿ;vãû?ç?úl«ÿéþ'éÌè¦þßHý-Õ¿ZÿïeþC3ü"°þ[r¡Ø1"ý+Î ÿÙÞÿ}#Ò¿Æü9ÿû?ÿàþç?Dü¿&þæþ5ç?pÿoý¿¾ÿ)Îàþßú}#Ò¿FÿïyþùÏ6ÐýãZëþßFëÿ©ÿ·pþoÂ\ÿ'gü?Îé_£ÿ÷<ÿû?räÐ3ý/n¾|þC{òáÿ³ATÍùä¿Àüßô¯9ÿýÿË7"ý×ò½öÏóп úcÏ#À/"ý+ÎHôÀúïþç?ÿhþ/ßÈÎÿôæ?ú?LÀÿåþç?4èßü_¾©µþ×ÿÐNóØÿ0üWô_Íÿuùþ_- ú·÷ßôßèäý_þ/Dõ¯æÿ*×ù_<ÿM¸q9F¤Íü/ÞÿLàþ×7"ýkä×ÿüÈÿòHÿù_ ÿ§
+ÊwHÿù_äÀù¯odçù_ø¿M: é¿ÿëjýoò?Lù{¦Öú_ÍÿÏþ/ü&Ì%`þODú¯æÿºÿUÿCÿ÷ÿHÞ/ýGü¯0ù¿ü_ê¯ÿÅý¯ äùF¤Íü/ôoþ/ßô_Íÿu¹þ·Ãþ-øüóùxøµÛ< "Ò¿fþ÷?&°þûF¤Íü/ÎMÀÿåÙùbþý&ÿåþ5ó¿Ð¿ ¨ß7µÖÿzù_aòÑÿaÂ\ò¿|"Ò¿ÆüÇsþ÷6ÄD¨gVé?}\jùúQáKý_Mç?R2þ/ÖÖÿ¸ÚÿØ?ü^ó°¼þ¥ñï¥òßLØ\ÿã·Ã}wûüøeøÖÞüfïÿçúçÉ2áeÿÒôv®Ø¬ÿïßS¿ûÞ?Üß>Þýí3ÞÕxÑ~ûÿ6Òÿmù/¾Ù¬ÿÝþðæ_³^ÿmÈøL ùË72ý/Ùý¯Úÿç¶iÆýbþ
+/ûÿ±÷ý¿;Öê:ÿ_÷ËÎBI¡SÿwìÆüGÎôÙVÿÓýORéÿMSÿoäü×Qý«õÿ^æ?4]ÿÇ
+Àé_qþþèÿñHÿóÎý¿üwÿàþç?àÿ³óßô¯8ÿ¡åþßú}#;ÿÓÿÐqÿoý¿¾é_£ÿ÷<ÿ¡Eÿ&ÐýãZëþß4¼ ¤<õÿ²ÿ7a.Á?}?ýç+Dú×èÿ=Ïàþ
Ï9ô@ÿAgþC{òáÿ³ATµùíøJÈóß æ?øF¤Åù-ú7ÿoDú¯åÿzíÿý_èßOý±çàþç?4ôÀúïþç?´ôÿË7²ó?µù)Ðÿaþ/ßô¯8ÿ!£ðù¦Öú_oþC{òöÿ&Ì% ÿÕ'"ýWó]¾ÿÐÒÿiïÿ¾è¿Qñųÿ+âÿ²@Tÿjþ¯rÙÿ?üÿÜÄ8À#Ò¿fþï&pÿëþ5ò¿æõþ?ÈÿòHÿù_ø?M`þoDú×Ìÿ"ÿÃÎ}#;ÿSÌÿÂÿmBøÐñ pHÿÕü_WëÛÿaB,Èß3µÖÿjþ¯8ù¿Èÿ·a.óÿ|"Ò5ÿ×åü¯ZôoÂxÿäý"ÐÔÉÿÓüÇÿËQý5ó¿¸ÿ5ü/ßô¯ÿ
þMÀÿåþ«ù¿®×ÿþMøüóùxøµÛ< "Ò¿fþ÷?&°þûF¤Åü/ò?lÀÿåÙùbþý&ÿåþ5ó¿Ð¿ ¨ß7µÖÿzù_qÊÿÂÿmÂ\ò¿|"Ò¿ÆüÇ9ÿób"Ô3«ôß-u|ýɨð¥þ¯&Aÿ¡ò¿LXYÿãþiÿcÿð{Õ/ÂòúÜ
ÑÿÚqþõ×gkýß÷ýÝíóãáK{xûY¾ÿësbÿoÂËþú×
+»_lÕÿõï©ß}ïîoïþúïê?üGÿÃqÿß$òßLà}ß7[õ¿ÛÞÔükÖë¿é:îÿM ÿÉ7"ý/Úý¯Ûÿ7ÝØÿSdÿoÂÅþÿëW®X©ÿéøåg,;ÿ %
.Nýß±4-ç?lªÿéú'-þ5Xsþ;ü3îÿBÃù ú/lÿÝÿÐtôÿØr¡Ø1ý/lÿÝ2ÿ¡dòM ÿÇ7ý/lÿ]7ÿáäÿiºDþ³ ÌðDÿÛ·Ì-ç&þæþ¶ÿnÈ.]æþßú}#:ÿ[Öþ»iþùÏ6Ðÿëþ¶ÿn9ÿk
+ú7¿¯o*ÿoµÿ®êÿ-íØÿ»þæý?}ÏóÀý/lÿݰÿÏ÷6äÈ g¶ë?èø¿vòáÿ3ARÿzþ¯Ëü¦ä¿ÀüßHô¯âÿòßJFÿ&àÿòDÿÕü_¯ýß³ÿýð©?räãþUü_çù/ä¿ÚÀúïþUü_SþcWèÿ2ÿoDçþ¯Iÿ1Òÿaþ/ßHô¯âÿÎÿþMÀÿåJë5ÿ×tÿ»Äþß¹ä¿úD¢ÿzþ¯Ë÷ÿ<ÚEп¼ÿûf»þ¥ü¯³ÿ+ãÿ²@Rÿzþ¯rÿÅóßøc$úWÍÿâýÏî}#Ñ¿Jþ×¼þÿaù_¾è_5ÿÿ§ ÌÿðDÿù_äØÀù¯oDçù_ø¿M: è¿ÿërýïBþ ± ÏTZÿëù¿âÙÿ
ÿÓ¹ÌÿóDÿõü_ó¿rÑ¿ ãý?÷ËvýG¥ü¯0ù¿"þ/$õWÍÿâþ×ò¿|#Ñ¿jþú7ÿo$ú¯çÿº^ÿú7áóÏçãá×n|nó$pDÿªù_ÜÿÀúïþUó¿8ÿ5ÿoDçù_ô@þo$úWÍÿBÿ& ~ßTZÿ+æMþDÿ s ÈÿòDÿ*óçü/ÎÿM Å{fþÓò̯×
+_êÿjÒ8ÿ9îÿñé³¶þÇýÓþÇþá÷_åõ/e|ö9áÿ3asýß÷ýÝíóãá[{xóY¾ÿësÇúo«ýÿÍÍøv®Ø¬ÿóßS¿ûÞ?Üß>Þýí3ÞÕxÑ~çÿmàüÏ?|³Yÿ»ýá-Í¿f½þɲü'ßÈô¿d÷¿jÿÛt:ÿOÌÿ³áÕþÿëWöÿîX«ÿé`Ýg,;ÿ %
.Nýß±ó¶Õÿtþ¬9ÿͧçç¿&ê¿°øt÷*ÿ¡é:òßLH¹Ð ìþ6 ¿¯ÿ«ù]ÿÇú|#ÒÿÂàwõÿzþùÿ/Ðÿgó|#ÒÿÂàõëÿk÷¾éaðûú¿Ê>ÍÿDÿúÐÿëÙùß²à÷õ=ÿ¡pÿoý¿¾éaðó¿¶Aÿ&ÐýãZëÿ[
+À£ÂöÿvíØÿSÆ#AôoÀ\Bèûñ<\!ÒÿÂà
+ûÿÀý
+9rèþÿ«iOþ/ü6ê_ÍÿuÿÜÿhó|#Ò¿ÿkÊëôoþ/ßô_ËÿõÚÿ=û¿Ð¿ úcÏ#À/"ýkø¿&ýGæ¿ØÀúïþ5ü_Óþ?´ôÿË7²ó?ÿ×yþCGÿ ø¿|#Ò¿ÿkZÿÛýÿË7µÖÿZþ¯éþ·ý[0üWô_Íÿu5ÿ14ôÀû¿oú_<bTøbÿW<û¿ü_ê_ÍÿU®ó¿xþp?â sHÿù_¼ÿÀý¯oDú×Èÿ×ò?L ÿË7"ýkæáÿ4ù¾é_3ÿü8ÿõìüO1ÿÿ· áCÇÀ1"ýWó]ÿmKþ ± ÏÔZÿ«ù¿âÙÿ
ÿÓ¹ÌÿóHÿÕü_ó¿Jhп ãý?÷@ÿQ'ÿùê¯ÿÅý¯ äùF¤Íü/ôoþ/ßô_Íÿu¹þ·ã+!ú7àóÏçãá×n|ló$pHÿù_ä¿ÛÀúïþ5ó¿8ÿ5ÿodçù_ô@þoDú×ÌÿBÿ& ~ßÔZÿëå÷¿¹ëèÿ0a.ù_>é_cþãÿÅù¿ 1 êUúÏ#¿þ`TøRÿWÆùÏ¡æ?°¶þÇýÓþÇþá÷_åõÊ^¿Rnðÿ°¹þÇoûþîöùñËð=¼ùÍ,ßÿÏõÏ%²þ0~ùçýÿ»WlÖÿ÷ï©ß}ïîoïþöïê?¼è??Æý
¹ÿ7öOßlÖÿnxKó¯Y¯ÿ6dòM ùË72ý/Ùý¯Úÿç¶û¿sêÈ1anûfÿïµúÎÿ×}ƲóPRèâÔÿ»ñýó}¶ÕÿtÿTúÓÔÿ9ÿ5ATÿjý¿ùM×ÿjBÊ
`Çô¯9ÿÿ ôÿøF¤ùôÿÂüßô¯9ÿÿ¯ ÿûF¤Åùä?Û@ÿ¯odçzó:îÿM ÿ×7"ýkôÿÎóп tÿø¦Öú_¥ÿ7
+ÏØMý¿äÿBß%Àÿãþ5úçùÜÿ#'è?èÌh'ÿþ?Dõ×ÿÿÛæ?øF¤Íùèßü_¾é¿ÿëµÿ{ö¡>õÇG_Dú×ÿÀù¯ ¬ÿ¾é_sþý_&àÿòìüOqþý&àÿòHÿóп ø¿|Ský¯7ÿ¡=ù?ûÈõHÿÕü_ïÿ%4ôÀû¿oú_<bTøbÿW<û¿
+þ/Dõ¯æÿ*×ù_<ÿM¸q9F¤Íü/ÞÿLàþ×7"ýkäMù?ãý@þoDú×ÌÿÂÿiBò]#Ò¿fþù&pþëÙùbþþoÂcDú¯æÿºZÿÛü"@]Ský¯æÿgÿþOÿçþ«ù¿.çÐ Æû$ïþ£NþWü_
+þ/DõWËÿâþ×
+ò¿|#Ò¿bþó_lÀÿåþ«ù¿®×ÿþMøüóùxøµÛ< "Ò¿fþ÷?&°þûF¤Íü/ÎMÀÿåÙùbþý&ÿåþ5ó¿Ð¿ ¨ß7µÖÿzù_qòáÿ6ü/ßô¯1ÿñÿÅý
+1 êeúÿ¹¿»_êöºfTøBÿWÓ
ÑÿB&ÿËõ,öü½fyýKJ3Ô?ÒQV×ÿ¿ßÿ÷Ç_÷k>ãÝý×¼Ô¿ £ÿ;µä?Ùðÿú_ñ¿þï÷ÿýÿµ?ö?þ÷ÿ¡½É]ù¯ïÿçÿíüßý_=Üÿ?ûûçÛÿËáþ~ü©ÿëÿ£ÿ§CVëx
+xë]ÿÆò÷ÿÒ
<îÿS¢ÿÛ¹ÿ|ý:5!kW¬Ôÿâï¯YµÿKí´ÿ£ÿÃÕõWÞÿ¥ÓùOjÿfÃiÞØÿöÿ+³Zÿêû¿Óû_*ìÿLxÙÿ?Æ= ²vÅJý'ýó¿rÚÿuìÿLX]õó¿fÚÿqÿgÂiÞØÿ%öÿ+³ZÿÚû¿.Nû?òM·}ø|²Rÿg~½fÕþ¯Üÿ²ºþÚû¿x¾ÿåùoÂi×¼±ÿkØÿý¯Ìjý+ïÿOû?ú¿M¯}Ùÿ ü¯ÍÿDH À+
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/64fake-4n2s2ca2c2t.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/64fake-4n2s2ca2c2t.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/64fake-4n2s2ca2c2t.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,174 +1,174 @@
-System(0KB HP=0*0kB )
- NUMANode#0(1024MB)
- Socket#0
- L3Cache(8192KB)
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#0
- P#4
- L1Cache(32KB)
- Core#1
- P#2
- P#6
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#1
- P#5
- L1Cache(32KB)
- Core#1
- P#3
- P#7
- Socket#1
- L3Cache(8192KB)
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#8
- P#12
- L1Cache(32KB)
- Core#1
- P#10
- P#14
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#9
- P#13
- L1Cache(32KB)
- Core#1
- P#11
- P#15
- NUMANode#1(1024MB)
- Socket#2
- L3Cache(8192KB)
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#16
- P#20
- L1Cache(32KB)
- Core#1
- P#18
- P#22
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#17
- P#21
- L1Cache(32KB)
- Core#1
- P#19
- P#23
- Socket#3
- L3Cache(8192KB)
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#24
- P#28
- L1Cache(32KB)
- Core#1
- P#26
- P#30
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#25
- P#29
- L1Cache(32KB)
- Core#1
- P#27
- P#31
- NUMANode#2(1024MB)
- Socket#4
- L3Cache(8192KB)
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#32
- P#36
- L1Cache(32KB)
- Core#1
- P#34
- P#38
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#33
- P#37
- L1Cache(32KB)
- Core#1
- P#35
- P#39
- Socket#5
- L3Cache(8192KB)
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#40
- P#44
- L1Cache(32KB)
- Core#1
- P#42
- P#46
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#41
- P#45
- L1Cache(32KB)
- Core#1
- P#43
- P#47
- NUMANode#3(1024MB)
- Socket#6
- L3Cache(8192KB)
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#48
- P#52
- L1Cache(32KB)
- Core#1
- P#50
- P#54
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#49
- P#53
- L1Cache(32KB)
- Core#1
- P#51
- P#55
- Socket#7
- L3Cache(8192KB)
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#56
- P#60
- L1Cache(32KB)
- Core#1
- P#58
- P#62
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#57
- P#61
- L1Cache(32KB)
- Core#1
- P#59
- P#63
-depth 0: 1 System (type #0)
+Machine (phys=0 total=4194304KB)
+ NUMANode #0 (phys=0 local=1048576KB total=1048576KB)
+ Socket #0 (phys=0)
+ L3Cache #0 (8192KB)
+ L2Cache #0 (256KB)
+ L1Cache #0 (32KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ PU #1 (phys=4)
+ L1Cache #1 (32KB)
+ Core #1 (phys=1)
+ PU #2 (phys=2)
+ PU #3 (phys=6)
+ L2Cache #1 (256KB)
+ L1Cache #2 (32KB)
+ Core #2 (phys=0)
+ PU #4 (phys=1)
+ PU #5 (phys=5)
+ L1Cache #3 (32KB)
+ Core #3 (phys=1)
+ PU #6 (phys=3)
+ PU #7 (phys=7)
+ Socket #1 (phys=1)
+ L3Cache #1 (8192KB)
+ L2Cache #2 (256KB)
+ L1Cache #4 (32KB)
+ Core #4 (phys=0)
+ PU #8 (phys=8)
+ PU #9 (phys=12)
+ L1Cache #5 (32KB)
+ Core #5 (phys=1)
+ PU #10 (phys=10)
+ PU #11 (phys=14)
+ L2Cache #3 (256KB)
+ L1Cache #6 (32KB)
+ Core #6 (phys=0)
+ PU #12 (phys=9)
+ PU #13 (phys=13)
+ L1Cache #7 (32KB)
+ Core #7 (phys=1)
+ PU #14 (phys=11)
+ PU #15 (phys=15)
+ NUMANode #1 (phys=1 local=1048576KB total=1048576KB)
+ Socket #2 (phys=2)
+ L3Cache #2 (8192KB)
+ L2Cache #4 (256KB)
+ L1Cache #8 (32KB)
+ Core #8 (phys=0)
+ PU #16 (phys=16)
+ PU #17 (phys=20)
+ L1Cache #9 (32KB)
+ Core #9 (phys=1)
+ PU #18 (phys=18)
+ PU #19 (phys=22)
+ L2Cache #5 (256KB)
+ L1Cache #10 (32KB)
+ Core #10 (phys=0)
+ PU #20 (phys=17)
+ PU #21 (phys=21)
+ L1Cache #11 (32KB)
+ Core #11 (phys=1)
+ PU #22 (phys=19)
+ PU #23 (phys=23)
+ Socket #3 (phys=3)
+ L3Cache #3 (8192KB)
+ L2Cache #6 (256KB)
+ L1Cache #12 (32KB)
+ Core #12 (phys=0)
+ PU #24 (phys=24)
+ PU #25 (phys=28)
+ L1Cache #13 (32KB)
+ Core #13 (phys=1)
+ PU #26 (phys=26)
+ PU #27 (phys=30)
+ L2Cache #7 (256KB)
+ L1Cache #14 (32KB)
+ Core #14 (phys=0)
+ PU #28 (phys=25)
+ PU #29 (phys=29)
+ L1Cache #15 (32KB)
+ Core #15 (phys=1)
+ PU #30 (phys=27)
+ PU #31 (phys=31)
+ NUMANode #2 (phys=2 local=1048576KB total=1048576KB)
+ Socket #4 (phys=4)
+ L3Cache #4 (8192KB)
+ L2Cache #8 (256KB)
+ L1Cache #16 (32KB)
+ Core #16 (phys=0)
+ PU #32 (phys=32)
+ PU #33 (phys=36)
+ L1Cache #17 (32KB)
+ Core #17 (phys=1)
+ PU #34 (phys=34)
+ PU #35 (phys=38)
+ L2Cache #9 (256KB)
+ L1Cache #18 (32KB)
+ Core #18 (phys=0)
+ PU #36 (phys=33)
+ PU #37 (phys=37)
+ L1Cache #19 (32KB)
+ Core #19 (phys=1)
+ PU #38 (phys=35)
+ PU #39 (phys=39)
+ Socket #5 (phys=5)
+ L3Cache #5 (8192KB)
+ L2Cache #10 (256KB)
+ L1Cache #20 (32KB)
+ Core #20 (phys=0)
+ PU #40 (phys=40)
+ PU #41 (phys=44)
+ L1Cache #21 (32KB)
+ Core #21 (phys=1)
+ PU #42 (phys=42)
+ PU #43 (phys=46)
+ L2Cache #11 (256KB)
+ L1Cache #22 (32KB)
+ Core #22 (phys=0)
+ PU #44 (phys=41)
+ PU #45 (phys=45)
+ L1Cache #23 (32KB)
+ Core #23 (phys=1)
+ PU #46 (phys=43)
+ PU #47 (phys=47)
+ NUMANode #3 (phys=3 local=1048576KB total=1048576KB)
+ Socket #6 (phys=6)
+ L3Cache #6 (8192KB)
+ L2Cache #12 (256KB)
+ L1Cache #24 (32KB)
+ Core #24 (phys=0)
+ PU #48 (phys=48)
+ PU #49 (phys=52)
+ L1Cache #25 (32KB)
+ Core #25 (phys=1)
+ PU #50 (phys=50)
+ PU #51 (phys=54)
+ L2Cache #13 (256KB)
+ L1Cache #26 (32KB)
+ Core #26 (phys=0)
+ PU #52 (phys=49)
+ PU #53 (phys=53)
+ L1Cache #27 (32KB)
+ Core #27 (phys=1)
+ PU #54 (phys=51)
+ PU #55 (phys=55)
+ Socket #7 (phys=7)
+ L3Cache #7 (8192KB)
+ L2Cache #14 (256KB)
+ L1Cache #28 (32KB)
+ Core #28 (phys=0)
+ PU #56 (phys=56)
+ PU #57 (phys=60)
+ L1Cache #29 (32KB)
+ Core #29 (phys=1)
+ PU #58 (phys=58)
+ PU #59 (phys=62)
+ L2Cache #15 (256KB)
+ L1Cache #30 (32KB)
+ Core #30 (phys=0)
+ PU #60 (phys=57)
+ PU #61 (phys=61)
+ L1Cache #31 (32KB)
+ Core #31 (phys=1)
+ PU #62 (phys=59)
+ PU #63 (phys=63)
+depth 0: 1 Machine (type #1)
depth 1: 4 NUMANodes (type #2)
depth 2: 8 Sockets (type #3)
depth 3: 8 Caches (type #4)
depth 4: 16 Caches (type #4)
depth 5: 32 Caches (type #4)
depth 6: 32 Cores (type #5)
- depth 7: 64 Procs (type #6)
+ depth 7: 64 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8amd64-4n2c.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8amd64-4n2c.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8amd64-4n2c.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,14 +1,10 @@
- ¨
-J íÝsÛF²Åýºú+ð¸·j73ø"ó¬+µ©ÜìnÝÄuY0 I¨ð«HH±ö¯ßeÉ 6ç\S}~Ç´$ôé«Eþ5]/ìü¿ß!vYÖþm,>üÛ¤éáï¼1ÆÆ6ãÔ$obc½²@ïç»}Sî¢èÍûÍͲ^ÿÁvÕnxCX&ÝøowÁ¸ø$KbÄÖÅ?±¹aüã?ßÞÕëëÍ÷Ñ8÷ñ76MúñOó´xÅg|EyüÛWûýf÷§o£øê¾Z/6»Y½pÿúÖM=ÿîç·Wî ®ËU½|pÏìjµYTË?¹ÇùÇÇѺ\UîßoïÊå_ÿ¶ÙUûµèÛ¦ÚmÖnVÿýëiOÑÄÉÕ¾©¶Ûz}ã~Ç^þç¿ÿ»}AÇñ7&7Wór~[EûúßíËØ¦ÑOß_moöõ¼\F·_íë÷.h7ûÇWiwë8<Ó¾dûǧ®·wíª}ûpV}WÛ¦Þ¬?þ¬=æÑ²ºwÊíìê÷íóÖËÒ½ºûûµè~UE*ÚÙÏ£Õ~mË*ZÍ«hþaÛzí«m´jvîö2¯6÷n³¦ýµ$æËëåÝþ6Z>D×Ü+ìÝ«¹?6ºm¢ýÃÞ}8÷e~h¯>4MfmínÛh¹Åzó{ûÜáA´]×nï&åíõÌ=?_mgËê¦?DûûUä¶<¼±ùnòñÇWï77U½m¿Ì]v¿±æê×ÿùþè»Nrïù¦ýj>¾ßOæéc`få²¾Y¯ÜòøÃr±pßõþ°Yûºi½¯}ô°¿Déäñ'÷õ®qÉÕÖ}]´*×n7íë|ë¾ÓèÚ
áÞýimÔ¬¢}3¿ºê¢æÒQÃCôQ3~]Ì!j/íµ<DÏr¦s&v&<DEÓK;D??5<D_å!]Ú!úù±(Q¯}~)h~ièçÇ¢<D_ç!Z\Ú!úù±(Ñ×s¡ÿÿËÈb9Êÿ»#!Ä ÇüOÓÎÿ$åüAüÕ}íNç<üãfYÎø#ølüÝã¦Zå0ðî.?Sñw/>üâ·ñÏêÂø»?ùcão"s·Û*çõÂèø7íf¹¹yÞú·&µãÀ?þÍí®*³§àûh~Öÿã~üÓ,6ôÿ xÁ_¾äA«¹_~møëÿ)¹2ÛóßÊjV/Nìãþc7Ø?Ö¿{
Pÿ,«ý·ùíÓïâ¯[¸§© úWPÿ£ÑøßäúGpñʳÈ
2Zÿ XY°=D¼ò6ÎÿÁàÿz½¨>XÏÃ`lü;ã?÷?Yü[ÃÅø}ÿçýøæxýOë»ùWoµÈôÿt©fÛr×Ô±í3ûð¿ÿÏó÷ÿxÿ¯þí9¯ÿû[¸!!õàݺ¾®«ÏJéÿ`Z½ÿë[ÖÿÀù?ÝÈô?ßÜV»j=x¼88ÿ¤?ÿ_¤ôÿ@ȺWLÿ¿ûÙæzVî÷y]6õ}Ý<|vþúw·ÿôÿ@09õ¯aþÿ¶ÜU{b¶*·§öqJÿ/Ìÿççÿ!ôfòéÿULÿë»Õûj× öUsR§¯ÿY_ÿEQÿÚù?W/ýÇÿëCÅÿÜþtèÿàøBN÷jdúø?¨ôèF¦ÿ3û?÷¶©o˦ä)@/2ýüÌÿ@àõ_72ý÷$ôA ÿC72ýÛÿ1¸ÿORú¿!Ðÿ©aþ?¼ÿúÐsrÐÿ¡þÏíÿèÏÿ¥óÿ2Ãf$ú7ÿëCÅàÿ ÿýºéàÿ þ!pþG72ý»þÇàú_°þ7×ûfw7oÏÞ<(D¦ÿõÿ ðú¯þõ?8ÿþÝÈôð°þÎþèFÿïÿ þ!ôô(C¦ÿù?ôèf¤þ}[¾Ñ*Ü»ÿwLÿÑñG÷ÿNþñôÿN®ÿpñÌ$â¥â¯Hÿo[pý'þuã¯PÿoÎÿA`æN7BýïÿÑÿá,ãöÿ¾XFëÝÿùñÇõÿfü!ÈâèÿÍõߨÿ[72ýÖÿñþýÿºé?xÿï¼H©ìÿþëÿèÿÀù?ÝÈô¨ÿLÿ®ÿÓLÿáû³þ;öÿÖ0ÿ|ý_Îù½|ú!Ó? ÿ7×ÿB`ÿoÝHôéÿmèÿ@ øúÏÿa`ýgÝÈôÞÿÁúèÿÐLÿÁûçõý¿u#Ó?ÀÿÁü^ÿu#Ó?ÀÿAÿú?t#ÓøúÏ ýßèÿÔ0ÿÞÿAýCè;9èÿÐ
Lÿáë?3ÿõu#Ñ?¤ÿ·¥ÿ,þ ÿýÿèÿÐLÿ ÿõó?ºé?xÿïõ¿1°ÿ·ndúø?Xÿ¯ÿºéàÿàüú?t#Ó?ÀÿÁú?8û£
aþ?¼ÿúÐwrÐÿ¡þþæÿ Ðÿ¡úÏàý¿ÙÿÂèø£ûç?ÿøCúg1û@8Ëøß²è¥â¯Hÿï$æüÎÿéÆ_ÿ þß\ÿ
-ú×PÿÁûç¬ÿá<ãæ/ÑúG÷ÿfþgüqý¿²øúsþûëF¦@ÿoÞÿCàý¿ndúôÿ¦ÿûëF¦Àú?ÖÀÌndú¿þ/¥ÿ×ÿéF¦ÿðý¿Sú °ÿ·nùÿàëÿ
-ÎÿCèÍäÓÿ«þý¿YÿûëF¢Hÿïþ²ø¯ÿÌñÖÖLÿ ÿõþÝÈô¼ÿwSÿØÿ[72ýüÌÿ@àõ_72ýê?ÓÿþÝÈô¨ÿLÿ7ú?u#Ìÿ¯ÿLýCè99èÿPLÿáë?3ÿõu#Ñ?¤ÿwFÿYüþúÿ!Ðÿ¡þþêçt#Óðþßëc`ÿoÝÈôð°þ^ÿu#Ó?ÀÿÁùôèF¦ÿðþÖÿÁÀÙÝóÿáëPÿzNú?!Ó?ÀÿÁüú?t3Rÿ ¼ÿ·¡ÿÁèø£û³þÿøCú§×A8Ëø?pq¡øëÔÿ÷ÿ*W5þúõÿæúÌÜéF¨ÿàý¿3ÎÿC8ËøÂñÿ¥2ZÿèþßÌÿ@ð?®ÿ7ãA@ÿoöÿ
Àþߺéõ_ôÿëF¦@ÿo®ÿÀþߺéõ_tÿéF¦Ö~-pýndúôÿ¦ÿûëFÿgýçWBo&þ_eÈôèÿÍõØÿ[7ýCú[ú?Èâ¾þ3ÇXÿY72ý÷Xêýºé?xÿï¼ þ!°ÿ·ndúø?ÿÀë¿ndúø?èÿ@ÿndúôÿ¦ÿýºæÿÃû?¨}'ýºé?|ýgæÿ1°þ³n$úôÿNèÿ@ ? ÿ7ýÿèÿÐLÿúÔ?ÎÿèF¦@ÿoêûëF¦ÿõÿ ðú¯þþÎÿ@ ÿC72ýü¬ÿ³?ºæÿÃû?¨}'ýºéÐÿù?ôèf¤þ}-G´
-÷íÿÝöÿ¢ÿ#<£ãîÿÍú/üãêÿÍõ_Î3þçâRñ×?¤ÿ·-xÿóºñ×?¦ÿwÂõØÿ[7BýïÿÍùgÿ[ÿ/ÑúG÷ÿfþgüqý¿²øú³ÿ/öÿÖLÿ¬ÿüZ`þO72ýúsýöÿÖLÿ¬ÿüZ`æN72ý³þókëÿt#Óøþß\ÿý¿u#Ìÿ³þó+¡7Oÿ¯2dúôÿæú?ìÿþ!ý¿cú?ÈâèÿÍñÖÖLÿ ÿõþÝÈôèÿMýC`ÿoÝÈôð0ÿ×ÝÈôðÐÿþÝÈô¨ÿLÿ7ÎÜêFÿïÿ þ!ôôèB¦@ÿoæÿ °þ³n$úôÿ6ô Åàÿ ÿýºéàÿ þ!pþG72ýïÿ³þ7öÿÖLÿ ÿëÿAàõ_72ýüÿ@ÿndúø?Xÿgt#Ìÿ÷PÿúNú?t!Ó?ÀÿÁüú?t3Rÿ)ºÿwÎþ/FÇÝÿ;cüøÇÔÿý? eüoØEôRñ×?¤ÿwsþ«ýcú§\ÿ
-óÿºê?xÿïõ_ güϳȥ2ZÿèþßÌÿ@ð?®ÿ7ãA@ÿoÎÿC`ÿoÝÈô~ýë¿aàÈ]72ýúÓÿý¿u#Ó?`ýë?A ûO72ýÖÿÑÿëÿt#Óøþß)ý?Øÿ[7Âüðõçÿ!ôfòéÿULÿþ߬ÿý¿u#Ñ?¤ÿwBÿYüÃ׿øë?ëF¦ÿú@ÿndúÞÿ»©ìÿþþæ ðú¯þþú¿ Ðÿ¡þõéÿ@ÿ§nùÿðõ©='ýÊé?|ýgæÿ1°þ³n$úôÿNéÿ@ ?ÀÿAÿ?ú?t#Ó?ÀÿAýCàündúÞÿ»`ýoìÿþþÖÿÀë¿ndúø?8ÿþÝÈôð°þÎþèFÿïÿ þ!ôô(C¦ÿù?ôèf¤þ}K~Ñ*Ü·ÿwÓÿ`tüÑý¿
-ãÀ?þ þß\ÿ á,ãÿ³¿þ!ý¿mÁõxç®ýcúsþõ¯¡þ÷ÿÎèÿpñ?û_,£õîÿÍüÏøãú3þdñôÿæúoìÿþïÿ³¼ÿÀ»ndúôÿ¶Ô?öÿÖLÿõô
ÿA ûO72ýÖÿÑÿëÿt#Óøþ߬ÿý¿u#Ìÿ_ÿÇù½|ú!Óøþßë!°ÿ·n$úßÿÛEAÿYüÃ׿øë?ëF¦ÿúÀ;7ÝÈô¼ÿw^PÿØÿ[72ý÷æ ðú¯þþú¿ Ðÿ¡þõéÿ@ÿ§nùÿðþêBßÉAÿ.dú_ÿù¬ÿ¬þ!ý¿cú?ÈâðÐÿþÝÈôðPÿxç¦þ÷ÿÎYÿûëF¦@ýÖÿÀë¿ndúø?8ÿþÝÈôð°þÎþèFÿïÿ þ!ôôèB¦ÿù?ôèfþ÷NùÙj>Ûn~wªß÷£[hûåÿú¿0°ÿnF^ÿYç¯GZ
{õÿr[µþú¿Â3:þÏýý÷16þúOiBÿÿø7·»ª\øt Üÿg1óÿÎrÿ?á(âRñ×ÿ³÷o[Î+oFô?}ÿßÿ»GÿCH¨\ÕøëÿÐÿû¤æ»øëß)ó¹×Pÿ£ÑøßpþÃyÆÿE.Ñúÿí£=D¼ò6ÎÿÁàÿýüö16þÝõ¿ñ ÿ¹×ÿæÃõ?¬ÿ¡íÿÁÀzé?üú_öÿÃÀûÝÈôîõ¿ñ_³þ+wëúº®<(E¦ÿðë®ÿ
@÷¯ndú¿þ7¥ÿ×ÿêF¦ÿs¯ÿíë?ORú ú×0ÿ|ýoÁù½|ú!Óÿ¹×ÿöû?¦ESÿÚù?W/ýÇúï9ýdñ_ÿã?¬ÿ®þþêýºéÿÌþÁý-bêÂÛ²)y
-ÐLÿúïÌÿ@àõ_72ýüôA ÿC72ý¯ÿÒÿ
-þOÝóÿáýÔ?þeÈô¾þ;óÿXÿ]7ýÿ£ ÿ,þ ÿýÿèÿÐLÿ ÿõó?ºéÿÜõ?×ÿõ¿1ü¸Þ7»»y{öæ@!2ýü¬ÿ×ÝÈôðpþýºéàÿ`ýýÑ0ÿÞÿAýCè99èÿPLÿ ÿóèÿÐÍ)ý¯7a×O´
-÷ìÿ§ìÿ
-aTüÛÿù~:ÿ§ó¿ûÛ2þ<âï²â_'âocűM6þ
q×ûÍ?ìK0þcãï}¥û²ï}¼ÿKþMnÿ
Ðuv[7QVdiôêðU½ßGñããëÍ®ªoÖîõº©v˪¼¯¿b]È«å¦5µHû6Ïm~µinÝíÁág6²=ä×þWÕª^_oü÷qBÿNúýú&5ôÿC¸úG+Rý\~Ý4åòÛ¨ÅäîzíÎÂÑoßw6øaWUÏ»
-dæéñïöÕâãQ&
;t6ønÞÔ÷ÕóóîE²b2ílðãºìmR¤¤³ÁÛz×<t^àð"Ý]üß®nª÷åü·îFqgêeõ¯ò¦Ú?m0qç«î?ÛmçCÈ»|·Þ¬^!Ê'Y÷jüµ|¿ìnt7øÇ¿ÌÞÝaç¶yÞ¤»ï7wëyÕûÝ
-~Yï.I7¿üo5_õêÓ.ìôècþòn½{ÜäéuÒÉQ4ÿ~wóøEÍ:E<|¶sL0 xøÿh¢ñÌñ?ø/j÷U¹÷>NæþOe¬ÿÁ]Lìéî?¾âwþ1Ùû'ïÿó¿Æ²þÞL®ìåÒ¥2Zÿ¾Eß;ƾùÃü?øÌÿò?¹aýGÏùßbâ.ºdú%ùßö5é$ëæ'Æ_1úÇæéÿðÑ_ÈÿæÙôSj5äM:í¦wãAþ7·ù$;ò¿in'ygAþ׺ÛIgò¿Qwùßxÿµý7ùBþ7µÝ]ò¿i1µigaþ7=þ&OäãSùßxÿµ=úü¯)i÷«æ§ÐÎÿÿ}5xÿÝý*Ú(ÿkÿEàhþ7åú_OÉ_æuâwþ)Rrþoûÿñü¿øãòÿ Ïÿ¾$íÿüÀ°Ä¥2ZÿÿOÿGàwþÏEûÝÿñúÁ/þV´Þÿ½xÄ»þùÏó©u!Hcë9ÿwçÿROã8IÖ$rxøµâ¡ìü×ÿCxѱ§ÖØþü_VÄyõ6èÎÿw
-7v0ÿçnòã´èl0ÿK&6K:¼4ÿO:ÿ³ù¿<LÒî+¼´þ£31f_Xÿu§ÖìóíºöÎ'æÿì©ù?;ÿsÚéNÚÁüq¡êLÖÚæÿ£hþÑüåüß«Áãüõÿsý/ÇÉÃù¥øÝÿý
ÿÔ?/Iû??Hiñ¼TFë?çÿSæÿxÄÿcýò¦dÓÄ3ÿ'Gù?Säi^þ/áôðWþÝø/íãpþgý¯¯øcó¿Ïÿ3zÉ©üo2ÈÿNbÚ©9ÖL¦SØÎõ²él0Èÿfédu6x!ÿkÓî{8ÿMùßÔ$&;úýü¯ÄæèSôó¿ÖN'ÎÃü¯Íòî'ò¿É©üo2\ÿá¾È£O1Xÿ8au?Å ÿÛNþu¿É?Êÿ&Ìÿ¾<ÎÿØü/çÿ!<ÿ#CùjÄoüÌÿRÿÎÿe×ÅOÿ
hûËúB!B!B!BÈhþê´þ
\ No newline at end of file
+ SÖ9K í[sãF
ûuô+ð¸1ãE
+úÍÞÇ8¼X»chæ-HHnͯßÙA at 2QÙÔÙ¦ò|1VÕÄÄ
+§*r9ÏÜßÜÊÎþãÝ+{ò4mÿ4yïÿnÛÿùwÆØØ¦qìLò.6Ö¤æ]¾ÖÔån×Û(z÷ñf}³¨W2®Úî?¢ÿÍvý*'Á¸ø$MbÄÖÇ?1&eüâ?ÛÜÕ«ëõ9Ñ8;Äûøë~ü]'ï¢ø?ÄK(ój·[oÿòm_ÝW«ùz;çþoßÝ5·Õª©gßýüþÊÑu¹¬þ^-×ójñÿuöùëhU.+ÿ÷÷wåâoÿ¹ÞVÿgÑoj»^ý[³ü÷èG
+k«]Sm6õêÆÿ»ûÿþ¯ö
+mÇßÌ\ÍÊÙmíêµokb뢾¿ÚÜ>ìêY¹ö?b|µ«?ú ÝìïÒÖ¿°¥}Ëö®7wí·ª]ûå´ú4«6M½^}þ^{ÒÏ£Euï)°«ß7O£¥wÿÿÏ¢ûeÍ«h³«¢f7»m´)«h9«¢Ù§"*7õ,ÚUhÙlý+7í+e4[®ïý°¦ýgIÍ×»Ým´\~®?ùwØùwóÿÙè¶v;ÿËùóSûzõ©Ù®7M´ûCn¢Å2Jæ«õïíkû/¢ÍªöG7Y´(o¯§þõÙr3]T7åì!ÚÝ/#?rÿͶÅço_}\߬õ¦ýhRÛýÆ«_ÿëû£ÏÚýäæö£ùüó~~1sÀLËE}³ZúäðÍr>÷õn?¬}_Gëf=ì¯+ß¹¯·?I®6þØFËråӾϷþ3®}îýM³e´kfWWÝSÔ\Ú)jx~ñ)j&oÒ9Eí¥¢§èYNQw1§hri§hÂSTÙUÔ]Ú)úò\Ôð}§hzi§èËsQ¢A7úìRNÑìÒNÑç¢<Eßæ)_Ú)úò\§èÛ¹Ñÿÿed±tóÿþDx`@ý'vÆ´õ¿<YÿAÐÿ¼º¯ýó¬çAxü3ñGðRüý×Mµ<Ïiÿ4O2ÆÁøû9ÊañÏ|ü³4¡þ!¿ÿ/û¢`lüMgqæÇÜYÞÿ!³Þ¬ëɬkl0þãßÜn«r>}|s6ÀîEÿÿÚôãï$¥ÿÁcþú%_¸XÍóò[#Xÿ¹é¦ýVÞTÓz~ê§ôǶ§ÿÔO¨ÊUM°þÛôöÍw ×§þê_52ýÌþEóÿØÿAý8Ïüßñ*r¡Õÿ¾þ*̶§HPþÏÆùañ¯Wóê
+=
+ÆÆ¿ÿËãAÿÖopÓóÿ¬?ÿß×xÿ}ZßÍO¼{«E¤ÿ§ L5ÝÛ¦n}m/#üù?s9ÿ!ðù_7"ý7³ÞÿÏÿþþï¨Võu]ÍyPHÿ{Ïúøcßÿmqÿ¬ÿéF¤ÿÙú¶ÚV«ÙÃáàT:à´þ~ý?Íéÿ1u¯þ/vÓõõ´ÜíÖ³ºlêûºyxùáúÏLNÿQÿåÿoËm5ú¦Ërsò§ôÿLý?µ¬ÿCèUòéÿUHÿ«»åÇjÛÎ vU
sZ§ïÿé@ÿ¹¡þ´õ?W/ýÇÿ÷ÿ ÿÙýnPÿáüCF÷jDúø?2êýºéÿÜþÁóMêÂû²)y ÐHÿÿó?xÿ×Hÿÿý_èÿÐHÿg÷ÿMNÿ7ú?u#ËÿüÔ?þeôvÿG¿þçRæÿ1¤3 Íôo þîÿ
+AÿþôèF¤ÿúÀúnDú?ûþÃû?÷ÿÆðãj×lïfíåW
ôðpÿ?¼ÿëF¤ÿõôèF¤ÿûÿ@`õG7²ü?ÀÿAýCè99èÿPHÿÿóèÿÐÍ8ý·|9¢Uxhÿoãèÿ@06þèþßiÎø#?ªÿ7×B8Ëü?fñR Ö?ªÿ7×Bàì_7ÁúÇôÿfý3wºéÐÿþgÿ³ÿ÷Å2VÿèþßÌÿ`?®ÿwÂøCÅÐÿû?c`ÿoÝôXÿÇçôÿëF¤DÿïúGÀþߺé°þ/¥ÿëºé±þþ\ÿ§þý¿éÿÀþߺåÿëÿXÿЫäÓÿ«þý¿3®ÿ
ÀþߺèÒÿ;Iéÿ@ ?bÿgÎÿ pÿgÝôðPÿèÿÐHÿþßÔ?öÿÖHÿÿó?xÿ×Hÿ ÿ÷Ã@ÿnDúGìÿLÿ7ú?u#ËÿüÔ?¾þ]ôØÿù?ÜÿY7ýCú'ýDñGø?èÿ@ÿnDúGø?¨¬ÿèF¤DÿoêûëF¤ÿûÿAàý_7"ý#öÿ`ýýºéáÿàþ?XýÑ,ÿðPÿúNú?t!Ò?ÂÿÁüú?t3Nÿ)¾ÿ7û¿@tÿïÖÿÇø¿>ÁñGõÿfÿgÿ[v½TõêÿÍúÖÿt¬Tÿo®ÿ@ýëF¦@ÿoîÿá<óæ/±úG÷ÿfþCXüqý¿ãA@ÿïõìÿþëÿøüÏÿºéÑÿþìÿþëÿ¸ÿfît#Ò?býý?¸þO7"ý#úÓÿý¿u#ËÿÖÿ±þ¡WɧÿW"ýúsÿìÿþ!ý¿]LÿQüû?sþû?ëF¤ÿú@ÿnDúGôÿ¦þ!°ÿ·nDúGø?ÿÀû¿nDúGø?èÿ@ÿnDúGìÿLÿ7ú?u#Ëÿ
üÔ?þeôØÿù?ÜÿY7ýCú;CÿQüþúÿ!Ðÿ¡þþêë?ºéÑÿúÀþߺéáÿàþxÿ×Hÿÿë?èÿÐHÿÿ÷ÿÀêndùÿúÐsrÐÿ¡þþæÿ Ðÿ¡qúOðý¿Sú??¼ÿ7÷Tÿo®ÿpù\pq¡ëÕÿÏÿ*W5ÁúGõÿæúÌÜéF¦@ÿoÖÿ!eþ_pþ©Õ?¼ÿ7ó?ÂâìÿÍøCÅÐÿÛ²ÿ/öÿÖHÿÜÿùÍ@ÿ¿nDúGôÿæúìÿþ¹ÿóî?ÝôÏýß\ÿ§þý¿éÿÀþߺåÿ¹ÿó[¡WɧÿW"ýúsýöÿÖ@ÿþßíþô¼>¢ø#öæü÷ÖHÿÿõþÝôèÿMýC`ÿoÝôð¤Ìÿ@àý_7"ý#üôA ÿC7"ý#ö¦ÿýºåÿþêBßÉAÿ.DúGìÿÌüîÿ¬þ!ý¿þ¢ø#üôÿC ÿC7"ý#üÔ?Öt#Ò?¢ÿ7õý¿u#Ò?ÂÿÁýÿ ðþ¯þþÖ Ðÿ¡þþîÿÕÝÈòÿ ÿõ¡ïä ÿC"ý#üÌÿA ÿC7ãôlù8¢UxpÿïþcãîÿrÿÁñGõÿæú/çÿsq©ëÕÿÏÿXÿÓM°þQý¿¹þûëF¦@ÿoÖÿ!eþo9ÿ¿TÆêÝÿùañÇõÿæþÏDñGôÿfÿ_ìÿþ¹ÿóù?Ýôèÿm¹þûëF¤îÿüf`æN7"ýsÿç7×ÿéF¤Dÿoú °ÿ·ndùîÿüVèUòéÿUHÿþß\ÿý¿u#Ð?¦ÿ·£ÿ(þý9ÿÀýu#Ò?ÂÿAýC ÿC7"ý#úSÿØÿ[7"ý#üÌÿ@àý_7"ýüý_èÿÐHÿý3ú¿!°r«YþÿõýúÐwrÐÿ¡þû?3ÿû?ëF Lÿïþ¢ø#üôÿC ÿC7"ý#üÔ?Öt#Ò?¢ÿ7õý¿u#Ò?ÂÿÁýÿ ðþ¯þþÖ Ðÿ¡þý¿¹ÿVt#Ëÿöÿ þ!ôôèB¤ÿù?ôèfþ¾ÿ7û¿@tÿïÖÿÇø¿>
ÁñGõÿfÿgÿv½TõêÿÍú*W7ÁúGõÿæúo¬ÿëF¦@ÿoîÿá<ó^E.±úG÷ÿfþCXüqý¿ãA@ÿïõìÿþëÿøü3wÝôèÿÍõØÿ[7"ýÖÿqÿ'tÿéF¤Dÿoú pýnDúGôÿ¦ÿûëFÿ¬ÿcýB¯Oÿ¯2DúGôÿæþØÿ[7ýcúçô űÿ3ç¸ÿ³nDúGø?¨ôèF¤DÿoêûëF¤ÄþÏÌÿ@àý_7"ý#üôA ÿC7"ý#ö¦ÿýºåÿþêBÏÉAÿ2DúGìÿÌüîÿ¬þ!ý¿]LÿQüþúÿ!Ðÿ¡þþêë?ºéÑÿúÀþߺé±ÿ÷ÿÀû¿nDúGø?Xÿ@ÿnDúGø?¸ÿVt#ËÿüÔ?þeôð0ÿþÝÓðG´
+îÿméÿ@06þèþß~8ã 8þ þßë?!eþ³p©ëÕÿë?!ðÉ]7ÁúGõÿfýõ¯þý¿éÿpù?û_,cõîÿÍü°øãú'?Qüý¿¹ÿ3öÿÖHÿõ|þÀ»nDúôÿ¶õý¿u#Ò?bÿgúÿ Ðý§þëÿØÿ×ÿéF¤Dÿoú °ÿ·ndùÀú?Öÿ!ô*ùôÿ*C¤Dÿo®ÿ
ÀþߺèÓÿ;¡ÿ(þý9ÿÀýu#Ò?ÂÿAýCànDúGôÿ¦þ!°ÿ·nDúGø?ÿÀû¿nDúGø?èÿ@ÿnDúìÿÑÿ
+þOÝÈòÿ¯ïÿ0Ô?¾þ]ôØÿù?ÜÿY7ýCú'þ¢ø#üôÿC ÿC7"ý#üÔ?>¹éF¤DÿoêûëF¤ÿûÿAàý_7"ý#ü¬ÿ@ ÿC7"ý#üÜÿ«?ºåÿþêBßÉAÿ.DúGø?ÿ@ÿnFèç?.gÓÍúw¯ú]y?¾õ×VáYÐü?1ôa`ÿ?Ý»ÿçÂÎ_Z
õÿ2¹ký?ô½>cãÿÔÿQp±ñïøÿlFÿàø7·Ûªu <ÿ' óÿÎòü_pq©ëÿÉû·)g¿7cz~þïÏÿSã8ÿP¹ª Öÿ¾ÿ÷iÍw ׿Íbæÿ 0s¯þCfÿ¢ùÌúóÌÿ^E.±ú?ÔÿdÇhO üó?Ââÿ¹ÿCà1ÆÆ¿»þ×1þDñ?ûúßl¸þû?Bhûp°^Dú¬ÿeÿ?|þ×Hÿg_ÿÛÿùû?÷
ðaU_×ÕW¥ôXÿqý/ºu#Ò?`ýoNÿ®ÿÕHÿg_ÿÛ×fcú ú×,ÿÿúë-ëÿz|ú!ÒÿÙ×ÿöû?º4·Ô?¶þGñêE ÿâÿ°ô űÿ;ç¸ÿ»nDúGìÿNýC ÿC7"ýÛÿ1xþ³iBýCx_6%/zéáÿ`þïÿºéáÿ ÿýºé°ÿ{Nÿ7ú?u#ËÿüÔ?þeôØÿù?Üÿ]7ýÿ#¡ÿ(þ ÿGBÿ?ú?t#Ò?bÿêë?ºéÿìûïÿÜÿë]³½µo^ "Ò?ÂÿÁýÿ ðþ¯þþÖ Ðÿ¡þþîÿÕÝÈòÿ ÿõ
¡çä ÿC"ýüÌÿc ÿC7'ô¿ZÏ¥]þ UxXÿï,ÙÿÂø·ÿlúé06þO×ÿô×>ÿ1þ¯Ïøøûi0 ûøçùø'&ógñÂm¦ö]d¿9ïïú,ÿÈøûI_é?«&ü'ÿ\Þ÷ÿ¹ù_mT§·u¥yêò̸«ýwõnů¯×Ûª¾Yù¿Ö«¦Ú.ªò¾ÚÿëC_-Ö¨=GÚ÷hWngWëæÖ?ì¿gã ÛC~½×ÿ²ZÖ«ëµà'ôï¥ßßÿÃXGÿ?«´"5ÑÏÕò×uS.¾Zü<Ïɢ߾ïøa[U×ý$¸Ìø°«æDKr9èønÖÔ÷ÕÓëþMÒ¼tü¸*{CrW$ïëmóÐyýtñ¿Ûº©>³ßºâÎêEõÏò¦Ú=(üõª;àçr³éü{²îïVëÕÑ;DYv?¨öÅ_Ëî¤;à?ü2ý°ò§ó4¤{ï×w«YÕû=»~Y_Îó¢_þ§-ÊzùÇ!ìäè×üåÃj{òø>®8æßïnÔ´sZÄÃW;çHÐüßÈ!ÿ»óãã?¯ý'å¯KáÇ8ÿø?¹ÿW0±¤ûÿñò ëÿbï3|þÔMÌý0ô*¹²/,kHÊXýoúÞa?ÿÍÿ§Ìÿ#ÿ×Ìÿò?.åþò¿ya¬+ÉäÛ÷H&EÚÍÿ)Æ_1ãõÎÿÒÿáÑÉÿféäÔj<Èÿ7é¦wãAþ7³YáâÎAþ×e¶È:ù_k]\t<ÿºNäãAþ×öÈgò¿Îv1Èÿº|b]gÀ0ÿë?ÉùßøTþ7æmj~Aþ×äù¤ûQó¿¹WhgÀåcæßã¯ÿþùßÉ!ÉÿúaÌÿpþë!<&ÿÕIÐõ_(HÉõß¿Ìë? ø#óÿ¼þCø´ÿÓ»H\*cõoÑùÿùããï¯ÿì¢ç?Þÿ!ÅßÊÁçÿ¯ññ¯ÿ`þÂSýÏYÛÀú_Öÿ9Oâ8IÖ$pzøµ2^ÿØú_Êõÿ{jýí×ÿÒ<Îâ´7 [ÿóðÆtVNØAýÏØ$vygÀ þ6M:«ÿeEgÀúÔÿ²¤(\÷[ÿÑ)ÙgÖ¤ÝÒ}¦þ×®kï8Qÿ³§êvPÿóÚéJí þg|¨:ÅZû\ý/?æÕÿ,ëoñ
×pýë!?õ¥=ÿ#óÿÔ?/Iû?}áhñ¼TÆê?Áæÿsÿ-æÿ?8ÿÇý üÿ3yNÀü_åÿL¹,6½ü_ÂòðWËxýûù_";ÆþúÏý¿¾JÆÇÿ5¼þ#8dôSùßdÿ-ò|ÒÙs&¬ÿ(&ØÎÁúÔÔtò¿©+´3àü¯uÝáDþ7ä¿ì¤G¿f?ÿkØýýü¯µ¢èæmuÈÿ&§ò¿Épýÿ ~ÁúÄ«û[ò¿mñ¯ûIþYþ7aþ÷Í0þúÎÿ²þáÑüÊW#Aódþúpü/7x½XôË!zþçþB!B!B!BÈhþðáZo
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8amd64-4n2c.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8amd64-4n2c.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8amd64-4n2c.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,49 +1,49 @@
-System(0KB HP=0*0kB )
- NUMANode#0(15GB)
- Socket#0
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#0
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#4
- NUMANode#1(16GB)
- Socket#1
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#1
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#5
- NUMANode#2(16GB)
- Socket#2
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#2
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#6
- NUMANode#3(16GB)
- Socket#3
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#0
- P#3
- L2Cache(1024KB)
- L1Cache(64KB)
- Core#1
- P#7
-depth 0: 1 System (type #0)
+Machine (phys=0 total=67108240KB)
+ NUMANode #0 (phys=0 local=16776592KB total=16776592KB)
+ Socket #0 (phys=0)
+ L2Cache #0 (1024KB)
+ L1Cache #0 (64KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ L2Cache #1 (1024KB)
+ L1Cache #1 (64KB)
+ Core #1 (phys=1)
+ PU #1 (phys=4)
+ NUMANode #1 (phys=1 local=16777216KB total=16777216KB)
+ Socket #1 (phys=1)
+ L2Cache #2 (1024KB)
+ L1Cache #2 (64KB)
+ Core #2 (phys=0)
+ PU #2 (phys=1)
+ L2Cache #3 (1024KB)
+ L1Cache #3 (64KB)
+ Core #3 (phys=1)
+ PU #3 (phys=5)
+ NUMANode #2 (phys=2 local=16777216KB total=16777216KB)
+ Socket #2 (phys=2)
+ L2Cache #4 (1024KB)
+ L1Cache #4 (64KB)
+ Core #4 (phys=0)
+ PU #4 (phys=2)
+ L2Cache #5 (1024KB)
+ L1Cache #5 (64KB)
+ Core #5 (phys=1)
+ PU #5 (phys=6)
+ NUMANode #3 (phys=3 local=16777216KB total=16777216KB)
+ Socket #3 (phys=3)
+ L2Cache #6 (1024KB)
+ L1Cache #6 (64KB)
+ Core #6 (phys=0)
+ PU #6 (phys=3)
+ L2Cache #7 (1024KB)
+ L1Cache #7 (64KB)
+ Core #7 (phys=1)
+ PU #7 (phys=7)
+depth 0: 1 Machine (type #1)
depth 1: 4 NUMANodes (type #2)
depth 2: 4 Sockets (type #3)
depth 3: 8 Caches (type #4)
depth 4: 8 Caches (type #4)
depth 5: 8 Cores (type #5)
- depth 6: 8 Procs (type #6)
+ depth 6: 8 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s2ca2c.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s2ca2c.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s2ca2c.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,54 +1,55 @@
- ¼J í]oãH®ûvý+tq.vw3É$¥pz¦vv
-»=g0=µ{î¢%¢$R )wy~ýÉ,õá"RF¹+ÞGè.Ùú ¬àÌ|3r¯â¨ýQÏôÿÒÙ~ðB`Iqÿª$VÛUmÿ}â¥t$A'ö÷JaôÃÈøù8l6G£îæÕ|Y_y^^7ñAüÇÆÃ90,þ¡¨Bü98¶LëÃãi#þ¼ÿÙª¸Ú90<þ&Ð âÏÁ×â_Ì®s
-ïÿM¤Ñÿ³Ðÿ»*gSû¼¶évàxïWâ¯ã¯ÈXý×ýSÏ#<þ7ßúoJþ³
ý¡h¦íã:'£[ÿá±þíè¢LOý?Ø¿¨^WÇW!ôÿ&
- ~Ùtè?äe{á1ºô¯ôï®ÿã82Ð?¿üß÷?ÿ×ýß6àïîÊ÷ùrù¡Ì~²÷kýSøzw7¢?èÉlR6~×¼xƺü[õ[^ÿûlë ÞêwõÇë2øëßõXÛ_Ö?Á»ìÅcY«CûúÚoKþ×.Â
-ÿM`ü^ñÿ-ýoÖäcÎÿTĸþcí¯lºÆªÎÒ>øóCý«ð(ÿKt¢ ¾ävh $ÒÕÿ×ÕlµS{òéxîþÿhþW¡ ¡zÿ1Æ;þhÿYè=þ[Ϊxîþ_ÄßhÄ7"3rC2èþEÒ'ÿ¿Hü?Õÿ6ÿ
-æXþeÓËÿuQöGÈÿÜøòz^ÿéÊ£ÿG%Ç×ó"þþy¹9<tÒè©FÿÏVÿ&ÆõP¼l:ô¿ªfé²H/;ñ»ô¯üOÁÿËl?²é7þsAçÿCþ?>Éÿ#\ÿ±°;Ô(ó? ÿ»ùhøYôeÓ¡û§(ó?&Äõ?ÿM¯ù[ ÿÃ^ @ÿ@ÿ²é©ÿ ºóÿèXÿ6þ9ø9À¤dzéÿ¢Ùÿ>úOÇÿ£ã,ìÆêÑH¥çüÿfSÌÈÇæÿzÿÇõ?§ñåE_³è¶
ï½þ[»úÆþõß¼{¿ÍW×8
-Å[ÿC)Ôÿd¡3þÙzÃ[ÿaÿ$@ý_zÅßþ§.8 Çß>ñg¡üÛj]-«ùãðapüµBôÿ,âß.ê<MâÎ~_ófº,¯WëÎÿæÿ´1Öÿ² ïlúϪ:Vcté_ëãö?R¨ÿÂÃ>·oáN¢5bæRýw÷þ}æÿõo´þYP·á¹M ;¡Põ?d: Sÿ'ù¿NôÏfÿesùõ÷1ºô&ÿ7
-õ_Xxiÿ;0"pCÐÿzñØYº®ÓìS:ïÎ÷ÿ&þyÀølúë?«Óf1-«6*nýù?´+ ýs0 ý_äõʶú6ý«Úv÷t6ÿªþ.Vmúm
-4¼ÿt ÿ¸þÍþ?ÍýoÿØÿ£ý÷ÏÐøå,ÿ¬Ãã¯ÝPÄbüEZ糩}`ºJ»vêêÿÏÿ%ÆÿY Òy»£1þÇ
-Qÿ¿¥Í´ºwuª¬HÛâ¡h_;Fþ÷ÿvúCÔçAÅd¨ýñÏþ+»õ\ÿOÛ{Ð?Q0ÿMXú/7«»¼v@·]²èÖ¿9Éÿ±þ§È_.Dý?{ ¬dòé:Û¢}µBP·þÇÿãëxÀü¿lúϪE^çeö¸k ¾~90üúß$æÿY#4 ¹|ü¿{P·þ£cýÛûÐ?êÖ QÿËü!ï½!äðü?BÔÿe3n²¡æÿîé¬hÒ»eçD@§þõqÿEý?ÎÓvS磲jGyé¢9C ¢þÛÇõçÿNÖÿë$@ýo>Å}Í
¤ÿÁÿÀÿÉ1þýnýWcýû¼ ÿ'Ö³CÔÿýúHÿqaü
1'jÿ]ÿgt¤þPÃý)¢þ¯ìÿóÿ$ÄøðȨþÏmþèÿYÿS6Dý{ôêÿë¿X@ÿ/ËÇÿ¯áÿ<©ÿ$Ð?èÿeCÔ¿Gÿ§Þù?±þè_6Ôüß»ÿã,Àÿ)¢þ¯ëÿ<¨ÿ wþOÿ±ð>m±é`Hú¸´Sø`ÿ'꿲@¿ÿú¨ÿÇÂ>ðʨþÏ]ýOÔÿàþOÙPûþϧõèÿYÿS6Dý{ôîòÿëÿYÿC6Dýû¯ÿþÌÿʨÿõ?1ÿËúÙ\>þïÉÿõß, ÿ
-QÿþëÂÿÍô/jþïÝÿù?àÿ
-QÿW®ÿy:ÿ§0þDziëMæo¡{ô×Uº¡>Ê1åÿÎÿ$×ÿ, ÿM_ýÃ,ß8
ò«ÄĨÿËBÿø·ÕºZVóÇá'Âàøk¹ý_ÿâß.ê<MâÎ~_ó¦{0þoPÿ
ý¿húϪ:VctéÿÌú
ú/<ìcð&Öÿ¤XÊÍ¥úï1ýOØÿÇh
-ý³ nÃ[s@wB¡ê¿õ?F§þOò謸Íå×ÿÝÇèÒ
ÿüß(
-ýsðÒþ/w°þ×þ¬ÓìS:ïÎ÷ÿ&þyÀülúë?«Óf1-«6*nýÖ
-Pÿ
íÿ"¯W¶Õ·é_ն˼ÿ< ð°ù¿PE¨ÿÅÂñϪMÙ5ô·exÿé þôÿ¢Ðÿoý¿coÿØÿ£ý÷ÏÐøoýß¡þ'ü?,ãï¿þ'ÆÿY Òy»3Æø7Dý_¹þçqý84ÿcAÅd¨ýÿuëÆ§õ?Qÿ
(Ĩ *¢þ¯\ÿÓäÿÆÿXpúüåBÔ¿ÿú¸þgóÿ²!êß{ýOú, þ§l.ÿ¿FýÏãú?FÁÿÃCµ?¢!êßýOÔÿcëdCÍÿ}×ÿÑÿ³ú²!êÿÊõ?Oü_Iý¿XøX÷4/þÿ§ÿbüýû?ÿ±°Áðbý7;DýûßÿùPl¨ý¿÷ýßÑÿ³ýßeCÔ¿÷ýß±ÿ3ðȨÿþOôÿ,Àÿ)¢þýïÿÿèÿesùø¿§ýß±þìÿ"¢þýû?±þäÿ²¡æÿÞ÷Çüðʨÿëú?Oê?èDaü
÷iM×CÒ¿bð¢þ+Äøû÷¢þûÀÿ)¢þ½û?Qÿ(N6Ôþß»ÿý?ðʨÿþOÿ° ÿlú÷ïÿDÿÏæeCÔ¿ÿ'æY@ÿ/ËÇÿ=ù?áÿfþOÙõïßÿ ÿ7ÈÿeCÍÿ½×ÿÄüðʨÿ+×ÿ<ÿSÿcáCÙ´õ&s·Ð½@úë¿*ÝPåÃóÿ Áúÿ˦þ×uÞäeÇ(ßëóÿh§ÿþ±ÿdúöÿѰ%8
Zÿ¡ãöÿÀúÿô[«e5~"¿VÿEüýC»¨ót6m;û}Íî @ÂüÁþß<`ú_6ýgU?«¿Ï1ºôfýJ ö1xëÿAkÄÌ¥úïaÿ!ìÿe´þYnõmtCwB¡ê¿õ?F§þOòèÿËæòëÿîctéÿLþo\ýèß?o!í¾£´FÌôÿ¼öofÒyw.0¼ÿ7!ôÏ'þúÏê´YL˪ÍÊ [ÿ§õß0ÿÏÃö×+ÛêÛô¯jÛeÞÐxØü_¨"ìÿÌÂñϪM?OÐðþ?ÒÖÿ°þ_6úÿÿráí»ñ´ÿþÿíúÍPÿþñ÷_ÿãÿ,Fé<ÿa6¢þ¯\ÿ÷¸þOÿ± 0õ/jÿÝú¿ñiý_Ôÿa!
-&1* Ë
¨ÿ+×ÿ=Þÿ)J"ÿ±àôùË
¨ÿõqýÏ®¸eCÔ¿÷ú¿õÿY@ý_Ù\>þú¿Çõ¿ÿà
-dú÷_ÿõ¿XÐP¿h¨ù¿÷ú¿èÿY@ý_Ùõåú¿'þ¯D¡þ7Ëâ¾æÅBÒÀàÿáÿäÿþOä,ìcð6üXÂ
-QÿWöÌÿùc(N4ÔþÿºþÏÓý_Ðÿój¸?%CÔÿýÇþ(àÿ`þÙõïßÿþø?eCÔ¿wÿgÿèÿesùøÿ5ü'õë?YüeCÔ¿ÿ'Ö²ü_6Ôüß»ÿó,Àÿ)¢þ¯ëÿ<©ÿ
ñ?Þ§m
-ÁË
¤ÅàÿDýWñ÷ïÿDý?ö1ÿS&Dýû÷ÂÿÁü²¡öÿÞýèÿYÿS6Dýû÷büø?dCÔ¿ÿ'ú0ÿ+¢þý×ÿÄü/èÿesùø¿'ÿ'üß,@þ²!êß¿ÿþoÿËÿ{÷bþø?eCÔÿëÎÿ)ÿ±ð¡lÚz¹Á[è^ ýõ_n¨ráù`ýÈÿeÓWÿñ0Ë÷Náüß*11êÿ²Ð?þmµ®Õüqø08þZEnÿÄß?ø·:OgÓ¦¸³ß×¼é ÿã,`ó_ÙôUuþ¬þ>ÇèÒÿõ?
-õ_xØÇàM¬ÿ13ê¿Çô?aÿ£5ôÏBp«o£[dR¡ê¿õ?F§þOòè
ÊÍå×ÿÝÇèÒÿüß(Ôcá-¤ýÏw"¬ÿç ÿçµ?ë4ûλsáý¿ ¡ 8Ùô×V§ÍbZVm>TÝú?ÿDÐ?ÚÿE^¯l«oÓ¿ªmyÿy@àaó¡{ó\ÿ¬Ú]C[÷ÿýúç ý¿lôÿ[ÿ/åÃÛÿ vãÿhÿý34þ[ÿ·f¨ÿ ÿÄøû¯ÿñ£tÇÿ°¢þ¯\ÿó¸þGÿ± 0õ/jÿÝúñéú?¬ÿa!
-&1*Ê
¨ÿ+×ÿ<Þÿ%Âþ¯L8ýCþr!êßýO\ÿ³õ¿²!êßýOÔÿ`õ?esùøÿ5ê×ÿ1
-þ4Öþ¨ïõ?#ÔÿcACý¢¡æÿÞë¢ÿgõ?eCÔÿëø¿°ÿ;Ëâ¾æÅBÒÀàÿ4ðr@¿ÿ'ò?ö1xþO¬Fá¨ÿû¿#ÿcû¿ËÚÿ{ßÿý?Øÿ]6Dýûßÿþàÿ
-QÿþýèÿYÿS6Dýû÷ÂÿÁúÙ\>þïeÿw`ý'pʨÿû¿cý'ÈÿeCÍÿ½û?1ÿÇü²!êÿºþÏú:Qÿcá}Ú¦¼\HúWþOÔeÿþOÔÿcaø?eBÔ¿ÿ'ü,Àÿ)jÿïÝÿþø?eCÔ¿ÿ'ÆXÿC6Dýû÷¢ÿgó¿²!êß¿ÿó¿, ÿÍåãÿüð³ ÿ§lú÷_ÿþoÿËÿ{÷bþø?eCÔÿëÎÿ)ÿ±ð¡lÚz¹Á[è^ ýõ_n¨ráù`ýÈÿeÓWÿzåû §ðAþoeÀÿÍAÿø·ÕºZVóÇá'Âàøk
!âÏ!þí¢ÎÓÙ´)îì÷5oº' ãÿ&BÿÏöÿ
-AÿYUçÏêïs.ýYÿ£è
}ÞÄúcÐ1s©þ{Lÿöÿ1ZCÿ,·ú6 b¡ê¿õ?F§þOò
-ÿÈÿesùõ÷1ºô&ÿ7
-þ?ÞBÚÿåÌÈÜôÿ¼ögfÒyw.0¼ÿ7!ôÏ*nȦ¿þ³:mÓ²jó¡2èÖÿiý'Ôæa@û¿ÈëmõmúWµí2ï?è<lþ/TÎÿù?ÿ\ÿ¬Ú]C[÷ÿàÿeý¿lôÿ[ÿ/åÃÛÿ vãÿhÿý34þ[ÿ÷@3Øðøë@ÁÿÃ1þþëbü
sõ?1þÇ
-QÿW®ÿy\ÿ#±ÿ
-Sÿ¢¡öÿ×ÿcÿ÷oDLbT QÿW®ÿy¼ÿöçÂéòQÿþëâú¬ÿ
-QÿÞëFØÿÔÿÍåãÿרÿy\ÿû¿s¡±öG4Dýûßÿõ¿XÀúÙPóïõ?Ñÿ³ú²!êÿÊõ?Oü_ICÿ|,ûIÿÿSÁÿÉ1þþýÈÿXØÇàMø?±þ¢þ½ïÿ!ÿcû¿ËÚÿ{ßÿý?Øÿ]6Dý{ßÿ=ÿø?dCÔ¿ÿ'úàÿ
-Qÿþýð°þ_6ÿ{Ùÿ=H°þø¿dCÔ¿ÿ'Ö²ü_6Ôüß·ÿÓ`þø?eCÔÿuý'õt¢0þÇÂû´M!x¹ô¯ü¨ÿÊ1þþý¨ÿÇÂ>ðʨÿþOø?XÿS6Ôþß»ÿý?ðʨïþOø¿xÿC6Dýû÷¢ÿgó¿²!êß¿ÿó¿, ÿÍåãÿüð³ ÿ§lú÷ïÿÿäÿ²¡æÿÞýÿcþOÙõåú§ó
-ã,|(¶ÞdnðºHýW¥ê£cxþo/ÿ1þÇòÙôÕ2Ìò}Sø ÿ·²òàÿæ üÛj]-«ùãðapüµ}4@ü9 Ä¿]Ôy:6Åý¾æM÷ aüßÀÿËCþ_4ýgU?«¿Ï1ºôfýJ ö1xëR,EåæRý÷þ'ìÿc´þYP·á¹E ªþYÿctêÿ$ÿ× æÿx¡|Ñ\~ýß}.ýÉÿÂø?o!í¾3Ð1CÐÿóÚu}JçݹÀðþßÐ?ÿMýguÚ,¦eÕæCeÐÿÓúOüÿ,hÿy½²¾Mÿª¶]æýç]Íÿ
ÊÕÿÇü.VmÊ®¡¿-ÃûÿH£þ#ȸe3 ÿßú)ÇÞþ±ÿGûï¡ñßú¿µÿúþñ÷_ÿãÿ,Fé<ÿ¡!7Dý_¹þçqý8ÿCr¡öÿ×ÿcýß7"
-&1*Ê
¨ÿ+×ÿ<Þÿ%JÆÿXpúüåBÔ¿ÿú¸þgóÿ²!êß{ýOú_, þ§l.ÿ¿FýÏãú?FÁÿÃCµ?¢!êß{ýÏHCÿ þ¯l¨ù¿ïú1úPÿS6Dý_¹þçÿ+Q!ôÏÁDz¸/ y±ô0ìÿÃÿÉ1þþýÈÿXØÇàmø?±
¢þ½ïÿnÿ± ǵl¨ý¿÷ýßÑÿ³ýßeCÔ¿ÿýßáÿ`þÙõïßÿþø?eCÔ¿ÿ'ü, ÿÍåãÿ^öWÖ² ÷§lú÷ïÿÄúOÿËÿ{÷bþø?eCÔÿuý'õt¢0þÇÂû´Å¦k!é_1ø?Qÿbüýû?Qÿ
}àÿ Qÿþýð° ÿ§l¨ý¿wÿ'úàÿ
-QÿþýÿaþÙõïßÿþÌÿʨÿþOÌÿ²þ_6ÿ{òÂÿÍü²!êß¿ÿþoÿËÿ{÷bþø?eCÔÿëÎÿ)ÿ±ð¡lÚz¹Á[è^ ýõ_n¨ráù`ýÈÿeÓWÿfåû §ðAþoXÃÿÍAÿø·ÕºZVóÇá'Âàøk
¨ÿÌ!þí¢ÎÓÙ´)îì÷5oº' ãÿþúÑôUuþ¬þ>ÇèÒÿõ?6þ9ØÇàM¬ÿI±Kõßcú°ÿÑúgAÝ·{
ªÿbÖÿú?Éÿµ»\þÀøl.¿þï>FþÏäÿFaþ
·ö?ßÑXÿÏ
-AÿÏkÖiö)wçÃûBÿ< ÿMýguÚ,¦eÕæCeÐÿÓúOæÿYÐþ/òze[}þUm»ÌûϺ ÿ³Íù?.VmÊ®¡¿-ÃûÿH£þȸe3 ÿßú)ÇÞþ±ÿGûï¡ñßú¿5öÿ^ Æû¿'Fé<ÿid#ÌõåúÇõ?PÿCr¡öÿ×ÿÖÿL ¢`£¨\ú¿rýÏãý_¢õÿxpúüåBÔ?öÿNÀü¿lúÇþïß ¨ÿ)ËÇÿ¯Qÿó¸þQðÿð n±X2Dýcÿ÷ï̸Éÿcÿ÷ïÔÿ
-QÿW®ÿyâÿJê³ð±,îh^,$ýþÏþOñ÷ïÿDþÇÂ>oÃÿÕ(Üõïÿwä,`ÿwÙPûïû¿£ÿgû¿Ë¨ÿû¿ÃÿÁü²!êß¿ÿý?ðʨÿþOø?
X@ÿ/ËÇÿ½ìÿnïCÿÀý)¢þ½û?C¬ÿdù¿l¨ù¿wÿ'æÿXÿS6Dý_×ÿyRÿA'
-ã,¼O[lº&þÿõ_Y Æß¿ÿõÿXØÇ þOõïßÿ ÿðÊÚÿ{÷¢ÿgþOÙõïßÿñàÿ
-QÿþýèÿYÀü¯lú÷ïÿÄü/èÿesùø¿ÿ§
-àÿfþOÙõïßÿ ÿ7ÈÿeCÍÿ½û?1ÿÇü²!êÿÊõ?OçÿÆÿXøP6m½ÉÜà-t/þú¯J7ÔG9Æðü?H°þäÿ²é¥ÿOy]æËé*ýL:Æ0ÿÞê?Âõ?F¡L/ý¯«¦)z\è¿Aÿê¿ñü@ÿé¥zê¿
þпlú^ÿÜòã §ðþë?þ}6öÿ`¡üÛj]-«ùãðapüµÂ ñçÿvQçélê®rÞtÿ¹øù°âV6ýgU?«¿Ï1ºô¸þßé?R1ôÏÂ>obý¿KõßÃþ;pÿÏmÿ¯ôÏBp«o£Ûº
-UÿŬÿ1:õÿkÌÿ1ü_6_ÿw£KÿgòñÞBÚÿå¼Üôÿ¼öfÒyw.0¼ÿ7!ôÏúÙô×V§ÍbZVm>TÝú?ÿIýs0 ý_äõʶú6ý«Úv÷t6ÿªõY¸ þYµ)»þ¶ïÿ#õÿ< ÿÍþ»þráí»ñ´ÿþÿíúOí³þ¿ÞÕÿÿbü=Öÿßöÿ1öä2JçíÖ"±CÔÿëÿGúÃã,(LýÚÿ_·þ|2ÿ`ý?Q0±\ú¿rýsÿ'ÆÿXpúüåBÔ¿ÇúÿÛü?ÆúpÅ-¢þ=ÖÿßúìÿÁêÿËæòñÿkÔÿ?®ÿaøxnÑ H¨õÿõ®þ?ê± ¡~ÑPóõÿ·ãAÿÏêÿ˨ÿ+×ÿ?ñÙ{Ð?Ëâ¾æÅBÒÿÀbNâCýnýüþ!Æß¿ÿùû¼ ÿ'Ö³CÔÿý'ó¿aü
1'jÿ]ÿçñøFÿÏD¨áþQÿWöû?¢$ÿø?dCÔ¿ÿ'úpÅ-¢þýû?áÿ`ý¿l.ÿ¿ÿó¤þc`ý'¨ÿ$¢þýû?±þäÿ²¡æÿÞýÿcþOÙõ]ÿçIýÿcá}Ú¦¼\HúWþOÔeÿþOÔÿcaø?eBÔ¿ÿ'ü,Àÿ)jÿïÝÿþø?eCÔ¿ÿ'ÆXÿC6Dýû÷¢ÿgWܲ!êß¿ÿó¿, ÿÍåãÿüð³ ÿ§lú÷ïÿÿäÿ²¡æÿÞýÿcþOÙõåú'óIñ?>M[o27xݤþ«û{7ÌG=Fwþ¼ÿ§s Bÿ4Øu[0½ôߨ6]eÓuõ[^Oô¡(çýÅ@¸þ·@ÿ`üO6}óÿb¶ÌúøSø°õAèöÿÁúÿ¶©ë¼l§óê!¯ËªÖUct·ÿ'û?XÿËÃ*/7èäBÒÿ¬.lÐûÝã?§ùöá!ÍÖÅÔH:õ_V3râ÷İü/üÁ>+pë¿ÿù§_üÝÿnúóÁñ×6#T?CâoÓîÅÞgèêÿ×»ø+ü}ÞÄúïû{d!ÌÔ·Ùó]ú?\ÿ¹Õdàÿb!ø1æ3Dÿ«|U÷½üèпOò?iôÿ,ÜüÕv~ÉWÿ¨Útùn´CÅI¢
P>ýñÅSþ\çùþ#e¢É8ò±ÉgÏO)6ô/òsÖ_ÞÄI/ò¡L4I|ò.ÿUùoOOSj|p ý»<i4
-Nßå¾XæOOµ¨øÜ»|yÒñgùX:Å´Î;÷å»IÆ/?Ë/Ë*ûôò{qO/ò¾¨ÛÇ'اæe þ§.Úü.Í>>íå_ôgû)ÿÎóæù)l:ýò³¤ëõÑG%ú Ò?Ûoìð]ì·;9{øîO~ù}p2üõÏ¿N?ÍásøqÿXmÊ,?ú«òüGÿcµ~å]~]¦wïðð«ûõïy¶LÕÏâ¾0þú±¬wOz~¯P%æåSþ²ï¾Ýé§¾ÉGÝÔëçG¿µþ´ÿ¥½ü³á vå6Û;nÿcÔæÁÅtº(ÚNèd¬o¶¿ZMcOÏíýûªÎyi,Ê6¯yúo_c£©ãÛ¶¥Ë©;E^¼IÕ.òz÷ËoW¢ÿ&KËéæKo7]»ö¬ûÝ×úHÿQd NÙÑÿ¬°Z±ùÚÐctë?<îÿI ÑôÓÿ"mÜZâ1ë?¬ÿgòM?ý¯«¦)z¬ô=AÿnHúg úMÿþ¿¬êUº®òUU¿Zêû,Ãõï
-Bÿ@ÿ²é§ÿªô»þ÷¤ÿרÿÏô/Cý¯ë*»Ðì}§ðþþ_û{êû?±p&þTÏ«t´ÿ:ôQü£Ø`ü
SßOõdë8køÑzëñøãæþÞ~!/l¡VZomr&*ÕÎaòëoéúôñã¬5(¶õMÂøËëÌ@a¢_¾îè¼ýg÷÷õý<ïk¯9}Üß~ðe'ceÌ8Ø?vðe¿xì¬5Híþ¾¯yÎÚxÞó¬HíÜ.gý4&Ú~/g4±Þý}ç4ÝcgýB'¿ÐWB_s}Íô§jµ*Úÿ*ìÿ¶©8&Éî³ìkóÙôç_÷çKl[(÷ØÛk\Âç0
Qh&I8¶
-Ó_Üìyöô'>=ö§Å¦üôüÒ03q59ÐYßÐáofgxá%Ú?°/þùüF¶y?EyÖÚ¸G_Î0Ü)ýù1ýËÓ·Ä`÷g}ë
-øäLÿO±x}¯÷ÿ¶ÓHÂãþ_ðÿ³7θi±Ò£IÛd8
-FÚ6lÑ$Â
-mÔFcÛߨñ$Øö5¸qG6MmÛfÂí8Hô$ÇÆ½ÄÄcû:û.Qì_ ì&IFqB{ÀÝ&&,v^ûèùö&ÇQbîXÛÄ&py=m¡thõôÐÁ6º¶ó4Û#<½Àõéö³£=@hÂýóíqccìÏjlô(Oôî#û¡¸¤¢ý+ܯµëαùLL¢Ø½Âæ)ö¥®±¯pß]ôüؽQ»WØG£Ä~QÛWýÑîiq=½ ±/Pcí>ÛxûÐl_Ù¿À¾@¹eªÝ]m="elïmß0°ß{+lÿq7õô¯ûHyúaw³Go63õý°Ãof2Ãoþ).½ÙS3¶çKÑÆ¶yýæ7ÜpÃ
+ eÖ9K íooãFîóvý)ørp2¬*þ¸ÀM¦7;Ý̤ӻûN )Z&Z"ê´çÓß*ÉrK¢Ýd³N;SÏOHZ%QÒáS:5+6IÔ}/[g2ÿËw.5iEû¿Eíÿ}à;!d¦¡JRý¸ß±OsÁ®í²&¾»YÕ«uY}åyEÓr| ^fçñß6õô}üUG?OÅ?ßîÊê¶ì&ÀÉ!ÞOÄ_()/ã(ü.'û_Áóøm[7ÿö&¯>Õ²nåRÿõE¥/â]Õë+}I·Ù¦\ßë#ÉÕ¦^ëÓwE|¸TÙ¦Ðïý§_ÿüoQWæß¿þãCð
UÁÿ
+äJýÇßþyÕvÅv[V+ýÒt_þöOó¾RÉôX©«<Ëï -ÿiÞ=
+çIð?]mïîÛ2ÏÖÁþWmy£C·jÍS®òº)ÌýóæÃ¡l[æÇ#eUv¥~ÇÌC·Û9v_´æî¢øÛ®¬«Ç,Áºø¤¿ºþæáÕïÛǧ¯3}vý~]ðiSË"ضEеy°i`Á&/üól -¶Á¦kô9ù¦þ¤Ö©$È×·ë]{,»6Èòml6ÛÏúZý¶ú?©ÿÜuA· ¶7úûVÿ:õFãJ_ÕU·0çÏün±-ÛM]Ûâ¦
+nô6Åv±ªëe°J}¢M¢@?¡ìê&X¶|»ÖßãsP´æædúcé/às·Õ{o¥þÜëìîv¡O©\´wÙ²þýê¦^Õr»ÿÉ8þ!L®_ç!Itë"[«jSTÝáÁl¹Ô¡j÷O3/×?ÄM©?ì1Þ×A4;<ò©lº]¶¾ÚÖ¿M°ÉªlU÷ysuuzE?æ-WtÔ¿¢#\Ñ®èô]ÑòyE?_FËg¯hÙ¿¢%®hGW´úfW´úc^ÑÏÑÏ_ÑIÿNpEÿËÑÑó~¾Ï^Ñ¢E\Ñ®èè]Ññó~¾~þûWt+ú_®NþWôóe´zöVý+Záþ+£Ó?æý|ýüö¯èW´£+:f½¢ùGÀýæ©ùM±aÿ eÉÞüL1ÿÃÁ/Åæ·ºËÖoÊxDÉLÎeðñ§+}ìç¦(tuÍgRÎ̱v··úyó¥vPRHc5¥Ãòä.nPû÷|ÿ{¶íö¯û1ïÊOÅéãJ¥*Ü{WeGçÉ\1¯ûSVÕÕ¡Ryúº³£gçûÓm¹.(Ïßïñu_>ïCU|*ó.»Yü6é,Úÿfë:ÿxñåÄ,ßýìÇNg"gáñØÙ}rì..ïÏÞÑ|ÁÃ÷û¦ì,ÿx~üðýôWþ.ZO¢$ÄÃ{þm·3HE¼ÿ~ï×ÙÍù(Vq´ÿ]ÞÿZäë¬Ü|ùò<|¿Us8úøj%æcæsüf^túaæ³ý{þýç÷¦Î;ýA¾ÃOõ®Ê/ÿpìñ»ÿ¶Ù^¾î¯õfSvÿUêÿí$æéá³uÅrñãûãõèÊûï®ëü1L*Rñ<U3]0þÐ>þvú:{øÇþz·«>>¾T%*çæðßv«bÅÙ58» NüÚ~Z>yàý®Ù^غ
+>>¬×ÙÃUTä{ôåZQê ôÇcò_+Mæáák}ë
+¸ä©ú_+±ò_¯ÿu¥ªú?âõ?¦3!¹éß)]D¡îÃéÒrE*J¤I0ÓõÍÓ¹._÷³Ða ¢$Ñe[¬æºâ#ÈyÌbó8é×éwTz|Ð/Gq$
+>ááó8tõ$ºréDgÐ'C5©>«
+͹ö/HâдSôt %>ÕÃ9.tuåïÏððS§ëÏ®¹>Õñùú¼º£ÿ³XêÞÉ\>R¬?ÔÃBóDt|
yXê\ĺ=¥ó(1¯ÐíýRSèWß.z|EbÞ(MÌ+ôÑ(Õ?Ôþ3¡dKóËÒ´¸^ê4m¶÷/ô7Ð/æCéG8|í²ê D¬koý¡þ5Ì[pÿ¹ÍGJã?7}öù¦[fJÎØOkç3¥¾ù§xéM_¾¶Lm¦×oþypÃ
7ÜpÃ
7ÜpÃ
7ÜpÃ
7ÜpÃ
7ÜpÃ
7ÜpÃ
-7Üp»àvµÛ1I¬UßܵÅ*wPÕdÜ8ëWÞ4yãÜ@ÄÛß4ÓzSE9©§ïvWTuú>8ãÿs»}0úÿUxXÿ{çÿ±þ
'ÙWõ¿¼³~ÈËYUOýé?òÒù²ÍÎ6ºOWÅòÑ>߬ªY¾ü{WÝýQ®rûóöÙÿú÷ý¿¼*Ý¿úÛǶí7Îa8ú?#ýSþÇ_þyÓ´ùzmûÒd{_þòO÷¾:ÔÉO&o¶»Ùþ6
-&ñè?ÿx³^<6E.GÛܸÚnGB÷¬ªs÷Àö÷î»Òuí)Ê¢-ì[<ýÎýê~½q=æ»;Í?gùÚmûô»í.8£eþ`ÿtû7¿¾LíÑíöu£Û°ÎòѺÉGmVM=Z§ùhå£ìóx{ÀQ¯G«¶¶ÌÝ#é([Uöi{Y²åýrÓ,F³¶¹-ZF«ÕçÑýgûV¶vÿiû¿Ñ¢µ«ÑúÎþæ±±ß
-ÃçÑreÿbç¦/Û©;~Zgé:¯ïWU9ZçwÍèξi¯§óªÖea7q4²O(ÚªÍ\±¥ý;>òÆÂÌ~,ûñU<úÜ®íÇe«ÑÌ~îeº¸ÚCÚ_NE:«~»¹«æÕªXo¿òØøfÿç<Å1vq¦Ëb^®ò²Ýý2Íl¨íÓÜËíqWØ»÷í(ï~óPÔí&]Þl7¤Ò2çî}ÞÝܼ<£ÕïóV3::=£#ÑÎèäÑú÷yF¿ÞFëWÏh}zFkÑÎèðÑáïó~½~ýOÏègôw×FG¿Ï3úõ6Z½zF«Ó3ZáötFGßì6¿Ï3úõ6úõ3ÚÑgôw×FÇ¿Ï3úõ6:|õOÏègôw×F'¿Ï3úõ6úõ3:9=£ÑÎhÃzFó ÿ0=ÿ @
\ No newline at end of file
+7ÜpÃ
+·Ü®òîsÄqH$W7]¹)FÉÏÃãR¢5n y«ý#í¢ÙUUYñð÷ÍÁàªßð[[À\øÿÚûvúpvù¿ÉÿÉù¿8x"þKãn/&¼ìâ/Íú0J¾}¿+6\öúOTü,Ç?ßî^x
+ØÇ?ÕW âÏÁ¸ø3ý"°¿CÿñwEü»z[¯ëÕ½õ
`] ügÿî®)²åâ¸nðëÃóü¯&þQªXÿÃÀ1ׯáNAn(ú?&tXl³üc¶*åò«çÒ¿..ôÇÐ?PßPôoRòiþ{ý+©ôÏþ½¬ÿÑRû?¡^C³ÿñN£4bfþÿb]¶_Íb_ÿ'º ýs@q^óâúPý#ô/.ëÿ8¡Âky]£ðý×ÖGA8}ý/¤BþOï56õÿ]Ñl²õB7ÿë®[£çÂíæU$±ÿ+/^ïª1"íËÿ(J"ÿ`þÇo,ô7Y{·¨ê®°ÔÁ°þ/Ë)ýs`¶â´¯ÿ
áÿdÁ:þeµ,>K«ËÀ>þRÂÿÍ5þ&ÃüØsÿÉeû_$1Ê̦Lÿ6 ·Põÿè4cmÖt¥ÙlëÉsØ÷ÿRù?0þç7Týv[Ù´gàúQÏÿ¡ÿÇÂÏEÖí"ÐÝú ¨L0(<ªÿî~;]û¿7ÿ¯ÛÿÿcáCUÞм·Põ¿ßHwä9ìÛÿJ Ð?Ê÷rû¿¾+¢Êï _Ö¿ºôÿJBÿ$
+ !ÿßeM±\èÃàaý_öÿc
ù_$¼¿^CÕÿïÙ}»¨oYÛÖyuå§²»æú?QXÿÏü½fúm¿~!ý÷×ÿÆûüoп{1xë#tF¸¡ê¿ÚmnÆ´ Ú¢ÐÅpý_ê_Jø¿Y0þÎ_húÝû?%üPã?ÿórüG ÿð $Ü>CÕ¿sÿ'ôÏü~CÕ¿kÿ'ò?ð ÿ§ßPõ?©ÿ³7þ£Dú
·YAðþBÕ¿sÿ'ÆY@ûßoÈíÇþO ÿ7ðú
+yüRÿgoÿ#ÿüõªþ§õöò¿'ã,Ì ¯ þwãÿÄøÇ¼ÿ'²rCÕÿ´þÏËþlèôÿý¦áÞÿü¯,PãïÜÿõ,Àÿé7Tý;÷Bÿ,`þ×o¨úwÿý?àÿôªþ§ÍÿÙoÿ§¨ÿYxWµ]³ËMÛ
+º÷ªþû?áÿ`í¿!·ÿ]û?áÿ`ó?~Cÿwíÿÿø?ýª×þOäÿæþO¿ þwãÿÄøÇÀÿé'Tý;÷ÂÿÍúÿ~3Zÿv[¾ançÿÔ%ögÁ"þ]½×õêÞúB°¿HEøs@w×ÙrÑ7ú[
+ÿ(Cõ¿ý¥ ÆÿXàoäí#ÜPôÿèýÝfùÇlU,ÊåWÏ1¤ÿ'Æÿcèô¸ý¢ÿ¼n5½þæÿÀþ¿~CÖÿèÖ?©ýEÐ?¯¢Ù¼Ç( ÿ?h ²¯ÿýDèÔÿ~óâúØþ7býOoþ?J¡Âkyapo±Ð]«?áöõ¿
+ûÿ²õ?~cSÿßÍ&[/tó¿îºu1zØ(ÜnþWEfýæÝóøçõ®húí±/ÿ£(ÿÌÿø
þó&kïUÝ:Ö?ÿòÿó`ÿ½ÿpûú_¦ÿúß=Öñßû¿íÌ öñ2
ÿjü§Íÿ`ÿ÷oDÎd õªþ]çÿÄüÿóªþïÿþÈÿé7TýOÿ³7þ/Ìÿ±ð¡*oKhÞ[¨úwÿù?XÿÏoÈí×ù?#èäÿðòøÿ¤ù?/ûÿØÿ ï¯×Põ?mþÏ^ýH¬ÿgA@þ^3Aýï$ÿgù?1xë#tF¸¡êÚü1öÿFÿDç/4ýÎý&ÿüî¡Æßõþïÿáû¿û
+UÿÎýÐ?ðú
+UÿÎýð± ÿ§ßPõ?©ÿ³7þ£Dú
·YAðþBÕ¿sÿ'ÆY@ûßoÈí×þOø¿YÿÓoÈãÿ®÷Gþ°þÃo¨úw½ÿ»ÄøØÿÝo&¨ÿÝø?1þÇÂ1¯ÂÿýÙ¡êßõþïë?Y@ÿßohúîýÈÿÊ5þÎýXÿÇü~CÕ¿sÿ'ôÏæýªçþOôÿXÿÓo¨ú6ÿg¿ý þgá]ÕvÍ.7m7èÞC¨úwîÿÿ´ÿýÜþwíÿÿÌÿø
+yüßµÿþoàÿôªþû?1þÇü~3AýïÆÿñ?1ÿÓO¨úwîÿÿôÿýf´þc+ËçFávþO]"ÀÿÉEü»z[¯ëÕ½õ
`
+
øs@w×ÙrÑ7ú[
+ÿ(Cõ¿ý¥)æÿXàkÛ¸#C4F¡èÿÑû»ÍòÙªX˯cHÿOÿÇÐ?ÿ÷þóºÔü)öúWúýs ýû
+Yÿ£[ÿ¤öù^C³ÿñNT´ÜLÐÿ4 Ù×ÿIü<ÄP×¼¸þ¶ÿXÿÓÿCèq®ã륧Xè¿®Õpûú_HÿèÿûMýW4l½ÐÍÿºëÖÅèy`£p»ù_ý1ÿëÄ?¯wÕ@Óo}ùE Ö±W¿±ÐÞdíÝ¢ª»ÂRÃú"ÿöÿaÁ&þ{ÿ/áöõ¿¦ÿúß=Öñßû¿¥óü)ü,Pã?mþϤÿëÿXÂy þBÕ¿ëüÿãã~CÕ¿ëüú, ÿ§ßPõ?mþÏÞø?ò2ñ¡*oKhÞ[¨úwÿëÿY@þ/¿!·ÿ]çÿL¡ÿÃoÈãÿæÿ¼ìÿÇ
+ó¿<k¬ ðªþ§ÍÿÙ«ÿ
õÿ,ò÷ ê'ù?Ìÿ±pÁ«Xÿ+1Á
+UÿÓæÿ{ù?±ÿÆÿÑùMÿ¡{ÿ§ÿjü]ïÿñ°ÿ»ßPõïÜÿ ý³ ÿ§ßPõï|ÿwø¿XÿÓo¨úÔÿÙÿQ"EýÏÂÛ¬CÒE¡êß¹ÿã¿, ýï7äö¿kÿ'üß,Àÿé7äñ×û¿#ÿpú
+UÿÎ÷ÇøØÿÝo&¨ÿÝø?1þÇÂ1¯Ãÿl¤ÜPõï|ÿw¬ÿdý¿¡é_¸÷"ÿ+Ôø;÷býðú
+UÿÎýÐ?ÿõªþû?ÑÿcþO¿¡êÚüýöú
wUÛ5»Ü´Ý {¡êß¹ÿþÐþ÷rûßµÿþ0ÿã7äñ×þOø¿YÿÓo¨úwîÿÄøðúÍõ¿ÿ'ÆÿX8Æ þO?¡êßµÿùx@ÿßoÆéÿcÑTÅZ×ô)çÖÿéüÔúRbü
X`ÀgÆé¿®Ì(?õöú×ÿ"ÿá÷)ôï1£ÛÿÊjÉÇFávë?t Æú,âßÕÛz]¯î/ûøT ÿ;øwwM-my£°Õð2Tÿ÷Çÿ¢4Áø?ÛMv³ÜPôÿ¸ögå³U±(_=Çþÿ¡Ðû÷þóºÔü)öúWRaüì¸ç7dýnýÚÿQý³ð*ýÇ;RÑs3AÿÐ l_ÿ'!æÿyPP×¼¸þ¶ÿXÿÛóÿÅ!ôϸV×ñ5æ }ÅBÿd}ý/¤ÿÿùMýW4l½ÐÍÿºëÖÅèy`£p»ù_ó¿¼$þy½«~{ìËÿ(Âú°âÂo,ô7Y{·¨ê®°ÔÁ°þûùcä`Á&þûõ?sØ×ÿBþ?ê÷XÇ¿þKºÏÿ
+ÿÔøOÿ;éçÿ(ÿ9ÂyàþBÕ¿óüßÿgã~CÕ¿óüßèÿ±üß~CÕÿ´ù¿{ãÿ"Áüªò¶æ½
ªçù¿±þøÿýÜþwÿùY@þ/¿!ÿOÿû²ÿ+Ìÿò àýõªþ§ÍÿÝ«ÿÿ @þ>3Aýï&ÿ7æÿX8ÆàU¬ÿ!ÿ7TýOÿ;îçÿÿãÿèü
¦ÿйÿÓäÿÿÓ=ÔøOëÿìïÿñûÓg¨úwíÿÐ?ðú
+UÿÎýð± ÿ§ßPõ?©ÿ³7þ£Dú
·Y¤C
Õ¿sÿ'ÆY@ûßoÈí×þOø¿YÿÓoÈãÿú?{û¿¨ùX@þg¿¡êZÿg/ÿ{ýyãÊo&¨ÿø?1ÿÏÃ1¯ÂÿýÙ¡êZÿçeÿ?ë?Y@ÿßohúîó"ÿ+Ôø;÷býðú
+UÿÎýÐ?ÿõªþû?ÑÿcþO¿¡êÚüýöú
wUÛ5»Ü´Ý {¡êß¹ÿþÐþ÷rûßµÿþ0ÿã7äñ×þOø¿YÿÓo¨úwîÿÄøp\ùÍõ¿ÿ'ÆÿX8Æ þO?¡êß¹ÿþoÐÿ÷Ñú/ëÂÊõù£ðñþO©õ&!ò²`ÿ|×4EÕ-Mù©hÆc°üò"þ*Fþw²|[.LlQ
+x Mÿ«ZË¿ªES8Çpû/¾Ð(è
MQí }§ÿmS´Z÷Äsë?ºlÿÅÿá!üû¿ùÌHý×m[½ ÿë?xþýftûßnÉïvã?fü7Âøñïêm½®W÷Ö}üEñ?(ñïî"[.L ¬VÃ?ÊPýßÿÒþ.g`¿í¶3ý?®ýÞfùÇlU,ÊåWÏ1¤ÿ'ü1ôÏÖø
+EÿyÝjþ{ý+)áÿ`!þ½¬ÿÑRû? ^E³ÿx'ÃVDÜLÐÿ\ f_ÿ'!ü< ýï7/®ÿðÿõÖD)ôϸV×ñ5æ }ÅBÿueR=ÎaWÿù!öÿcõ¿ßØÔÿwE³ÉÖÝü¯»Îb5Q¸Ýü¯Dù_^ÿ¼ÞòÚ÷ÿ¢þO0þë7úϬ½[TuWXê`Xÿëÿ¤Dþlâ¿_ÿM8}ý/BÓÿGýïëøï×ÿKçû¿$ðÿ±@ÿ´û¿$ýüÏXÿÇBÎì ã/Tý;ßÿãÿ,`üÏo¨úw¾ÿò?³ý_üªÿi÷éÿû?°ð¡*oKhÞ[¨úw¾ÿæÿYÀ;¿!·ÿ]ïÿùÿÕoÈãÿîÿrÙÿUþ?â:Fà1TýO»ÿK¯þÇþ/Lò÷ ê7û¿`þ
c^Åú_Ñn¨úvÿ¸¿ÿüß,ÿDç/4ýîý1üPã?ÿó2ÿ³ðÿó $Ü>CÕ¿;ÿ§<ø?¡àÿôªþû?áÿbþO¿¡êRÿgoÿ7%Ôÿ,¼Í:$]ôªþÝù?÷úW!æX@ûßoÈígþOyðbý7ðú
+
yüRÿgoÿCÿ, þ÷ªþ§õ^¶ÿDbý3èßk&¨ÿ'öÊÿã,cð*üØÿªþ§õ^öÿc)0ÿÇúÿ~CÓ¿ÝfðFáÖþOäewþÏCþëÿXÿÓo¨úwÿúgã¿~CÕ¿sÿ'ÆXÿÓo¨ú6ÿg¿ý þgá]ÕvÍ.7m7èÞC¨úwÿþÐþ÷rûßuþOÌÿ°ù¿!ÿ»öÂÿÅê¿¡êßÿó!ÿ'ÆÿXÿÓo&¨ÿÝäÿÄøÇÀÿé'Tý»ó>äÿDþÐÿ÷Ñú¬,g
Ûù?u ÿ'ñïêm½®W÷Ö}üEjüÿ¿{(ñïî"[.ÚòFÿ`«áe¨þï·ÿ#}õ?|mûwDÆ3ý?z·Yþ1[rùÕséÿñÿúçóþóºÔü)öúWRaþÌÿù
+Yÿ£[ÿ¤öù^C³ÿñN½H¹ ÿ?h ²¯ÿùxÀð¿ß¼¸þ¶ÿXÿÓÿCè
ðZ^GרÐW,ô_WÆêO8}ý/¤ÿôÿýƦþ¿+M¶^èæÝuëbô<°Q¸Ýü¯Ìþ¿ÿuÏKâ×»j é·Ç¾ü¢ë¿XÀüßXè?o²önQÕ]a©aý÷óÿÅØÿøïý¿sØ×ÿBþ?ê÷XÇïÿÎó¦ðÿ±@ÿ´ù?~þ¬ÿc!
+ç 2úUÿ®óbþÿù
+UÿÎó¢ÿÇòú
+UÿÓæÿìÿ#ÿ'ªò¶æ½
ªçù?±þdÜðrûßuþÏúç ù?ü<þ?iþÏËþ¬0ÿËCxÀg¨ú6ÿg¯þOÖÿ³ `ý÷ ê'ù?Ìÿ±pÁ«Xÿ+0É
+UÿÓæÿ{ù?±ÿÆÿÑùMÿ¡{ÿgÿ'Ôø;ßÿã?,`ÿw¿¡êßùþïÐ?èqù
+UÿÎýð± ÿ§ßPõ?©ÿ³7þ£Dú
·YAðþBÕ¿sÿ'ÆY@ûßoÈí×þOø¿YÿÓoÈãÿ®÷Gþ ¿¡êßùþïÿcû¿ûÍõ¿ýß1þÇÂ1¯Ãÿl¤ÜPõï|ÿw¬ÿdý¿¡é_¸÷"ÿ+Ôø»ö&XÿÇü~CÕ¿óüÐ?ÿõªþû?ÑÿcþO¿¡êÚüýöú
wUÛ5»Ü´Ý {¡êß¹ÿþÐþ÷rûßµÿþ0ÿã7äñ×þOø¿YüýªçþOÿ± ÿ§ßLPÿ»Éÿñ?1ÿÓO¨úwîÿÿôÿýf´þíR~a>Þÿ)µþu ÿ'ñïêm½®W÷Ö}üEÆ?øwwM-my£°Õð2Tÿ·ÿåÞÿ`þþFþ×î`6þ½¿Û,ÿE¹üê9ô>þgôÇÐ?èqû
+EÿyÝjþ{ý+äbú÷²þG·þIí
+ôÏÁ«höïÄ1J#f&èÿìëÿÄ, þ@ýï7/®ÿí#Öÿ\ÖÿqBÿ,×ò:ºÆ¾b£ÿ»¢Ùdë
®þë®[£çÄíæTdò¿cþÇ=/^甆}û/b¬ÿ`í?¿±ÐÞdíÝ¢ª»ÂRÃú¿,ÿ¥±ÿ6ñßûÿç°¯ÿEhÚÿ¨ÿÝcÿýßmÎa)øX ÆÚüÉeû_ÄXÿÃBÎd ôªþÝåÿý1þÇw~CÕ¿»üÿ¯Bÿäÿóªþ§Íÿ×ÿÇú_&>Tåm Í{Uÿîòÿíõ¯B¬ÿeABù^Cnÿ;Ëÿ'ùÿôÏÖÿû
+yüÒüýÿXaþðÏPõ?mþ¿^ýH¬ÿeAÀúë5Ôÿçÿý1ÿÇÂ1¯býÀl$7TýOÿ/¾Ô¿ð³`ü?¿ÐôoÐ(ÜÚÿ©àÿäwû??ø?1þÃ
ööªþû?¡Ðãòªþû?áÿbþO¿¡êRÿgoüGõ?o³.àý
ªçþOÿ²ö¿ßÛÿýØÿø?ý<þïlÿçÿ3BþÿËo¨úw·ÿóÿã,`ÿg¿ þwãÿÄøÇ¼
+ÿ'öcªwû??ø?±þôÿý¦áÞÿü¯,PãïÜÿõ,Àÿé7Tý;÷Bÿ, Çå7Tý;÷¢ÿÇü~CÕÿ´ù?ûíÿõ?襁kv¹i»A÷BÕ¿sÿ'ü, ýï7äö¿ëüð°ù¿!ÿ»öÂÿÍü~CÕ¿sÿ'ÆÿXÿÓo&¨ÿÝø?1þÇÂ1ðú UÿÎýð³þ¿ßÓ}{kùçÖÿåþßaüÿ<̾uÛcÆé¿Õ5ÿr±ÉÛúw]ë·Ù§²ZVðþ{óÀø?ÿóÑíÿÔjÉÇFáã×(SÿÀú,âßÕÛz]¯î/ûøÔìÿø»ÿî®)²å¢-oÖ£CõÿùøÚûS´ÿYfÜn¢;3´F¸¡èÿqíÏ6Ë?f«bQ.¿z!ý·ÿþãúç}¿¡è?¯AÍb¯%öÿcAAÿ^CÖÿèÖ?©ýaÿO^C³ÿñNTôÜLÐÿ4 Û×ÿYý3Bq^óâúØþ?býïeýÇ!ôϸV×ñ5J_±Ð]=@öõ¿æÿYÀøßØÔÿwE³ÉÖÝü¯»n]6
+·ÿUÿåà%ñÏë]5ÐôÛc_þGQý¿XÀ«ßXè?o²önQÕ]a©aý_ÿRbÿOlâ¿_ÿC8}ý/DüÏ,XÇ¿þK:Ìÿ}Ð
+ÿÔøOÿ;¹lÿù¿XÂyàþBÕ¿»üßjÿó<`üÏo¨úwÿûàÿÐÿcù¿ýªÿió÷ÆÿEù?>Tåm Í{Uÿîòïõ¯ è å{
+¹ýï,ÿ÷Þÿ+±ÿÈÿå7äñÿIó_öÿc
ù_¼¿^CÕÿ´ù¿{õ¢°þ@þ>3Aý?qþï}ý/Ìÿ±pÁ«Xÿ;ÃnÜPõ?mþïøRÿRÂÿÍñÿ@tþBÓèÞÿ©àÿäÿiýã?J`ü%áþôªþû?¡àÿôªþû?áÿbþO¿¡êRÿgoüGõ?o³I=ªçþOÿ²ö¿ßÛÿýþoàÿôòøÿ¤þÏÞþ/*Fþàþôªþ§õöò¿'
+ã,Àqå7Ôÿnüÿcá×áÿD6Rn¨úÖÿyÙÿ¥ÄúOÐÿ÷þ
{ÿ'ò¿²@¿sÿ'Öÿ± ÿ§ßPõïÜÿ ý³ù_¿¡êß¹ÿý?àÿôªþ§ÍÿÙoÿ§¨ÿYxWµ]³ËMÛ
+º÷ªþû?áÿ`í¿!·ÿ]çÿÿÌÿø
+yüßµÿþoàÿôªþû?1þÇü~3AýïÆÿñ?1ÿÓO¨úwîÿÿôÿýfXÿU½,¬ì=Âü"UÆÿ
+ÿ§{FÆ¿®Ì0/ñöåÃÿÏZ\~3RÿævIO°.ÿe¨dò«øënÀà`ÿÿþJÌÿ³~ ±Ò¿îôgZ.¶ÀþEtÿQùßX0!]Ü] ÓP¦2É«ýC²mðpÿ¶nrUé?˪+u}*ö¯i"«umÖ+ääMêî®h¢ù±Òÿ¦ØÕmm{ý¤×þiÿWßK4ø¥ØüVwÙúMp@$ijáÁÇNòsSÇg"æ35?åC[,*ú§üwå§/o¢Q*Mðä)ïªìòIó$'½wùSVÕÕ&ÄììDÇw9{Rýw¹-×ÅÃç"yê]¾<éò³|¨`:³vâËoÎN?Ë/ºüxú»§ÌÂÓ§¼-îþì ú)a|ÿiÊ®¸ÉòçO;ýF?ëOùlU´Od$ÅY³íö⣩<ôú;ýëÎÏbdÿf¾òésäÙÅð÷ß/>TíùsþqªwU^\|ëó§<~éß6ÛgÞåý:»9(Vç?Ýû_|/Åü*ga|ÿ¡jOz|/¥«Ó§üm·:üºý£'2yâèû]³}<úõoUþ·yV-v_.÷ÅÖ|¡Ás÷ÿ.ýQýßxøöW øXéYj±èÛòöãÿºåý_Y( ¼ÆvüwÐìõCúïû¿Dõ<cð*ü_··(©ÿmݶåp¦§±¯ÿuÇíPýûÍHýßeñzÓÎa¯ÿ0Áú/ ¿±ÐU7l½Øºyn©×Øë_§Aÿ@ÿ~óþóuÖ¶/s|cnçÿb¥àÿãàÙø/7åT×}üc"ÿ3_¹ä°dâXÿÁÂPüsÝòkËv¡¿}MøuÁpûï"þºÿÂÿËÂPüoʺ]|*ªeÝÏ1q9ÿ¯Áøoõ:x
Wå? à%#õß´Ï%wÁpùô×ÿ ÿÏüAýþ2¨ÿ:k*ÛPÿ~7FÿéEû?MôÏBø÷_åL¢ ðqúY`XÿÑeÿ/ÿ
CÌ øÌþ·M½ÜåÝb·+ÔsØÿÚÿóÿ,êÿ-³îÍ¿ã?ê2ÿOaü
0úÿE!zÉØñÿ´ ËqÑþ¡Àø/P½ßmÿñéÿàÿVhÿ± ýûÍØú_ÿ¿è]¶"Pÿ«ã?,@ÿ~3nü÷%îÿGFÿaa(þzËìEß|(þ"½ôÿ¥Àþ,è0¿¹ùTqéûÍÞðæfùehèM{òmõú÷¢ù÷åªó8|³ýÔ¼iN7ÕaNQ?Øüoòcy'~ yjç0¶ÿÇçÿ<¬ÿÃúâ¿+>uÆßsâ//ûÿ"Øÿ_þßÛÿëÝïÿ*/[þ¿Ä6<ÿöæCìÿÀ££a¨Ñ7Æÿu÷[wú?[ÿüèÿ± 4ï3ãÆÿ^2úOÿSääê÷ñþúÐáö¿ìÿÿgë?ýfìú, 'è_&èÿ³ ýûÍàøza#q»ü/úNü/ÿïÙÇbgøûBÿOFÿažßé_?ðÒô?ü?&% ôÏ Ú øÃÿ¬Ý @
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s2ca2c.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s2ca2c.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s2ca2c.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,38 +1,38 @@
-System(15GB HP=0*2048kB Dell Inc. 0NR282)
- Socket#0
- L2Cache(4096KB)
- L1Cache(32KB)
- Core#0
- P#0
- L1Cache(32KB)
- Core#1
- P#4
- L2Cache(4096KB)
- L1Cache(32KB)
- Core#2
- P#2
- L1Cache(32KB)
- Core#3
- P#6
- Socket#1
- L2Cache(4096KB)
- L1Cache(32KB)
- Core#0
- P#1
- L1Cache(32KB)
- Core#1
- P#5
- L2Cache(4096KB)
- L1Cache(32KB)
- Core#2
- P#3
- L1Cache(32KB)
- Core#3
- P#7
-depth 0: 1 System (type #0)
+Machine (phys=0 local=16468292KB total=16468292KB Dell Inc. 0NR282)
+ Socket #0 (phys=0)
+ L2Cache #0 (4096KB)
+ L1Cache #0 (32KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ L1Cache #1 (32KB)
+ Core #1 (phys=1)
+ PU #1 (phys=4)
+ L2Cache #1 (4096KB)
+ L1Cache #2 (32KB)
+ Core #2 (phys=2)
+ PU #2 (phys=2)
+ L1Cache #3 (32KB)
+ Core #3 (phys=3)
+ PU #3 (phys=6)
+ Socket #1 (phys=1)
+ L2Cache #2 (4096KB)
+ L1Cache #4 (32KB)
+ Core #4 (phys=0)
+ PU #4 (phys=1)
+ L1Cache #5 (32KB)
+ Core #5 (phys=1)
+ PU #5 (phys=5)
+ L2Cache #3 (4096KB)
+ L1Cache #6 (32KB)
+ Core #6 (phys=2)
+ PU #6 (phys=3)
+ L1Cache #7 (32KB)
+ Core #7 (phys=3)
+ PU #7 (phys=7)
+depth 0: 1 Machine (type #1)
depth 1: 2 Sockets (type #3)
depth 2: 4 Caches (type #4)
depth 3: 8 Caches (type #4)
depth 4: 8 Cores (type #5)
- depth 5: 8 Procs (type #6)
+ depth 5: 8 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s4c-heterogeneous.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s4c-heterogeneous.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-2s4c-heterogeneous.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,34 +1,34 @@
-System(15GB HP=0*2048kB Dell Inc. 0NR282)
- Socket#0
- L1Cache(32KB)
- Core#0
- P#0
- L2Cache(4096KB)
- Core#2
- P#2
- L1Cache(32KB)
- Core#3
- P#6
- L1Cache(32KB)
- Core#1
- P#4
- Socket#1
- L2Cache(4096KB)
- Core#0
- P#1
- Core#1
- P#5
- L2Cache(4096KB)
- L1Cache(32KB)
- Core#2
- P#3
- L1Cache(32KB)
- Core#3
- P#7
-depth 0: 1 System (type #0)
+Machine (phys=0 local=16468292KB total=16468292KB Dell Inc. 0NR282)
+ Socket #0 (phys=0)
+ L1Cache #0 (32KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ L2Cache #0 (4096KB)
+ Core #1 (phys=2)
+ PU #1 (phys=2)
+ L1Cache #1 (32KB)
+ Core #2 (phys=3)
+ PU #2 (phys=6)
+ L1Cache #2 (32KB)
+ Core #3 (phys=1)
+ PU #3 (phys=4)
+ Socket #1 (phys=1)
+ L2Cache #1 (4096KB)
+ Core #4 (phys=0)
+ PU #4 (phys=1)
+ Core #5 (phys=1)
+ PU #5 (phys=5)
+ L2Cache #2 (4096KB)
+ L1Cache #3 (32KB)
+ Core #6 (phys=2)
+ PU #6 (phys=3)
+ L1Cache #4 (32KB)
+ Core #7 (phys=3)
+ PU #7 (phys=7)
+depth 0: 1 Machine (type #1)
depth 1: 2 Sockets (type #3)
depth 2: 3 Caches (type #4)
depth 3: 5 Caches (type #4)
depth 4: 8 Cores (type #5)
- depth 5: 8 Procs (type #6)
+ depth 5: 8 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-4c2t.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-4c2t.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-4c2t.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,181 +1,206 @@
- ¨
-J ì]moÛ¸¯7¿À~ôòU²ÅbS7mI¦Ù&ÁâÞCéX¨-éJröÇ/)Çyü"1g'<Ѩ)RÒáÃCòR¹ðxqHâ iñ·ú Vð
ÐGâ\þ&Ç{ü@ÅT`Ì ûêaï$z¹
-ydýpu\Ï£xG:å6nÈ.Ïå?ÏÓ0zsStZ°·÷&ùûP%ìa.aDÉ3@¸Ó»ØÇåøw-·ÿóðß1~:9G£$K,(¢$Fÿ½ÂoçA1CGY8
-ËL¢¿}FW¨HÐñÅ :O²â =BåGÞàuäXúKë±ì1©ØõÝ] KÎâd\G2W·¢/¿
-">¢¿2©¿2¦ýxE »ûëÓ¬ÿUñ5iõ
xRÍ\Ý%¼o^*ñ+ê±Þc¬Wõc}{xÿFÎþçËÉèó¾Û7èì. þÞ/ùáyIÌÑ/'#ô£:}x>:9>Uozðõ ^ðð1vX
-czìdsúï1È(qÔ.$Í.¼ª]H]Ö.dÍ.Ô.ä[ijÚè¸LÕX1Ïîò(æè4¸YIk9æHj9zÔåà7»°*ÙPò¤*ÙPò¤*ÙPòDÖ.l&y2]¸Qòõ*3¬\8mør(~!ÙÛDo®A<A§Qüí¾|×Q®Òå«Á%°¥/ɲâë²§Q9¤!µBúyj9ÌHyªãíѹjË»Èi¡®,ÏeV)pq§nzÎ8¸RËÏÚÿÇóÏåëºÕáEl¤è"îߺ(b
}9ºØQÈF:ï)är¦Ä]ÌåÖlſש>¤ ã[.WgÖ»yyózvãë(µôE³#ýÆ÷¼#ýÆW¶#ýÆoGú
-mGúêjGúZjkú`óû?}"}½x¾~<a"ú·jClÈD-2ÚWËaãS?ä@Ñq5ZÉâj×øô-'Q²½I
-;WOzéõTøâøú]WQ~Å÷$û¦sÖí®JÒ¬þÒË{æë{kV+Ö±zìîìUÕÄ~íª"ÛÒÁÝ«åкÞTC>
-^Ö_SÃîMPí©w<G©V¼GGèäýñöZ9ÝÜr¹8{§tÈækÿ¡¯ÝØR®¥ÛïàÉ¡2ÿfIØù$`³ù?âaLGU:ÂG`þÏ6É?LQ<M:+c÷üaLòW£$=æ+ùU`þÏ´Àe'Ù_ÞªÑÙ'I6&ê×G«j Ëð@U 4
-ÑüNÅxd"çQÿ¥÷ÿGq°ÚÏ¿üο>i^ÿi«}3d?ý~ ºÆiª[:«²³O¿ë|ª2ÆaÎ$Ê£ßuî2¤èçwéz XÞ(9È£+%ºë\'9Õ§Wåé,õ Å4
-W1Ä;â¨ô`ru²<7M:öNæú¿cyÊT·þ÷ç41&h.oÔëôäà{ú|¨òÕuºYH¥âPKTä!ZäJJå
·²DË-LÅ\ë
äF%+ôeÌCá|:_æ34)Ôx'L#´XÜ¢éÊ*WÙªTýA³^©3w¹z#J·(S×)/ԣǪzÇÅXßF =ãTfÓ
Rg©¼ÊÑÊ;éø:I&(Uz)I&ù8Lçê9nÌuº0u[êönT%Q·¬Nñ1Y´fLC5¸³éXM«ä:YD©~ûbàyoþÁú¹îEêñÇÁ<ºõètu2LÔò2Y)<Tß.GkÑÿø`uæ&Êe0?H者xå¾=8xZ¹Ék«Üd{ål¨Ü¨Ü½VnñÆÿã*7}mnÜ×+·:ûÕVnöÚ*7Û^¹éÊM¡r¿ÞÊÍ_[åÞÑçö7tK|¨Ü}WîáV¹Åk«Ü;úÜÃ
-{ûõ¶ÜÞk«Ü;úÜdC·@å~½Ûm{Gm¨Ü*÷ëªÜögÖÿØdÿYÈ
Eûú¯_õÿS°ÿØÀ\\&E0»j &õ)úöî@Å|Ȥ|»n°9õ(èwËéT½í9ôtÌHówòÁÊk.¾i5asÑÍc1ê|á1'qð,tÛÛ&XPÊÊyrÛ:{eÌ{Õ8Ü=)\Ç®îú·,*äU~{»º·8ÏU#òð¬û¬¼æ,HÓgÏB¿zoóàêY1ÌWTÆ|á<ÁÕ|u2Zsñ5ÎVqëû|U.ýR_ðx|õv~ùp1þªÛôunwý.YÆ¡|þ¨«'½\¤Ï¯%ETFêÏÛ²|³)äd|tQ^3Ä÷öëBi$¼6ß}6`ÿ$òk~ÿ¨7+ÝÇfËøÛýeÜz¦#?-¯eùÆÇOä~"ܧ§¿ä7
-§/YúìtªO+E²:I1_×
-J¦|]üû§¡gå{Áêù£Û
-6µÿªNuº hwûOïUíÿûÚнbD(!êàHðá@5XÀÌ#Èó:¥"J©ñjn«¾ê!«ÖËCÜÇñ}¤dȺ®SÅ-ªR©|¯ù:/ÊJ at t@ÖÉ(bPªeSÅ«tª×'9E¤Ç}J|õ«,ÊR}:Hß"C׸&(
âêVð Lå«+8+3Y§ZèæHVw¦z ò4Õ)Tò¾8>bT=Ê`>\'UÕCÕh²ÕÕ}H?B*L«Á<ÔiCOÝ¥. á}Á7ð,1[ÿ @ @ @ @ @0
-zê¡¿! ê´÷ð=ªC¼ÒMpÚScõ2ì*â ,nºvpUD©®¤)÷ØÚi_æNqù;gË8ÖûßWó$ü&'*»ªÿOÅÿ+¿Ë»ß¼Ùþ?Ø£Ä÷¥zÿÎaÿ+Ø ÿÕæ\Ööò×~ Ø!ÿ¼Ü7´jÐJþöÿôTSò·ýòÓåë@Ãýßøÿúü üµG¬y%h%¥ø±¾ ù[AùIZîiܺ"´¿ÒÿJPò·ù³Lñz©íÞ2´ùöõXéþü¹ïû°þÃÖ2øé%ÿáü¬r&ü_/¼§Aø-¸ãh²³}üÇVø/<Lÿ6@¹NÃÿz}öügÖÿÛþ;
-cþ7îýõÿ9ìÿnôÿ§ShEþ¤è`ü?GùÎý"öë^á¿ìÿ`ô'¸ë0^¬ÿ÷²ßÿBü·|èÿFþ'±â4(C3|Çþñ¿¶ÿÊaþß
-`þÏm´à¹åí\¶÷Ðoäÿ}R¶ðÿ°ùëí%kQ
-Éÿiÿúü?À\þÍÊØÛÿgµùÁè8 >¡_.OÑÙoG'ß²º§8à5ÂÿË<¸n6ØËBªüWà¿
-xC½e à GaÎÿ¹úw
-Êh?ÿÇ© ýoÄMï2Ìù¯W"6+c¿þ¯ò à¿0NtÈ}æ1h9ÿõg¾±_ÿ3ÿÿAí9ÿˬ5*£}ÿédÀ úÿ.Ãÿ¤_û§×ÿý§Ë¿KûOmþW0hÿ`ý#0çö,êöðÿ²ê°ý8sþwiÿ©Îÿp
-ã?;`° Ôió¿KûOuüÇõV@Pmh\
9ÿ{¶ÿÀþ/V0Þ¿Ó0çöúøÖÙÁ` r¦ü§}¯ÿõ_V`.ÿ×ÿÀþ_V°ÅþCA)¸sþwiÿñjý?
-ã?+ðó` waÎÿ×ÿþ·BÀ~aÎÿ.í?uÿ/ÿ±Æ¸MÀ
9ÿ{¶ÿþ·~9ÿû]ÿúßÔ+Àaò÷½þÇû
-Ë¿Cûõ+û¿Âúo[=yzF¿£óϧ§Hÿà
-Ìùߥý§fÿõ ðß
- ÷ç6Ìùߥý§ÊN9ìÿhÀ·aÎÿí?uýë,øï6Ìùßýg5þ§0ÿk#h 9ÿ;´ÿý×ýoùÐóéP@;à"ÚñÉõõý§§ü'ýÇ
-äĹâIãÐ^þ©.!Èß^"ÿ<X¤ú°ãLuv¡¼ûûÕõÿ; úõêwñ¼n·±¿ÿ_õÿö|óÿV@îE Mèÿ[ɳþ¯¦ÿ}ûÿYò;ð?ºLcz<Oɶ2ö÷ÿ«ö?û ÿ ¸ï6^Âÿe:.fÌgÉ|+÷5öó¿:ÿ/`ÿoK@à4^ÂÿÒ7r|;¸a ÿ)Øÿí èï6øA9ê_·c}bo{ù_Ûÿû°þÛèPﵫxÿ Ws9¾Nnd'Ûø±wþWùïþ?V°îÌ¡òùÒ (Ù4ÉÔIõh^9ø¯ý ãi¢'üëÿvßÿà¾ý¡úß]ð?NeXÈÉXhÄýö¿úú?
-ý+½_Ýÿ3©þ6§¿ ÿ ýoÀ·ññÿzÔ¿·ýóUÿ?îû ÿ`=þfÀMt2ÿ§O/eFr#Cöé«ü÷urà¿ÜÏÿ#uôÊ£?dåÑÓ?ÕQÜdz!/Ô#åÐ>áPÇGË£Oåq5¯ ÿÏñû_ù¿Öö?ðÿµÿs/à.<r§ë_ýü¯úÿs¾ÿbÿ±óe&Y!'ÿ sxÿÃeÖýAÿß
-@ÿ»ðE7v ÚÏÿê÷¿9§°þÇ
-0ï%{xÿOÿßÖþ?°ÿ·ÿ¯ÛhÁÿb&³E0×kþ¢Ëö*÷ÿäÀþO6ðùÉ2.ÑÎÿý?°ÿÚ´ün£Mÿ/gÍý'hÖþcbxëý ¡ÐþÛ@kùGñDÞÒVÕ ½þ§s¿
-Ê?~o¸û{ý/ªý?úߨð~.»0å:»Ë£Pgä8
-²"*¢d3}Ú÷ÿ}ÂÀÿÛ
-ßiò¿¸K»Óÿ¤6ÿ£ÒÿmàkM# îß®Âÿsy#ç
-Ëh¯ÿ£àÿaï4Lù&3éï¿® ;§öó¿úý72ðÿ°Cà2çÿfA¶Z®|·p?ÿy
ÿy°ÿ£Ð`¸Ë0åÿ÷à.'ÓqçIEt۾߾ÿïyøo`¿Óè@ÿ/twûøOjóþ·µ~zÉ8"þ¬0å¼\\ÉL÷ ô2ÐÝeôÿ)Øÿì@tfüÇýûÿÊ¿[ÿ¯jûÏ ÿg ûË0åßþ_ðý; ÿ/·aÊÿNý¿6ùÿà}PиSþ÷îÿë?¬ ô¿Û0åïþ_àÿiàÿå6çÿúöÿõV þ_nÃÿ½ûÿ ü¿ÜFú¿ÿ/࿬e þ_nÂÿÝúUÇÿÂþ¿v ã·aÆÖ¿ÿ ÿ/0·þ_^Ýþó¿V0 Cð s¦üï}ÿ/°ÿZØÝ)ÿ{ßÿÆV û¹
-Sþ÷îÿó¿VÀùNÃÿ½ûÿ·Àü¯Û0ÿëÙÿËï¿[>ô¡p¦üïÖÿ«¦ÿõøoÜ?Fú¿ÿ/Ðÿv°Áü¿¦ShDþ¤0å·þ_Õõß2øþ³hû?×]ñôïÿÅÀÿËLåß÷þ_Ðÿ³ØÿËmò¿wÿ/à¿ÿÛ0å·þ_5ýO1ðß
-Nâ¼È¡n»¡%p¦üïÝÿæ¬ ô¿Û0åïþ_àÿiàÿå6çÿúÞÿÖXìÿå6Lùßûþ_À+ õï6:Ðÿýìÿü·µ`ÿ/7aÊÿÞ¿ÿóÿV@(ì ê2ó¶rùzÍðæþ_*ªü¿¬
ü$MæÉõ]ëÐ^þÄ'>ÈßLä_Ì2LÆyt¥^ØõþÒ®ÿ¯åÏ}ÖYôÿÝ ÿ|ÿÒ ü\Ëq4ÙYÆþþ?ð_ìÿV ö·aÂÿ0Éörþ)ÚóÁ÷¿,¹
-cþ7îýõÿ¹ý_ þ?¬ÿþÓ¢ñÿ^ ýúWøïaøþÿÛx±þßïþgÀ!0ìÿh°ÿÛhÁÿ$Ö®þeh{Æÿrèÿ[Ìÿ¹üW¢É\¶÷ÐßoÿÅÅ>)Û J¸þþØûüÕ+d/À5ÿÓöz>øX¹ü'2±·ÿÏjóÿ¾ÿ`G£óôáÃ'tòËåñ):ûíèäá[¡_àÌù¿Ìëf£½ü'¤Êÿ¯xC"£0çÿ\ýÃmkþ¢ýü§ô¿4½Ë0ç-Nî×ÿUþ3ü·Æù o)´.ÂÿqÐÿíÿãÁ 9ÿÓä»ÌѾÿÏ|°ÿÙÅ ÷])ÿÛ|ÂÈþCÀþcæòïÒþSÿÚ+Øbÿ¥àÌùß¡ýçÙ÷¿îí?°þÛ
-ï ົ0çöêüÿOK`° Ôió¿KûOuüÇõV@'8/pWaÎÿí?°ÿúNÃÿ]Úêãã+ @.Ãÿm¶5²ÿP°ÿعü{^ÿûYÁûx:sþwiÿñêöÿY/@Ü
9ÿ{^ÿúß
-àûnÃÿ]Úêþ_0ÿcr«
9ÿ{¶ÿþ·ø8
-sþ÷¼þô¿¨W
-Ã0å?îÛþÁþcæòïÐþCýzÿö·Ñù×÷§ÇhôùË1:ÿ|zôOP ®Àÿ]Újö_ÃþV ½?·aÎÿ.í?UþsÊaÿG+ þ»
-sþwhÿ©ëXÿc À·aÎÿí?°þ×
-FÐ 8
-sþwhÿ!5þû ÿíÓ!z>Â. N¢ÿ§üWû2Jûïï±ÿPLÖÔ×ߪKèî·Çùßæû3-ù¸eIQ´øX{ûã¾ÿe/,ã=~-a0ÿÇ=ÿ·èþ»6ú?g_lûýÇòû¯ê´ÿ6ÐZþQ<·mVùÿPÕ]ù[©üóè÷ÆÞ¯ÿkûÐÿv@
÷3tÜ
)ÿÓÙ]
j4 ¿ ?N¬(ÙLöýÀú;í¿Ü)ÿ»´;ý_ßÿøàÿc_ãhÉ ´Âÿsy#ç
-Ëø?öÞµ¹m$K×Ýõ+1_ì>¶¸©qIr¢$[ÛéÙ§NA ÇÁ@Ùª_¿3AR&AQ 5íÉ÷î¢&.DâÍkåB{ûï¨ úç Ë?ͪÿ(½3ÿ» <9P¯ÿªÿßW= èo~7òüßMÅãúB5 ùÓ^ÀzýW×{ø?ä
-ÁPõÿ5¼ÏGédæy%aÜ%žµ@íûÿ¾ï@ÿ, ûÙt`ÿoÃùÓç¨Ó¿Øÿóì?ë:xqÈ?\"~T¨ú-n¯âL÷ ò¸¨Ñ¡ÿ/áÿãÁ4þÛd"ÆyÿâZÿÝÆíäÿCÿ G"üËd¨úï=þúgñ_fCÕ§ñ_ÄÐ?'a¢ 0ªþ{ÿÂú`ÿͪÿ¾ã¿$â?Y@üÙçÿúÿÂúÿe6Tý÷ÿý³ø/³éÀþ÷ÿý³°®Ä UÿÝÆUÇÿXÿÅÆÿfCÓ¿Ówücãý,Pë¿Ûø/7þó¿,Ä`CÕïñ_ðÿ² ÿ¯ÙPõß{þ/ÿX@þ/³¡ê¿ïø/ù_(ßh¨úï=ÿâ¿YÀü¯Ùçÿúÿr ì ¡ê¿Ûø¯ûï;ÈÿÁ@ø§Ñt`ÿûÿýga]ÅM&hD~P¨úï6þ«ºþÛÒþ9Ðþ×\húýçÿÂû?Y Öïù¿Ðÿcù¿ÌªÿÞã¿ ÿe6Týwÿµkÿè
³Y^dH·Ýh ªÿÞóaþس¡ê¿÷ø/IJø/³!Ïÿõÿ
õ, ÿÙPõß{þ/è³éÀþ÷ÿý³°®äÿ2ªþ{ÿ#æÿY@M¦±þ½V!_[h
7ÿJÿªEÿÅAú/Òy:M¯ï[?íë_ºý
Gý÷¥þ,Ç£<¹R7ìºþ¦´ëÿëúw ùXè¤ÿ/Bþ£BÑÿCìß<¾×ñ(?yúþ¿¬èßóädþ³¡è?J³ZÍoÒ^ÿtáÿgú7²þ÷þIý×Cüôÿ±þû¥ñm P½ýw+ú÷mäãA¼ð ]9Øþ×ÿôïyþ?ÿÍlZè?éPÂ9´ÂýVã!]ôÿYÀøßlZè_ý'Oãöq Záõþ_Ûv ÊvB
-7ÿBý«VÄmÞ ×¬þ7Ûé£þy ×ÿ8Σfç¨íÿ;;óÿâÿyxs|yf½}ûuöîÓé¹uñ7g,ûc£_`tý/òðºÙh VÿBTõäfÁñÀó1 `(týOÕgѾ5´ÿs¥ûÏðaéM®ÿ"¹m8Xoÿ«úw<èǨ».@¡ëv¦ÿü?ÿsr@
-]ÿóôk5:Gûþ¿ÀÿÇ´Ñÿ7ªþÛ¼äÿñàÿá^ÿ]úvæ=¼ÿ=þC ë¿CÿÏÖû¿Vþ¬ÿfAx@]ÿ]úªó?.â?pºÁhèúïÐÿcðÿü71täp0D`*tý÷ëÿÈÿÂÂ1ܾFC×þÝñ¿ñ?ÂÈd¨ú}ûðþoèõßóúäÿbaÿGÂ(]ÿ]úü]ÿÆ,xràAëæB×Ïë`ÿYÀû?Ì®ÿ.×ÿìÆaþ7ðêþ# ¡ÐõßóúØÿa4tý÷¼þö££¡êßîÛÿãÂÿýþ;ôÿÈÝø?äçáøòóÙÉù©uüþéuùþüÜÒÂ$]ÿ]úvü¿@ü/èý
-]ÿ]úªúw¥ü,@ÿfC×ëvã¿\¼ÿ
èßlèúïyýÖÿ²pÀhèúïÐÿ#vôÀþóàÊ¡;ô9D´Óÿ$ÿÙ×û¶Þÿæ øX Ô:Ç·álÜøAh_ÿcÔ?ÔÞÎõ;`Gê<q]ÁO¿ÿ±ºþ÷ÿÁÔ·¦ßX:Óÿè6ü¶çõýÿjü·ØÿgA¬ª Mt¨ÿ½â©ÿÛ±ÿù?Äo4è?¹¥Y<©Ò£i÷£¾ÿ_õÿùn ûÏ´o6è17YߤӽÚ×Ôë¿:ÿï!ÿ74 FsþK`ÞÅ£«$|Bû/%ôÏäo6ýçQXúoÃo#½¡öµúUÿ`ý7r(Ì ËúïÂd^MãÑuzg³t>jçÿܪþU÷ñ?,¬;sVùûæa[ó8¤Ú¨þvá8ýë8ÀÙ$ÕþÍíÿÓþ¿]ûï"ÿ#Âú°ÿæBÐ8ÄQGjC#EÔûÿv×ÿIôÿY@دÙôÅzéosùSôo°ÿ,@ÿfsÀø=ê¯=Gýü_5þÏ
-ØÖã4fÒÉüÞ¼gQ?ª:û/ܪþ×Eþ/Vóÿú
ôËÏ`è¾þS}z«ï¡[~J_Bô§½òsàËò3Ãòs9¯ ÄqñÿµÿkëÿÃú0ÿg6è?|ÇOþÔë¿ÿïxÿÿ¾åù<Íxüw´Æqþ£EÖÿùyý7ô?λFêõ_}ÿ·þcýa4O^®jyÿÓ&þ·ý÷ÿÄÿMý7qvNõ¿´(¦qù\ÿüOýsHýGébV48!þÃ
-Ðþ³ßlÚôÿÂè¦y£¿A³ößö¥ßµuþG!ÿ
ÖõÌÆñ7Ùê1hoÿ¥c;¨¨õ'5ÌþÞÄþWçûÏôüßÑ0ªþç7÷y©ÑÒL<YIú¸|Ú÷ÿõß<ßh¨ú/îçÝÙÿù_eÿáÿaáó,$1¿M
ªÿi|O£½ýwü,H(ßh¨úÒ8Óï] ¨×5ÿ£/äcÁwÑ yþï&ÌkÀU?í¬×¿[ÍÿêøXÿÁxà&CÕÿ×ð>¥QçiErûÞß¾ÿïûôÏ ê7ìÿm8úuú;óýça]/ùÄ,Â
-Uÿ³ÅíUé^úô9ý ÿvM¦»ÿø/Äÿ±@ÿn㿪í¿þDøÉPõßwüòÿðø/³¡ê¿Óø¯Çâ¿¡NÂ"D`.Tý÷ÿ
õ,Àþ
-Uÿ½Ç!þÄ
-yþ¯ïø/¬ÿ`ñ_fCÕïñ_Ð?ÿ2ì?ñ_Ð?ë:@üPõßmüWuüïIõ_,`üo64ý;ýǹÿâZÿÝÆUßÿâ ó¿,Ä`CÕïù¿àÿeþ_³¡ê¿÷ü_ÿ±ü_fCÕïñ_ÿeÁòªÿÞã¿ÿÍæÍ<ÿ×wüW ýs`¿Ð UÿÝÆíØý èáCþ&Óýï'þö
uÿ5 ùA¡ê¿Ûø¯êúoO:úç@ûÿ!^s¡é_ôÿ%ÿŵþ{Ïÿ
þÈÿe6Tý÷ÿúgñ_fCÕ·ñ_»ö?þY8åE¶tÛÀ@¨úï=þó?,Àþ
-Uÿ½Ç!þÄ
-yþ¯ïø/¬ÿ`ù¿ÌªÿÞóAÿ,ÀüMö¿ø/è
u ÿPõß÷ûáÿãAHd 5fúOgzzVúw¥Ûÿ¬ÿ2Æö¿]Ê¿-´ÂÇÚZÿª½@ü'-ê¿Hçé4½¾oý ´«ÝÿÄûY ÔqÅáx'Wê]×ßöã7@þG:ÿ0øQ¡èÿ!öwF_Âëx<G}ÿ¿:ÿïyÈÿÆâÌ¢ÿ(Íj5¿I{ý;ÈÿÄò¿
-Yÿ{ÿ¤þ¿ë!þ
NúÿÈÿðÃÒÁø¿6 °ÞþWý¾í ÿÎÌÿÌÁö¿>üâÿ÷ÞÿÀüfÓBÿä p¿ñø_ûÿt1ÿÏæÿ̦
þÕñ4n ^ïÿµ}i¢l'¤põü?ü¿ýC¨uøM8H³úßÊÿå£þy ×ÿ8Σfç¨íÿ;;óÿâyxs|yf½}ûuöîÓé¹uñ7g,ûc£_`tý/òðºÙh Vÿj°_Ñ ÿÏ|ÛA ¡Ðõ?UÿEûÖünÒ~þÏ.ì?Â¥7ºþä¶ád`½ýßÉÿçAÿ<8®ð½êÊÆL Ðõ?;ÓÿNþ/ÿ¹8F ÑÐõ?O¿ÆY£s´ïÿ;ø?¤þ¿ÉPõßæ
-0$ÿÿôúïÒÿ³3ÿëI´ÿ,ìñÿÀ(]ÿúl×ÿý³¸`±
]ÿ]úªó?®Äø©®ÿ.ý?»ýñ,8¾ôT Ià
-
®ÿý?ÈÿÂÂ1ܾFC×þo×ÿõ_, ¡ê_öíÿAþWèõßóúäÿbaÿGÂ(]ÿ]ú]ÿôÏ#|ÕÙØM
®ÿ×ÿ@ÿ,àý?fC×þÝþ?ü¿<wàøê¦£`&tý÷ìÿýgáñFC×ÏëàÿaAÝr4 CÕ¿Ý·ÿGÂÿýþ;ôÿÈù_ùßy8¾ü|vr~j¿ÿpj]¾??·ô0 ¦@×þùÀFþÐû3ºþ»ôÿTõïJÄÿó ý
-]ÿúví¿çâý/,@ÿfC×ÏþøY8F`4týwèÿ;ú`ÿypåÐúb°´Óÿ$ÿÙþ¥ÿ'jü?Ò¥¯ßÿäÙÊþËWÝÿÞ×÷ÞÄÙm87YZ-^ÖÞÿç¸:þþ¿þ9¤þ£t1«yõk aþÏõ1ÿϺÿfÓÆþÑ
-áímßÿX¾ÿUhÿÚÿþi]ÿÉlk³ú»ý×õ/µ õÏ µþó䝯¯®·ÿ^¥þá#þéù¿£`.TýÏoîó$R£ýNøÑ<̤HÒÇåÓ®ÿ¯õäÿâé¿Ìªÿâ~ÞýÕþ#Ìÿ³ðyLxVÀP¨úÆwñ´á9ÚÛÇÿgË?ͪÿ(½3ÿ» <9P¯§¢_:ÿeÁGâ£!ÏÿÝY<©/T?í¬×¿[Ñ¿çøXÿÍó"@`0Tý
-ïóQ:
yFIX$wI±o-Pûþ¿ï;Ð?Èþf6ØÿÛpþô9êô/væÿ<ûÏú^òZªþgÛ«8Ó=<.jtAèÿKøÿxðf M¦ÿ6ÙHñ_2@ü7Ôúï6þ«Úþ;èÿ1áHUÿ½ÇAÿ, þËl¨úï4þëøï úgá$,B4æBÕßñ_xÿ°ÿfCÕïñ_ÿdñ_fCÿë;þë?X@üÙPõß{üôÏ"7̦ûßOüôϺÿe&TýwÿUÿ{Rbýÿ
-MÿNñ_bÿïÿcZÿÝÆù»þ_Ìÿ²0CDUÿ½ÇÁÿËü¿fCÕïù¿0þcù¿ÌªÿÞóaþÊ7ªþ{ÿBü7ÿ5òü_ßñ_xÿ'öKÄUÿÝÆíØßAþùLö¿ø
/ØÖupPü×dFä
ªÿn㿪ë¿=)ñþO´ÿâ5þEÿù¿ðþO¨õß{þ/ôÿX@þ/³¡ê¿÷ø/èÄ
-UÿÝÆíÚÿ úgálÙ"Òm7Z¡ê¿÷ü_ÿaößl¨úï=þñ, þËlÈó}ÇaýÈÿe6Tý÷ÿúgæßl:°ÿýÄAÿ,¬ë ù¿ÌªÿÞßÿùvM¦±þñ4nõõðÆñ_N ôoûúý¯ÿêvõ-²,£qÜÅYÓsÔ¶ÿBVêßñàÿå!æÉH×-¬Ðô*ùÏÒl¥
-ÎQßÿ*úw}ù¿XãqAü¦ÒLÿó,Îîçh5þ[öÿ<¼ÿ¬ÿ7úOó<¹6øÜ¦^ÿ^Uÿþ?öKá¡0ÆýÿvKþ¶h5ÿSÎÿªöùßYhQÿE:O§éõ}ë¡}ý@¿ÿõß?ú/n²8t ]×ß:û¿ëÿuäÿç¡âÉ¥ýC"
À
-Eÿk?çaô%¼GÉøÉsÔ÷ÿ«ñ_üß<`ýÙPô¥Yæ7i¯ùþͬÿƽRÿßõ°þ
NúÿÈÿ÷ÃÒÁø¿vX½ý¯Æú¶Dþ_ÄLÿÌÁö¿~ù'%þ[ýúç þ³i¡ÿt¦S=Ρî·ÿé¢ÿÏÆÿfÓBÿäE Záõþ_Ûv ÊvB
-WÇÿÁÿÛ?úW7¬A³úßÊÿìÿ`^ÿã8£¶ÿïìÌÿ{XÿÉÃãË3ëíÛ߬³wNϼ9ûdÙßý# ë×ÍFµú¢ªÿÀFþGoè{8ÜÍ®ÿ©úï,Úóiöó®taÿY>,½ÉÐõ_$·
-'ëíÿNþwúçÁñp962Á]ÿ³°3ýï䯸c²7ºþçé×)Ú÷ÿ þ?¤þ¿ÉPõßf90ÉÿcÃÿýþ»ôÿìÌÿzí?{ü?0
-@×þ÷¿;Àúo\ÅÛ&C×þêüøO&¨ßhèúïÒÿSÿ9õ,8ªf<©Ðõß³ÿù_X8Æ£¡ë¿KÿÏîøßÅøaÃd2Tý˾ý?þèõßóúäÿbaÿGÂ(]ÿ]úü]ÿÆ,é`ñÁÐõßóúØðþW³¡ë¿gÿÖÿ²0ô¾5ÆB×ÏþØáú5ºþ{^ÿÿê£0ªþíý?~ ÿôúïÐÿ#Ýþò¿³p|ùùìäüÔ:~ÿáÔº|~né?aL®ÿ.ý?;þßÀFþÐû3ºþ»ôÿTõïJÌÿò ý
-]ÿúví?Öÿ0ý
-]ÿ=û°þ
c4 FC×þ±£ÿ öWÝ¡È!^i$íô?Éâ¶?Géÿ ÿ´¥gkéë÷?yjH`ÉWÝÿÞ×÷ÞÄÙm87YZ-^ÖÞÿç¸ïÿbáúÒŬæÕ¯%ù?×Çü?èþMûF7·?¶}ÿcùþWa{hÿ9h]ÿÉlk³úÿ#õϵþó䝯¯®·ÿ;ù?ì?ÒóGÀ\¨úßÜçI¤Fúð£yI¤Ë§}ÿ?XÿÁÒ
-UÿÅý¼;û¿»þSøÿaáó,$ñ¡Põ?ïâiÃs´·ÿj °üÓl¨úÒ8Óñ¿ËÀÓõú¯úÿ}é`ý'>^ûj4äù¿0Ç#õ
j ò§½õú¯®ÿöñ,ü1ªþ¿÷ù(Â<O£$,»¤Ø·¨}ÿß÷èd3ìÿm8úuú;óýça]/ù^!øÃBÕÿlq{gºÇE.ý ÿvM¦ÿ6Ùñ_.â¿8 Ö·ñ_;ùÿÐÿcÂÿ2ªþ{ÿþY@üÙPõßiü×#ñßôÏÂIXhÌ
ªÿÞã¿°þس¡ê¿ïø/øOÿe6äù¿ã¿<¬ÿ`ñ_fCÕßñ_úgñ_fÓýï%þöu þËL¨úï6þ«:þ÷¤Äú/0þ7þþã¿ðþ?¨õßmü¿ÿ
ù_b0¡ê¿÷ø/øYÿ×l¨úï;ÿWñÈÿe6Tý÷ÿ
ù_(ßh¨úï=ÿâ¿YÀü¯ÙçÿúÎÿ%¡ì ¡ê¿Ûø¯ûï;ÈÿÁð!éÀþ÷ÿ
ö
uÿ5 ùA¡ê¿Ûø¯êúoOJúç@ûÿ!^s¡é_ôÿ
÷²@ÿÞó¡ÿÇò
-Uÿ½ÇAÿ, þËl¨úï6þk×þÐ?g³¼Èn»ÑUÿ½Çaþس¡ê¿÷ü_ÿdñ_fCÿë;þë?X@þ/³¡ê¿÷÷?Bÿ,ÀüMö¿ø/è
u ÿPõßûû1ÿÏÈ j2õï¶
-ùÚB+¼yüPúW-ø/ZÔÎÓiz}ßúAh_ÿ"Ðí?ê¿(õ_Üdq8åɺa×õ7¥]ÿ_׿ÈÿÄB'ý/â
-Eÿ±ó0ú^Ç£düä9êûÿ²¢Ïÿ(×l(úÒ¬Vó´×¿#øÿY°¡£!ë¿qïÔÿw=Äÿ±ÐIÿë¿X:ÿ× ÕÛ·¢ßFþ7ì 0í}øAÿ'àÿcùß̦
þÓõ'C+Üo5þÒEÿÌÿMý«ÿ$ãiÜ>@+¼ÞÿkûÒDÙNHáðÿ³@¨uøÍàÕÿfû/}Ô?ôúÇyÔìµýggþßCü?o/Ϭ·o³ÎÞ}:=·.þñæìesà0ºþyxÝl4P«!ªúò?³ØÁÀµx
-¡Ðõ?UÿEûÖümÒ~þÏì?Â¥7ºþä¶ád`½ý¯êßñ WÏÂF ¡ëv¦ÿü?ÿsr¿ÑÐõ?O¿ÆY£s´ïÿ;ü<Hý¡ê¿Í Hþþèõߥÿggþ×ÃûxØãÿQ0ºþ;ôÿØÁ®ÿë?Y®8Hc,týwéÿ©Îÿ¸ÿdÂAê6£¡ë¿KÿÏnüü/,gàúÁqàfB׿þþ?ǾÑÐõߥÿÇÛõÿÀþ³ l8LªÙ·ÿïÿf^ÿý®ÿÁû¿xØãÿ0
-f@×þþÿ&RÚ6ºþû]ÿãÂþ³÷
-]ÿ]úvã¿0ÿÃë{C/>3¡ë¿gÿì?Çèü
-]ÿ=¯ÿýgAÝr4 CÕ¿Ý·ÿÇÿzýwèÿ;ñÿò¿óp|ùùìäüÔ:~ÿáÔº|~né?aL®ÿ.ý?;þß@ ÿèý
-]ÿ]úªúw¥ü,@ÿfC×þ]ûï¹xÿпÙÐõß³ÿëY8F`4týwèÿ;ú`ÿypåÐú"ý«´Óÿ$ÿÙ×û¶Þÿæ øX Ô:Ç·álÜøAh_ÿ£6¡þ8¤þóðv®ß;ÊTàsè
-~úýÕõ¾ø¤¾ý0ýÆÒþG·á·=ç¨ïÿWã¿ýÀÆü?bUh̤CýïOýüßýlÌÿ± ~£9DÿÉõ,ÍâÑLMÓp¼ïõýÿªÿÏwØ }³9Dÿù¨¸Éâü&îÕ¾¦^ÿÕù/ÿ³0@`4è¿ô æá]<ºJÂ'´A°ÿRBÿ,@þfCÐ
å¨ÿ6ü6ÒjÏQ«Qõÿ¸Öó 2À¹ ÿð.L¦áÕ4]§wq6K÷é£vþÏê?âXXwæ¬ò÷ÍÃ(¶æq6I3µQýíÂÿpú×q³Iª'üÛÿ§ý»ößEþG7ôaÿÍ
ÿp2£"ÔF¨÷ÿí®ÿèÿ³àBùFCÐ륿ÍåOÑ¿Àþ³ ýÍãÿõ¨¿öõóÕø?7ðaÿYXÿÑI'ózó"EIü¨Bêì¿p«ú\ù¿XXÍÿ[êÓ/?¡S~úúOõé¾wnù)}Q~
-9Ðb8ôÊÏ/ËÏ@ËÏå¼&ÿÅ9Äÿ×fþ¯µÿñ¿,`þÏlÐù<ý+©×5þß
-ðþþ}1Ëóyñøïhã ýG¬?ÿòÿò ûo6è%w2 Õë¿úþo×XÿÃBÍ«E#`Äÿ´ÿmkÿ=äÿfñ¿fÓBÿÅMÝS½æ/-iÜgþ'WÇÿ#ÿSÿRÿQº
-ÎAÿp´ÿ, å76ý¿0ºiÞèoЬý·}iÂwmÿQäÿc¡uý'³qüM¶zÚÛé(úgZÿyòWÃìïMìuþǰÿ<HÏÿ] s¡ê~s'
-(ÍÄ£yI¤Ë§}ÿ?XÿÍøªÿâ~ÞýßÿUöþ>ÏI#üÛT¨úÆwñ´á9ÚÛÇÈÿÀòªÿ(½3ýþ×å àÉézýWó?úÒAþ7|, 5òüßM-׫ ÚX¯·ÿÕñ±þû ¡êÿkxÒÉ(Ìó4JÂ"¹K}ïoßÿ÷}úga õMöÿ6?}:ýù?OÀþó°®üCÀð£BÕÿlq{gº >}Bÿ_ÂÿÇ'0h24ýÛýÇ!þjýwÿUmÿôÿp$¿LªÿÞã¿ 0r3ªþ;ÿz,þúgá$,B4æBÕïñ_XÿÁì¿ÙPõß{üâ?Y@üÙçÿúÿÂúÿe6Tý÷ÿý³ø/³éÀþ÷ÿý³°®Ä UÿÝÆUÇÿXÿÅÆÿfCÓ¿Óüø/¨õßmüWõý/0ÿËÂ@f0Tý÷ÿåÀÿËFnfCÕïù¿0þcù¿ÌªÿÞã¿0ÿËå
-Uÿ½Ç!þÌÿ
-yþ¯ïø/úçÀ~ 0ªþ»ÿÚ±ÿ¾ü,ò7ì?ñ_°ÿ,¬ëà ø¯ÉÈ
-UÿÝÆU×{ÒÐ?ÚÿñMÿ¢ÿø/ø/¨õß{þ/ôÿX@þ/³¡ê¿÷ü_Ð?ÿ2ªþ»ÿÚµÿôÏÂÙ,/²E¤Ûn´BÕïñ_ÿaößl¨úï=þñ, þËlÈó}ÇaýÈÿe6Tý÷ÿúgê7ì?ñ_Ð?ë:@þ/3¡ê¿÷÷?bþ!Ôdé?WÊòÛb4O¿*Ùçá]2»n*p¿iÿß þ]ùÿy°¡~£ilÿÛ½òuðúøOÛv ôÀߺ¿øOZÔÎÓiz}ßúAhVÿëþú^@x¨(õ_Üdq¨ºÉÕ´Q/ Ýø_׿øXÿÉÆÿfCÑÿCìï<¾×ñ(?yúñ¿¬èßóÄÿ° å
-EÿQÕj~öúwðþ?&0þ7²þ÷þIý×Cþg:éÿ#ÿÃKãÿÚ ÀzûïVôïÛxÿÿ3í}ø/Aÿg#ÿ+Èÿh6-ô¯þ§q{? VxcÿÞ.
«ßÿÿOÿê_ݰ"nó¸fõ¿ÙþK?@þèõ?ó¨Ù9jí¿³3ÿçáý<¼9¾<³Þ¾ýÍ:{÷éôܺøÇ³OýÍÁ¼ Ðõ¿ÈÃëf)@jõ/DUÿø_ÏØ@°¡Ðõ?UÿEûÖümÒ~üïJöáÃÒ]ÿErÛ0X½ý¯êßñ d0t|Wi M®ÿYØþ·òÿ`üÏÉ1^ i4tý+£}ÿß \Äÿ° môÿMªÿ6o øôúøú^ÿ]úvæ=ö
=þC ë¿CÿÏÖû¿Vþ¬ÿdA
-o 5ºþ»ôÿTç\ñö5ºþ»ôÿTÇç þQÎn*tý÷ìÿAþ ÂhèúïÒÿ³;þw0þgAÛ´ æBÕ¿ì{ý
-ÿôúïyýòÿ°°Çÿ#aÌ®ÿ~ý?ó¿,ø®µ?C×Ïë`ÿYÀû?Ì®ÿý?XÿË3Þ¾©Ðõß³ÿö
cÄ
-]ÿý®ÿÿuËÑ Uÿm^Fñÿø>ü?Ðë¿CÿvûÈÿÌÂñåç³óSëøýSëòýù¹¥ÿI0ºþ»ôÿìøùX@ïÏlèúïÒÿSÕ¿+1ÿËôo6týwèÿÙµÿXÿÃôo6tý÷ìÿAüÇh ®ÿý?bGÿì?®ºC?Cí´Óÿ$ÿÙ×û6õ/<þõÎÆñm87~Ú׿#õÏÁ!õ·sýÈQ¦:OCW°ÿdÿßßyÿ+â?xúöÃôKgúÝßö£¾ÿ_ÍÿéûæÿY«*@`&ê¯xêçÿvì`cþñÍ!úO®gúMð3Uz4MÃñ¾sÔ÷ÿ«þ?ßõaÿYöÍæý/æ£â&ótºWûzýWçÿ=äÿfbÀhÑéÌûxtOh`ÿ¥þYüÍ ÿ<
-ËQÿmøm¤7Ô£Vÿ;ùÜ ë¿yC`À\Ðx&Óðj®Ó»8¥ûôQ;ÿçVõñ?,¬;sVùûæa[ó8¤Ú¨þvá8ýë8ÀÙ$ÕþÍí»üOnà"ÿ?Âú°ÿæBÐ8ÄQGjC#Eô/ôÏm KZx ¼©ôÅzéosùSôoðÿ³ ýÍãÿõ¨¿öõóÕø?7ð1ÿÇÂzüÀL:ÿÓñ,JâGRgÿ
[Õà:ÈÿÅÂjþßR~ùòÓתOoõ½3tËOéòSÈþáW~|Y~rX~.ç0ø/Î!þ¿6óýèÿ³ù?³9@ÿy\äó8~2ô¯¤^ÿÕø7Àû_xø÷Å,_ÌçiVÄã¿£0ô-²þüÈÿËì¿Ù ÿqÜ5Ê T¯ÿêû]W`ýa4O^®jyÿÓ&þ·uüò³ø_³i¡ÿâ&Îné^óÅ4î3ÿ«ãÿÿ©©ÿ(]Ìç¨mÿwó¿»>ÚÐòMþ_Ý4oô7hÖþÛ¾´±Êÿ(lí?ë?ão²ÕcÐÞþKx¨¨õ'5ÌþÞÄþWçûÏôüßÑ0ªþç7÷y©ÑÒL<YIú¸|Ú÷ÿõß<ßh¨ú/îçÝÙÿÍù_'(í ÿ/gÉ$þm*TýOã»xÚðíí¿ãä`ABùFCÕÞÄ~ÿër ðät@½þ«ù})ÿßE`2äù¿0[®W
-@þ´°^ÿn5ÿ«ãcýö4 &CÕÿ×ð>¥QçiErûÞß¾ÿïûôÏ ê7ìÿm8úuú;ñýça]/ùáG
ªÿÙâö*Ît@/}úþ¿ÿO`Ðdhú·ûÿ*ýÒ±â¿8 Ö·ñ_îÿïÿâÁÿ2ªþ{ÿ*õ ý³ÙPõßiü×fü÷:þúgá$,B4æBÕoñ_Ký;ùÿYý7ªþ{ÿ*õï« úç ñ_fCÿë+þ«Ô¿çøXÿÁâ¿ÌªÿÞâ¿ößGþÿe6Øÿnã¿ö_Àþó°®Ä UÿÝÆUÇÿXÿÉÆÿfCÓ¿Óþ/ñ_Pë¿Ûø¯êû_á£ýga 3ªþ{Ïÿÿ¹
-Uÿ½åÿZÛäÿ`ù¿ÌªÿÞó!þÊ7
ªþûÎÿ
ü<`þ×lÈó}çÿBü7öË
-ÁPõßmü×ý÷äÿ`Aø¿Ét`ÿûÉÿûϺÿLÐü PõßmüWõý_ÿdAûÿ!^s¡é_ôÿïfZÿ½çÿÿäÿ2ªþ{Ïÿý³ø/³¡ê¿Ûø¯]û@ÿ,Íò"[DºíFK` Tý÷ÿþ`ÿͪÿÞóaþÄ
-yþ¯ïü_XÿÉò
-Uÿ½çÿþYúͦûßOþ/è
u ÿPõßÛû×ù¿0ÿÏÈ j2Íô+åG·Ñh~UªÏûdvÝX
-Zá~»ùïÿâÁú¦±ýZ
|n¡Þ<ÿTú·mñ,´¨ÿ"§Óôú¾õоþE ÿJý7YGyr5mÔ
-h5þ/ëßÓì?ÿCü¨Pôÿû;£/áu<JÆO£~ü/«ú÷mÄÿ°;³¡è?J³ZÍoÒ^ÿtÿä3²þ÷þ)ý×Eþ:éÿ#ÿÃKãÿÚ ÀzûïVôïÛÿáÁyüo&s°ý¯ÿ%èßóÿä4úOgz©áZáýÿKÿôÐÿgófÓBÿê?Éx·Ð
-¯÷ÿÚ¾´Q¶Rx¶ÿBý«VÄmÞ Ù¬þ7Û ÿôúÇyÔìµýggþßÃú_Þ_Yoßþf½ûtzn]üãÍÙ'Ëþæ .Ðèú_äáu³Ñ@þ
¨ê?ÿgÁþаÐPèúªÿ΢}k~7i?ÿçJöáÃÒ]ÿErÛp2°ÞþWõïxÐ?3ô\Ç÷¼ÁíÐõ?;ÓÿÖû0þçäFC×¹¸Ñ9Ú÷ÿ þ?¤þ¿ÉPõßæ
-0$ÿ
-ÿôúïÒÿ³3ÿë9hÿYØãÿQ0ºþ;ôÿØþNÿOBÿ,]¡ë¿KÿOuþÇEü'Þþi4týwéÿÙíÿ»ÿ`ÁÁPø¶VÀLèúïÙÿü/,cÑÐõߥÿÇÛõÿ ÿÂÈd¨ú}û°þzý÷¼þù¿XØãÿ0
-f@×þ`×ÿý³àتõ!vS¡ë¿çõ?Ð?xÿÙÐõߥÿg·ÿÿ/Â\é:è
-]ÿ=û`ÿY8FüÑÐõßóúøXP·
-ÁPõo÷ëÿñ þèõß¡ÿGîÌÿzÈÿÎÃñåç³óSëøýSëòýù¹¥ÿI0ºþ»ôÿìÌÿùX@ïÏlèúïÒÿSÕ¿+ÿÏôo6týwèÿÙµÿ÷¿° ý
-]ÿ=ûàÿeá
-ÑÐõß¡ÿGìè?ýçÁCwèrÀFÒNÿ,þg_ïÚzÿ'àÿaPÿélß³qã¡}ý;í¢þ98¤þóðv®ß;ÊTàsè
-~úýÕü_¾ø¤¾ý0ýÆÒþG·á·=ç¨ïÿWóÿøùĪ
-ÐIúß+úù¿ûÌÿ± ~£9DÿÉõ,ÍâÑLMÓp¼ïõýÿªÿÏwØ }³9Dÿù¨¸Éâü&îÕ¾¦^ÿÕù/ÿ³0@`4è¿ô æá]<ºJÂ'´A°ÿÒþYüÍ ÿ<
-ËQÿmøm¤7Ô£Vÿ¢êÿq¬ÿæAõ»¶Ð
-ÊúïÂd^MãÑuzg³t>jçÿܪþá!þ
ugÎ*ß<bkg4SÕ¿Ñ.ü 8¤z¿¹ýÚÿ·kÿ=äÿgAxCöß\ú'8*âñHmh¤zÿßîú?äå!ò ÿ,ÖKË¢aÃþ³ ýÍãÿõ¨¿öõóÕø?7`ÿYXÿÑI'ózó"EIü¨Bêì¿p«ú\ù¿XXÍÿ[êÓ/?¡S~úúOõé¾wnù)}Q~
-9Ðb8ôÊÏ/ËÏ@ËÏå¼&ÿÅ9Äÿ×fþ¯µÿñ¿,`þÏlÐù<ý+©×5þß
-ðþþ}1Ëóyñøïhã ýG¬?ÿòÿò ûo6è%w2 Õë¿úþo×XÿÃBÍ«E#`Äÿ´ÿmÿüß, þ×lZ迸³Ûpª×ü¥E1ûÌÿäêøäêCê?J³¢Á9ñnö´üfÓ¦ÿF7Íý
-µÿ¶/í@ø®ó?ªÖ í?ë?ão²ÕcÐÞþKÇöQÿPë?Oþjý½ý¯Îÿ8öéù¿£`.TýÏoîó$R£¥x4³")ôqù´ïÿë¿y¿ÑPõ_ÜÏ»³ÿ;ó¿ÊþÃÿÃÂçY2Ib
-UÿÓø.6<G{ûï8ùXP¾ÑPõ¥7q¦ßÿº <9P¯ÿjþG_ºÈÿÆï¢0òüßM-׫ ÚX¯·ÿÕ °þçVUÿ_Ãû|NFa§QÉ]Rì{|ûþ¿ï»Ð?¨ßh:°ÿ·áüésÔé_ìÌÿyöu¼8ä´"?*TýÏ·Wq¦{ zèÓç ôÿ%ü<x3&CÓ¿ÝüÞÿ˵þ»ÿª¶ÿúL8á_&CÕïñ_Ð?ÿ2ªþ;ÿÚÿ6ôÏÂIXhÌ
ªÿÞã¿°þس¡ê¿ïø/ñ, þËlÈó=ÇùXÿÁâ¿Ìªÿ¾ã¿èDnMö¿ø/ØÖuø/3¡ê¿Ûø¯êøßÖ±ñ¿ÙÐôïôÿ þjýwÿU}ÿ#Ìÿ²0CDUÿ½ÇÁÿËü¿fCÕÏù¿¤ñÈÿe6Tý÷ÿ
ù_(ßh¨úï=ÿâ¿YÀü¯ÙçÿúÎÿ%¡ìÿ2ªþ»ÿÚ±ÿ¾ü,ò7ì?ù¿`ÿYX×ÁAñ_ ªþ»ÿª®ÿö¤ãAÿhÿ?Äk.4ýþã¿<Äq@ÿÞó¡ÿÇò
-Uÿ½ÇAÿ, þËl¨úï6þkÇþKúgálÙ"Òm7Z¡ê¿÷ø/Ìÿ° ûo6Tý÷ÿñ, þËlÈó}ÇaýÈÿe6Tý÷þþGè³éÀþ÷ÿý³°®äÿ2ªþ{ÿ#æÿYÚ5zýÏÒqÜ*ÜkðVñ_"p´þÿÕ?
-ë?éi^â9Úÿlëÿy°ÑúMCýëÿ´{éïÛi;ò?²ÐªþÕ0À'£¬ÿ ¨©©ºýʨ·¥úÃû_|ÕùÏÝõߪþ%á¤ú¨ÚÖ?¥M&Õ¿úç mý×:{¡ýü "þäÿ0Vú-nC%¶
-@þ
SÍÿ-
@þ_tnÂ
-7þQù÷mç½ü÷$Íâäz¦þLfEMãð..wpmU|ê5@úéX -nâl¹sÿú´µÿá¤þDÿVõß&³IÚö5í¿;ëD àÿgáè]ÙR[ñí§´§¯a;iÛÖ_6
-¼Íâxõ½eù¶=þvÏy<~(à:¸ÞDEr÷ý ²ñC³ÀÙ,Ü*"¥çÈÁF$+î¿ ,ãoøGñU}Ù,´ù+Þ&Óø2¼óUG±k¸çó¡®ÒºGx3KgG°Ôl^þòSx5Ý*±ywo?>ÏÔc§Ê¼~ì"I³(Þþ[~æ§Ûù£Gø8
-¯¶öw2ج¬âh&·×à8Ãêþøy-¬ÏÙ:Âoëåm<7öî·Í#ß~\dóoÿ»µ`"mí¿ dÿmØÚÖ¿K8©þÔ?ꨥLSËsÔÏÿUýÿÒvÿŬ®Ù´mÿ)$´ÿBGûÏ@Ûú¯
-öÚùßø5Øÿ
u ÿ«´Õ@8©ÿï£ýç aýÏÓ<O®¦´àöýaûÈÿÏúÿfÓPÿ7a®×zÒÎÑ^ÿ¶ï£ÿÇôo6-ô?K³Ûp:ºoÓl_ªG!Ìÿýs ýMEÿÓ|%¯fûe at A+Ü߯ÇWcC¡ºü¶ëyÂÿK}é ÿ+¶ýÚ¶_Ùºûökk`ü×kÛÖ³,¾³ýüHËî÷ír§Àp»³S Ü.àî¸Ú.àí¶ø;ÆÛñvÁNÉvaµ¨Ü¨p§Ø.0®Þj'¬WÕ²R ªp*ÆÕîv1¨ð*Õ~¥Àί**¿"®ÞUTîWTî«*÷ALª*÷Á©ü̺HÕ.ÒÝ* Já6 ½jQ)ào;GªªGØ®,áìaûF w§@\-P=
¬Nµ³]À©\¤·s
-Ûu!JñG°«D¥¨²ZÀ©pªÜírX-àU
-Õ~¥ÀUµ@P)°ýزlg] tÕvQÙ>XmíÃÕö ²=*·_éã»Ûãr{Ti¸B×^mw+Û«í^e{Xnï\¿»Ú^½~oµ½zýþj{õúÇ·¯Sºîêa®nàdYàA³¡WÛÕ6´J{µÝÑ'ò¾h½Ý«Wæ¬l¥£d¡-¯áÉÕvõÁ÷íÚ¬Ê˲¼ õ÷ÚtÚB]ðÕfòDÂW--×ÄþÛÿJÿo|ç×t+¶x²ÿ'¤¯·m÷ÿßÃü/çÉlñͺS¿-Ig|¥Ñàe);vN§aÌþcßÓøV<Wۢ衬2JSêÁÐñC<¶~åö®|þÜú7a}¼¸´>Ý,¬ñÜRMIðÚªþ¤uyòIï:8:NooÃÙØÒéE^[Yªþ?¿ùåôüç¬(åé4þ¹(î?Ú/ênl´~?ýðîôÜÊóyê¢ù"}dYg³"Z¿Æ³
:rùÚøæâÄz³(nâYDêµéXý;\dëÏßÂÅ4?úåìýÇó,½KÆêëwÝXÞ\X·á\¾,¤R¥]Áz¹¹iGº7½Èu¤íó};.KmíÇRBWÏÝ]<Þ»k¼sNa7ÛUT/×Ê6Õ]îC©Í¯tÍÔó¡ÜÆ®ÿÊ©?çºÔÖãIs®Ëmî8~s®Jmíè.ïíãË3ëÝ~Ü»«[½·jø¾ë8,Âýû}W?µö´»?u`ÛÍN»*ø}_wõYwÃu¹ï»^5Üuíì:7Ü5¨²k<v]öû®býÕæ®Ó0/FóÉÌúÙ²¿Oÿ·QE7W}øÖåOV<ÓÔøµn,û
NǪ\ î¦~ÊÏÖ,þZn«êó(%ÅjrU§Ô'³ë£
-µ«æåóð:¶äÅÑæ¶eÕC[p¿}³jÇIG
µ:®U®=ÈÅÜ*Rëaÿ°ô3ðRWÞòÇ«â£p<Î^/ÏÆßÿ:R
-âÉÙÇßÕ`<// &ñÄwý£3eP\k®oé¬xu¤Á×Ö'úw½µcuToIª¤uöîjȯJý×Ge!·ÁÛS!ËR¾.%V¥¬O¿}8ÿ?[«#V«ÊÚtÖGy«>Ê£¨Íú(oõQÜýG¹øøöÓê(öÉú('ëkñË£øÇ¾·qÅ;Gq?ºú(¥ºõµ¨.öò7gÇåñ½å7³:þ«¼8~ûkywu
|çø©;&?Êo§Ëßê¬2 åãùÙò(r}p¬îû÷;öô3ðøµ¬jïämy!~9]>J«ãß[Ëu2úVÛÏuïÄWÒáÃCpñæCY}öªÛÝw©õîóÅÝ{$×,Ô¯\²&éb6>z~ѪrÙ¬êCÙ^®ÿñ ¼_T7I5VJÅËå¶
-v³¬wïONG'o>½±þØ,:ÜjKbÕ¬ý©ö¸Ò§
-çÛåWvfsáÇqðgÙòäÖàèY`Åa6½·-jù{óçÖÏ?ÿ}yDuñGÜj½ôYÿÍÞùº<þZÝ_ݬælÙÒé£î-®&Ö_oôÁêhOª1»|~öîtóh»ÅõÑäòk¹y²AàÅvTíÓé}²Ê{üËÇßöXq}4G½Ñê?mèߨUS»>ÚãÅõÑÜÕ¥oö)Oay´òÆÜÆ/}¤¸>·¾[]¾áÆ}S\þúéÍ/ç[÷m·¸>¿þz«#Tóðp´²R¶GÛ-~T*§^\\¾,íÎÚ]ÉXÕq×ÿ:Z~ËïÉËïÆ¥ÿSµ'ÖË¿oGÈïE&«¢J¾«eîÿo:Ë·ï¬,éꧪæbÕ*}ûþPþ}õþ9Ë2ü^FlYÖkét][ÇY¹HïÊ_ÿ¾=-ÊK¤Ò_tS^ãQ©ÄrU¾6ê¸ZË¥W}T^ÉëG/X?ïÅÆ÷å`ëû²§ÿý{Ý}ßþ^÷Ê7¾Wº?z¿¾ªSRÓùr¥ô·º[åoTêk_¿°ÎÏÞ¾·®Â"ºyýý®©±ç>RЫ6ýòâå§ä6ά³÷Ö¥>êsÕ tùí¹Îm°4κëß&q¼¼í«2å×ÏÂhñê×?i8O¢åB=«áó½»8ۻȻxÛ»¸
-v ¶wñì2ÜÞE4Øåj{§Á.ãí]¼»L¶w ìboí¢ÿ'yÍ>r{Ùdw{·É>þö>~}Ûû&ûÛû8Mö¶÷ñìoïìÙgôN*ut\ßXåËõP¡k÷ϧw$e'²KÙÉ£ìäSv
-(;
-(;
-);
®(;EÆbÊN§w:{¿áCý¬,ÖÚbE«Þßu®Â<þÃVû-÷Pÿ|m¤j
-^<LîªÎ¦Í[á
õëÇ3Ë~)GÏ:¬uX9«t¿Vlv¸ÿ´Ãï§îK7X÷ݧÑÇÇ£÷ÿùÁzvµP
-õßQýSýëz^
Óòi'Sýÿçõ;7wnÜì}?üoÛZäªÓ|uo¥ê³d¿úþ¥|êËá#_~BûÊ{¥ò"ý>Ý<Åæ°<ëö
®-,}S_÷i9evô9/§;ÐÏ.Þ|z^vuy{Щs¸¨^eùÎ_õíkëÍt~Õû
-ß:¾ü¬zKë&-æÓÅuù÷.
å^éáCºÈ"5Ì+û娵°ÜÁªÛøì:¿¶ÖÓ¯ýÕ?]~P[ou8ßv¤ªûB,XsÕÓgzdwôîÃHÿ¨{rÞkoIƪS(üòï²?«6XâèE2-Ô¨[wýtÂ\ýJ«L7fã8{aݦWÉ4)îku«ËI°töJ
-ÕtWÓzèkºÒµ.Óiݯzeòè÷å4Zt ·âlI8MþÒçW¿íßÔÉÎN¬0¿YÎÉ©~L%úZ\{è[ÏÊW¿W¾°øåz~túgÚ7q|¡s÷ª{ÿZÏXØG>[êÙI®T]«¯Ãë0åjDp1útvqúáè$.âH#óÊu\ëâ·¿¬yªÚÌÓìÕÑñòz_«ªJ¶þó×7ÿ5°¿IïhõS¬?ôoyèrmmþ¸±ýø&óªVE¿zõJO¼ùõÒºRPÃöåôÇE9é©=§Âq}÷ËOj7ôÿÞ
É´¼/Ϥ/ì/Öu=ãªIPÃ/Ùpù¥|vÔíR²ôêó£ãË7¯Óó4ËJPwAèN¬æ,æY.Luõ7ó¸°"õ×ÕÌ
-ukõXÅþa«û«Û8÷Ö4MçÖ³üK¢Ç<WíY8]ĺ¢Å´¬E)Í¢lL²øýêÔW¯,oàû¯Ôhæô:½8»üh=Îÿÿuݨªy®héömÞÆ_ÓìËæÕ}<-Ýw¯µ·ëûõjcûǵ>T-èÄnzÔw«Ç'úY»·Ê׺<ú
-GØ|xy¶;P³~
-Ï´ _î?ïyÎ÷8xayÒÕÉrV»_¨Ú/Ø]zþQÙ^ëly¯~¡7llXëMjÇõ6g½m Ë/=ô\&£Y»\·¹k%Xg'ꬾ}ØxfqùM¹Í~ºËúmªj Íô^=ÿÖ³OâùѲæo¿I¡+!«_Xܨ'm¯íCyÐ,¾K>X=yâÛãW¯JɾVÖ1RþÙþæØ¥Ñ?ÛjÁÄϲüSþüRè¿õçêªVnÏ¥ôÙçºÙür&E}ÈWCçW¥õ`/¶\Yé÷Áïò©-³ÿey¡/ûûæu[£¯\ q¡áã8¾´¿75WjKÙÎ|ßñU9©ÏôÐöXâ'1°¹UÎTî4âÝmÊ*ÇQ2I¢)êò^Á®ºÔCè?ïãÙR?AülßÏÖ£>'ÑÂç´<Ï!OK´näµáÉïgÑM¦®ö¯åñGiâôý(+ðOÝ
-çªôXåËT?`oåKjå?Ò´ªÊw{©|ùp®|©¿ÔÊí*_²U¾|²ò¤Ü_ùN·ÊôRùÎOªó|hå;úZùN»ÊwØ*ßy²òÝD°¿òÝn+ØKå« ºéR¸ÔÊwÛU¾ËVùîïý$û+ßë¶ò^*_ý§ïQ+ßkWù[å{OV¾ÿû+ßÿ}ÿ'áucó}jåûí*ßg«|ÿÉÊ~ÎþÊ~Þ~ -W'6? V~Юò¶Ê6+_UÒõM¡ãÍË Åå´[:Q?<ùÒ']Î<sý¡^ÉÁCm>Um°(T5èkÈÕÕ_ÓÛ0½>²ÿÐæ|ê©dw5Yþñìó³w¿YË©¿\YZËUvë^«.µ¯ú¡°:xá©®µ¯zXþjµ§ÜÙS×~î_å «ñeë3í»layÍ/{ãõO ]¶l|ÙúLû.[Z~óËÞ¸dýHí4¾l}¦}íXAóËÞ¸dýHívòl»Íûl{<Ûj!Ym¿gÛW¶õÙ:y¶Ëa|¶gq1
·±*«Ów=|ôîôÓkëÃÃ̺¶E¥SkÞ&Ó{KøÚa0N£/Ö*+ÅÒe°9Õ.¼â~[ó(Ù¡¿<^Än{¾Ô½Ñ^3ë!d=¯oõì~éµ?ð¥ö6m ÌâP{·vyS7àt íeÙå¬éÅÅñûwoÏ~ÝÚ᥮Ä7n_Xù#Dé¯[^`¤mâêWë`¤ô¶§Çú¼:"yí\Ôó²ó,Vÿ}ð¼,¿y¶Z[m룰>:ÖGoíÍ\^ÄÊ«Oû0¿»vE®c¤Ï¬ªófý²tÙü¡6ØZÏJ×vêé[¿ú£\)®ÃªNÿmcEÎ$KoÛ:qnÔaNU¿ã}{ãD¶¿¤£Ê£:¤£:5GuIGukêêÕÕ'Õ¯9j@:jPsÔ騣IGÖ5$5|ú¨ô¼çU¯&õû^õtW5×ÕÕ%Õ9ªG:ª÷äQǤÚ?U[ËEͯkq"üVV¿Oî+¶÷--àÊû¿Ù¦ZIjÍËÜ?kFd¹ú`oqG^%
u{¤j«UhýKýk½Oß]ï©þµ{¼²Ô/¬xe¨÷ììX<XÔí¹{âÉÃ'öúÄßoßÕêÖ·«î½©î«U¥*ªG}ì§©¾WæréØ{gÊâ{j?ÜS{ç¦,s ¼¶,
©þd¦;oËCnôWÎú2VaUåy¬?þ¿ÑÇ_F¯tæÕèòç?[îsñáRPwt¨;¤/OÿöÕidzKyùÄçÉìõÇù»ßߨÎãÙÿ«¶«}¾-a[ÂR,ñÐKÝs_;ÄßÎÖÒôÇ»ø[yÍq²y¿müæ8Ýs/6`ýMIa-¹WOïíá÷ö×Ãïíoîí2óÀ¥1Ô!uz÷ã²=²îìWÃÀz=·ÞÃ[ë=ý{4ÍÕ)gËGµ3
-Í7G[;¼^õ5¬ëÕúh[XÌ6²È¯¢4ÓÑ~ß©zrµ/MÔÖgÉ|©¼yñÅÕÞÂËÜ8ðæÀ±¼^=bS·øa¬ö..Îëxúz+lcózÈ^ÆYåÉ_±õ³ªÁfõà;W_}~W5XÇgßß¹³©þºXÕ
-Oô$¼ûºoÇp1-ôzÉ׿¥yñÑû57k/¿:ùðÛõl2
-¯ó5Gâù:ªuµÁÄAic{}¸øðÁªq&~¤mørqòÖö±¶ 5»^=¾ktU¿ë`Ï®ú]½=»zõ»Ê=»ÊÚ]¯&ïz5©ß5Ú³kT¿ëpÏ®Ãú]ý=»ú»~}¥_g˺y-"kZªùèìýÅÅç×Ö:Ò:ëÄŽ^_Jh%4}ÐuGÙúC¯ê_ø¥µü#°õƶG¿m¸y´t4*iu´hóhcâÑÄúh£þ£Ù«£Eróhñ¾éR%ë£ùÄ£i4Ø<Úx´_zµy´èÐûom,¬Ón&;<ZøÛ{ÖæÄ$ï3¿¢b÷CÛ«ôB;Á;®éf»g.::¼ [k@~̯¿ÌRéÓw:ÏʬR=²²~¨¦ÞÕÔû¡mÈMÚãìm'*£ÍR~ÔcÌñqWãØ ê_Ð(
-½eɦUN!ô¥:Z)9Ð[}@Z¬ô+ýÅJ`±ÒZ¬ôp±ÖÜ®QgINŠѣ~íj2+{+ÏæÃ&4ètX¯á:Ù`ï8]v¹¦OËh=¾3ª%ú±·òϽ»û.Á=+ÃYÂÈ䩼q¥Å6è]\ío?öb5 MÜ5éB2P8³,%f{V¨K]Üü%ȹÇ-<Kòê=é¼ÌØj¤ÉØ Kê0bÃ$¶q¸ÚêãÍ6gؽ' Xæ«TrD!ZíÚ.CtimDcæjø©)B2¼,ÝÆ¾ºÐa
-È4ÚÌaÀ%@G
-qC*ü:
-ÏÀdI§kkÓ)(àW¥Ü¦à¼ã(øt(µ¬ÓÁ ?MÓhé{ëw6Nᨠ`
×péG¯Ý57¼ªî®®¯îû7
+ Ö9K ì]moÛ¸î×_A`¿ÌÅNzù&Ê.MÝ´
+&fd{/E¦c¡¶¤+ÉiRì_RGòÄÈð<D£ZHJÉsHõäLðâ´øÛ=+ø§Ä÷pùp^ð©1'ì
+&böyû*Ð*æyd½¹¾In¦Q¼å:å6
+d½ùOó4ÞÞ]ç¡,ò^'ß#TÉÌ=0¢äÏ|ì½A¸ë¬ãò?ü»Á;ÿyøï¿ÅÄ
¢A¥IQ£ÿGá·ó £,D
y&ÑÉß¾ ÏókT$èøâ'Yq Ò#oñ2òÏÃÃJ,}¥õXöËTì²tG'èR8&7ÌUqCôõ7xNÑß?FTÇßSO~:Ï¢YÝÿu5éÿEUüC'MZ&}!Ã$UW¥äOåæõ§òb½z¬xõXÿ)ÖW±oäì¾¾éÒ¾Eg÷YtHð'ôaLϳ¤HÂd~= ÔéÃóÁÉñaï¨ZèÞSÒ½zÆý§Ø~=6x
+ê±£õUê*þ'ßc4·Q(ã,¨ÝHÝx]»6»1¬ÝÈÝ8ªÝÈ7Ò&Õ´Ñqª/±b:ÜçQLÑip/³6×Rô^"©¥(=©ËÁovcU²¡äIU²¡äIU²¡ä¬ÝØLòd\»qäëU¦_¹qÜðåPþüF²³^_3xN£øÛCù*o¢\]¯~¯ÀL¾&ó"oÊ<[Fù}<©e²©æÃ§:Þ«æ¹,E6Ouw\dÉt*³JÜ({Uè:âàFÎd\<=H-ýojmúÎO¾¯ë"T7t¶d±¢;²xx#è¢y^föõèbK&ké¼#Ëw1õÖ¿þËLõ!åßÉp¾8³ìDÜoLK¬OëÃÙ:o¢XÖ®_+-ׯ}Ï[®_ûʶ\¿¶áÛrýZ
¶åúµêjËõkµÔÆëõïÿdð`tuñ]}¬0ý[µ!ÖKdK
+^-
µ2Ú¨¥°ö©S è¸$q½íE|þæ£(ÙÜ$
O¿ë^z=Áõ|ïø=úÝ×Q~Å÷$û¦SÖí®º¤Y'ý¥)eæË2µ«õ±£zìîìUÕÄ~íª"ÛÐÁÝ«¥ÐºÞTC> ^Ö_SÃîMPí©·<G©V¼GGèäÃñæZ9^ß-R¹8{¯tÈú{ÿ¡ï]ÛR-î¥KðGäͰ:ÿfI¸IÀfóD`L ÿ!ù?¨É?LçQ<NºÌcûüaÌ+å¯FIÌWòçóV e.ó<ÉþòNÎne<J²a4R¿>ÉXÕY¶ªV q0¦÷*FÌþEý>üÅÁL>Ý´h?úúW48¿Zi^ÿi«}Ûg>ÿ8P]ã4UÃ-TÉÙç:]âõUã0'åÑzô)úåýAº%ytDwëKÂDõéUDù@:I}BGñ ÂEQL.NçÆé\ÇÞË\ÿw(ïBêÖÿáæÆMåzxu=9ø>^>
+TþêºÝΤRq(Í%*òÍò¥D3¥ò»^#ÊefE¦bntLÂYr«.+ômL p:Îó j¼¦ÍîÐøN%«dÕ?ªþ IJ¯Õû\½%;©{ÂMgêÑcU½ãb¨¨AÏ0Ùx¦ÔY*¯stÒÎd:¼IJcG¢^J¡Q>Ó©z;$s
ÎLKtW¤êUduÉâ 5cªÁå4*ïh\'7É,JõÛ÷zB¼íùËçz©àitëÑéâd0)©ååe¥ð0R}»-Eÿ3â½ÅÛ(+æÁô M¾«~Êìqûîà`µr×V¹ÉæÊÝ[S¹{P¹÷Z¹½·þW¹ék«Ütc妸^¹Õ9¨Ü¯¶r³×V¹ÙæÊM×Tn
+ûõVnþÚ*÷>·¿¦[âCåÞwåîÿaÛ{m{K»¿¦r÷¡r¿Þ[¼¶Ê½¥ÏMÖtKTî×[¹ý×V¹·ô¹ÙÊÍ r¿®ÊmfýÏýg&gví?ê¿~Õÿ{Ìû
+ÉÙeRÓwV`"¨OÑ·÷*æc&å»eÍ© ´§cÞÏÇcõ2c´cd_èæïè){¸ß+ï¹ø¤ÕXuÌQXD·OÙ¨"ø(cNâàY'=âÑej+Å&Ø£?æ³RlEóA5÷+ëØE©Ï¢B^á·ÕØEÙâ$>WÈã³rì³ò³ M=ñüÅ{»×ϲa¾z 2æ«§A4®§òQÊhÏÅU-âåöø"û¥¾á©|ñv~ýx1¼Òmú2µÇR¿Oæq(?ê"æñI/géó{Él§úó®Ì_`ÖãO1
+.Ê{ú²l¿ÍIÂAhómßg=&üÈ«üá-QÑó"zLæñ·Û¸èÓç7²|ãÃùâÓ+Â]=ý5¿9}1ÏÒg§S}Z)ÅIù²nȰP2åË:à?<ýc=+ßfT÷<TÌÍÜnPkÿU
êzÐöö_ÔìÿØ'ÐþÛî#B Q<<Þï©Kx êj(Q¤Æ¹=¬®ôUYµ^qâûHÉ!u]^E·¨ºJ¥K|}¯Ó¢\©D{dyELxJµôa*{ujÇõINá)åñp%C¾úUe®>íyH!áãåE\qUÜ+¯òÕ,¯ñ´QÍ>,J¦z ²zÕW¨(%e¹8õ|Ĩz&$Á¼¿¼T=<VoÈë«F-´¯ÊÑë#ýåUQ\dZ
+ôú྾¦×ª:;ú?àYðÆlù®½ @ @ @ @ i ¾¿& ê÷´÷çªCDé&B8F}í)±úC@¤Ç{Û²8»B%¦îà;¸.¢TwRû¶tÚ9"S\þÎÙ<õ&äá÷õ4 ¿ÉJ®êÿ³êÿßç{Ù¼Ùþ?XPâûR½ÿf°ÿTå¿Ø«ÛzÐ^þÚÇäoävS
+ZÉ_hÿOò·òÓùËë@ÃýßVü
çü üµ;ì*A+ùs¢äïsò·¦ò/´ÜÐØ¤"´¿Òÿèn ÈßZË¿d2
+
ëlä¡Ì7¯ÿÃJ÷WäÏÏaý
+,eðóKþÃù+Y
+åZó¹êzá·àF£Ñ®<vñcZá¿G|ü·Ìuù¯·ÐhÀùU´ç?°þß(ðßiñ¿Mïߨÿaÿw;è¤ÿ?C+ò'ÅKÇÿÃiïÚ/b·þçÕþ?g°ÿÐp×a¼Lÿ7a¿ÿ ¡ÀÀ>ðßa4å+rH³<4÷ìÿWÿÅÿòrà¿ÀüÛhÊÿr¿Û©4òÐoäÿ}R¶Tï ö_h+½= díªA3ù?ÿ¥>øZ¡üG2ç±³ÿϪóÿ0úßç'èãÇÏèä×ËãStöûÑÉ%Âw¬î)x0äÿ<nvò*ÿU ü·Ñ×kXz0püª¿qxß,öóLx ÿÐô.Ãÿzbã<vëÿÿ ðß§}Úç>ÚaÈý¯ÆyìÖÿÆÿ@{§aÈÿòkMó0èÿ3þV at 1ôÿ]ÿûû
+Ê¿cûOmþPhÿ`ý#0ä·öìÕí?àÿeÔ÷Àöã0ùß±ý§6ÿ#`üg:
+Cþwlÿ©ÿúõV@G
«0äÿÞí?ö±ôþ!ÿ;¶ÿÔÇÿ°þËË0â?µ`ÿõ_V`(ÿ½¯ÿ¡°ÿl°ÿPP
+nÀÿÛDÝþã?+ð=&` waÈÿ½¯ÿá ÿаßaò¿cûOÝÿæì@{Z{À&`Âÿû·ÿþ·~!ÿ÷¿þô¿¨W
+Ã0â?¶`ÿa`ÿ±CùwkÿQ½çû¿Âúo[_|8=F/_ÑùÓS¤JpüïØþS³ÿ2ü·èý¹
+Cþwlÿ©ñ_pØÿÑ
+ÿnÃÿÝÚêüõ? üwüߣýg1þ§0ÿkh !ÿ»µÿýþ·Nû¼/|Ú÷ p-ø?Îä¿öøý§Uþë_`ÿ±¶òOâñ¨ME0°ÿùêÈßå³Tv©Áö<´·ÿ±ºþÃãàÿaT¿~Pý΢þgÁÝæ<v÷ÿ«þßaÿ·ò hÜDWüßÂõÿ°ÿ ¿Ó0æt'Æêêá4 F[òØÝÿ¯ÚÿöAÿ[pßmóI&óI2ÝÆ}Ýü¯Îÿ{°ÿ·%ô pÆü/-yp+×Q°íõ¿'Àþo@·Ñÿy£þYp7Ô'ä±ÿµý¿9õßv@ûÚÖ«0åpDÓàz*7ÉÌâd9vÎÿñ*ÿ
çÿ,ûs¨|¾4%Je6N2uRýÚ
W¶ü×~ñ8Ñþô»ïpÆaÿG+ ^_þwmùÇ2,äh¨N4¥Ãnû_}ýþ¿ÀÞ¯n£-ÿ3©þ¶¢¿ ÿ¹úß
+ÿnÃtü¿õ7Éc÷ü_Õÿ3úß
+ãhÜÄËçÿôé¹ÃHn¢Ç.ýOxÿ>V§ÿð0ÿÔQG¿ÏÊ£Ð?ÕÑ{g}^© åÐ>~ß+=AË£Oûåq1¯ ÿÏalÿk9ÿ×Úþþ¿V ónÃÿ¹,òTÊ]®%vó¿êÿÏ|ÿÅþcçó4M²BþZç`ÊÿpíÕþÇ ÿo ÿÝ)ÿGYtÛt Ýü¯~ÿc
+ë¬ ÓèðA¸Ð¸cÿþ¿mõ¿û[øÿº¦ü/&2S½æ/)©ÜßþOåþ
+ØÿÉå&ó¸hG;ÿRöÿÀþkÐò»Æý¿ ´jôWЬýÇb®â)ö°í¿
+´äm[
+Úëâcò·#ùçÑæ»¿7Ñÿ^EþÔýoêMÿ] waÄÿtrG¡
+(ÂÈadETDÉFî´ïÿÿ· ¿Ó0âqvªÿIµÿG=Ö[ÁU# îß®ÂÿSy+§Íóh¯ÿ©OÁÿÃ
+(0ßiñ?L&2Óß] vMìæõûo`àÿaCà2Ìæÿ&A¶X®|§p7ÿyÕþçØÿÑ
+èϰÜeñÿ{pñ0Èó$"º-ß7ÿ£øo=`¿Óx©þéÎ<vñÔæÿ¸úß2øù%ÿá0ø³Âÿñ|v-3ÝÐË@wæaÐÿ`ÿ³À Ë0à?¶àÿ%|ðÿ³#ùwîÿUmÿ)ôÿ,QpÿrFü·áÿü·ðÿrFüïÚÿkÿ·ü·A@à.øoÁÿöÿ·ÐÿnÃÿ6ü¿ÀÿÓ
+ÀÿËmÍÿYðÿõV þ_nÃÿ6ü¿ÿV þ_nã¥úoþ_À+XÊ ü¿Üÿ;÷ÿªÿ¹ýí ÆÿnÃÿÌÊþ_ü¿lÀHþûºýæ Gúàæ0øoÃÿì¿V ö_·aÄûÁøÏ
+`ÿ/·aÄûÁü¯0`¾Ó0â¿
+ÿ/ðÿ¶ÿufóü¿àûïV}h ÿ;÷ÿªêAìÿaÜ?ÆKõÿÞü¿@ÿ[ÁR/òÿ¡ùÂÿûU×sÁàûÏV íÿ@^waÀbÅÿÿ
+É߯þ_Ðÿ³ØÿËmñßÿðß
+ÀÿËmñ¿sÿ¯ºþ÷ÿVpçE6uó
+-0â¿
+ÿ/ÿ±ÐÿnÃÿ6ü¿ÀÿÓ
+ÀÿËmÍÿYðÿõV û¹
+#þÛØÿøo þÝÆKõÿÞü¿ÿV°ìÿå&øoãû0ÿo .£ÿi[¯gÐoîÿ¥âÏ9øYASùIL{ÐZþ0ÂAþ6ÐZþÅ$ÁhG×êmÝ4z#íúÿZþ XÿeÐÿwùÿèûá·àF£Ñ®<v÷ÿi
ÿñÁþo`ÿwù&Yί¢=ÿ)|ÿË`ñÛ0ãÞ¿QÿsØÿÕ
+:éÿÃúï?-^:þoâ ´[ÿójÿÃ÷?ì üÜÆËô#÷?þû?Zìÿæ6ò?µ«¿Yá¢Õøý+ù?·ÑÿêO4J#? ÍðÝö_,(öIÙNPõ÷Àþ»´¿z[
lù¸fò6ÿK}ðÿ°Cùd6ÎcgÿUõ?#ðý;8 ?£_/OÑÙïG'ß1ý'`ÈÿyÜ4
+ìä?!Uþ3þ¿V úÄë<ÂÿSõ7·¬ù[Eûù?&8è+ 4½Ë0äÍOîÖÿ5þà¿0Î{¦Ð¸CþÇAü¶ÿÿmb tüOï2kAÿýÏ(½ï2øßò&ö½þì?û¡ü;¶ÿÔæ öß
+6Ø@)8Cþwkÿyöý¯û¬ÿ¶â¸î.ùß±ý§6ÿþÀ`¨Ó0äÇöêø©À Dx¸«0äÿþí?°ÿúNÃÿÛêãã+ @.Ãÿ-·5²ÿø`ÿ±Cùïýìÿeì?à
+èùß±ýGÔúÆVà{Ì@Ü
!ÿ÷¿þô¿À÷?Ü!ÿ;¶ÿÔý¿`þÇå{V8
+Cþïßþúß
+àÿá4ù¿ÿõ? ÿ@½rh ÿ±ûö0·öê×û°ÿ»Î¯N>£Á¯ÇèüËé)Ò?A%¸Cþwlÿ©Ùý¬ znÃÿÛjüö´à¿Û0ä·ö:ÿaý% ÿÝ!ÿ÷nÿý?ì`
+Ó0ä·öRã?ýoöy_ø´»8ügò_FyößßaÿaD
+ú¥TÿèýèÛvçãïNd6¦Ãb%EÑîC`ííSøþË?LæñîO¿h?þçXÀü¿@÷ßm4ÖÿA81ûúcÛï?ßõ0ößÚÉ?Gò®åêoýOÏAþ6`$ÿ<úÑæSлõuÿêþ·õ¦.»0â:¹Ï£Pô7áiQ%¹Ó¾ÿ/<Xÿa°ýÛ0âqvªÿkû*þ?VpGãH pFüÊ[9mG{ýO}ö?+ø?öζ¹mË÷óÚUó¦37I ¤ÔöÔ¦m§ÛÕvâÍÃÎÞÛ·KESÍYÔ÷§¿ %Ùä1uv²øÿª;²(þq C,ÿ´þãì*ÉMüïr Ð4Ьÿºÿ_ÿ±þ
O~·ÚüßU'ãþ@7 E£°Yÿõõß^è#þù<@`1$ýnQ6EEÅiT¦7iùÈZ Âü@ÿ ûÝ<Õþ_GóÆs4é_ìÌÿy>ì?ë:xþ?<"¾WHú-®/Üô ¤l¡ÿÀÿÇ/0h3ýwÌþDÿÿâTÿ½ÇÕÛþJ"üËfHúgÿÂúoÿe7$ý÷ÿõøoè
£¨ÐØIÿñ_XÿÁì¿ÝôÏÿ
øOÿe7´ù?ø/¬ÿ`ñ_vCÒ?GüôÏâ¿ìæ©öoñ_Ð?ë:@üôß{üW}üïë¿XÀøßnúW,ñ_xþ¤úï=þ+Øõÿbþ
"ÌbHúçÈÿÿ/ðÿÚ
+Iÿù¿0þcù¿ì¤ø/Ìÿ² |«!é#þñß,`þ×nhóûÿ
+\è÷EÀbHúï=þ«nÿ©ÿðO«yªýßWüì?ë:xRü×dFä;
¤ÿÞã¿êë¿=Ýþ90þ×^ú,ñ_xþ'¤úgÈÿ
þÈÿe7$ýsÄAÿ, þËnHúï=þk×þÐ?'³¢Ì±i¾ÑXIÿñ_ÿaößnHúçÿBü'ÿ²ÚüCþ/¬ÿ`ù¿ì¤ü_Ð?0ÿvóTû¿·ü_Ð?ë:@þ/;!éãùÿgAHd µvú÷»|maÞ>þKüE2Íâ¿h[ÿe6ϦÙå-åFè\ÿR(Óþ£þ÷Oçú/¯ò$ôB_ËVW¤[ÿßÔ¿§Bäb¡þ¿Dù÷JgýßÅþÍ£østÒqÓ9ûÿ²¦_÷ àÿ·Îú³¼æ7é®(øÿYþí¦ÿ.½RÿßõÿÇB/ý¬ÿþnyêø¿M P³ý÷êýùßxÏ}h×bfÿ[
ÿQôoºÐ?Èÿf7mõÍL¨?íFáA§ñ¿~Aÿÿí¦þõ?éxâ Âý¿n ÝPTínÿ?]ë__2éø¸võ¿5ÿ+Qÿ<ëqës4öÿUÝþ+ø^8oÞüê¼ýx|êýãõÉGÇýª\ô¬¨ÿE]¶
+4ê_ºþ@þg?~I K!êªÿŬùÛ¤ûü
+<ØD Ko3DýéuûÉÀfû¿£ýó ¼¾êB
+|ÌÚQÿ³¨OýoåÿÁøC< Òjúg_¼í9ýÿÒEÿßfHúïøÿGÂÿñþ{öÿìÌÿ
+<ÿü?0
+@Ô¿þçü?XÿÍð}$´¢þ{öÿìÌÿ þ
Ô
+VCÔ¿þ7ÿç¿¡ÃÁmõ¿ÿò¿°p·¯Õõß³ÿgwüïaüÏpá ²þ%ÿÏÿfXÿû_ÿü_,<àÿ0
+v@ÔÏþ`×ÿñ¾øÐº½õ¿ÿõ?°ÿ,àùvCÔÏëvã¿0ÿÃú}ýÐRúß¿ÿö
CÄX
+Qÿû_ÿûÏÂèßjHúwü?þõ߯ÿGîÆÿ!ÿ;çNNÃwïów§§y`Dý÷ìÿÙñÿ*ñ¿, ÷g7Dý÷ìÿÙÑ¿yþþí¨ÿ×ÿìÆyxþпÝõ¿ÿÖÿ²pÀjúï×ÿ#vô¯`ÿyðäС"ÄJ:è'ÿÜãó6õ¯ßÁÿÃB×úÏfãä:»Üÿ_¨Èõ_D×sóØQ®;ÃTðãϬ¯ÿð=Äð Íåé·~ô?º¾>|æþ=þ;P.æÿY«*@`'}éÿåÖjýcþñ[
+Yÿéå,ËÑLM³hüÈ9ûÿuÿ_à°ÿ,@ûvCÖÿb>*¯ò¤¸Ê¦ißЬÿúü¿üßLÐ X
+Yÿ°nÑE=.îöß$ôÏäo7]õ_ÄQ5꿾Ì6çhÔ¿¨û<
õß<È¡1`/TýG7Q:.¦Éè2»IòYö8çÿ¼ºþßGüëþSý¾y'Î<É'Y®7ê¿Ñ.ü§«þMàl ÿNöÿqÿß®ý÷ÿáØ{éªÿh2Iâ2ô¶rhöÿí®ÿèÿ³°_»éªÿ<1K;É¢/ýgú·êø=êosæù¿zü§ØÖã4vòôù?³yÌâ4yHMö_xuý®Bþ/Vóÿ~
+ª×p¨ª×À¼Õ¯þês5ôªWêUÈyá_½Y½rX½.ç0ø/Ùÿ×qþ¯³ÿñ¿,`þÏn¨ú/²'ISè_E³þëñÿÂó_xø·Å¬XÌçY^&ã¿£°ªþãE¾Wÿòÿò ûo7Týóô¦m fý×ÿí¹ëXâyúbU¹hìÿÓ1þ·süò³ø_»i«ÿò*ɯ£©Yóå4Ùoþ'åøäÚ?äú³Å¬lwîñ ýg-¿Ý´îÿEñU§Fví¿H7§?®ï"ÿÝê?¯²ëmÐÝþÝ'Eýs@ªÿ"ý³}ö÷6ö¿>ÿ#}Øôþ
+] {!é~u[¤±
+hÁ$£yifj§{ÿ?ð±þñ[
+Iÿåí¼Wû¿3ÿ+}äãáÓ,¤ ¿m
¤ÿ
irLÛ£»ý¡Dþ$o5$ýÇÙUç¿. MÓÍúßÉÿ(äc!ðÐ Ømþï*ÊkÀuP4zõïÕýaõ,çXn3$ýnQ6EEÅiT¦7iùȳà óRAÿ, ~«yªý¿æçhÒ¿ØÿôaÿyX×Áó§ü!1ð½BÒÿlq}ä¦`6ÐÿàÿãÁЮÍôï2Äáù¿Lê¿÷ø¯zû/ÑÿcBIÙIÿñ_Ð?ÿ²þûÿúFüwý³p {!é!þK`ý°ÿvCÒ?Güâ?Y@üÝÐæÿâ¿°þÄÙ
+Iÿñ_Ð?ÿ²§Úÿ½ÅAÿ,¬ë ñ_vBÒïñ_õñ¿H¬ÿbã»!è_±äÿÿâTÿ½ÇÕÿ"ýó¿,Ä`CÒ?Güü¿,Àÿk7$ýsäÿÂøäÿ²þ9òaþå[
+Iÿñ_ÿfó¿vCÿcÿò Ü! !é¿÷ø¯ºý¤BþD ùÛÌSíÿÞâ¿`ÿYX×Áâ¿&4"ß)$ý÷ÿµóü÷@Ð?ÆÿñÚAÿ%ÿWø/HõÏÿý?ÿËnHúçÿþY@üÝôß{ü×®ý¡NfE/bÓ|£%°þ9òaþØ»!é#þñ, þËnhóñ_XÿÁòÙ
+Iÿù¿ `þíæ©öoñ_Ð?ë:@þ/;!éãùÿgAHd µúÏffï çè¤þE
+áÿãë¿ì¦ýïòo£ðöñ®Ñ¿ç!ÿmë¿ÌæÙ4»¼¥ÜÝê¿ÿUÏÿe¡sýWyGEz¡¯Öe«+Bÿ+ää¡ñÿ cïÎú¿ýGñçè2¥ã¦s4÷ÿëóÿ¾@þ7ÿc7õgyÍoÒ]ÿù@þ7»¡é¿KïÔÿw}Äÿ±ÐKÿù¾[:þo Ølÿëþ?ßÈÿÄzùyýoþKÑ¿pñüàÿ³¶úJQxÐzü¯?ÕôÏ æÿì¦þõ?éxâ Âý¿n ÝPTí®ÿÿwÿt}µÊ¤c8H»úßÿ¨õ?N¸õ9ûÿª>ÿ¯âyx}x~â¼yó«sòöãñ©sö×'÷«rÑ/°¢þEtÙz4Ш!êúW.ò°à»Aà*ðX
+QÿSýï,~dÍï&Ýçÿ@ÿ Þfú/ÓëöÍöGÿúçAyÂͪ+36BÔÿ,êSÿ;ù¿0þçâVCÔÿ<ûämÏAèÿ+ñ,Hý!é¿ã`Hþþõß³ÿggþWH´ÿ,<àÿQ°¢þûõÿ¸ÁNÿO@ÿ,Þ BìÖBÔÏþù ã?R7Z
+Qÿ=ûvûÿ
+ñ,¨@úº$ðBÔÿþý?ÈÿÂÂ!ܾVCÔÏþ×ÿõ_, !é_2øÿbýïýò±ðÿGÂ(ØQÿ=ûÂ]ÿôÏ
+ñ0k!êÿë ðü»!ê¿gÿÏnÿþ_7P¾èèØ Qÿû÷ÿÀþ³pø«!êÿëàÿaA_r4 CÒ¿»ÿOÂÿñþûõÿÈù_üï<:9:=vß½?vÎß:æ-L-õß³ÿggþG¹ÈÿÀzvCÔÏþýÿçú·¢þûõÿìê_(<ÿ
èßnúß¿ÿþ_Ñ X
+QÿýúÄþì?zà C¬ ¶úäÉ?Iç¨ü?aØàÿ1ȾRç? óüù²çû-,×ëç^%ùu4WyVÝÖÝÿ§\ÿÿßþ!×-fÍ~è>þ÷ô+ì?èþÛMkûÅW´§?v}þcõüWßøÿÐþïnõÎÆÉ׫¿»ÚSÿ"}Ô?¤ú/Ò?»<
+ºÙþûµú~øoôþ
+] {!é~u[¤±
+gÂæQ^¦e=¨ný£ÿÀGþ/þËnHú/oç½ÚQïÿi«ù>ÍÒIÑ
+X
+IÿÓä&¶?Gwû/Cø°üÓnHú³«$7ñ¿Ë@Ót@³þUMÿ~ ÿËBÄVCÿ»òd<Òè hô6ëß«é߬ÿfA=Ñ XIÿ_¢ÛbMFQQdqéMZ>²0ÿ'ôϲ¿ÙÍSíÿu4o<GþÅÎüçÃþó°®çOùcVä{
¤ÿÙâú"ÉM HÊfQúÿü<ø36CÐÇìOÄø/ij@ªÿÞã¿êí¿Dÿ %þe3$ýsÄAÿ, þËnHúï;þëñß!ôÏÂQTFhì
¤ø/¬ÿ`ößnHúçÿBü'ÿ²Úüßþã¿|¬ÿ`ñ_vCÒ?CüþY@äÝ<Õþï+þöu þËNHúï=þ«>þ÷õ_,`üo7ý«ýÆeüÿÇ©þ{ÿ
+vã¿0ÿËÂ@f1$ýsÄÁÿËü¿vCÒ?Gþ/ÿX@þ/»!é#þó¿,((ßjHúgÿBþ0ÿk7´ù?ü_xþ'îÄÙIÿ½ÇÕí ò° Èßfjÿ÷ÿö
u<)þk2A#òBÒïñ_õõß^ ñüOÿâµþKþ/<ÿRýsäÿBÿäÿ²þ9â¿ ÿe7$ý÷ÿµkÿCè
YQæØ4ßh ,¤ø/Ìÿ° ûo7$ýsäÿBü'ÿ²ÚüCþ/¬ÿ`ù¿ì¤ü_Ð?0ÿvóTû¿·ü_Ð?ë:@þ/;!éãùÿgAHh×fÚé?O®Q_÷
·ÿR¡Ö¿+Íó_ÿµ:Ô¼ÈódVÆyzäÎÑØþY«%àÿå!çéÈT/¬ôiùϲ|gíÎÑÜÿkú÷¤ü_,L£ñ8É!~[i¡ÿyZ÷ôstÿ-ûÏäëÿí¦þ³¢H/¦]">·iÖ¿_׿Rèÿ³à¾> {i×ÿï¼äoNó?fþWBþwÚÖͳivyK¹:׿Ê<ÿõ¿:×y'Ñxdzéì²Õi²ÿßðÿ*äÿç¡æÉ¥ý!Bà{¥³þïÖ~ΣøstÒqÓ9ûÿõø/_ ÿ7Xÿa7õgyÍoÒ]ÿùþí¦ÿ.½Rÿßõ°þ
^úÿÈÿ÷ÝòÔñ`Íö¿ÿé{ùYÏ1ýo3O³ÿRô/\Äÿ° ÿ¿Ý´Õ63©hç0
+:ÿÝ@¡ÿÏÆÿvÓVÿOYbÞìÿué¢j'¤pMüü¿û§kýë«U&ªÛmЮþ·æeøõ?N¸õ9ûÿªnÿÀúO^8oÞüê¼ýx|êýãõÉGÇýª\ô¬¨ÿE]¶
+4ê_ºþü,(¨;BîvBÔÿTÿ;Éù´I÷ù?x°ÿ, Þfú/ÓëöÍöGÿúçAùBxJ¤Lp6BÔÿ,êSÿ;ù1þçâPAö6CÔÿ<ûÒ>¡ÿ¯àÿãAºèÿÛIÿü?>ü?ë¿gÿÏÎü¯hÿYxÀÿ£` Dý÷ëÿÙyþ»R.Ö³à ,Þ¶¢þ{öÿìÌÿ þ õ[
+Qÿ=ûêã?%Ö° tÍø[!êïþü/,bÕõß³ÿgwü¯0þgA¸p ÙIÿÁÿÀÿñþ÷¿þù¿XxÀÿ#aì¨ÿý?Á®ÿã?TXüc1Dýïýì?xþ«Ýõ¿ÿÖÿ²0Â@k!êÿë`ÿY8ë×júßÿúøXÐ
+Åôï2ø<ø8 Ö¿þîöÿÿ
ÃóO'G§ÇÎá»÷ÇÎù»ÓSǼ
I°¢þ{öÿìøü, ÷g7Dý÷ìÿÙÑù_ »!ê¿_ÿÏ®þ±þ èßnúßÿú¬ÿeá
+Õõ߯ÿGìè_ÁþóàÉ¡7B9Äc ¤þ'yòOÒ9*ÿO6ø¯¤æùOÂäÿ/{þ±ßÂrý·~þçU_GÓQygeÙíA`ÝýÊxþäú³Å¬ùѯÝÇÿ`þtÿí¦µýâ+ÚÓ»>ÿ±zþ«¯´ÿt«ÿt6N¾v\ýM±ÿ"êRýé]Ýlÿëù?¤ûϾҿ¡`/$ýϯn4Ö£óLøÑ<ÊË´L³µÓ½ÿøXÿÁÒÙ
+Iÿåí¼Wû¿³þS[%Äÿ°ðiNÒdVÀRHú&7É´ý9ºÛ
+øÿXÀòO»!é?ήÜÄÿ. MÓÍú¯ûÿý@bý'ûj5´ù¿«(OÆ#ýn F/`³þë뿽ÐGüâ9l¤ÿ/Ñm1Ê&£¨(²8Êô&-YDÿúgÙßìæ©öÿ:7£IÿbgþÏóaÿyX×Áó§üG~·ô?[\_$¹éIÙ,
+Bÿ?ÿ_@»6CÐÇìOÄø/ø/Hõß{üW½ýèÿ1¡$¿l¤ø/¬ÿæñ_vCÒßñ_ßÿþY8ÊM½ôÏÿ
õ,ÀþÛ
+Iÿñ_ÿdñ_vCÿcÿÂúÿe7$ýsÄAÿ, þËnjÿ÷ÿý³°®ÄÙ Iÿ½ÇÕÇÿ^ °þÿí Åÿ
çÿ±@ªÿÞã¿]ÿ/æY!"À,¤ü_ðÿ² ÿ¯ÝôÏÿã?ÿËnHúçÿÂü/
+Ê·þ9â¿ÿÍæí6ÿÇÿBÿ¸/B4 CÒïñ_uûH
ü, ò·§Úÿ½ÅÁþ³°®'ÅM&hD¾SHúï=þ«¾þÛ¤þ90þ×^ú,ñ_xþ'¤úçÈÿ
þÈÿe7$ýsäÿþY@üÝôß{ü×®ý NfE/bÓ|£%°þ9â¿0ÿÃì¿ÝôÏÿ
øOÿe7´ù?ø/¬ÿ`ù¿ì¤ü_Ð?0ÿvóTû¿·ø/è
u ÿôÏðüGøÿx@m¦þ½®!_[
·ÿÑ¥<O!þ¶õ_fól]ÞRnÎõ/
2í?êÿt®ÿò*O¢ñ¨H/ôÕºluEºõÿMý{*Dþ'zéÿx¿W:ëÿ.öoÅ£ËdÎÑÜÿ5ýû"DþG \»é¬ÿ8ËÛh~îúÿú·þ»ôþIý×Gü½ôÿ±þû»å©ãÿ6@Íöß«÷ÿ=äãÁ} yýoþGÑ¿páÿcùßì¦þ³ õ§Ã(<è4þ×/èÿ³ù?»i«ýO:&¤8 £ðfÿ¯H7U;!µùÿ
®õ¯¯Vt|\»úßÿ¨õ?N¸õ9ûÿªnÿ@ü?¯ÏO7o~uNÞ~<>uÎþñúä£ã~UðØQÿ"ºl=hÔ¿uý+üÏ,n8ðÜc)DýOõ¿³ø5tÿSûÏ`ém¨ÿ2½n?Ølÿwô/ '¯¡pÀFúE}ê+ÿÆÿ¢ço5Dýϳ/IÞöþ¿ÿé¢ÿo3$ýw|Éÿ#àÿáXÿ=ûvæÿÃÃþK ê¿_ÿîú°þá©P!µõß³ÿggþñL(¤n³¢þ{öÿìÆyÈÿÂP/·¢þ÷ïÿAÿ
CßjúïÙÿãïú`ÿY.@6CÒ¿dðÿàùß,ëÿëÿ
ü?FÁúïÙÿÀÿóßÄPJSÀöBÔÿþ×ÿÀþ³çØ
+Qÿ=ûvã¿0ÿÃøC?;!êÿþØÑù·¢þ÷¿þö}ÉÑ XIÿ.ÿÇ
ÿbý÷ëÿ;ñÿùßy8<ÿtrtzì¾{ì¿;=uÌ[[ ê¿gÿÏÿW¹ÈÿÀzvCÔÏþýÇÀCÿ@ÿvCÔ¿þ]ý
ç¿° ý
Û
+Qÿû÷ÿ`ý/h ¬¨ÿ~ý?bGÿ
+öO½aÊ!Ò¿ZIýOòä{|þÓ¦þ
y$4ü?tÿl6N®£Ù¸Ë@ðÿ¡úç\ÿEt=7ÏåºCðø9L?þüÇúúßCüÒ\~~kéGÿ£ëèëÃçhîÿ×ã¿åbþ±ª4vÒþQaý§Ö?æÿX¿Õõ^β<ÍtéÑ4Æ£¹ÿ_÷ÿnûÏ´o7dý/æ£ò*O«lúö
+Íú¯ÏÿûJ`üÏÂ
+Õõ_y è&]¤ÑãÂènÿý@Bÿ,@þvÓUÿEU£þëèëÈlhsFýºÿÇSXÿÍÊ3 öBÕt¥Óèb.³$e£qþÏ«ë?ð=Äÿ°°îÏ9ÕïGqâÌ|åz£þíÂÿpºêßÄÎ&ðïdÿ÷ÿíÚùYþ0ý·®ú&$.ñHoh+fÿßîú?þ?o5]õ'féo'ùSôï
°ÿ,@ÿvCÿ¯GýmÎÑ<ÿWÿóT ûÏÂzüfÀN>ÿg6/Y&É£ÉþdÏÛú]
ü_,¬æÿýT¯áPU¯y«_ýÕçjèU¯2Õ«ó*C¿z²z
+å°z]Î+`ñ_²ÿ¯ãü_gÿâYÀüÝPõ_$e1O¦Ð¿fý×ãÿ=
ç¿ððoY±Ï³¼LÆG+`TýÇ|¯þ?äÿåößn¨úçéMÛ@Íú¯?ÿÛs%Öÿ°ÅóôŪrÑØ9þ§cüoçøäÿfñ¿vÓVÿåU_GS³æ/+Ëi²ßüOÊ5ñÿÈÿ´ÈõgYÙîÝã?<7@ûÏZ~»iÝÿâ«NþíÚ7n(ÌôàÏwÿ
nõÎÆÉWÙõ6ènÿE¨Hõ_¤¶ÏþÞÆþ×ç¤ûϾҿ¡`/$ýϯn4Ö£-d4ò2-ÓìAítïÿ>Öó ~«!鿼÷jÿwæ¥üo<|¥4Aø·ô?Mniûst·ÿ2ÈÿÀò¤ÿ8»Jróü×å i: Yÿ;ù
üo,X j5´ù¿«(_®×
+@ÑèlÖ¿W÷ÿ
Ö°à>G`3$ýnQ6EEÅiT¦7iùȳà óRAÿ, ~«yªý¿æçhÒ¿ØÿôaÿyX×Áó§ü!àEø^!鶸¾HrÓ0Ë@ÏAèÿðÿñàÌ ÚAÿ.KüâÿX Õïñ_õö_¢ÿÇÿ²
þ9â¿ 0r³þûÿúFüwý³p {!é#þë?Xý·þâ¿$â?Y@üÝÐæÿâ¿°þÄÙ
+Iÿñ_Ð?ÿ²§Úÿ½ÅAÿ,¬ë ñ_vBÒïñ_õñ¿H¬ÿbã»!è_1Ä
zâ¿ Õïñ_õç¿H?Àü/1DÅôÏÿÿ/¹Ù
+Iÿù¿0þcù¿ì¤ø/<ÿå[
+Iÿù¿ÿÍæí6ÿÇÿ¥ Ü! !é¿÷ø¯ºý¤BþD ùÛÌSíÿÞâ¿`ÿYX×Áâ¿&4"ß)$ý÷ÿµóü÷@Ð?ÆÿñÚAÿ%ÿWø/HõÏÿý?ÿËnHúçÿþY@üÝôß{ü×®ý¡NfE/bÓ|£%°þ9òaþØ»!é#þñ, þËnhóñ_XÿÁòÙ
+Iÿù¿ ~»yªýß[üôϺÿËNHúçxþ#æÿY@m¦
þüñ¨¸.Góì}ݤ³ËZ0
+ÚöÿU¨õ¯<äÿçÁ
ú¦ýïüÈ×-Âã?Ý@º¡Þ.BOwÿÉ@Ûú/³y6Í.o)7B»ú_÷ÿ\ÿ«DýsйþË«<tw ½¶ítÿú÷Tõ,`üo7õû;âÏÑe2JÇMçhÿËþ} þ(×n:ë?Îò6ߤ»þ%ÿÇÆÿvCÓÞ?©ÿïzÈÿÌB/ýäønyêø¿M `³ý÷êýÏÿáñvó4ûß*ü¢á"ÿ+Èÿh7mõ¯ÿIÇÓä4
+oíÿ3Û¥~ÂÿÃA×ú×W«L:>®]ýoÍÿÈ ùX Öÿ8)âÖçh´ÿª>ÿ§ÿÀÃëÃóçÍ_·O³¼>ùè¸_æí¨ÿE]¶NÒ¨!êúW.âYP¾?p@°¥õ?ÕÿÎâGÖümÒ}ü¯ÌôÏ`ém¨ÿ2½n¬Ùþïè_@ÿ<Èp¨[1P
+i m¨ÿYÔ§þ·òÿ`üÏÉ! i5DýW+ÛÐÿW
+ñ?,Hý!é¿ã Hþþõß³ÿggþW´ÿ,<àÿQ°¢þûõÿl=ÿkåÿÁúO¤Px¨Åõß³ÿggþ'ÀøLûÚ
+Qÿ=ûêã?%â¿YÕà1à¶BÔÿÞý?xþH a5Dý÷ìÿÙÿ+ÿY0ö-½ô/ü?>ü?ëïëòÿ°ðÿGÂ(ØQÿû÷ÿ`þ
Àó±öÇbúßûúûÏÿa7Dýïßÿõ¿,¨ÁP<ôöm
¨ÿýû`ÿY8DüÕõ¿ÿõ?ðÿ° /9 !é¿ããÀHþÿÄúï×ÿ#ÃÝõßÈÿÌÂáù§£ÓcçðÝûcçüÝé©cÞÂ$ØQÿ=ûvü¿ÊEþÐû³¢þ{öÿìè?Àü/пÝõ߯ÿgWÿXÿÃôo7Dýïßÿø/Ñ X
+QÿýúÄþì?zà CítÐÿ$Oþ¹Çç?mê_þºÖ6'×ÑlÜåF øÿÐEýs@®ÿ"ºg@rÝ!xü¦GûÿÁÎó_ÿÁ4¦ßZúÑÿè:úúð9ûÿõü1ÿÏXU ;éKÿ(§Åü_Ýþkýcþñ[
+YÿéåÌ< ~¦K¦Y4~äÍýÿºÿ/pØ }»!ë1WyR\eÓÇ´ohÖ}þßGþo&h ¬¬ÿÊXD7Éè"Fwûïúgò·®ú/â¨õ_G_GfCs4ê'ÿ§°þ9!f ì
ªÿè&J§ÑÅ4]f7I>ËGãüW×à{ÿaaÝsªß7âÄ'ù$ËõFý7Ú
ÿátÕ¿M23áßÉþwËÿä)
üÿ,ÀþÛKWýGIÉx¤7´Cwý«À
þYpáH·®úϳô·ü)ú÷øÿYþí:þ_úÛ£yþ¯ÿ§ÿÂüëñ? ;yúüÙ¼Hfq<$&û/¼ºþCW!ÿ«ùG¿Õk8TÕk`ÞêWõ¹zÕ«Dõ*äÀ¼áЯ^¬^C9¬^ó
+@üìÿë8ÿ×Ùÿþ?ÿ³ªþ¤,æIÒúWѬÿzü¿§ðüþm1+óyÉøïh¬ªÿxïÕÿü¿<ÀþÛ
+Uÿã<½i¨Yÿõç?z&%ôÏ@ÏÓ«ÊE#`äøñ¿]í¿üß, þ×nÚ꿼JòëhjÖüee9MöÿI¹&þùö¹þãl1+Û£±ýßYÿå¹ÚÐòÛMëþ__ujô7h×þ»tC±Ô¿ë»í?Ýê?¯²ëmÐÝþ ¨Hõ_¤¶ÏþÞÆþ×ç¤ûϾҿ¡`/$ýϯn4Ö£-d4ò2-ÓìAítïÿ>Öó ~«!鿼÷jÿ7çUXÙÿþ_>ÍÒI üÛVHú&7É´ý9ºÛ
+ä`ABùVCÒ]%¹yþër Ð4ЬÿüDþ7
+ÍÐæÿ®¢|¹\7 E£°Yÿ^Ýÿg¦¡Üçh l¤ÿ/Ñm1Ê&£¨(²8Êô&-y<aþOJè
Ôo5Oµÿ×ѼñMú»ñ>ì?ë:xþ?¼ß+$ýÏ×Inz fhã9ýÿ þ?|@!èßÝküWåÿA þRý÷ÿåíøñü/DøÍô¿Ïø¯Jÿ/¡0r³þûÿÚÿ^ÇAÿ,Ee&À^Húßgü×Rÿ¡@þ`ÿí¤ÿ}ÆUú×ìÿbñ_vCÿÛcüW¥/°þÄÙ
+IÿûÿZÎÿIäÿçñ_vóTûß{ü×Òþû°ÿ<¬ë ñ_vBÒïñ_õñ¿H¬ÿdã»!è_±äÿRÿâTÿ½ÇÕÿb £ýç` ³þòIøXÀÈÍnHúßgþ¯µýGþÿËnHúçÈÿ
øOo5$ýsäÿÂú0ÿk7´ù?ü_ÿfÁ}¢°þ{ÿªÛÿ@ D ùÛÌSíÿÞòÁþ³°®'ÅM&hD¾SHúï=þkçùïDü'ÆÿñÚAÿ%ÿÿÌ©þ9òÁÿËòÙ
+Iÿù¿ ÿe7$ý÷ÿµkÿCè
YQæØ4ßh ,¤ü_ðÿ° ûo7$ýsäÿÂü/ÿ²ÚüCþ/¬ÿdù¿ì¤ü_Ð?P¿Ý<Õþï-ÿôϺÿËNHúßçó×ù¿0ÿÏÈ j3-ô_håG×ñh}Ѫ/¢tvÙE
+FáA§þ¿xþ.Ôo5íìØ5äs£ðöùÿä_t)ÏCü'më¿ÌæÙ4»¼¥Üë_
+%ÿ
Îõ_^åI4éÅ´m7 Óø¿ªO
ÈÿÀB/ãÿÆß+õû;âÏÑe2JÇMçhÿËþ}"þÌÜÙMgýÇYÞFót׿4Ë@¡ÿÍnhúïÒû'õÿ]äà¡þ?ò?|·<uüß& °Ùþ{õþ¿øÔsä³§ÙÿVá¿ýäæùí¦þ³YêC;Qxkÿ¥ýþ?ÿ³¶ú×ÿ¤ãiB0
+oöÿºtCQµR¸a ÿ/]ë__2éøÈvõ¿5ÿ+ÿbý"n}Æþ¿ªÛ%°þ×ç'Î7¿:'o?:gÿx}òÑq¿*ÄÚQÿ"ºl=hÔ¿uý+ø|á Ë -
¨ÿ©þw?²æwîó*ðaÿY,½Íõ_¦×í'íÿþôÏRCßÓÍ?¢°¢þgQúßzþÆÿ" Ðjú¯·=¡ÿ¯àÿãAºèÿÛIÿ Còÿøðÿp@¬ÿý?;ó¿B¢ýgáÿ%õ߯ÿÇ
+vý?Ð?CObæÇbúïÙÿ³3ÿøO&þi5Dý÷ìÿÙíÿ{ÿ`!áP®VÀNúß»ÿG"ÿX b5Dý÷ìÿñwý?ÈÿÆpá ²þ%ÿë¿X Öÿþ×ÿ ÿø$õß³ÿ'ÜéÿIèå*_»õ¿ÿõ?Ð?xþÝõß³ÿg·ÿÿ/"=é)t,
¨ÿý¯ÿýgáñVCÔÿþ×ÿÀÿþäh ,¤ÁÿãÁÿñþûõÿÈù_üï<:9:=vß½?vÎß:æ-L-õß³ÿggþG ä`½?»!ê¿gÿÏþÄÿó ýÛ
+Qÿýúvõ/<<ÿ
èßnúßÿúøY8D`5Dý÷ëÿ;úW°ÿ<xrè
+P±ØJ:è'ÿÜãó6õ¯ßÁÿÃB×úÏfãä:»Üÿ_è
+Ô?äú/¢ë¹yì(×ÇÏa*øñç?Öóùâ?xæòÃô[K?ú]G_>Gsÿ¿ÿ'P.æÿY«*@`'}éÿåòjýcþñ[
+Yÿéå,ËÑLM³hüÈ9ûÿuÿ_à°ÿ,@ûvCÖÿb>*¯ò¤¸Ê¦ißЬÿúü¿¯Æÿ,Ð X
+Yÿ°nÑE=.îöß$ôÏäo7]õ_ÄQ5꿾Ì6çhÔ¿¨û<
õß<È¡1`/TýG7Q:.¦Éè2»IòYö8çÿ¼ºþßGüëþSý¾y'Î<É'Y®7ê¿Ñ.ü§«þMàl ÿNöÿqÿß®ý÷ÿáØ{éªÿh2Iâ2ô¶rhöÿí®ÿCþWB(ßjºê?OÌÒßNò§èßaÿYþí:þ_úÛ£yþ¯ÿç©ö
õøÍ<}þÏl^$³8MGý^]ÿ¡ë!ÿ«ùG¿Õk8TÕk`ÞêWõ¹zÕ«Dõ*äÀ¼áЯ^¬^C9¬^ó
+@üìÿë8ÿ×Õÿõÿ<`þÏn¨ú/²'ISè_E³þëñÿæ/è[ÌÅ|åe2þ;Zë ê?^ä{õÿ!ÿ/°ÿvCÕÿ8OoÚf jÖýùßþúç çéU墰rüOÇøß®ößGþoÿk7mõ_^%ùu45kþ²²&ûÍÿ¤\ÿüOû\ÿq¶íÎÑ=þÃsC´ÿ, å·Öý¿(¾êÔèoЮýw©Uxúséúí?Ýê?¯²ëmÐÝþÐU¨Hõ_¤¶ÏþÞÆþ×ç¤ûÏôßаþçW·EëÑL2Gyiö vº÷ÿë¿y¿Õô_ÞÎ{µÿ;ó¿ÚþÃÿçY:IÛ
+IÿÓä&¶?Gwû/Cü,H(ßjHú³«$7Ï] ¦õ¿ÿ1PÈÿÆBà¡°ÚüßU/×ë hô6ëß«ûÿ ë?XPϱÜfHúÿÝ£l2"Ó¨LoÒògÁæÿ¤þY@ýVóTûÍÏѤ±ÿéÃþó°®çOùcVä{
¤ÿÙâú"ÉMÀ,m<¡ÿÀÿÇ/0h3ý»,ñ_xþ/¤úï=þ«ÞþKôÿPá_6CÒ?Cüòÿðø/»!é¿ïø¯oÅCÿ,Ee&À^HúçÿÂú`ÿí¤ø/IJø/»¡Íÿ1Äaýÿ²þ9â¿ ¹a7Oµÿ{ÿþYX×â¿ì¤ÿÞã¿êã/XÿÅÆÿvCпbÿòÿÅ©þ{ÿª?ÿEú!æY!"À,¤ü_ðÿ² ÿ¯ÝôÏÿã?ÿËnHúçÿÂü/
+Ê·þ9â¿ÿÍæí6ÿÇÿBÿ¸/ÿe3$ý÷ÿU·ÿôÿ@þ6óTû¿·ø/ØÖuð¤ø¯ÉÈw
+Iÿ½Çí<ÿ=PúçÀøÿ!^{!è_°ÄIÄq@ªü_èÿ±ü_vCÒ?Gþ/èÄÙ
+Iÿ½ÇíÚÿúgádVù"6Í7Z!é#þó?,ÀþÛ
+Iÿñ_ÿdñ_vCÿcÿÂúÿËnHúçÈÿý³ óo7Oµÿ{ÿþYX×òÙ IÿÏÿ!¡]iÐÿ,']ýv0
+ïÿ%Ðèñ_û§Mýg33ÍK?G÷ñ+°þ¿Õ´Ñ¿ù§óC7èÞþ¡BþGÚ׿´sTõ
+õ¯D |%eÕþÂý#_öû[¿ ê¿}ýKÚ9(õoò¿¢þ÷O§ú'6ȤúQÿtªÿ6ÎÞoÐ}þG(¬ÿãù?즽þgëHk
Ð 4é_¨zþoáäÿeÁÔêè*-0ôBTï¯Ó¢pÜåß,OÒË~ÎÊ$&ÑMRí๺ø43ËÌ
+²>@V^%ùræþõédÿí¤þþíëÿ:¹Ngpö_Èõ?B¹ðÿ³pð¶j©³äúcVFÓWN
pÕ@º®óùçoò$Y}î8ëE°]àSï
+x*o£Àë¸Loîàá
+Í'³h«º=l8Jóòöþ U`³À?ò´L.¢øóf¡Í_ñ&&çÑeR¬
+(m;ÃY4oüý-½¡·y׳l¶yG_¨Áæw0~.¦[%6ðöÍѧ¾ítWßú?gYlÿÎw?óãõüGø0.¶ö÷2ܬ¬ïx¥×wßA©áVuø4ËEÖw¯¶ðëâry%G÷»ûéÆMóO?,òùݧÿÝZ°Nö_ÐÎA²ÿ
+öNõïÑÎAªÿ õÏAûú§úJi»ÔýÍóuÿ¿Ðôÿ8ÕµNí?Q¤ö_¢ýç Sý· öÿó¿;ñÿú
+ü?,¬ë ù_í¤þCÚ9(í¿ñÿ ýß?mêEz1%G wïÿ»^üÿ, ÿo7môf'ùýË ý? »i«ÿY_GÓÑurå¤zø&Ýõ/uOúç ú·MýOy¾=¬"FáÁÃúW
+abþ}_ÿbÿ×}åº/]G_}÷3pÁ+å¹®óCÜ8Â}v`
+eï¾À`»Ü)0Ü. v
+DÛ¼Ûüñv`§Àx»@¸S Ù.0Ø)0Ù.0¬µíÛÆõK¢zQ+pQ/ kâzU+0®ð¶A½_+0¬jv~EX+PûIý:¸^ vĸ^ vDR/P»bR/P»ªö3'úKêvIÜÞVQ g°qé×Z`»Ø9BX/P?Âve µsí%¼I½@ý²^@Ö
+¨zµ]@Õ¾¤¿ó¶ëBTâ6àÖZQ/ kd½ªPõÞv9¬ðk¢z Và¢^ ¬Ø¾íEÕÄ®ZT¸Ú.jÛ«í²¶}¸ÚÖ¶ÇÕös|os{Rmk
+W乫í^mû`µÝ¯mªíãïï¶×¿¿¿Ú^ÿþÁj{ýû/lOéy«y¸ºe;ÍF"Ym×'ÚÐr$ÝÕveNäßh½Ý¯×_Ll¥2w²ÐÃW¡ðåj»þjp¿=ÔÛÃUyY÷b¡ß¯M§+ô¾Ø,PH¸Ñªpåºx¸Àíÿfÿo|=ô)ê<Úÿ20Ûjý?écþ
Ót¶øêÜèßf3G¾ÔÍhø"µ»¦Ó¨Lgÿ>K®¢ir-émq|WV
+)}cBÃø>;¿FårûO>{æüU8ÎÎWçC2wtS¾òº?é}4»³ëëh6vLWNéÿ²ò§Ó×?þô£g³"&?åí÷¹ÐbÓ]ÓîÁoÇïß:Åb>ÏòR
x¾(^8ÎɬL¦Î/Él¡\½Ñ_9¯åU2+ÓX¿ÑõßÑ"_¿þ-¦ÅÁÏ'ï>¼çÙM:Ö\?îÆyÿú̹æúðUd µ*ÝÎÍMÃ$6½éEa"m=´ã²ÔÖQu,-t}ßÝ$ãwMvÎ)Üv»ú×UãHÛ¦¦¯{WjsÇS3ç¼+·±ë$¸PÍç\ÚÚq<isÎu¹Í]C´8çªÔÖÞòÚ¾><?qÞþçwõê×Vo÷»£2zx_±³ïê§6v÷§\·ÝiWï÷õV¯MW8Z»ßõ¢å®xg×ɸå®ÉXĵ]±lµëê´÷»õG»N£¢Í'3ç'ÇýZÝ
+Zü_GQ_ml^qðu8ç¯?:ÉÌÜRãW¦!rÜçN6ër¡¾æfª^;³äKµQ¬6ê×t«ùUUsÎ.6ÔZ}Y}3/ßÌ£ËÄgÛV7mUÀû|ð9Égº§yÎê¸Nµö ps§Ì»}þÝ1÷ÀSy˯¢ñ8u_&ïßèñèäÃozK8_B
dxÁÁÑÙ6(37tV¾<0·à+çý£só»Þ¸êP_Ý[2£*é¼ý¨òg«RÿõA[õ&|s,dU*0¥Äªóñ×÷§ÿ{kuÄjBUj}7ú¥:ÊÞlòÆÅ{ø(gÞ|\Å=Zåhý]ê(Áaà
o|㣨oEæ(ºÍwÑ]ìå'¯ÏO«ãûËOï>vü¾åÙá_ª£x«ã«ÃÇ®øöQ~=?^þVµ>Êp§'Ë£ÈõQ\ÂQþq´ºî÷Wìñ{àÛßeU{Goª£ñóñòVZ§úÜ9?[®1÷°Þ~jz'îïn³×ï«êsWtØí¼ͷÎ^ÞË$½\äyä3ɳñÁè³QeäTËfuÊñbýÇò~ÖÝ$ÝX8ERj/Û¶ØÍqÞ¾;:½þøÚù}³èp«=¬Ht³öÞãÂ*o_ÙÍD$áUËS8B'òé³lQ«ß[<s~úéïË#ê/¿qÄÖËõ¯îÎÇÕIÌÇúúf½2gËÎõÁâæhbýñI¬fø¨³ów§'o7¶[ÜM.?'~âÆÕÑ>ÿ×G§ºÆ?øp´o7GSæãÔ¼Y¶¡ÜßP«¦v}´o7GóV_}³O¹¼«£Unmä6~é7£ùë±Õån\7Íù/_ÿ|ºuÝv£ë·z8B7wG«ú)Uû±q´ÝârªáÅÙùÊáünlñ`ÙÅXwý×ÁòÃDÞß&/î7++þnß8÷E&«¢Z¾«eîÿ'%Îù·NÍÌÊ@ýSus±j¾Þß_½3?gYFÉû2b£Ì²\+¿ëªØ:ΪÌYvSýú?Í0Ù²ú*,×ú¯ªïxP)±ZoúïÞÎr©åÆ·>¨¾É«o~as{Ô>WCÏ«þýç¦û¾ý¹éo|®uðn}=u§¤¦óå"Ké}uµªß¨7 Ýת>~î¼yç\De|õêþ®é±ï}£ «6ýüìÅÇô:Éwι>/çéAéòÓSÛ`iM'(19¾NdyÙWeªây:JÇ¿ë_#þp¦Ñ<o
¾W=Âgw-vñ·wñZìnï´Øe¸½h±ËÅö.ªÅ.ãí]ü»L¶w [ìâníbÞÓ¢a¹½l³·½×f`{ Í>í}D}¢í}T}âí}ü6û$Ûûì3z«Gµ:ºJ/¯êùfJ¨4µûÇã; ÊN²¢ìäQvò);BÊNÊNCÊNe§ÊN1e§1e§²ÓäñNÞ-ExW?+õ»±Xñª÷wY¤£¨H~wõ~Ë=ô¯TÁó»É]=ÂÙ´yË#<w
~ùpâ¸/¤úæYµ³kgÞýiÅÆivxZé½ðÂõyß~}x8z÷ï.º°£ÿ¥ù?õ_Óì"Vo¤3LÍÿÏwnî8ܸØwû¾ÿ×YºÓ|qëdúçé8yyÿ¡|ìÃá7>ü¥öU×0ÏÕ2»nL£rsXMÅx"Ϲ¨¯ªë´2;øTT3èÎ^}|VuMy{ÐiÒ¸è^eõÌ_ýé+çõt}1ûÀ9<ÿ¤{Kç*+çÓÅeõþÀ£êáC¶Èc=Ì«úÕØµt¼ÁªÛøÃe4嬧_«?¿×[ou¸ÀURWÂm©M¹î33²;xû~¤0=9ÿ¹3˫ΤcÝ)Aõ¾êÏê
+8øyNK=ê6]?¦°Ð¿Ò©ÒMdù8É;×ÙE:MË[çR_êj,½ÔC5ÓÕtîúôÜólÆ·«^dÕ£<øm9?Ñ[q2KË4¦óëßöW}²#ç**®srºSæ©ù.;ª/¯¯|î(åzvpüµLfÆ7qx¦s·º{ÿÊÌX¸?:úÞI/t]ë£Ë(zDp6úxrvüþà()Ø|"J½ôçýú§3Ï3]E¿<8\~ßWúOu%;ÿùËëÿåܯÒ?Xýçwó[îº\[?ll?¼Jâå¼®Õr'/_¾4Ó ¯9w.´ô°}9ýqVMzÏ©P^à}þQð~|v¢(V×å÷³óy]ãä¹nô°áóÝ`ö¹#<%?W÷¾\ú@S}vpxþúÕr`eÓjcU ú*sÓÕÅ<O¢å©¿ýÕ<)X¿û¬Y©Ïr©o«$7?lu}Ío'ÓèÖfÙÜù¡øä1Ït{M©x1êaQI³¬<ùçÂ<=õåKÇÁK=ù9»ÌÎNÎ?8?Lçÿï'S7ºjé&"^俦}G×É,ÿ¼ùí>Wî»WÆÛuc½ÜØþaO]&±õ]1á¹×nêÉ.ß¼
n(ïnBmë
+tŬïÂ#À ð}uÏ_z&YÎj÷3]ûå#»K?8¨ÚSá,¿ç+-ß
+GV¥äzÞq½M·
+ÄpYÐqõýeËd4Ërçë6÷|çäH_Õ§w³<©>©öÓ£ÙWI5@¿Ît
+d¹¹Ô«ûßùáãxv°¬ù
ë/QZJHÇúWúNkûP4OnÒ¥ÖLîðàåËJ²¯´uõ¡r¿*·2â'×Ñ-øIVoåO/yo^Wßjåö\:AxÿÌ´5ÿ^ͤèùr¨~Ñú×7öÒ1àÊÞ~wmý/_ÌKóµï7¯Ûó͵º(¥éÞ75zKÕÎÜïø²Á4gºk{ñ£8éÜ©f*wJñ
+Ýmʪ'q:Iã)Mêò_ᮺôM<Ûǽ¥|ò½U}"ZÜ[ßô9>§åyr·ÄëFÞâv_åúÛþ¹¼!~¯L¹UþaZáB÷¾UùòGÝx°ò%µò¿Ñ´êÊ÷öRùòGá=¹ò¥ùDR+_v«|ÉVùòÑÊW?Jùpå«~?ØKå«uçù©¯Ì'Zùª[å+¶ÊWV¾÷£®|¯ßÊî¥òõOýt)<jå{Ý*ßc«|ïÑÊ÷Ã+ßï·òýT¾þ ªïS+ßïVù>[åûV~ð£W~ð=4ûÁÂïÇæÔʺU~ÀVùÁ£þ(ÕÃ~½ýÐX®^l~Hü°[ålnV¾®¤Ë«ÒÄ
+Ëi·l¢ßßÝÅÒ']ÍüàC¾»Ú|ö²Û:QYêj0ß¡Ðßfüb]GéìÕ³üÃxyd¦½ÕdùOOÞþrà,§þ
+miO¿[í Ö;¼W;_õ]a} ñÜ×]ë@÷°BóÑjO¹³§ ®©üÜw;¿«AVë¯mÎôÐ×ßþko|eóH_[¶þÚæL}méí¿öÆW6?ôµUë¯mÎôÐ×VNØþko|eóH_ÛëåÞö÷Þö{¹·}ÝB²ÞÛA/÷v m7ë½örob¼·gI9E×.kÒo=|ðöøã+çýÝ̺±egSg]§Ó[GÆa0ÎâÏÎ*1ÅÒe°95.¼òv8ó8Ý¡??\Än{¾ôµ1^3ç.d½H.¯Íì~åL?ð
ñ6m ÊÈx·îv¹Óàx ÝeÙå¬éÙÙá»·oN~ÙÚá
Ä7n±êGÊ_·ü±±«_y|h²ÏÆ~óäµsÑÌËÎóDÿ{çyY~òÃjQLá|pÂù þÚ¹ü+®9íÝüîÚ¹:<qÞëÎóóÒeó»ÞàþáüP¹öSÏ\úÕj¥¸ «:þëÆI];G®s¤®ôa®ßñC{ãD¶?¤£Ê£*ÒQUÃQ=ÒQ½£ú¤£ú
+G
+HG
+6u@:ê á¨CÒQ
+GHG?ª ݯ¢á~5+
G½ßëÛG½ }×ï7Õ#Õk8ªO:ªÿèQǤÚ?V[ËEͯ;kq$ýTÖ?î+¶÷,àÊû¿Ù¦:iæÌ«ÜßkFdµúàÁâJ^¤¥s}fzUhýsGÿµÎ~xÏÀ[ïiþ½{²²ÔÏde¨Ø=Ü=±¸;±hÚs÷Ä»OÜõï/ßÅêÒw«î½¾QÝ«J!UÔúZ¥¸¯ÌåÒñà©×®©{wMݲÌðÊ)óh¦û¹é¼-¹Ñ_9¹ë˼_
UUäq~ÿ¿£?^ÌËÑùûtÜçìý¹ ;¤Ïÿöõ>iÇsyþȧéì³óûéÛß^ëÎãÉûÿ(ô ÛÓþ@Fp¿ á©G¸ë¥>p¿u¿ ¥í!wñ·êk´?ÄÑæ!þ¶ñKÚâøk±yçoZ
+kɽ|üxo~myúµýµÕµ]f871&¤îÜÌð~X¶GÎûr:?ÄÏ×ãèÚùÙLÿÌgs}ÊÙù2ÂÑÄAígóÍQàÖ¯#GóVCÉõêKs´C,fYqh¿ûaª\ÆK= uÆyz£_ºà¤h_üjqñ`áåÜ8ðæÀ±ú¾fĦ/ñÝXímRFÉôÕV$ØÆæõ½³*Ò?ç']ÍëÁw¡?úô¶
+j<>rOÎ?¼»ñ6.fSóþ²ºIx6÷eß:N&ÑbZõ¯~Íò.¢÷K:.¯Ï]~tôþ×#çÉ4º,6Ögë¨ÖÕw]îõþìý{§^DMØØðåâäíccAv½øö®ñEó®v4ïê?°«ß¼«|`WÙ¸ëÅäÛ»^LwØ5nÞuøÀ®Ãæ]v
+îvý4û<˾Ìt2_Ä&Ö´RóÁÉ»³³O¯u¤u:6?Ê[³¾ÐJhæ ë²ó»YÕ¿:ñgù&tÍÆ®Gî6Ü<ZD:I´:Z¼y´1ñhb}´ÉÆÑª@ÊÑÜÕÑb¹y4E¼në_ºTÉúhñhë_66$íî^l-~êuK66O¬Ó~&{<ZÔë/zý¥Q¯¿ô¾
+é绵8Úåäëö«Deâ
X§üèvâÕþfUOuÆaÒýËßã>ÑÐ×uò ò±6S}]§¢m#9Ð×ûì^VñÄË*z¸¬¢ÇË*z½¬¢ù²ç¸;îéÎäêU9èéùagL6ïÖU6jÂá
uøÏ4/¦w¼t»|üÿí=ksâH÷_Q±û¡íUz!Å`7t³Æ=3^! £5 óë/³Tz ¥¢ÄÄÄÝÅ¢Æ å³²ªT¬ÌÐ-ãyüüÁ¨XÇÞ_}aÈ?ö»Ï¬d 3YùàJÑ»¸Û3Þ)Åj62xjÃ
d q,
+W;KÂάPº:¹û=óGxäÍ{ Óu±ÕHã±¶Ô%Q̦Iìà>pµ1ÔÇ»mNqxO&a¸Ìw©äC´Úµ]èÒÚÆÔÕðSCdxY¸'}uaÀ?ÞÎaÂo"¾âTøu
+É.ÖÖ¦SPÀ¯J¹KÁ+(x§Qè$/Q:k!اIÚ
+$ ýxxë6Nᨠ`
·hÄoÝ=7¼ªnnoûwG
-ȪÈF-MMÎÈPÉRã²Q¡¸,·þÍ¡kìkº\-ÂÚS"e³èZ~#[õ¬tÐÎà(ÄR5UË ¶È¶ GAd[Ud»ÈÈ GAdGUdG]ä6_µ¸1¼ÓÅ×ßd1 k¶øc|ÍÏhÑNôl5ùþmþmqõ¡Eõ¡¿o¨>ÙZVÜUWE1W£ «jX·/vTDîpDî¨Ü©%²§"²'ÀQÙSÙ«#2_å> òD³óÖ ©Ò]ÏËwÝ>÷ÚlµN¥¬uX© çp¹gpË=TÙ>,²GId[Ud»È«EïÎ +dÞó¼ýtOzcÎr¸äÅ6É<z=ÇÛ¸(b¸ä%q?þrúη$Ç*zÛ¬:bV²2+SÌʳ!+³²Ä¬l1+[¬ÌʳrĬ²2+G̪-fÕ +³jYa^S+S +³rŬ¨ +³êYbV Y'feYdUVÅ»p»mk°²þ+«+»`u³×+êYÊ ÞO@£¼rÀ3±þø6ÍÂ{øóòÁÒ\«ï>¤²ì¡)zhÈx2§!ãi
-ô¶
-EeQnÛ ¹(¢¶mP¡`¬0,YaX²Â°d<mO[ÆÓñ´e<OGÆÓñtd<Û2í}[ïnæ·A
ò¸2y\Y¸²2pe<;2ÏgGÆÓñôd<=OOÆs"¨àå@Èm¨ÑõÜèú%'2Q&2Q¦2õ§2õ§2SO_ÆÓñôe<}Ï@Æ3ñd<gå.±¤o¸C;ÆíEs\i
-¸,ïÇ åÓºïH#N?
^ ¡wð«2 h¤Ðk?! wÉMç»pKoY4.cĦ×Á2*GðÜVìHg$\`·0f±ko1[Á¼[qãzi4xäO9gX}ÆlÀÌÛø!Ø7,oE_ÉÃc̳"-ÆýÄLÞ5Ý¡NÇ2[mÛèÒó% ~³yî?^#ý2¼LÓÒa<^µ<ÿIð_¯Ç]2ãgòÛ&J¼øø÷ÁiÙ-ÚàwI5f¦ÆEHR[j?.a±à=ìÚÑkÒÇeEÏbÎqÙS=Ç
-¨lâf· ¯d¸¶®¼¼È<Ó*VLg¿Kï7 e0Ù Á³"¾P0V_ÇTÖ`¦1¥Ã1&XyiIDyÞViÓ28ÒÒq½8ØfK£¸ÒÆe Q X@¹ ¦ºjÆqªÇ«¦2÷!ÁTWÍ<N5óxÕTæZ$êªYÇ©f¯ÊÜS]5û8ÕìãUSK`ª«æ§s¼j*sWLuÕÚÇ©Ö>^5¹2 ¦ºjîqª¹Ç«¦27'ÁTWsjãUS`ª«æ§w´jJsLeÕx}Õ
-4óÕÏuJ0ë¨f§u¼jçV%uT³SÍ> ·Û±Íüd[ny>v;5QÌú(V}»>S¥]ÅÒ©â)¡ ÓðtÿéÃ
-ØÆ<üÁñºDoÙa¡L²¤Ö¯á|¡ìð÷ wº¾Fñp$P6æù³1/ØÙ*zżpxF¾}úO¿¾ñoÂÿÀP1O¿PJí.MiXéáEÑÇtèôTdnÃ<g@ºH¯âbBï(ÁG.Ày!=^4S.fªf/-Íf«f/Z[.).u¼h¹hP´ºhöñ¢Mä¢ÙBÑ.ÕEsÍæE¨Ö>^´\´¶P´ë¢áfüò!/8½9ÙÄïOÑR{ðöyÀ§3³¦ý
¶¾½Ú{\=âÅöã½Eu³1Ö¡7ï×°õêØ¶Î±-Ö3Ù?yåDa!N°Ó>pëÃíÅg¶ÍÃ%gxvÎOÄ:G)=ÂÈööhdHæ6Òd
-V_D8õ½¦¾,C<·7ó$ÔF :ûy¥Ý®¸ðÐ%pvÉj`.-xy¿ñ&xöaüç(ÌþÑ^yx²¾UpB¡¾ÐK"óàÑ~Üí¸G+Æà¢L«T>¥ø¡Øá®otصl¯$
@-¡¦Í`Ú¦]ÀØ£ÍæÑjzlzcôiĶªÆÎ»'ëh>gzáVÉz]zôü¤ruËhMêVcbÆ6FraAò7x;¾vÍÊ
-ÁÓÕO·èò<xÒÑ æïiÞ:OºYÆéLµ¿ ð½÷¼yzj©±>ê/µ¶éJ#ýÓ%/FËé~_ÛA
-'¥ë ÓòtôVÚ_¯ï;Ë+Úx 8#Vø8?þæË%ëòðãn²Õ
-v¦MºXñË:ÄN<0 ;²´¸OAhÑâQ8f¸Ïà »yS¿¤Ix at I?(ÕQ·läSruÃzq½ËÌåª`Ñh M,J¯ m>.1é <Xn¬UDü`²I}¿&]Fak,AB4Ã@(hpoP)§
-UN·ë®ñ°¦N-¨¨Ò#´P!V(Xy½ÖÉ â0:,ú.íîdü+%Ó§(éV1ökãÓfB¨Ìpb yáô¼¥GNÖ"ðÓZâúe?)¢ìÄ[YE¡ø5üįë'F~âÿ!?ñ3?1Ì]?Ñ
~âï'F?1ªýĨôËsHoó¸;é#B[|ø¼
-vÍGÎ>üçd6³/vl½ùìínëýb¶ôÆFP¡¡qdZòEä¡°u<Ô¬"ÂÚùËn1õ©Þ¬cz³Úôù#c×ô"Ѩ 6Ѭ´B]Ð õPÉU`ºo /7UÇ Vµ¬Z0
-ò Z§*
-u
-`Ô0QÏ vV:ûpsØu`WÀ®a _^ù¬ PÏ ~&ȯÛI?kø+lË Nn §j8µ jêÔ ¿~ä×hüºMP»HU
-°r´ë ]mvµb4×Oä ñ#¦ÃÀ\Lò¥3µF#êÚO½óë¶`2Æ
-[ö3rû¹uìçVÛÏ=l?5>árµIºl¬ÛÓ5uÝÀù®éT¿`ÓO½1îáâÍg(Á¥½>ò!ö?@Q~L6+?=ãE+Ï×à©Ì,ß"H"?Îøg#õè`êä¿÷Iä}òmK®ï8YúiåfK£y8ñp>Ú®¤ÎçZ
-xð°
-÷ÂR3´Tk´¨Q³ßï¬ls*({#òt22ÈI¾×(pÂ6Ó³[J´:ªQ
²ZOãP'%Ee7hù|G÷î{dá½/aï&.ðä.&söÕÉÂ_xì6uHÁRÐ
-n[¢ÉÀ¦l6+t òód³ñ8ñ¨¸Þ×cÞ³Û#Z×[QVu|oººKíÞ¸ ø½^¿¹%POmÇÿ®»+S½,pâ:ï]òñ²b~êÿÃWÉÑ/L£Ä¬6SleêÆ´eï*AJÀÔÇã¾oó+hçÒ³ØR´ä`©®,3&þ!¾ KI7Ô ÷xdÓ²Ú0vÍQ
úbÿx¢ÇN9`Ç¡Jì*
-H¥LFÿÀS{zÆ ÝýÔ·Ø÷¾JÛ¦1®ä WÌ3Ä˹à÷^¤ói£t>
-óÑl& âIOã`ÉêÄôðÕ« ÈâóçM65·wÓóð¹2}&Pv×_zÿF ÕÅ~f=vú x{ÉøaüºÍÀúíîó°t UîÆ;~¾¼ãZ¢öϬª¶ò6^Ó°ÏïU [c·±5w[SÖT¥ÆÖ*J}¦ó¡-R°¤J^¦à(åvÊÇy¥ï7O:ôó¿¢ÍzéÍýtF
-ªE ã¶X|ëÅïiW¿ÞÚ,ÆÅ¤Íe:çï¼Ðô²ðx¸såì`ôòùéïk2kÀKÉ3"äÙ("kgm´,Ýîçhê9ú wþOѱ:NÛè üqégÖõÉxxÏÀ!ê¸CâE±y)UvWÞ«çÃjJXàIyW~þ¨ËVËØô'"3/Äb
¬×P¯5Ãh¬éÃtÅ)Ù[©É@)ø®#qòÖì"¢óGK<·~<5É»ùÜ$¸FþÊuÍNe¼Æ7V m±¦s]b¹oðLýõ+yó.pѾ ßó
HÞÔð©É;~{ÞXÐ×E7Z¬©âhÀ¼?¦O+ðýÄÃüþnäM>ÊU,
áX¹K°¥ëËM@îìúú\ìyØÃø·Ñ/w×ys<Uþ¼?¬ gmµÍÛ
-òX?êiRmYiÀ4Î"
-öù6þ8ºüÞ¸ôÒ~
OÄ/âmìàU$d-oCðçðÑÃ~WÉ®·%äS¼FëçÌHZ±×nkÏF£Þ×!IÍ
-]w9ÿ~õ½ZðqÂÊOqPÓÞGi³}X?ðÇ%ï*î£CÏ38è-ûçÉEÜý
eü~³Î±òS³kèÝY»Ûît;z%
Ñe| ÿ¬S}6Óà¿ ¶5¾Õ~-®[Ä"ë7òÛ&Øgñy~&ÅÏ]2ÂÙ¢Ê}ûûÈ5Jþ±Ò¥¬l¨zéÒJ
-KYºiDN1FG'áüضÆÚ:Þ\¦ohÄØ:ݱð¡Ø$0w=¼zkh}ã{<zË%Û&ÇçØwN&ñ¼³ Æ^àoÜÝ|þtÕj¤à&Åý°ü2骯Þ2wÂú>ðhQÌì9Ã
-éf`îñV¡ùèO·Ü´¦Ñb ®¼äi±
½`\q¼½ãfjè Þ:¦GT4é3õ|
-EuÛ0,÷įÞ
-Y\ºØ£Fë0ÁÂ{W£$xjÄ]J¼é:áÇlÜö4Ó ÃnOqò_æo]»lRÃòÈßðqí-ÿî
/Þï¡·lÍb¨MPÀÍó6fázC"ìeÆiY¬Ú^èF=M7NJ µÝì´^òÏçÿûæÌ}ÂÀ éÙÖUð¬Üa¦ ļ^¦è%÷é¶Ñ/+p!qFãz
-ôàÞäçy¨Kî~½¸ÿµq7êoÅÛlü?iWk* r
-ÿéC?Qó½ :L¿KÙçpïÇeCÙ§ÓóÆå|$QÕ9Ng´SÒ|¸iþr!ÙÒ{Ö[Óª;|·òÜ{¯ûhôaDÊ¥Ó÷¨Ð¸»îëÞßÿ·\Õ¶-×Íí`DÎn6P ¥À+h?Y÷é#.i ;ºÅØ¥4å6IØ Ç´//¦ÛÑîËî«F«áO½<>Ë(o«±ÎÕ¡b}-î¶ÌéK?âu ]ÕÑ«Î,UAAÖVôÎ(ûð»´ MÔøPÿ>|æß8»ïm¾f:í ÍÓsìôÑÆ]¨¸ùð#:þÿópúgêø¿O¼Âiq׺µeâz&ô''KýÎ24ÉìUXÄMòK\ñäú5íTONõäÿ.ñ?«üÇé:]§ët®ÓuºN×é:]§ët®ÓuºN×é:]§ëßîú§ X
\ No newline at end of file
+ȪÈF-MMÎÈÐÈRã²Y¡¸,·þ¡kìkº]-Â:P"e«èZ~#ÛõìtÑÎà(ÄR5UË ¶È¶ GAd[Ud»ÈÈ GAdGUdG]ä6ßµ¸9¼ÓÅ×ß§
+ÉcÖmñ3ÇøÒ¢lèÙnòýÛýÛâæCæCõ¾}¤ùd{AZqCÔ|\Å\b®ªaÝZu±£"rG£ rGUäN-==ȪÈ^ù.÷'½·Më ݯyð~µÏkm¶['ÄRVÂ:®/À9^îÜÑrÏ E¶,ÂQÙVÙ®!r¨RUBÈ¡bíÎ d>ò¼ÿüHzècÎb¸äù6É<~»ÄÛ¸)b¸äO%ñ<þÒÿàÇ61ÌÇ*F»¬:bV²2+SÌʳ!+³²Ä¬l1+[¬ÌʳrĬ²2+G̪-fÕ +³jYa\S+S +³rŬ¨ +³êYbV Y'feYdUVÅ»pWÚ ×`eýVV-VvÁê:g%nWÔ +³
+¼'06N;|'etfbãñ]¹÷ðçå+¥9¹VßHe
+ÙCSôÐñ4d<
+OCÆÓ[ÙémʼÜvAsQDm» BÁ,YaX²Â°d
aÉxÚ2¶§-ãiËx:2§#ãéÈx¶e<Û¶>t,ÜÍ%9î
+åqeò¸²2peeàÊxvd<;2ϧ'ãéÉxz2çDÐÀË»P%£ë¹ÑõKNd¢Ld¢ø2õ}ú¾§/ãÈx2g ãÊx2¡gó¬|Ãe ô
+wì¤Ñ¸1o®P+
+ÅÓrà}áÔ²²xZý ÄðPéÕz³XL@#
^Á ¹KîrÄ$?åGzË¢q1#F4e¼qÙïèù°âDr4%Ñc¼E ó
+\{iÒjµÆÝJ·ë0Lã Á£,xÈ9òèFdfÞ6À¾Qù(ú2ÜÌÑ1Á8prQıEÿ¢Ø)û ¡;ÔéXf«m]zY¢Äï¶ÏáãO×eO?¯Ó°tè×D§p-?GÒIãçÛq¢ä
ü¶7^Büûä´ìmð»$M3Sã&$)È-µH˨ØðÁíhǵJáã²¢çE1æxÌlÇ/I;¸Ã%À+nç¡Ù¢·"¯
+B/À° þô·ré]pGÃò´ì° »)æÅbóÕ¸Oeµ fêS:cPFD§ð}1-#-÷³
m¶5;m\F TY`ª«f¦qºj*kLuÕÌÓT3OWMeE©®ujÖ骩¬íH0ÕU³OSÍ>]5µ$ ¦ºjÎiª9§«¦²v%ÁTW}jíÓUSY+`ª«æ¦{ºj*ksLuÕ:§©Ö9]5µ@ ¦ºjÞiªy'«¦´ö(ÁTV×W@3OPíøZ§³jÖiªY§«v|mUYG5û4Õì#ªyûÛ¬þrì(ÂÍc/ÀÙÒþ±&YŪb×Gqꣴ룸õQ:õQ<%¬4<ܺÁpÓ'v0°@e<ACè-»1L#iCÔú-ÏÑu%8úâI7Ò×(&ØÐæIÐ<~6Æ»XÅoïÃÌ·O¿õéwÒ7¾õMøcâ*æá×J©ÝÅ¢)M+=\³a"úüN³LOEä6s¤ð*.ô7¸Rð̸,D£§fÊE£BÑLuÑÓE³å¢BÑluÑÌÓEkËE3
¢µÕE³N#ÍÖQÍ>]´\4[(ÚµºhÎé¢rÑ¡huÑÚ§6Öv{T4<,ðgY)'yÁåÍÉ6ùh|ÚkÚç!_Î̺öWÚ2øñjïyõãǯzêfc®#oÞ%®aëWÔ±mc[ld°$yå@a!N°lxôáþê;æáÌó±.QJ0²½$Z ¹4YÕ1.ýe¯©¯ËóÖáv¾´¨Î~Þh÷.|#
+§çp ý.YÍC¥/ò0Þs&/GaúöÊÃÌøVÁ
úÂ(ÌÃgÆq÷ãA¬T#w2®:&7©|Jñ)B±ä®ïtºØµì¬fÄB ÂPÓf0mÓ.`lѦóxµÊ
+#6½1ú<bGUFã+×Ý7ëx>gzáQÉÖº4ôü¤ruËhùõ «±0b#¹± ùÁLÃÒ×®YY!XÃ_m1»EÇi}ÆLGK {A ¦zë<tèv¤+ÕÁ6Ä÷:Þyó4k©q>꯵éJ#ýÓ%¯FËé~_»ûA
+YMJ÷AüòrôNÚ_o{ÛÇ·+Úx¨Øà<ýÍ·)¶K6äáén²Ý
+Ó&ݬøeá YXÜYcr-^CL
hûÒg8Ìób^qâ%ýÜ¡DìTGÝ*
+²OÊÍe&]fU®
+B×Ä¢ôÐÙ&ÑóÀåv1ÁPE$'Û´îWäÛ(lH§è
+Ê#åTa³Æé6qÝÕÑÖÔ©
+³uySBb
M¹·kB3ÂXXa±îÒî^äÀ¿RâÏâ$\¦GÅØ/l³íP
+á òÂi¾¥GNÖ#ðl-qr=)¼ìÄ[YE¡^= jÔ n=1ª©'Áª'AVOs¿èÂz^O:õĨ®'Fe=¹¸,ñCzÛç-ØI·Ú¢äÓU¸ü´o>rñä¿$´E`x±cèÍ`ï÷{ïW³¥7¶%tø«t« «¡(_E5´¶N
+5«°~ÆaõE
+Mº¯g¦7ëÞ¬6}þÈØ7½H4*ðM4Ä.«¢P× ´h=T2d
+ÀË
+`Õ1Um «Â ¼½Öi§B]5`Ô3]EµÎ¡ÜÜ vØÕ°k »¢W¾$+(Ô3 at P£
+êvA¢n2Ⱥ þ
+Û1À©c §Ú N-º :- ¨ß5º nÔ®"RÕ¬Ü í:hW ]mÍÃ5¢Å >àsÄt«AÞ²P`P3£Öl¤B]û©÷`AݬRÆÒ\aÇ~Fn?·ýÜjû¹Çí§Æ'Z®¶.%ë¶ãtM]7p½ëÊêWìqú©7Æ}0\²ðèe7¸tÔG>%Á'(Ê0HÈv¤9^´òz
+fefñøáfIÆ?©¿Â S'ÿ~Lboo;r}ÇÅÐO+w[mÌ£ ÌóÙ6%u¾¶ÔjÀ§U½¢¥2X£E*ÃqgeSAaØod¤AFLò½FÓ¶®týR¤ÍQ*$µªÄO"`Ý åð*Ú¸÷Ø#ï|{WÔ4¿ÀÌ5&5]âoæì«åÉ"XxìvuHÁRÐ
+n[¢ÉÀl¶+¬ äÇÉ*!ãñÆÛ@Ã¥ð¾óNÝÑZ¸ß
+ôªãGÓÕ]j÷ÆMÀïõúÍ
+xj;8ÿw]<]¹1ÔË.aðÞ%?]÷@ÌÏý ãj3#úiÜfqLÝØS¶ì}%¨@ AúágâMq½sý\[-!ÅKêÊ"câBÈàç)Éà:ôlZVæ®9ªPr À:A B±<ÐÖcYXÚ!T]EóDXÊdôÌÚÓû<±ìF¤¾%÷½TÚ654ôq%3èÞ0Î/ráB½wÈðúR@ ]O¥ëi8§SØ3=Ã%T¨ÓÃOT¯ OÅ×Ïliîàf Æ;àkd0úB ìn¿öþ4%@«?ü0Ìz,û Ô.ö ¢ä%Z4ë´/ÃRB«¼ïÕc¬kP÷ª¨ÿ³3«ê©m
¼×4ìãáó{è±ÎÖØïlͽÎÖuF©³µ®Rê|j,)
Rg«)¸%
+f¹
+0 at gÞAéÝ¥ýò¯x»^zó ]j¸-ßæzõæÄægÚÆÍ¯¦6Mp3i»dΣyÈG&ot½Ì=îãZ9K^Î>àþþ¸'³|°Dùñ×<R°ÈC"²öØFËÒí®q¦#©ðAü`«ã´Ê~fÃQW¡÷¢±û9ô)YùY2ES£Ê¡õÊ[có|Zù9Oåçºl·-2 2õ",)V¨áz
+íZ3Æzã?ù8a@èаñÉÁNMJÁw±·^à+¼Ä¼õËͬI>Ì&Á=R¬oI1¨\×T&kqcÒ?]cìË}¿ÿÄ®ÖoäÝ»ÂmF~<þÈ7"yWÃ&x÷.¼±` ¬>)ï´XWÅÑy#üÙ
+êþÆÃøÁ¾çM¾ÊU,¹áXy`[××ÛÍFt··â»=ýòp8Çó0\åÏûÃ
+rÖNß¼« ß%ɳÕFLSàÌÓàPoãF×ßw^Я¨àñâø;TÊ*²7!øcôìa¿Í÷Û6äs¸y×/´b?¯-ÝÖ^F?^}¬#ÌAÍ
+]w9ÿ~íͽZèyÂʳ8¨¯i"Ë´9>®ÔÇ%*¢CÏ8ì-ûÇÉUÒý
Eü~·.±ñS³kèÝi»Ûît;z%
Ñu|aü¬S}:Õà¿ gÛßk¿«±Èúü¶
+·áErÙâç>ájQå¹ýCä¥KÿXéRV6T½ti%
ã¥KO,ÝÔ#c½
+w¶1¾wéÄúä
+bìdwk,è%¶OM@L^½5ô¾I=ûÞrÉÉñu%öIA< ïl¾øf÷_>ß´)¸ÁGñ<ã,¿ÜtKÍWoû@QcxI´¨fö\`ÖtK3Ð
/w$¢5XhÖ§¿Ã[næmZ~¼Ø'Èf
+o3Ûelgn/8!·c¯ãè¸@NMÁSÆL½ @CQÝ6Ë}!É·BW îèA¦Ñ:a²ðÑÕ( ß¡Ùl.%¿øÂ1÷=Í4È0Û>NB¾âË<ä½k-jXùÛ&z^{Ë¿{Ñ«÷{ä-[ÓZpkûòi´^àGPE4,¶AmD¯tG£¦gH%HZÂÃnüóeü¾ýÄ=sgè´9=;º
+5[¯0>:±Z¯CSôû|ßOÀdôë
+ªN¸¢q»ÌÁFpïMrkÌ|DÔ%¿^=þÚxõwüm¶Á'ÂÉeêáÕ:Úø"¨\Ã0NÔ/Á&Ó/!¦ÁBöæîùÜ»àþaÙT6Âå´ð²q=ß8ÆæyN§«ÇLZÆÅ%i¾¿`J¶ôÃõβê"?<÷>ªá~2ú0#åÒéOTh<Üö¿u@ÿ[ .õjÛëî~0"w[(cÀ
+ôløtÉ4ÇÝbnÝÒ+ò»$ìF:ÓýèÕIÏåÃKÏU@§Õ|/w§ÏÝ2ÎÛj,`°GõghX?w[¦ÿäxhW
+ôª#KUPG
+=£óÊ>ýî-èfÓßà
+оÃ'Ïêâ7Îî;a¯ÙF;h³àô;}´y*n~'<EÇÿcâ~ú¦ÿûÄ+*-zÂjm¸ ãÉÉ2X°HM2}qüÒ'7Ü#¹~K;·s;ù¿KüÏj'ÿq¾Î×ù:_çë|¯óu¾Î×ù:_çë|¯óu¾Î×ùú·»þqø\À X
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-4c2t.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-4c2t.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8em64t-4c2t.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,31 +1,31 @@
-System(992MB HP=0*2048kB )
- Socket#1
- L3Cache(8192KB)
- L2Cache(256KB)
- L1Cache(32KB)
- Core#0
- P#0
- P#4
- L2Cache(256KB)
- L1Cache(32KB)
- Core#1
- P#1
- P#5
- L2Cache(256KB)
- L1Cache(32KB)
- Core#2
- P#2
- P#6
- L2Cache(256KB)
- L1Cache(32KB)
- Core#3
- P#3
- P#7
-depth 0: 1 System (type #0)
+Machine (phys=0 local=1016272KB total=1016272KB)
+ Socket #0 (phys=1)
+ L3Cache #0 (8192KB)
+ L2Cache #0 (256KB)
+ L1Cache #0 (32KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ PU #1 (phys=4)
+ L2Cache #1 (256KB)
+ L1Cache #1 (32KB)
+ Core #1 (phys=1)
+ PU #2 (phys=1)
+ PU #3 (phys=5)
+ L2Cache #2 (256KB)
+ L1Cache #2 (32KB)
+ Core #2 (phys=2)
+ PU #4 (phys=2)
+ PU #5 (phys=6)
+ L2Cache #3 (256KB)
+ L1Cache #3 (32KB)
+ Core #3 (phys=3)
+ PU #6 (phys=3)
+ PU #7 (phys=7)
+depth 0: 1 Machine (type #1)
depth 1: 1 Socket (type #3)
depth 2: 1 Cache (type #4)
depth 3: 4 Caches (type #4)
depth 4: 4 Caches (type #4)
depth 5: 4 Cores (type #5)
- depth 6: 8 Procs (type #6)
+ depth 6: 8 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-2n2s2d.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-2n2s2d.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-2n2s2d.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,79 +1,84 @@
- ¨
-J íQÛÈu
÷y
~@b£4@úÍ.ÕV\I\©²TydaHD"X$gɯ8³£áò8{v£{>Û½bÄи}úö¬©ü_ÓÝ*íþõÇLH:ÊÏ¿2&ÿ;äù㯿ðCiÆ$ÉC÷ÏCÙï¢Íóûã©:¼{÷Ãݺ]oݯ«GÆÄeöjüGïÀ°ñYYÄ,î÷C¦
ÆÁõø¯êe=å÷`üøçE÷2?>þÝ?Õ_¦øÿÐѽNãÏàæø/÷÷¿ö;0püC<&ÙyüËBþS4þÝ_ñ%á&çù_YdòÂðñ?µûvÛ®ÆFη?`üOC]Çæ®û¼Ö>ó çOãýíñOÓÞøç±èüOìÿúîÇÿyþåé<ùñ·þÀÿýæáØ,«íb_-?WëzѬÞ~þwοö?fE)ÿ¤±ñü_¶ÛÎ_rÛÿþý?KÎõ?ùoOý®Aý>ûæÿi.ÿ)ôæÿQó_÷Y-75TWÿ-;ÿ²»¨þC`ìø7»Uý?鸯Áøú_÷Pý8þÇæëÁïq{þûã_F=ÿSèÿÿ]·|¿þW§Ó¡¹»?ÕC¸éø:ÿ¡ÌÎóÿPÊ
-ÿ}hNõ_ªåg]\úzØÛÞÿ=ÿSx_*©ïÐÿmýs½ú@ý?óòßTò»ôÙnêC½[>,:gΫoF¬ÿÿ2ÿ/,ÿB:ÓÀ1 ÿÿ¨öÓ¢:ÛeSÓÃ?{÷ÿgÿsùÏAöûÿoªC½Zt¿±øRío¼°þ_F=ÿSèÿ+ÿëÐÿÝý»úpëÓ--ÆÏÿ»ë@.ÿ(ÿëÈÿÄ>ÿqÎÿ+ÿa8þç?úû?Ò2êúO!(þáÐÿó±ÿH»[ü'ðÿø°9´÷ë.þ ý·ÏèþOAùßþç?å?)hÿ§o@ÿ'ÎdWùTþS(r] <úoÿÐó?éï´þoÿÐó?å?|ú?qþ£?ÿï®ÚÿAAóß@þgþ©òÀñ8ÿQô®ÿi©þB7ÙVÄ/ ÿÓæ?pÝÿCù
-Rß7 ÿÓæ?ÂuþS÷ÝOûå©iwº8ôß¾ÿöÿRPÿßþÛ÷ÿÈä?õÿð
-è¿}þCþSý¾AëÿFùçú_©óÿ8ôòò¾ ý8ÿÑßÿuþóú÷äNÈdÊ0 Çß*ÿñ²þ£ú/
yª ý·>ÿ%Mÿ¥ ó_|ú?qþãjþ§þ$>îOM½ýNý·ÏhýB&ó]úoÿÐýò¾ý·ÏÈ
-sÙï´þoÝÿ£Pÿ
-Êøôß>ÿ¡ý_fa®- üüG¢üpüÎyéÿ¡ú/¥?|úoßÿCõ
-ß7 ÿöý?´ÿúøôß>ÿ¡ú/ÿâÐóó_tþõö
-è¿}þCû?(Hß õóþªÿSèå?tþ3@ÿíÏÑþo
-ÿûf¨ÿé¸ÈÇ+Fç?BwûÊ0>þ§vßnÛõÃø/ÂèñOCL¢Æ0þ§Í¡®Vcs×}^ëÉùÿsþ;zþ§Ðÿ'øð¿y86Ëj»ØWËÏÕº^4«·ßcüú_Ìä?=ïûðÙn;Éxÿ3=ÿÐú¿oPÿÏþ¡ù÷/ùÏ ?ÿº¸b¸ÿOõä=ÖB<&eçR&ÚÿEaìø?®ÿ,¯ÿ¥I¡úpü'Þÿ¯òÿQëÿÒ¨
-ý·îÿ|þEþPÿgßþO»ÿï÷ÿÀá}uª¤¾_@ÿÍ÷ÿ%ÚÿKAÍ|úoÞÿYçÿqPÿgßþïÿÿd¿oÐú¿uÿç¨ç
-ýõå}ú?ñþ¿þüÿ|ÿÒXÈxÇ@þ'üÎÿ¦ ¿Uÿçü®ÿÔÿÙ7 ÿç?úç¨ÿ3ÇüÇÍ¡½_ot!ðè¿}þC÷
-Êøôß>ÿ¡ü'íÿô
-è¿yÿçTþSPÿ7ßþÛç?ôüOAúûÿç?ôüOAùßþ÷ÚÿAAóß@þgüG¡üpü'Î:ÿû7"tm%@üúoþ·òÿ¤¾o@ÿíÏÿÖýÎÿö
-è¿}þCû)¨ÿo@ÿíûòúøôß>ÿ!ÿ)È~ß õóó¿uþ
~þCçùôâüGÿ§Îÿfq^ÿò~üÏ ùRùàø[å?^ú¨þKaªg@ÿíÏQþÎñ
-èÿÄù«ùúø¸k>5õJö;ôß>ÿ¡õ
-Ìw
-è¿yþ#Óýò¾ý7ÏÈsÙï´þoÞÿCý((ÿáÐûüöQ
¹¶8ò?ò¹òÀñ·:ÿåkÿ¨ú/¥?|úoßÿCõ
-ß7 ÿöý?´ÿúøôß>ÿ¡ú/ÿâÐûó_ä?õö
-è¿}ÿíÿ ý}Öÿû¨þÏ¡ÿÐõÀ ÿöç¿hÿ7Íÿ}3Ôÿ8.òñÑùPòÿ©Ý·Ûvý0þ0züÓC¢ñg ÿis¨«ÕâØÜu×zÀg2bþÿÿ
êzóÿTùo_ þï7ÇfYmûjù¹Z×fõö{Üÿ=ÿcVjýB³¢ô^ü_¶ÛÎ_2¢þÿ¼þ¨þÏA÷{ß þýCóÿî @þ3èÍÿ+]|1Üÿ§ú?òë?!ëúc÷,Ð]Ê$SýÁØñ\ÿIí÷ÿªÿQ ÇâýQý#Ò¨
-ý·ïÿ,ÿ)¨ÿ³o@ÿ§Ýÿ÷û¡ç
-ï«S%õýúo¾ÿ/hÿ?5ò
-è¿}ÿgÿSPÿgßþÛ÷ÿd¿oÐú¿yÿg=ÿSèÿ+ÿëÐÿ÷ÿõçÿêÿÌ"
wäBèÿ\(ÿÁ «þÏ/ù]ÿ)¨ÿ³o@ÿ'ÎôÏÿÈC©þ/ó6ö~½Ñ
À ÿöùÝÿ)(ÿáÐûþÏÊRPÿgßþÛ÷ÿÔÿÍ7 ÿöýõüOAúûÿç?ôüOAùßþ÷Nµÿæÿ¾üÏý?òÀñ8ÿQ\ÿ]¨þC!tm%@üúoþ·òÿ¤¾o@ÿíÏÿÖýÎÿö
-è¿}ÿíÿ¥ þ¾ý·ïÿÊêÿáÐûþòì÷
-Zÿ·>ÿ[çÿqèå?å?|ú?qþ£¿ÿ3êü/çõ?)ïÈÿÿHÿ` ¿UþãeýGõ_
-óT@<úo}þK(ÿKAç¿øôâüÇÕüOý?H|Ü5z%ûúoÿÐú
Læ»ôß>ÿ¡û?å?|úoÿÿæ²ß5hýß¼ÿúÿPPþÃ7 ÿöùíÿ¢0smqä ÿR*ÿÁ «ó_^ú¨þKAéßþÛ÷ÿPýä÷
-è¿}ÿíÿ¡ þ¾ý·?ÿEõ_
-:ÿÅ7 ÿöç¿È
-êÿìÐûüöPþ¾Aëÿæý?Tÿ§ÐËèügþÛÿ¢ýß4ÿ÷ÍPÿGùòÑùPúP>þ§vßnÛõÃø/ÂèñOC<ÿñ·ÿÓæPW«Å±¹ë>¯õÏdÄüÿ9ÿ5ÿçÐÿ'Ú
-æÀÿýæáØ,«íb_-?WëzѬÞ~Ûóÿ²çÌ
-Õÿ)yQ-ºðÙn;Éúÿóú÷oùÏ@êûõøìÿ§¹ü§ÐÿWº¸b¸ÿOõä=ÖB<vÏÝE Ltþ3
±ãÿ¸þöÿ©þGÿ÷ÿÅ«üTþBµÐ3 ÿÖýC)ÿ)¨ÿ³o@ÿ§Ýÿ÷û¿ú?sx_ôÈïÐûýêÿDAÍ|úoÞÿYûÿ8¨ÿ³o@ÿÍ÷ÿɲß7hýß¼ÿ³ÿ)ô×ÿu=ðèÿÄûÿúóíÿcÆBÆ;ò?!ä?rå?ãoÕÿù%ÿ¡ë?õö
-èÿÄùþùy÷:ùÏà1ÿñashï×]üúoÿÐýò¾ý·Ï(ÿIAû?}úoßÿYþSPÿ7ßþÛç?ôüOAúûÿç?ôüOAùßþ÷ÚÿAAóß@þl
-å?tþ7pü'Î×ç«þC!tm%@üú¯ó¿¿¤¾o@ÿuþ÷wÎÿö
-è¿ÎÿþNPÿßþ÷ÿÐù¿ÔÿÃ7 ÿ:ÿû;Aöûÿëüïï~þCçûôâüGÿgÔù_$ÎëRÞ/ÿ¹}þ£Lÿ` ¿Uþã¥ÿê¿æ©:xôßþüå)èüßþOÿ¸ÿ©ÿ»æSS¯d¿S@ÿÍóAë?2ïÐûüîÿÿð
-è¿}þCþSË~× õóþêÿCAùßþÛç?´ÿÂ,̵Ä1ÿÐÿ#*ÿÁ «ó_^ú¨þKAéßþÛ÷ÿPýä÷
-è¿}ÿíÿ¡ þ¾ý·ïÿ¡ú/ÿâÐûó_ä?õö
-è¿ýù/ÚÿAAúûÿ÷ÿPýB?ÿ¡4¨/@ÿíÏÑþo
-ÿûf¨ÿ##¯ÿe©ÿ
áãj÷í¶]?ÿ"ÿ4Äóùß{ñ?muµZ»îóZøLFÌÿóßQóýù¿Â ¾ üßoͲÚ.öÕòsµ®Íêí÷¸=ÿ/{þǬPýBEÐ" [ ÿíá¶ó¨ÿ?¯ÿwS@ùÏ@û½|ú?|öÍÿÓ\þSèÏÿ+]\1Üÿ§ú?òë?!E»gä|ü³Î¦0vü×RÂþ?Õÿ(ã?ñþ¿xÝÿYù
-iÔ@ÏþÛ÷ÿÔÿÙ7 ÿÓîÿûÆý_ý9¼¯Nzäwè¿ýþ?õ¢ õ~ßþ÷Öþ?êÿìÐûýòì÷
-Zÿ7ïÿ¬ç
-ýõ=øôâýýù¿öÿ±Hc!ãùò©òÀñ·êÿüuý'×õú?ûôâüGÿüüüü'ðÿø°9´÷ë.þ ý7ÏDÝÿ)(ÿáÐûüò´õÛ7 ÿöýå?õó
-è¿}þCÏÿ¤¿oÐú¿uþCõÊøôß¾ÿ³öPÐüß7ÿÎÿþ^ ÇâüGq}þ·ê?B7ÙVÄ/ ÿ:ÿû;Aêûô_ç'èüoßþëüïïÕ{}úoßÿCçÿRPÿßþëüïïÙï´þ¯ó¿¿úùäÐÿóýýQç8¯ÿIy¿@þçüG¡üpüò/ûUÿ¥0OÕÄ3 ÿöç¿(ÿKAç¿øôâüÇÕüOý?H|Ü5z%ûúoÿÐú
Læ»ôß>ÿ¡û?å?|úoÿÿæ²ß5hýßüüõÿ¡ üo@ÿíóÚÿEaæÚâÈÿ@ÈdÊ0 Çßêü¯ý?¢ê¿þð
-è¿yÿBõ
-ß7 ÿöý?´ÿúøôß>ÿ¡ú/ÿâÐûó_ä?õö
-è¿}þCû?(Hß õëþªÿsèç?´ìÐûó_´ÿæÿ¾êÿȯÿe)ÿAaøøÚ}»m×ã¿£Ç?
-1)5þñ?muµZ»îóZøLFÌÿóß±PýBoþÿöàÿ~óplÕv±¯«u½hVo¿Çíùý?f
æÿÒXÈxÇ þ/ÛÃmç/Qÿ^ÿOTÿç û½oPÿÏþ¡ùË
-½ùÔõÀÃýªÿ#ï1°þ²XäçÂOw(»)ê?ÆÿãúOJØÿ§úpü'ÞÿÕÿù7¢{þ×@ÇþÛ÷ÿÔÿÙ7 ÿÓîÿûÆý¿Ðó?
÷Õ©ú~ý·ßÿ§ýÿ÷õ
-è¿yÿçLûÿ)¨ÿ³o@ÿÍ÷ÿɲß7hýß¼ÿ³ÿ)ôÖÿÿuèÿÄûÿúóõf¡ü¯o ÿBþ#*ÿÁ «þÏ/ù]ÿ)¨ÿ³o@ÿ'ÎôÏÿÈC©þ/ó6ö~½Ñ
À ÿöùÝÿ)(ÿáÐûüòÔÿÙ7 ÿöýå?õó
-è¿}ÿg=ÿSþ¾Aëÿæù=ÿSPþÃ7 ÿöýµÿæÿ¾üÏìóe¢üpü'ÎWç«ÿ'ÐM¶ ñè¿ùùߥòÿ¤¾o@ÿíÏÿÖýÎÿö
-è¿yþ#hÿ/õÿð
-è¿}ÿ ÿ¨ÿo@ÿíûÈ
-²ß7hýßúüoÿÇ¡ÿHÿðèÿÄùþþϨó¿H×ÿ¤¼_ ÿGå?òÀñ·Ê¼¬ÿ¨þKaªg@ÿíÏQþÎñ
-èÿÄù«ùúø¸k>5õJö;ôß>ÿ¡õ
-Ìw
-è¿}þC÷
-Êøôß>ÿ!ÿ)Ìe¿kÐú¿yÿõÿ¡ üo@ÿíóÚÿEaæÚâÈÿ@8ÿ¥Pþ8þV翼ôÿPýÒ¾ý·ïÿ¡úÉïÐûþÚÿCAý?|úoþê¿tþo@ÿíÏÿÔÿÙ7 ÿöç¿hÿéï´þoÞÿCõ
-½üÎqè¿ùù/©öSÐüß7ü?væ¯Ç/§Å¾ýG§ý±ú¹ÙÛp6¼5ÿÏ
-ùÏA÷{ß½ÿ'ã"_¯8>*ÿÊâüü¯ü=ÃÇÿÔîÛm»~ÿE=þiÝPãO ÿÓæPWÝt ¹ÛxþÞÿ£êzÏÿÖ}ø¿ß<eµ]ì«åçj]/ÕÛï1¢þÿÿ1ÿ4ÿ÷
-àÿ²=Üvþñþgªÿÿ¾Aý>ûæÿi.ÿ)ôçÿQ×W÷ÿiýyõÅ"IÙù¥öR;þë¿)aÿ¯êÀñxÿo¼Úÿÿ¡Fm öè¿}ÿwùOAýß}ú?íþßoÜÿuþ÷Õ©ú~ý·ßÿ«ýÿÔüÍ7 ÿæýßuþ'õ÷
-è¿ýþ_ùOAöûÿ÷×ó?
þú¿ò¿¾ ýxÿoþ þ?ÒXÈxÇ@þÜå?òÀñ·êÿþuý'×õú¿ûôâüGÿüõgñÿø°9´÷ë.þ ý7Ïèü?Êøôß>ÿ¡ü'Õ{}úoßÿ]þSPÿGßþÛç?ôüOAúûÿ[ç?Tÿç üo@ÿÍû¿íÿ ù¿o ÿ3Bþ#Wþ8þç?Þõ?Õù?$B7ÙVÄ/ ÿÓæ?pÿPþÔ÷
-èÿ´ùpÿÔýÃ_wÇÓá~yjÚ.ý·Ïhÿ/õÿð
-è¿}ÿ(ÿ¨ÿo@ÿíóòì÷
-Zÿ7Ê<×ÿJÿÅ¡ÿÐy@¾ ý8ÿÑßÿuþóú÷äNÈDå?ãoÿxÙÿ«ú/
yª ý·?ÿEù_
-:ÿÅ7 ÿç?®æêÿAâã®ùÔÔ+ÙïÐûüÖ(d2ß5 ÿöùÝÿ)(ÿáÐûüü§0ý®Aëÿæç¿¨ÿå?|úoÿÐþ/
-³0×Ç@þBþ#Uþ8þVç¿|íÿUÿ¥ ôo@ÿÍûªÿPü¾ý7ïÿ¡ý?ÔÿÃ7 ÿöùÕ)¨ß³o@ÿíÏÿÔÿÙ7 ÿöùíÿ ý}ÖÿÍû¨þO¡ÿÐó/@ÿíÏÑþo
-ÿûf¨ÿå¸ÈÇ+Fç?BYd
òÿ©Ý·Ûvý0þ0züÓò?ñ?muµZ»îóZøLFÌÿóßQëÿzóÿòß¾ üßoͲÚ.öÕòsµ®Íêí÷¸=ÿ/{þÇLý_8y1+JIïÀÿe{¸íü%#êÿÏëÿIªüÕû|ú?|öÍÿÓ\þSèÍÿ+Íÿ}1Üÿ§ú?òë?!E»gî"P&êÿKaìø?®ÿ¤öûÿJÕÿ(ã?ñþ¿x}þ§úÿSH£6 zôߺÿsÈ
-êÿìÐÿi÷ÿ}ëþ¯ç
-ï«S%õýúo¾ÿ/hÿ5ò
-è¿yÿçLëÿÔÿÙ7 ÿæûÿä?Ùï´þoÞÿYÏÿzëÿÊÿ:ôâýýùwÐþ_
-i,d¼c ÿBþ#Qþ8þVý_ú?êúOAý}ú?qþ£þG&:ÿÂcþãÃæÐÞ¯7ºøôß>ÿ¡û?å?|úoÿPþöúôß¼ÿs&ÿ)¨ÿo@ÿíózþ§ ý}ÖÿÍózþ§ üo@ÿÍû?ëüÿûò?#ä?2å?ã?qþ£¸:ÿ»TýBè&ÛJøôßüüïRù
-Rß7 ÿæçëþÏAçûôß>ÿ¡ý¿ÔÿÃ7 ÿöý?tþõÿð
-è¿}þCþSý¾AëÿÖçëü?½üG¢ü/@ÿ'Îô÷FÿEâ¼þ'åýùò¹òÀñ·Ê¼ìÿUýÂ<UÏþÛÿ¢ü/ÿâÐÿóWó?õÿ ñq×|jêìw
-è¿}þCë?2ïÐûüîÿÿð
-è¿}þCþSË~× õëþ
úÿPPþÃ7 ÿæùõÿã0smqä ä?òÀñ·:ÿåkÿBõ_
-Jøôß¾ÿê?$¿o@ÿÍûhÿõÿð
-è¿}þCõ_
-:ÿÅ7 ÿöç¿È
-êÿìÐûüöPþ¾Aëÿæý?Tÿ§ÐËèügþÛÿ¢ýß4ÿ÷ÍMÿwíª÷¸b`þ#d±Ècw-è^B¡üaãþ?#C?ÿúoRõ¡0fü»i@¼ÇãøåñOÏ·ýî¾_ÿ³óý?ýÃþøõßß@?Ï+4þcÆRÿ0hüý%Bã?xü»IÕ}Z§±ïqkþâeþ§èÆ?úÿQ8ébÓÞeE^γ´üññ|iÇwÉÓÿÔêf½ëþg³;Õm]ý\?þ¿tÊæiøqÛ.«íâüéþtæIöc{Útÿ,̹zþ^ãÿúK³ûÔ~þN÷Þü/twùÏàÇ¿=:úî?ë/ÚSµýÓ»3¡èî×i(Þ}þËÅ~:ÔõÓï¿ë/ÌCÖ{ÁÇc½úåïÒ,ÎYrñ?/OÍÏÏ@G>KÙìâÝU¯_Ù«?áßõæâ§|¢ÿòúÿÑþãí¿f÷·ÿïÃéáÕß{ÇZwÕòó?û!j¶õUëúøËò²ÈbzùIVûýËùø$»|ÁwíîòOxzóo~¨î¶/¯H³âò£þÛO_|Üu_ýî5úÖùö~·¬{ÏËü}[ݽúíîíõ`ݯþO<¹þÝ[Åg:#çÿ9òÈü¿»%ÿC?Ï+_ÿÇÿªé>«îª0ö=n×ÿþü¿ÈµþG!Äî.«Ë®[F^ÿo/öþ_õY*ÿ)<Á/ëÿt-ðÅHÿKä= úo4ÿ~W8÷øø'Üõ¿LëÆç[¼ôüòúy^¡ñ<þfë?yyµþ£ó9|]ÿÉc,æY9±þS&1Ë/º?#Íyq¹üéLM·¼þgÈ{@×ÿ|Ðõúy^áÜÿ1ãO\ÿËKÿSxZI®ÖÿbÌó5§¤¿þåYr¹¼ô×ÿº\~¹¬ô×ÿÎ5Þî^qñþú_¢È/^pcý/¹µþ\ÿ]ý5{ë×Íëõ¿'³ÜXÿKúë¡ÏÒWÂÕú_Ì;].?Éþú߬(ÓË·¸ZÿÉ,\~Ô7Öÿ[ëÉÕú_dóäÕ`½±þhýïwÂÈû@Þºÿ'îÿÐÏó
-ç×ÿ1ãO]ÿÓó
¼Q]·¼þCJ"×ÿî0äúÿë/Îý9þ¼õ_]ÿ)<ÁsÿÿOº!B!B!B!Bü¿âÿ ®d° h
\ No newline at end of file
+ ·Ö9K ímsãÈu
÷óþùn ÒßìÚ++U©|dA$D¢C°Hjå×f$
+/ÑgÑg7sÏS¶÷ehQbë·OßµuYü«ßù£_ýñ4d=U翺*dOÿìâé¯_øÁ9ùe
ëÿ½ó¾(x}?ox8êûw?Ü»õ¶ÝýÂëÃñ
+q]ÿññâw`Üø»¼*C\ÿç.wÓø3¸ÿUós»l&ý=ÿ"ø\ãÏàÿ÷§æó$¿qãïúñ/³þe·Æ¹øÕ¿#Çßå¡,BÇ¿Ìå?
1ãßÿ·ü5¿þg>;Ïÿªóm@ãO`ôøº}·íÖÀ/Bôø{
ÆAüø6¦^-í]ÿqÇ|$ç.ÇûÛãïý`üûW÷þgÉúÌÿ×!øç¿Ù¿õw$Äû¿ß<Ûe½]ìëå§zÝ,ÚÕ÷¸éïü[ÿ/¼ügàC)ã
+ïÿ²;pþÛþïÿ¾:×ÿäzì7
+èÄìÿ;/ÿ)æÿAó[öY/7
+V«ÿV½ÿYê?"Ç¿Ýÿñ¿@ý¯*Tÿ£ÿ±ýßfü{Üÿáü¿ÌõüO¡þÿwÝòíù_NöîáÔ2â¦ÿîeþï\çÿYÿþûпÔËOºóÿô¸O|ÿ/ôüOá}}ª¥¾]0ÿ·ÍÏÍvô{ õÿsþCþ§ÇK~Ó`þ/»MshvËÇE¯Ìy5àËëÿ_æÿ¡ê§òó3]ùÿúñ¸èîõñØ-ÛúÔþÜÿé{DÜÿ¿ø_æòì·
+XÿßÔfµèÿ`ñ¹Þßz`ý¿ÌõüOa°þ¯ü¯10ÿwïÃyplN7ÿeUÉÊÿÚñ?cä?¼ò°ñ:ÿ1ÜÿáK¯ë?§øi0ÿ§ÎëüG.ÿ<å?>lÝÃz£=0ÿÓç?rÝÿ)(ÿaÌBþCùO
+ÚÿiÌÿ©óùuþCþS(] ,ùOÈèùô·
+XÿOÿPýò¶Áü:ÿ1ÿe¥ý4ÿ·
+âÎÈå?`ã?uþ£\ÿ}©þ\³UÄ.ÿç?2wÿPþÔ·
+æÿÄùwÿÔýÃ_wÇÓáayj».Áü'ä?´ÿúØóÐÿ£ÿÔÿÃ6ÿüü§ ûmÖÿSå?^ÖuþAþ#SþÃÿSç?®öêü/çõ?)oÄÿÿ(ÿ`²üÇëþ_Õ)̽:Xópþò¿tþm0ÿ§ÎçêÿÁâ㮽oì7
+æ?!ÿ¡õ
+¹Ì7
+æ?!ÿ¡û?å?lùOÈÈ
+sÙo°þþüõÿ¡ üm0ÿ ùíÿ¢0ssm1â¿cä?rå?`ãìüþ¹ê¿þ°
+æúþ
ê?$¿m0ÿ ý?´ÿúØóÿPýα
+æ?áüùOAýmùOÈhÿéo°þ¼ÿêÿùÿbÌÂù/ÚÿMAóÛôßGF>Þÿ8¿ªPþÁèñ?uûnÛ_èñ÷./3?øñ?mM½ZÛ»þãZùH"æÿ_óßE®ç
+ù¦é-âýßoí²Þ.öõòS½níêÆ{įÿ/ÿ9èyß6ñþ/»Ãç/÷ßëùÖÿmú1ûæÿÎÉ
+ÃùÐõÀ£ý®ÿCï1²þãòP!«zÿ³´ÿBäø?ÿÄú_U¨þGÿ©÷ÿ
«ù¿×ú?´Ð2ÿéû?òú?Ûóâý߸ÿëüïëS-õíùOØÿ§ý¿ÔüÉ6ÿþÏ:ÿú?Ûó°ÿOþSý¶ëÿÉû?{=ÿS®ÿ+ÿkÌÿ©÷ÿ
+çÿEY©ÿJoÄÿÿÈuþ7lüõ~ÍèúOAýmù?uþãêüõ&ñÿø°9të.öÀü'ä?tÿ§ üm0ÿÓç?ò´ÿÓ6ÿÉû?ü§ þo¶ÁüOÿðÿ)HÛõÿôù=ÿSPþÃ6ÿþÏÚÿAAóÛ þçþNùØøOÿ(uþ÷oëo¶JØópþ·òÿ¤¾m0ÿÓÿû?ÿmÌBÿíÿ¥ þ¶Áü'ôÿðòúØóÐÿCþSý¶ëÿéÏÿÖù_ùfÌÿ©óWû?uþóú·âÁÈxå?`ã,ÿñºþ£ú/
¹WË`þ§?ÿ%(ÿKAç¿ØóêüÇpþ§þ,>îÚû¶YÉ~£`þòZÿ¡Ë|Ó`þòºÿSPþÃ6ÿüü§0ý¦ëÿéû¨ÿå?lùOÈhÿ
kaÿãüJùØø';ÿåµÿê¿þ°
+æ?¡ÿê?$¿m0ÿ ý?´ÿúØópþê¿tþm0ÿ ç¿È
+êÿlÌBþCû?(HÛõÿôý?Tÿ§0Ìèz`ÌÂù/ÚÿMAóÛô?DF>Þÿ8¿Jù
+£ÇÿÔí»m·~~¢Çß»¼Ì5þâÇÿ´94õjqlïúk=æ#ÿ͹êó¯ü·-âýßoí²Þ.öõòS½níêÆ{ÜÿWÿCÿܼ¤·J¼ÿËî0ÂùK"êÿ/ëÿªÿsÐýÞ6 ÿ³hþï¼ü§0ÿ׺Øb´ÿÏõè=FÖ\Êâ\øë/!ªÿ0ÿ§õÏèÿ¬úlü§ÞÿÔÿù7Âm ´æ?¡ÿ³ü§ þ϶Áüxÿß7îÿ
ÿ)¼¯OµÔ·æ?¡ÿ³öÿSPó'Û`þú?kýú?Ûó°ÿOþSý¶ëÿÉû?çzþ§0XÿWþ×ÿSïÿÎÿÕÿ
¥7âÆÈ8å?`ã¬ÿóËú×õú?ÛóêüÇÕùYPÿ
+OùC÷°ÞèB`Ìÿôù\÷
+ÊØóÿPþú?Ûó?yÿç*ÿÔÿÍ6ÿüÿ)HÛõÿôçëùò¶Áü'ôÖþ
+ÿÛñ?gä?
+å?`ã?uþ£¼:ÿ»Pýëo¶JØó?ýùßAù
+Rß6ÿéÏÿÖýÎÿ¶
+æ?!ÿ¡ý¿ÔÿÃ6ÿþAþ3PÿÛ`þòòì·
+XÿOþ·Îÿ£0ÈdÊØóêüÇÕþOÿEâ¼þ'åíø_0òAùØø'˼îÿUýÂÜ«e0ÿ ç¿(ÿKAç¿ØóêüÇpþ§þ,>îÚû¶YÉ~£`þòZÿ¡Ë|Ó`þòºÿSPþÃ6ÿüü§0ý¦ëÿéÏQÿ
+ÊØóÿÐþ/
+37×à þ;FþÃ+ÿÁ ÿd翼ôÿÈUÿ¥ ôm0ÿÓ÷ÿ(Tÿ¡ ùmù¾ÿöÿpPÿÛ`þòªÿRÐù/¶Áü'ÿ"ÿ)¨ÿ³m0ÿ ùíÿ ýmÖÿÓ÷ÿPý ÿ¡ó_ùO8ÿEû¿)hþoþÇùòèüÇùUêÿAaôøº}·íÖÀ/Bôø{ÏÿÖø§'~üOCS¯Çö®ÿ¸Öc>ùÿ×üw¡ù?Áü?Ón0[Äû¿ß<Ûe½]ìëå§zÝ,ÚÕ÷¸=ÿ¯þ_¨þOÁÍËÒiÐ,ñþ/»Ãç/¨ÿ¿ä*åÿ(H}ÛþGÌþ¡ù¿sòÂpþ_ëz`Ñþ?×ÿ¡÷Yÿqy(Ð?ôtþ3
ÈñZÿñýªÿQÀÆêýájþïÿ§à6 Zó?}ÿçBþSPÿgÛ`þO¼ÿï÷õæð¾>éß0ÿýêÿDAÍlùOèÿ¬õ
+êÿlÌÂþ?ùOAöÛ¬ÿ'ïÿìõüOa¸þ¯ë-0ÿ§Þÿ7ÿkÿJoÄÿÿ8÷ÿSþ#=Øø'ëÿüÿÐõú?ÛóêüÇÕùYÿ2ùOà)ÿñasèÖ]ìùOÈèþOAùÛ`þ§Ïå?)hÿ§m0ÿ÷.+ùOAýßlùOÈèùô·
+XÿOÿÐó?å?lùOèÿ¬ý4ÿ·
+âl3h$ÿ¡ó¿9`ã?uþ£¼>ÿ[õ
+®¿Ù*bÌÿý½ õmù¯ó¿¿tþ·m0ÿuþ÷÷úØóÐÿCçÿRPÿÛ`þëüïïÙo°þ¯ó¿¿ùÿmÌÿ©óWû?uþóú·âÁÈäÊ0ÀÆ?YþãuýGõ_
+s¯ ÁüOþKPþα
+æÿÔùáüOý?X|ܵ÷m³ýFÁü'ä?´þC!ù¦Áü'ä?tÿ§ üm0ÿ ùùOa.ûMÖÿ÷ÿÈÕÿò¶Áü'ä?´ÿÂÌ͵Ä0ÿÿÈÿ`²ó_^û¨þKAéÛ`þú¨þCAòÛóÐÿCû(¨ÿm0ÿ ùÕ)èüÛ`þ'?ÿ¥ÒùÔÿÙ6ÿüöPþ¶ëÿéû¨þOaÿPÔÿó_´ÿæÿ¶éläã
+Ñùó«ÔÿÂèñ?uûnÛ_èñ÷.?ÿñOOüø6¦^-í]ÿqÇ|$óÿ¯ùïBóÃù¿Â ¶÷¿y<¶Ëz»Ø×ËOõºY´«ïq{þ_
+ü¾Pý¥Ó" Yâý_vÎ_QÿÉÿTÊÿQÐ~/ÛþGÌþ¡ù¿sòÂpþ_ëz`Ñþ?×ÿ¡÷Yÿqy(Ð?ôtþ3
ÈñZÿñý¹ê°ñzÿ_¸ÿ{åÿ)ø
+ÁüOßÿ¹ÿÔÿÙ6ÿïÿûÆý_ý9¼¯Ozä7æúýAý(h½ß6ÿþÏZÿ§ þ϶Áü'ìÿÿd¿mÀúòþÏ^Ïÿëÿz°æÿÔûÿóíÿcáC)ã
+ø1òAùØø'ëÿüÿÐõú?ÛóêüÇÕùYQÊOùC÷°ÞèB`ÌBþC÷
+ÊØóÿPþ¶~Ûó?yÿç²ÿÔÿÍ6ÿÉó¾Òó?éo°þ>ÿ¡ç
+ÊØó?}ÿçRû?(hþoÄÿ\ç7`ã?uþ£¼>ÿ[õ
+®¿Ù*bÌÿý½ õmù¯ó¿¿tþ·m0ÿuþ÷÷ê½¶Áü'ôÿÐù¿ÔÿÃ6ÿ:ÿû{AöÛ¬ÿëüïïaþCçÙóêüÇÕþOÿEâ¼þ'åíø_0òNùØø'˼®ÿ¨þKaîÕÄ2ÿó_ÿ¥ ó_lù?uþc8ÿSÿwí}Û¬d¿Q0ÿ ùÿPÈe¾i0ÿ ùÝÿ)(ÿaÌBþCþSË~Óõÿôý?Ôÿò¶Áü'ä?´ÿÂÌ͵Ä0ÿqþK©ülüÿòÚÿCõ_
+JØóÐÿCõ
+ß6ÿþÚÿCAý?lùO8ÿEõ_
+:ÿÅ6ÿó_ä?õ¶
+æ?áüíÿ ýmÖÿÓ÷ÿPýÂ0ÿ¡Å`[`þ§?ÿ¥Òþo
+ÿÛf¤ÿ±-?Þÿ8¿Jù
+£ÇÿÔí»m·~~¢Çß»¼ôñãÚzµ8¶wýǵóDÌÿ¿æ¿\õ?
+ù¿SþÛñþï7ÇvYoûzù©^7vuã=nÏÿëÿÁÿSð¡ñ÷ÙF8IDýÿ%ÿ£ú?Ýïmú1ûæÿÎÉ
+ùÐõÀ£ý®ÿCï1²þãòP!«zÿ³Ð¿\õãÿ´þãýUÿ£ÿÔûÿú?ÿFôÏÿÚ hÌÿôýü§ þ϶Áüxÿß·îÿzþ§ð¾>ÕRß.ÿþÏÚÿOAy_Û`þú?kÿ?õ¶
+æ?¡ÿ³ü§ ûmÖÿÓ÷Öó?
Áú¿ò¿ÆÀüzÿßpþ¯þÏ,ÿµ
+âÆÈdÊ0ÀÆ?Yÿçõ¯ë?õ¶
+æÿÔù«ó?² þ/ò6îa½Ñ
Àÿüîÿÿ°
+æ?!ÿ¡ü'õ¶
+æòþÏU&ÿ)¨ÿm0ÿ ù=ÿSþ¶ëÿéózþ§ üm0ÿ ýµÿæÿ¶AüÏù\ùØøOÿ(¯ÎÿVÿO®¿Ù*bÌÂùßÊÿSú¶ÁüOþ·îÿtþ·m0ÿ ùíÿ¥ þ¶Áü'ôÿ(ä?õÿ°
+æ?!ÿ!ÿ)È~Ûõÿôçëü?
+üG¦ü-0ÿ§Î\íÿÔù_$ÎëRÞ.ÿ±CùBùØø'˼îÿUýÂÜ«e0ÿ ç¿(ÿKAç¿ØóêüÇpþ§þ,>îÚû¶YÉ~£`þòZÿ¡Ë|Ó`þòºÿSPþÃ6ÿüü§0ý¦ëÿÉûäêÿCAùÛ`þ'Ϩÿkaÿ#ÿáÿ`²ó_^úäªÿRPúÃ6ÿþªÿPü¶ÁüOßÿCû8¨ÿm0ÿ ùÕ)èüÛ`þÎÿÔÿÙ6ÿüöPþ¶ëÿéû¨þOaÿÐù/ÆÀü'ÿ¢ýß4ÿ·Íÿ½ù«Åñói±ïþÑk¬nwëñ2
+/£æÿy!ÿ9è~o÷ÿ,2òõ³áQù¯ó«¼ò_Fÿ©ÛwÛnýü"D¿wy(5þâÇÿ´94u?hï¶#gÏÿ_÷¹êÏÿÖmïÿ~óxlõv±¯êu³hW7Þ#¢þÿÅÿàå?Íÿmïÿ²;pþxÿ½ê$ä¿m@ÿ#fÿÐü¿ÿ'ùÏ`8ÿºb´ÿÏëÐ{¬ÿ>EȪÞÿ,íÿ¤9þOë¿°ÿ7Wý6þSïÿ
+Wó¯ü´Ø2ÿéû¿òú¿Ûóâý¿ß¸ÿëüïëS-õíù~ÿoÐþ
+jþfÌÿäýßuþ' õ·
+æòý¿^þsý¶ëÿÉû¿{=ÿS®ÿ+ÿkÌÿ©÷ÿçÿEY©ÿ
þQKÆñ?v3 ÿ(ÿ`²þï¯ù]ÿ)¨ÿ»m0ÿ§Î\ÿ£þï$ò6îa½Ñ
Àÿüîÿÿ°
+æ?!ÿ¡ü'Õ{mù¼ÿ{YÉ
+êÿhÌBþCÏÿ¤¿mÀúúüÿ)(ÿaÌÿôýßKíÿ ù¿mÿsFþ£Rþ6þSç?ÊÁõßëü®¿Ù*bÌÿó»Î(ÿOAêÛóâü»ÎêþÏ᯻ãéð°<µÝN`þòÚÿKAý?lù¼ÿGeòúØó?yþ#ÿd¿mÀúªüÇËú¯Îÿâ0Ìè< [`þOÿ¸Úÿ©ó¿H×ÿ¤¼]ÿBþ£Èÿ`²üÇkÿÕ)̽:Xópþò¿tþm0ÿ§ÎçêÿÁâ㮽oì7
+æúüG©õ
+¹Ì7
+æ?!ÿ¡û?å?lùOÈÈ
+sÙo°þ¾ÿúÿPPþÃ6ÿüöQ¹¹¶ñß1úå?`ãìü×þªÿRPúÃ6ÿþªÿPü¶Áü'ôÿÐþ
+êÿaÌBÿÕ)¨ß³m0ÿ ç¿È
+êÿlÌÂù/ÚÿAAúÛ¬ÿ§ïÿ¡ú?
aþC϶Àü'ÿ¢ýß4ÿ·ÍHÿ«ÈÈÇ¢óý«SþÁèñ?uûnÛ_èñ÷./ÿ¡?þ§Í¡©Wc{×\ë1IÄüÿkþ»Ðú?Áü¦ü·-âýßoí²Þ.öõòS½níêÆ{ÜÿWÿWÿn^ÎÊJÒ[%Þÿewáü%õÿõÿLù
+ª÷Ùô?böÍÿÿóÿZó[öÿ¹þ½ÇÈúËCYþY ¿Rý)DÿÓúgôVý6þSïÿ×ùõÿ§à6 Zó?}ÿç ÿ)¨ÿ³m0ÿ'Þÿ÷û¡ç
+ïëS-õíùOèÿ¬ý?ÔüÉ6ÿþÏZÿ§ þ϶Áü'ôÿd¿mÀúòþÏêÿÃa°þ¯ü¯10ÿ§Þÿ7ÿU¦ý¿|(e¼aÿ3Fþ#Wþ6þÉú?¿æ?tý§ þ϶Áü:ÿquþGtþ
§üÇÍ¡{Xot!°æ?!ÿ¡û?å?lùOÈ(ÿIAû?mù¼ÿsÉ
+êÿfÌBþCÏÿ¤¿mÀúúüÿ)(ÿaÌÿôýuþÍÿmø3ò¥ò°ñ:ÿQ^ÿ]¨þCÁõ7[%@ìùþüï ü?©oÌÿôçëþÏAçÛóÿÐþ_
+êÿaÌBÿÿGAý?lùOÈÈ
+²ß6`ý?ùùß:ÿà ÿ)ÿaÌÿ©óWû?uþóú·âÁÈTÊ0ÀÆ?Yþãµÿê¿æ^@,ùO8ÿEù_
+:ÿÅ6ÿSç?ó?õÿ`ñq×Þ·ÍJöóÿÐú
\æó?}þÃéþOAùÛ`þ§ÏÈsÙo°þ¾ÿúÿPPþÃ6ÿüöQ¹¹¶ñß1ò
ò°ñOvþËKÿ\õ_
+JØóÐÿCõ
+ß6ÿþÚÿCAý?lùOȨþKAç¿Øópþü§ þ϶Áü'ôÿÐþ
+Òß6`ý?yÿÕÿ9ò:ÿÅÿó_´ÿæÿ¶¹åÿ®[5q+Fæ?\Ê"ô×ÌUåÿ`0jüÏÿú¹`äø¿Ö]Õ£ñg1þý4 ÞãiüûýåñÏ]ÜOÏÿþÜÿÓÿá|ùÏ·ç%Ø7tÆ?bü1#¡ñ£Æÿ×_"4þcÇ¿ô×ýu~[ó.ó?å9ÿJõÿ£pÔŦ=½ËË¢ç¾úñéß|nÇwÙóßßw¦]ïúlw§æ°mê§ÿëoÖÞý¸íõvqþé¿ù"ËìNþùðéß¹y9WÁß+þn>·»û.þ=nøï¼«ùïþN ÿüø·'GßýgóùCwª·zwæü VyW¾ûôüthç?×»|ðÇfõåï|fÙ,»xÁ§öç¯_ §ùr6»xÁ_wõÛ¸löæ+ü[»Þ\|Ï_pñ]^¿à?ºüòÙ¿àÌ÷íáôøæëÞâ©£Ö]½üôϾÉÚmó_õº9~yAQõùIÖûýëùô,¿|ÁwÝîò+¼sâüê»íë+|^^~Ôûéï»þW¿Í¾õMþ¥{Ø-ÁÏyù¿oë»7ì|ñv°ÖÏ?æââÏ®ÿôâãVñNÜü¿Þÿç£æÿØ7tñëÄø¯Úþ£ê/
+Ñïq»þ_^ÍÿÖÿ(¸ÐßeuÙ5KÜõÄbÿ7¸éÿUÿþ2 ÿ)|/ëÿ÷ºØ"Îÿ
+zdþçܨùö
+]bÜÿÑã×ÿJÿ1ÿ^7½àÿù1`ÿØ7tÆìø§[ÿ)ªëõå¿(¼¬ÿ!ó¼G¬ÿTYÈËåþkø<Ë?Eégj2ü»%îúCïÕÿ²Q×ìºÄ¸ÿãÏ]ÿÓú?
çõìjý/¢¸XsÊëygË{Ùpý/w½Êáò+Öÿ\Yý½ââÃõ?_¸²,.^pcý/»µþ]ÿ]ýõ¿ëózýÏÙìâ7Öÿ²áú«æ3ÿæ+\ÿ
¢×åò®ÿÍÊÊ_¾ÅÕúËfîò£¾±þÝZÿË®Öÿ|ϳ7õëÖÿ~'ÄÝÿôÐó_1êþ}C¿þG?wýOÏ\öÎ]vÍwýÇ®ÿ~Ôõÿ×_"û7þÄõ_]ÿ)|¯ýÿïu/B!B!B!B!øÅÿç¤_ h
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-2n2s2d.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-2n2s2d.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-2n2s2d.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,56 +1,56 @@
-System(0KB HP=0*0kB )
- NUMANode#0(15GB)
- Socket#0
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#0
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#1
- P#2
- Socket#196611
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#1
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#1
- P#3
- NUMANode#1(16GB)
- Socket#256
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#4
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#1
- P#6
- Socket#196867
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#5
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#1
- P#7
-depth 0: 1 System (type #0)
+Machine (phys=0 total=33331648KB)
+ NUMANode #0 (phys=0 local=16554432KB total=16554432KB)
+ Socket #0 (phys=0)
+ L3Cache #0 (9216KB)
+ L2Cache #0 (256KB)
+ L1Cache #0 (16KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ L3Cache #1 (9216KB)
+ L2Cache #1 (256KB)
+ L1Cache #1 (16KB)
+ Core #1 (phys=1)
+ PU #1 (phys=2)
+ Socket #1 (phys=196611)
+ L3Cache #2 (9216KB)
+ L2Cache #2 (256KB)
+ L1Cache #2 (16KB)
+ Core #2 (phys=0)
+ PU #2 (phys=1)
+ L3Cache #3 (9216KB)
+ L2Cache #3 (256KB)
+ L1Cache #3 (16KB)
+ Core #3 (phys=1)
+ PU #3 (phys=3)
+ NUMANode #1 (phys=1 local=16777216KB total=16777216KB)
+ Socket #2 (phys=256)
+ L3Cache #4 (9216KB)
+ L2Cache #4 (256KB)
+ L1Cache #4 (16KB)
+ Core #4 (phys=0)
+ PU #4 (phys=4)
+ L3Cache #5 (9216KB)
+ L2Cache #5 (256KB)
+ L1Cache #5 (16KB)
+ Core #5 (phys=1)
+ PU #5 (phys=6)
+ Socket #3 (phys=196867)
+ L3Cache #6 (9216KB)
+ L2Cache #6 (256KB)
+ L1Cache #6 (16KB)
+ Core #6 (phys=0)
+ PU #6 (phys=5)
+ L3Cache #7 (9216KB)
+ L2Cache #7 (256KB)
+ L1Cache #7 (16KB)
+ Core #7 (phys=1)
+ PU #7 (phys=7)
+depth 0: 1 Machine (type #1)
depth 1: 2 NUMANodes (type #2)
depth 2: 4 Sockets (type #3)
depth 3: 8 Caches (type #4)
depth 4: 8 Caches (type #4)
depth 5: 8 Caches (type #4)
depth 6: 8 Cores (type #5)
- depth 7: 8 Procs (type #6)
+ depth 7: 8 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-4s2c.tar.gz
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-4s2c.tar.gz 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-4s2c.tar.gz 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,16 +1,16 @@
- ¨
-J í_ãÆÅýìO1 °þ¼Åkìn°@fG-±%b4¢ ±íÕ~ú¥¤f·ÝU]g¾ç${Q[W,Þ:uî]]æþßüÒ.þòÃTdE§¿"dç¿7ÞÿúÄÆØÌ,ó¦{1Ea~ø&û®x<´åþÃîWÍjSo¿ñºj@ü@Xî^ê8¦ùÄÕ߸"ÎåEW»Àú#ÔYýZ/ª¿éõ÷6¬?Qÿî×mõu¤¯AJý½7]ýC(<ëàÛõ_ìGø$Ô?Ër×Õ?wyÆú#¸]ÿî¿ùïûÄ×ßûîwºúÖ±þ"ëß6»fÓ¬¢/Brý1¯ÿRëß®÷U¹êûîÃZÅ} §ûK½ß¯¿µú{sºþgÿ»Q^ÿ¾ºüÅg?~ï IÕÿn}<Ôr3ß/åª×ËïqSÿYê¿èÔ?Üø@Éë%Uÿf¥ùknëxÿ·Þêï÷ºé?iõ/Yÿ»ÜSÿëÏë*"õ¿(ëJÚìÿë£þ3[pÿBRýëí²úü5HêÿgîÔÿó§ç?Öz$õ?Ôÿ[¥¼Gúó¿uÁòþÀü?xË×DÿeÛîëûǶÔÃMý;¸þ»Àþîë¶ú©\|áE@%ý·ÇÝä÷ÿÏÿ>mIéëE¢ÿMõkµIxAÿ?üÔÿôX_5ý/uµ¯¶ã¼Ìi7àF;à¶þý`ý¼É©ÆÞñ
- þ+yó0/fQmýkÝ¿ññ÷ÿ^ÿyFýc úu#êÿ¯Ë}µw¿1ÿZîn¿ÇMý¿õÿºÀç} èÿÕDÿÛǯ÷Õþ´8Tm&Ò×ÿÞúÿ!ØSñI×ñ0ÿ¤þãû?üý_ðúÀÐþ¡þÇ÷·þîÿ@8û?>÷ÍãjÍ>$úGø?ïÿèÿÐDÿÿýßůþÇ÷¸·þú¿!ä<ð©þ!þ>ÿC üu#êÿüìÿcèK@ÿN$úßÿ1\ÿw×@ý#àú_7éúwÿó!Hê?¾ÿ#ÔߺÀþÓÝlé ÑDÿ£û?ºg¾7þîÿ@ ôu#ÑÿèþóÖÿIýcøe{h÷¶n¶¼(D¢ÿýÌÿÐDÿüîÿ@`þn$úø?¨T¿nDýÿÉüÏû¿Ìÿ ÑàOý/x=P
Dÿãû?ç?½7ìÿA8íÿQòzI×¿Çø?8ÿ¤þÓù?®Îÿ²ÿaf ¢þ!ó_¨ÿ¢þÇ÷dÌÿøN|ÞÖuµ¤ú"Ñ?ÄÿÁüwÊWDÿÿeþ3ú?t#Ñ?ÂÿAýcQýªõÿó_xþB_ú?t"Ñ?ÄÿAýC¸33QLºþ
-Æÿaéÿ@ ©ÿtó_^ò?ÿîÝHôÉÿ`ÿůþ!ùÔ?æèF¢ÿýÿ¢þ!ó_8ÿóu#Ñ?$ÿç? PþºõÿùìÿcèKÀù/:è2ÿ
ç? pý¯(ýÛdËÇ+N
-ó<õÿLa-ç¿@¬ÛìM³:¾Éõ·ÆtÿõZÿv½¯ÊåüPßwÖ*î_ÿ?û¿M`ÿÂ`ýq9 TýïÖÇC½(7ó]¹øR®ªy½¼ù·×ÿa¨ÿùrã%¯Tý/}æ¯ïÿ?ïÿ{öÿ1pÿ_7"ý'þ%ë;ê°ÿÏõ¿."õéÿß#²ÿc\®[vúÏlaØÿATÿóþOz38¾ÿÎkÁÓù¿³þ$õÿüßðùß:Ïý?6ð f$ú6ÿÙÏÿêóu#ÑÿèçÿÞ¹ÿsþe[Rúzèrþç!0üI7ýOÿl/çÿ8ÿóu#Ñÿ´çÿìåüõêרÿÈö|þÐþ_Hô?þù¿áú¿»0ÿ
-9¯týgÿÏÿAÔºüç+ÿ¯ÿÿ¬þÇ÷·þÿpö|ZïÇÕ}HôñðþþÝHôðøþO<ÿ©þ§Í¾ø?ÿùoºèáÿÈøüòרÿððùB_ú?t"Ñÿ´ùÏOþÿÀõ¿nÒõï0þþúïÿÈõgþ
-ÓÝlé ÑDÿÓÎÿ~òÐÿÒ×DÿùßÌÿÁÀùߺèÿÁó¿ÿ¡þ!ùúGÀüÝHôÉÿ þ!Pýºõÿ'ÿm/þÎÿÐ ÷pþ·.$úßÿ1<ÿé}Æþ?Óþ%¯tý{ÿ#çügúOçÿ¸ÚÿaÿÂÌ2D3ý#æ¿äôÿBàüÝHô?¾ÿ#cþÇwâó¶~¨«%Õ¯þ!þîÿ@pT¾j$úø?xÿ@ÿn$úø?¨3ª_5¢þ?"ÿù?úÐÿ¡þ!þÿpgf<¢týLþG ÿ¤þÓ͹Êÿ`ÿݺèÿÁþ_7ýCò?xþó?t#Ñ?dþû¿8ÿE7ýCæ¿Pÿÿ¬þ!þÿ@ùëFÔÿGä°ÿ¡/ç¿èD¢ÈüÿÀõ¿n¢ô-¯8)<ÎÿñÔÿ3
µÿ!²þm³k6Íê(ú"$×ßÓÝX ©õo×ûª\Îõ}÷aâ>øõÿ³ÿÛöÿ Öÿþo]¤ê·>êE¹ïÊÅrUÍëåÍ÷¸½þCý9ÿ!ä]!(y½¤êÑì£4M|ÿÿeÿß²ÿ÷{Ýô´ú¬ÿ]î©Ãõ?é"Rÿþ¿ð="û?æäú7¾{ÍláÙÿATÿóþøü»ä?[Ö¤þãÿ>ÿ3ÿ
-< ¨þ§Ívügöÿ 0ÿY7ý~þïû?óß1|,ÛÒ×DÿügÿÀ~n$ú6ÿÙ]ò9ÿóu#Ñÿ´çÿÜåüõêרÿÈ|þÐþ_Hô?þù¿áúß3ÿ
-9¯týgÿçCÔºüçýÏüÌÖDÿãû?Â[ÿ÷ ýÖûæqµæ
@ý#ü÷ôèF¢ÿþoÌÖDÿÓæ??ù?èÿÀü7ÝHôñðùå¯Qÿ1ÿÏÿúÐÿ¡þ§Í~òpþ®ÿu®ñ0ÿ¤þãû?òAýìÿ@0ÝͽHô?íüï'ÿ÷ Púºè1ÿúÇÀùߺèâÿ`ÿó?t#Ñ?$ÿû?ÿ¡þ!þêÕ¯QÿÒùßù@úôó¿éÿÐ
Dÿãû?ç?½7ìÿA8íÿQòzI×¿Çø?8ÿ¤þÓù?®Îÿ²ÿaf ¢þ!ó_¨ÿ¢þÇ÷dÌ
ÿøN|ÞÖuµ¤ú"Ñ?ÄÿÁüwÊWDÿÿó!Ðÿ¡þ!þêÂêW¨ÿÿÂóúÐÿ¡þ!þêÂñbÒõo0þCÿIý§ÿòÿÁü7tèF¢DþG`ÿůþùÔ?æèF¢ÿýÿ¢þ!ó_8ÿóu#Ñ?ÄÿÁó(Ýúÿüöÿ1ô%àüHôÿÂó¸þ×MþÓG¾¼â¤ð8ÿÇSÿÏÖú?DÖ¿mvͦYE_äú[c2ú ¤Ö¿]ï«r9?Ô÷ݵû@â×ÿÏþoxÿ0Xÿg<
-¦TýïÖÇC½(7ó]¹øR®ªy½¼ù·×ÿa¨ÿ"gþ'Üø×KªþÍ>Jó×Ä÷ÿ÷ÿÿûÿºé?iõ/Yÿ»ÜQÿëÿ;®ÿu©ÿKÿ_øýãBpÆw¯³-,û?êÞÿ±óë@RÿñÏÿ
-ÿóôÿC° 5#Ñ?$ÿý?ÌÖDÿ£ÿ{çþÏüg˶¤ôõ"Ñ?äüçA`øn$úä?óüæ?ëF¢Èù?êÕ¯QÿÿÌóúÐÿ«þÇ?ÿ7\ÿóü
-hÿÕLºþ3ÿãÔÿ§ÿcz$õ.ÿùÊÿÁüÌÖDÿãû?ó?\ȹÿáìÿø´Þ7«5/úèâÿàýýºèàÿðýßxþS7ýCòéÿÀü7ÝHôñðùå¯Qÿáÿàó?¾ôèD¢Hþ3ç?Aàú_7éúO>)<ÞÿaÿDRÿñýù þÌÿ@aº- zèÚùßö2ÿþ¾n$úçüï?ÿþ9ÿûó?t#Ñÿ´ùù@ÿ¡þ§õXæ ¡úu#êÿO:ÿÛ^ü<ÿ¡/Aïÿàüo]Hô?¾ÿ#õï3öÿ!öÿ(y½¤ëßcüÿARÿéüWû?ìÿBY&hF¢ÿiç¿Xæ áüÝHô?¾ÿ#cþÇwâó¶~¨«%Õ¯þ!þîÿ@pT¾j$úø?xÿ@ÿn$úø?¨3ª_5¢þ? ÿ#0ÿB_ú?t"Ñ?ÄÿÁó_îÌG@®ÿRÐÿ@Rÿéæ¿ôõçütèF¢ÿió?.ó_ýÿ(~ÝHôÉÿ þ!0ÿC7ýCüìÿBàüÝHôÿBÿ7æ?ëF¢Èüÿ@ùëFÔÿ4ÿÃqþ¾ÿ¢þ!ó_xþ×ÿºÒºåã'
Çù?ú¦°ÖÑÿ ²þm³k6Íê(ú"$×߬ ÿBjýÛõ¾*óC}ß}X«¸$~ýÿìÿ6÷Ãõ?Í ºHÕÿn}<Ôr3ß/åª×Ëïq{ýú/8ÿCÞ×KªþÍ>Jó×Ä÷ÿ÷ÿyþ÷ÿu#ÒÒê_²þw¹£þ!Öÿë]DêÿÒÿ¾GdÿǸñÝëlfÎTÿóþ
ä?ü߬ÿôHê?þù¿áó¿åü6ð f$úGä?óüæ?ëF¢ÿÑÏÿ½sÿgþ3e[RúzèpþÏÌÀ~n$úä?óü/æ?ëF¢Hþ3õêרÿÈæù?} èÿÕDÿãÿ®ÿ»ë ÏÿC°!§â®ÿãÿàù?úOÿ|åÿàõóu#ÑÿøþáüxþÃÙÿñi½oWk^ô!Ñ?ÄÿÁû?ú?t#Ñ?ÄÿAÿ'ÿÔDÿÓæ?_üõùoºèáÿÈøüòרÿððùB_ú?t"Ñÿ´ùÏgÿãù\ÿë&]ÿãÿÈéÿ@ ©ÿøþ|Pæ 0ÝÍ
½Hô?íüï'ÿýÿ(}ÝHôÏùß8ÿ[7ýsþ÷ö{u#Ñ?$ÿó¿!0ÿC7ýCò?¨T¿nDýÿIç_ö=çÿAèKÐû?2^T!ÑÿøþáùOï3öÿ!öÿ(y½¤ëßcüÿARÿéüWû?ìÿBY&hF¢Èüú!pþn$úßÿ1ÿã;ñy[?ÔÕêWDÿÿ÷ 8*_5ýCü¼ÿC ÿC7ýCüÔ?Õ¯QÿÿÁü} èÿÐDÿÿÏA¸33QLºþ
-Æÿáéÿ@ ©ÿtó_®ò?Øÿ
@÷n$úä°ÿâ×DÿüÿÀüÝHôÿÂþ/ÎÑDÿù/Ô?æ?ëF¢Èüÿ@ùëFÔÿGä°ÿ¡/ç¿èD¢ÀüÏüO\ÿë&Jÿé¯8)<ÎÿñÔÿ3
µÿ!²þm³k6Íê(ú"$×ßÓÝX ©õo×ûª\Îõ}÷aâ>øõÿ³ÿÛöÿ Öÿþo]¤ê·>êE¹ïÊÅrUÍëåÍ÷¸½þCý9ÿ!䯼^Rõ¿höQ¿&¾ÿÿ²ÿoØÿÀýÝô´ú¬ÿ]î¨Ãõ?¯ºÔÿ¥ÿ/|Èþq!8ã»×ÙÌýIõ?ïÿØÏÿ¹óù¿Óóë?=úþoøüÏüg6ð f$ú6ÿÙÏÿ±ÿùϺèôóïÝÿùüácÙ¾^$úä?óü?ú}u#Ñÿ´ùÏîÿÌùÿ¬þ§=ÿç.ùÏÔ?ª_7¢þ?"ÿÏÿúÐÿ«þÇ?ÿ7\ÿ{æ°!§â®ÿâÿàüoúOÿü²ÿãÿùϺè|ÿGxëÿàþ³ÿãÓzß<®Ö¼èC¢ÿ÷ôèF¢ÿþo<ï¥þ§Í~òÐÿ
-ùoºèâÿàó?Ê_7¢þ?ÂÿÁç} èÿÐDÿÓæ??ù?8ÿ
-×ÿºI׿Ãä0ÿ¤þãû?òAýìÿ@0ÝͽHô?íüï'ÿ÷ Púºè1ÿúÇÀùߺèâÿ`ÿó?t#Ñ?$ÿû?ÿ¡þ!þêÕ¯QÿÒùßù@úôó¿éÿÐ
Dÿãû?ç?½7ìÿA8íÿQòzI×ú0ðÂýÿARÿéüWçÙÿ
0³L ÑDÿù/Ô?ÎÑDÿãû?2æ
|'>oëºZRýJèâÿ`þ;Gå«F¢ÿùÏèÿÐDÿÿõaFõ«FÔÿäðü'¾ôèD¢ÿúpgf<¢týÿ#£ÿ¤þÓÍyÉÿ`þº?t#Ñ?"ÿ#°ÿâ×Dÿüêó?t#Ñ?ÄÿÁþÎÑDÿù/ÿ ùϺèâÿàù¿nDýDþûÿúpþN$úÌáù\ÿëæ¶þòóÃ×v¾k~ëd(·«)Ç®ÿóóþåó?ÞïuuÿÏ-_¯8)<ÎÿõÔÿ7
µÿ!²þm³k6Íê(ú"$×߬ÈY©õo×ûªìõý&zÿüÿ|þÃÞÿ!ÿ3îê"Uÿ»õñP/ÊÍ|W.¾«j^/o¾Çíçÿ0ÔÁü¹ñ%¯Tý/}æ¯ßÿ{öÿxîÿaàó¿nDúOZýKÖÿ.wÔ?áþ×ÿºÔÿeÿOøýãBpÆw¯³Íö$Õÿ¼ÿk'>ÿkÏçgýHê?þùßáó¿uûÿlà`ÍHô?mþ»½ÿ¥þ!0ÿ]7ý~þ÷û?ç¿`øX¶%¥¯þç}Áóÿþ¦þ§Í·çó¿çÿB`þ»n$úöü¯=ÿ¥þ1PýºõÿùïÏÿúÐÿ«þÇ?ÿ;\ÿw׿A°!§â®ÿôÃ'
'û?xþ¤þÓå¿_ù?xýÀüwÝHô?¾ÿ#¼õðü³ÿãÓzß<®Ö¼èC¢ÿ÷ôèF¢ÿþOì÷êF¢ÿióßüÔ?æ?êF¢ÿÏÿ(Ýúÿÿÿ!ô% ÿC'ýOÿ~ö8ÿÀÀõ¿nÒõï0þ@ÿIýÇ÷äú3ÿ
én¶tèE¢ÿÑýÝ3ßÿýÿ(}ÝHô?ºÿüõ2ÿÃ/ÛC»\´u³å¥@!ýCü<ÿùºèÿa2êó?t#Ñ?ÂÿAýc úu#êÿOçÿÈ"\ö©} zÿçéB¢ÿñýÃóÞgìÿC8íÿQòzI׿ÐÿáCQä'ÿGÈ8ÿ¤þÓù?®ò?Øÿ
0³L ÑDÿÓÍé¯ÿ.çù?ÿ¢þÇ÷dÌÿøN|ÞÖuµ¤ú"Ñ?Àÿ2ö!8*_5ýOçÿè×ÿÁ;>ÿC ÿC7ýOçÿèõgÔ?Õ¯QÿÿÁüôèF¢ÿéüýýß
{g©wfÆ# I׿Áä8ú?Hê?Ýü«üö!Ðý¡þ!ùÜÿ
@ñëF¢Hþÿ 0ÿC7ýCò?Øÿ
À¼gÝHôÿBýC`þ³n$úÌaþ;Ê_7¢þ? ÿ#§þ!ô%àüHôÿBÿ'®ÿu¥ÿ"ÙòñÂ#ó?.ý?SXgèÿ@Yÿ¶Ù5fu}ëoÉ8ÿBjýÛõ¾*óC}ß}X«¸$aýßû¿MÎýõÿýߺHÕÿn}<Ôr3ß/åª×Ëïq{ýúï~Iý#ÈÏ)y½¤êÑì£4M|ÿÿeÿßÒÿ÷{Ýô´ú¬ÿ]î©Ãõ?Ó t©ÿKÿ_øýsúiüiÿ/³§ùïìÿLORýÏû?vâóî|þ/gþ3IýÇ?ÿ7|þ·ó1ØÀèºüçþúïûÿ¬þG?ÿ÷Îý?çó?e[RúzèÿÌó?þ¤þ§ÿí.ó¿éÿ
ÀügÝHô?íù?wÿMýC úu#êÿòÿ¡/ý¿:èüóÃõ¿÷þ6Ðþ«týgÿ¥ÿ¤þÓå?_ù?ÿùϺè|ÿGxëÿàþ³ÿãÓzß<®Ö¼èC¢ÿ÷ôèF¢ÿþoÌ{ÓDÿÓæ??ù?èÿÀü7ÝHôñðùå¯Qÿáÿàó?¾ôèD¢ÿió/þÎÀÀõ¿nÒõï0þæÿBÔ|ÿG>¨¿uý¦»ÙÒ¢þ§ÿýäÿàþJ_7ý#æSÿ8ÿ[7ýCüìÿ@`þn$úGäXîÿ@`þn$úGø?¨T¿nDýÿÉüÏû¿Ìÿ Ñ ÿMÿ.$úßÿ1<ÿé½aÿÂiÿ×Kºþ=ÆÿÁù?$õÎÿqÿÁþ/ef$úÌ¡þ!pþn$úßÿ1ÿã;ñy[?ÔÕêWDÿÿóß!8*_5ýCüÌ@ÿn$úø?¨3ª_5¢þ?"ÿç?!ô% ÿC'ýCüÔ?;3ãŤëß`üþúO7ÿå*ÿû?èþÐDÿüö PüºèÿAýC`þn$úø?ØÿÀù/ºè2ÿ
ó 0ÿY7ýCæ¿ðüÊ_7¢þ?"ÿý} 8ÿE'ýCæ¿ðü®ÿuómýoel÷xÃIáþãBpÆw¯3y0ô@¨ÿ
é²ßó-¬ÿËõ¿{áüÑõï¹ð=Îõ/õ·íÊo]qêÿ¦»ÿÛ?ÿù/Ïÿye"ý^`ý£ëo
ï!©Wéôë]éõX¤ÿUÿß`ýãêß=ôÝGÕ
-ÞãÖó Cÿ±9ÿ Ê:_×í»0ó3~<ÿ³¯õáð!»üú¡ÙWõjÛým½m«ý¦*Îÿ§¼+]Ï~Ü4r3?}Q®ÿ¦]WûË?e[éÿ))×'|ÑõßD]ÿ¥?ÒÊõ]ÿ¯Õ×zûÐHÞãÆõߨn±?¸þgý~üûùòüῪ¯¶Üüõà ¹Y1öî^ðó¾ª.¿ßaýÌÞe¯_ðùP-^ÐÝü]^\ÿ [´õ¯/ϳ³üê¿lËëøYnsë¯^ðïõj}õS^È/xõS_ðÍoßþ×ì^ðíÍõ¾=^ÿùyîÝõpNÔ»/_þÕùs½©þ»\UËf6ÝWÿú,w»çòü`_½Åß¶ÍöêOøàî²Ùìú§ßüTÞo_a}xõÿùóÏÛî«ß½æ¯ïý?5ÛÅëÏñõþ±)ï¯ÛÞ¹Üß]×âquù×_}âÙÛß½ú¸¹Jrÿ7Â÷=ÿÇ=ÿI¤_ÿSêï
ï!Zÿ¹¨úK¤Xÿ¸ú/ëîên ÷¸õüÿÖÿe,ç?aà-W7)שE÷ÿ¸ëÿï¿D(×Jý£Ì~ïpóúÿÆÿôÿcèKðäÿ{xàý@)ú/ï!¹þÛ¸þ¯ôGzA¹þ !B!zø?/ @
\ No newline at end of file
+ ÊÖ9K íÝÛØ
ûºÂIxþÈRîÁ4f& 6r)°$DXÕ=5O?¤T¬R±Ö9»ÉåAïõ¡;¶Û)kkë¬}W¹ÿ7²«?ý0YGBÿ£)Bvþµñþüã3?c3²ÌîuÝÏMöÃ0Û;ºâñÔÇ~¸ß4]½ÿ×UÇâ
+a¹{ÿéé4Ïw ®þÆyp./úúçÁ³þFõ_W?׫jâïAzý½-rÖÁ¿¨÷ó¶ú:Ñ× ¥þÞ®þ!7õGðëõ_'ø$Ô?Ër×Õ?wEÁú#¸]ÿîßü·} âëï}÷;]ýëYõoC³k6O¢/Brýmw7Àó?Ôú·ÛcU®§ú¾û°6qH_`©÷·ëoí¨þÞôçÿlæ¿ûåõJðË>ûñ{¿#$UÿíÓ©^»å¡\})7Õ²^ß<ÆMýga¤ÿnh©¹ñ×KªþWÍ1Jó×ÜÖÿøúo»Pÿx½×HÿI«Éúßå9õa¼þ÷<¨"Rÿ«rµ¤]ÀÈþq!¸n9Úé?ë~dÿARýëýºúü5Hêÿg®ïÿ
þþõIýOõÿV)ÇH¿ÿ·®0¼þ#°!ÿ^òõ"ÑÙ¶Çúþ±"õpSÿÆÎÿ.gÿÃ?u[ýµ\}áI@%ý·O¹¯ÿÝÔ?e[RúzèWý\í!èÿÞÿAýÏ¥øU#ÑÿªÙVÇj¿zZvéÜhÜÖ¿ÿwúG`ìÏ èÿòé´låéԬ겮ۧ_9FüõÐQÿ¨~ÝúÿÛòXÝo,¿ÛǸ©ÿ÷þ_WðþÂPúu"Ñÿþñë}uìW §ªÐDúúß{Kÿ?r*^1éúÏ0þæ?@ÔzÿçÿÈsÿÚ?T#ÑÿôþðÞÿÁç?ÎþOÛcó¸ÙòD þþWðúþÝHôñÐÿ
+ÁPüªèzÿ{ïÿ ÿBÎ
+ªèâÿàý?Ê_7¢þ?ÀÿÁþ?¡ôèD¢ÿéýãõ¿÷ÖSÿ¸þ×MºþÆÿÁü_úOïÿÈGõ·®`ÿé.¶tèE¢ÿÉýÝ=ß;ÿÿ@ ôu#ÑÿäþóÎÿé©?íOíñqÕÖͧ
Hôñ°ÿùºèÿÁç?ÿ¡þ!þêÕ¯Qÿ6ÿÇËó_æJðá'<¨B¢ÿéýãýÞ;öÿ
ôÏÿ(y½¤ëßcüÿARÿùüWûÙÿ
°°L ÑDÿù/Ô?ÎÑDÿÓû?2æ|'>ïëºZSýJèâÿ`þ;Gå«F¢ÿùÏèÿÐDÿÿõaAõ«FÔÿGÌáþOC èÿÐDÿÿõáÎ,¸D1éú7ÿ¡ÿ¤þóÍyÍÿ`þº?t#Ñ? ÿ#ìÿ@ øu#Ñ? ÿÃQÿÿ¡þ!þö pþn$úÌáüÌÖDÿÿ÷@ üu#êÿò?ØÿÇ0ó_t"Ñ?dþ÷@àú_7Qú·É7ô
+ó<÷ÿLÑ èÿ@Yÿ¶94»fó$ú"$×ßv¿*X©õo·Çª\/Oõ}÷amâ>øõÿÿÛìÿAÿ3.tªÿÃöéT¯ÊÝòP®¾jY¯oãöú?õ_0ÿCn| äõªÿUsÒü5ñýÿ×ù?ìÿcàóÝô´ú¬ÿ]¨ãþ?×ÿºÔÿ¥ÿ/<FdÿǸ\·íô9±ÿ ©þçç?éÍàøþ_8¯3k|XúO¿ÿo|ÿß/ xýG`7 jF¢ÿyóíeÿõùϺèòý߸þsþe[Rúzè±ÿÏpÿ/?éF¢ÿyóíeÿçB`þ³n$úwÿ½ìÿ£þ!PýºõÿùÏ9ïÿ!% ÿW'ýO¿ÿo¼þ÷ù?lÈ©xŤë?Ãø?¸ÿ¤þóå?_ù?xþÀügÝHô?½ÿ#¼÷pÿ³ÿãÓöØ<n¶<èC¢ÿ×ôèF¢ÿþOÜÿ©þç;ø?ÿùoºèáÿ°¼ÿ@ùëFÔÿGø?xÿa(ý:èÞüçÿû?0pý¯tý;ÿ#§ÿ¤þÓû?òQýÿÂt[:@ô"Ñÿ¼ó¿ýôÿC ôu#Ñ?dþ7¯ÿ8ÿ[7ýCæsÿ/æèF¢Hþ¡þ0ÿC7ýCò?¨T¿nDýÿYçÛÿóÿ %üÿþ§÷÷zoÙÿÐ?ÿ£äõ®ñpþ3Iýçó\=ÿaÿÂÂ2D3ýCæ¿Ðÿó_t#ÑÿôþùßÏûú¡®ÖT¿R$úø?øü£òU#Ñ?ÄÿÁë?ú?t#Ñ?ÄÿAýCXPýªõÿùÌÿ0þHôñpÿ;³àŤëß`üþúÏ7ÿå*ÿý_tèF¢Hþû?(~ÝHôÉÿàþÌÿÐDÿù/ìÿBàüÝHôÿBýC`þ³n$úÌáþ¿nDýDþûÿpþN$úGÌaþ'®ÿu¥ÿlùxC¯ð8ÿÇsÿÏÖsþÈú·Í¡Ù5'Ñ!¹þÖnIÈúH»=Våzyªï»k÷įÿ_üߦ`ÿÂhýoéÿÖEªþÛ§S½*wËC¹úRnªe½¾yÛëÿ0Òè þä]!(y½¤êÕ£4M|ÿÿåù¿wìÿCàõ^7"ý'þ%ëêÂxýÏÍ`ºÔ
ÿ¥ÿ/<FdÿǸñÝëlæcÿARýÏÏìÌûÿ\ßÿýýë??úO¿ÿo|ÿÏüg6p f$ú7ÿÙ×ÿìÿa`þ³n$ú|ÿß·®ÿ¼ÿð±lKJ_/ýCò¹ÿû}ºèÞügwÉæü?ÌÖDÿóîÿsügêÕ¯QÿÿÌûC èÿÕDÿÓïÿ¯ÿ=ó?@ØSñI×ðpþ7IýçË~}þ3ÿóu#ÑÿôþðÞÿÁç?ÎþOÛcó¸ÙòD þ!þ^ÿ!Ðÿ¡þ!þú¿!0ÿY7ýÏÿüìÿ ÿóßt#Ñ?ÄÿÁû¿nDýÿ÷ÿÐÿ¡þçÍ~öpþ®ÿu®Éÿ`þ/Iý§÷ä£ú[W°ÿÁt[:@ô"Ñÿ¼ó¿ý|þÒ×DÿùßúÇÀùߺèâÿ`ÿó?t#Ñ?$ÿÏ 0ÿC7ýCüÔ?ª_7¢þÿ¬ó¿ó?%æÓÿ¡þ§÷÷zïØÿÐ?ÿ£äõ®ñpþIýçó\íÿeÿÂÂ2D3ýCæ¿Pÿ8ÿE7ýOïÿÈÿñø¼¯êjMõ+E¢ÿùï¯þ!þæ?C ÿC7ýCüÔ?Õ¯QÿÿÁýÐÿ¡þ!þêÂYpbÒõo0þþúÏ7ÿå5ÿùoèþÐDÿüP°ÿâ×DÿüGýc`þn$úø?ØÿÀù/ºè2ÿ
ó 0ÿY7ýCüÜÿòרÿÈÿ`ÿÂPÎÑDÿù/ÜÿëÝDé?}äËz
Çù?û¦èÎ ô ¬Û]³y}ëo±ôÿ@H»=Våzyªï»k÷įÿ_üߦàõÂhýq7.RõØ>êU¹[ÊÕrS-ëõÍcÜ^ÿ±þùrãsJ^/©ú_5Ç(Í_ßÿÿÃüo|þ¯þVÿõ¿Ëõa´þ¿ãú_ú¿ôÿ
Çìÿ3¾{Í1ìÿ HªÿùùEìÿóýýë??úO¿ÿo|ÿß- èÿ`7 jF¢@þs`ÿóu#Ñÿäûÿ¾qýgþ3e[Rúzè²ÿó¿ 0üI7ýCò¹ÿóu#Ñ?dÿõêרÿÈæþ?C èÿÕDÿÓïÿ¯ÿ¹ÿ
+´ÿj
&]ÿÆÿèÿ@ ©ÿ|ùÏWþæ¿@`þ³n$úÞÿ1ÿáòÏ ý¶Çæq³å@ýCü¼þC ÿC7ý#üþoÜÿ©þùÏþoÌÓDÿÿïÿ!PþºõÿþÞÿCJ@ÿN$úä?sþ®ÿu®ÿô0è^áñþËü úOïÿÈGõgþ
+Ó]lé ÑDÿóÎÿ¶üúÿ!Púºèó¿?pþ·n$úçüïßÌÿÐDÿóæXæ aþn$ú×ÿaÿêרÿ?ëüo{ñpÿ?¡ÿó¿u!Ñÿôþ0Ö¿·ìÿCèÿQòzI׿Gø?BÆùÏ$õÏÿqõüý_ËÍHô?ïüËü ÿ¢þ§÷dÌÿøN|Þ×uµ¦ú"Ñ?ÄÿÁç?¯þ!þ^ÿ!Ðÿ¡þ!þêÂêW¨ÿÈÿ`þ¡ôèD¢ÿû¿ Ü·(&]ÿ3ÿ%§ÿ¤þóÍêÏù/(èþÐDÿóæ¸Kþýÿ(~ÝHôÉÿ þ!0ÿC7ýCæ¿°ÿó_t#Ñ?bþç?``þ³n$úÌáþ/¿nDýÿYó?ç¿ JÀù/:è2ÿ
û? pý¯(ý§[>ÞÐ+<ÎÿñÜÿ3
õþõoC³k6O¢/Brým÷+ú ¤Ö¿Ý«r½<Õ÷ݵû@â×ÿ/þïîÀë?ñúfP]¤êÿ°}:Õ«r·<«/å¦ZÖëǸ½þcýÿ!ï
+AÉë%Uÿ«æ¥ùkâûÿ/Ïÿ¹ÿÿëF¤ÿ¤Õ¿dýïò@ýCÿ-×ÿºÔÿ¥ÿ/<FdÿǸñÝëlæ2ÎTÿóóÿíYúO¿ÿo|ÿo9ÿ
+Ü ¨þùÏÜÿùϺèòý߸þ3ÿÃDz-)}½HôÙÿÇü'ì÷éF¢Dþ³åþ_ÌÖDÿügêÕ¯QÿÿÌûC èÿÕDÿÓïÿ¯ÿ½·ÜÿÁWLºþ3ÿûÿ Hê?_þóÿçÌÖDÿÓû?Æó?\àþ/gÿǧí±yÜly"ÐDÿÿ¯ÿèÿÐDÿÿý¸ÿS7ýÏÿüìÿ þ!0ÿM7ýCü¼ÿ@ùëFÔÿGø?xÿa(ý:èÞüçÿû?0pý¯tý;ÿ#Ðÿ@Rÿéýù¨þÌÿ@aº- zèÞùßÏþúÿ!Púºèó¿?pþ·n$úçüïßì÷êF¢Dþçc`þn$úGø?¨T¿nDýÿYçÛÿóÿ %üϪèzÿÇxÿ§÷ýýó?J^/éú÷ÿç?CÔ>ÿÇUþû¿ è2ÿ
þ_ÿ¢þ§÷dÌÿøN|Þ×uµ¦ú"Ñ?Âÿaùü£òU#Ñ?ÄÿÁë?ú?t#Ñ?ÄÿAýCXPýªõÿùÌÿ0þHôñpÿ;³àŤëß`üþúÏ7ÿå*ÿý_tèF¢Hþû?(~ÝHôÉÿàþÌÿÐDÿüö!pþn$úÌ¡þ!0ÿY7ýCæ¿pÿÊ_7¢þ?"ÿýC 8ÿE'ýCæ¿pÿ7®ÿu¥ÿôÈ7ô
+ó<÷ÿLa=ç¿@¬Û]³y}ëo±õGZÿv{¬ÊõòTßwÖ&î_ÿ¿ø¿MÁþÑúßÐÿTý¶O§zUîrõ¥ÜTËz}ó·×ÿa¤ÿþ>úG_PòzIÕÿª9FiþøþÿËóïØÿÀçÿºé?iõ/Yÿ»<PÿÆët©ÿKÿ_xÈþq!8ã»×ÙÌËþ¤úÿØ÷ÿ¹¾ÿúû?Ö~$õ~ÿßøþùÏ(là@ÍHô?oþ³;¯ÿÙÿÃÀügÝHô?ùþ¿o\ÿÿácÙ¾^$úä?sÿ?ú}u#Ñÿ¼ùÏîÿÌùÿ¬þçÝÿç.ùÏÔ?ª_7¢þ?"ÿ÷ÿÐÿ«þ§ßÿ7^ÿ{æ°!§â®ÿáÿàüoúÏÿ|åÿ`þ?æ?ëF¢ÿéýá½ÿÏ ý¶Çæq³å@ýCü¼þC ÿC7ýCòéÿÀý^ºèÞüçgÿýßÿ¦þ!þÞÿC üu#êÿ#ü¼ÿ0þHô?oþó³ÿóß pý¯tý;Lþó!Hê?½ÿ#Õߺý¦»ØÒ¢þçÿí.ó¿ùü¥¯þ!ó¿©ÿþ!ùìÿ@`þn$úäðùæèF¢ÿú@õëFÔÿuþ·cþ¡Ãüoú?t!ÑÿôþñþOï-ûúç¼^Òõ>¼Wx²ÿó Hê?ÿãêùû¿ è2ÿ
úÀù/ºèzÿGÆüïÄç}ýPWkª_)ýCüÌà¨|ÕHôñ0ÿýºèâÿ þ!,¨~ÕúÿüîÿÄ0þHôð0ÿÃYpbÒõo0ó_
+ú?Hê?ßü×üæ¿a ûC7ýCò?Øÿ@ñëF¢Hþõùºèâÿ`ÿç¿èF¢ÈüÎÀügÝHôñpÿÊ_7¢þ?"ÿýC 8ÿE'ýCæ¿pÿ®ÿus[ÿ§Nùëåék»<4¿t²??×ûMz
ç±ëÿüüüÏòþ¯÷ººþgɯ7ô
+ó=÷ÿMa=ç?A¬Û]³y}ëo»_ÖAjýÛí±*»å@}¿^Äßÿ¿ìÿ0¯ÿF÷ÿê"UÿíÓ©^»å¡\})7Õ²^ß<Æíûÿ0ÖÁü¹ñ%¯Tý¯cæ¯þ÷âÿñ|þ÷ÿºé?iõ/Yÿ»<PÿÆÏÿ¸þ×E¤þ/ÏÿÇìÿ3¾{Í\³ÿ ©þçç¿væý¿ö²ÿ×±þ$õ~ÿïøþ¿[ ðù?¸X3ýÏÿn/û©Ì×DÿïÿýÆõó_0|,ÛÒ×Dÿý¿ûÿ!0üM7ýÏÿnÏû-çÿB`þ»n$úwÿ¯=ïÿ¥þ1Pýºõÿùï9ïÿ!% ÿW'ýO¿ÿw¼þ÷ù_lÈ©xŤë?}3`¯ðdÿ÷ÿAÔ¾ü÷+ÿÏÿÿ®þ§÷÷þîÿpö|ÚÇÍ'}HôñðúþÝHôñÐÿ ý^ÝHô?oþû³ÿúÀüGÝHôñðþå¯Qÿáÿàý?¡ôèD¢ÿyóß/þîÿÀÀõ¿nÒõï0þOÿIý§÷ä£ú3ÿ
é.¶tèE¢ÿÉýÝ=ß;ÿýÿ(}ÝHô?¹ÿü÷2ÿÃOûS{|\µu³ç©@!ýCüÜÿùºèÿQPÿÿ¡þ!þêÕ¯Qÿ>ÿG^áüü7£þ!%ü¤þ§÷÷zoÙÿÐ?ÿ£äõ®?£ÿâÈ{ÿG°ÿARÿùüWùìÿBXX&hF¢ÿùæ¿çsÿÎÑDÿÓû?2æ|'>ïëºZSýJèâÿ`ÿ£òU#Ñÿ|þaý|àý?ú?t#Ñÿ|þAÿyFýcXPýªõÿùÌÿ@ÿn$úÏÿ1\ÿ½úGpgÜ¢týLþ¥ÿ¤þóÍyÍÿìÿB ûC7ýCò?øüůþ!ù¼ÿÀüÝHôñ°ÿyϺè2ÿ
úÀügÝHôÉÿ`þ;Ê_7¢þ?"ÿú0ó_t"Ñ?dþý¸þ×MþdËÇz
Gæ\ú¦°ÝËèÿ Yÿ¶94»fó$ú"$×ßc9ÿBjýÛí±*×ËS}ß}X¸$aý?ø¿mÆçÿFëÿ;ú¿uªÿÃöéT¯ÊÝòP®¾jY¯oãöú?ôú[ê@n|NÉë%Uÿ«æ
¥ùkâûÿ/Ïÿ½§ÿ¯÷ºé?iõ/Yÿ»<§þ!×ÿLÐE¤þ/ýá1"û?Æ
àïÿe®ÿÎþÏü$ÕÿüüÇμÿÏó3æ?CÔúýãûë8ÿ
+Ü ¨þçËÎÿ.gÿóu#ÑÿäûÿÞ_ÿ}Æû˶¤ôõ"Ñ?bÿ÷ÿ``øn$úwþ·;ïÿsôÿB`þ³n$úwÿ;ïÿ£þ1PýºõÿùÏÌÿÁ0þ_Hô?ýþ¿ñúß{Gÿ?hÿÕLºþ3ÿÃÐÿ@Rÿùò¯æ3ÿóu#ÑÿôþðÞÿÁç?ÎþOÛcó¸ÙòD þþWðúþÝHôñÐÿ
+yoºèÞüçgÿýßÿ¦þ!þÞÿC üu#êÿ#æóþÂPú?t"Ñÿ¼ùÏÿç?`àú_7éúwÿó!Hê?½ÿ#Õߺý¦»ØÒ¢þçÿýìÿàó¾n$úÌÿöÔ?ÎÿÖDÿÿû?ÿ¡þ!ù|þùºèâÿ þ!Pýºõÿgó¼<ÿeþ¡Ãüoú?t!ÑÿôþñþOïûúç¼^Òõï1þÎÿ ©ÿ|þ«ý¿ìÿBXX&hF¢Èüêç¿èF¢ÿéýó?¾÷õC]©~¥Hôñ0ÿ£òU#Ñ?ÂÿáÿþÝHôðPÿT¿jDýÄüîÿ0þHôñPÿîÌ[@®ñXú?Hê?ßü×üæ¿a ûC7ýCò?Øÿ@ñëF¢Hþõùºèâÿ`ÿç¿èF¢ÈüÎÀügÝHôÉÿàþ¿nDý@þûÿpþN$úÌáþ\ÿëæ×õ¿oÖU²Ýã½Â#üÆ
àï^gòàèÿQÿþ²ßò-¬ÿëù¿{ãüÑõï¹ðçúÅú;»Nöýël(Bwý·üã^þùöÊDú^aý£ëo
ÇÔßÇÕ_ú^aý£ë/=ôï£êÿÛ/¬\ý»¾²û¨ZÁ1nÝÿ0öñþB_Öå¶n?ÌÜ
_øðãù¿}O§Ùåçͱª7ûîõ¾»ªü¹:ÿò®ty¾øq׬Êݲÿ¢\ÿ9M»ÿʶÒÿSRÎÿNxÑù?:ÿKßÒ+Êõ]ÿ¯Õ×zÿÐHqãüo¬)Æçcèÿðãßϧç
ÿU}ýÔ´åîÏzLæÅ"Ø_þzõ¿«êòûÖ/ì]ööOÕúùÝeÀßåÅõðU[ÿüúøÜ:»È¯^ðÓ¾¼~_ä6·þêÿ^o¶WïòB6zÁw9~Á6¿üú_³{Á¯ÿ5?ÖÇöéúÏÏsï®ÿs¢Þ}¹úò¯Þäßê]õßå¦:]^°°Yè¾ú×dy8¼|çûæÙ7û«?á»Ëëô¿ù©¼ß½¼ÂúðæÿÛ?÷ÝW¿{Í¿õ&ÿÚ<îWo?Ç·/øÇ®¼¿þm{çrw]ÇÍ对¼úij÷¿{õqs 'åúoÇÝÿÇÝÿIßÒ+ÊÏÿ)õ÷ÂcÖ6ªþÒ·ô
+ëWÿuÝ}PÝ%Ap[÷ÿïý_Ærþ^rurþêQtý;ÿÿöSrý§Ô?Êì÷
+nÿßùÿ²þC ý¼¨"Eÿ
ðó×ÿ¾¥WëB!¢ÿ~v· @
\ No newline at end of file
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-4s2c.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-4s2c.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/8ia64-4s2c.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,53 +1,53 @@
-System(0KB HP=0*0kB )
- Socket#6147
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#0
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#1
- P#4
- Socket#6144
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#1
- P#1
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#5
- Socket#6145
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#1
- P#2
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#6
- Socket#6146
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#1
- P#3
- L3Cache(9216KB)
- L2Cache(256KB)
- L1Cache(16KB)
- Core#0
- P#7
-depth 0: 1 System (type #0)
+Machine (phys=0)
+ Socket #0 (phys=6147)
+ L3Cache #0 (9216KB)
+ L2Cache #0 (256KB)
+ L1Cache #0 (16KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ L3Cache #1 (9216KB)
+ L2Cache #1 (256KB)
+ L1Cache #1 (16KB)
+ Core #1 (phys=1)
+ PU #1 (phys=4)
+ Socket #1 (phys=6144)
+ L3Cache #2 (9216KB)
+ L2Cache #2 (256KB)
+ L1Cache #2 (16KB)
+ Core #2 (phys=1)
+ PU #2 (phys=1)
+ L3Cache #3 (9216KB)
+ L2Cache #3 (256KB)
+ L1Cache #3 (16KB)
+ Core #3 (phys=0)
+ PU #3 (phys=5)
+ Socket #2 (phys=6145)
+ L3Cache #4 (9216KB)
+ L2Cache #4 (256KB)
+ L1Cache #4 (16KB)
+ Core #4 (phys=1)
+ PU #4 (phys=2)
+ L3Cache #5 (9216KB)
+ L2Cache #5 (256KB)
+ L1Cache #5 (16KB)
+ Core #5 (phys=0)
+ PU #5 (phys=6)
+ Socket #3 (phys=6146)
+ L3Cache #6 (9216KB)
+ L2Cache #6 (256KB)
+ L1Cache #6 (16KB)
+ Core #6 (phys=1)
+ PU #6 (phys=3)
+ L3Cache #7 (9216KB)
+ L2Cache #7 (256KB)
+ L1Cache #7 (16KB)
+ Core #7 (phys=0)
+ PU #7 (phys=7)
+depth 0: 1 Machine (type #1)
depth 1: 4 Sockets (type #3)
depth 2: 8 Caches (type #4)
depth 3: 8 Caches (type #4)
depth 4: 8 Caches (type #4)
depth 5: 8 Cores (type #5)
- depth 6: 8 Procs (type #6)
+ depth 6: 8 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/96em64t-4n4d3ca2co.tar.gz.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/96em64t-4n4d3ca2co.tar.gz.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/96em64t-4n4d3ca2co.tar.gz.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,382 +1,382 @@
-System(503GB HP=0*2048kB )
- NUMANode#0(125GB)
- Socket#1
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#0
- L1Cache(32KB)
- Core#1
- P#4
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#8
- L1Cache(32KB)
- Core#3
- P#12
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#16
- L1Cache(32KB)
- Core#5
- P#20
- Socket#0
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#1
- L1Cache(32KB)
- Core#1
- P#5
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#9
- L1Cache(32KB)
- Core#3
- P#13
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#17
- L1Cache(32KB)
- Core#5
- P#21
- Socket#2
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#2
- L1Cache(32KB)
- Core#1
- P#6
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#10
- L1Cache(32KB)
- Core#3
- P#14
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#18
- L1Cache(32KB)
- Core#5
- P#22
- Socket#3
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#3
- L1Cache(32KB)
- Core#1
- P#7
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#11
- L1Cache(32KB)
- Core#3
- P#15
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#19
- L1Cache(32KB)
- Core#5
- P#23
- NUMANode#1(126GB)
- Socket#4
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#24
- L1Cache(32KB)
- Core#1
- P#28
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#32
- L1Cache(32KB)
- Core#3
- P#36
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#40
- L1Cache(32KB)
- Core#5
- P#44
- Socket#5
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#25
- L1Cache(32KB)
- Core#1
- P#29
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#33
- L1Cache(32KB)
- Core#3
- P#37
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#41
- L1Cache(32KB)
- Core#5
- P#45
- Socket#6
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#26
- L1Cache(32KB)
- Core#1
- P#30
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#34
- L1Cache(32KB)
- Core#3
- P#38
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#42
- L1Cache(32KB)
- Core#5
- P#46
- Socket#7
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#27
- L1Cache(32KB)
- Core#1
- P#31
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#35
- L1Cache(32KB)
- Core#3
- P#39
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#43
- L1Cache(32KB)
- Core#5
- P#47
- NUMANode#2(126GB)
- Socket#8
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#48
- L1Cache(32KB)
- Core#1
- P#52
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#56
- L1Cache(32KB)
- Core#3
- P#60
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#64
- L1Cache(32KB)
- Core#5
- P#68
- Socket#9
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#49
- L1Cache(32KB)
- Core#1
- P#53
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#57
- L1Cache(32KB)
- Core#3
- P#61
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#65
- L1Cache(32KB)
- Core#5
- P#69
- Socket#10
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#50
- L1Cache(32KB)
- Core#1
- P#54
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#58
- L1Cache(32KB)
- Core#3
- P#62
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#66
- L1Cache(32KB)
- Core#5
- P#70
- Socket#11
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#51
- L1Cache(32KB)
- Core#1
- P#55
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#59
- L1Cache(32KB)
- Core#3
- P#63
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#67
- L1Cache(32KB)
- Core#5
- P#71
- NUMANode#3(126GB)
- Socket#12
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#72
- L1Cache(32KB)
- Core#1
- P#76
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#80
- L1Cache(32KB)
- Core#3
- P#84
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#88
- L1Cache(32KB)
- Core#5
- P#92
- Socket#13
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#73
- L1Cache(32KB)
- Core#1
- P#77
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#81
- L1Cache(32KB)
- Core#3
- P#85
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#89
- L1Cache(32KB)
- Core#5
- P#93
- Socket#14
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#74
- L1Cache(32KB)
- Core#1
- P#78
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#82
- L1Cache(32KB)
- Core#3
- P#86
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#90
- L1Cache(32KB)
- Core#5
- P#94
- Socket#15
- L3Cache(16MB)
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#0
- P#75
- L1Cache(32KB)
- Core#1
- P#79
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#2
- P#83
- L1Cache(32KB)
- Core#3
- P#87
- L2Cache(3072KB)
- L1Cache(32KB)
- Core#4
- P#91
- L1Cache(32KB)
- Core#5
- P#95
-depth 0: 1 System (type #0)
+Machine (phys=0 total=528473984KB)
+ NUMANode #0 (phys=0 local=132101504KB total=132101504KB)
+ Socket #0 (phys=1)
+ L3Cache #0 (16384KB)
+ L2Cache #0 (3072KB)
+ L1Cache #0 (32KB)
+ Core #0 (phys=0)
+ PU #0 (phys=0)
+ L1Cache #1 (32KB)
+ Core #1 (phys=1)
+ PU #1 (phys=4)
+ L2Cache #1 (3072KB)
+ L1Cache #2 (32KB)
+ Core #2 (phys=2)
+ PU #2 (phys=8)
+ L1Cache #3 (32KB)
+ Core #3 (phys=3)
+ PU #3 (phys=12)
+ L2Cache #2 (3072KB)
+ L1Cache #4 (32KB)
+ Core #4 (phys=4)
+ PU #4 (phys=16)
+ L1Cache #5 (32KB)
+ Core #5 (phys=5)
+ PU #5 (phys=20)
+ Socket #1 (phys=0)
+ L3Cache #1 (16384KB)
+ L2Cache #3 (3072KB)
+ L1Cache #6 (32KB)
+ Core #6 (phys=0)
+ PU #6 (phys=1)
+ L1Cache #7 (32KB)
+ Core #7 (phys=1)
+ PU #7 (phys=5)
+ L2Cache #4 (3072KB)
+ L1Cache #8 (32KB)
+ Core #8 (phys=2)
+ PU #8 (phys=9)
+ L1Cache #9 (32KB)
+ Core #9 (phys=3)
+ PU #9 (phys=13)
+ L2Cache #5 (3072KB)
+ L1Cache #10 (32KB)
+ Core #10 (phys=4)
+ PU #10 (phys=17)
+ L1Cache #11 (32KB)
+ Core #11 (phys=5)
+ PU #11 (phys=21)
+ Socket #2 (phys=2)
+ L3Cache #2 (16384KB)
+ L2Cache #6 (3072KB)
+ L1Cache #12 (32KB)
+ Core #12 (phys=0)
+ PU #12 (phys=2)
+ L1Cache #13 (32KB)
+ Core #13 (phys=1)
+ PU #13 (phys=6)
+ L2Cache #7 (3072KB)
+ L1Cache #14 (32KB)
+ Core #14 (phys=2)
+ PU #14 (phys=10)
+ L1Cache #15 (32KB)
+ Core #15 (phys=3)
+ PU #15 (phys=14)
+ L2Cache #8 (3072KB)
+ L1Cache #16 (32KB)
+ Core #16 (phys=4)
+ PU #16 (phys=18)
+ L1Cache #17 (32KB)
+ Core #17 (phys=5)
+ PU #17 (phys=22)
+ Socket #3 (phys=3)
+ L3Cache #3 (16384KB)
+ L2Cache #9 (3072KB)
+ L1Cache #18 (32KB)
+ Core #18 (phys=0)
+ PU #18 (phys=3)
+ L1Cache #19 (32KB)
+ Core #19 (phys=1)
+ PU #19 (phys=7)
+ L2Cache #10 (3072KB)
+ L1Cache #20 (32KB)
+ Core #20 (phys=2)
+ PU #20 (phys=11)
+ L1Cache #21 (32KB)
+ Core #21 (phys=3)
+ PU #21 (phys=15)
+ L2Cache #11 (3072KB)
+ L1Cache #22 (32KB)
+ Core #22 (phys=4)
+ PU #22 (phys=19)
+ L1Cache #23 (32KB)
+ Core #23 (phys=5)
+ PU #23 (phys=23)
+ NUMANode #1 (phys=1 local=132124160KB total=132124160KB)
+ Socket #4 (phys=4)
+ L3Cache #4 (16384KB)
+ L2Cache #12 (3072KB)
+ L1Cache #24 (32KB)
+ Core #24 (phys=0)
+ PU #24 (phys=24)
+ L1Cache #25 (32KB)
+ Core #25 (phys=1)
+ PU #25 (phys=28)
+ L2Cache #13 (3072KB)
+ L1Cache #26 (32KB)
+ Core #26 (phys=2)
+ PU #26 (phys=32)
+ L1Cache #27 (32KB)
+ Core #27 (phys=3)
+ PU #27 (phys=36)
+ L2Cache #14 (3072KB)
+ L1Cache #28 (32KB)
+ Core #28 (phys=4)
+ PU #28 (phys=40)
+ L1Cache #29 (32KB)
+ Core #29 (phys=5)
+ PU #29 (phys=44)
+ Socket #5 (phys=5)
+ L3Cache #5 (16384KB)
+ L2Cache #15 (3072KB)
+ L1Cache #30 (32KB)
+ Core #30 (phys=0)
+ PU #30 (phys=25)
+ L1Cache #31 (32KB)
+ Core #31 (phys=1)
+ PU #31 (phys=29)
+ L2Cache #16 (3072KB)
+ L1Cache #32 (32KB)
+ Core #32 (phys=2)
+ PU #32 (phys=33)
+ L1Cache #33 (32KB)
+ Core #33 (phys=3)
+ PU #33 (phys=37)
+ L2Cache #17 (3072KB)
+ L1Cache #34 (32KB)
+ Core #34 (phys=4)
+ PU #34 (phys=41)
+ L1Cache #35 (32KB)
+ Core #35 (phys=5)
+ PU #35 (phys=45)
+ Socket #6 (phys=6)
+ L3Cache #6 (16384KB)
+ L2Cache #18 (3072KB)
+ L1Cache #36 (32KB)
+ Core #36 (phys=0)
+ PU #36 (phys=26)
+ L1Cache #37 (32KB)
+ Core #37 (phys=1)
+ PU #37 (phys=30)
+ L2Cache #19 (3072KB)
+ L1Cache #38 (32KB)
+ Core #38 (phys=2)
+ PU #38 (phys=34)
+ L1Cache #39 (32KB)
+ Core #39 (phys=3)
+ PU #39 (phys=38)
+ L2Cache #20 (3072KB)
+ L1Cache #40 (32KB)
+ Core #40 (phys=4)
+ PU #40 (phys=42)
+ L1Cache #41 (32KB)
+ Core #41 (phys=5)
+ PU #41 (phys=46)
+ Socket #7 (phys=7)
+ L3Cache #7 (16384KB)
+ L2Cache #21 (3072KB)
+ L1Cache #42 (32KB)
+ Core #42 (phys=0)
+ PU #42 (phys=27)
+ L1Cache #43 (32KB)
+ Core #43 (phys=1)
+ PU #43 (phys=31)
+ L2Cache #22 (3072KB)
+ L1Cache #44 (32KB)
+ Core #44 (phys=2)
+ PU #44 (phys=35)
+ L1Cache #45 (32KB)
+ Core #45 (phys=3)
+ PU #45 (phys=39)
+ L2Cache #23 (3072KB)
+ L1Cache #46 (32KB)
+ Core #46 (phys=4)
+ PU #46 (phys=43)
+ L1Cache #47 (32KB)
+ Core #47 (phys=5)
+ PU #47 (phys=47)
+ NUMANode #2 (phys=2 local=132124160KB total=132124160KB)
+ Socket #8 (phys=8)
+ L3Cache #8 (16384KB)
+ L2Cache #24 (3072KB)
+ L1Cache #48 (32KB)
+ Core #48 (phys=0)
+ PU #48 (phys=48)
+ L1Cache #49 (32KB)
+ Core #49 (phys=1)
+ PU #49 (phys=52)
+ L2Cache #25 (3072KB)
+ L1Cache #50 (32KB)
+ Core #50 (phys=2)
+ PU #50 (phys=56)
+ L1Cache #51 (32KB)
+ Core #51 (phys=3)
+ PU #51 (phys=60)
+ L2Cache #26 (3072KB)
+ L1Cache #52 (32KB)
+ Core #52 (phys=4)
+ PU #52 (phys=64)
+ L1Cache #53 (32KB)
+ Core #53 (phys=5)
+ PU #53 (phys=68)
+ Socket #9 (phys=9)
+ L3Cache #9 (16384KB)
+ L2Cache #27 (3072KB)
+ L1Cache #54 (32KB)
+ Core #54 (phys=0)
+ PU #54 (phys=49)
+ L1Cache #55 (32KB)
+ Core #55 (phys=1)
+ PU #55 (phys=53)
+ L2Cache #28 (3072KB)
+ L1Cache #56 (32KB)
+ Core #56 (phys=2)
+ PU #56 (phys=57)
+ L1Cache #57 (32KB)
+ Core #57 (phys=3)
+ PU #57 (phys=61)
+ L2Cache #29 (3072KB)
+ L1Cache #58 (32KB)
+ Core #58 (phys=4)
+ PU #58 (phys=65)
+ L1Cache #59 (32KB)
+ Core #59 (phys=5)
+ PU #59 (phys=69)
+ Socket #10 (phys=10)
+ L3Cache #10 (16384KB)
+ L2Cache #30 (3072KB)
+ L1Cache #60 (32KB)
+ Core #60 (phys=0)
+ PU #60 (phys=50)
+ L1Cache #61 (32KB)
+ Core #61 (phys=1)
+ PU #61 (phys=54)
+ L2Cache #31 (3072KB)
+ L1Cache #62 (32KB)
+ Core #62 (phys=2)
+ PU #62 (phys=58)
+ L1Cache #63 (32KB)
+ Core #63 (phys=3)
+ PU #63 (phys=62)
+ L2Cache #32 (3072KB)
+ L1Cache #64 (32KB)
+ Core #64 (phys=4)
+ PU #64 (phys=66)
+ L1Cache #65 (32KB)
+ Core #65 (phys=5)
+ PU #65 (phys=70)
+ Socket #11 (phys=11)
+ L3Cache #11 (16384KB)
+ L2Cache #33 (3072KB)
+ L1Cache #66 (32KB)
+ Core #66 (phys=0)
+ PU #66 (phys=51)
+ L1Cache #67 (32KB)
+ Core #67 (phys=1)
+ PU #67 (phys=55)
+ L2Cache #34 (3072KB)
+ L1Cache #68 (32KB)
+ Core #68 (phys=2)
+ PU #68 (phys=59)
+ L1Cache #69 (32KB)
+ Core #69 (phys=3)
+ PU #69 (phys=63)
+ L2Cache #35 (3072KB)
+ L1Cache #70 (32KB)
+ Core #70 (phys=4)
+ PU #70 (phys=67)
+ L1Cache #71 (32KB)
+ Core #71 (phys=5)
+ PU #71 (phys=71)
+ NUMANode #3 (phys=3 local=132124160KB total=132124160KB)
+ Socket #12 (phys=12)
+ L3Cache #12 (16384KB)
+ L2Cache #36 (3072KB)
+ L1Cache #72 (32KB)
+ Core #72 (phys=0)
+ PU #72 (phys=72)
+ L1Cache #73 (32KB)
+ Core #73 (phys=1)
+ PU #73 (phys=76)
+ L2Cache #37 (3072KB)
+ L1Cache #74 (32KB)
+ Core #74 (phys=2)
+ PU #74 (phys=80)
+ L1Cache #75 (32KB)
+ Core #75 (phys=3)
+ PU #75 (phys=84)
+ L2Cache #38 (3072KB)
+ L1Cache #76 (32KB)
+ Core #76 (phys=4)
+ PU #76 (phys=88)
+ L1Cache #77 (32KB)
+ Core #77 (phys=5)
+ PU #77 (phys=92)
+ Socket #13 (phys=13)
+ L3Cache #13 (16384KB)
+ L2Cache #39 (3072KB)
+ L1Cache #78 (32KB)
+ Core #78 (phys=0)
+ PU #78 (phys=73)
+ L1Cache #79 (32KB)
+ Core #79 (phys=1)
+ PU #79 (phys=77)
+ L2Cache #40 (3072KB)
+ L1Cache #80 (32KB)
+ Core #80 (phys=2)
+ PU #80 (phys=81)
+ L1Cache #81 (32KB)
+ Core #81 (phys=3)
+ PU #81 (phys=85)
+ L2Cache #41 (3072KB)
+ L1Cache #82 (32KB)
+ Core #82 (phys=4)
+ PU #82 (phys=89)
+ L1Cache #83 (32KB)
+ Core #83 (phys=5)
+ PU #83 (phys=93)
+ Socket #14 (phys=14)
+ L3Cache #14 (16384KB)
+ L2Cache #42 (3072KB)
+ L1Cache #84 (32KB)
+ Core #84 (phys=0)
+ PU #84 (phys=74)
+ L1Cache #85 (32KB)
+ Core #85 (phys=1)
+ PU #85 (phys=78)
+ L2Cache #43 (3072KB)
+ L1Cache #86 (32KB)
+ Core #86 (phys=2)
+ PU #86 (phys=82)
+ L1Cache #87 (32KB)
+ Core #87 (phys=3)
+ PU #87 (phys=86)
+ L2Cache #44 (3072KB)
+ L1Cache #88 (32KB)
+ Core #88 (phys=4)
+ PU #88 (phys=90)
+ L1Cache #89 (32KB)
+ Core #89 (phys=5)
+ PU #89 (phys=94)
+ Socket #15 (phys=15)
+ L3Cache #15 (16384KB)
+ L2Cache #45 (3072KB)
+ L1Cache #90 (32KB)
+ Core #90 (phys=0)
+ PU #90 (phys=75)
+ L1Cache #91 (32KB)
+ Core #91 (phys=1)
+ PU #91 (phys=79)
+ L2Cache #46 (3072KB)
+ L1Cache #92 (32KB)
+ Core #92 (phys=2)
+ PU #92 (phys=83)
+ L1Cache #93 (32KB)
+ Core #93 (phys=3)
+ PU #93 (phys=87)
+ L2Cache #47 (3072KB)
+ L1Cache #94 (32KB)
+ Core #94 (phys=4)
+ PU #94 (phys=91)
+ L1Cache #95 (32KB)
+ Core #95 (phys=5)
+ PU #95 (phys=95)
+depth 0: 1 Machine (type #1)
depth 1: 4 NUMANodes (type #2)
depth 2: 16 Sockets (type #3)
depth 3: 16 Caches (type #4)
depth 4: 48 Caches (type #4)
depth 5: 96 Caches (type #4)
depth 6: 96 Cores (type #5)
- depth 7: 96 Procs (type #6)
+ depth 7: 96 PUs (type #6)
Topology not from this system
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/Makefile.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/Makefile.am 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/Makefile.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,6 +1,9 @@
# Copyright 2009 INRIA, Université Bordeaux 1
+# Copyright © 2009 Cisco Systems, Inc. All rights reserved.
-include $(top_srcdir)/hwloc.am
+AM_CFLAGS = $(HWLOC_CFLAGS)
+AM_CPPFLAGS = $(HWLOC_CPPFLAGS)
+AM_LDFLAGS = $(HWLOC_LDFLAGS)
# XXX: Add your sysfs tarballs here.
sysfs_tarballs = \
@@ -16,18 +19,24 @@
8ia64-4s2c.tar.gz \
16amd64-8n2c.tar.gz \
16amd64-8n2c-cpusets.tar.gz \
+ 16amd64-8n2c-cpusets.xml.tar.gz \
16amd64-8n2c-cpusets_noadmin.tar.gz \
16em64t-4s2c2t.tar.gz \
16em64t-4s2c2t-offlines.tar.gz \
+ 16em64t-4s2c2t-offlines.xml.tar.gz \
+ 16em64t-4s2c2t-offlines_noadmin.tar.gz \
16em64t-4s2c2t_ncaches.tar.gz \
16em64t-4s2c2t_merge.tar.gz \
16em64t-4s2c2t.xml.tar.gz \
16em64t-2m4c2t.tar.gz \
16ia64-8n2s.tar.gz \
+ 48amd64-4d2n6c.tar.gz \
64fake-4n2s2ca2c2t.tar.gz \
96em64t-4n4d3ca2co.tar.gz \
256ia64-64n2s2c.tar.gz \
- 4qs22-2s2t.tar.gz
+ 4qs22-2s2t.tar.gz \
+ 2s390-2c.tar.gz \
+ 1alpha.tar.gz
# Each tarball `xyz.tar.gz' must have a corresponoing `xyz.tar.gz.output'
# file showing the expected output of `lstopo - -v'.
@@ -44,26 +53,32 @@
8ia64-4s2c.tar.gz.output \
16amd64-8n2c.tar.gz.output \
16amd64-8n2c-cpusets.tar.gz.output \
+ 16amd64-8n2c-cpusets.xml.tar.gz.output 16amd64-8n2c-cpusets.xml.tar.gz.options \
16amd64-8n2c-cpusets_noadmin.tar.gz.output 16amd64-8n2c-cpusets_noadmin.tar.gz.options \
16em64t-4s2c2t.tar.gz.output \
16em64t-4s2c2t-offlines.tar.gz.output \
+ 16em64t-4s2c2t-offlines.xml.tar.gz.output 16em64t-4s2c2t-offlines.xml.tar.gz.options \
+ 16em64t-4s2c2t-offlines_noadmin.tar.gz.output 16em64t-4s2c2t-offlines_noadmin.tar.gz.options \
16em64t-4s2c2t_ncaches.tar.gz.output 16em64t-4s2c2t_ncaches.tar.gz.options \
16em64t-4s2c2t_merge.tar.gz.output 16em64t-4s2c2t_merge.tar.gz.options \
16em64t-4s2c2t.xml.tar.gz.output 16em64t-4s2c2t.xml.tar.gz.options \
16em64t-2m4c2t.tar.gz.output \
16ia64-8n2s.tar.gz.output \
+ 48amd64-4d2n6c.tar.gz.output \
64fake-4n2s2ca2c2t.tar.gz.output \
96em64t-4n4d3ca2co.tar.gz.output \
256ia64-64n2s2c.tar.gz.output \
- 4qs22-2s2t.tar.gz.output
+ 4qs22-2s2t.tar.gz.output \
+ 2s390-2c.tar.gz.output \
+ 1alpha.tar.gz.output
-if HAVE_LINUX
-if HAVE_OPENAT
+if HWLOC_BUILD_TESTS
+if HWLOC_HAVE_LINUX
+if HWLOC_HAVE_OPENAT
TESTS = $(sysfs_tarballs)
-endif HAVE_OPENAT
-else !HAVE_LINUX
-TESTS =
-endif !HAVE_LINUX
+endif HWLOC_HAVE_OPENAT
+endif HWLOC_HAVE_LINUX
+endif HWLOC_BUILD_TESTS
EXTRA_DIST = $(sysfs_tarballs) $(sysfs_outputs)
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/README
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/README 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/README 2010-05-11 01:47:13 UTC (rev 6632)
@@ -2,8 +2,8 @@
This directory contains tarballs of Linux sysfs hierarchies collected on
various systems. Each tarball `xyz.tar.gz' comes with the corresponding
-`xyz.tar.gz.output', which gives the expected output of "lstopo -v -" for
-that system.
+`xyz.tar.gz.output', which gives the expected output of "lstopo -v -"
+for that system.
Together with the `HWLOC_FSROOT' environment variable, these are
used by `test-topologies.sh' to check for any regression introduced in
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/test-topology.sh.in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/test-topology.sh.in 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux/test-topology.sh.in 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
#
# Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+# Copyright © 2009 Cisco Systems, Inc. All rights reserved.
# See COPYING in top-level directory.
#
@@ -10,8 +11,8 @@
# hierarchies available here. Return true on success.
-abs_top_builddir="@abs_top_builddir@"
-lstopo="$abs_top_builddir/utils/lstopo"
+HWLOC_top_builddir="@HWLOC_top_builddir@"
+lstopo="$HWLOC_top_builddir/utils/lstopo"
topology="$1"
@@ -63,7 +64,7 @@
needxml=0
grep '<?xml' "$output" >/dev/null 2>&1 && needxml=1
- [ -d "$dir" -a -f "$output" -a \( "@HAVE_XML@" = 1 -o "$needxml" = 0 \) ]
+ [ -d "$dir" -a -f "$output" -a \( "@HWLOC_HAVE_XML@" = 1 -o "$needxml" = 0 \) ]
}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux-libnuma.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux-libnuma.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/linux-libnuma.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,7 +3,9 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
+#include <assert.h>
#define NUMA_VERSION1_COMPATIBILITY
#include <hwloc/linux-libnuma.h>
@@ -28,16 +30,18 @@
if (hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_NODE)) {
node = NULL;
while ((node = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NODE, node)) != NULL)
- hwloc_cpuset_orset(set, node->cpuset);
+ hwloc_cpuset_or(set, set, node->cpuset);
} else {
- hwloc_cpuset_orset(set, hwloc_get_system_obj(topology)->cpuset);
+ hwloc_cpuset_or(set, set, hwloc_topology_get_complete_cpuset(topology));
}
- set2 = hwloc_cpuset_from_linux_libnuma_bitmask(topology, numa_all_nodes_ptr);
+ set2 = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_linux_libnuma_bitmask(topology, set2, numa_all_nodes_ptr);
assert(hwloc_cpuset_isequal(set, set2));
hwloc_cpuset_free(set2);
- set2 = hwloc_cpuset_from_linux_libnuma_nodemask(topology, &numa_all_nodes);
+ set2 = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_linux_libnuma_nodemask(topology, set2, &numa_all_nodes);
assert(hwloc_cpuset_isequal(set, set2));
hwloc_cpuset_free(set2);
@@ -53,18 +57,21 @@
/* convert empty nodemask/bitmask to cpuset */
nodemask_zero(&nodemask);
- set = hwloc_cpuset_from_linux_libnuma_nodemask(topology, &nodemask);
+ set = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_linux_libnuma_nodemask(topology, set, &nodemask);
assert(hwloc_cpuset_iszero(set));
hwloc_cpuset_free(set);
bitmask = numa_bitmask_alloc(1);
- set = hwloc_cpuset_from_linux_libnuma_bitmask(topology, bitmask);
+ set = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_linux_libnuma_bitmask(topology, set, bitmask);
numa_bitmask_free(bitmask);
assert(hwloc_cpuset_iszero(set));
hwloc_cpuset_free(set);
mask=0;
- set = hwloc_cpuset_from_linux_libnuma_ulongs(topology, &mask, HWLOC_BITS_PER_LONG);
+ set = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_linux_libnuma_ulongs(topology, set, &mask, HWLOC_BITS_PER_LONG);
assert(hwloc_cpuset_iszero(set));
hwloc_cpuset_free(set);
@@ -116,7 +123,7 @@
assert(!mask);
} else {
assert(maxnode = node->os_index + 1);
- assert(mask == (1<<node->os_index));
+ assert(mask == (1U<<node->os_index));
}
}
Deleted: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/lstopo_xml.sh.in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/lstopo_xml.sh.in 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/lstopo_xml.sh.in 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,29 +0,0 @@
-#!/bin/sh
-#-*-sh-*-
-
-#
-# Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
-# See COPYING in top-level directory.
-#
-
-: ${TMPDIR=/tmp}
-{
- tmp=`
- (umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null
- ` &&
- test -n "$tmp" && test -d "$tmp"
-} || {
- tmp=$TMPDIR/foo$$-$RANDOM
- (umask 077 && mkdir "$tmp")
-} || exit $?
-file="$tmp/lstopo_xml.output.xml"
-
-set -e
-../utils/lstopo --xml "$srcdir"/linux/16em64t-4s2c2t.xml.tar.gz.output "$file"
-diff @HWLOC_DIFF_U@ "$srcdir"/linux/16em64t-4s2c2t.xml.tar.gz.output "$file"
-if [ -n "@XMLLINT@" ]
-then
- cp "$srcdir"/../src/hwloc.dtd "$tmp/"
- @XMLLINT@ --valid "$file" > /dev/null
-fi
-rm -rf "$tmp"
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/openfabrics-verbs.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/openfabrics-verbs.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/openfabrics-verbs.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -7,13 +7,15 @@
#include <stdio.h>
#include <assert.h>
#include <infiniband/verbs.h>
+#include <private/config.h>
#include <hwloc.h>
#include <hwloc/openfabrics-verbs.h>
/* check the ibverbs helpers */
-int main(int argc, char **argv)
+int main(void)
{
+ hwloc_topology_t topology;
struct ibv_device **dev_list, *dev;
int count, i;
@@ -24,11 +26,15 @@
}
printf("ibv_get_device_list found %d devices\n", count);
+ hwloc_topology_init(&topology);
+ hwloc_topology_load(topology);
+
for(i=0; i<count; i++) {
hwloc_cpuset_t set;
dev = dev_list[i];
- set = hwloc_ibv_get_device_cpuset(dev);
+ set = hwloc_cpuset_alloc();
+ hwloc_ibv_get_device_cpuset(topology, dev, set);
if (!set) {
printf("failed to get cpuset for device %d (%s)\n",
i, ibv_get_device_name(dev));
@@ -42,6 +48,8 @@
}
}
+ hwloc_topology_destroy(topology);
+
ibv_free_device_list(dev_list);
return 0;
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/Makefile.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/Makefile.am 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/Makefile.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,34 +1,63 @@
# Copyright 2009 INRIA, Université Bordeaux 1
+# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
-include $(top_srcdir)/hwloc.am
+AM_CFLAGS = $(HWLOC_CFLAGS)
+AM_CPPFLAGS = $(HWLOC_CPPFLAGS)
+AM_LDFLAGS = $(HWLOC_LDFLAGS)
-SRC=$(top_srcdir)/src
+SRC = $(HWLOC_top_srcdir)/src
-if HAVE_LINUX
+if HWLOC_BUILD_TESTS
+if HWLOC_HAVE_LINUX
check_LTLIBRARIES = libhwloc-ports.la
-endif
+endif HWLOC_HAVE_LINUX
+endif HWLOC_BUILD_TESTS
-libhwloc_ports_la_SOURCES = $(SRC)/topology.c $(SRC)/traversal.c $(SRC)/topology-synthetic.c
-libhwloc_ports_la_CFLAGS = -I$(top_srcdir)/tests/ports/include -DHWLOC_COMPILE_PORTS -DHAVE_LIBLGRP -DHAVE_LIBKSTAT
+# Note that AC_CONFIG_LINKS sets up the sym links for the files in
+# this directory (back to the $top_srcdir/src directory). So if you
+# need more sym-linked files in here, go edit configure.ac. Note that
+# we have to use sym links in here rather than just directly
+# referencing the files via $HWLOC_top_srcdir/src/foo.c because of
+# dependencies issues when using the Automake option "subdir-objects".
+# We nodist these because they're created by configure.
+nodist_libhwloc_ports_la_SOURCES = \
+ topology.c \
+ traversal.c \
+ topology-synthetic.c \
+ topology-solaris.c \
+ topology-aix.c \
+ topology-osf.c \
+ topology-windows.c \
+ topology-darwin.c \
+ topology-freebsd.c \
+ topology-hpux.c
-libhwloc_ports_la_SOURCES += $(SRC)/topology-solaris.c
-libhwloc_ports_la_SOURCES += $(SRC)/topology-aix.c
-libhwloc_ports_la_SOURCES += $(SRC)/topology-osf.c
-libhwloc_ports_la_SOURCES += $(SRC)/topology-windows.c
-libhwloc_ports_la_SOURCES += $(SRC)/topology-darwin.c
-libhwloc_ports_la_SOURCES += $(SRC)/topology-hpux.c
+libhwloc_ports_la_SOURCES = \
+ include/windows.h \
+ include/kstat.h \
+ include/sys/rset.h \
+ include/sys/lgrp_user.h \
+ include/sys/sysctl.h \
+ include/sys/procset.h \
+ include/sys/processor.h \
+ include/sys/thread.h \
+ include/sys/mpctl.h \
+ include/sys/cpuset.h \
+ include/radset.h \
+ include/cpuset.h \
+ include/numa.h \
+ include/pthread_np.h
-EXTRA_DIST = \
- include/windows.h \
- include/kstat.h \
- include/sys/rset.h \
- include/sys/lgrp_user.h \
- include/sys/sysctl.h \
- include/sys/procset.h \
- include/sys/processor.h \
- include/sys/thread.h \
- include/sys/mpctl.h \
- include/radset.h \
- include/cpuset.h \
- include/numa.h
+libhwloc_ports_la_CPPFLAGS = \
+ $(HWLOC_CPPFLAGS) \
+ -I$(HWLOC_top_srcdir)/include \
+ -I$(HWLOC_top_srcdir)/tests/ports/include \
+ -DHWLOC_COMPILE_PORTS \
+ -DHWLOC_SOLARIS_SYS -DHAVE_LIBLGRP -DHAVE_LIBKSTAT \
+ -DHWLOC_AIX_SYS \
+ -DHWLOC_OSF_SYS \
+ -DHWLOC_WIN_SYS \
+ -DHWLOC_DARWIN_SYS \
+ -DHWLOC_FREEBSD_SYS -DHAVE_SYS_CPUSET_H \
+ -DHWLOC_HPUX_SYS
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/pthread_np.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/pthread_np.h (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/pthread_np.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,15 @@
+/*
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * See COPYING in top-level directory.
+ */
+
+#ifndef HWLOC_PORT_PTHREAD_NP_H
+#define HWLOC_PORT_PTHREAD_NP_H
+
+#if 0
+/* Conflict with Linux' */
+int pthread_getaffinity_np(pthread_t, size_t, cpuset_t *);
+int pthread_setaffinity_np(pthread_t, size_t, const cpuset_t *);
+#endif
+
+#endif /* HWLOC_PORT_PTHREAD_NP_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/radset.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/radset.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/radset.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -12,6 +12,7 @@
typedef int radid_t;
#define RAD_NONE -1
typedef struct {
+ int foo;
} radset_t;
typedef unsigned int nsgid_t;
#define NSG_NONE -1
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/cpuset.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/cpuset.h (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/cpuset.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,31 @@
+/*
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * See COPYING in top-level directory.
+ */
+
+#ifndef HWLOC_PORT_SYS_CPUSET_H
+#define HWLOC_PORT_SYS_CPUSET_H
+
+#include <limits.h>
+
+typedef long cpuset_t;
+typedef int cpulevel_t;
+typedef int cpuwhich_t;
+
+#define CPU_LEVEL_WHICH 3
+#define CPU_WHICH_TID 1
+#define CPU_WHICH_PID 2
+
+#undef CPU_SETSIZE
+#define CPU_SETSIZE (sizeof(cpuset_t) * CHAR_BIT)
+#undef CPU_ZERO
+#define CPU_ZERO(cpuset) (*(cpuset) = 0)
+#undef CPU_SET
+#define CPU_SET(cpu, cpuset) (*(cpuset) |= (1<<(cpu)))
+#undef CPU_ISSET
+#define CPU_ISSET(cpu, cpuset) (*(cpuset) & (1<<(cpu)))
+
+int cpuset_getaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t size, cpuset_t *cpuset);
+int cpuset_setaffinity(cpulevel_t level, cpuwhich_t which, id_t id, size_t size, const cpuset_t *cpuset);
+
+#endif /* HWLOC_PORT_SYS_CPUSET_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/lgrp_user.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/lgrp_user.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/lgrp_user.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -10,7 +10,7 @@
typedef int lgrp_cookie_t;
#define LGRP_COOKIE_NONE 0
-typedef int lgrp_id_t;
+typedef long lgrp_id_t;
typedef long long lgrp_mem_size_t;
typedef enum lgrp_content {
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/rset.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/rset.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/rset.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -24,6 +24,8 @@
#define R_SMPSDL 4
#define R_MCMSDL 5
#define R_MAXPROCS 6
+#define R_L2CSDL 11
+#define R_CORESDL 12
#define R_PROCS 6
@@ -66,5 +68,6 @@
int ra_attachrset (rstype_t rstype, rsid_t rsid, rsethandle_t rset, unsigned int flags);
int ra_detachrset (rstype_t rstype, rsid_t rsid, unsigned int flags);
+int ra_getrset (rstype_t rstype, rsid_t rsid, unsigned int flags, rsethandle_t rset);
#endif /* HWLOC_PORT_SYS_RSET_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/sysctl.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/sysctl.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/sysctl.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -6,6 +6,7 @@
#ifndef HWLOC_PORT_SYS_SYSCTL_H
#define HWLOC_PORT_SYS_SYSCTL_H
+extern int sysctl(int *name, int name_len, void *oldp, size_t *oldlenp, void *newp, size_t newlen);
extern int sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen);
#endif /* HWLOC_PORT_SYS_SYSCTL_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/thread.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/thread.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/sys/thread.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -7,7 +7,7 @@
#define HWLOC_PORT_SYS_THREAD_H
typedef long tid_t;
-tid_t thread_self();
+tid_t thread_self(void);
struct __pthrdsinfo {
tid_t __pi_tid;
};
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/windows.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/windows.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/ports/include/windows.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -17,7 +17,7 @@
typedef DWORDLONG ULONGLONG, *PULONGLONG;
typedef unsigned char BYTE, UCHAR;
typedef unsigned short WORD, USHORT;
-typedef unsigned long ULONG_PTR, DWORD_PTR, DWORD, *PDWORD;
+typedef unsigned long ULONG_PTR, DWORD_PTR, DWORD, *PDWORD, *PDWORD_PTR;
typedef const char *LPCSTR;
typedef int (*FARPROC)();
typedef void *PVOID;
@@ -46,6 +46,7 @@
DWORD_PTR WINAPI SetThreadAffinityMask(HANDLE hThread, DWORD_PTR dwThreadAffinityMask);
BOOL WINAPI SetProcessAffinityMask(HANDLE hProcess, DWORD_PTR dwProcessAffinityMask);
+BOOL WINAPI GetProcessAffinityMask(HANDLE hProcess, PDWORD_PTR lpProcessAffinityMask, PDWORD_PTR lpSystemAffinityMask);
HANDLE WINAPI GetCurrentThread(void);
HANDLE WINAPI GetCurrentProcess(void);
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16amd64-8n2c-cpusets.xml
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16amd64-8n2c-cpusets.xml (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16amd64-8n2c-cpusets.xml 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE topology SYSTEM "hwloc.dtd">
+<topology>
+ <object type="Machine" os_level="-1" os_index="0" cpuset="0x0000f06f" complete_cpuset="0x0000ffff" online_cpuset="0x0000ffef" allowed_cpuset="0x0000f07f" nodeset="0x000000ff" complete_nodeset="0x000000ff" allowed_nodeset="0x0000003e" dmi_board_vendor="TYAN Computer Corp" dmi_board_name="S4881 ">
+ <object type="NUMANode" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0">
+ <object type="Socket" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0">
+ <object type="Cache" os_level="-1" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" nodeset="0x00000001" complete_nodeset="0x00000001" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="NUMANode" os_level="-1" os_index="1" cpuset="0x0000000c" complete_cpuset="0x0000000c" online_cpuset="0x0000000c" allowed_cpuset="0x0000000c" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002" local_memory="8589934592">
+ <object type="Socket" os_level="-1" os_index="1" cpuset="0x0000000c" complete_cpuset="0x0000000c" online_cpuset="0x0000000c" allowed_cpuset="0x0000000c" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002">
+ <object type="Cache" os_level="-1" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002">
+ <object type="PU" os_level="-1" os_index="2" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002">
+ <object type="PU" os_level="-1" os_index="3" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008" nodeset="0x00000002" complete_nodeset="0x00000002" allowed_nodeset="0x00000002"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="NUMANode" os_level="-1" os_index="2" cpuset="0x00000020" complete_cpuset="0x00000030" online_cpuset="0x00000020" allowed_cpuset="0x00000030" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004" local_memory="8589934592">
+ <object type="Socket" os_level="-1" os_index="2" cpuset="0x00000020" complete_cpuset="0x00000030" online_cpuset="0x00000020" allowed_cpuset="0x00000030" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004">
+ <object type="Cache" os_level="-1" cpuset="0x00000020" complete_cpuset="0x00000020" online_cpuset="0x00000020" allowed_cpuset="0x00000020" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000020" complete_cpuset="0x00000020" online_cpuset="0x00000020" allowed_cpuset="0x00000020" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000020" complete_cpuset="0x00000020" online_cpuset="0x00000020" allowed_cpuset="0x00000020" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004">
+ <object type="PU" os_level="-1" os_index="5" cpuset="0x00000020" complete_cpuset="0x00000020" online_cpuset="0x00000020" allowed_cpuset="0x00000020" nodeset="0x00000004" complete_nodeset="0x00000004" allowed_nodeset="0x00000004"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="NUMANode" os_level="-1" os_index="3" cpuset="0x00000040" complete_cpuset="0x000000c0" online_cpuset="0x000000c0" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008" local_memory="8589934592">
+ <object type="Socket" os_level="-1" os_index="3" cpuset="0x00000040" complete_cpuset="0x000000c0" online_cpuset="0x000000c0" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008">
+ <object type="Cache" os_level="-1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008">
+ <object type="PU" os_level="-1" os_index="6" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" nodeset="0x00000008" complete_nodeset="0x00000008" allowed_nodeset="0x00000008"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="NUMANode" os_level="-1" os_index="4" cpuset="0x0" complete_cpuset="0x00000300" online_cpuset="0x00000300" allowed_cpuset="0x0" nodeset="0x00000010" complete_nodeset="0x00000010" allowed_nodeset="0x00000010" local_memory="8589934592"/>
+ <object type="NUMANode" os_level="-1" os_index="5" cpuset="0x0" complete_cpuset="0x00000c00" online_cpuset="0x00000c00" allowed_cpuset="0x0" nodeset="0x00000020" complete_nodeset="0x00000020" allowed_nodeset="0x00000020" local_memory="8589934592"/>
+ <object type="NUMANode" os_level="-1" os_index="6" cpuset="0x00003000" complete_cpuset="0x00003000" online_cpuset="0x00003000" allowed_cpuset="0x00003000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0">
+ <object type="Socket" os_level="-1" os_index="6" cpuset="0x00003000" complete_cpuset="0x00003000" online_cpuset="0x00003000" allowed_cpuset="0x00003000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0">
+ <object type="Cache" os_level="-1" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="12" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00002000" complete_cpuset="0x00002000" online_cpuset="0x00002000" allowed_cpuset="0x00002000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00002000" complete_cpuset="0x00002000" online_cpuset="0x00002000" allowed_cpuset="0x00002000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00002000" complete_cpuset="0x00002000" online_cpuset="0x00002000" allowed_cpuset="0x00002000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="13" cpuset="0x00002000" complete_cpuset="0x00002000" online_cpuset="0x00002000" allowed_cpuset="0x00002000" nodeset="0x00000040" complete_nodeset="0x00000040" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="NUMANode" os_level="-1" os_index="7" cpuset="0x0000c000" complete_cpuset="0x0000c000" online_cpuset="0x0000c000" allowed_cpuset="0x0000c000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0">
+ <object type="Socket" os_level="-1" os_index="7" cpuset="0x0000c000" complete_cpuset="0x0000c000" online_cpuset="0x0000c000" allowed_cpuset="0x0000c000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0">
+ <object type="Cache" os_level="-1" cpuset="0x00004000" complete_cpuset="0x00004000" online_cpuset="0x00004000" allowed_cpuset="0x00004000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00004000" complete_cpuset="0x00004000" online_cpuset="0x00004000" allowed_cpuset="0x00004000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00004000" complete_cpuset="0x00004000" online_cpuset="0x00004000" allowed_cpuset="0x00004000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="14" cpuset="0x00004000" complete_cpuset="0x00004000" online_cpuset="0x00004000" allowed_cpuset="0x00004000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0" cache_size="65536" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0">
+ <object type="PU" os_level="-1" os_index="15" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000" nodeset="0x00000080" complete_nodeset="0x00000080" allowed_nodeset="0x0"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+</topology>
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16em64t-4s2c2t-offlines.xml
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16em64t-4s2c2t-offlines.xml (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16em64t-4s2c2t-offlines.xml 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE topology SYSTEM "hwloc.dtd">
+<topology>
+ <object type="Machine" os_level="-1" os_index="0" cpuset="0x0000905b" complete_cpuset="0x0001915b" online_cpuset="0x0000905b" allowed_cpuset="0x0000915b">
+ <object type="Socket" os_level="-1" os_index="0" cpuset="0x00001011" complete_cpuset="0x00001011" online_cpuset="0x00001011" allowed_cpuset="0x00001011">
+ <object type="Cache" os_level="-1" cpuset="0x00001011" complete_cpuset="0x00001011" online_cpuset="0x00001011" allowed_cpuset="0x00001011" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001">
+ <object type="PU" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010">
+ <object type="PU" os_level="-1" os_index="4" cpuset="0x00000010" complete_cpuset="0x00000010" online_cpuset="0x00000010" allowed_cpuset="0x00000010"/>
+ <object type="PU" os_level="-1" os_index="12" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Socket" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002">
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002">
+ <object type="PU" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Socket" os_level="-1" os_index="3" cpuset="0x00008008" complete_cpuset="0x00008008" online_cpuset="0x00008008" allowed_cpuset="0x00008008">
+ <object type="Cache" os_level="-1" cpuset="0x00008008" complete_cpuset="0x00008008" online_cpuset="0x00008008" allowed_cpuset="0x00008008" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008">
+ <object type="PU" os_level="-1" os_index="3" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000">
+ <object type="PU" os_level="-1" os_index="15" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Socket" os_level="-1" os_index="2" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040">
+ <object type="Cache" os_level="-1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040">
+ <object type="PU" os_level="-1" os_index="6" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+</topology>
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16em64t-4s2c2t.xml
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16em64t-4s2c2t.xml (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/16em64t-4s2c2t.xml 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE topology SYSTEM "hwloc.dtd">
+<topology>
+ <object type="Machine" os_level="-1" os_index="0" cpuset="0x0000ffff" complete_cpuset="0x0000ffff" online_cpuset="0x0000ffff" allowed_cpuset="0x0000ffff">
+ <object type="Socket" os_level="-1" os_index="0" cpuset="0x00001111" complete_cpuset="0x00001111" online_cpuset="0x00001111" allowed_cpuset="0x00001111">
+ <object type="Cache" os_level="-1" cpuset="0x00001111" complete_cpuset="0x00001111" online_cpuset="0x00001111" allowed_cpuset="0x00001111" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000101" complete_cpuset="0x00000101" online_cpuset="0x00000101" allowed_cpuset="0x00000101" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000101" complete_cpuset="0x00000101" online_cpuset="0x00000101" allowed_cpuset="0x00000101" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000101" complete_cpuset="0x00000101" online_cpuset="0x00000101" allowed_cpuset="0x00000101">
+ <object type="PU" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001"/>
+ <object type="PU" os_level="-1" os_index="8" cpuset="0x00000100" complete_cpuset="0x00000100" online_cpuset="0x00000100" allowed_cpuset="0x00000100"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00001010" complete_cpuset="0x00001010" online_cpuset="0x00001010" allowed_cpuset="0x00001010">
+ <object type="PU" os_level="-1" os_index="4" cpuset="0x00000010" complete_cpuset="0x00000010" online_cpuset="0x00000010" allowed_cpuset="0x00000010"/>
+ <object type="PU" os_level="-1" os_index="12" cpuset="0x00001000" complete_cpuset="0x00001000" online_cpuset="0x00001000" allowed_cpuset="0x00001000"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Socket" os_level="-1" os_index="1" cpuset="0x00002222" complete_cpuset="0x00002222" online_cpuset="0x00002222" allowed_cpuset="0x00002222">
+ <object type="Cache" os_level="-1" cpuset="0x00002222" complete_cpuset="0x00002222" online_cpuset="0x00002222" allowed_cpuset="0x00002222" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000202" complete_cpuset="0x00000202" online_cpuset="0x00000202" allowed_cpuset="0x00000202">
+ <object type="PU" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002"/>
+ <object type="PU" os_level="-1" os_index="9" cpuset="0x00000200" complete_cpuset="0x00000200" online_cpuset="0x00000200" allowed_cpuset="0x00000200"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00002020" complete_cpuset="0x00002020" online_cpuset="0x00002020" allowed_cpuset="0x00002020" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00002020" complete_cpuset="0x00002020" online_cpuset="0x00002020" allowed_cpuset="0x00002020" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00002020" complete_cpuset="0x00002020" online_cpuset="0x00002020" allowed_cpuset="0x00002020">
+ <object type="PU" os_level="-1" os_index="5" cpuset="0x00000020" complete_cpuset="0x00000020" online_cpuset="0x00000020" allowed_cpuset="0x00000020"/>
+ <object type="PU" os_level="-1" os_index="13" cpuset="0x00002000" complete_cpuset="0x00002000" online_cpuset="0x00002000" allowed_cpuset="0x00002000"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Socket" os_level="-1" os_index="2" cpuset="0x00004444" complete_cpuset="0x00004444" online_cpuset="0x00004444" allowed_cpuset="0x00004444">
+ <object type="Cache" os_level="-1" cpuset="0x00004444" complete_cpuset="0x00004444" online_cpuset="0x00004444" allowed_cpuset="0x00004444" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000404" complete_cpuset="0x00000404" online_cpuset="0x00000404" allowed_cpuset="0x00000404" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000404" complete_cpuset="0x00000404" online_cpuset="0x00000404" allowed_cpuset="0x00000404" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000404" complete_cpuset="0x00000404" online_cpuset="0x00000404" allowed_cpuset="0x00000404">
+ <object type="PU" os_level="-1" os_index="2" cpuset="0x00000004" complete_cpuset="0x00000004" online_cpuset="0x00000004" allowed_cpuset="0x00000004"/>
+ <object type="PU" os_level="-1" os_index="10" cpuset="0x00000400" complete_cpuset="0x00000400" online_cpuset="0x00000400" allowed_cpuset="0x00000400"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00004040" complete_cpuset="0x00004040" online_cpuset="0x00004040" allowed_cpuset="0x00004040" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00004040" complete_cpuset="0x00004040" online_cpuset="0x00004040" allowed_cpuset="0x00004040" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00004040" complete_cpuset="0x00004040" online_cpuset="0x00004040" allowed_cpuset="0x00004040">
+ <object type="PU" os_level="-1" os_index="6" cpuset="0x00000040" complete_cpuset="0x00000040" online_cpuset="0x00000040" allowed_cpuset="0x00000040"/>
+ <object type="PU" os_level="-1" os_index="14" cpuset="0x00004000" complete_cpuset="0x00004000" online_cpuset="0x00004000" allowed_cpuset="0x00004000"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Socket" os_level="-1" os_index="3" cpuset="0x00008888" complete_cpuset="0x00008888" online_cpuset="0x00008888" allowed_cpuset="0x00008888">
+ <object type="Cache" os_level="-1" cpuset="0x00008888" complete_cpuset="0x00008888" online_cpuset="0x00008888" allowed_cpuset="0x00008888" cache_size="4194304" depth="3">
+ <object type="Cache" os_level="-1" cpuset="0x00000808" complete_cpuset="0x00000808" online_cpuset="0x00000808" allowed_cpuset="0x00000808" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000808" complete_cpuset="0x00000808" online_cpuset="0x00000808" allowed_cpuset="0x00000808" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000808" complete_cpuset="0x00000808" online_cpuset="0x00000808" allowed_cpuset="0x00000808">
+ <object type="PU" os_level="-1" os_index="3" cpuset="0x00000008" complete_cpuset="0x00000008" online_cpuset="0x00000008" allowed_cpuset="0x00000008"/>
+ <object type="PU" os_level="-1" os_index="11" cpuset="0x00000800" complete_cpuset="0x00000800" online_cpuset="0x00000800" allowed_cpuset="0x00000800"/>
+ </object>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00008080" complete_cpuset="0x00008080" online_cpuset="0x00008080" allowed_cpuset="0x00008080" cache_size="1048576" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00008080" complete_cpuset="0x00008080" online_cpuset="0x00008080" allowed_cpuset="0x00008080" cache_size="16384" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00008080" complete_cpuset="0x00008080" online_cpuset="0x00008080" allowed_cpuset="0x00008080">
+ <object type="PU" os_level="-1" os_index="7" cpuset="0x00000080" complete_cpuset="0x00000080" online_cpuset="0x00000080" allowed_cpuset="0x00000080"/>
+ <object type="PU" os_level="-1" os_index="15" cpuset="0x00008000" complete_cpuset="0x00008000" online_cpuset="0x00008000" allowed_cpuset="0x00008000"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+</topology>
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/8em64t-2mi2ma2c.xml
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/8em64t-2mi2ma2c.xml (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/8em64t-2mi2ma2c.xml 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE topology SYSTEM "hwloc.dtd">
+<topology>
+ <object type="System" os_level="-1" os_index="0">
+ <object type="Group" os_level="-1" depth="0">
+ <object type="Machine" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" dmi_board_vendor="Dell Inc." dmi_board_name="0F331C" local_memory="1016368">
+ <page_type size="4096" count="65536"/>
+ <page_type size="1048576" count="1024"/>
+ <object type="Socket" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003">
+ <object type="Cache" os_level="-1" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" cache_size="2097152" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" cache_size="32768" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001">
+ <object type="PU" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001"/>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" cache_size="32768" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002">
+ <object type="PU" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Machine" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" dmi_board_vendor="Dell Inc." dmi_board_name="0F331C" local_memory="1016368">
+ <page_type size="8192" count="1048576"/>
+ <object type="Socket" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003">
+ <object type="Cache" os_level="-1" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" cache_size="2097152" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" cache_size="32768" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001">
+ <object type="PU" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001"/>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" cache_size="32768" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002">
+ <object type="PU" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Group" os_level="-1" depth="0">
+ <object type="Machine" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" dmi_board_vendor="Dell Inc." dmi_board_name="0F331C" local_memory="1016368">
+ <page_type size="2048" count="0"/>
+ <object type="Socket" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003">
+ <object type="Cache" os_level="-1" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" cache_size="2097152" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" cache_size="32768" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001">
+ <object type="PU" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001"/>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" cache_size="32768" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002">
+ <object type="PU" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object type="Machine" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" dmi_board_vendor="Dell Inc." dmi_board_name="0F331C" local_memory="1016368">
+ <page_type size="2048" count="0"/>
+ <page_type size="4096" count="65536"/>
+ <page_type size="1048576" count="2048"/>
+ <object type="Socket" os_level="-1" os_index="0" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003">
+ <object type="Cache" os_level="-1" cpuset="0x00000003" complete_cpuset="0x00000003" online_cpuset="0x00000003" allowed_cpuset="0x00000003" cache_size="2097152" depth="2">
+ <object type="Cache" os_level="-1" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001" cache_size="32768" depth="1">
+ <object type="Core" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001">
+ <object type="PU" os_level="-1" os_index="0" cpuset="0x00000001" complete_cpuset="0x00000001" online_cpuset="0x00000001" allowed_cpuset="0x00000001"/>
+ </object>
+ </object>
+ <object type="Cache" os_level="-1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002" cache_size="32768" depth="1">
+ <object type="Core" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002">
+ <object type="PU" os_level="-1" os_index="1" cpuset="0x00000002" complete_cpuset="0x00000002" online_cpuset="0x00000002" allowed_cpuset="0x00000002"/>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+ </object>
+</topology>
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/Makefile.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/Makefile.am (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/Makefile.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,25 @@
+# Copyright 2009 INRIA, Université Bordeaux 1
+# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
+
+AM_CFLAGS = $(HWLOC_CFLAGS)
+AM_CPPFLAGS = $(HWLOC_CPPFLAGS)
+AM_LDFLAGS = $(HWLOC_LDFLAGS)
+
+# Add your XML input files here.
+xml_inputs = \
+ 16amd64-8n2c-cpusets.xml \
+ 16em64t-4s2c2t.xml \
+ 16em64t-4s2c2t-offlines.xml \
+ 8em64t-2mi2ma2c.xml
+
+# Only run the tests if we're building standalone, because the tests
+# call hwloc executables.
+if HWLOC_BUILD_TESTS
+if HWLOC_HAVE_XML
+TESTS = $(xml_inputs)
+endif HWLOC_HAVE_XML
+endif HWLOC_BUILD_TESTS
+
+EXTRA_DIST = $(xml_inputs)
+
+TESTS_ENVIRONMENT = $(HWLOC_top_builddir)/tests/xml/test-topology.sh
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/test-topology.sh.in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/test-topology.sh.in (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/test-topology.sh.in 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,49 @@
+#!/bin/sh
+#-*-sh-*-
+
+#
+# Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+# Copyright © 2010 Cisco Systems, Inc. All rights reserved.
+# See COPYING in top-level directory.
+#
+
+# Check the conformance of `lstopo' for all the XML
+# hierarchies available here. Return true on success.
+
+HWLOC_top_builddir="@HWLOC_top_builddir@"
+HWLOC_top_srcdir="@HWLOC_top_srcdir@"
+lstopo="@HWLOC_top_builddir@/utils/lstopo"
+
+error()
+{
+ echo $@ 2>&1
+}
+
+if [ ! -x "$lstopo" ]
+then
+ error "Could not find executable file \`$lstopo'."
+ exit 1
+fi
+
+
+: ${TMPDIR=/tmp}
+{
+ tmp=`
+ (umask 077 && mktemp -d "$TMPDIR/fooXXXXXX") 2>/dev/null
+ ` &&
+ test -n "$tmp" && test -d "$tmp"
+} || {
+ tmp=$TMPDIR/foo$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || exit $?
+file="$tmp/lstopo_xml.output.xml"
+
+set -e
+$lstopo --xml "$1" "$file"
+diff @HWLOC_DIFF_U@ "$1" "$file"
+if [ -n "@XMLLINT@" ]
+then
+ cp "$HWLOC_top_srcdir"/src/hwloc.dtd "$tmp/"
+ @XMLLINT@ --valid "$file" > /dev/null
+fi
+rm -rf "$tmp"
Property changes on: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/tests/xml/test-topology.sh.in
___________________________________________________________________
Added: svn:executable
+ *
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/Makefile.am
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/Makefile.am 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/Makefile.am 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,48 +1,79 @@
# Copyright 2009 INRIA, Université Bordeaux 1
-# Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
-include $(top_srcdir)/hwloc.am
-include $(top_srcdir)/Makefile.man-page-rules
+AM_CFLAGS = $(HWLOC_CFLAGS)
+AM_CPPFLAGS = $(HWLOC_CPPFLAGS)
+AM_LDFLAGS = $(HWLOC_LDFLAGS)
-LIBS = $(top_builddir)/src/libhwloc.la
+LIBS += $(HWLOC_top_builddir)/src/libhwloc.la
EXTRA_DIST = test-hwloc-distrib.output
-bin_PROGRAMS = lstopo hwloc-mask hwloc-bind hwloc-distrib
+# Only build the utilities if we're building in standalone mode
+if HWLOC_BUILD_UTILS
+bin_PROGRAMS = lstopo hwloc-calc hwloc-bind hwloc-distrib
+endif
lstopo_SOURCES = lstopo.h lstopo.c lstopo-color.c lstopo-text.c lstopo-draw.c lstopo-fig.c
-if HAVE_CAIRO
+if HWLOC_HAVE_CAIRO
lstopo_SOURCES += lstopo-cairo.c
endif
-if HAVE_XML
+if HWLOC_HAVE_XML
lstopo_SOURCES += lstopo-xml.c
endif
-if HAVE_WINDOWS
+if HWLOC_HAVE_WINDOWS
lstopo_SOURCES += lstopo-windows.c
endif
-lstopo_CFLAGS = $(CAIRO_CFLAGS) $(XML_CFLAGS)
-lstopo_LDADD = $(CAIRO_LIBS) $(XML_LIBS) -lm
+lstopo_CFLAGS = $(HWLOC_CAIRO_CFLAGS) $(HWLOC_XML_CFLAGS)
+lstopo_LDADD = $(HWLOC_CAIRO_LIBS) $(HWLOC_XML_LIBS) -lm $(HWLOC_TERMCAP_LIBS) $(HWLOC_X11_LIBS)
-hwloc_mask_SOURCES = hwloc-mask.c hwloc-mask.h
+hwloc_calc_SOURCES = hwloc-calc.c hwloc-calc.h
-if HAVE_MINGW32
-else
+# Only run the tests if we're building standalone, because the tests
+# call hwloc executables.
+if HWLOC_BUILD_TESTS
+if !HWLOC_HAVE_MINGW32
TESTS = test-hwloc-distrib.sh
-endif
+endif !HWLOC_HAVE_MINGW32
+endif HWLOC_BUILD_TESTS
-man_pages = lstopo.1 hwloc-bind.1 hwloc-distrib.1 hwloc-mask.1
+# Only install man pages if we're building in standalone mode
+if HWLOC_BUILD_UTILS
+man_pages = hwloc.7 lstopo.1 hwloc-bind.1 hwloc-distrib.1 hwloc-calc.1
EXTRA_DIST += $(man_pages:.1=.1in)
nodist_man_MANS = $(man_pages)
+.1in.1:
+ @ echo Creating $@ man page...
+ @ sed -e 's/#PACKAGE_NAME#/@PACKAGE_NAME@/g' \
+ -e 's/#PACKAGE_VERSION#/@PACKAGE_VERSION@/g' \
+ -e 's/#HWLOC_DATE#/@HWLOC_RELEASE_DATE@/g' \
+ > $@ < $<
+
+.3in.3:
+ @ echo Creating $@ man page...
+ @ sed -e 's/#PACKAGE_NAME#/@PACKAGE_NAME@/g' \
+ -e 's/#PACKAGE_VERSION#/@PACKAGE_VERSION@/g' \
+ -e 's/#HWLOC_DATE#/@HWLOC_RELEASE_DATE@/g' \
+ > $@ < $<
+
+.7in.7:
+ @ echo Creating $@ man page...
+ @ sed -e 's/#PACKAGE_NAME#/@PACKAGE_NAME@/g' \
+ -e 's/#PACKAGE_VERSION#/@PACKAGE_VERSION@/g' \
+ -e 's/#HWLOC_DATE#/@HWLOC_RELEASE_DATE@/g' \
+ > $@ < $<
+
install-exec-hook: install-man
- rm -f $(DESTDIR)$(bindir)/hwloc-ls$(EXEEXT) $(DESTDIR)$(bindir)/hwloc-info$(EXEEXT)
- cd $(DESTDIR)$(bindir) && $(LN_S) lstopo$(EXEEXT) hwloc-ls$(EXEEXT) && $(LN_S) lstopo$(EXEEXT) hwloc-info$(EXEEXT)
- rm -f $(DESTDIR)$(man1dir)/hwloc-ls.1 $(DESTDIR)$(man1dir)/hwloc-info.1
- cd $(DESTDIR)$(man1dir) && $(LN_S) lstopo.1 hwloc-ls.1 && $(LN_S) lstopo.1 hwloc-info.1
+ rm -f $(DESTDIR)$(bindir)/hwloc-ls$(EXEEXT) $(DESTDIR)$(bindir)/hwloc-info$(EXEEXT) $(DESTDIR)$(bindir)/hwloc-mask$(EXEEXT)
+ cd $(DESTDIR)$(bindir) && $(LN_S) lstopo$(EXEEXT) hwloc-ls$(EXEEXT) && $(LN_S) lstopo$(EXEEXT) hwloc-info$(EXEEXT) && $(LN_S) hwloc-calc$(EXEEXT) hwloc-mask$(EXEEXT)
+ rm -f $(DESTDIR)$(man1dir)/hwloc-ls.1 $(DESTDIR)$(man1dir)/hwloc-info.1 $(DESTDIR)$(man1dir)/hwloc-mask.1
+ cd $(DESTDIR)$(man1dir) && $(LN_S) lstopo.1 hwloc-ls.1 && $(LN_S) lstopo.1 hwloc-info.1 && $(LN_S) hwloc-calc.1 hwloc-mask.1
uninstall-local:
- rm -f $(DESTDIR)$(bindir)/hwloc-ls$(EXEEXT) $(DESTDIR)$(bindir)/hwloc-info$(EXEEXT)
- rm -f $(DESTDIR)$(man1dir)/hwloc-ls.1 $(DESTDIR)$(man1dir)/hwloc-info.1
+ rm -f $(DESTDIR)$(bindir)/hwloc-ls$(EXEEXT) $(DESTDIR)$(bindir)/hwloc-info$(EXEEXT) $(DESTDIR)$(bindir)/hwloc-mask$(EXEEXT)
+ rm -f $(DESTDIR)$(man1dir)/hwloc-ls.1 $(DESTDIR)$(man1dir)/hwloc-info.1 $(DESTDIR)$(man1dir)/hwloc-mask.1
distclean-local:
rm -f $(man_pages)
+endif
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-bind.1in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-bind.1in 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-bind.1in 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,25 +1,148 @@
.\" -*- nroff -*-
+.\" Copyright © 2009 Cisco Systems, Inc. All rights reserved.
.TH HWLOC-BIND "1" "#HWLOC_DATE#" "#PACKAGE_VERSION#" "#PACKAGE_NAME#"
.SH NAME
-hwloc-bind \- Bind a command to given objects or cpu masks
+hwloc-bind \- Launch a command that is bound to specific processors
+and/or memory.
+.
+.\" **************************
+.\" Synopsis Section
+.\" **************************
.SH SYNOPSIS
-.B topobind
-[\fIoptions\fR] \fI<location> -- command \fR...
-.SH DESCRIPTION
-.IP
-<location> may be a space\-separated list of cpusets or objects
-.IP
-as supported by the hwloc\-mask utility.
+.
+.B hwloc-bind
+[\fIoptions\fR] \fI<location1> [<location2> [...] ] [--] <command> \fR...
+.
+.\" **************************
+.\" Options Section
+.\" **************************
.SH OPTIONS
+.
+See below for a description of valid <location> formats.
+.TP 10
+\fB\-\-get\fR
+Report the current bindings.
.TP
\fB\-\-single\fR
-bind on a single CPU to prevent migration
+Bind on a single CPU to prevent migration.
.TP
\fB\-\-strict\fR
-require strict binding
+Require strict binding.
.TP
+\fB\-\-get\fR
+Retrieve the current process binding
+.TP
+\fB\-\-pid\fR <pid>
+Operate on pid <pid>
+.TP
+\fB\-p\fR \fB\-\-physical\fR
+take OS/physical indexes instead of logical indexes
+.TP
+\fB\-l\fR \fB\-\-logical\fR
+take logical indexes instead of physical/OS indexes (default)
+.TP
\fB\-v\fR
-verbose messages
+Verbose output.
.TP
\fB\-\-version\fR
-report version and exit
+Report version and exit.
+.
+.\" **************************
+.\" Description Section
+.\" **************************
+.SH DESCRIPTION
+.
+hwloc-bind execs an executable (with optional command line arguments)
+that is bound to the specified location (or list of locations). Upon
+successful execution, hwloc-bind simply sets bindings and then execs
+the executable over itself.
+.
+.PP
+.B NOTE:
+It is highly recommended that you read the hwloc(7) overview page
+before reading this man page. Most of the concepts described in
+hwloc(7) directly apply to the hwloc-bind utility.
+.
+.
+.\" **************************
+.\" Examples Section
+.\" **************************
+.SH EXAMPLES
+.PP
+hwloc-bind's operation is best described through several examples.
+.
+.PP
+To run the echo command on the first logical processor of the second
+socket:
+
+ hwloc-bind socket:1.pu:0 -- echo hello
+
+which is exactly equivalent to
+
+ hwloc-bind socket:1.pu:0 echo hello
+
+To bind the "echo" command to the first core of the second socket and
+the second core of the first socket:
+
+ hwloc-bind socket:1.core:0 socket:0.core:1 echo hello
+
+Note that binding the "echo" command to multiple processors is
+probably meaningless (because "echo" is likely implemented as a
+single-threaded application); these examples just serve to show what
+hwloc-bind can do.
+.
+.PP
+To run on the three first sockets on the second and third nodes:
+
+ hwloc-bind node:1-2.socket:0:3 echo hello
+
+To run on processor with physical index 2 in socket with physical index 1:
+
+ hwloc-bind --physical socket:1.core:2 echo hello
+
+To run on odd cores within even sockets:
+
+ hwloc-bind socket:even.core:odd echo hello
+
+To run on the first socket, except on its second and fifth cores:
+
+ hwloc-bind socket:0 ~socket:0.core:1 ~socket:0.core:4 echo hello
+
+The --get option can report current bindings. This example shows
+nesting hwloc-bind invocations to set a binding and then report it:
+
+ hwloc-bind node:1.socket:2 hwloc-bind --get
+
+On one of the hwloc developer's machines, this example
+.
+reports "0x00004444,0x44000000". The mask reported on your machine
+may be different.
+.
+.PP
+Locations may also be specified as a hex bit mask (typically generated
+by hwloc-calc). For example:
+
+ hwloc-bind 0x00004444,0x44000000 echo hello
+ hwloc-bind `hwloc-calc node:1.socket:2` echo hello
+.
+.\" **************************
+.\" Return value section
+.\" **************************
+.SH RETURN VALUE
+Upon successful execution, hwloc-bind execs the command over itself.
+The return value is therefore whatever the return value of the command
+is.
+.
+.PP
+hwloc-bind will return nonzero if any kind of error occurs, such as
+(but not limited to): failure to parse the command line, failure to
+retrieve process bindings, or lack of a command to execute.
+.
+.\" **************************
+.\" See also section
+.\" **************************
+.SH SEE ALSO
+.
+.ft R
+hwloc(7), lstopo(1), hwloc-calc(1), hwloc-distrib(1)
+.sp
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-bind.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-bind.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-bind.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -4,24 +4,27 @@
* See COPYING in top-level directory.
*/
-#include <hwloc-mask.h>
+#include <private/private.h>
+#include <hwloc-calc.h>
#include <hwloc.h>
-#include <private/private.h>
#include <unistd.h>
#include <errno.h>
-#include <assert.h>
static void usage(FILE *where)
{
- fprintf(where, "Usage: topobind [options] <location> -- command ...\n");
+ fprintf(where, "Usage: hwloc-bind [options] <location> -- command ...\n");
fprintf(where, " <location> may be a space-separated list of cpusets or objects\n");
- fprintf(where, " as supported by the hwloc-mask utility.\n");
+ fprintf(where, " as supported by the hwloc-calc utility.\n");
fprintf(where, "Options:\n");
- fprintf(where, " --single\tbind on a single CPU to prevent migration\n");
- fprintf(where, " --strict\trequire strict binding\n");
- fprintf(where, " -v\t\tverbose messages\n");
- fprintf(where, " --version\treport version and exit\n");
+ fprintf(where, " -l --logical\ttake logical object indexes (default)\n");
+ fprintf(where, " -p --physical\ttake physical object indexes\n");
+ fprintf(where, " --single\tbind on a single CPU to prevent migration\n");
+ fprintf(where, " --strict\trequire strict binding\n");
+ fprintf(where, " --get\t\tretrieve current process binding\n");
+ fprintf(where, " --pid <pid>\toperate on process <pid>\n");
+ fprintf(where, " -v\t\tverbose messages\n");
+ fprintf(where, " --version\treport version and exit\n");
}
int main(int argc, char *argv[])
@@ -29,11 +32,15 @@
hwloc_topology_t topology;
unsigned depth;
hwloc_cpuset_t cpu_set; /* invalid until bind_cpus is set */
+ int get_binding = 0;
int bind_cpus = 0;
int single = 0;
int verbose = 0;
+ int logical = 1;
int flags = 0;
+ int opt;
int ret;
+ hwloc_pid_t pid = 0;
char **orig_argv = argv;
cpu_set = hwloc_cpuset_alloc();
@@ -53,6 +60,8 @@
break;
}
+ opt = 0;
+
if (*argv[0] == '-') {
if (!strcmp(argv[0], "-v")) {
verbose = 1;
@@ -70,23 +79,69 @@
flags |= HWLOC_CPUBIND_STRICT;
goto next;
}
+ else if (!strcmp(argv[0], "--pid")) {
+ if (argc < 2) {
+ usage (stderr);
+ exit(EXIT_FAILURE);
+ }
+ pid = atoi(argv[1]);
+ opt = 1;
+ goto next;
+ }
else if (!strcmp (argv[0], "--version")) {
printf("%s %s\n", orig_argv[0], VERSION);
exit(EXIT_SUCCESS);
}
+ if (!strcmp(argv[0], "-l") || !strcmp(argv[0], "--logical")) {
+ logical = 1;
+ goto next;
+ }
+ if (!strcmp(argv[0], "-p") || !strcmp(argv[0], "--physical")) {
+ logical = 0;
+ goto next;
+ }
+ else if (!strcmp (argv[0], "--get")) {
+ get_binding = 1;
+ goto next;
+ }
usage(stderr);
return EXIT_FAILURE;
}
- hwloc_mask_process_arg(topology, depth, argv[0], cpu_set, verbose);
+ ret = hwloc_mask_process_arg(topology, depth, argv[0], logical, cpu_set, verbose);
+ if (ret < 0) {
+ if (verbose)
+ fprintf(stderr, "assuming the command starts at %s\n", argv[0]);
+ break;
+ }
+
+ /* we found at least one binding argument */
bind_cpus = 1;
next:
- argc--;
- argv++;
+ argc -= opt+1;
+ argv += opt+1;
}
+ if (get_binding) {
+ char *s;
+ int err;
+ if (pid)
+ err = hwloc_get_proc_cpubind(topology, pid, cpu_set, 0);
+ else
+ err = hwloc_get_cpubind(topology, cpu_set, 0);
+ if (err) {
+ const char *errmsg = strerror(errno);
+ fprintf(stderr, "hwloc_get_cpubind failed (errno %d %s)\n", errno, errmsg);
+ return EXIT_FAILURE;
+ }
+ s = hwloc_cpuset_printf_value(cpu_set);
+ printf("%s\n", s);
+ free(s);
+ return EXIT_SUCCESS;
+ }
+
if (bind_cpus) {
if (verbose) {
char *s = hwloc_cpuset_printf_value(cpu_set);
@@ -95,23 +150,36 @@
}
if (single)
hwloc_cpuset_singlify(cpu_set);
- ret = hwloc_set_cpubind(topology, cpu_set, flags);
+ if (pid)
+ ret = hwloc_set_proc_cpubind(topology, pid, cpu_set, flags);
+ else
+ ret = hwloc_set_cpubind(topology, cpu_set, flags);
if (ret) {
+ int bind_errno = errno;
+ const char *errmsg = strerror(bind_errno);
char *s = hwloc_cpuset_printf_value(cpu_set);
- fprintf(stderr, "hwloc_set_cpubind %s failed (errno %d %s)\n", s, errno, strerror(errno));
+ fprintf(stderr, "hwloc_set_cpubind %s failed (errno %d %s)\n", s, bind_errno, errmsg);
free(s);
}
}
- free(cpu_set);
+ hwloc_cpuset_free(cpu_set);
hwloc_topology_destroy(topology);
- if (!argc)
+ if (pid)
return EXIT_SUCCESS;
+ if (0 == argc) {
+ fprintf(stderr, "%s: nothing to do!\n", orig_argv[0]);
+ return EXIT_FAILURE;
+ }
+
ret = execvp(argv[0], argv);
- if (ret && verbose)
- perror("execvp");
+ if (ret) {
+ fprintf(stderr, "%s: Failed to launch executable \"%s\"\n",
+ orig_argv[0], argv[0]);
+ perror("execvp");
+ }
return EXIT_FAILURE;
}
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.1in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.1in (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.1in 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,135 @@
+.\" -*- nroff -*-
+.TH HWLOC-CALC "1" "#HWLOC_DATE#" "#PACKAGE_VERSION#" "#PACKAGE_NAME#"
+.SH NAME
+hwloc-calc \- Operate on cpu mask strings and objects
+.
+.\" **************************
+.\" Synopsis Section
+.\" **************************
+.SH SYNOPSIS
+.
+.B hwloc-calc
+[\fIoptions\fR] \fI<location1> [<location2> [...] ]
+.
+.\" **************************
+.\" Options Section
+.\" **************************
+.SH OPTIONS
+.
+.TP 10
+\fB\-p\fR \fB\-\-physical\fR
+Use OS/physical indexes instead of logical indexes for both input and output.
+.TP
+\fB\-l\fR \fB\-\-logical\fR
+Use logical indexes instead of physical/OS indexes for both input and output (default).
+.TP
+\fB\--pi\fR \fB\-\-physical-input\fR
+Use OS/physical indexes instead of logical indexes for input.
+.TP
+\fB\--li\fR \fB\-\-logical-input\fR
+Use logical indexes instead of physical/OS indexes for input (default).
+.TP
+\fB\--po\fR \fB\-\-physical-input\fR
+Use OS/physical indexes instead of logical indexes for output.
+.TP
+\fB\--lo\fR \fB\-\-logical-output\fR
+Use logical indexes instead of physical/OS indexes for output (default).
+.TP
+\fB\-\-proclist\fR
+Report the comma-separated list of processors' indexes instead of the cpu mask string.
+When combined with \fB\-\-physical\fR, the list is convenient to pass to external
+tools such as taskset or numactl \fB\-\-physcpubind\fR.
+.TP
+\fB\-\-nodelist\fR
+Report the comma-separated list of memory nodes' indexes instead of the cpu mask string.
+When combined with \fB\-\-physical\fR, the list is convenient to pass to external
+tools such as numactl \fB\-\-membind\fR.
+.TP
+\fB\-\-objects\fR
+Report the list of highest objects instead of the cpu mask string.
+.TP
+\fB\-\-single\fR
+Singlify the output to a single CPU.
+.TP
+\fB\-v\fR
+Verbose output.
+.TP
+\fB\-\-version\fR
+Report version and exit.
+.
+.
+.\" **************************
+.\" Description Section
+.\" **************************
+.SH DESCRIPTION
+.
+hwloc-calc generates and manipulates CPU mask strings or objects.
+Both input and output may be either objects (with physical or logical
+indexes) or CPU mask strings (no logical or physical index involved).
+.
+.PP
+.B NOTE:
+It is highly recommended that you read the hwloc(7) overview page
+before reading this man page. Most of the concepts described in
+hwloc(7) directly apply to the hwloc-calc utility.
+.
+.
+.\" **************************
+.\" Examples Section
+.\" **************************
+.SH EXAMPLES
+.PP
+hwloc-calc's operation is best described through several examples.
+.
+.PP
+To display the CPU mask corresponding to the second socket:
+
+ hwloc-calc socket:1
+
+To display the CPU mask corresponding to the third socket, excluding
+its even numbered logical priocessors:
+
+ hwloc-calc socket:2 ~proc:even
+
+To combine two CPU masks:
+
+ hwloc-calc 0x0000ffff 0xff000000
+
+To display the list of logical processors included in the second
+socket:
+
+ hwloc-calc --proclist socket:1
+
+To display the list of NUMA nodes, by physical indexes, that intersect a given CPU mask:
+
+ hwloc-calc --physical --nodelist 0xf0f0f0f0
+
+To display the physical index of a processor given by its logical index:
+
+ hwloc-calc proc:2 --physical-output --proclist
+
+To combine both physical and logical indexes as input:
+
+ hwloc-calc proc:2 --physical-input proc:3
+
+.
+.\" **************************
+.\" Return value section
+.\" **************************
+.SH RETURN VALUE
+Upon successful execution, hwloc-calc displays the CPU mask string.
+The return value is 0.
+.
+.
+.PP
+hwloc-calc will return nonzero if any kind of error occurs, such as
+(but not limited to): failure to parse the command line.
+.
+.\" **************************
+.\" See also section
+.\" **************************
+.SH SEE ALSO
+.
+.ft R
+hwloc(7)
+.sp
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.c (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,173 @@
+/*
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
+ * See COPYING in top-level directory.
+ */
+
+#include <private/private.h>
+#include <hwloc-calc.h>
+#include <hwloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+static void usage(FILE *where)
+{
+ fprintf(where, "Usage: hwloc-calc [options] <location> ...\n");
+ fprintf(where, " <location> may be a space-separated list of cpusets or objects\n");
+ fprintf(where, " as supported by the hwloc-bind utility.\n");
+ fprintf(where, "Options:\n");
+ fprintf(where, " -l --logical\tuse logical object indexes (default)\n");
+ fprintf(where, " -p --physical\tuse physical object indexes\n");
+ fprintf(where, " --li --logical-input\tuse logical indexes for input (default)\n");
+ fprintf(where, " --lo --logical-output\tuse logical indexes for output (default)\n");
+ fprintf(where, " --pi --physical-input\tuse physical indexes for input\n");
+ fprintf(where, " --po --physical-output\tuse physical indexes for output\n");
+ fprintf(where, " --PUlist\treport the list of processing units' indexes in the CPU set\n");
+ fprintf(where, " --nodelist\treport the list of memory nodes' indexes near the CPU set\n");
+ fprintf(where, " --objects\treport the list of largest objects in the CPU set\n");
+ fprintf(where, " --single\tsinglify the output to a single CPU\n");
+ fprintf(where, " -v\t\tverbose messages\n");
+ fprintf(where, " --version\treport version and exit\n");
+}
+
+int main(int argc, char *argv[])
+{
+ hwloc_topology_t topology;
+ unsigned depth;
+ hwloc_cpuset_t set;
+ int verbose = 0;
+ int logicali = 1;
+ int logicalo = 1;
+ int nodelist = 0;
+ int pulist = 0;
+ int showobjs = 0;
+ int singlify = 0;
+ char **orig_argv = argv;
+
+ set = hwloc_cpuset_alloc();
+
+ hwloc_topology_init(&topology);
+ hwloc_topology_load(topology);
+ depth = hwloc_topology_get_depth(topology);
+
+ while (argc >= 2) {
+ if (*argv[1] == '-') {
+ if (!strcmp(argv[1], "-v")) {
+ verbose = 1;
+ goto next;
+ }
+ if (!strcmp(argv[1], "--help")) {
+ usage(stdout);
+ return EXIT_SUCCESS;
+ }
+ if (!strcasecmp(argv[1], "--pulist") || !strcmp(argv[1], "--proclist") /* backward compat with 0.9 */) {
+ pulist = 1;
+ goto next;
+ }
+ if (!strcmp(argv[1], "--nodelist")) {
+ nodelist = 1;
+ goto next;
+ }
+ if (!strcmp(argv[1], "--objects")) {
+ showobjs = 1;
+ goto next;
+ }
+ if (!strcmp(argv[1], "--version")) {
+ printf("%s %s\n", orig_argv[0], VERSION);
+ exit(EXIT_SUCCESS);
+ }
+ if (!strcmp(argv[1], "-l") || !strcmp(argv[1], "--logical")) {
+ logicali = 1;
+ logicalo = 1;
+ goto next;
+ }
+ if (!strcmp(argv[1], "--li") || !strcmp(argv[1], "--logical-input")) {
+ logicali = 1;
+ goto next;
+ }
+ if (!strcmp(argv[1], "--lo") || !strcmp(argv[1], "--logical-output")) {
+ logicalo = 1;
+ goto next;
+ }
+ if (!strcmp(argv[1], "-p") || !strcmp(argv[1], "--physical")) {
+ logicali = 0;
+ logicalo = 0;
+ goto next;
+ }
+ if (!strcmp(argv[1], "--pi") || !strcmp(argv[1], "--physical-input")) {
+ logicali = 0;
+ goto next;
+ }
+ if (!strcmp(argv[1], "--po") || !strcmp(argv[1], "--physical-output")) {
+ logicalo = 0;
+ goto next;
+ }
+ if (!strcmp(argv[1], "--single")) {
+ singlify = 1;
+ goto next;
+ }
+ usage(stderr);
+ return EXIT_FAILURE;
+ }
+
+ if (hwloc_mask_process_arg(topology, depth, argv[1], logicali, set, verbose) < 0) {
+ if (verbose)
+ fprintf(stderr, "ignored unrecognized argument %s\n", argv[1]);
+ }
+
+ next:
+ argc--;
+ argv++;
+ }
+
+ if (singlify)
+ hwloc_cpuset_singlify(set);
+
+ if (showobjs) {
+ hwloc_cpuset_t remaining = hwloc_cpuset_dup(set);
+ int first = 1;
+ while (!hwloc_cpuset_iszero(remaining)) {
+ char type[64];
+ unsigned idx;
+ hwloc_obj_t obj = hwloc_get_first_largest_obj_inside_cpuset(topology, remaining);
+ hwloc_obj_type_snprintf(type, sizeof(type), obj, 1);
+ idx = logicalo ? obj->logical_index : obj->os_index;
+ printf("%s%s:%u", first ? "" : " ", type, idx);
+ hwloc_cpuset_andnot(remaining, remaining, obj->cpuset);
+ first = 0;
+ }
+ printf("\n");
+ hwloc_cpuset_free(remaining);
+ } else if (pulist) {
+ hwloc_obj_t proc, prev = NULL;
+ while ((proc = hwloc_get_next_obj_covering_cpuset_by_type(topology, set, HWLOC_OBJ_PU, prev)) != NULL) {
+ if (prev)
+ printf(",");
+ printf("%u", logicalo ? proc->logical_index : proc->os_index);
+ prev = proc;
+ }
+ printf("\n");
+ } else if (nodelist) {
+ hwloc_obj_t node, prev = NULL;
+ while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, set, HWLOC_OBJ_NODE, prev)) != NULL) {
+ if (prev)
+ printf(",");
+ printf("%u", logicalo ? node->logical_index : node->os_index);
+ prev = node;
+ }
+ printf("\n");
+ } else {
+ char *string = NULL;
+ hwloc_cpuset_asprintf(&string, set);
+ printf("%s\n", string);
+ free(string);
+ }
+
+ hwloc_topology_destroy(topology);
+
+ hwloc_cpuset_free(set);
+
+ return EXIT_SUCCESS;
+}
Copied: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.h (from rev 6631, mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.h)
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.h (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-calc.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,254 @@
+/*
+ * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * See COPYING in top-level directory.
+ */
+
+#ifndef HWLOC_MASK_H
+#define HWLOC_MASK_H
+
+#include <private/config.h>
+#include <private/private.h>
+#include <private/misc.h>
+#include <hwloc.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <ctype.h>
+#include <assert.h>
+
+typedef enum hwloc_mask_append_mode_e {
+ HWLOC_MASK_APPEND_ADD,
+ HWLOC_MASK_APPEND_CLR,
+ HWLOC_MASK_APPEND_AND,
+ HWLOC_MASK_APPEND_XOR,
+} hwloc_mask_append_mode_t;
+
+static inline int
+hwloc_mask_append_cpuset(hwloc_cpuset_t set, hwloc_const_cpuset_t newset,
+ hwloc_mask_append_mode_t mode, int verbose)
+{
+ char *s1 = hwloc_cpuset_printf_value(newset);
+ char *s2 = hwloc_cpuset_printf_value(set);
+ switch (mode) {
+ case HWLOC_MASK_APPEND_ADD:
+ if (verbose)
+ fprintf(stderr, "adding %s to %s\n",
+ s1, s2);
+ hwloc_cpuset_or(set, set, newset);
+ break;
+ case HWLOC_MASK_APPEND_CLR:
+ if (verbose)
+ fprintf(stderr, "clearing %s from %s\n",
+ s1, s2);
+ hwloc_cpuset_andnot(set, set, newset);
+ break;
+ case HWLOC_MASK_APPEND_AND:
+ if (verbose)
+ fprintf(stderr, "and'ing %s from %s\n",
+ s1, s2);
+ hwloc_cpuset_and(set, set, newset);
+ break;
+ case HWLOC_MASK_APPEND_XOR:
+ if (verbose)
+ fprintf(stderr, "xor'ing %s from %s\n",
+ s1, s2);
+ hwloc_cpuset_xor(set, set, newset);
+ break;
+ default:
+ assert(0);
+ }
+ free(s1);
+ free(s2);
+ return 0;
+}
+
+static inline hwloc_obj_t __hwloc_attribute_pure
+hwloc_mask_get_obj_inside_cpuset_by_depth(hwloc_topology_t topology, hwloc_const_cpuset_t rootset,
+ unsigned depth, unsigned i, int logical)
+{
+ if (logical) {
+ return hwloc_get_obj_inside_cpuset_by_depth(topology, rootset, depth, i);
+ } else {
+ hwloc_obj_t obj = NULL;
+ while ((obj = hwloc_get_next_obj_inside_cpuset_by_depth(topology, rootset, depth, obj)) != NULL) {
+ if (obj->os_index == i)
+ return obj;
+ }
+ return NULL;
+ }
+}
+
+static inline int
+hwloc_mask_append_object(hwloc_topology_t topology, unsigned topodepth,
+ hwloc_const_cpuset_t rootset, const char *string, int logical,
+ hwloc_cpuset_t set, int verbose)
+{
+ hwloc_obj_t obj;
+ unsigned depth, width;
+ char *sep, *sep2, *sep3;
+ unsigned first, wrap, amount, step;
+ unsigned i,j;
+
+ if (!hwloc_namecoloncmp(string, "system", 2))
+ depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_SYSTEM);
+ else if (!hwloc_namecoloncmp(string, "machine", 1))
+ depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_MACHINE);
+ else if (!hwloc_namecoloncmp(string, "node", 1))
+ depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_NODE);
+ else if (!hwloc_namecoloncmp(string, "socket", 2))
+ depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_SOCKET);
+ else if (!hwloc_namecoloncmp(string, "core", 1))
+ depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_CORE);
+ else if (!hwloc_namecoloncmp(string, "pu", 1) || !hwloc_namecoloncmp(string, "proc", 1) /* backward compat with 0.9 */)
+ depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_PU);
+ else {
+ char *end;
+ depth = strtol(string, &end, 0);
+ if (end == string) {
+ if (verbose)
+ fprintf(stderr, "invalid object name %s\n", string);
+ return -1;
+ }
+ }
+
+ if (depth >= topodepth) {
+ if (verbose)
+ fprintf(stderr, "ignoring invalid depth %u\n", depth);
+ return -1;
+ }
+ width = hwloc_get_nbobjs_by_depth(topology, depth);
+
+ sep = strchr(string, ':');
+ if (!sep) {
+ if (verbose)
+ fprintf(stderr, "missing colon separator in argument %s\n", string);
+ return -1;
+ }
+
+ first = atoi(sep+1);
+ amount = 1;
+ step = 1;
+ wrap = 0;
+ if (!isdigit(*(sep+1))) {
+ if (!strncmp(sep+1, "all", 3)) {
+ first = 0;
+ amount = width;
+ } else if (!strncmp(sep+1, "odd", 3)) {
+ first = 1;
+ step = 2;
+ amount = (width+1)/2;
+ } else if (!strncmp(sep+1, "even", 4)) {
+ first = 0;
+ step = 2;
+ amount = (width+1)/2;
+ }
+ }
+
+ sep3 = strchr(sep+1, '.');
+
+ sep2 = strchr(sep+1, '-');
+ if (sep2 && (sep2 < sep3 || !sep3)) {
+ if (*(sep2+1) == '\0')
+ amount = width-first;
+ else
+ amount = atoi(sep2+1)-first+1;
+ } else {
+ sep2 = strchr(sep+1, ':');
+ if (sep2 && (sep2 < sep3 || !sep3)) {
+ amount = atoi(sep2+1);
+ wrap = 1;
+ }
+ }
+
+ for(i=first, j=0; j<amount; i+=step, j++) {
+ if (wrap && i==width)
+ i = 0;
+
+ obj = hwloc_mask_get_obj_inside_cpuset_by_depth(topology, rootset, depth, i, logical);
+ if (verbose) {
+ char * s = hwloc_cpuset_printf_value(rootset);
+ if (obj)
+ printf("object #%u depth %u below cpuset %s found\n",
+ i, depth, s);
+ else
+ printf("object #%u depth %u below cpuset %s does not exist\n",
+ i, depth, s);
+ free(s);
+ }
+ if (obj) {
+ if (sep3)
+ hwloc_mask_append_object(topology, topodepth, obj->cpuset, sep3+1, logical, set, verbose);
+ else
+ /* add to the temporary cpuset
+ * and let the caller add/clear/and/xor for the actual final cpuset depending on cmdline options
+ */
+ hwloc_mask_append_cpuset(set, obj->cpuset, HWLOC_MASK_APPEND_ADD, verbose);
+ }
+ }
+
+ return 0;
+}
+
+static inline int
+hwloc_mask_process_arg(hwloc_topology_t topology, unsigned topodepth,
+ const char *arg, int logical, hwloc_cpuset_t set,
+ int verbose)
+{
+ char *colon;
+ hwloc_mask_append_mode_t mode = HWLOC_MASK_APPEND_ADD;
+ int err;
+
+ if (*arg == '~') {
+ mode = HWLOC_MASK_APPEND_CLR;
+ arg++;
+ } else if (*arg == 'x') {
+ mode = HWLOC_MASK_APPEND_AND;
+ arg++;
+ } else if (*arg == '^') {
+ mode = HWLOC_MASK_APPEND_XOR;
+ arg++;
+ }
+
+ colon = strchr(arg, ':');
+ if (colon) {
+ hwloc_cpuset_t newset = hwloc_cpuset_alloc();
+ err = hwloc_mask_append_object(topology, topodepth, hwloc_topology_get_complete_cpuset(topology), arg, logical, newset, verbose);
+ if (!err)
+ err = hwloc_mask_append_cpuset(set, newset, mode, verbose);
+ hwloc_cpuset_free(newset);
+ } else {
+ /* try to parse as a comma-separated list of integer with 0x as an optional prefix */
+ char *tmp = (char*) arg;
+ hwloc_cpuset_t newset;
+ while (1) {
+ char *next = strchr(tmp, ',');
+ size_t len;
+ if (strncasecmp(tmp, "0x", 2) == 0) {
+ tmp += 2;
+ if (',' == *tmp || 0 == *tmp) {
+ err = -1;
+ goto out;
+ }
+ }
+ len = next ? (size_t) (next-tmp) : strlen(tmp);
+ if (len != strspn(tmp, "0123456789abcdefABCDEF")) {
+ err = -1;
+ goto out;
+ }
+ if (!next)
+ break;
+ tmp = next+1;
+ }
+ newset = hwloc_cpuset_alloc();
+ hwloc_cpuset_from_string(newset, arg);
+ err = hwloc_mask_append_cpuset(set, newset, mode, verbose);
+ hwloc_cpuset_free(newset);
+ }
+
+ out:
+ return err;
+}
+
+#endif /* HWLOC_MASK_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-distrib.1in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-distrib.1in 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-distrib.1in 2010-05-11 01:47:13 UTC (rev 6632)
@@ -2,16 +2,97 @@
.TH HWLOC-DISTRIB "1" "#HWLOC_DATE#" "#PACKAGE_VERSION#" "#PACKAGE_NAME#"
.SH NAME
hwloc-distrib \- Build a number of cpu masks distributed on the system
+.
+.\" **************************
+.\" Synopsis Section
+.\" **************************
.SH SYNOPSIS
.B topodistrib
-[\fIoptions\fR] \fInumber\fR
+[\fIoptions\fR] \fI<integer>\fR
+.
+.\" **************************
+.\" Options Section
+.\" **************************
.SH OPTIONS
.TP
\fB\-v\fR
-verbose messages
+Singlify each output to a single CPU.
.TP
+\fB\-v\fR
+Verbose messages.
+.TP
\fB\-\-synthetic\fR "2 2"
-simulate a fake hierarchy
+Simulate a fake hierarchy.
.TP
\fB\-\-version\fR
-report version and exit
+Report version and exit.
+.
+.\" **************************
+.\" Description Section
+.\" **************************
+.SH DESCRIPTION
+.
+hwloc-distrib generates a series of CPU masks in an attempt to
+distribute a set of processes around multiple processors in a single
+server. These masks can be used with hwloc-bind(1).
+.
+.PP
+.B NOTE:
+It is highly recommended that you read the hwloc(7) overview page
+before reading this man page. Most of the concepts described in
+hwloc(7) directly apply to the hwloc-bind utility.
+.
+.
+.\" **************************
+.\" Examples Section
+.\" **************************
+.SH EXAMPLES
+.PP
+hwloc-distrib's operation is best described through several examples.
+.
+.PP
+If 4 processes have to be distributed across a machine, their CPU masks
+may be obtained with:
+
+ $ hwloc-distrib 4
+ 0000000f
+ 00000f00
+ 000000f0
+ 0000f000
+
+To get a single processor of each CPU masks (prevent migration in case
+of binding)
+
+ $ hwloc-distrib 4 --single
+ 00000001
+ 00000100
+ 00000010
+ 00001000
+
+To convert the output into a list of processors that may be passed to
+dplace -c inside a mpirun command line:
+
+ $ hwloc-distrib 4 --single | xargs hwloc-calc --pulist
+ 0,8,4,16
+.
+.
+.\" **************************
+.\" Return value section
+.\" **************************
+.SH RETURN VALUE
+Upon successful execution, hwloc-distrib displays one or more CPU mask
+strings. The return value is 0.
+.
+.
+.PP
+hwloc-distrib will return nonzero if any kind of error occurs, such as
+(but not limited to) failure to parse the command line.
+.
+.\" **************************
+.\" See also section
+.\" **************************
+.SH SEE ALSO
+.
+.ft R
+hwloc(7)
+.sp
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-distrib.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-distrib.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-distrib.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -4,19 +4,19 @@
* See COPYING in top-level directory.
*/
+#include <private/private.h>
#include <hwloc.h>
-#include <private/private.h>
#include <unistd.h>
-#include <assert.h>
static void usage(FILE *where)
{
- fprintf(where, "Usage: topodistrib [options] number\n");
+ fprintf(where, "Usage: hwloc-distrib [options] number\n");
fprintf(where, "Options:\n");
+ fprintf(where, " --single\tsinglify each output to a single CPU\n");
fprintf(where, " -v\t\t\tverbose messages\n");
fprintf(where, " --synthetic \"2 2\"\tsimulate a fake hierarchy\n");
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
fprintf(where, " --xml <path>\t\tread topology from XML file <path>\n");
#endif
fprintf(where, " --version\t\treport version and exit\n");
@@ -27,6 +27,7 @@
long n = -1;
char * synthetic = NULL;
const char * xmlpath = NULL;
+ int singlify = 0;
int verbose = 0;
char **orig_argv = argv;
@@ -42,6 +43,10 @@
}
if (*argv[0] == '-') {
+ if (!strcmp(argv[0], "--single")) {
+ singlify = 1;
+ goto next;
+ }
if (!strcmp(argv[0], "-v")) {
verbose = 1;
goto next;
@@ -64,7 +69,7 @@
printf("%s %s\n", orig_argv[0], VERSION);
exit(EXIT_SUCCESS);
}
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
if (!strcmp (argv[0], "--xml")) {
if (argc <= 2) {
usage(stdout);
@@ -77,7 +82,7 @@
xmlpath = "/dev/stdin";
goto next;
}
-#endif /* HAVE_XML */
+#endif /* HWLOC_HAVE_XML */
usage(stderr);
return EXIT_FAILURE;
@@ -116,12 +121,15 @@
hwloc_topology_set_xml(topology, xmlpath);
hwloc_topology_load(topology);
- hwloc_distribute(topology, hwloc_get_system_obj(topology), cpuset, n);
+ hwloc_distribute(topology, hwloc_get_root_obj(topology), cpuset, n);
for (i = 0; i < n; i++) {
char *str = NULL;
+ if (singlify)
+ hwloc_cpuset_singlify(cpuset[i]);
hwloc_cpuset_asprintf(&str, cpuset[i]);
printf("%s\n", str);
free(str);
+ hwloc_cpuset_free(cpuset[i]);
}
hwloc_topology_destroy(topology);
}
Deleted: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.1in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.1in 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.1in 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,62 +0,0 @@
-.\" -*- nroff -*-
-.TH HWLOC-MASK "1" "#HWLOC_DATE#" "#PACKAGE_VERSION#" "#PACKAGE_NAME#"
-.SH NAME
-hwloc-mask \- Build a cpu mask
-.SH SYNOPSIS
-.B hwloc-mask
-[\fIoptions\fR] [\fIstring\fR] ...
-.SH DESCRIPTION
-<string> may be <depth:index>
-.TP
-\-
-<depth> may be system, machine, node, socket, core, proc or a numeric depth
-.TP
-\-
-<index> may be
-.TP
-\&.
-X one object with index X
-.TP
-\&.
-X\-Y all objects with index between X and Y
-.TP
-\&.
-X\- all objects with index at least X
-.TP
-\&.
-X:N N objects starting with index X, possibly wrapping\-around the end of the level
-.TP
-\&.
-all all objects
-.TP
-\&.
-odd all objects with odd index
-.TP
-\&.
-even all objects with even index
-.TP
-\-
-several <depth:index> may be concatenated with `.' to select some specific children
-.PP
-<string> may also be a cpuset string
-.PP
-If prefixed with `~', the given string will be cleared instead of added to the current cpuset
-If prefixed with `x', the given string will be and'ed instead of added to the current cpuset
-If prefixed with `^', the given string will be xor'ed instead of added to the current cpuset
-.PP
-String are processed in order, without priorities.
-Compose multiple invokations for complex operations.
-e.g. for (A|B)^(C|D), use: hwloc\-mask A B ^$(hwloc\-mask C D)
-.SH OPTIONS
-.TP
-\fB\-v\fR
-verbose
-.TP
-\fB\-\-proclist\fR
-report the list of processors in the CPU set
-.TP
-\fB\-\-nodelist\fR
-report the list of memory nodes near the CPU set
-.TP
-\fB\-\-version\fR
-report version and exit
Deleted: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,122 +0,0 @@
-/*
- * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
- * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
- * See COPYING in top-level directory.
- */
-
-#include <hwloc-mask.h>
-#include <hwloc.h>
-#include <private/private.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-static void usage(FILE *where)
-{
- fprintf(where, "Usage: hwloc-mask [options] [string] ...\n");
- fprintf(where, "\n<string> may be <depth:index>\n");
- fprintf(where, " - <depth> may be system, machine, node, socket, core, proc or a numeric depth\n");
- fprintf(where, " - <index> may be\n");
- fprintf(where, " . X\tone object with index X\n");
- fprintf(where, " . X-Y\tall objects with index between X and Y\n");
- fprintf(where, " . X-\tall objects with index at least X\n");
- fprintf(where, " . X:N\tN objects starting with index X, possibly wrapping-around the end of the level\n");
- fprintf(where, " . all\tall objects\n");
- fprintf(where, " . odd\tall objects with odd index\n");
- fprintf(where, " . even\tall objects with even index\n");
- fprintf(where, " - several <depth:index> may be concatenated with `.' to select some specific children\n");
- fprintf(where, "\n<string> may also be a cpuset string\n");
- fprintf(where, "\nIf prefixed with `~', the given string will be cleared instead of added to the current cpuset\n");
- fprintf(where, "If prefixed with `x', the given string will be and'ed instead of added to the current cpuset\n");
- fprintf(where, "If prefixed with `^', the given string will be xor'ed instead of added to the current cpuset\n");
- fprintf(where, "\nString are processed in order, without priorities.\n");
- fprintf(where, "Compose multiple invokations for complex operations.\n");
- fprintf(where, "e.g. for (A|B)^(C|D), use: hwloc-mask A B ^$(hwloc-mask C D)\n");
- fprintf(where, "\nOptions:\n");
- fprintf(where, " -v\tverbose\n");
- fprintf(where, " --proclist\treport the list of processors in the CPU set\n");
- fprintf(where, " --nodelist\treport the list of memory nodes near the CPU set\n");
- fprintf(where, " --version\treport version and exit\n");
-}
-
-int main(int argc, char *argv[])
-{
- hwloc_topology_t topology;
- unsigned depth;
- hwloc_cpuset_t set;
- int verbose = 0;
- int nodelist = 0;
- int proclist = 0;
- char **orig_argv = argv;
-
- set = hwloc_cpuset_alloc();
-
- hwloc_topology_init(&topology);
- hwloc_topology_load(topology);
- depth = hwloc_topology_get_depth(topology);
-
- while (argc >= 2) {
- if (*argv[1] == '-') {
- if (!strcmp(argv[1], "-v")) {
- verbose = 1;
- goto next;
- }
- if (!strcmp(argv[1], "--help")) {
- usage(stdout);
- return EXIT_SUCCESS;
- }
- if (!strcmp(argv[1], "--proclist")) {
- proclist = 1;
- goto next;
- }
- if (!strcmp(argv[1], "--nodelist")) {
- nodelist = 1;
- goto next;
- }
- if (!strcmp(argv[1], "--version")) {
- printf("%s %s\n", orig_argv[0], VERSION);
- exit(EXIT_SUCCESS);
- }
- usage(stderr);
- return EXIT_FAILURE;
- }
-
- hwloc_mask_process_arg(topology, depth, argv[1], set, verbose);
-
- next:
- argc--;
- argv++;
- }
-
- if (proclist) {
- hwloc_obj_t proc, prev = NULL;
- while ((proc = hwloc_get_next_obj_covering_cpuset_by_type(topology, set, HWLOC_OBJ_PROC, prev)) != NULL) {
- if (prev)
- printf(",");
- printf("%d", proc->os_index);
- prev = proc;
- }
- printf("\n");
- } else if (nodelist) {
- hwloc_obj_t node, prev = NULL;
- while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, set, HWLOC_OBJ_NODE, prev)) != NULL) {
- if (prev)
- printf(",");
- printf("%d", node->os_index);
- prev = node;
- }
- printf("\n");
- } else {
- char *string = NULL;
- hwloc_cpuset_asprintf(&string, set);
- printf("%s\n", string);
- free(string);
- }
-
- hwloc_topology_destroy(topology);
-
- free(set);
-
- return EXIT_SUCCESS;
-}
Deleted: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc-mask.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,195 +0,0 @@
-/*
- * Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
- * See COPYING in top-level directory.
- */
-
-#ifndef HWLOC_MASK_H
-#define HWLOC_MASK_H
-
-#include <hwloc.h>
-#include <private/config.h>
-#include <private/private.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <strings.h>
-#include <ctype.h>
-#include <assert.h>
-
-typedef enum hwloc_mask_append_mode_e {
- HWLOC_MASK_APPEND_ADD,
- HWLOC_MASK_APPEND_CLR,
- HWLOC_MASK_APPEND_AND,
- HWLOC_MASK_APPEND_XOR,
-} hwloc_mask_append_mode_t;
-
-static __inline void
-hwloc_mask_append_cpuset(hwloc_cpuset_t set, hwloc_cpuset_t newset,
- hwloc_mask_append_mode_t mode, int verbose)
-{
- char *s1 = hwloc_cpuset_printf_value(newset);
- char *s2 = hwloc_cpuset_printf_value(set);
- switch (mode) {
- case HWLOC_MASK_APPEND_ADD:
- if (verbose)
- fprintf(stderr, "adding %s to %s\n",
- s1, s2);
- hwloc_cpuset_orset(set, newset);
- break;
- case HWLOC_MASK_APPEND_CLR:
- if (verbose)
- fprintf(stderr, "clearing %s from %s\n",
- s1, s2);
- hwloc_cpuset_clearset(set, newset);
- break;
- case HWLOC_MASK_APPEND_AND:
- if (verbose)
- fprintf(stderr, "and'ing %s from %s\n",
- s1, s2);
- hwloc_cpuset_andset(set, newset);
- break;
- case HWLOC_MASK_APPEND_XOR:
- if (verbose)
- fprintf(stderr, "xor'ing %s from %s\n",
- s1, s2);
- hwloc_cpuset_xorset(set, newset);
- break;
- default:
- assert(1);
- }
- free(s1);
- free(s2);
-}
-
-static __inline int
-hwloc_mask_append_object(hwloc_topology_t topology, unsigned topodepth,
- hwloc_cpuset_t rootset, const char *string,
- hwloc_cpuset_t set, hwloc_mask_append_mode_t mode, int verbose)
-{
- hwloc_obj_t obj;
- unsigned depth, width;
- char *sep, *sep2, *sep3;
- unsigned first, wrap, amount, step;
- unsigned i,j;
-
- if (!hwloc_strncasecmp(string, "system", 2))
- depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_SYSTEM);
- else if (!hwloc_strncasecmp(string, "machine", 1))
- depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_MACHINE);
- else if (!hwloc_strncasecmp(string, "node", 1))
- depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_NODE);
- else if (!hwloc_strncasecmp(string, "socket", 2))
- depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_SOCKET);
- else if (!hwloc_strncasecmp(string, "core", 1))
- depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_CORE);
- else if (!hwloc_strncasecmp(string, "proc", 1))
- depth = hwloc_get_type_or_above_depth(topology, HWLOC_OBJ_PROC);
- else
- depth = atoi(string);
-
- if (depth >= topodepth) {
- if (verbose)
- fprintf(stderr, "ignoring invalid depth %u\n", depth);
- return -1;
- }
- width = hwloc_get_nbobjs_by_depth(topology, depth);
-
- sep = strchr(string, ':');
- if (!sep) {
- if (verbose)
- fprintf(stderr, "missing colon separator in argument %s\n", string);
- return -1;
- }
-
- first = atoi(sep+1);
- amount = 1;
- step = 1;
- wrap = 0;
- if (!isdigit(*(sep+1))) {
- if (!strncmp(sep+1, "all", 3)) {
- first = 0;
- amount = width;
- } else if (!strncmp(sep+1, "odd", 3)) {
- first = 1;
- step = 2;
- amount = (width+1)/2;
- } else if (!strncmp(sep+1, "even", 4)) {
- first = 0;
- step = 2;
- amount = (width+1)/2;
- }
- }
-
- sep3 = strchr(sep+1, '.');
-
- sep2 = strchr(sep+1, '-');
- if (sep2 && (sep2 < sep3 || !sep3)) {
- if (*(sep2+1) == '\0')
- amount = width-first;
- else
- amount = atoi(sep2+1)-first+1;
- } else {
- sep2 = strchr(sep+1, ':');
- if (sep2 && (sep2 < sep3 || !sep3)) {
- amount = atoi(sep2+1);
- wrap = 1;
- }
- }
-
- for(i=first, j=0; j<amount; i+=step, j++) {
- if (wrap && i==width)
- i = 0;
-
- obj = hwloc_get_obj_inside_cpuset_by_depth(topology, rootset, depth, i);
- if (verbose) {
- char * s = hwloc_cpuset_printf_value(rootset);
- if (obj)
- printf("object #%u depth %u below cpuset %s found\n",
- i, depth, s);
- else
- printf("object #%u depth %u below cpuset %s does not exist\n",
- i, depth, s);
- free(s);
- }
- if (obj) {
- if (sep3)
- hwloc_mask_append_object(topology, topodepth, obj->cpuset, sep3+1, set, mode, verbose);
- else
- hwloc_mask_append_cpuset(set, obj->cpuset, mode, verbose);
- }
- }
-
- return 0;
-}
-
-static __inline void
-hwloc_mask_process_arg(hwloc_topology_t topology, unsigned topodepth,
- const char *arg, hwloc_cpuset_t set,
- int verbose)
-{
- char *colon;
- hwloc_mask_append_mode_t mode = HWLOC_MASK_APPEND_ADD;
-
- if (*arg == '~') {
- mode = HWLOC_MASK_APPEND_CLR;
- arg++;
- } else if (*arg == 'x') {
- mode = HWLOC_MASK_APPEND_AND;
- arg++;
- } else if (*arg == '^') {
- mode = HWLOC_MASK_APPEND_XOR;
- arg++;
- }
-
- colon = strchr(arg, ':');
- if (colon) {
- hwloc_mask_append_object(topology, topodepth, hwloc_get_system_obj(topology)->cpuset, arg, set, mode, verbose);
- } else {
- hwloc_cpuset_t newset = hwloc_cpuset_from_string(arg);
- hwloc_mask_append_cpuset(set, newset, mode, verbose);
- free(newset);
- }
-}
-
-#endif /* HWLOC_MASK_H */
Added: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc.7in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc.7in (rev 0)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/hwloc.7in 2010-05-11 01:47:13 UTC (rev 6632)
@@ -0,0 +1,290 @@
+.\" -*- nroff -*-
+.\" Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
+.TH HWLOC "1" "#HWLOC_DATE#" "#PACKAGE_VERSION#" "#PACKAGE_NAME#"
+.SH NAME
+hwloc - General information about hwloc ("hardware locality").
+.
+.\" **************************
+.\" Description Section
+.\" **************************
+.SH DESCRIPTION
+.
+hwloc provides command line tools and a C API to obtain the
+hierarchical map of key computing elements, such as: NUMA memory
+nodes, shared caches, processor sockets, processor cores, and
+processor "threads". hwloc also gathers various attributes such as
+cache and memory information, and is portable across a variety of
+different operating systems and platforms.
+.
+.
+.SS Definitions
+Hwloc has some specific definitions for terms that are used in this
+man page and other hwloc documentation.
+.
+.TP 5
+.B Hwloc CPU set:
+A set of processors included in an hwloc object, expressed as a bitmask
+indexed by the physical numbers of the CPUs (as announced by the OS).
+The hwloc definition
+of "CPU set" does not carry any the same connotations as Linux's "CPU
+set" (e.g., process affinity, etc.).
+.
+.TP
+.B Linux CPU set:
+See http://www.mjmwired.net/kernel/Documentation/cpusets.txt for a
+discussion of Linux CPU sets. A
+super-short-ignoring-many-details description (taken from that page)
+is:
+.
+.\" Force a paragraph break, but keep the indentation
+.TP
+\
+.
+ "Cpusets provide a mechanism for assigning a set of CPUs and Memory
+Nodes to a set of tasks."
+.
+.TP
+.B Linux Cgroup:
+See http://www.mjmwired.net/kernel/Documentation/cgroups.txt for a
+discussion of Linux control groups. A
+super-short-ignoring-many-details description (taken from that page)
+is:
+.
+.\" Force a paragraph break, but keep the indentation
+.TP
+\
+ "Control Groups provide a mechanism for aggregating/partitioning sets
+of tasks, and all their future children, into hierarchical groups
+with specialized behaviour."
+.
+.PP
+To be clear, hwloc supports all of the above concepts. It is simply
+worth noting that they are 3 different things.
+.
+.SS Location Specification
+.
+Locations refer to specific regions within a topology. Before reading
+the rest of this man page, it may be useful to read lstopo(1) and/or
+run lstopo on your machine to see the reported topology tree. Seeing
+and understanding a topology tree will definitely help in
+understanding the concepts that are discussed below.
+.
+.PP
+Locations can be specified in multiple ways:
+.
+.TP 10
+.B Tuples:
+Tuples of hwloc "objects" and associated indexes can be specified in
+the form
+.IR object:index .
+Hwloc objects represent types of mapped items (e.g., sockets, cores,
+etc.) in a topology tree; indexes are non-negative integers that
+specify a unique physical object in a topology tree. Both concepts
+are described in detail, below.
+.\" Force a paragraph break, but keep the indentation.
+.TP
+\
+Chaining multiple tuples together in the more general form
+.I object1:index[.object2:index2[...]]
+is permissable. While the first tuple's object may appear anywhere in
+the topology, the Nth tuple's object must have a shallower topology
+depth than the (N+1)th tuple's object. Put simply: as you move right
+in a tuple chain, objects must go deeper in the topology tree.
+When using logical indexes (default),
+indexes specified in chained tuples are relative to the scope of the
+parent object. For example, "socket:0.core:1" refers to the second
+core in the first socket.
+When using OS/physical indexes, the first object matching the given
+index is used.
+.
+.TP
+.B Hex:
+Locations can also be specified as hexidecimal bitmasks prefixed
+.
+with "0x". Commas must be used to separate the hex digits into blocks
+of 8, such as "0xffc0140,0x00020110".
+.
+Leading zeros in each block do not need to be specified.
+.
+For example, "0xffc0140,0x20110" is equivalent to the prior example,
+and "0x0000000f" is exactly equivalent to "0xf". Intermediate blocks
+of 8 digits that are all zeoro can be left empty; "0xff0,,0x13" is
+equivalent to "0xff0,0x00000000,0x13".
+.
+.PP
+Multiple locations can be specified on the hwloc-bind command line
+(delimited by whitespace); the first token of the execution command is
+assumed to either follow "--" (if specified) or the first token that
+is unrecognized as a location.
+.
+By default, multiple locations are added, meaning that the binding
+will be wider in the sense that the process may run on more objects.
+If prefixed with "~", the given location will be cleared instead of
+added to the current list of locations.
+If prefixed with "x", the given location will be and'ed instead of
+added to the current list.
+If prefixed with "^", the given location will be xor'ed.
+.
+More complex operations may be performed by using
+.R hwloc-calc
+to compute intermediate values.
+.
+.SS Hwloc Objects
+.
+.PP
+Objects can be any of the following strings
+.
+(listed from "biggest" to "smallest"):
+.
+.TP 10
+.B machine
+A set of processors and memory.
+.
+.TP
+.B node
+A NUMA node; a set of processors around memory which the processors
+can directly access.
+.
+.TP
+.B socket
+Typically a physical package or chip, it is a grouping of one or more
+processors.
+.
+.TP
+.B core
+A single, physical processing unit which may still contain multiple
+logical processors, such as hardware threads.
+.
+.TP
+.B proc
+Short for
+.I processor
+(not
+.IR process !).
+The smallest physical execution unit that hwloc recognizes. For
+example, there may be multiple procs on a core (e.g.,
+hardware threads).
+.PP
+The additional
+.B system
+type can be used when several machines form an overall single system image
+(SSI), such as Kerrighed.
+.
+.PP
+Finally, note that an object can be denoted by its numeric "depth" in
+the topology graph. See the Examples section for more information.
+.
+.SS Hwloc Indexes
+Indexes are integer values that uniquely specify a given object of a
+specific type. Indexes can be expressed either as
+.I logical
+values or
+.I physical
+values.
+While
+.B hwloc-bind accepts logical indexes as
+.BR input
+by default.
+Passing
+.B --physical
+switches to physical/OS indexes.
+Both logical and physical indexes are described on this man page.
+.
+.PP
+.I Logical
+indexes are relative to the object order in the output from the
+lstopo command. They always start with 0 and increment by 1 for each
+successive object.
+.
+.PP
+.I Physical
+indexes are how the operating system refers to objects. Note that
+while physical indexes are non-negative integer values, the hardware
+and/or operating system may choose arbitrary values -- they may not
+start with 0, and successive objects may not have consecutive values.
+.
+.PP
+For example, if the first few lines of lstopo -p output are the
+following:
+.
+
+ System(32GB)
+ Node#0(16GB)
+ Socket#0 + L2(4MB)
+ L1(32KB) + Core#16 + P#0
+ L1(32KB) + Core#18 + P#2
+ Socket#1 + L2(4MB)
+ L1(32KB) + Core#16 + P#1
+ L1(32KB) + Core#18 + P#3
+
+The first core on the second socket is logically number 2 (i.e.,
+logically the 3rd core, starting from 0). Its physical index is
+16, but note that another core
+.I also
+has a physical index of 16. Hence, physical indexes may only be
+relevant within the scope of their parent (or set of grandparents).
+In this example, to uniquely identify logical core 2 with
+physical indexes, you must specify (at a minimum) both a socket and a
+core: socket 1, core 16.
+.PP
+Index values, regardless of whether they are logical or physical, can
+be expressed in several different forms (where X, Y, and N are
+positive integers):
+.
+.TP 10
+.B X
+The object with index value X.
+.
+.TP
+.B X-Y
+All the objects with index values >= X and <= Y.
+.
+.TP
+.B X-
+All the objects with index values >= X.
+.
+.TP
+.B X:N
+N objects starting with index X, possibly wrapping around the end of
+the level.
+.
+.TP
+.B all
+A special index value indicating all valid index values.
+.
+.TP
+.B odd
+A special index value indicating all valid odd index values.
+.
+.TP
+.B even
+A special index value indicating all valid even index values.
+.
+.PP
+.IR REMEMBER :
+hwloc's command line tools accept
+.I logical
+indexes for location values by default.
+Use
+.BR --physical " and " --logical
+to switch from one mode to another.
+.
+.\" **************************
+.\" See also section
+.\" **************************
+.SH SEE ALSO
+.
+Hwloc's command line tool documentation: lstopo(1), hwloc-bind(1),
+hwloc-calc(1), hwloc-distrib(1).
+.
+.PP
+Hwloc has many C API functions, each of which have their own man page.
+Some top-level man pages are also provided, grouping similar functions
+together. A few good places to start might include:
+hwlocality_objects(3), hwlocality_types(3), hwlocality_creation(3),
+hwlocality_cpuset(3), hwlocality_information(3), and
+hwlocality_binding(3).
+.
+.PP
+For a listing of all available hwloc man pages, look at all "hwloc*"
+files in the man1 and man3 directories.
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-cairo.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-cairo.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-cairo.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,11 +1,12 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
#include <private/config.h>
-#ifdef HAVE_CAIRO
+#ifdef HWLOC_HAVE_CAIRO
#include <cairo.h>
#if CAIRO_HAS_PDF_SURFACE
@@ -20,7 +21,7 @@
#include <cairo-svg.h>
#endif /* CAIRO_HAS_SVG_SURFACE */
-#ifndef HAVE_X11
+#ifndef HWLOC_HAVE_X11
/* In case X11 headers aren't availble, forcefully disable Cairo/Xlib. */
# undef CAIRO_HAS_XLIB_SURFACE
# define CAIRO_HAS_XLIB_SURFACE 0
@@ -31,19 +32,21 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
+#include <X11/cursorfont.h>
#endif /* CAIRO_HAS_XLIB_SURFACE */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
+#include <limits.h>
#include "lstopo.h"
#if (CAIRO_HAS_XLIB_SURFACE + CAIRO_HAS_PNG_FUNCTIONS + CAIRO_HAS_PDF_SURFACE + CAIRO_HAS_PS_SURFACE + CAIRO_HAS_SVG_SURFACE)
/* Cairo methods */
static void
-topo_cairo_box(void *output, int r, int g, int b, unsigned depth, unsigned x, unsigned width, unsigned y, unsigned height)
+topo_cairo_box(void *output, int r, int g, int b, unsigned depth __hwloc_attribute_unused, unsigned x, unsigned width, unsigned y, unsigned height)
{
cairo_t *c = output;
cairo_rectangle(c, x, y, width, height);
@@ -57,17 +60,18 @@
}
static void
-topo_cairo_line(void *output, int r, int g, int b, unsigned depth, unsigned x1, unsigned y1, unsigned x2, unsigned y2)
+topo_cairo_line(void *output, int r, int g, int b, unsigned depth __hwloc_attribute_unused, unsigned x1, unsigned y1, unsigned x2, unsigned y2)
{
cairo_t *c = output;
cairo_move_to(c, x1, y1);
+ cairo_set_source_rgb(c, (float) r / 255, (float) g / 255, (float) b / 255);
cairo_set_line_width(c, 1);
cairo_line_to(c, x2, y2);
cairo_stroke(c);
}
static void
-topo_cairo_text(void *output, int r, int g, int b, int size, unsigned depth, unsigned x, unsigned y, const char *text)
+topo_cairo_text(void *output, int r, int g, int b, int size, unsigned depth __hwloc_attribute_unused, unsigned x, unsigned y, const char *text)
{
cairo_t *c = output;
cairo_move_to(c, x, y + size);
@@ -87,16 +91,16 @@
#endif /* (CAIRO_HAS_PNG_FUNCTIONS + CAIRO_HAS_PDF_SURFACE + CAIRO_HAS_PS_SURFACE + CAIRO_HAS_SVG_SURFACE) */
static void
-topo_cairo_paint(struct draw_methods *methods, hwloc_topology_t topology, cairo_surface_t *cs)
+topo_cairo_paint(struct draw_methods *methods, int logical, hwloc_topology_t topology, cairo_surface_t *cs)
{
cairo_t *c;
c = cairo_create(cs);
- output_draw(methods, topology, c);
+ output_draw(methods, logical, topology, c);
cairo_show_page(c);
cairo_destroy(c);
}
-static void null_declare_color (void *output, int r, int g, int b) {}
+static void null_declare_color (void *output __hwloc_attribute_unused, int r __hwloc_attribute_unused, int g __hwloc_attribute_unused, int b __hwloc_attribute_unused) {}
#endif /* (CAIRO_HAS_XLIB_SURFACE + CAIRO_HAS_PNG_FUNCTIONS + CAIRO_HAS_PDF_SURFACE + CAIRO_HAS_PS_SURFACE + CAIRO_HAS_SVG_SURFACE) */
@@ -107,13 +111,14 @@
Display *dpy;
cairo_surface_t *cs;
Window win;
+ Cursor hand;
int screen_width, screen_height; /** visible part size */
int width, height; /** total size */
int x, y; /** top left corner of the visible part */
};
static void *
-x11_start(void *output, int width, int height)
+x11_start(void *output __hwloc_attribute_unused, int width, int height)
{
cairo_surface_t *cs;
Display *dpy;
@@ -122,6 +127,7 @@
Screen *screen;
int screen_width = width, screen_height = height;
struct display *disp;
+ Cursor hand;
if (!(dpy = XOpenDisplay(NULL))) {
fprintf(stderr, "couldn't connect to X\n");
@@ -136,6 +142,8 @@
root = RootWindow(dpy, scr);
top = XCreateSimpleWindow(dpy, root, 0, 0, screen_width, screen_height, 0, WhitePixel(dpy, scr), WhitePixel(dpy, scr));
win = XCreateSimpleWindow(dpy, top, 0, 0, width, height, 0, WhitePixel(dpy, scr), WhitePixel(dpy, scr));
+ hand = XCreateFontCursor(dpy, XC_fleur);
+ XDefineCursor(dpy, win, hand);
XSelectInput(dpy, win,
KeyPressMask |
@@ -152,6 +160,7 @@
disp->dpy = dpy;
disp->cs = cs;
disp->win = win;
+ disp->hand = hand;
disp->screen_width = screen_width;
disp->screen_height = screen_height;
disp->width = width;
@@ -172,7 +181,7 @@
/** Clip coordinates of the visible part. */
static void
-move_x11(hwloc_topology_t topology, struct display *disp)
+move_x11(struct display *disp)
{
if (disp->width <= disp->screen_width) {
disp->x = 0;
@@ -194,15 +203,15 @@
}
void
-output_x11(hwloc_topology_t topology, const char *filename, int verbose_mode)
+output_x11(hwloc_topology_t topology, const char *filename __hwloc_attribute_unused, int logical, int verbose_mode __hwloc_attribute_unused)
{
- struct display *disp = output_draw_start(&x11_draw_methods, topology, NULL);
+ struct display *disp = output_draw_start(&x11_draw_methods, logical, topology, NULL);
int finish = 0;
int state = 0;
int x = 0, y = 0; /* shut warning down */
int lastx = disp->x, lasty = disp->y;
- topo_cairo_paint(&x11_draw_methods, topology, disp->cs);
+ topo_cairo_paint(&x11_draw_methods, logical, topology, disp->cs);
while (!finish) {
XEvent e;
@@ -218,7 +227,7 @@
switch (e.type) {
case Expose:
if (e.xexpose.count < 1)
- topo_cairo_paint(&x11_draw_methods, topology, disp->cs);
+ topo_cairo_paint(&x11_draw_methods, logical, topology, disp->cs);
break;
case MotionNotify:
if (state) {
@@ -226,13 +235,13 @@
disp->y -= e.xmotion.y_root - y;
x = e.xmotion.x_root;
y = e.xmotion.y_root;
- move_x11(topology, disp);
+ move_x11(disp);
}
break;
case ConfigureNotify:
disp->screen_width = e.xconfigure.width;
disp->screen_height = e.xconfigure.height;
- move_x11(topology, disp);
+ move_x11(disp);
if (disp->x != lastx || disp->y != lasty)
XMoveWindow(disp->dpy, disp->win, -disp->x, -disp->y);
break;
@@ -253,13 +262,63 @@
case KeyPress: {
KeySym keysym;
XLookupString(&e.xkey, NULL, 0, &keysym, NULL);
- if (keysym == XK_q || keysym == XK_Q)
- finish = 1;
+ switch (keysym) {
+ case XK_q:
+ case XK_Q:
+ case XK_Escape:
+ finish = 1;
+ break;
+ case XK_Left:
+ disp->x -= disp->screen_width/10;
+ move_x11(disp);
+ break;
+ case XK_Right:
+ disp->x += disp->screen_width/10;
+ move_x11(disp);
+ break;
+ case XK_Up:
+ disp->y -= disp->screen_height/10;
+ move_x11(disp);
+ break;
+ case XK_Down:
+ disp->y += disp->screen_height/10;
+ move_x11(disp);
+ break;
+ case XK_Page_Up:
+ if (e.xkey.state & ControlMask) {
+ disp->x -= disp->screen_width;
+ move_x11(disp);
+ } else {
+ disp->y -= disp->screen_height;
+ move_x11(disp);
+ }
+ break;
+ case XK_Page_Down:
+ if (e.xkey.state & ControlMask) {
+ disp->x += disp->screen_width;
+ move_x11(disp);
+ } else {
+ disp->y += disp->screen_height;
+ move_x11(disp);
+ }
+ break;
+ case XK_Home:
+ disp->x = 0;
+ disp->y = 0;
+ move_x11(disp);
+ break;
+ case XK_End:
+ disp->x = INT_MAX;
+ disp->y = INT_MAX;
+ move_x11(disp);
+ break;
+ }
break;
}
}
}
cairo_surface_destroy(disp->cs);
+ XFreeCursor(disp->dpy, disp->hand);
XCloseDisplay(disp->dpy);
free(disp);
}
@@ -269,7 +328,7 @@
#if CAIRO_HAS_PNG_FUNCTIONS
/* PNG back-end */
static void *
-png_start(void *output, int width, int height)
+png_start(void *output __hwloc_attribute_unused, int width, int height)
{
return cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
}
@@ -283,17 +342,19 @@
};
void
-output_png(hwloc_topology_t topology, const char *filename, int verbose_mode)
+output_png(hwloc_topology_t topology, const char *filename, int logical, int verbose_mode __hwloc_attribute_unused)
{
FILE *output = open_file(filename, "w");
+ cairo_surface_t *cs;
+
if (!output) {
fprintf(stderr, "Failed to open %s for writing (%s)\n", filename, strerror(errno));
return;
}
- cairo_surface_t *cs = output_draw_start(&png_draw_methods, topology, output);
+ cs = output_draw_start(&png_draw_methods, logical, topology, output);
- topo_cairo_paint(&png_draw_methods, topology, cs);
+ topo_cairo_paint(&png_draw_methods, logical, topology, cs);
cairo_surface_write_to_png_stream(cs, topo_cairo_write, output);
cairo_surface_destroy(cs);
fclose(output);
@@ -318,17 +379,19 @@
};
void
-output_pdf(hwloc_topology_t topology, const char *filename, int verbose_mode)
+output_pdf(hwloc_topology_t topology, const char *filename, int logical, int verbose_mode __hwloc_attribute_unused)
{
FILE *output = open_file(filename, "w");
+ cairo_surface_t *cs;
+
if (!output) {
fprintf(stderr, "Failed to open %s for writing (%s)\n", filename, strerror(errno));
return;
}
- cairo_surface_t *cs = output_draw_start(&pdf_draw_methods, topology, output);
+ cs = output_draw_start(&pdf_draw_methods, logical, topology, output);
- topo_cairo_paint(&pdf_draw_methods, topology, cs);
+ topo_cairo_paint(&pdf_draw_methods, logical, topology, cs);
cairo_surface_flush(cs);
cairo_surface_destroy(cs);
fclose(output);
@@ -353,17 +416,19 @@
};
void
-output_ps(hwloc_topology_t topology, const char *filename, int verbose_mode)
+output_ps(hwloc_topology_t topology, const char *filename, int logical, int verbose_mode __hwloc_attribute_unused)
{
FILE *output = open_file(filename, "w");
+ cairo_surface_t *cs;
+
if (!output) {
fprintf(stderr, "Failed to open %s for writing (%s)\n", filename, strerror(errno));
return;
}
- cairo_surface_t *cs = output_draw_start(&ps_draw_methods, topology, output);
+ cs = output_draw_start(&ps_draw_methods, logical, topology, output);
- topo_cairo_paint(&ps_draw_methods, topology, cs);
+ topo_cairo_paint(&ps_draw_methods, logical, topology, cs);
cairo_surface_flush(cs);
cairo_surface_destroy(cs);
fclose(output);
@@ -388,17 +453,19 @@
};
void
-output_svg(hwloc_topology_t topology, const char *filename, int verbose_mode)
+output_svg(hwloc_topology_t topology, const char *filename, int logical, int verbose_mode __hwloc_attribute_unused)
{
FILE *output = open_file(filename, "w");
+ cairo_surface_t *cs;
+
if (!output) {
fprintf(stderr, "Failed to open %s for writing (%s)\n", filename, strerror(errno));
return;
}
- cairo_surface_t *cs = output_draw_start(&svg_draw_methods, topology, output);
+ cs = output_draw_start(&svg_draw_methods, logical, topology, output);
- topo_cairo_paint(&svg_draw_methods, topology, cs);
+ topo_cairo_paint(&svg_draw_methods, logical, topology, cs);
cairo_surface_flush(cs);
cairo_surface_destroy(cs);
fclose(output);
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-draw.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-draw.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-draw.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -4,6 +4,8 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
+#include <private/private.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -33,6 +35,18 @@
#define THREAD_G_COLOR 0xff
#define THREAD_B_COLOR 0xff
+#define RUNNING_R_COLOR 0
+#define RUNNING_G_COLOR 0xff
+#define RUNNING_B_COLOR 0
+
+#define FORBIDDEN_R_COLOR 0xff
+#define FORBIDDEN_G_COLOR 0
+#define FORBIDDEN_B_COLOR 0
+
+#define OFFLINE_R_COLOR 0
+#define OFFLINE_G_COLOR 0
+#define OFFLINE_B_COLOR 0
+
#define CACHE_R_COLOR 0xff
#define CACHE_G_COLOR 0xff
#define CACHE_B_COLOR 0xff
@@ -67,11 +81,11 @@
return _ratio1 < _ratio2;
}
-static void* null_start(void *output, int width, int height) { return output; }
-static void null_declare_color(void *output, int r, int g, int b) { }
-static void null_box(void *output, int r, int g, int b, unsigned depth, unsigned x, unsigned width, unsigned y, unsigned height) { }
-static void null_line(void *output, int r, int g, int b, unsigned depth, unsigned x1, unsigned y1, unsigned x2, unsigned y2) { }
-static void null_text(void *output, int r, int g, int b, int size, unsigned depth, unsigned x, unsigned y, const char *text) { }
+static void* null_start(void *output, int width __hwloc_attribute_unused, int height __hwloc_attribute_unused) { return output; }
+static void null_declare_color(void *output __hwloc_attribute_unused, int r __hwloc_attribute_unused, int g __hwloc_attribute_unused, int b __hwloc_attribute_unused) { }
+static void null_box(void *output __hwloc_attribute_unused, int r __hwloc_attribute_unused, int g __hwloc_attribute_unused, int b __hwloc_attribute_unused, unsigned depth __hwloc_attribute_unused, unsigned x __hwloc_attribute_unused, unsigned width __hwloc_attribute_unused, unsigned y __hwloc_attribute_unused, unsigned height __hwloc_attribute_unused) { }
+static void null_line(void *output __hwloc_attribute_unused, int r __hwloc_attribute_unused, int g __hwloc_attribute_unused, int b __hwloc_attribute_unused, unsigned depth __hwloc_attribute_unused, unsigned x1 __hwloc_attribute_unused, unsigned y1_arg __hwloc_attribute_unused, unsigned x2 __hwloc_attribute_unused, unsigned y2 __hwloc_attribute_unused) { }
+static void null_text(void *output __hwloc_attribute_unused, int r __hwloc_attribute_unused, int g __hwloc_attribute_unused, int b __hwloc_attribute_unused, int size __hwloc_attribute_unused, unsigned depth __hwloc_attribute_unused, unsigned x __hwloc_attribute_unused, unsigned y __hwloc_attribute_unused, const char *text __hwloc_attribute_unused) { }
static struct draw_methods null_draw_methods = {
.start = null_start,
@@ -92,7 +106,7 @@
* For generic detailed comments, see the node_draw function.
*/
-typedef void (*foo_draw)(hwloc_topology_t topology, struct draw_methods *methods, hwloc_obj_t obj, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight);
+typedef void (*foo_draw)(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t obj, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight);
static foo_draw get_type_fun(hwloc_obj_type_t type);
@@ -106,12 +120,12 @@
hwloc_obj_t *subobjs = obj->children; \
unsigned numsubobjs = obj->arity; \
unsigned width, height; \
- unsigned maxwidth, maxheight; \
+ unsigned maxwidth __hwloc_attribute_unused, maxheight __hwloc_attribute_unused; \
maxwidth = maxheight = 0; \
totwidth = (border) + mywidth; \
totheight = (border) + myheight; \
if (numsubobjs) { \
- int i; \
+ unsigned i; \
#define RECURSE_FOR() \
/* Iterate over subobjects */ \
@@ -119,7 +133,7 @@
/* Recursive call */
#define RECURSE_CALL_FUN(methods) \
- get_type_fun(subobjs[i]->type)(topology, methods, subobjs[i], output, depth-1, x + totwidth, &width, y + totheight, &height) \
+ get_type_fun(subobjs[i]->type)(topology, methods, logical, subobjs[i], output, depth-1, x + totwidth, &width, y + totheight, &height) \
#define RECURSE_END_HORIZ(separator, border) \
/* Add the subobject's width and separator */ \
@@ -262,7 +276,7 @@
#define RECURSE_RECT(obj, methods, separator, border) do {\
if (obj->arity && obj->children[0]->type == HWLOC_OBJ_NODE) { \
/* Nodes shouldn't be put with an arbitrary geometry, as NUMA distances may not be that way */ \
- int pvert = prefer_vert(topology, level, output, depth, x, y, separator); \
+ int pvert = prefer_vert(topology, logical, level, output, depth, x, y, separator); \
if (pvert) \
RECURSE_VERT(level, methods, separator, border); \
else \
@@ -303,7 +317,7 @@
} while (0)
static int
-prefer_vert(hwloc_topology_t topology, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned y, int separator)
+prefer_vert(hwloc_topology_t topology, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned y, unsigned separator)
{
float horiz_ratio, vert_ratio;
unsigned textwidth = 0;
@@ -316,50 +330,97 @@
return force_vert || (!force_horiz && prefer_ratio(vert_ratio, horiz_ratio));
}
+static int
+lstopo_obj_snprintf(char *text, size_t textlen, hwloc_obj_t obj, int logical)
+{
+ unsigned idx = logical ? obj->logical_index : obj->os_index;
+ const char *indexprefix = logical ? " #" : " p#";
+ char typestr[32];
+ char indexstr[32]= "";
+ char attrstr[256];
+ size_t attrlen;
+ hwloc_obj_type_snprintf(typestr, sizeof(typestr), obj, 0);
+ if (idx != (unsigned)-1 && obj->depth != 0)
+ snprintf(indexstr, sizeof(indexstr), "%s%u", indexprefix, idx);
+ attrlen = hwloc_obj_attr_snprintf(attrstr, sizeof(attrstr), obj, " ", 0);
+ if (attrlen)
+ return snprintf(text, textlen, "%s%s (%s)", typestr, indexstr, attrstr);
+ else
+ return snprintf(text, textlen, "%s%s", typestr, indexstr);
+}
+
static void
-proc_draw(hwloc_topology_t topology, struct draw_methods *methods, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
+pu_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
{
- *retwidth = fontsize ? 4*fontsize : gridsize;
- *retheight = gridsize + (fontsize ? (fontsize + gridsize) : 0);
+ unsigned myheight = (fontsize ? (fontsize + gridsize) : 0), totheight;
+ unsigned textwidth = fontsize ? (6-logical)*fontsize : gridsize;
+ unsigned mywidth = 0, totwidth;
- methods->box(output, THREAD_R_COLOR, THREAD_G_COLOR, THREAD_B_COLOR, depth, x, *retwidth, y, *retheight);
+ DYNA_CHECK();
+ RECURSE_HORIZ(level, &null_draw_methods, 0, gridsize);
+
+ if (hwloc_cpuset_isset(level->online_cpuset, level->os_index))
+ if (!hwloc_cpuset_isset(level->allowed_cpuset, level->os_index))
+ methods->box(output, FORBIDDEN_R_COLOR, FORBIDDEN_G_COLOR, FORBIDDEN_B_COLOR, depth, x, *retwidth, y, *retheight);
+ else {
+ hwloc_cpuset_t bind = hwloc_cpuset_alloc();
+ if (pid != (hwloc_pid_t) -1 && pid != 0)
+ hwloc_get_proc_cpubind(topology, pid, bind, 0);
+ else if (pid == 0)
+ hwloc_get_cpubind(topology, bind, 0);
+ if (bind && hwloc_cpuset_isset(bind, level->os_index))
+ methods->box(output, RUNNING_R_COLOR, RUNNING_G_COLOR, RUNNING_B_COLOR, depth, x, *retwidth, y, *retheight);
+ else
+ methods->box(output, THREAD_R_COLOR, THREAD_G_COLOR, THREAD_B_COLOR, depth, x, *retwidth, y, *retheight);
+ hwloc_cpuset_free(bind);
+ }
+ else
+ methods->box(output, OFFLINE_R_COLOR, OFFLINE_G_COLOR, OFFLINE_B_COLOR, depth, x, *retwidth, y, *retheight);
+
if (fontsize) {
char text[64];
- hwloc_obj_snprintf(text, sizeof(text), topology, level, "#", 0);
- methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text);
+ lstopo_obj_snprintf(text, sizeof(text), level, logical);
+ if (hwloc_cpuset_isset(level->online_cpuset, level->os_index))
+ methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text);
+ else
+ methods->text(output, 0xff, 0xff, 0xff, fontsize, depth-1, x + gridsize, y + gridsize, text);
}
+
+ RECURSE_HORIZ(level, methods, 0, gridsize);
+
+ DYNA_SAVE();
}
static void
-cache_draw(hwloc_topology_t topology, struct draw_methods *methods, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
+cache_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
{
unsigned myheight = gridsize + (fontsize ? (fontsize + gridsize) : 0) + gridsize, totheight;
unsigned mywidth = 0, totwidth;
- unsigned textwidth = fontsize ? (level->os_index == -1 ? 7*fontsize : 9*fontsize) : 0;
+ unsigned textwidth = fontsize ? ((logical ? level->logical_index : level->os_index) == (unsigned) -1 ? 7*fontsize : 9*fontsize) : 0;
+ /* Do not separate objects when in L1 (SMT) */
unsigned separator = level->attr->cache.depth > 1 ? gridsize : 0;
DYNA_CHECK();
- /* Do not separate objects when in L1 (SMT) */
- RECURSE_HORIZ(level, &null_draw_methods, separator, 0);
+ RECURSE_RECT(level, &null_draw_methods, separator, 0);
methods->box(output, CACHE_R_COLOR, CACHE_G_COLOR, CACHE_B_COLOR, depth, x, totwidth, y, myheight - gridsize);
if (fontsize) {
char text[64];
- hwloc_obj_snprintf(text, sizeof(text), topology, level, "#", 0);
+ lstopo_obj_snprintf(text, sizeof(text), level, logical);
methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text);
}
- RECURSE_HORIZ(level, methods, separator, 0);
+ RECURSE_RECT(level, methods, separator, 0);
DYNA_SAVE();
}
static void
-core_draw(hwloc_topology_t topology, struct draw_methods *methods, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
+core_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
{
unsigned myheight = (fontsize ? (fontsize + gridsize) : 0), totheight;
unsigned mywidth = 0, totwidth;
@@ -367,23 +428,23 @@
DYNA_CHECK();
- RECURSE_HORIZ(level, &null_draw_methods, 0, gridsize);
+ RECURSE_RECT(level, &null_draw_methods, 0, gridsize);
methods->box(output, CORE_R_COLOR, CORE_G_COLOR, CORE_B_COLOR, depth, x, totwidth, y, totheight);
if (fontsize) {
char text[64];
- hwloc_obj_snprintf(text, sizeof(text), topology, level, "#", 0);
+ lstopo_obj_snprintf(text, sizeof(text), level, logical);
methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text);
}
- RECURSE_HORIZ(level, methods, 0, gridsize);
+ RECURSE_RECT(level, methods, 0, gridsize);
DYNA_SAVE();
}
static void
-socket_draw(hwloc_topology_t topology, struct draw_methods *methods, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
+socket_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
{
unsigned myheight = (fontsize ? (fontsize + gridsize) : 0), totheight;
unsigned mywidth = 0, totwidth;
@@ -397,7 +458,7 @@
if (fontsize) {
char text[64];
- hwloc_obj_snprintf(text, sizeof(text), topology, level, "#", 0);
+ lstopo_obj_snprintf(text, sizeof(text), level, logical);
methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text);
}
@@ -407,7 +468,7 @@
}
static void
-node_draw(hwloc_topology_t topology, struct draw_methods *methods, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
+node_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
{
/* Reserve room for the heading memory box and separator */
unsigned myheight = (fontsize ? (gridsize + fontsize) : 0) + gridsize + gridsize;
@@ -424,7 +485,7 @@
DYNA_CHECK();
/* Compute the size needed by sublevels */
- RECURSE_HORIZ(level, &null_draw_methods, gridsize, gridsize);
+ RECURSE_RECT(level, &null_draw_methods, gridsize, gridsize);
/* Draw the epoxy box */
methods->box(output, NODE_R_COLOR, NODE_G_COLOR, NODE_B_COLOR, depth, x, totwidth, y, totheight);
@@ -434,19 +495,19 @@
if (fontsize) {
char text[64];
/* Output text */
- hwloc_obj_snprintf(text, sizeof(text), topology, level, "#", 0);
+ lstopo_obj_snprintf(text, sizeof(text), level, logical);
methods->text(output, 0, 0, 0, fontsize, depth-2, x + 2 * gridsize, y + 2 * gridsize, text);
}
/* Restart, now really drawing sublevels */
- RECURSE_HORIZ(level, methods, gridsize, gridsize);
+ RECURSE_RECT(level, methods, gridsize, gridsize);
/* Save result for dynamic programming */
DYNA_SAVE();
}
static void
-machine_draw(hwloc_topology_t topology, struct draw_methods *methods, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
+machine_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
{
unsigned myheight = (fontsize ? (fontsize + gridsize) : 0), totheight;
unsigned mywidth = 0, totwidth;
@@ -460,7 +521,7 @@
if (fontsize) {
char text[64];
- hwloc_obj_snprintf(text, sizeof(text), topology, level, "#", 0);
+ lstopo_obj_snprintf(text, sizeof(text), level, logical);
methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text);
}
@@ -470,12 +531,12 @@
}
static void
-system_draw(hwloc_topology_t topology, struct draw_methods *methods, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
+system_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
{
unsigned myheight = (fontsize ? (fontsize + gridsize) : 0), totheight;
unsigned mywidth = 0, totwidth;
unsigned textwidth = 10*fontsize;
- int vert = prefer_vert(topology, level, output, depth, x, y, gridsize);
+ int vert = prefer_vert(topology, logical, level, output, depth, x, y, gridsize);
DYNA_CHECK();
@@ -493,7 +554,7 @@
if (fontsize) {
char text[64];
- hwloc_obj_snprintf(text, sizeof(text), topology, level, "#", 0);
+ lstopo_obj_snprintf(text, sizeof(text), level, logical);
methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text);
}
@@ -536,11 +597,11 @@
}
static void
-misc_draw(hwloc_topology_t topology, struct draw_methods *methods, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
+group_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
{
unsigned myheight = (fontsize ? (fontsize + gridsize) : 0), totheight;
unsigned mywidth = 0, totwidth;
- unsigned textwidth = 6*fontsize;
+ unsigned textwidth = level->name ? strlen(level->name) * fontsize : 6*fontsize;
DYNA_CHECK();
@@ -549,9 +610,13 @@
methods->box(output, MISC_R_COLOR, MISC_G_COLOR, MISC_B_COLOR, depth, x, totwidth, y, totheight);
if (fontsize) {
- char text[64];
- hwloc_obj_snprintf(text, sizeof(text), topology, level, "#", 0);
- methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text);
+ if (level->name) {
+ methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, level->name);
+ } else {
+ char text[64];
+ lstopo_obj_snprintf(text, sizeof(text), level, logical);
+ methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text);
+ }
}
RECURSE_RECT(level, methods, gridsize, gridsize);
@@ -560,11 +625,40 @@
}
static void
-fig(hwloc_topology_t topology, struct draw_methods *methods, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned y)
+misc_draw(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight)
{
+ unsigned boxheight = gridsize + (fontsize ? (fontsize + gridsize) : 0);
+ unsigned myheight = boxheight + (level->arity?gridsize:0), totheight;
+ unsigned mywidth = 0, totwidth;
+ unsigned textwidth = level->name ? strlen(level->name) * fontsize : 6*fontsize;
+
+ DYNA_CHECK();
+
+ RECURSE_HORIZ(level, &null_draw_methods, gridsize, 0);
+
+ methods->box(output, MISC_R_COLOR, MISC_G_COLOR, MISC_B_COLOR, depth, x, totwidth, y, boxheight);
+
+ if (fontsize) {
+ if (level->name) {
+ methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, level->name);
+ } else {
+ char text[64];
+ lstopo_obj_snprintf(text, sizeof(text), level, logical);
+ methods->text(output, 0, 0, 0, fontsize, depth-1, x + gridsize, y + gridsize, text);
+ }
+ }
+
+ RECURSE_HORIZ(level, methods, gridsize, 0);
+
+ DYNA_SAVE();
+}
+
+static void
+fig(hwloc_topology_t topology, struct draw_methods *methods, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned y)
+{
unsigned totwidth, totheight;
- system_draw(topology, methods, level, output, depth, x, &totwidth, y, &totheight);
+ system_draw(topology, methods, logical, level, output, depth, x, &totwidth, y, &totheight);
}
/*
@@ -580,7 +674,8 @@
case HWLOC_OBJ_SOCKET: return socket_draw;
case HWLOC_OBJ_CACHE: return cache_draw;
case HWLOC_OBJ_CORE: return core_draw;
- case HWLOC_OBJ_PROC: return proc_draw;
+ case HWLOC_OBJ_PU: return pu_draw;
+ case HWLOC_OBJ_GROUP: return group_draw;
case HWLOC_OBJ_MISC: return misc_draw;
}
return NULL;
@@ -591,30 +686,38 @@
*/
struct coords {
- int x;
- int y;
+ unsigned x;
+ unsigned y;
};
static void
-getmax_box(void *output, int r, int g, int b, unsigned depth, unsigned x, unsigned width, unsigned y, unsigned height)
+getmax_box(void *output, int r __hwloc_attribute_unused, int g __hwloc_attribute_unused, int b __hwloc_attribute_unused, unsigned depth __hwloc_attribute_unused, unsigned x, unsigned width, unsigned y, unsigned height)
{
struct coords *coords = output;
+ if (x > coords->x)
+ coords->x = x;
if (x + width > coords->x)
coords->x = x + width;
+ if (y > coords->y)
+ coords->y = y;
if (y + height > coords->y)
coords->y = y + height;
}
static void
-getmax_line(void *output, int r, int g, int b, unsigned depth, unsigned x1, unsigned y1, unsigned x2, unsigned y2)
+getmax_line(void *output, int r __hwloc_attribute_unused, int g __hwloc_attribute_unused, int b __hwloc_attribute_unused, unsigned depth __hwloc_attribute_unused, unsigned x1_arg, unsigned y1_arg, unsigned x2_arg, unsigned y2_arg)
{
struct coords *coords = output;
- if (x2 > coords->x)
- coords->x = x2;
- if (y2 > coords->y)
- coords->y = y2;
+ if (x1_arg > coords->x)
+ coords->x = x1_arg;
+ if (x2_arg > coords->x)
+ coords->x = x2_arg;
+ if (y1_arg > coords->y)
+ coords->y = y1_arg;
+ if (y2_arg > coords->y)
+ coords->y = y2_arg;
}
static struct draw_methods getmax_draw_methods = {
@@ -626,10 +729,10 @@
};
void *
-output_draw_start(struct draw_methods *methods, hwloc_topology_t topology, void *output)
+output_draw_start(struct draw_methods *methods, int logical, hwloc_topology_t topology, void *output)
{
struct coords coords = { .x = 0, .y = 0};
- fig(topology, &getmax_draw_methods, hwloc_get_system_obj(topology), &coords, 100, 0, 0);
+ fig(topology, &getmax_draw_methods, logical, hwloc_get_root_obj(topology), &coords, 100, 0, 0);
output = methods->start(output, coords.x, coords.y);
methods->declare_color(output, 0, 0, 0);
methods->declare_color(output, NODE_R_COLOR, NODE_G_COLOR, NODE_B_COLOR);
@@ -637,6 +740,9 @@
methods->declare_color(output, MEMORY_R_COLOR, MEMORY_G_COLOR, MEMORY_B_COLOR);
methods->declare_color(output, CORE_R_COLOR, CORE_G_COLOR, CORE_B_COLOR);
methods->declare_color(output, THREAD_R_COLOR, THREAD_G_COLOR, THREAD_B_COLOR);
+ methods->declare_color(output, RUNNING_R_COLOR, RUNNING_G_COLOR, RUNNING_B_COLOR);
+ methods->declare_color(output, FORBIDDEN_R_COLOR, FORBIDDEN_G_COLOR, FORBIDDEN_B_COLOR);
+ methods->declare_color(output, OFFLINE_R_COLOR, OFFLINE_G_COLOR, OFFLINE_B_COLOR);
methods->declare_color(output, CACHE_R_COLOR, CACHE_G_COLOR, CACHE_B_COLOR);
methods->declare_color(output, MACHINE_R_COLOR, MACHINE_G_COLOR, MACHINE_B_COLOR);
methods->declare_color(output, SYSTEM_R_COLOR, SYSTEM_G_COLOR, SYSTEM_B_COLOR);
@@ -645,7 +751,7 @@
}
void
-output_draw(struct draw_methods *methods, hwloc_topology_t topology, void *output)
+output_draw(struct draw_methods *methods, int logical, hwloc_topology_t topology, void *output)
{
- fig(topology, methods, hwloc_get_system_obj(topology), output, 100, 0, 0);
+ fig(topology, methods, logical, hwloc_get_root_obj(topology), output, 100, 0, 0);
}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-fig.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-fig.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-fig.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -3,6 +3,7 @@
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
#include <stdlib.h>
@@ -17,7 +18,7 @@
#define FIG_FACTOR 20
static void *
-fig_start(void *output_, int width, int height)
+fig_start(void *output_, int width __hwloc_attribute_unused, int height __hwloc_attribute_unused)
{
FILE *output = output_;
fprintf(output, "#FIG 3.2 Produced by hwloc's lstopo\n");
@@ -32,7 +33,7 @@
return output;
}
-static int
+static int __hwloc_attribute_const
rgb_to_fig(int r, int g, int b)
{
if (r == 0xff && g == 0xff && b == 0xff)
@@ -96,10 +97,12 @@
fig_text(void *output_, int r, int g, int b, int size, unsigned depth, unsigned x, unsigned y, const char *text)
{
FILE *output = output_;
+ unsigned len = strlen(text);
+ int color = rgb_to_fig(r, g, b);
x *= FIG_FACTOR;
y *= FIG_FACTOR;
size = (size * 16) / 10;
- fprintf(output, "4 0 %d %u -1 0 %d 0.0 4 %d %u %u %u %s\\001\n", rgb_to_fig(r, g, b), depth, size, size * 10, (unsigned) strlen(text) * size * 10, x, y + size * 10, text);
+ fprintf(output, "4 0 %d %u -1 0 %d 0.0 4 %d %u %u %u %s\\001\n", color, depth, size, size * 10, len * size * 10, x, y + size * 10, text);
}
static struct draw_methods fig_draw_methods = {
@@ -111,7 +114,7 @@
};
void
-output_fig (hwloc_topology_t topology, const char *filename, int verbose_mode)
+output_fig (hwloc_topology_t topology, const char *filename, int logical, int verbose_mode __hwloc_attribute_unused)
{
FILE *output = open_file(filename, "w");
if (!output) {
@@ -119,7 +122,7 @@
return;
}
- output = output_draw_start(&fig_draw_methods, topology, output);
- output_draw(&fig_draw_methods, topology, output);
+ output = output_draw_start(&fig_draw_methods, logical, topology, output);
+ output_draw(&fig_draw_methods, logical, topology, output);
fclose(output);
}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-text.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-text.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-text.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,10 +1,11 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
+#include <private/config.h>
#include <hwloc.h>
-#include <private/config.h>
#include <stdlib.h>
#include <stdio.h>
@@ -23,10 +24,10 @@
#include <wchar.h>
#endif /* HAVE_PUTWC */
-#ifdef HAVE_LIBTERMCAP
+#ifdef HWLOC_HAVE_LIBTERMCAP
#include <curses.h>
#include <term.h>
-#endif /* HAVE_LIBTERMCAP */
+#endif /* HWLOC_HAVE_LIBTERMCAP */
#include "lstopo.h"
@@ -37,15 +38,54 @@
* Console fashion text output
*/
+static void
+output_console_obj (hwloc_obj_t l, FILE *output, int logical, int verbose_mode)
+{
+ char type[32], attr[256], phys[32] = "";
+ unsigned idx = logical ? l->logical_index : l->os_index;
+ const char *indexprefix = logical ? " #" : " p#";
+ if (show_cpuset < 2) {
+ if (l->type == HWLOC_OBJ_MISC && l->name)
+ fprintf(output, "%s", l->name);
+ else {
+ hwloc_obj_type_snprintf (type, sizeof(type), l, verbose_mode-1);
+ fprintf(output, "%s", type);
+ }
+ if (l->depth != 0 && idx != (unsigned)-1)
+ fprintf(output, "%s%u", indexprefix, idx);
+ if (logical && l->os_index != (unsigned) -1 &&
+ (verbose_mode >= 2 || l->type == HWLOC_OBJ_PU || l->type == HWLOC_OBJ_NODE))
+ snprintf(phys, sizeof(phys), "phys=%u", l->os_index);
+ hwloc_obj_attr_snprintf (attr, sizeof(attr), l, " ", verbose_mode-1);
+ if (*phys || *attr) {
+ const char *separator = *phys != '\0' && *attr!= '\0' ? " " : "";
+ fprintf(output, " (%s%s%s)",
+ phys, separator, attr);
+ }
+ if (verbose_mode >= 2 && l->name && l->type != HWLOC_OBJ_MISC)
+ fprintf(output, " \"%s\"", l->name);
+ }
+ if (!l->cpuset)
+ return;
+ if (show_cpuset == 1)
+ fprintf(output, " cpuset=");
+ if (show_cpuset) {
+ char *cpusetstr;
+ hwloc_cpuset_asprintf(&cpusetstr, l->cpuset);
+ fprintf(output, "%s", cpusetstr);
+ free(cpusetstr);
+ }
+}
+
/* Recursively output topology in a console fashion */
static void
-output_topology (hwloc_topology_t topology, hwloc_obj_t l, hwloc_obj_t parent, FILE *output, int i, int verbose_mode) {
- int x;
- const char * indexprefix = "#";
- char line[256];
-
- if (verbose_mode <= 1
- && parent && parent->arity == 1 && hwloc_cpuset_isequal(l->cpuset, parent->cpuset)) {
+output_topology (hwloc_topology_t topology, hwloc_obj_t l, hwloc_obj_t parent, FILE *output, int i, int logical, int verbose_mode)
+{
+ unsigned x;
+ int group_identical = (verbose_mode <= 1) && !show_cpuset;
+ if (group_identical
+ && parent && parent->arity == 1
+ && l->cpuset && parent->cpuset && hwloc_cpuset_isequal(l->cpuset, parent->cpuset)) {
/* in non-verbose mode, merge objects with their parent is they are exactly identical */
fprintf(output, " + ");
} else {
@@ -54,17 +94,29 @@
indent (output, 2*i);
i++;
}
- hwloc_obj_snprintf (line, sizeof(line), topology, l, indexprefix, verbose_mode-1);
- fprintf(output, "%s", line);
+ output_console_obj(l, output, logical, verbose_mode);
if (l->arity || (!i && !l->arity))
{
for (x=0; x<l->arity; x++)
- output_topology (topology, l->children[x], l, output, i, verbose_mode);
+ output_topology (topology, l->children[x], l, output, i, logical, verbose_mode);
}
}
-void output_console(hwloc_topology_t topology, const char *filename, int verbose_mode)
+/* Recursive so that multiple depth types are properly shown */
+static void
+output_only (hwloc_topology_t topology, hwloc_obj_t l, FILE *output, int logical, int verbose_mode)
{
+ unsigned x;
+ if (show_only == l->type) {
+ output_console_obj (l, output, logical, verbose_mode);
+ fprintf (output, "\n");
+ }
+ for (x=0; x<l->arity; x++)
+ output_only (topology, l->children[x], output, logical, verbose_mode);
+}
+
+void output_console(hwloc_topology_t topology, const char *filename, int logical, int verbose_mode)
+{
unsigned topodepth;
FILE *output;
@@ -86,8 +138,12 @@
* if verbose_mode > 1, print both.
*/
- if (verbose_mode >= 1) {
- output_topology (topology, hwloc_get_system_obj(topology), NULL, output, 0, verbose_mode);
+ if (show_only != (hwloc_obj_type_t)-1) {
+ if (verbose_mode > 1)
+ fprintf(output, "Only showing %s objects\n", hwloc_obj_type_string(show_only));
+ output_only (topology, hwloc_get_root_obj(topology), output, logical, verbose_mode);
+ } else if (verbose_mode >= 1) {
+ output_topology (topology, hwloc_get_root_obj(topology), NULL, output, 0, logical, verbose_mode);
fprintf(output, "\n");
}
@@ -102,9 +158,57 @@
}
}
- if (verbose_mode > 1)
+ if (verbose_mode > 1) {
+ hwloc_const_cpuset_t complete = hwloc_topology_get_complete_cpuset(topology);
+ hwloc_const_cpuset_t topo = hwloc_topology_get_topology_cpuset(topology);
+ hwloc_const_cpuset_t online = hwloc_topology_get_online_cpuset(topology);
+ hwloc_const_cpuset_t allowed = hwloc_topology_get_allowed_cpuset(topology);
+
+ if (!hwloc_cpuset_isequal(topo, complete)) {
+ hwloc_cpuset_t unknown = hwloc_cpuset_alloc();
+ char *unknownstr;
+ hwloc_cpuset_copy(unknown, complete);
+ hwloc_cpuset_andnot(unknown, unknown, topo);
+ hwloc_cpuset_asprintf(&unknownstr, unknown);
+ fprintf (output, "%d processors not represented in topology: %s\n", hwloc_cpuset_weight(unknown), unknownstr);
+ free(unknownstr);
+ hwloc_cpuset_free(unknown);
+ }
+ if (!hwloc_cpuset_isequal(online, complete)) {
+ hwloc_cpuset_t offline = hwloc_cpuset_alloc();
+ char *offlinestr;
+ hwloc_cpuset_copy(offline, complete);
+ hwloc_cpuset_andnot(offline, offline, online);
+ hwloc_cpuset_asprintf(&offlinestr, offline);
+ fprintf (output, "%d processors offline: %s\n", hwloc_cpuset_weight(offline), offlinestr);
+ free(offlinestr);
+ hwloc_cpuset_free(offline);
+ }
+ if (!hwloc_cpuset_isequal(allowed, online)) {
+ if (!hwloc_cpuset_isincluded(online, allowed)) {
+ hwloc_cpuset_t forbidden = hwloc_cpuset_alloc();
+ char *forbiddenstr;
+ hwloc_cpuset_copy(forbidden, online);
+ hwloc_cpuset_andnot(forbidden, forbidden, allowed);
+ hwloc_cpuset_asprintf(&forbiddenstr, forbidden);
+ fprintf(output, "%d processors online but not allowed: %s\n", hwloc_cpuset_weight(forbidden), forbiddenstr);
+ free(forbiddenstr);
+ hwloc_cpuset_free(forbidden);
+ }
+ if (!hwloc_cpuset_isincluded(allowed, online)) {
+ hwloc_cpuset_t potential = hwloc_cpuset_alloc();
+ char *potentialstr;
+ hwloc_cpuset_copy(potential, allowed);
+ hwloc_cpuset_andnot(potential, potential, online);
+ hwloc_cpuset_asprintf(&potentialstr, potential);
+ fprintf(output, "%d processors allowed but not online: %s\n", hwloc_cpuset_weight(potential), potentialstr);
+ free(potentialstr);
+ hwloc_cpuset_free(potential);
+ }
+ }
if (!hwloc_topology_is_thissystem(topology))
fprintf (output, "Topology not from this system\n");
+ }
fclose(output);
}
@@ -124,18 +228,19 @@
#define putcharacter(c,f) putc(c,f)
#endif /* HAVE_PUTWC */
-#ifdef HAVE_LIBTERMCAP
+#ifdef HWLOC_HAVE_LIBTERMCAP
static int myputchar(int c) {
return putcharacter(c, stdout);
}
-#endif /* HAVE_LIBTERMCAP */
+#endif /* HWLOC_HAVE_LIBTERMCAP */
/* Off-screen rendering buffer */
struct cell {
character c;
-#ifdef HAVE_LIBTERMCAP
- int r, g, b;
-#endif /* HAVE_LIBTERMCAP */
+#ifdef HWLOC_HAVE_LIBTERMCAP
+ int fr, fg, fb;
+ int br, bg, bb;
+#endif /* HWLOC_HAVE_LIBTERMCAP */
};
struct display {
@@ -147,7 +252,7 @@
/* Allocate the off-screen buffer */
static void *
-text_start(void *output, int width, int height)
+text_start(void *output __hwloc_attribute_unused, int width, int height)
{
int j, i;
struct display *disp = malloc(sizeof(*disp));
@@ -168,77 +273,77 @@
return disp;
}
-#ifdef HAVE_LIBTERMCAP
+#ifdef HWLOC_HAVE_LIBTERMCAP
/* Standard terminfo strings */
-static char *oc, *initc = NULL, *initp = NULL, *bold, *normal, *setaf, *setab, *setf, *setb, *scp;
+static char *initc = NULL, *initp = NULL;
/* Set text color to bright white or black according to the background */
static int set_textcolor(int rr, int gg, int bb)
{
if (!initc && !initp && rr + gg + bb < 2) {
- if (bold)
- tputs(bold, 1, myputchar);
+ if (enter_bold_mode)
+ tputs(enter_bold_mode, 1, myputchar);
return 7;
} else {
- if (normal)
- tputs(normal, 1, myputchar);
+ if (exit_attribute_mode)
+ tputs(exit_attribute_mode, 1, myputchar);
return 0;
}
}
static void
-set_color(int r, int g, int b)
+set_color(int fr, int fg, int fb, int br, int bg, int bb)
{
char *toput;
int color, textcolor;
if (initc || initp) {
/* Can set rgb color, easy */
- color = rgb_to_color(r, g, b) + 16;
- textcolor = 0;
+ textcolor = rgb_to_color(fr, fg, fb) + 16;
+ color = rgb_to_color(br, bg, bb) + 16;
} else {
/* Magic trigger: it seems to separate colors quite well */
- int rr = r >= 0xe0;
- int gg = g >= 0xe0;
- int bb = b >= 0xe0;
+ int brr = br >= 0xe0;
+ int bgg = bg >= 0xe0;
+ int bbb = bb >= 0xe0;
- if (setab)
+ if (set_a_background)
/* ANSI colors */
- color = (rr << 0) | (gg << 1) | (bb << 2);
+ color = (brr << 0) | (bgg << 1) | (bbb << 2);
else
/* Legacy colors */
- color = (rr << 2) | (gg << 1) | (bb << 0);
- textcolor = set_textcolor(rr, gg, bb);
+ color = (brr << 2) | (bgg << 1) | (bbb << 0);
+ textcolor = set_textcolor(brr, bgg, bbb);
}
/* And now output magic string to TTY */
- if (setaf) {
+ if (set_a_foreground) {
/* foreground */
- if ((toput = tparm(setaf, textcolor)))
+ if ((toput = tparm(set_a_foreground, textcolor, 0, 0, 0, 0, 0, 0, 0, 0)))
tputs(toput, 1, myputchar);
/* background */
- if ((toput = tparm(setab, color)))
+ if ((toput = tparm(set_a_background, color, 0, 0, 0, 0, 0, 0, 0, 0)))
tputs(toput, 1, myputchar);
- } else if (setf) {
+ } else if (set_foreground) {
/* foreground */
- if ((toput = tparm(setf, textcolor)))
+ if ((toput = tparm(set_foreground, textcolor, 0, 0, 0, 0, 0, 0, 0, 0)))
tputs(toput, 1, myputchar);
/* background */
- if ((toput = tparm(setb, color)))
+ if ((toput = tparm(set_background, color, 0, 0, 0, 0, 0, 0, 0, 0)))
tputs(toput, 1, myputchar);
- } else if (scp) {
+ } else if (set_color_pair) {
/* pair */
- if ((toput = tparm(scp, color)))
+ if ((toput = tparm(set_color_pair, color, 0, 0, 0, 0, 0, 0, 0, 0)))
tputs(toput, 1, myputchar);
}
}
-#endif /* HAVE_LIBTERMCAP */
+#endif /* HWLOC_HAVE_LIBTERMCAP */
/* We we can, allocate rgb colors */
static void
-text_declare_color(void *output, int r, int g, int b)
+text_declare_color(void *output __hwloc_attribute_unused, int r __hwloc_attribute_unused, int g __hwloc_attribute_unused, int b __hwloc_attribute_unused)
{
-#ifdef HAVE_LIBTERMCAP
+#ifdef HWLOC_HAVE_LIBTERMCAP
int color = declare_color(r, g, b);
/* Yes, values seem to range from 0 to 1000 inclusive */
int rr = (r * 1001) / 256;
@@ -247,31 +352,36 @@
char *toput;
if (initc) {
- if ((toput = tparm(initc, color + 16, rr, gg, bb)))
+ if ((toput = tparm(initc, color + 16, rr, gg, bb, 0, 0, 0, 0, 0)))
tputs(toput, 1, myputchar);
} else if (initp) {
- if ((toput = tparm(initp, color + 16, 0, 0, 0, rr, gg, bb)))
+ if ((toput = tparm(initp, color + 16, 0, 0, 0, rr, gg, bb, 0, 0)))
tputs(toput, 1, myputchar);
}
-#endif /* HAVE_LIBTERMCAP */
+#endif /* HWLOC_HAVE_LIBTERMCAP */
}
/* output text, erasing any previous content */
static void
-put(struct display *disp, int x, int y, character c, int r, int g, int b)
+put(struct display *disp, int x, int y, character c, int fr __hwloc_attribute_unused, int fg __hwloc_attribute_unused, int fb __hwloc_attribute_unused, int br __hwloc_attribute_unused, int bg __hwloc_attribute_unused, int bb __hwloc_attribute_unused)
{
if (x >= disp->width || y >= disp->height) {
/* fprintf(stderr, "%"PRIchar" overflowed to (%d,%d)\n", c, x, y); */
return;
}
disp->cells[y][x].c = c;
-#ifdef HAVE_LIBTERMCAP
- if (r != -1) {
- disp->cells[y][x].r = r;
- disp->cells[y][x].g = g;
- disp->cells[y][x].b = b;
+#ifdef HWLOC_HAVE_LIBTERMCAP
+ if (fr != -1) {
+ disp->cells[y][x].fr = fr;
+ disp->cells[y][x].fg = fg;
+ disp->cells[y][x].fb = fb;
}
-#endif /* HAVE_LIBTERMCAP */
+ if (br != -1) {
+ disp->cells[y][x].br = br;
+ disp->cells[y][x].bg = bg;
+ disp->cells[y][x].bb = bb;
+ }
+#endif /* HWLOC_HAVE_LIBTERMCAP */
}
/* Where bars of a character go to */
@@ -376,15 +486,16 @@
{
character current = disp->cells[y][x].c;
int directions = (to_directions(disp, current) & ~andnot) | or;
- put(disp, x, y, from_directions(disp, directions), r, g, b);
+ put(disp, x, y, from_directions(disp, directions), -1, -1, -1, r, g, b);
}
/* Now we can implement the standard drawing helpers */
static void
-text_box(void *output, int r, int g, int b, unsigned depth, unsigned x1, unsigned width, unsigned y1, unsigned height)
+text_box(void *output, int r, int g, int b, unsigned depth __hwloc_attribute_unused, unsigned x1, unsigned width, unsigned y1, unsigned height)
{
struct display *disp = output;
- int x2, y2, i, j;
+ unsigned i, j;
+ unsigned x2, y2;
x1 /= (gridsize/2);
width /= (gridsize/2);
y1 /= gridsize;
@@ -412,17 +523,16 @@
}
for (j = y1 + 1; j < y2; j++) {
for (i = x1 + 1; i < x2; i++) {
- put(disp, i, j, ' ', r, g, b);
+ put(disp, i, j, ' ', -1, -1, -1, r, g, b);
}
}
}
static void
-text_line(void *output, int r, int g, int b, unsigned depth, unsigned x1, unsigned y1, unsigned x2, unsigned y2)
+text_line(void *output, int r __hwloc_attribute_unused, int g __hwloc_attribute_unused, int b __hwloc_attribute_unused, unsigned depth __hwloc_attribute_unused, unsigned x1, unsigned y1, unsigned x2, unsigned y2)
{
struct display *disp = output;
- int i, j;
- int z;
+ unsigned i, j, z;
x1 /= (gridsize/2);
y1 /= gridsize;
x2 /= (gridsize/2);
@@ -469,13 +579,13 @@
}
static void
-text_text(void *output, int r, int g, int b, int size, unsigned depth, unsigned x, unsigned y, const char *text)
+text_text(void *output, int r, int g, int b, int size __hwloc_attribute_unused, unsigned depth __hwloc_attribute_unused, unsigned x, unsigned y, const char *text)
{
struct display *disp = output;
x /= (gridsize/2);
y /= gridsize;
for ( ; *text; text++)
- put(disp, x++, y, *text, -1, -1, -1);
+ put(disp, x++, y, *text, r, g, b, -1, -1, -1);
}
static struct draw_methods text_draw_methods = {
@@ -486,14 +596,16 @@
.text = text_text,
};
-void output_text(hwloc_topology_t topology, const char *filename, int verbose_mode)
+void output_text(hwloc_topology_t topology, const char *filename, int logical, int verbose_mode __hwloc_attribute_unused)
{
FILE *output;
struct display *disp;
int i, j;
- int lr, lg, lb;
-#ifdef HAVE_LIBTERMCAP
+ int lfr, lfg, lfb; /* Last foreground color */
+ int lbr, lbg, lbb; /* Last background color */
+#ifdef HWLOC_HAVE_LIBTERMCAP
int term = 0;
+ char *tmp;
#endif
if (!filename || !strcmp(filename, "-"))
@@ -511,76 +623,78 @@
setlocale(LC_ALL, "");
#endif /* HAVE_SETLOCALE */
-#ifdef HAVE_LIBTERMCAP
+#ifdef HWLOC_HAVE_LIBTERMCAP
/* If we are outputing to a tty, use colors */
if (output == stdout && isatty(STDOUT_FILENO)) {
term = !setupterm(NULL, STDOUT_FILENO, NULL);
if (term) {
- int colors, pairs;
-
/* reset colors */
- if ((oc = tgetstr("oc", NULL)))
- tputs(oc, 1, myputchar);
+ if (orig_colors)
+ tputs(orig_colors, 1, myputchar);
/* Get terminfo(5) strings */
- pairs = tgetnum("pa");
- initp = tgetstr("Ip", NULL);
- scp = tgetstr("sp", NULL);
- if (pairs <= 16 || !initp || !scp) {
- /* Can't use pairs to define our own colors */
+ initp = initialize_pair;
+ if (max_pairs <= 16 || !initp || !set_color_pair) {
+ /* Can't use max_pairs to define our own colors */
initp = NULL;
- colors = tgetnum("Co");
- if (colors > 16) {
- if (tgetflag("cc"))
- initc = tgetstr("Ic", NULL);
- }
- setaf = tgetstr("AF", NULL);
- setab = tgetstr("AB", NULL);
- setf = tgetstr("Sf", NULL);
- setb = tgetstr("Sb", NULL);
+ if (max_colors > 16)
+ if (can_change)
+ initc = initialize_color;
}
- if (tgetflag("lhs"))
+ /* Prevent a trivial compiler warning because the param of
+ tgetflag is (char*), not (const char*). */
+ tmp = strdup("lhs");
+ if (tgetflag(tmp)) {
/* Sorry, I'm lazy to convert colors and I don't know any terminal
* using LHS anyway */
initc = initp = 0;
- bold = tgetstr("md", NULL);
- normal = tgetstr("me", NULL);
+ }
+ free(tmp);
}
}
-#endif /* HAVE_LIBTERMCAP */
+#endif /* HWLOC_HAVE_LIBTERMCAP */
- disp = output_draw_start(&text_draw_methods, topology, output);
- output_draw(&text_draw_methods, topology, disp);
+ disp = output_draw_start(&text_draw_methods, logical, topology, output);
+ output_draw(&text_draw_methods, logical, topology, disp);
- lr = lg = lb = -1;
+ lfr = lfg = lfb = -1;
+ lbr = lbg = lbb = -1;
for (j = 0; j < disp->height; j++) {
for (i = 0; i < disp->width; i++) {
-#ifdef HAVE_LIBTERMCAP
+#ifdef HWLOC_HAVE_LIBTERMCAP
if (term) {
/* TTY output, use colors */
- int r = disp->cells[j][i].r;
- int g = disp->cells[j][i].g;
- int b = disp->cells[j][i].b;
+ int fr = disp->cells[j][i].fr;
+ int fg = disp->cells[j][i].fg;
+ int fb = disp->cells[j][i].fb;
+ int br = disp->cells[j][i].br;
+ int bg = disp->cells[j][i].bg;
+ int bb = disp->cells[j][i].bb;
/* Avoid too much work for the TTY */
- if (r != lr || g != lg || b != lb) {
- set_color(r, g, b);
- lr = r;
- lg = g;
- lb = b;
+ if (fr != lfr || fg != lfg || fb != lfb
+ || br != lbr || bg != lbg || bb != lbb) {
+ set_color(fr, fg, fb, br, bg, bb);
+ lfr = fr;
+ lfg = fg;
+ lfb = fb;
+ lbr = br;
+ lbg = bg;
+ lbb = bb;
}
}
-#endif /* HAVE_LIBTERMCAP */
+#endif /* HWLOC_HAVE_LIBTERMCAP */
putcharacter(disp->cells[j][i].c, output);
}
-#ifdef HAVE_LIBTERMCAP
- /* Keep the rest of the line black */
- if (term) {
- lr = lg = lb = 0;
- set_color(lr, lg, lb);
+#ifdef HWLOC_HAVE_LIBTERMCAP
+ /* Keep the rest of the line as default */
+ if (term && orig_pair) {
+ lfr = lfg = lfb = -1;
+ lbr = lbg = lbb = -1;
+ tputs(orig_pair, 1, myputchar);
}
-#endif /* HAVE_LIBTERMCAP */
+#endif /* HWLOC_HAVE_LIBTERMCAP */
putcharacter('\n', output);
}
}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-windows.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-windows.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-windows.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -11,6 +11,7 @@
#include <string.h>
#include <windows.h>
+#include <windowsx.h>
#include "lstopo.h"
@@ -38,53 +39,170 @@
struct draw_methods windows_draw_methods;
-hwloc_topology_t the_topology;
+static hwloc_topology_t the_topology;
+static int the_logical;
+static int state, control;
+static int x, y, x_delta, y_delta;
+static int finish;
+static int the_width, the_height;
+static int win_width, win_height;
static LRESULT CALLBACK
WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
+ int redraw = 0;
switch (message) {
case WM_PAINT: {
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hwnd, &ps);
- output_draw(&windows_draw_methods, the_topology, &ps);
+ output_draw(&windows_draw_methods, the_logical, the_topology, &ps);
EndPaint(hwnd, &ps);
break;
}
+ case WM_LBUTTONDOWN:
+ state = 1;
+ x = GET_X_LPARAM(lparam);
+ y = GET_Y_LPARAM(lparam);
+ break;
+ case WM_LBUTTONUP:
+ state = 0;
+ break;
+ case WM_MOUSEMOVE:
+ if (!(wparam & MK_LBUTTON))
+ state = 0;
+ if (state) {
+ int new_x = GET_X_LPARAM(lparam);
+ int new_y = GET_Y_LPARAM(lparam);
+ x_delta -= new_x - x;
+ y_delta -= new_y - y;
+ x = new_x;
+ y = new_y;
+ redraw = 1;
+ }
+ break;
+ case WM_KEYDOWN:
+ switch (wparam) {
+ case 'q':
+ case 'Q':
+ case VK_ESCAPE:
+ finish = 1;
+ break;
+ case VK_LEFT:
+ x_delta -= win_width/10;
+ redraw = 1;
+ break;
+ case VK_RIGHT:
+ x_delta += win_width/10;
+ redraw = 1;
+ break;
+ case VK_UP:
+ y_delta -= win_height/10;
+ redraw = 1;
+ break;
+ case VK_DOWN:
+ y_delta += win_height/10;
+ redraw = 1;
+ break;
+ case VK_PRIOR:
+ if (control) {
+ x_delta -= win_width;
+ redraw = 1;
+ } else {
+ y_delta -= win_height;
+ redraw = 1;
+ }
+ break;
+ case VK_NEXT:
+ if (control) {
+ x_delta += win_width;
+ redraw = 1;
+ } else {
+ y_delta += win_height;
+ redraw = 1;
+ }
+ break;
+ case VK_HOME:
+ x_delta = 0;
+ y_delta = 0;
+ redraw = 1;
+ break;
+ case VK_END:
+ x_delta = INT_MAX;
+ y_delta = INT_MAX;
+ redraw = 1;
+ break;
+ case VK_CONTROL:
+ control = 1;
+ break;
+ }
+ break;
+ case WM_KEYUP:
+ switch (wparam) {
+ case VK_CONTROL:
+ control = 0;
+ break;
+ }
+ break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
+ case WM_SIZE:
+ win_width = LOWORD(lparam);
+ win_height = HIWORD(lparam);
+ redraw = 1;
+ break;
}
+ if (redraw) {
+ if (x_delta > the_width - win_width)
+ x_delta = the_width - win_width;
+ if (y_delta > the_height - win_height)
+ y_delta = the_height - win_height;
+ if (x_delta < 0)
+ x_delta = 0;
+ if (y_delta < 0)
+ y_delta = 0;
+ RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE);
+ }
return DefWindowProc(hwnd, message, wparam, lparam);
}
static void *
-windows_start(void *output_, int width, int height)
+windows_start(void *output_ __hwloc_attribute_unused, int width, int height)
{
WNDCLASS wndclass = {
.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH),
- .hCursor = LoadCursor(NULL, IDC_ARROW),
+ .hCursor = LoadCursor(NULL, IDC_SIZEALL),
.hIcon = LoadIcon(NULL, IDI_APPLICATION),
.lpfnWndProc = WndProc,
.lpszClassName = "lstopo",
};
HWND toplevel;
+ win_width = width + 2*GetSystemMetrics(SM_CXSIZEFRAME);
+ win_height = height + 2*GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION);
+
+ if (win_width > GetSystemMetrics(SM_CXFULLSCREEN))
+ win_width = GetSystemMetrics(SM_CXFULLSCREEN);
+
+ if (win_height > GetSystemMetrics(SM_CYFULLSCREEN))
+ win_height = GetSystemMetrics(SM_CYFULLSCREEN);
+
RegisterClass(&wndclass);
toplevel = CreateWindow("lstopo", "lstopo", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
- width + 2*GetSystemMetrics(SM_CXSIZEFRAME),
- height + 2*GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYSMCAPTION),
- NULL, NULL, NULL, NULL);
+ win_width, win_height, NULL, NULL, NULL, NULL);
+ the_width = width;
+ the_height = height;
+
ShowWindow(toplevel, SW_SHOWDEFAULT);
return toplevel;
}
static void
-windows_declare_color(void *output_, int r, int g, int b)
+windows_declare_color(void *output_ __hwloc_attribute_unused, int r, int g, int b)
{
HBRUSH brush;
COLORREF color = RGB(r, g, b);
@@ -104,32 +222,32 @@
}
static void
-windows_box(void *output, int r, int g, int b, unsigned depth, unsigned x, unsigned width, unsigned y, unsigned height)
+windows_box(void *output, int r, int g, int b, unsigned depth __hwloc_attribute_unused, unsigned x, unsigned width, unsigned y, unsigned height)
{
PAINTSTRUCT *ps = output;
SelectObject(ps->hdc, rgb_to_brush(r, g, b));
SetBkColor(ps->hdc, RGB(r, g, b));
- Rectangle(ps->hdc, x, y, x + width, y + height);
+ Rectangle(ps->hdc, x - x_delta, y - y_delta, x + width - x_delta, y + height - y_delta);
}
static void
-windows_line(void *output, int r, int g, int b, unsigned depth, unsigned x1, unsigned y1, unsigned x2, unsigned y2)
+windows_line(void *output, int r, int g, int b, unsigned depth __hwloc_attribute_unused, unsigned x1, unsigned y1, unsigned x2, unsigned y2)
{
PAINTSTRUCT *ps = output;
SelectObject(ps->hdc, rgb_to_brush(r, g, b));
- MoveToEx(ps->hdc, x1, y1, NULL);
- LineTo(ps->hdc, x2, y2);
+ MoveToEx(ps->hdc, x1 - x_delta, y1 - y_delta, NULL);
+ LineTo(ps->hdc, x2 - x_delta, y2 - y_delta);
}
static void
-windows_text(void *output, int r, int g, int b, int size, unsigned depth, unsigned x, unsigned y, const char *text)
+windows_text(void *output, int r, int g, int b, int size, unsigned depth __hwloc_attribute_unused, unsigned x, unsigned y, const char *text)
{
PAINTSTRUCT *ps = output;
HFONT font;
SetTextColor(ps->hdc, RGB(r, g, b));
font = CreateFont(size, 0, 0, 0, 0, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, NULL);
SelectObject(ps->hdc, (HGDIOBJ) font);
- TextOut(ps->hdc, x, y, text, strlen(text));
+ TextOut(ps->hdc, x - x_delta, y - y_delta, text, strlen(text));
DeleteObject(font);
}
@@ -142,14 +260,15 @@
};
void
-output_windows (hwloc_topology_t topology, const char *filename, int verbose_mode)
+output_windows (hwloc_topology_t topology, const char *filename __hwloc_attribute_unused, int logical, int verbose_mode __hwloc_attribute_unused)
{
HWND toplevel;
the_topology = topology;
- toplevel = output_draw_start(&windows_draw_methods, topology, NULL);
+ the_logical = logical;
+ toplevel = output_draw_start(&windows_draw_methods, logical, topology, NULL);
UpdateWindow(toplevel);
MSG msg;
- while (GetMessage(&msg, NULL, 0, 0)) {
+ while (!finish && GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-xml.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-xml.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo-xml.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,118 +1,24 @@
/*
* Copyright © 2009 CNRS, INRIA, Université Bordeaux 1
+ * Copyright © 2009 Cisco Systems, Inc. All rights reserved.
* See COPYING in top-level directory.
*/
#include <private/config.h>
-#ifdef HAVE_XML
+#ifdef HWLOC_HAVE_XML
#include <hwloc.h>
#include <string.h>
-#include <strings.h>
-
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-
-#include <strings.h>
-
#include "lstopo.h"
-static void
-output_topology (hwloc_topology_t topology, hwloc_obj_t obj, xmlNodePtr root_node, int verbose_mode)
+void output_xml(hwloc_topology_t topology, const char *filename, int logical __hwloc_attribute_unused, int verbose_mode __hwloc_attribute_unused)
{
- xmlNodePtr node = NULL;
- char *cpuset = NULL;
- char tmp[255];
-
- /* xmlNewChild() creates a new node, which is "attached" as child node
- * of root_node node. */
- node = xmlNewChild(root_node, NULL, BAD_CAST "object", NULL);
- xmlNewProp(node, BAD_CAST "type", BAD_CAST hwloc_obj_type_string(obj->type));
- sprintf(tmp, "%d", obj->os_index);
- xmlNewProp(node, BAD_CAST "os_index", BAD_CAST tmp);
- hwloc_cpuset_asprintf(&cpuset, obj->cpuset);
- xmlNewProp(node, BAD_CAST "cpuset", BAD_CAST cpuset);
- free(cpuset);
-
- switch (obj->type) {
- case HWLOC_OBJ_CACHE:
- sprintf(tmp, "%lu", obj->attr->cache.memory_kB);
- xmlNewProp(node, BAD_CAST "memory_kB", BAD_CAST tmp);
- sprintf(tmp, "%u", obj->attr->cache.depth);
- xmlNewProp(node, BAD_CAST "depth", BAD_CAST tmp);
- break;
- case HWLOC_OBJ_SYSTEM:
- xmlNewProp(node, BAD_CAST "dmi_board_vendor", BAD_CAST obj->attr->machine.dmi_board_vendor);
- xmlNewProp(node, BAD_CAST "dmi_board_name", BAD_CAST obj->attr->machine.dmi_board_name);
- sprintf(tmp, "%lu", obj->attr->system.memory_kB);
- xmlNewProp(node, BAD_CAST "memory_kB", BAD_CAST tmp);
- sprintf(tmp, "%lu", obj->attr->system.huge_page_free);
- xmlNewProp(node, BAD_CAST "huge_page_free", BAD_CAST tmp);
- sprintf(tmp, "%lu", obj->attr->machine.huge_page_size_kB);
- xmlNewProp(node, BAD_CAST "huge_page_size_kB", BAD_CAST tmp);
- break;
- case HWLOC_OBJ_MACHINE:
- xmlNewProp(node, BAD_CAST "dmi_board_vendor", BAD_CAST obj->attr->machine.dmi_board_vendor);
- xmlNewProp(node, BAD_CAST "dmi_board_name", BAD_CAST obj->attr->machine.dmi_board_name);
- sprintf(tmp, "%lu", obj->attr->machine.memory_kB);
- xmlNewProp(node, BAD_CAST "memory_kB", BAD_CAST tmp);
- sprintf(tmp, "%lu", obj->attr->machine.huge_page_free);
- xmlNewProp(node, BAD_CAST "huge_page_free", BAD_CAST tmp);
- sprintf(tmp, "%lu", obj->attr->machine.huge_page_size_kB);
- xmlNewProp(node, BAD_CAST "huge_page_size_kB", BAD_CAST tmp);
- break;
- case HWLOC_OBJ_NODE:
- sprintf(tmp, "%lu", obj->attr->node.memory_kB);
- xmlNewProp(node, BAD_CAST "memory_kB", BAD_CAST tmp);
- sprintf(tmp, "%lu", obj->attr->node.huge_page_free);
- xmlNewProp(node, BAD_CAST "huge_page_free", BAD_CAST tmp);
- break;
- case HWLOC_OBJ_MISC:
- sprintf(tmp, "%u", obj->attr->misc.depth);
- xmlNewProp(node, BAD_CAST "depth", BAD_CAST tmp);
- break;
- default:
- break;
- }
-
- if (obj->arity) {
- int x;
- for (x=0; x<obj->arity; x++)
- output_topology (topology, obj->children[x], node, verbose_mode);
- }
-}
-
-void output_xml(hwloc_topology_t topology, const char *filename, int verbose_mode)
-{
- xmlDocPtr doc = NULL; /* document pointer */
- xmlNodePtr root_node = NULL; /* root pointer */
- xmlDtdPtr dtd = NULL; /* DTD pointer */
-
if (!strcasecmp(filename, "-.xml"))
filename = "-";
- LIBXML_TEST_VERSION;
-
- /* Creates a new document, a node and set it as a root node. */
- doc = xmlNewDoc(BAD_CAST "1.0");
- root_node = xmlNewNode(NULL, BAD_CAST "root");
- xmlDocSetRootElement(doc, root_node);
-
- /* Creates a DTD declaration. Isn't mandatory. */
- dtd = xmlCreateIntSubset(doc, BAD_CAST "root", NULL, BAD_CAST "hwloc.dtd");
-
- output_topology (topology, hwloc_get_system_obj(topology), root_node, verbose_mode);
-
- /* Dumping document to stdio or file. */
- xmlSaveFormatFileEnc(filename, doc, "UTF-8", 1);
-
- /* Free the document. */
- xmlFreeDoc(doc);
-
- /* Free the global variables that may have been allocated by the parser. */
- xmlCleanupParser();
+ hwloc_topology_export_xml(topology, filename);
}
-#endif /* HAVE_XML */
+#endif /* HWLOC_HAVE_XML */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.1in
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.1in 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.1in 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,55 +1,279 @@
.\" -*- nroff -*-
+.\" Copyright © 2010 Cisco Systems, Inc. All rights reserved.
.TH LSTOPO "1" "#HWLOC_DATE#" "#PACKAGE_VERSION#" "#PACKAGE_NAME#"
.SH NAME
-lstopo \- Show the topology of the system
+lstopo \- Show the topology of the system (note that hwloc-bind(1)
+provides a detailed explanation of the hwloc system; it should be read
+before reading this man page).
+.
+.\" **************************
+.\" Synopsis Section
+.\" **************************
.SH SYNOPSIS
+.
.B lstopo
[ \fIoptions \fR]... [ \fIfilename \fR]
-.SH DESCRIPTION
-By default, lstopo displays a graphical window with the topology if DISPLAY is
-set, else a text output on the standard output.
-To force a text output on the standard output, specify \- or /dev/stdout as
-filename.
-To specify a semi\-graphical text output on the standard output, specify \-.txt
-as filename.
-Recognised file formats are: .txt, .fig, .pdf, .ps, .png, .svg
+.
+.\" **************************
+.\" Options Section
+.\" **************************
.SH OPTIONS
+.
.TP
\fB\-v\fR \fB\-\-verbose\fR
-increase verbosity (disabled by default)
+Include additional detail.
.TP
\fB\-s\fR \fB\-\-silent\fR
-decrease verbosity
+Opposite of --verbose (default).
.TP
+\fB\-l\fR \fB\-\-logical\fR
+Display hwloc logical indexes instead of physical/OS indexes (default).
+These indexes are prefixed with "#".
+The physical indexes of some objects (PU and Node by default, all
+objects if verbose) will appear as object attribute "phys=...".
+.TP
+\fB\-p\fR \fB\-\-physical\fR
+Display OS/physical indexes instead of hwloc logical indexes.
+These indexes are prefixed with "p#" instead of "#".
+.TP
+\fB\-c\fR \fB\-\-cpuset\fR
+Display the cpuset of each object.
+.TP
+\fB\-C\fR \fB\-\-cpuset-only\fR
+Only display the cpuset of each object; do not display anything else
+about the object.
+.TP
+\fB\-\-only\fR <type>
+Only show objects of the given type in the text output.
+.TP
+\fB\-\-ignore\fR <type>
+Ignore all objects of type <type> in the topology.
+.TP
\fB\-\-no\-caches\fR
-do not show caches
+Do not show caches.
.TP
\fB\-\-no\-useless\-caches\fR
-do not show caches which do not have a hierarchical
-impact
+Do not show caches which do not have a hierarchical impact.
.TP
\fB\-\-whole\-system\fR
-do not consider administration limitations
+Do not consider administration limitations.
.TP
\fB\-\-merge\fR
-do not show levels that do not have a hierarcical
-impact
+Do not show levels that do not have a hierarchical impact.
.TP
-\fB\-\-synthetic\fR "n:2 2"
-simulate a fake hierarchy, here with 2 NUMA nodes of 2
-processors
+\fB\-\-xml\fR <path>
+Read topology from XML file <path> (instead of discovering the
+topology on the local machine). If <path> is "\-", the standard input
+is used. XML support must have been compiled in to hwloc for this
+option to be usable.
.TP
-\fB\-\-fontsize\fR 10
-set size of text font
+\fB\-\-fsys-root\fR <path>
+Read topology from the chroot specified by <path> (instead of
+discovering the topology on the local machine). This option is
+generally only available on Linux.
.TP
-\fB\-\-gridsize\fR 10
-set size of margin between elements
+\fB\-\-pid\fR <pid>
+Detect topology as seen by process <pid>, i.e. as if process <pid> did the
+discovery itself, and show its current binding. Note that this can for instance
+change the set of allowed processors. If 0 is given as pid, the current binding for the lstopo process will be shown.
.TP
+\fB\-\-top\fR <pid>
+Show existing processes as misc objects in the output. To avoid uselessly
+cluttering the output, only processes that are restricted to some part of the
+machine are shown. On Linux, kernel threads are not shown.
+.TP
+\fB\-\-synthetic\fR <specification>
+Simulate a fake hierarchy (instead of discovering the topology on the
+local machine).
+.TP
+\fB\-\-fontsize\fR <size>
+Set size of text font.
+.TP
+\fB\-\-gridsize\fR <size>
+Set size of margin between elements.
+.TP
\fB\-\-horiz\fR
-horizontal graphic layout instead of nearly 4/3 ratio
+Horizontal graphic layout instead of nearly 4/3 ratio.
.TP
\fB\-\-vert\fR
-vertical graphic layout instead of nearly 4/3 ratio
+Vertical graphic layout instead of nearly 4/3 ratio.
.TP
\fB\-\-version\fR
-report version and exit
+Report version and exit.
+.
+.\" **************************
+.\" Description Section
+.\" **************************
+.SH DESCRIPTION
+.
+lstopo is capable of displaying a topological map of the system in a
+variety of different output formats. If no filename is specified and
+the DISPLAY environment variable is set, lstopo displays the map in a
+graphical window. If no filename is specified and the DISPLAY
+environment variable is
+.I not
+set, a text summary is displayed.
+.
+.PP
+The filename specified directly implies the output format that will be
+used; see the OUTPUT FORMATS section, below. Output formats that
+support color will indicate specific characteristics about individual
+CPUs by their color; see the COLORS section, below.
+.
+.\" **************************
+.\" Output Formats Section
+.\" **************************
+.SH OUTPUT FORMATS
+.
+.TP
+.B \-
+Send a text summary to stdout.
+.
+.TP
+.B /dev/stdout
+Send a text summary to stdout. It is effectively the same as
+specifying "\-".
+.
+.TP
+.B <filename>.txt
+If the filename ends in ".txt", lstopo outputs an ASCII art
+representation of the map.
+.
+.TP
+.B \-.txt
+If the entire filename is "\-.txt", lstopo outputs the same ASCII art
+representation as other ".txt" filenames, but with two execeptions: 1)
+the output is sent to stdout, and 2) if colors are supported on the
+terminal, the ASCII art will be colorized.
+.
+.TP
+.B <filename>.fig
+If the filename ends in ".fig", lstopo outputs a representation of the
+map that can be loaded in Xfig.
+.
+.TP
+.B <filename>.pdf
+If the filename ends in ".pdf" and lstopo was compiled with the proper
+support, lstopo outputs a PDF representation of the map.
+.
+.TP
+.B <filename>.ps
+If the filename ends in ".ps" and lstopo was compiled with the proper
+support, lstopo outputs a Postscript representation of the map.
+.
+.TP
+.B <filename>.png
+If the filename ends in ".png" and lstopo was compiled with the proper
+support, lstopo outputs a PNG representation of the map.
+.
+.TP
+.B <filename>.svg
+If the filename ends in ".svn" and lstopo was compiled with the proper
+support, lstopo outputs an SVG representation of the map.
+.
+.TP
+.B <filename>.xml
+If the filename ends in ".xml" and lstopo was compiled with the proper
+support, lstopo outputs an XML representation of the map.
+.
+.PP
+See the output of "lstopo \-\-help" for a specific list of what
+graphical output formats are supported in your hwloc installation.
+.
+.\" **************************
+.\" Colors Section
+.\" **************************
+.SH COLORS
+Individual CPUs are colored in the semi-graphical and graphical output
+formats to indicate different characteristics:
+.TP
+Green
+The CPU is in the current CPU binding mask.
+.TP
+White
+The CPU is in the allowed set (see below), but it is not in the
+current CPU binding mask.
+.TP
+Red
+The CPU is not in the allowed set (see below).
+.TP
+Black
+The CPU is offline (not all OS's support displaying offline CPUs).
+.
+.PP
+The "allowed set" is the set of CPUs to which the current process is
+allowed to bind. The allowed set is usually either inherited from the
+parent process or set by administrative qpolicies on the system. Linux
+cpusets are one example of limiting the allowed set for a process and
+its children to be less than the full set of CPUs on the system.
+.PP
+Different processes may therefore have different CPUs in the allowed
+set. Hence, invoking lstopo in different contexts and/or as different
+users may display different colors for the same individual CPUs (e.g.,
+running lstopo in one context may show a specific CPU as red, but
+running lstopo in a different context may show the same CPU as white).
+.
+.\" **************************
+.\" Layout Section
+.\" **************************
+.SH LAYOUT
+In its graphical output, lstopo uses simple rectangular heuristics
+to try to achieve a 4/3 ratio between width and height. However,
+in the particular case of NUMA nodes, the layout is always a flat
+rectangle, to avoid letting the user believe any particular NUMA
+topology (lstopo is not able to render that yet).
+.
+.\" **************************
+.\" Examples Section
+.\" **************************
+.SH EXAMPLES
+.
+To display the machine topology in text mode:
+
+ lstopo -
+
+To display in graphical mode (assuming that the DISPLAY environment
+variable is set to a relevant value):
+
+ lstopo
+
+To export the topology to a PNG file:
+
+ lstopo file.png
+
+To display a summary of the topology:
+
+ lstopo -s
+
+To get more details about the topology:
+
+ lstopo -v
+
+To only show cores:
+
+ lstopo --only core
+
+To show cpusets:
+
+ lstopo --cpuset
+
+To only show the cpusets of sockets:
+
+ lstopo --only socket --cpuset-only
+
+Simulate a fake hierarchy; this example shows with 2 NUMA nodes of 2
+processor units:
+
+ lstopo --synthetic "n:2 2"
+
+To count the number of logical processors in the system
+
+ lstopo --only pu | wc -l
+.\" **************************
+.\" See also section
+.\" **************************
+.SH SEE ALSO
+.
+.ft R
+hwloc-bind(1)
+.sp
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.c
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.c 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.c 2010-05-11 01:47:13 UTC (rev 6632)
@@ -10,17 +10,24 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <dirent.h>
+#include <fcntl.h>
-#ifdef HAVE_CAIRO
+#ifdef HWLOC_HAVE_CAIRO
#include <cairo.h>
#endif
#include "lstopo.h"
+int logical = 1;
+hwloc_obj_type_t show_only = (hwloc_obj_type_t) -1;
+int show_cpuset = 0;
unsigned int fontsize = 10;
unsigned int gridsize = 10;
unsigned int force_horiz = 0;
unsigned int force_vert = 0;
+unsigned int top = 0;
+hwloc_pid_t pid = (hwloc_pid_t) -1;
FILE *open_file(const char *filename, const char *mode)
{
@@ -32,15 +39,82 @@
return fopen(filename, mode);
}
+static void add_process_objects(hwloc_topology_t topology)
+{
+ hwloc_obj_t root;
+ hwloc_cpuset_t cpuset;
+ DIR *dir;
+ struct dirent *dirent;
+ const struct hwloc_topology_support *support;
+
+ root = hwloc_get_root_obj(topology);
+
+ support = hwloc_topology_get_support(topology);
+
+ if (!support->cpubind->get_thisproc_cpubind)
+ return;
+
+ dir = opendir("/proc");
+ if (!dir)
+ return;
+ cpuset = hwloc_cpuset_alloc();
+
+ while ((dirent = readdir(dir))) {
+ long local_pid;
+ char *end;
+ char name[64];
+
+ local_pid = strtol(dirent->d_name, &end, 10);
+ if (*end)
+ /* Not a number */
+ continue;
+
+ snprintf(name, sizeof(name), "%ld", local_pid);
+
+#ifdef HWLOC_LINUX_SYS
+ {
+ char path[6 + strlen(dirent->d_name) + 1 + 7 + 1];
+ char cmd[64], *c;
+ int file;
+ ssize_t n;
+
+ snprintf(path, sizeof(path), "/proc/%s/cmdline", dirent->d_name);
+
+ if ((file = open(path, O_RDONLY)) >= 0) {
+ n = read(file, cmd, sizeof(cmd) - 1);
+ close(file);
+
+ if (n <= 0)
+ /* Ignore kernel threads and errors */
+ continue;
+
+ cmd[n] = 0;
+ if ((c = strchr(cmd, ' ')))
+ *c = 0;
+ snprintf(name, sizeof(name), "%ld %s", local_pid, cmd);
+ }
+ }
+#endif /* HWLOC_LINUX_SYS */
+
+ if (hwloc_get_proc_cpubind(topology, local_pid, cpuset, 0))
+ continue;
+
+ if (hwloc_cpuset_isincluded(root->cpuset, cpuset))
+ continue;
+
+ hwloc_topology_insert_misc_object_by_cpuset(topology, cpuset, name);
+ }
+
+ hwloc_cpuset_free(cpuset);
+ closedir(dir);
+}
+
static void usage(char *name, FILE *where)
{
- fprintf (where, "Usage: %s [ options ]... [ filename ]\n", name);
- fprintf (where, "\n");
- fprintf (where, "By default, lstopo displays a graphical window with the topology if DISPLAY is\nset, else a text output on the standard output.\n");
- fprintf (where, "To force a text output on the standard output, specify - or /dev/stdout as\nfilename.\n");
- fprintf (where, "To specify a semi-graphical text output on the standard output, specify -.txt\nas filename.\n");
- fprintf (where, "Recognised file formats are: .txt, .fig"
-#ifdef HAVE_CAIRO
+ fprintf (where, "Usage: %s [ options ] ... [ filename ]\n\n", name);
+ fprintf (where, "See lstopo(1) for more details.\n\n");
+ fprintf (where, "Supported output file formats: .txt, .fig"
+#ifdef HWLOC_HAVE_CAIRO
#if CAIRO_HAS_PDF_SURFACE
", .pdf"
#endif /* CAIRO_HAS_PDF_SURFACE */
@@ -53,33 +127,41 @@
#if CAIRO_HAS_SVG_SURFACE
", .svg"
#endif /* CAIRO_HAS_SVG_SURFACE */
-#endif /* HAVE_CAIRO */
-#ifdef HAVE_XML
+#endif /* HWLOC_HAVE_CAIRO */
+#ifdef HWLOC_HAVE_XML
", .xml"
-#endif /* HAVE_XML */
+#endif /* HWLOC_HAVE_XML */
"\n");
fprintf (where, "\nOptions:\n");
- fprintf (where, " -v --verbose increase verbosity (disabled by default)\n");
- fprintf (where, " -s --silent decrease verbosity\n");
- fprintf (where, " --no-caches do not show caches\n");
- fprintf (where, " --no-useless-caches do not show caches which do not have a hierarchical\n"
+ fprintf (where, " -l --logical Display hwloc logical object indexes (default)\n");
+ fprintf (where, " -p --physical Display physical object indexes\n");
+ fprintf (where, " -v --verbose Include additional detail\n");
+ fprintf (where, " -s --silent Opposite of --verbose (default)\n");
+ fprintf (where, " -c --cpuset Show the cpuset of each object\n");
+ fprintf (where, " -C --cpuset-only Only show the cpuset of each ofbject\n");
+ fprintf (where, " --only <type> Only show the given type in the text output\n");
+ fprintf (where, " --ignore <type> Ignore objects of the given type\n");
+ fprintf (where, " --no-caches Do not show caches\n");
+ fprintf (where, " --no-useless-caches Do not show caches which do not have a hierarchical\n"
" impact\n");
- fprintf (where, " --whole-system do not consider administration limitations\n");
- fprintf (where, " --merge do not show levels that do not have a hierarcical\n"
+ fprintf (where, " --whole-system Do not consider administration limitations\n");
+ fprintf (where, " --merge Do not show levels that do not have a hierarcical\n"
" impact\n");
-#ifdef HAVE_XML
- fprintf (where, " --xml <path> read topology from XML file <path>\n");
+#ifdef HWLOC_HAVE_XML
+ fprintf (where, " --xml <path> Read topology from XML file <path>\n");
#endif
-#ifdef LINUX_SYS
- fprintf (where, " --fsys-root <path> chroot containing the /proc and /sys of another system\n");
+#ifdef HWLOC_LINUX_SYS
+ fprintf (where, " --fsys-root <path> Chroot containing the /proc and /sys of another system\n");
#endif
- fprintf (where, " --synthetic \"n:2 2\" simulate a fake hierarchy, here with 2 NUMA nodes of 2\n"
+ fprintf (where, " --pid <pid> Detect topology as seen by process <pid>\n");
+ fprintf (where, " --top Display processes within the hierarchy\n");
+ fprintf (where, " --synthetic \"n:2 2\" Simulate a fake hierarchy, here with 2 NUMA nodes of 2\n"
" processors\n");
- fprintf (where, " --fontsize 10 set size of text font\n");
- fprintf (where, " --gridsize 10 set size of margin between elements\n");
- fprintf (where, " --horiz horizontal graphic layout instead of nearly 4/3 ratio\n");
- fprintf (where, " --vert vertical graphic layout instead of nearly 4/3 ratio\n");
- fprintf (where, " --version report version and exit\n");
+ fprintf (where, " --fontsize 10 Set size of text font\n");
+ fprintf (where, " --gridsize 10 Set size of margin between elements\n");
+ fprintf (where, " --horiz Horizontal graphic layout instead of nearly 4/3 ratio\n");
+ fprintf (where, " --vert Vertical graphic layout instead of nearly 4/3 ratio\n");
+ fprintf (where, " --version Report version and exit\n");
}
int
@@ -88,7 +170,7 @@
int err;
int verbose_mode = 1;
hwloc_topology_t topology;
- char *filename = NULL;
+ const char *filename = NULL;
unsigned long flags = 0;
int merge = 0;
int ignorecache = 0;
@@ -96,6 +178,7 @@
char * synthetic = NULL;
const char * xmlpath = NULL;
char * fsysroot = NULL;
+ int force_console = 0;
int opt;
callname = strrchr(argv[0], '/');
@@ -111,14 +194,39 @@
while (argc >= 2)
{
opt = 0;
- if (!strcmp (argv[1], "-v") || !strcmp (argv[1], "--verbose"))
+ if (!strcmp (argv[1], "-v") || !strcmp (argv[1], "--verbose")) {
verbose_mode++;
- else if (!strcmp (argv[1], "-s") || !strcmp (argv[1], "--silent"))
+ force_console = 1;
+ } else if (!strcmp (argv[1], "-s") || !strcmp (argv[1], "--silent")) {
verbose_mode--;
- else if (!strcmp (argv[1], "-h") || !strcmp (argv[1], "--help")) {
+ force_console = 1;
+ } else if (!strcmp (argv[1], "-h") || !strcmp (argv[1], "--help")) {
usage(callname, stdout);
exit(EXIT_SUCCESS);
+ } else if (!strcmp (argv[1], "-l") || !strcmp (argv[1], "--logical"))
+ logical = 1;
+ else if (!strcmp (argv[1], "-p") || !strcmp (argv[1], "--physical"))
+ logical = 0;
+ else if (!strcmp (argv[1], "-c") || !strcmp (argv[1], "--cpuset"))
+ show_cpuset = 1;
+ else if (!strcmp (argv[1], "-C") || !strcmp (argv[1], "--cpuset-only"))
+ show_cpuset = 2;
+ else if (!strcmp (argv[1], "--only")) {
+ if (argc <= 2) {
+ usage (callname, stderr);
+ exit(EXIT_FAILURE);
+ }
+ show_only = hwloc_obj_type_of_string(argv[2]);
+ opt = 1;
}
+ else if (!strcmp (argv[1], "--ignore")) {
+ if (argc <= 2) {
+ usage (callname, stderr);
+ exit(EXIT_FAILURE);
+ }
+ hwloc_topology_ignore_type(topology, hwloc_obj_type_of_string(argv[2]));
+ opt = 1;
+ }
else if (!strcmp (argv[1], "--no-caches"))
ignorecache = 2;
else if (!strcmp (argv[1], "--no-useless-caches"))
@@ -153,25 +261,40 @@
exit(EXIT_FAILURE);
}
synthetic = argv[2]; opt = 1;
-#ifdef HAVE_XML
} else if (!strcmp (argv[1], "--xml")) {
+#ifdef HWLOC_HAVE_XML
if (argc <= 2) {
usage (callname, stderr);
exit(EXIT_FAILURE);
}
xmlpath = argv[2]; opt = 1;
- if (!strcmp(xmlpath, "-"))
+ if (!strcmp(xmlpath, "-")) {
xmlpath = "/dev/stdin";
-#endif /* HAVE_XML */
-#ifdef LINUX_SYS
+ }
+#else /* HWLOC_HAVE_XML */
+ fprintf(stderr, "This installation of hwloc does not support --xml, sorry.\n");
+ exit(EXIT_FAILURE);
+#endif /* HWLOC_HAVE_XML */
} else if (!strcmp (argv[1], "--fsys-root")) {
+#ifdef HWLOC_LINUX_SYS
if (argc <= 2) {
usage (callname, stderr);
exit(EXIT_FAILURE);
}
fsysroot = argv[2]; opt = 1;
-#endif
- } else if (!strcmp (argv[1], "--version")) {
+#else /* HWLOC_LINUX_SYS */
+ fprintf(stderr, "This installation of hwloc does not support --fsys-root, sorry.\n");
+ exit(EXIT_FAILURE);
+#endif /* HWLOC_LINUX_SYS */
+ } else if (!strcmp (argv[1], "--pid")) {
+ if (argc <= 2) {
+ usage (callname, stderr);
+ exit(EXIT_FAILURE);
+ }
+ pid = atoi(argv[2]); opt = 1;
+ } else if (!strcmp (argv[1], "--top"))
+ top = 1;
+ else if (!strcmp (argv[1], "--version")) {
printf("%s %s\n", callname, VERSION);
exit(EXIT_SUCCESS);
} else {
@@ -186,6 +309,13 @@
argv += opt+1;
}
+ if (show_only != (hwloc_obj_type_t)-1) {
+ merge = 0;
+ force_console = 1;
+ }
+ if (show_cpuset)
+ force_console = 1;
+
hwloc_topology_set_flags(topology, flags);
if (ignorecache > 1) {
@@ -197,57 +327,81 @@
hwloc_topology_ignore_all_keep_structure(topology);
if (synthetic)
- hwloc_topology_set_synthetic(topology, synthetic);
- if (xmlpath)
- hwloc_topology_set_xml(topology, xmlpath);
- if (fsysroot)
- hwloc_topology_set_fsroot(topology, fsysroot);
+ if (hwloc_topology_set_synthetic(topology, synthetic))
+ return EXIT_FAILURE;
+ if (xmlpath) {
+ if (hwloc_topology_set_xml(topology, xmlpath)) {
+ perror("Setting target XML file");
+ return EXIT_FAILURE;
+ }
+ }
+ if (fsysroot) {
+ if (hwloc_topology_set_fsroot(topology, fsysroot)) {
+ perror("Setting target filesystem root");
+ return EXIT_FAILURE;
+ }
+ }
+ if (pid != (hwloc_pid_t) -1 && pid != 0) {
+ if (hwloc_topology_set_pid(topology, pid)) {
+ perror("Setting target pid");
+ return EXIT_FAILURE;
+ }
+ }
err = hwloc_topology_load (topology);
if (err)
return EXIT_FAILURE;
+ if (top)
+ add_process_objects(topology);
+
+ if (!filename && !strcmp(callname,"hwloc-info")) {
+ /* behave kind-of plpa-info */
+ filename = "-";
+ verbose_mode--;
+ }
+
if (!filename) {
-#ifdef HAVE_CAIRO
-#if CAIRO_HAS_XLIB_SURFACE && defined HAVE_X11
- if (getenv("DISPLAY"))
- output_x11(topology, NULL, verbose_mode);
+#ifdef HWLOC_HAVE_CAIRO
+#if CAIRO_HAS_XLIB_SURFACE && defined HWLOC_HAVE_X11
+ if (!force_console && getenv("DISPLAY"))
+ output_x11(topology, NULL, logical, verbose_mode);
else
#endif /* CAIRO_HAS_XLIB_SURFACE */
-#endif /* HAVE_CAIRO */
-#ifdef WIN_SYS
- output_windows(topology, NULL, verbose_mode);
+#endif /* HWLOC_HAVE_CAIRO */
+#ifdef HWLOC_WIN_SYS
+ output_windows(topology, NULL, logical, verbose_mode);
#else
- output_console(topology, NULL, verbose_mode);
+ output_console(topology, NULL, logical, verbose_mode);
#endif
} else if (!strcmp(filename, "-")
|| !strcmp(filename, "/dev/stdout"))
- output_console(topology, filename, verbose_mode);
+ output_console(topology, filename, logical, verbose_mode);
else if (strstr(filename, ".txt"))
- output_text(topology, filename, verbose_mode);
+ output_text(topology, filename, logical, verbose_mode);
else if (strstr(filename, ".fig"))
- output_fig(topology, filename, verbose_mode);
-#ifdef HAVE_CAIRO
+ output_fig(topology, filename, logical, verbose_mode);
+#ifdef HWLOC_HAVE_CAIRO
#if CAIRO_HAS_PNG_FUNCTIONS
else if (strstr(filename, ".png"))
- output_png(topology, filename, verbose_mode);
+ output_png(topology, filename, logical, verbose_mode);
#endif /* CAIRO_HAS_PNG_FUNCTIONS */
#if CAIRO_HAS_PDF_SURFACE
else if (strstr(filename, ".pdf"))
- output_pdf(topology, filename, verbose_mode);
+ output_pdf(topology, filename, logical, verbose_mode);
#endif /* CAIRO_HAS_PDF_SURFACE */
#if CAIRO_HAS_PS_SURFACE
else if (strstr(filename, ".ps"))
- output_ps(topology, filename, verbose_mode);
+ output_ps(topology, filename, logical, verbose_mode);
#endif /* CAIRO_HAS_PS_SURFACE */
#if CAIRO_HAS_SVG_SURFACE
else if (strstr(filename, ".svg"))
- output_svg(topology, filename, verbose_mode);
+ output_svg(topology, filename, logical, verbose_mode);
#endif /* CAIRO_HAS_SVG_SURFACE */
-#endif /* HAVE_CAIRO */
-#ifdef HAVE_XML
+#endif /* HWLOC_HAVE_CAIRO */
+#ifdef HWLOC_HAVE_XML
else if (strstr(filename, ".xml"))
- output_xml(topology, filename, verbose_mode);
+ output_xml(topology, filename, logical, verbose_mode);
#endif
else {
fprintf(stderr, "file format not supported\n");
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.h
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.h 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/lstopo.h 2010-05-11 01:47:13 UTC (rev 6632)
@@ -6,12 +6,17 @@
#ifndef UTILS_LSTOPO_H
#define UTILS_LSTOPO_H
+#include <private/config.h>
#include <hwloc.h>
-typedef void output_method (struct hwloc_topology *topology, const char *output, int verbose_mode);
+extern hwloc_obj_type_t show_only;
+extern int show_cpuset;
+extern hwloc_pid_t pid;
-FILE *open_file(const char *filename, const char *mode);
+typedef void output_method (struct hwloc_topology *topology, const char *output, int logical, int verbose_mode);
+FILE *open_file(const char *filename, const char *mode) __hwloc_attribute_malloc;
+
extern output_method output_console, output_text, output_x11, output_fig, output_png, output_pdf, output_ps, output_svg, output_windows, output_xml;
struct draw_methods {
@@ -24,10 +29,10 @@
extern unsigned int gridsize, fontsize, force_horiz, force_vert;
-extern void *output_draw_start(struct draw_methods *draw_methods, struct hwloc_topology *topology, void *output);
-extern void output_draw(struct draw_methods *draw_methods, struct hwloc_topology *topology, void *output);
+extern void *output_draw_start(struct draw_methods *draw_methods, int logical, struct hwloc_topology *topology, void *output);
+extern void output_draw(struct draw_methods *draw_methods, int logical, struct hwloc_topology *topology, void *output);
-int rgb_to_color(int r, int g, int b);
+int rgb_to_color(int r, int g, int b) __hwloc_attribute_const;
int declare_color(int r, int g, int b);
#endif /* UTILS_LSTOPO_H */
Modified: mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/test-hwloc-distrib.output
===================================================================
--- mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/test-hwloc-distrib.output 2010-05-10 22:41:27 UTC (rev 6631)
+++ mpich2/trunk/src/pm/hydra/tools/bind/hwloc/hwloc/utils/test-hwloc-distrib.output 2010-05-11 01:47:13 UTC (rev 6632)
@@ -1,52 +1,52 @@
-0000000f
-000000f0
+0x0000000f
+0x000000f0
-00000003
-0000000c
-00000030
-000000c0
+0x00000003
+0x0000000c
+0x00000030
+0x000000c0
-00000001
-00000002
-00000004
-00000008
-00000010
-00000020
-00000040
-00000080
+0x00000001
+0x00000002
+0x00000004
+0x00000008
+0x00000010
+0x00000020
+0x00000040
+0x00000080
-00000001
-00000001
-00000002
-00000002
-00000004
-00000004
-00000008
-00000010
-00000010
-00000020
-00000040
-00000040
-00000080
+0x00000001
+0x00000001
+0x00000002
+0x00000002
+0x00000004
+0x00000004
+0x00000008
+0x00000010
+0x00000010
+0x00000020
+0x00000040
+0x00000040
+0x00000080
-00000001
-00000001
-00000002
-00000002
-00000004
-00000004
-00000008
-00000008
-00000010
-00000010
-00000020
-00000020
-00000040
-00000040
-00000080
-00000080
+0x00000001
+0x00000001
+0x00000002
+0x00000002
+0x00000004
+0x00000004
+0x00000008
+0x00000008
+0x00000010
+0x00000010
+0x00000020
+0x00000020
+0x00000040
+0x00000040
+0x00000080
+0x00000080
-00000007
-00000038
-0003fe00
-07fc0000
+0x00000007
+0x00000038
+0x0003fe00
+0x07fc0000
More information about the mpich2-commits
mailing list